relq 1.0.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 (305) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +862 -0
  3. package/dist/addons/buffer.js +1869 -0
  4. package/dist/addons/pg-cursor.js +1425 -0
  5. package/dist/addons/pg-format.js +2248 -0
  6. package/dist/addons/pg.js +4790 -0
  7. package/dist/bin/relq.js +2 -0
  8. package/dist/cjs/cache/index.cjs +9 -0
  9. package/dist/cjs/cache/query-cache.cjs +311 -0
  10. package/dist/cjs/cli/commands/add.cjs +82 -0
  11. package/dist/cjs/cli/commands/commit.cjs +145 -0
  12. package/dist/cjs/cli/commands/diff.cjs +84 -0
  13. package/dist/cjs/cli/commands/export.cjs +333 -0
  14. package/dist/cjs/cli/commands/fetch.cjs +59 -0
  15. package/dist/cjs/cli/commands/generate.cjs +242 -0
  16. package/dist/cjs/cli/commands/history.cjs +165 -0
  17. package/dist/cjs/cli/commands/import.cjs +524 -0
  18. package/dist/cjs/cli/commands/init.cjs +437 -0
  19. package/dist/cjs/cli/commands/introspect.cjs +142 -0
  20. package/dist/cjs/cli/commands/log.cjs +62 -0
  21. package/dist/cjs/cli/commands/migrate.cjs +167 -0
  22. package/dist/cjs/cli/commands/pull.cjs +410 -0
  23. package/dist/cjs/cli/commands/push.cjs +165 -0
  24. package/dist/cjs/cli/commands/rollback.cjs +169 -0
  25. package/dist/cjs/cli/commands/status.cjs +110 -0
  26. package/dist/cjs/cli/commands/sync.cjs +79 -0
  27. package/dist/cjs/cli/index.cjs +275 -0
  28. package/dist/cjs/cli/utils/change-tracker.cjs +446 -0
  29. package/dist/cjs/cli/utils/commit-manager.cjs +239 -0
  30. package/dist/cjs/cli/utils/config-loader.cjs +127 -0
  31. package/dist/cjs/cli/utils/env-loader.cjs +62 -0
  32. package/dist/cjs/cli/utils/fast-introspect.cjs +398 -0
  33. package/dist/cjs/cli/utils/git-utils.cjs +404 -0
  34. package/dist/cjs/cli/utils/migration-generator.cjs +269 -0
  35. package/dist/cjs/cli/utils/relqignore.cjs +114 -0
  36. package/dist/cjs/cli/utils/repo-manager.cjs +515 -0
  37. package/dist/cjs/cli/utils/schema-comparator.cjs +313 -0
  38. package/dist/cjs/cli/utils/schema-diff.cjs +284 -0
  39. package/dist/cjs/cli/utils/schema-hash.cjs +108 -0
  40. package/dist/cjs/cli/utils/schema-introspect.cjs +455 -0
  41. package/dist/cjs/cli/utils/snapshot-manager.cjs +223 -0
  42. package/dist/cjs/cli/utils/spinner.cjs +108 -0
  43. package/dist/cjs/cli/utils/sql-generator.cjs +520 -0
  44. package/dist/cjs/cli/utils/sql-parser.cjs +999 -0
  45. package/dist/cjs/cli/utils/type-generator.cjs +2061 -0
  46. package/dist/cjs/condition/array-condition-builder.cjs +503 -0
  47. package/dist/cjs/condition/array-numeric-condition-builder.cjs +186 -0
  48. package/dist/cjs/condition/array-specialized-condition-builder.cjs +206 -0
  49. package/dist/cjs/condition/array-string-condition-builder.cjs +146 -0
  50. package/dist/cjs/condition/base-condition-builder.cjs +2 -0
  51. package/dist/cjs/condition/condition-collector.cjs +284 -0
  52. package/dist/cjs/condition/fulltext-condition-builder.cjs +61 -0
  53. package/dist/cjs/condition/geometric-condition-builder.cjs +208 -0
  54. package/dist/cjs/condition/index.cjs +25 -0
  55. package/dist/cjs/condition/jsonb-condition-builder.cjs +160 -0
  56. package/dist/cjs/condition/network-condition-builder.cjs +230 -0
  57. package/dist/cjs/condition/range-condition-builder.cjs +82 -0
  58. package/dist/cjs/config/config.cjs +190 -0
  59. package/dist/cjs/config/index.cjs +9 -0
  60. package/dist/cjs/constants/pg-values.cjs +68 -0
  61. package/dist/cjs/copy/copy-builder.cjs +316 -0
  62. package/dist/cjs/copy/index.cjs +6 -0
  63. package/dist/cjs/core/query-builder.cjs +440 -0
  64. package/dist/cjs/core/relq-client.cjs +1831 -0
  65. package/dist/cjs/core/typed-kuery-client.cjs +2 -0
  66. package/dist/cjs/count/count-builder.cjs +88 -0
  67. package/dist/cjs/count/index.cjs +5 -0
  68. package/dist/cjs/cte/cte-builder.cjs +89 -0
  69. package/dist/cjs/cte/index.cjs +5 -0
  70. package/dist/cjs/ddl/function.cjs +48 -0
  71. package/dist/cjs/ddl/index.cjs +7 -0
  72. package/dist/cjs/ddl/sql.cjs +54 -0
  73. package/dist/cjs/delete/delete-builder.cjs +135 -0
  74. package/dist/cjs/delete/index.cjs +5 -0
  75. package/dist/cjs/errors/relq-errors.cjs +329 -0
  76. package/dist/cjs/examples/fulltext-search-test.cjs +122 -0
  77. package/dist/cjs/explain/explain-builder.cjs +99 -0
  78. package/dist/cjs/explain/index.cjs +5 -0
  79. package/dist/cjs/function/create-function-builder.cjs +196 -0
  80. package/dist/cjs/function/index.cjs +6 -0
  81. package/dist/cjs/functions/advanced-functions.cjs +241 -0
  82. package/dist/cjs/functions/case-builder.cjs +66 -0
  83. package/dist/cjs/functions/geometric-functions.cjs +104 -0
  84. package/dist/cjs/functions/index.cjs +184 -0
  85. package/dist/cjs/functions/network-functions.cjs +86 -0
  86. package/dist/cjs/functions/sql-functions.cjs +431 -0
  87. package/dist/cjs/index.cjs +164 -0
  88. package/dist/cjs/indexing/create-index-builder.cjs +187 -0
  89. package/dist/cjs/indexing/drop-index-builder.cjs +89 -0
  90. package/dist/cjs/indexing/index-types.cjs +2 -0
  91. package/dist/cjs/indexing/index.cjs +8 -0
  92. package/dist/cjs/insert/conflict-builder.cjs +173 -0
  93. package/dist/cjs/insert/index.cjs +5 -0
  94. package/dist/cjs/insert/insert-builder.cjs +254 -0
  95. package/dist/cjs/introspect/index.cjs +229 -0
  96. package/dist/cjs/maintenance/index.cjs +6 -0
  97. package/dist/cjs/maintenance/vacuum-builder.cjs +166 -0
  98. package/dist/cjs/pubsub/index.cjs +7 -0
  99. package/dist/cjs/pubsub/listen-notify-builder.cjs +57 -0
  100. package/dist/cjs/pubsub/listener-connection.cjs +180 -0
  101. package/dist/cjs/raw/index.cjs +5 -0
  102. package/dist/cjs/raw/raw-query-builder.cjs +27 -0
  103. package/dist/cjs/schema/index.cjs +15 -0
  104. package/dist/cjs/schema/schema-builder.cjs +1167 -0
  105. package/dist/cjs/schema-builder.cjs +21 -0
  106. package/dist/cjs/schema-definition/column-types.cjs +829 -0
  107. package/dist/cjs/schema-definition/index.cjs +62 -0
  108. package/dist/cjs/schema-definition/introspection.cjs +620 -0
  109. package/dist/cjs/schema-definition/partitions.cjs +129 -0
  110. package/dist/cjs/schema-definition/pg-enum.cjs +76 -0
  111. package/dist/cjs/schema-definition/pg-function.cjs +91 -0
  112. package/dist/cjs/schema-definition/pg-sequence.cjs +56 -0
  113. package/dist/cjs/schema-definition/pg-trigger.cjs +108 -0
  114. package/dist/cjs/schema-definition/relations.cjs +98 -0
  115. package/dist/cjs/schema-definition/sql-expressions.cjs +202 -0
  116. package/dist/cjs/schema-definition/table-definition.cjs +636 -0
  117. package/dist/cjs/select/aggregate-builder.cjs +179 -0
  118. package/dist/cjs/select/index.cjs +5 -0
  119. package/dist/cjs/select/select-builder.cjs +233 -0
  120. package/dist/cjs/sequence/index.cjs +7 -0
  121. package/dist/cjs/sequence/sequence-builder.cjs +264 -0
  122. package/dist/cjs/table/alter-table-builder.cjs +146 -0
  123. package/dist/cjs/table/constraint-builder.cjs +102 -0
  124. package/dist/cjs/table/create-table-builder.cjs +248 -0
  125. package/dist/cjs/table/index.cjs +17 -0
  126. package/dist/cjs/table/partition-builder.cjs +131 -0
  127. package/dist/cjs/table/truncate-builder.cjs +70 -0
  128. package/dist/cjs/transaction/index.cjs +6 -0
  129. package/dist/cjs/transaction/transaction-builder.cjs +78 -0
  130. package/dist/cjs/trigger/create-trigger-builder.cjs +174 -0
  131. package/dist/cjs/trigger/index.cjs +6 -0
  132. package/dist/cjs/types/aggregate-types.cjs +2 -0
  133. package/dist/cjs/types/config-types.cjs +40 -0
  134. package/dist/cjs/types/inference-types.cjs +18 -0
  135. package/dist/cjs/types/pagination-types.cjs +7 -0
  136. package/dist/cjs/types/result-types.cjs +2 -0
  137. package/dist/cjs/types/schema-types.cjs +2 -0
  138. package/dist/cjs/types/subscription-types.cjs +2 -0
  139. package/dist/cjs/types.cjs +2 -0
  140. package/dist/cjs/update/array-update-builder.cjs +205 -0
  141. package/dist/cjs/update/index.cjs +13 -0
  142. package/dist/cjs/update/update-builder.cjs +195 -0
  143. package/dist/cjs/utils/case-converter.cjs +58 -0
  144. package/dist/cjs/utils/environment-detection.cjs +120 -0
  145. package/dist/cjs/utils/index.cjs +10 -0
  146. package/dist/cjs/utils/pool-defaults.cjs +106 -0
  147. package/dist/cjs/utils/type-coercion.cjs +118 -0
  148. package/dist/cjs/view/create-view-builder.cjs +180 -0
  149. package/dist/cjs/view/index.cjs +7 -0
  150. package/dist/cjs/window/index.cjs +5 -0
  151. package/dist/cjs/window/window-builder.cjs +80 -0
  152. package/dist/config.cjs +1 -0
  153. package/dist/config.d.ts +655 -0
  154. package/dist/config.js +1 -0
  155. package/dist/esm/cache/index.js +1 -0
  156. package/dist/esm/cache/query-cache.js +303 -0
  157. package/dist/esm/cli/commands/add.js +78 -0
  158. package/dist/esm/cli/commands/commit.js +109 -0
  159. package/dist/esm/cli/commands/diff.js +81 -0
  160. package/dist/esm/cli/commands/export.js +297 -0
  161. package/dist/esm/cli/commands/fetch.js +56 -0
  162. package/dist/esm/cli/commands/generate.js +206 -0
  163. package/dist/esm/cli/commands/history.js +129 -0
  164. package/dist/esm/cli/commands/import.js +488 -0
  165. package/dist/esm/cli/commands/init.js +401 -0
  166. package/dist/esm/cli/commands/introspect.js +106 -0
  167. package/dist/esm/cli/commands/log.js +59 -0
  168. package/dist/esm/cli/commands/migrate.js +131 -0
  169. package/dist/esm/cli/commands/pull.js +374 -0
  170. package/dist/esm/cli/commands/push.js +129 -0
  171. package/dist/esm/cli/commands/rollback.js +133 -0
  172. package/dist/esm/cli/commands/status.js +107 -0
  173. package/dist/esm/cli/commands/sync.js +76 -0
  174. package/dist/esm/cli/index.js +240 -0
  175. package/dist/esm/cli/utils/change-tracker.js +405 -0
  176. package/dist/esm/cli/utils/commit-manager.js +191 -0
  177. package/dist/esm/cli/utils/config-loader.js +86 -0
  178. package/dist/esm/cli/utils/env-loader.js +57 -0
  179. package/dist/esm/cli/utils/fast-introspect.js +362 -0
  180. package/dist/esm/cli/utils/git-utils.js +347 -0
  181. package/dist/esm/cli/utils/migration-generator.js +263 -0
  182. package/dist/esm/cli/utils/relqignore.js +74 -0
  183. package/dist/esm/cli/utils/repo-manager.js +444 -0
  184. package/dist/esm/cli/utils/schema-comparator.js +307 -0
  185. package/dist/esm/cli/utils/schema-diff.js +276 -0
  186. package/dist/esm/cli/utils/schema-hash.js +69 -0
  187. package/dist/esm/cli/utils/schema-introspect.js +418 -0
  188. package/dist/esm/cli/utils/snapshot-manager.js +179 -0
  189. package/dist/esm/cli/utils/spinner.js +101 -0
  190. package/dist/esm/cli/utils/sql-generator.js +504 -0
  191. package/dist/esm/cli/utils/sql-parser.js +992 -0
  192. package/dist/esm/cli/utils/type-generator.js +2058 -0
  193. package/dist/esm/condition/array-condition-builder.js +495 -0
  194. package/dist/esm/condition/array-numeric-condition-builder.js +182 -0
  195. package/dist/esm/condition/array-specialized-condition-builder.js +200 -0
  196. package/dist/esm/condition/array-string-condition-builder.js +142 -0
  197. package/dist/esm/condition/base-condition-builder.js +1 -0
  198. package/dist/esm/condition/condition-collector.js +275 -0
  199. package/dist/esm/condition/fulltext-condition-builder.js +53 -0
  200. package/dist/esm/condition/geometric-condition-builder.js +200 -0
  201. package/dist/esm/condition/index.js +7 -0
  202. package/dist/esm/condition/jsonb-condition-builder.js +152 -0
  203. package/dist/esm/condition/network-condition-builder.js +222 -0
  204. package/dist/esm/condition/range-condition-builder.js +74 -0
  205. package/dist/esm/config/config.js +150 -0
  206. package/dist/esm/config/index.js +1 -0
  207. package/dist/esm/constants/pg-values.js +63 -0
  208. package/dist/esm/copy/copy-builder.js +308 -0
  209. package/dist/esm/copy/index.js +1 -0
  210. package/dist/esm/core/query-builder.js +426 -0
  211. package/dist/esm/core/relq-client.js +1791 -0
  212. package/dist/esm/core/typed-kuery-client.js +1 -0
  213. package/dist/esm/count/count-builder.js +81 -0
  214. package/dist/esm/count/index.js +1 -0
  215. package/dist/esm/cte/cte-builder.js +82 -0
  216. package/dist/esm/cte/index.js +1 -0
  217. package/dist/esm/ddl/function.js +45 -0
  218. package/dist/esm/ddl/index.js +2 -0
  219. package/dist/esm/ddl/sql.js +51 -0
  220. package/dist/esm/delete/delete-builder.js +128 -0
  221. package/dist/esm/delete/index.js +1 -0
  222. package/dist/esm/errors/relq-errors.js +310 -0
  223. package/dist/esm/examples/fulltext-search-test.js +117 -0
  224. package/dist/esm/explain/explain-builder.js +95 -0
  225. package/dist/esm/explain/index.js +1 -0
  226. package/dist/esm/function/create-function-builder.js +188 -0
  227. package/dist/esm/function/index.js +1 -0
  228. package/dist/esm/functions/advanced-functions.js +231 -0
  229. package/dist/esm/functions/case-builder.js +58 -0
  230. package/dist/esm/functions/geometric-functions.js +97 -0
  231. package/dist/esm/functions/index.js +171 -0
  232. package/dist/esm/functions/network-functions.js +79 -0
  233. package/dist/esm/functions/sql-functions.js +421 -0
  234. package/dist/esm/index.js +34 -0
  235. package/dist/esm/indexing/create-index-builder.js +180 -0
  236. package/dist/esm/indexing/drop-index-builder.js +81 -0
  237. package/dist/esm/indexing/index-types.js +1 -0
  238. package/dist/esm/indexing/index.js +2 -0
  239. package/dist/esm/insert/conflict-builder.js +162 -0
  240. package/dist/esm/insert/index.js +1 -0
  241. package/dist/esm/insert/insert-builder.js +247 -0
  242. package/dist/esm/introspect/index.js +224 -0
  243. package/dist/esm/maintenance/index.js +1 -0
  244. package/dist/esm/maintenance/vacuum-builder.js +158 -0
  245. package/dist/esm/pubsub/index.js +1 -0
  246. package/dist/esm/pubsub/listen-notify-builder.js +48 -0
  247. package/dist/esm/pubsub/listener-connection.js +173 -0
  248. package/dist/esm/raw/index.js +1 -0
  249. package/dist/esm/raw/raw-query-builder.js +20 -0
  250. package/dist/esm/schema/index.js +1 -0
  251. package/dist/esm/schema/schema-builder.js +1150 -0
  252. package/dist/esm/schema-builder.js +2 -0
  253. package/dist/esm/schema-definition/column-types.js +738 -0
  254. package/dist/esm/schema-definition/index.js +10 -0
  255. package/dist/esm/schema-definition/introspection.js +614 -0
  256. package/dist/esm/schema-definition/partitions.js +123 -0
  257. package/dist/esm/schema-definition/pg-enum.js +70 -0
  258. package/dist/esm/schema-definition/pg-function.js +85 -0
  259. package/dist/esm/schema-definition/pg-sequence.js +50 -0
  260. package/dist/esm/schema-definition/pg-trigger.js +102 -0
  261. package/dist/esm/schema-definition/relations.js +90 -0
  262. package/dist/esm/schema-definition/sql-expressions.js +193 -0
  263. package/dist/esm/schema-definition/table-definition.js +630 -0
  264. package/dist/esm/select/aggregate-builder.js +172 -0
  265. package/dist/esm/select/index.js +1 -0
  266. package/dist/esm/select/select-builder.js +226 -0
  267. package/dist/esm/sequence/index.js +1 -0
  268. package/dist/esm/sequence/sequence-builder.js +255 -0
  269. package/dist/esm/table/alter-table-builder.js +138 -0
  270. package/dist/esm/table/constraint-builder.js +95 -0
  271. package/dist/esm/table/create-table-builder.js +241 -0
  272. package/dist/esm/table/index.js +5 -0
  273. package/dist/esm/table/partition-builder.js +121 -0
  274. package/dist/esm/table/truncate-builder.js +63 -0
  275. package/dist/esm/transaction/index.js +1 -0
  276. package/dist/esm/transaction/transaction-builder.js +70 -0
  277. package/dist/esm/trigger/create-trigger-builder.js +166 -0
  278. package/dist/esm/trigger/index.js +1 -0
  279. package/dist/esm/types/aggregate-types.js +1 -0
  280. package/dist/esm/types/config-types.js +36 -0
  281. package/dist/esm/types/inference-types.js +12 -0
  282. package/dist/esm/types/pagination-types.js +4 -0
  283. package/dist/esm/types/result-types.js +1 -0
  284. package/dist/esm/types/schema-types.js +1 -0
  285. package/dist/esm/types/subscription-types.js +1 -0
  286. package/dist/esm/types.js +1 -0
  287. package/dist/esm/update/array-update-builder.js +192 -0
  288. package/dist/esm/update/index.js +2 -0
  289. package/dist/esm/update/update-builder.js +188 -0
  290. package/dist/esm/utils/case-converter.js +55 -0
  291. package/dist/esm/utils/environment-detection.js +113 -0
  292. package/dist/esm/utils/index.js +2 -0
  293. package/dist/esm/utils/pool-defaults.js +100 -0
  294. package/dist/esm/utils/type-coercion.js +110 -0
  295. package/dist/esm/view/create-view-builder.js +171 -0
  296. package/dist/esm/view/index.js +1 -0
  297. package/dist/esm/window/index.js +1 -0
  298. package/dist/esm/window/window-builder.js +73 -0
  299. package/dist/index.cjs +1 -0
  300. package/dist/index.d.ts +10341 -0
  301. package/dist/index.js +1 -0
  302. package/dist/schema-builder.cjs +1 -0
  303. package/dist/schema-builder.d.ts +2272 -0
  304. package/dist/schema-builder.js +1 -0
  305. package/package.json +55 -0
