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,55 @@
1
+ export function convertCase(str, type) {
2
+ if (!str || typeof str !== 'string')
3
+ return str;
4
+ function toCamel(s) {
5
+ return s.split(/[_\s-]+/).filter(segment => segment.length > 0).map((segment, index) => {
6
+ if (index === 0)
7
+ return segment.charAt(0).toLowerCase() + segment.slice(1).toLowerCase();
8
+ return segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase();
9
+ }).join('').replace(/'/g, '');
10
+ }
11
+ function toPascal(s) {
12
+ return s.split(/[_\s-]+/).filter(segment => segment.length > 0).map(segment => {
13
+ return segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase();
14
+ }).join('').replace(/'/g, '');
15
+ }
16
+ function toSnake(s) {
17
+ return s.split(/[_\s-]+/).filter(segment => segment.length > 0).map(segment => {
18
+ return segment.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
19
+ }).join('_').replace(/'/g, '');
20
+ }
21
+ switch (type) {
22
+ case 'snake2camel':
23
+ return /^[a-z0-9]+(_[a-z0-9]+)*$/.test(str)
24
+ ? str.split('_').map((word, index) => index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)).join('')
25
+ : str;
26
+ case 'snake2pascal':
27
+ return /^[a-z0-9]+(_[a-z0-9]+)*$/.test(str)
28
+ ? str.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join('')
29
+ : str;
30
+ case 'camel2snake':
31
+ return /^[a-z][a-z0-9]*([A-Z][a-z0-9]*)*$/.test(str)
32
+ ? str.replace(/([A-Z])/g, '_$1').toLowerCase()
33
+ : str;
34
+ case 'camel2pascal':
35
+ return /^[a-z][a-z0-9]*([A-Z][a-z0-9]*)*$/.test(str)
36
+ ? str.charAt(0).toUpperCase() + str.slice(1)
37
+ : str;
38
+ case 'pascal2snake':
39
+ return /^[A-Z][a-z0-9]*([A-Z][a-z0-9]*)*$/.test(str)
40
+ ? str.replace(/([A-Z])/g, (match, offset) => offset > 0 ? '_' + match : match).toLowerCase()
41
+ : str;
42
+ case 'pascal2camel':
43
+ return /^[A-Z][a-z0-9]*([A-Z][a-z0-9]*)*$/.test(str)
44
+ ? str.charAt(0).toLowerCase() + str.slice(1)
45
+ : str;
46
+ case '2camel':
47
+ return toCamel(str);
48
+ case '2pascal':
49
+ return toPascal(str);
50
+ case '2snake':
51
+ return toSnake(str);
52
+ default:
53
+ return str;
54
+ }
55
+ }
@@ -0,0 +1,113 @@
1
+ export function detectEnvironment() {
2
+ const detected = [];
3
+ const hasProcess = typeof process !== 'undefined' && process.env !== undefined;
4
+ if (!hasProcess) {
5
+ return {
6
+ type: 'edge',
7
+ provider: 'cloudflare',
8
+ detected: ['NO_PROCESS_OBJECT'],
9
+ hasProcess: false
10
+ };
11
+ }
12
+ if (process.env.VERCEL || process.env.VERCEL_ENV) {
13
+ if (process.env.VERCEL)
14
+ detected.push('VERCEL');
15
+ if (process.env.VERCEL_ENV)
16
+ detected.push('VERCEL_ENV');
17
+ return {
18
+ type: 'serverless',
19
+ provider: 'vercel',
20
+ detected,
21
+ hasProcess: true
22
+ };
23
+ }
24
+ if (process.env.AWS_LAMBDA_FUNCTION_NAME ||
25
+ process.env.AWS_EXECUTION_ENV ||
26
+ process.env.LAMBDA_TASK_ROOT) {
27
+ if (process.env.AWS_LAMBDA_FUNCTION_NAME)
28
+ detected.push('AWS_LAMBDA_FUNCTION_NAME');
29
+ if (process.env.AWS_EXECUTION_ENV)
30
+ detected.push('AWS_EXECUTION_ENV');
31
+ if (process.env.LAMBDA_TASK_ROOT)
32
+ detected.push('LAMBDA_TASK_ROOT');
33
+ return {
34
+ type: 'serverless',
35
+ provider: 'aws-lambda',
36
+ detected,
37
+ hasProcess: true
38
+ };
39
+ }
40
+ if (process.env.NETLIFY || process.env.NETLIFY_DEV) {
41
+ if (process.env.NETLIFY)
42
+ detected.push('NETLIFY');
43
+ if (process.env.NETLIFY_DEV)
44
+ detected.push('NETLIFY_DEV');
45
+ return {
46
+ type: 'serverless',
47
+ provider: 'netlify',
48
+ detected,
49
+ hasProcess: true
50
+ };
51
+ }
52
+ if (process.env.FUNCTION_NAME || process.env.FUNCTION_TARGET || process.env.GCP_PROJECT) {
53
+ if (process.env.FUNCTION_NAME)
54
+ detected.push('FUNCTION_NAME');
55
+ if (process.env.FUNCTION_TARGET)
56
+ detected.push('FUNCTION_TARGET');
57
+ if (process.env.GCP_PROJECT)
58
+ detected.push('GCP_PROJECT');
59
+ return {
60
+ type: 'serverless',
61
+ provider: 'google-cloud',
62
+ detected,
63
+ hasProcess: true
64
+ };
65
+ }
66
+ if (process.env.AZURE_FUNCTIONS_ENVIRONMENT || process.env.WEBSITE_INSTANCE_ID) {
67
+ if (process.env.AZURE_FUNCTIONS_ENVIRONMENT)
68
+ detected.push('AZURE_FUNCTIONS_ENVIRONMENT');
69
+ if (process.env.WEBSITE_INSTANCE_ID)
70
+ detected.push('WEBSITE_INSTANCE_ID');
71
+ return {
72
+ type: 'serverless',
73
+ provider: 'azure',
74
+ detected,
75
+ hasProcess: true
76
+ };
77
+ }
78
+ if (process.env.CLOUDFLARE_WORKERS || process.env.CF_PAGES) {
79
+ if (process.env.CLOUDFLARE_WORKERS)
80
+ detected.push('CLOUDFLARE_WORKERS');
81
+ if (process.env.CF_PAGES)
82
+ detected.push('CF_PAGES');
83
+ return {
84
+ type: 'edge',
85
+ provider: 'cloudflare',
86
+ detected,
87
+ hasProcess: true
88
+ };
89
+ }
90
+ return {
91
+ type: 'traditional',
92
+ detected: [],
93
+ hasProcess: true
94
+ };
95
+ }
96
+ export function isServerless() {
97
+ return detectEnvironment().type === 'serverless';
98
+ }
99
+ export function isTraditional() {
100
+ return detectEnvironment().type === 'traditional';
101
+ }
102
+ export function isEdge() {
103
+ return detectEnvironment().type === 'edge';
104
+ }
105
+ export function getEnvironmentDescription(env) {
106
+ if (env.type === 'serverless') {
107
+ return `${env.provider} (serverless)`;
108
+ }
109
+ if (env.type === 'edge') {
110
+ return `${env.provider || 'edge'} runtime`;
111
+ }
112
+ return 'Traditional server';
113
+ }
@@ -0,0 +1,2 @@
1
+ export { convertCase } from "./case-converter.js";
2
+ export { default as format } from "../../addons/pg-format.js";
@@ -0,0 +1,100 @@
1
+ import { detectEnvironment } from "./environment-detection.js";
2
+ export function getSmartPoolDefaults() {
3
+ const env = detectEnvironment();
4
+ const baseConfig = {
5
+ min: 0,
6
+ idleTimeoutMillis: 10000,
7
+ connectionTimeoutMillis: 10000,
8
+ pool: false
9
+ };
10
+ if (env.type === 'serverless') {
11
+ return {
12
+ ...baseConfig,
13
+ max: 1,
14
+ idleTimeoutMillis: 1000,
15
+ recommendation: `Serverless environment detected (${env.provider}).\n` +
16
+ ' Using single connection mode (recommended).\n' +
17
+ ' If pooling enabled: min: 0, max: 1'
18
+ };
19
+ }
20
+ if (env.type === 'edge') {
21
+ return {
22
+ ...baseConfig,
23
+ max: 0,
24
+ recommendation: 'Edge runtime detected. PostgreSQL connections not supported.\n' +
25
+ ' Use query builder only: relq("table").select().toString()'
26
+ };
27
+ }
28
+ return {
29
+ ...baseConfig,
30
+ max: 10,
31
+ idleTimeoutMillis: 30000,
32
+ recommendation: 'Traditional server environment.\n' +
33
+ ' Pooling disabled by default (single client).\n' +
34
+ ' To enable pooling: new Relq(schema, { pool: true, ... })'
35
+ };
36
+ }
37
+ export function validatePoolConfig(config, env) {
38
+ const warnings = [];
39
+ const errors = [];
40
+ const min = config.min ?? 0;
41
+ const max = config.max ?? 10;
42
+ if (env.type === 'edge') {
43
+ errors.push('❌ Edge runtime detected (Cloudflare Workers/Deno Deploy).\n' +
44
+ ' PostgreSQL connections are not supported in edge runtimes.\n' +
45
+ ' \n' +
46
+ ' Options:\n' +
47
+ ' 1. Use query builder only: relq("table").select().toString()\n' +
48
+ ' 2. Use HTTP-based database (Supabase, Neon, Xata)\n' +
49
+ ' 3. Deploy to traditional Node.js runtime');
50
+ return { valid: false, warnings, errors };
51
+ }
52
+ if (min > max) {
53
+ warnings.push(`⚠️ Pool min (${min}) is greater than max (${max}).\n` +
54
+ ` This is invalid. Min will be clamped to max (${max}).`);
55
+ }
56
+ if (env.type === 'serverless' && max > 1) {
57
+ warnings.push(`⚠️ Running in ${env.provider} with pool max: ${max}.\n` +
58
+ ' Each serverless function will create up to ' + max + ' connections.\n' +
59
+ ' With many concurrent functions, this can exhaust PostgreSQL connections.\n' +
60
+ ' \n' +
61
+ ' Recommended: pool: { min: 0, max: 1 }\n' +
62
+ ' \n' +
63
+ ' If you need connection pooling in serverless:\n' +
64
+ ' - Use PgBouncer or connection pooler\n' +
65
+ ' - Use Supabase (built-in pooling)\n' +
66
+ ' - Use Neon serverless driver');
67
+ }
68
+ if (env.type === 'traditional' && min > 5) {
69
+ warnings.push(`⚠️ Pool min set to ${min}. This keeps ${min} connections always open.\n` +
70
+ ' High min values waste resources when traffic is low.\n' +
71
+ ' \n' +
72
+ ' Recommended: min: 0 (connections created on demand)\n' +
73
+ ' Pool will scale up to max: ' + max + ' under load automatically.');
74
+ }
75
+ if (max > 20) {
76
+ warnings.push(`⚠️ Pool max set to ${max}. This is very high.\n` +
77
+ ' PostgreSQL connection limit is typically 100-200.\n' +
78
+ ' Multiple app instances × max connections can exhaust the database.\n' +
79
+ ' \n' +
80
+ ' Recommended: max: 10-20 per app instance');
81
+ }
82
+ return {
83
+ valid: errors.length === 0,
84
+ warnings,
85
+ errors
86
+ };
87
+ }
88
+ export function mergeWithDefaults(userConfig) {
89
+ const defaults = getSmartPoolDefaults();
90
+ return {
91
+ min: userConfig?.min ?? defaults.min,
92
+ max: userConfig?.max ?? defaults.max,
93
+ idleTimeoutMillis: userConfig?.idleTimeoutMillis ?? defaults.idleTimeoutMillis,
94
+ connectionTimeoutMillis: userConfig?.connectionTimeoutMillis ?? defaults.connectionTimeoutMillis,
95
+ recommendation: defaults.recommendation
96
+ };
97
+ }
98
+ export function formatPoolConfig(config) {
99
+ return `{ min: ${config.min}, max: ${config.max}, idleTimeout: ${config.idleTimeoutMillis}ms }`;
100
+ }
@@ -0,0 +1,110 @@
1
+ const BIGINT_TYPES = new Set(['BIGINT', 'INT8', 'BIGSERIAL', 'SERIAL8']);
2
+ const DATE_TYPES = new Set(['TIMESTAMP', 'TIMESTAMPTZ', 'DATE', 'TIME', 'TIMETZ']);
3
+ const JSON_TYPES = new Set(['JSON', 'JSONB']);
4
+ export function deserializeValue(value, pgType) {
5
+ if (value === null || value === undefined) {
6
+ return value;
7
+ }
8
+ const upperType = pgType.toUpperCase();
9
+ if (BIGINT_TYPES.has(upperType)) {
10
+ if (typeof value === 'string') {
11
+ return BigInt(value);
12
+ }
13
+ if (typeof value === 'number') {
14
+ return BigInt(value);
15
+ }
16
+ return value;
17
+ }
18
+ if (DATE_TYPES.has(upperType) || upperType.startsWith('TIMESTAMP')) {
19
+ if (value instanceof Date) {
20
+ return value;
21
+ }
22
+ if (typeof value === 'string' || typeof value === 'number') {
23
+ return new Date(value);
24
+ }
25
+ return value;
26
+ }
27
+ if (JSON_TYPES.has(upperType)) {
28
+ if (typeof value === 'string') {
29
+ try {
30
+ return JSON.parse(value);
31
+ }
32
+ catch {
33
+ return value;
34
+ }
35
+ }
36
+ return value;
37
+ }
38
+ if (upperType === 'BOOLEAN' || upperType === 'BOOL') {
39
+ if (typeof value === 'string') {
40
+ return value.toLowerCase() === 'true' || value === 't' || value === '1';
41
+ }
42
+ return Boolean(value);
43
+ }
44
+ return value;
45
+ }
46
+ export function deserializeRow(row, schema) {
47
+ const result = {};
48
+ const columnMap = new Map();
49
+ for (const [key, config] of Object.entries(schema)) {
50
+ const dbColumnName = config.$columnName || key;
51
+ columnMap.set(dbColumnName, { key, type: config.$type });
52
+ }
53
+ for (const [dbColumn, value] of Object.entries(row)) {
54
+ const mapping = columnMap.get(dbColumn);
55
+ if (mapping) {
56
+ result[mapping.key] = deserializeValue(value, mapping.type);
57
+ }
58
+ else {
59
+ result[dbColumn] = value;
60
+ }
61
+ }
62
+ return result;
63
+ }
64
+ export function deserializeRows(rows, schema) {
65
+ return rows.map(row => deserializeRow(row, schema));
66
+ }
67
+ export function serializeValue(value, pgType) {
68
+ if (value === null || value === undefined) {
69
+ return value;
70
+ }
71
+ const upperType = pgType.toUpperCase();
72
+ if (BIGINT_TYPES.has(upperType)) {
73
+ if (typeof value === 'bigint') {
74
+ return value.toString();
75
+ }
76
+ return value;
77
+ }
78
+ if (DATE_TYPES.has(upperType) || upperType.startsWith('TIMESTAMP')) {
79
+ if (value instanceof Date) {
80
+ return value.toISOString();
81
+ }
82
+ return value;
83
+ }
84
+ if (JSON_TYPES.has(upperType)) {
85
+ if (typeof value === 'object' && value !== null) {
86
+ return JSON.stringify(value);
87
+ }
88
+ return value;
89
+ }
90
+ return value;
91
+ }
92
+ export function serializeRow(row, schema) {
93
+ const result = {};
94
+ for (const [key, value] of Object.entries(row)) {
95
+ const config = schema[key];
96
+ if (config) {
97
+ result[key] = serializeValue(value, config.$type);
98
+ }
99
+ else {
100
+ result[key] = value;
101
+ }
102
+ }
103
+ return result;
104
+ }
105
+ export function extractSchemaColumns(tableDefinition) {
106
+ if (tableDefinition && tableDefinition.$columns) {
107
+ return tableDefinition.$columns;
108
+ }
109
+ return null;
110
+ }
@@ -0,0 +1,171 @@
1
+ import format from "../../addons/pg-format.js";
2
+ import { RelqBuilderError } from "../errors/relq-errors.js";
3
+ export class CreateViewBuilder {
4
+ viewName;
5
+ query;
6
+ materializedFlag = false;
7
+ withDataFlag = true;
8
+ columnsAlias;
9
+ __checkOption;
10
+ securityBarrierFlag = false;
11
+ orReplaceFlag = false;
12
+ ifNotExistsFlag = false;
13
+ tablespaceValue;
14
+ withOptions = {};
15
+ constructor(viewName) {
16
+ this.viewName = viewName;
17
+ }
18
+ as(query) {
19
+ this.query = typeof query === 'string' ? query : query.toString();
20
+ return this;
21
+ }
22
+ materialized() {
23
+ this.materializedFlag = true;
24
+ return this;
25
+ }
26
+ withData() {
27
+ this.withDataFlag = true;
28
+ return this;
29
+ }
30
+ withNoData() {
31
+ this.withDataFlag = false;
32
+ return this;
33
+ }
34
+ columns(...names) {
35
+ this.columnsAlias = names;
36
+ return this;
37
+ }
38
+ checkOption(level) {
39
+ this.__checkOption = level;
40
+ return this;
41
+ }
42
+ securityBarrier() {
43
+ this.securityBarrierFlag = true;
44
+ return this;
45
+ }
46
+ orReplace() {
47
+ this.orReplaceFlag = true;
48
+ return this;
49
+ }
50
+ ifNotExists() {
51
+ this.ifNotExistsFlag = true;
52
+ return this;
53
+ }
54
+ tablespace(name) {
55
+ this.tablespaceValue = name;
56
+ return this;
57
+ }
58
+ with(options) {
59
+ this.withOptions = { ...this.withOptions, ...options };
60
+ return this;
61
+ }
62
+ toString() {
63
+ if (!this.query) {
64
+ throw new RelqBuilderError('View query is required', {
65
+ builder: 'CreateViewBuilder',
66
+ missing: 'query',
67
+ hint: 'Use .as() method to specify the view query'
68
+ });
69
+ }
70
+ let sql = 'CREATE';
71
+ if (this.orReplaceFlag && !this.materializedFlag) {
72
+ sql += ' OR REPLACE';
73
+ }
74
+ if (this.materializedFlag) {
75
+ sql += ' MATERIALIZED';
76
+ }
77
+ sql += ' VIEW';
78
+ if (this.ifNotExistsFlag) {
79
+ sql += ' IF NOT EXISTS';
80
+ }
81
+ sql += ` ${format.ident(this.viewName)}`;
82
+ if (this.columnsAlias && this.columnsAlias.length > 0) {
83
+ sql += ` (${this.columnsAlias.map(c => format.ident(c)).join(', ')})`;
84
+ }
85
+ if (!this.materializedFlag && Object.keys(this.withOptions).length > 0) {
86
+ const opts = Object.entries(this.withOptions)
87
+ .map(([k, v]) => `${k} = ${typeof v === 'boolean' ? (v ? 'true' : 'false') : v}`)
88
+ .join(', ');
89
+ sql += ` WITH (${opts})`;
90
+ }
91
+ if (this.tablespaceValue && this.materializedFlag) {
92
+ sql += ` TABLESPACE ${format.ident(this.tablespaceValue)}`;
93
+ }
94
+ sql += ` AS ${this.query}`;
95
+ if (this.materializedFlag) {
96
+ sql += this.withDataFlag ? ' WITH DATA' : ' WITH NO DATA';
97
+ }
98
+ if (!this.materializedFlag && this.__checkOption) {
99
+ sql += ` WITH ${this.__checkOption} CHECK OPTION`;
100
+ }
101
+ return sql;
102
+ }
103
+ }
104
+ export class DropViewBuilder {
105
+ viewName;
106
+ materializedFlag = false;
107
+ ifExistsFlag = false;
108
+ cascadeFlag = false;
109
+ constructor(viewName, materialized = false) {
110
+ this.viewName = viewName;
111
+ this.materializedFlag = materialized;
112
+ }
113
+ ifExists() {
114
+ this.ifExistsFlag = true;
115
+ return this;
116
+ }
117
+ cascade() {
118
+ this.cascadeFlag = true;
119
+ return this;
120
+ }
121
+ restrict() {
122
+ this.cascadeFlag = false;
123
+ return this;
124
+ }
125
+ toString() {
126
+ let sql = 'DROP';
127
+ if (this.materializedFlag) {
128
+ sql += ' MATERIALIZED';
129
+ }
130
+ sql += ' VIEW';
131
+ if (this.ifExistsFlag) {
132
+ sql += ' IF EXISTS';
133
+ }
134
+ sql += ` ${format.ident(this.viewName)}`;
135
+ if (this.cascadeFlag) {
136
+ sql += ' CASCADE';
137
+ }
138
+ return sql;
139
+ }
140
+ }
141
+ export class RefreshMaterializedViewBuilder {
142
+ viewName;
143
+ concurrentlyFlag = false;
144
+ withDataFlag = true;
145
+ constructor(viewName) {
146
+ this.viewName = viewName;
147
+ }
148
+ concurrently() {
149
+ this.concurrentlyFlag = true;
150
+ return this;
151
+ }
152
+ withData() {
153
+ this.withDataFlag = true;
154
+ return this;
155
+ }
156
+ withNoData() {
157
+ this.withDataFlag = false;
158
+ return this;
159
+ }
160
+ toString() {
161
+ let sql = 'REFRESH MATERIALIZED VIEW';
162
+ if (this.concurrentlyFlag) {
163
+ sql += ' CONCURRENTLY';
164
+ }
165
+ sql += ` ${format.ident(this.viewName)}`;
166
+ if (!this.withDataFlag) {
167
+ sql += ' WITH NO DATA';
168
+ }
169
+ return sql;
170
+ }
171
+ }
@@ -0,0 +1 @@
1
+ export { CreateViewBuilder, DropViewBuilder, RefreshMaterializedViewBuilder } from "./create-view-builder.js";
@@ -0,0 +1 @@
1
+ export { WindowBuilder } from "./window-builder.js";
@@ -0,0 +1,73 @@
1
+ import format from "../../addons/pg-format.js";
2
+ export class WindowBuilder {
3
+ partitionColumns = [];
4
+ orderColumns = [];
5
+ frameStart;
6
+ frameEnd;
7
+ frameMode;
8
+ partitionBy(...columns) {
9
+ this.partitionColumns.push(...columns);
10
+ return this;
11
+ }
12
+ orderBy(column, direction = 'ASC') {
13
+ this.orderColumns.push({ column, direction });
14
+ return this;
15
+ }
16
+ rows(start, end) {
17
+ this.frameMode = 'ROWS';
18
+ this.frameStart = typeof start === 'number' ? `${start} PRECEDING` : start;
19
+ this.frameEnd = end ? (typeof end === 'number' ? `${end} FOLLOWING` : end) : 'CURRENT ROW';
20
+ return this;
21
+ }
22
+ range(start, end) {
23
+ this.frameMode = 'RANGE';
24
+ this.frameStart = typeof start === 'number' ? `${start} PRECEDING` : start;
25
+ this.frameEnd = end ? (typeof end === 'number' ? `${end} FOLLOWING` : end) : 'CURRENT ROW';
26
+ return this;
27
+ }
28
+ groups(start, end) {
29
+ this.frameMode = 'GROUPS';
30
+ this.frameStart = typeof start === 'number' ? `${start} PRECEDING` : start;
31
+ this.frameEnd = end ? (typeof end === 'number' ? `${end} FOLLOWING` : end) : 'CURRENT ROW';
32
+ return this;
33
+ }
34
+ toString() {
35
+ const parts = [];
36
+ if (this.partitionColumns.length > 0) {
37
+ parts.push(`PARTITION BY ${this.partitionColumns.map(c => format.ident(c)).join(', ')}`);
38
+ }
39
+ if (this.orderColumns.length > 0) {
40
+ parts.push(`ORDER BY ${this.orderColumns.map(o => `${format.ident(o.column)} ${o.direction}`).join(', ')}`);
41
+ }
42
+ if (this.frameMode && this.frameStart) {
43
+ parts.push(`${this.frameMode} BETWEEN ${this.frameStart} AND ${this.frameEnd}`);
44
+ }
45
+ return parts.join(' ');
46
+ }
47
+ rowNumber() {
48
+ return `ROW_NUMBER() OVER (${this.toString()})`;
49
+ }
50
+ rank() {
51
+ return `RANK() OVER (${this.toString()})`;
52
+ }
53
+ denseRank() {
54
+ return `DENSE_RANK() OVER (${this.toString()})`;
55
+ }
56
+ lag(column, offset = 1, defaultValue) {
57
+ const def = defaultValue !== undefined ? `, ${format('%L', defaultValue)}` : '';
58
+ return `LAG(${format.ident(column)}, ${offset}${def}) OVER (${this.toString()})`;
59
+ }
60
+ lead(column, offset = 1, defaultValue) {
61
+ const def = defaultValue !== undefined ? `, ${format('%L', defaultValue)}` : '';
62
+ return `LEAD(${format.ident(column)}, ${offset}${def}) OVER (${this.toString()})`;
63
+ }
64
+ firstValue(column) {
65
+ return `FIRST_VALUE(${format.ident(column)}) OVER (${this.toString()})`;
66
+ }
67
+ lastValue(column) {
68
+ return `LAST_VALUE(${format.ident(column)}) OVER (${this.toString()})`;
69
+ }
70
+ nthValue(column, n) {
71
+ return `NTH_VALUE(${format.ident(column)}, ${n}) OVER (${this.toString()})`;
72
+ }
73
+ }
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./cjs/index.cjs');