@@ -0,0 +1,70 @@
1
+ import format from "../../addons/pg-format.js";
2
+ export class TransactionBuilder {
3
+ isolationLevel;
4
+ mode;
5
+ __deferrable;
6
+ isolation(level) {
7
+ this.isolationLevel = level;
8
+ return this;
9
+ }
10
+ readWrite() {
11
+ this.mode = 'READ WRITE';
12
+ return this;
13
+ }
14
+ readOnly() {
15
+ this.mode = 'READ ONLY';
16
+ return this;
17
+ }
18
+ deferrable() {
19
+ this.__deferrable = true;
20
+ return this;
21
+ }
22
+ notDeferrable() {
23
+ this.__deferrable = false;
24
+ return this;
25
+ }
26
+ begin() {
27
+ let sql = 'BEGIN';
28
+ const options = [];
29
+ if (this.isolationLevel) {
30
+ options.push(`ISOLATION LEVEL ${this.isolationLevel}`);
31
+ }
32
+ if (this.mode) {
33
+ options.push(this.mode);
34
+ }
35
+ if (this.__deferrable !== undefined) {
36
+ options.push(this.__deferrable ? 'DEFERRABLE' : 'NOT DEFERRABLE');
37
+ }
38
+ if (options.length > 0) {
39
+ sql += ` ${options.join(', ')}`;
40
+ }
41
+ return sql;
42
+ }
43
+ commit() {
44
+ return 'COMMIT';
45
+ }
46
+ rollback() {
47
+ return 'ROLLBACK';
48
+ }
49
+ toString() {
50
+ return this.begin();
51
+ }
52
+ }
53
+ export class SavepointBuilder {
54
+ savepointName;
55
+ constructor(savepointName) {
56
+ this.savepointName = savepointName;
57
+ }
58
+ create() {
59
+ return `SAVEPOINT ${format.ident(this.savepointName)}`;
60
+ }
61
+ rollback() {
62
+ return `ROLLBACK TO SAVEPOINT ${format.ident(this.savepointName)}`;
63
+ }
64
+ release() {
65
+ return `RELEASE SAVEPOINT ${format.ident(this.savepointName)}`;
66
+ }
67
+ toString() {
68
+ return this.create();
69
+ }
70
+ }
@@ -0,0 +1,166 @@
1
+ import format from "../../addons/pg-format.js";
2
+ import { RelqBuilderError } from "../errors/relq-errors.js";
3
+ export class CreateTriggerBuilder {
4
+ triggerName;
5
+ tableName;
6
+ timing;
7
+ events = [];
8
+ level = 'ROW';
9
+ whenCondition;
10
+ functionCall;
11
+ functionArgs = [];
12
+ updateOfColumns;
13
+ referencingOld;
14
+ referencingNew;
15
+ deferrableFlag;
16
+ initiallyValue;
17
+ orReplaceFlag = false;
18
+ constructor(triggerName) {
19
+ this.triggerName = triggerName;
20
+ }
21
+ on(tableName) {
22
+ this.tableName = tableName;
23
+ return this;
24
+ }
25
+ before(...events) {
26
+ this.timing = 'BEFORE';
27
+ this.events = events;
28
+ return this;
29
+ }
30
+ after(...events) {
31
+ this.timing = 'AFTER';
32
+ this.events = events;
33
+ return this;
34
+ }
35
+ insteadOf(...events) {
36
+ this.timing = 'INSTEAD OF';
37
+ this.events = events;
38
+ return this;
39
+ }
40
+ forEachRow() {
41
+ this.level = 'ROW';
42
+ return this;
43
+ }
44
+ forEachStatement() {
45
+ this.level = 'STATEMENT';
46
+ return this;
47
+ }
48
+ updateOf(...columns) {
49
+ this.updateOfColumns = columns;
50
+ return this;
51
+ }
52
+ when(condition) {
53
+ this.whenCondition = condition;
54
+ return this;
55
+ }
56
+ referencing(oldTable, newTable) {
57
+ this.referencingOld = oldTable;
58
+ this.referencingNew = newTable;
59
+ return this;
60
+ }
61
+ execute(functionName, ...args) {
62
+ this.functionCall = functionName;
63
+ this.functionArgs = args;
64
+ return this;
65
+ }
66
+ deferrable() {
67
+ this.deferrableFlag = true;
68
+ return this;
69
+ }
70
+ initiallyDeferred() {
71
+ this.deferrableFlag = true;
72
+ this.initiallyValue = 'DEFERRED';
73
+ return this;
74
+ }
75
+ initiallyImmediate() {
76
+ this.deferrableFlag = true;
77
+ this.initiallyValue = 'IMMEDIATE';
78
+ return this;
79
+ }
80
+ orReplace() {
81
+ this.orReplaceFlag = true;
82
+ return this;
83
+ }
84
+ toString() {
85
+ if (!this.tableName) {
86
+ throw new RelqBuilderError('Table name is required for trigger creation', { builder: 'CreateTriggerBuilder', missing: 'tableName', hint: 'Use .on(tableName)' });
87
+ }
88
+ if (!this.timing || this.events.length === 0) {
89
+ throw new RelqBuilderError('Trigger timing and events are required', { builder: 'CreateTriggerBuilder', missing: 'timing/events', hint: 'Use .before(), .after(), or .insteadOf()' });
90
+ }
91
+ if (!this.functionCall) {
92
+ throw new RelqBuilderError('Trigger function is required', { builder: 'CreateTriggerBuilder', missing: 'function', hint: 'Use .execute(functionName)' });
93
+ }
94
+ let sql = 'CREATE';
95
+ if (this.orReplaceFlag) {
96
+ sql += ' OR REPLACE';
97
+ }
98
+ sql += ` TRIGGER ${format.ident(this.triggerName)}`;
99
+ sql += ` ${this.timing}`;
100
+ sql += ` ${this.events.join(' OR ')}`;
101
+ sql += ` ON ${format.ident(this.tableName)}`;
102
+ if (this.deferrableFlag) {
103
+ sql += ' DEFERRABLE';
104
+ if (this.initiallyValue) {
105
+ sql += ` INITIALLY ${this.initiallyValue}`;
106
+ }
107
+ }
108
+ if (this.referencingOld || this.referencingNew) {
109
+ sql += ' REFERENCING';
110
+ if (this.referencingOld) {
111
+ sql += ` OLD TABLE AS ${format.ident(this.referencingOld)}`;
112
+ }
113
+ if (this.referencingNew) {
114
+ if (this.referencingOld)
115
+ sql += ' ';
116
+ sql += `NEW TABLE AS ${format.ident(this.referencingNew)}`;
117
+ }
118
+ }
119
+ sql += ` FOR EACH ${this.level}`;
120
+ if (this.whenCondition) {
121
+ sql += ` WHEN (${this.whenCondition})`;
122
+ }
123
+ sql += ` EXECUTE FUNCTION ${this.functionCall}`;
124
+ if (this.functionArgs.length > 0) {
125
+ const args = this.functionArgs.map(arg => format('%L', arg)).join(', ');
126
+ sql = sql.replace(this.functionCall, `${this.functionCall}(${args})`);
127
+ }
128
+ else if (!this.functionCall.includes('(')) {
129
+ sql += '()';
130
+ }
131
+ return sql;
132
+ }
133
+ }
134
+ export class DropTriggerBuilder {
135
+ triggerName;
136
+ tableName;
137
+ ifExistsFlag = false;
138
+ cascadeFlag = false;
139
+ constructor(triggerName, tableName) {
140
+ this.triggerName = triggerName;
141
+ this.tableName = tableName;
142
+ }
143
+ ifExists() {
144
+ this.ifExistsFlag = true;
145
+ return this;
146
+ }
147
+ cascade() {
148
+ this.cascadeFlag = true;
149
+ return this;
150
+ }
151
+ restrict() {
152
+ this.cascadeFlag = false;
153
+ return this;
154
+ }
155
+ toString() {
156
+ let sql = 'DROP TRIGGER';
157
+ if (this.ifExistsFlag) {
158
+ sql += ' IF EXISTS';
159
+ }
160
+ sql += ` ${format.ident(this.triggerName)} ON ${format.ident(this.tableName)}`;
161
+ if (this.cascadeFlag) {
162
+ sql += ' CASCADE';
163
+ }
164
+ return sql;
165
+ }
166
+ }
@@ -0,0 +1 @@
1
+ export { CreateTriggerBuilder, DropTriggerBuilder } from "./create-trigger-builder.js";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,36 @@
1
+ import { mergeWithDefaults } from "../utils/pool-defaults.js";
2
+ export function isPoolingEnabled(config) {
3
+ return config.pooling !== false;
4
+ }
5
+ export function toPoolConfig(config) {
6
+ const smartDefaults = config.disableSmartDefaults
7
+ ? { min: 0, max: 10, idleTimeoutMillis: 30000, connectionTimeoutMillis: 0 }
8
+ : mergeWithDefaults(config.pool);
9
+ const poolConfig = {
10
+ host: config.host || 'localhost',
11
+ port: config.port || 5432,
12
+ database: config.database,
13
+ user: config.user,
14
+ password: config.password,
15
+ min: config.pool?.min ?? smartDefaults.min,
16
+ max: config.pool?.max ?? smartDefaults.max,
17
+ idleTimeoutMillis: config.pool?.idleTimeoutMillis ?? smartDefaults.idleTimeoutMillis,
18
+ connectionTimeoutMillis: config.pool?.connectionTimeoutMillis ?? smartDefaults.connectionTimeoutMillis,
19
+ application_name: config.pool?.application_name,
20
+ ssl: config.pool?.ssl,
21
+ allowExitOnIdle: true
22
+ };
23
+ if (config.connectionString) {
24
+ return {
25
+ connectionString: config.connectionString,
26
+ min: poolConfig.min,
27
+ max: poolConfig.max,
28
+ idleTimeoutMillis: poolConfig.idleTimeoutMillis,
29
+ connectionTimeoutMillis: poolConfig.connectionTimeoutMillis,
30
+ application_name: poolConfig.application_name,
31
+ ssl: poolConfig.ssl,
32
+ allowExitOnIdle: true
33
+ };
34
+ }
35
+ return poolConfig;
36
+ }
@@ -0,0 +1,12 @@
1
+ export function isColumnAlias(col) {
2
+ return Array.isArray(col) && col.length === 2;
3
+ }
4
+ export function isAggregateColumn(col) {
5
+ return /^[a-z_]+\(/i.test(col);
6
+ }
7
+ export function getColumnName(col) {
8
+ return isColumnAlias(col) ? col[0] : col;
9
+ }
10
+ export function getResultKey(col) {
11
+ return isColumnAlias(col) ? col[1] : col;
12
+ }
@@ -0,0 +1,4 @@
1
+ export function randomLimit(range) {
2
+ const [min, max] = range;
3
+ return Math.floor(Math.random() * (max - min + 1)) + min;
4
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,192 @@
1
+ import format from "../../addons/pg-format.js";
2
+ export class ArrayStringUpdateBuilder {
3
+ set(values) {
4
+ if (values.length === 0)
5
+ return 'ARRAY[]::text[]';
6
+ const formatted = values.map(v => format('%L', v)).join(',');
7
+ return `ARRAY[${formatted}]`;
8
+ }
9
+ append(value) {
10
+ return format('array_append(%I, %L)', this.getContextColumn(), value);
11
+ }
12
+ prepend(value) {
13
+ return format('array_prepend(%L, %I)', value, this.getContextColumn());
14
+ }
15
+ remove(value) {
16
+ return format('array_remove(%I, %L)', this.getContextColumn(), value);
17
+ }
18
+ concat(values) {
19
+ if (values.length === 0)
20
+ return format('%I', this.getContextColumn());
21
+ const formatted = values.map(v => format('%L', v)).join(',');
22
+ return format('%I || ARRAY[%s]', this.getContextColumn(), formatted);
23
+ }
24
+ getContextColumn() {
25
+ return '__COLUMN__';
26
+ }
27
+ }
28
+ export class ArrayNumericUpdateBuilder {
29
+ set(values) {
30
+ if (values.length === 0)
31
+ return 'ARRAY[]::integer[]';
32
+ return `ARRAY[${values.join(',')}]`;
33
+ }
34
+ append(value) {
35
+ return format('array_append(%I, %s)', this.getContextColumn(), value);
36
+ }
37
+ prepend(value) {
38
+ return format('array_prepend(%s, %I)', value, this.getContextColumn());
39
+ }
40
+ remove(value) {
41
+ return format('array_remove(%I, %s)', this.getContextColumn(), value);
42
+ }
43
+ concat(values) {
44
+ if (values.length === 0)
45
+ return format('%I', this.getContextColumn());
46
+ return format('%I || ARRAY[%s]', this.getContextColumn(), values.join(','));
47
+ }
48
+ getContextColumn() {
49
+ return '__COLUMN__';
50
+ }
51
+ }
52
+ export class ArrayBooleanUpdateBuilder {
53
+ set(values) {
54
+ if (values.length === 0)
55
+ return 'ARRAY[]::boolean[]';
56
+ return `ARRAY[${values.map(v => v.toString()).join(',')}]`;
57
+ }
58
+ append(value) {
59
+ return format('array_append(%I, %s)', this.getContextColumn(), value.toString());
60
+ }
61
+ prepend(value) {
62
+ return format('array_prepend(%s, %I)', value.toString(), this.getContextColumn());
63
+ }
64
+ remove(value) {
65
+ return format('array_remove(%I, %s)', this.getContextColumn(), value.toString());
66
+ }
67
+ concat(values) {
68
+ if (values.length === 0)
69
+ return format('%I', this.getContextColumn());
70
+ return format('%I || ARRAY[%s]', this.getContextColumn(), values.map(v => v.toString()).join(','));
71
+ }
72
+ getContextColumn() {
73
+ return '__COLUMN__';
74
+ }
75
+ }
76
+ export class ArrayUuidUpdateBuilder {
77
+ set(values) {
78
+ if (values.length === 0)
79
+ return 'ARRAY[]::uuid[]';
80
+ const formatted = values.map(v => format('%L::uuid', v)).join(',');
81
+ return `ARRAY[${formatted}]`;
82
+ }
83
+ append(value) {
84
+ return format('array_append(%I, %L::uuid)', this.getContextColumn(), value);
85
+ }
86
+ prepend(value) {
87
+ return format('array_prepend(%L::uuid, %I)', value, this.getContextColumn());
88
+ }
89
+ remove(value) {
90
+ return format('array_remove(%I, %L::uuid)', this.getContextColumn(), value);
91
+ }
92
+ concat(values) {
93
+ if (values.length === 0)
94
+ return format('%I', this.getContextColumn());
95
+ const formatted = values.map(v => format('%L::uuid', v)).join(',');
96
+ return format('%I || ARRAY[%s]', this.getContextColumn(), formatted);
97
+ }
98
+ getContextColumn() {
99
+ return '__COLUMN__';
100
+ }
101
+ }
102
+ export class ArrayDateUpdateBuilder {
103
+ set(values) {
104
+ if (values.length === 0)
105
+ return 'ARRAY[]::timestamp[]';
106
+ const formatted = values.map(v => {
107
+ const dateStr = v instanceof Date ? v.toISOString() : v;
108
+ return format('%L::timestamp', dateStr);
109
+ }).join(',');
110
+ return `ARRAY[${formatted}]`;
111
+ }
112
+ append(value) {
113
+ const dateStr = value instanceof Date ? value.toISOString() : value;
114
+ return format('array_append(%I, %L::timestamp)', this.getContextColumn(), dateStr);
115
+ }
116
+ prepend(value) {
117
+ const dateStr = value instanceof Date ? value.toISOString() : value;
118
+ return format('array_prepend(%L::timestamp, %I)', dateStr, this.getContextColumn());
119
+ }
120
+ remove(value) {
121
+ const dateStr = value instanceof Date ? value.toISOString() : value;
122
+ return format('array_remove(%I, %L::timestamp)', this.getContextColumn(), dateStr);
123
+ }
124
+ concat(values) {
125
+ if (values.length === 0)
126
+ return format('%I', this.getContextColumn());
127
+ const formatted = values.map(v => {
128
+ const dateStr = v instanceof Date ? v.toISOString() : v;
129
+ return format('%L::timestamp', dateStr);
130
+ }).join(',');
131
+ return format('%I || ARRAY[%s]', this.getContextColumn(), formatted);
132
+ }
133
+ getContextColumn() {
134
+ return '__COLUMN__';
135
+ }
136
+ }
137
+ export class ArrayJsonbUpdateBuilder {
138
+ set(values) {
139
+ if (values.length === 0)
140
+ return 'ARRAY[]::jsonb[]';
141
+ const formatted = values.map(v => format('%L::jsonb', JSON.stringify(v))).join(',');
142
+ return `ARRAY[${formatted}]`;
143
+ }
144
+ append(value) {
145
+ return format('array_append(%I, %L::jsonb)', this.getContextColumn(), JSON.stringify(value));
146
+ }
147
+ prepend(value) {
148
+ return format('array_prepend(%L::jsonb, %I)', JSON.stringify(value), this.getContextColumn());
149
+ }
150
+ remove(value) {
151
+ return format('array_remove(%I, %L::jsonb)', this.getContextColumn(), JSON.stringify(value));
152
+ }
153
+ concat(values) {
154
+ if (values.length === 0)
155
+ return format('%I', this.getContextColumn());
156
+ const formatted = values.map(v => format('%L::jsonb', JSON.stringify(v))).join(',');
157
+ return format('%I || ARRAY[%s]', this.getContextColumn(), formatted);
158
+ }
159
+ getContextColumn() {
160
+ return '__COLUMN__';
161
+ }
162
+ }
163
+ export class ArrayUpdateBuilder {
164
+ currentColumn;
165
+ constructor(currentColumn) {
166
+ this.currentColumn = currentColumn;
167
+ }
168
+ get string() {
169
+ return new ArrayStringUpdateBuilder();
170
+ }
171
+ get numeric() {
172
+ return new ArrayNumericUpdateBuilder();
173
+ }
174
+ get integer() {
175
+ return this.numeric;
176
+ }
177
+ get boolean() {
178
+ return new ArrayBooleanUpdateBuilder();
179
+ }
180
+ get uuid() {
181
+ return new ArrayUuidUpdateBuilder();
182
+ }
183
+ get date() {
184
+ return new ArrayDateUpdateBuilder();
185
+ }
186
+ get timestamp() {
187
+ return this.date;
188
+ }
189
+ get jsonb() {
190
+ return new ArrayJsonbUpdateBuilder();
191
+ }
192
+ }
@@ -0,0 +1,2 @@
1
+ export { UpdateBuilder } from "./update-builder.js";
2
+ export { ArrayUpdateBuilder, ArrayStringUpdateBuilder, ArrayNumericUpdateBuilder, ArrayBooleanUpdateBuilder, ArrayUuidUpdateBuilder, ArrayDateUpdateBuilder, ArrayJsonbUpdateBuilder } from "./array-update-builder.js";
@@ -0,0 +1,188 @@
1
+ import format from "../../addons/pg-format.js";
2
+ import { ConditionCollector, buildConditionsSQL } from "../condition/condition-collector.js";
3
+ import { convertCase } from "../utils/case-converter.js";
4
+ import { ArrayUpdateBuilder } from "./array-update-builder.js";
5
+ import { SelectBuilder } from "../select/select-builder.js";
6
+ import { CountBuilder } from "../count/count-builder.js";
7
+ export class UpdateBuilder {
8
+ tableName;
9
+ updateData;
10
+ whereConditions = [];
11
+ returningClause;
12
+ _case = 'keep-case';
13
+ _convertCase = '2snake';
14
+ constructor(tableName, data) {
15
+ this.tableName = tableName;
16
+ this.updateData = data;
17
+ }
18
+ convertCase(type, conversionCase = '2snake') {
19
+ this._case = type;
20
+ this._convertCase = conversionCase;
21
+ return this;
22
+ }
23
+ where(callback) {
24
+ const conditionBuilder = new ConditionCollector();
25
+ callback(conditionBuilder);
26
+ this.whereConditions.push(...conditionBuilder.getConditions());
27
+ return this;
28
+ }
29
+ returning(columns) {
30
+ if (columns === null) {
31
+ this.returningClause = undefined;
32
+ }
33
+ else {
34
+ this.returningClause = {
35
+ type: 'columns',
36
+ columns: Array.isArray(columns) ? columns : [columns]
37
+ };
38
+ }
39
+ return this;
40
+ }
41
+ returningSelect(callback) {
42
+ const builder = new SelectBuilder(this.tableName);
43
+ const result = callback(builder);
44
+ if (result === null) {
45
+ this.returningClause = undefined;
46
+ }
47
+ else {
48
+ this.returningClause = {
49
+ type: 'select',
50
+ builder: result
51
+ };
52
+ }
53
+ return this;
54
+ }
55
+ returningCount(callback) {
56
+ const builder = new CountBuilder(this.tableName);
57
+ const result = callback(builder);
58
+ if (result === null) {
59
+ this.returningClause = undefined;
60
+ }
61
+ else {
62
+ this.returningClause = {
63
+ type: 'count',
64
+ builder: result
65
+ };
66
+ }
67
+ return this;
68
+ }
69
+ convertColumnName(name) {
70
+ if (this._case === 'to-lower')
71
+ return name.toLowerCase();
72
+ if (this._case === 'to-upper')
73
+ return name.toUpperCase();
74
+ if (this._case === 'convert-case')
75
+ return convertCase(name, this._convertCase);
76
+ return name;
77
+ }
78
+ formatArrayValue(value) {
79
+ if (value.length === 0)
80
+ return 'ARRAY[]';
81
+ const firstElement = value[0];
82
+ const firstType = typeof firstElement;
83
+ const isHomogeneous = value.every(v => typeof v === firstType);
84
+ if (!isHomogeneous) {
85
+ const jsonValues = value.map(v => format('%L::jsonb', JSON.stringify(v))).join(',');
86
+ return `ARRAY[${jsonValues}]`;
87
+ }
88
+ if (firstType === 'string') {
89
+ const stringValues = value.map(v => format('%L', v)).join(',');
90
+ return `ARRAY[${stringValues}]`;
91
+ }
92
+ if (firstType === 'number') {
93
+ return `ARRAY[${value.join(',')}]`;
94
+ }
95
+ if (firstType === 'boolean') {
96
+ return `ARRAY[${value.map(v => v.toString()).join(',')}]`;
97
+ }
98
+ if (firstType === 'object' && firstElement !== null) {
99
+ const jsonValues = value.map(v => format('%L::jsonb', JSON.stringify(v))).join(',');
100
+ return `ARRAY[${jsonValues}]`;
101
+ }
102
+ const stringValues = value.map(v => format('%L', v)).join(',');
103
+ return `ARRAY[${stringValues}]`;
104
+ }
105
+ toString() {
106
+ const processedPairs = Object.entries(this.updateData).map(([col, val]) => {
107
+ const convertedCol = this.convertColumnName(col);
108
+ if (typeof val === 'function') {
109
+ const arrayBuilder = new ArrayUpdateBuilder(col);
110
+ const result = val(arrayBuilder);
111
+ const finalResult = result.replace(/__COLUMN__/g, format.ident(convertedCol));
112
+ return format('%I = %s', convertedCol, finalResult);
113
+ }
114
+ if (Array.isArray(val)) {
115
+ return format('%I = %s', convertedCol, this.formatArrayValue(val));
116
+ }
117
+ return format('%I = %L', convertedCol, val);
118
+ });
119
+ let query = format('UPDATE %I SET %s', this.tableName, processedPairs.join(', '));
120
+ if (this.whereConditions.length > 0) {
121
+ query += ' WHERE ' + buildConditionsSQL(this.whereConditions);
122
+ }
123
+ if (this.returningClause) {
124
+ query += this.buildReturningClause();
125
+ }
126
+ return query;
127
+ }
128
+ parseCountColumns(columnsStr) {
129
+ const columns = [];
130
+ let depth = 0;
131
+ let currentExpr = '';
132
+ let i = 0;
133
+ while (i < columnsStr.length) {
134
+ const char = columnsStr[i];
135
+ if (char === '(')
136
+ depth++;
137
+ else if (char === ')')
138
+ depth--;
139
+ else if (char === ',' && depth === 0) {
140
+ if (currentExpr.trim()) {
141
+ columns.push(this.parseColumnExpr(currentExpr.trim()));
142
+ }
143
+ currentExpr = '';
144
+ i++;
145
+ continue;
146
+ }
147
+ currentExpr += char;
148
+ i++;
149
+ }
150
+ if (currentExpr.trim()) {
151
+ columns.push(this.parseColumnExpr(currentExpr.trim()));
152
+ }
153
+ return columns;
154
+ }
155
+ parseColumnExpr(expr) {
156
+ const asMatch = expr.match(/^(.+?)\s+AS\s+(.+)$/i);
157
+ if (!asMatch) {
158
+ return { name: 'count', expr };
159
+ }
160
+ const [, expression, alias] = asMatch;
161
+ const name = alias.replace(/^["']|["']$/g, '');
162
+ return { name, expr: expression.trim() };
163
+ }
164
+ buildReturningClause() {
165
+ if (!this.returningClause)
166
+ return '';
167
+ switch (this.returningClause.type) {
168
+ case 'columns':
169
+ return format(' RETURNING %I', this.returningClause.columns);
170
+ case 'select': {
171
+ const selectSQL = this.returningClause.builder.toString();
172
+ return ` RETURNING (${selectSQL})`;
173
+ }
174
+ case 'count': {
175
+ const countSQL = this.returningClause.builder.toString();
176
+ const selectMatch = countSQL.match(/^SELECT\s+(.+?)\s+FROM\s+(.+)$/is);
177
+ if (!selectMatch)
178
+ return ` RETURNING (${countSQL})`;
179
+ const [, columnsStr, fromClause] = selectMatch;
180
+ const columns = this.parseCountColumns(columnsStr);
181
+ const jsonArgs = columns.map(({ name, expr }) => `${format('%L', name)}, ${expr}`).join(', ');
182
+ return ` RETURNING (SELECT json_build_object(${jsonArgs}) FROM ${fromClause})`;
183
+ }
184
+ default:
185
+ return '';
186
+ }
187
+ }
188
+ }