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,127 @@
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.findConfigFile = findConfigFile;
37
+ exports.findConfigFileRecursive = findConfigFileRecursive;
38
+ exports.configExists = configExists;
39
+ exports.loadConfigWithEnv = loadConfigWithEnv;
40
+ exports.validateConfig = validateConfig;
41
+ exports.requireValidConfig = requireValidConfig;
42
+ const config_1 = require("../../config/config.cjs");
43
+ const env_loader_1 = require("./env-loader.cjs");
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const CONFIG_FILENAMES = [
47
+ 'relq.config.ts',
48
+ 'relq.config.js',
49
+ 'relq.config.mjs',
50
+ ];
51
+ function findConfigFile(cwd = process.cwd()) {
52
+ for (const filename of CONFIG_FILENAMES) {
53
+ const filepath = path.join(cwd, filename);
54
+ if (fs.existsSync(filepath)) {
55
+ return filepath;
56
+ }
57
+ }
58
+ return null;
59
+ }
60
+ function findConfigFileRecursive(startDir = process.cwd()) {
61
+ let currentDir = path.resolve(startDir);
62
+ const root = path.parse(currentDir).root;
63
+ while (currentDir !== root) {
64
+ const found = findConfigFile(currentDir);
65
+ if (found) {
66
+ return { path: found, directory: currentDir };
67
+ }
68
+ currentDir = path.dirname(currentDir);
69
+ }
70
+ return null;
71
+ }
72
+ function configExists(cwd = process.cwd()) {
73
+ return findConfigFile(cwd) !== null;
74
+ }
75
+ async function loadConfigWithEnv(configPath) {
76
+ let config;
77
+ if (configPath) {
78
+ config = await (0, config_1.loadConfig)(configPath);
79
+ }
80
+ else {
81
+ const foundPath = findConfigFile();
82
+ if (foundPath) {
83
+ config = await (0, config_1.loadConfig)(foundPath);
84
+ }
85
+ else {
86
+ config = {};
87
+ }
88
+ }
89
+ if (!config.connection?.host && !config.connection?.url) {
90
+ const envConfig = (0, env_loader_1.loadEnvConfig)();
91
+ if (envConfig) {
92
+ config = {
93
+ ...config,
94
+ connection: {
95
+ ...config.connection,
96
+ ...envConfig,
97
+ },
98
+ };
99
+ }
100
+ }
101
+ return config;
102
+ }
103
+ function validateConfig(config) {
104
+ const errors = [];
105
+ if (!config.connection?.host && !config.connection?.url) {
106
+ errors.push('No database connection configured. Set connection in relq.config.ts or use DATABASE_* env vars.');
107
+ }
108
+ const hasSchemaPath = typeof config.schema === 'string';
109
+ const hasSchemaDir = typeof config.schema === 'object' && config.schema?.directory;
110
+ const hasTypeGenOutput = config.typeGeneration?.output;
111
+ const hasGenerateOutDir = config.generate?.outDir;
112
+ if (!hasSchemaPath && !hasSchemaDir && !hasTypeGenOutput && !hasGenerateOutDir) {
113
+ errors.push('No schema output path configured. Set schema, generate.outDir, or typeGeneration.output in relq.config.ts.');
114
+ }
115
+ return errors;
116
+ }
117
+ function requireValidConfig(config) {
118
+ const errors = validateConfig(config);
119
+ if (errors.length > 0) {
120
+ console.error('Configuration errors:');
121
+ for (const error of errors) {
122
+ console.error(` • ${error}`);
123
+ }
124
+ console.error('\nRun "relq init" to create a configuration file.');
125
+ process.exit(1);
126
+ }
127
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadEnvConfig = loadEnvConfig;
4
+ exports.hasEnvConfig = hasEnvConfig;
5
+ exports.getConnectionDescription = getConnectionDescription;
6
+ function loadEnvConfig() {
7
+ const connectionString = process.env.DATABASE_CONNECTION_STRING;
8
+ if (connectionString) {
9
+ return parseConnectionString(connectionString);
10
+ }
11
+ const host = process.env.DATABASE_HOST;
12
+ const database = process.env.DATABASE_NAME;
13
+ const user = process.env.DATABASE_USER;
14
+ const password = process.env.DATABASE_PASSWORD;
15
+ const port = process.env.DATABASE_PORT;
16
+ if (!host || !database) {
17
+ return null;
18
+ }
19
+ return {
20
+ host,
21
+ port: port ? parseInt(port, 10) : 5432,
22
+ database,
23
+ user: user || 'postgres',
24
+ password: password || '',
25
+ };
26
+ }
27
+ function parseConnectionString(url) {
28
+ try {
29
+ const parsed = new URL(url);
30
+ return {
31
+ url,
32
+ host: parsed.hostname,
33
+ port: parsed.port ? parseInt(parsed.port, 10) : 5432,
34
+ database: parsed.pathname.slice(1),
35
+ user: parsed.username || 'postgres',
36
+ password: parsed.password || '',
37
+ ssl: parsed.searchParams.get('sslmode'),
38
+ };
39
+ }
40
+ catch {
41
+ return { url };
42
+ }
43
+ }
44
+ function hasEnvConfig() {
45
+ return !!(process.env.DATABASE_CONNECTION_STRING ||
46
+ process.env.DATABASE_HOST);
47
+ }
48
+ function getConnectionDescription(config) {
49
+ if (config.url) {
50
+ try {
51
+ const url = new URL(config.url);
52
+ if (url.password) {
53
+ url.password = '***';
54
+ }
55
+ return url.toString();
56
+ }
57
+ catch {
58
+ return config.url.replace(/:([^:@]+)@/, ':***@');
59
+ }
60
+ }
61
+ return `${config.user || 'postgres'}@${config.host}:${config.port || 5432}/${config.database}`;
62
+ }
@@ -0,0 +1,398 @@
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.fastIntrospectDatabase = fastIntrospectDatabase;
37
+ async function fastIntrospectDatabase(connection, onProgress, options) {
38
+ const { includeFunctions = false, includeTriggers = false } = options || {};
39
+ const { Pool } = await Promise.resolve().then(() => __importStar(require("../../../addons/pg.js")));
40
+ onProgress?.('connecting', connection.database);
41
+ const pool = new Pool({
42
+ host: connection.host,
43
+ port: connection.port || 5432,
44
+ database: connection.database,
45
+ user: connection.user,
46
+ password: connection.password,
47
+ connectionString: connection.url,
48
+ ssl: connection.ssl,
49
+ });
50
+ try {
51
+ onProgress?.('fetching_tables');
52
+ const tablesResult = await pool.query(`
53
+ SELECT
54
+ c.relname as table_name,
55
+ n.nspname as table_schema,
56
+ c.reltuples::bigint as row_count,
57
+ c.relispartition as is_partition,
58
+ c.relkind = 'p' as is_partitioned,
59
+ CASE
60
+ WHEN pt.partstrat = 'l' THEN 'LIST'
61
+ WHEN pt.partstrat = 'r' THEN 'RANGE'
62
+ WHEN pt.partstrat = 'h' THEN 'HASH'
63
+ END as partition_type,
64
+ -- Get partition key columns
65
+ (
66
+ SELECT array_agg(a.attname ORDER BY array_position(pt.partattrs, a.attnum))
67
+ FROM pg_attribute a
68
+ WHERE a.attrelid = c.oid
69
+ AND a.attnum = ANY(pt.partattrs)
70
+ ) as partition_key
71
+ FROM pg_class c
72
+ JOIN pg_namespace n ON n.oid = c.relnamespace
73
+ LEFT JOIN pg_partitioned_table pt ON pt.partrelid = c.oid
74
+ WHERE n.nspname = 'public'
75
+ AND c.relkind IN ('r', 'p') -- Regular and partitioned tables
76
+ AND NOT c.relispartition
77
+ ORDER BY c.relname;
78
+ `);
79
+ onProgress?.('fetching_columns');
80
+ const columnsResult = await pool.query(`
81
+ SELECT
82
+ c.table_name,
83
+ c.column_name,
84
+ c.data_type,
85
+ c.udt_name,
86
+ c.is_nullable = 'YES' as is_nullable,
87
+ c.column_default,
88
+ c.character_maximum_length,
89
+ c.numeric_precision,
90
+ c.numeric_scale,
91
+ c.is_generated = 'ALWAYS' as is_generated,
92
+ c.generation_expression,
93
+ c.identity_generation,
94
+ col_description(pgc.oid, c.ordinal_position::int) as column_comment
95
+ FROM information_schema.columns c
96
+ JOIN pg_class pgc ON pgc.relname = c.table_name
97
+ JOIN pg_namespace pgn ON pgn.oid = pgc.relnamespace AND pgn.nspname = c.table_schema
98
+ WHERE c.table_schema = 'public'
99
+ ORDER BY c.table_name, c.ordinal_position;
100
+ `);
101
+ const constraintsResult = await pool.query(`
102
+ SELECT
103
+ tc.table_name,
104
+ tc.constraint_name,
105
+ tc.constraint_type,
106
+ array_agg(DISTINCT kcu.column_name ORDER BY kcu.column_name) as columns,
107
+ ccu.table_name as referenced_table,
108
+ array_agg(DISTINCT ccu.column_name) as referenced_columns,
109
+ rc.update_rule as on_update,
110
+ rc.delete_rule as on_delete
111
+ FROM information_schema.table_constraints tc
112
+ JOIN information_schema.key_column_usage kcu
113
+ ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
114
+ LEFT JOIN information_schema.constraint_column_usage ccu
115
+ ON tc.constraint_name = ccu.constraint_name AND tc.constraint_type = 'FOREIGN KEY'
116
+ LEFT JOIN information_schema.referential_constraints rc
117
+ ON tc.constraint_name = rc.constraint_name AND tc.table_schema = rc.constraint_schema
118
+ WHERE tc.table_schema = 'public'
119
+ GROUP BY tc.table_name, tc.constraint_name, tc.constraint_type, ccu.table_name, rc.update_rule, rc.delete_rule;
120
+ `);
121
+ const indexesResult = await pool.query(`
122
+ SELECT
123
+ t.relname as table_name,
124
+ i.relname as index_name,
125
+ am.amname as index_type,
126
+ ix.indisunique as is_unique,
127
+ ix.indisprimary as is_primary,
128
+ pg_get_indexdef(ix.indexrelid) as index_definition,
129
+ pg_get_expr(ix.indpred, ix.indrelid) as where_clause,
130
+ pg_get_expr(ix.indexprs, ix.indrelid) as expression,
131
+ array_agg(a.attname ORDER BY array_position(ix.indkey, a.attnum)) FILTER (WHERE a.attnum > 0) as columns
132
+ FROM pg_index ix
133
+ JOIN pg_class t ON t.oid = ix.indrelid
134
+ JOIN pg_class i ON i.oid = ix.indexrelid
135
+ JOIN pg_namespace n ON n.oid = t.relnamespace
136
+ JOIN pg_am am ON am.oid = i.relam
137
+ LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(ix.indkey)
138
+ WHERE n.nspname = 'public'
139
+ AND NOT ix.indisprimary
140
+ GROUP BY t.relname, i.relname, am.amname, ix.indisunique, ix.indisprimary, ix.indexrelid, ix.indpred, ix.indexprs, ix.indrelid;
141
+ `);
142
+ const checksResult = await pool.query(`
143
+ SELECT
144
+ c.relname as table_name,
145
+ con.conname as constraint_name,
146
+ pg_get_constraintdef(con.oid) as definition
147
+ FROM pg_constraint con
148
+ JOIN pg_class c ON c.oid = con.conrelid
149
+ JOIN pg_namespace n ON n.oid = c.relnamespace
150
+ WHERE n.nspname = 'public' AND con.contype = 'c';
151
+ `);
152
+ onProgress?.('fetching_enums');
153
+ const enumsResult = await pool.query(`
154
+ SELECT
155
+ t.typname as enum_name,
156
+ n.nspname as enum_schema,
157
+ array_agg(e.enumlabel ORDER BY e.enumsortorder) as enum_values
158
+ FROM pg_type t
159
+ JOIN pg_enum e ON t.oid = e.enumtypid
160
+ JOIN pg_namespace n ON t.typnamespace = n.oid
161
+ WHERE n.nspname = 'public'
162
+ GROUP BY t.typname, n.nspname
163
+ ORDER BY t.typname;
164
+ `);
165
+ const enums = enumsResult.rows.map(row => ({
166
+ name: row.enum_name,
167
+ schema: row.enum_schema,
168
+ values: row.enum_values || [],
169
+ }));
170
+ onProgress?.('processing');
171
+ const columnsByTable = new Map();
172
+ const constraintsByTable = new Map();
173
+ const indexesByTable = new Map();
174
+ const checksByTable = new Map();
175
+ for (const col of columnsResult.rows) {
176
+ if (!columnsByTable.has(col.table_name)) {
177
+ columnsByTable.set(col.table_name, []);
178
+ }
179
+ columnsByTable.get(col.table_name).push({
180
+ name: col.column_name,
181
+ dataType: col.udt_name || col.data_type,
182
+ isNullable: col.is_nullable,
183
+ defaultValue: col.column_default,
184
+ isPrimaryKey: false,
185
+ isUnique: false,
186
+ maxLength: col.character_maximum_length,
187
+ precision: col.numeric_precision,
188
+ scale: col.numeric_scale,
189
+ references: null,
190
+ comment: col.column_comment,
191
+ isGenerated: col.is_generated || false,
192
+ generationExpression: col.generation_expression || null,
193
+ identityGeneration: col.identity_generation || null,
194
+ });
195
+ }
196
+ for (const con of constraintsResult.rows) {
197
+ if (!constraintsByTable.has(con.table_name)) {
198
+ constraintsByTable.set(con.table_name, new Map());
199
+ }
200
+ constraintsByTable.get(con.table_name).set(con.constraint_name, {
201
+ type: con.constraint_type,
202
+ columns: con.columns,
203
+ });
204
+ const columns = columnsByTable.get(con.table_name);
205
+ if (columns) {
206
+ for (const colName of con.columns) {
207
+ const col = columns.find(c => c.name === colName);
208
+ if (col) {
209
+ if (con.constraint_type === 'PRIMARY KEY')
210
+ col.isPrimaryKey = true;
211
+ if (con.constraint_type === 'UNIQUE')
212
+ col.isUnique = true;
213
+ if (con.constraint_type === 'FOREIGN KEY' && con.referenced_table) {
214
+ col.references = {
215
+ table: con.referenced_table,
216
+ column: con.referenced_columns?.[0] || 'id',
217
+ onDelete: con.on_delete || 'NO ACTION',
218
+ onUpdate: con.on_update || 'NO ACTION',
219
+ };
220
+ }
221
+ }
222
+ }
223
+ }
224
+ }
225
+ for (const idx of indexesResult.rows) {
226
+ if (!indexesByTable.has(idx.table_name)) {
227
+ indexesByTable.set(idx.table_name, []);
228
+ }
229
+ const opClassMatches = idx.index_definition?.match(/\b([a-z_]+_ops)\b/gi) ?? [];
230
+ const operatorClasses = Array.from(new Set(opClassMatches));
231
+ indexesByTable.get(idx.table_name).push({
232
+ name: idx.index_name,
233
+ columns: idx.columns || [],
234
+ isUnique: idx.is_unique,
235
+ isPrimary: idx.is_primary,
236
+ type: idx.index_type,
237
+ definition: idx.index_definition || undefined,
238
+ whereClause: idx.where_clause || null,
239
+ expression: idx.expression || null,
240
+ operatorClasses: operatorClasses.length > 0 ? operatorClasses : undefined,
241
+ });
242
+ }
243
+ for (const chk of checksResult.rows) {
244
+ if (!checksByTable.has(chk.table_name)) {
245
+ checksByTable.set(chk.table_name, []);
246
+ }
247
+ checksByTable.get(chk.table_name).push({
248
+ name: chk.constraint_name,
249
+ type: 'CHECK',
250
+ columns: [],
251
+ definition: chk.definition,
252
+ });
253
+ }
254
+ const tables = [];
255
+ for (const row of tablesResult.rows) {
256
+ const tableName = row.table_name;
257
+ if (tableName.startsWith('_relq'))
258
+ continue;
259
+ tables.push({
260
+ name: tableName,
261
+ schema: row.table_schema,
262
+ columns: columnsByTable.get(tableName) || [],
263
+ indexes: indexesByTable.get(tableName) || [],
264
+ constraints: checksByTable.get(tableName) || [],
265
+ rowCount: parseInt(row.row_count) || 0,
266
+ isPartitioned: row.is_partitioned || false,
267
+ partitionType: row.partition_type,
268
+ partitionKey: row.partition_key || [],
269
+ });
270
+ }
271
+ onProgress?.('fetching_partitions');
272
+ const partitionsResult = await pool.query(`
273
+ SELECT
274
+ child.relname as partition_name,
275
+ parent.relname as parent_table,
276
+ pg_get_expr(child.relpartbound, child.oid) as partition_bound
277
+ FROM pg_class child
278
+ JOIN pg_inherits inh ON child.oid = inh.inhrelid
279
+ JOIN pg_class parent ON inh.inhparent = parent.oid
280
+ JOIN pg_namespace n ON n.oid = child.relnamespace
281
+ WHERE n.nspname = 'public'
282
+ AND child.relispartition = true
283
+ ORDER BY parent.relname, child.relname;
284
+ `);
285
+ const partitions = partitionsResult.rows.map(row => ({
286
+ name: row.partition_name,
287
+ parentTable: row.parent_table,
288
+ partitionBound: row.partition_bound,
289
+ partitionType: 'LIST',
290
+ partitionKey: [],
291
+ }));
292
+ const partitionsByParent = new Map();
293
+ for (const partition of partitions) {
294
+ if (!partitionsByParent.has(partition.parentTable)) {
295
+ partitionsByParent.set(partition.parentTable, []);
296
+ }
297
+ partitionsByParent.get(partition.parentTable).push(partition);
298
+ }
299
+ for (const table of tables) {
300
+ if (table.isPartitioned) {
301
+ table.childPartitions = partitionsByParent.get(table.name) || [];
302
+ }
303
+ }
304
+ onProgress?.('fetching_extensions');
305
+ const extensionsResult = await pool.query(`
306
+ SELECT extname FROM pg_extension WHERE extname != 'plpgsql';
307
+ `);
308
+ const extensions = extensionsResult.rows.map(r => r.extname);
309
+ let functions = [];
310
+ if (includeFunctions) {
311
+ onProgress?.('fetching_functions');
312
+ const functionsResult = await pool.query(`
313
+ SELECT
314
+ p.proname as name,
315
+ n.nspname as schema,
316
+ pg_get_function_result(p.oid) as return_type,
317
+ pg_get_function_arguments(p.oid) as arg_types,
318
+ l.lanname as language,
319
+ pg_get_functiondef(p.oid) as definition,
320
+ p.prokind = 'a' as is_aggregate,
321
+ p.provolatile as volatility
322
+ FROM pg_proc p
323
+ JOIN pg_namespace n ON p.pronamespace = n.oid
324
+ JOIN pg_language l ON p.prolang = l.oid
325
+ WHERE n.nspname = 'public'
326
+ AND p.prokind IN ('f', 'a')
327
+ ORDER BY p.proname;
328
+ `);
329
+ functions = functionsResult.rows.map(f => ({
330
+ name: f.name,
331
+ schema: f.schema,
332
+ returnType: f.return_type,
333
+ argTypes: f.arg_types ? f.arg_types.split(', ') : [],
334
+ language: f.language,
335
+ definition: f.definition || '',
336
+ isAggregate: f.is_aggregate || false,
337
+ volatility: f.volatility === 'i' ? 'IMMUTABLE' : f.volatility === 's' ? 'STABLE' : 'VOLATILE',
338
+ }));
339
+ }
340
+ let triggers = [];
341
+ if (includeTriggers) {
342
+ onProgress?.('fetching_triggers');
343
+ const triggersResult = await pool.query(`
344
+ SELECT
345
+ t.tgname as name,
346
+ c.relname as table_name,
347
+ CASE
348
+ WHEN t.tgtype & 2 > 0 THEN 'BEFORE'
349
+ WHEN t.tgtype & 64 > 0 THEN 'INSTEAD OF'
350
+ ELSE 'AFTER'
351
+ END as timing,
352
+ CASE
353
+ WHEN t.tgtype & 4 > 0 THEN 'INSERT'
354
+ WHEN t.tgtype & 8 > 0 THEN 'DELETE'
355
+ WHEN t.tgtype & 16 > 0 THEN 'UPDATE'
356
+ ELSE 'UNKNOWN'
357
+ END as event,
358
+ p.proname as function_name,
359
+ pg_get_triggerdef(t.oid) as definition,
360
+ t.tgenabled != 'D' as is_enabled
361
+ FROM pg_trigger t
362
+ JOIN pg_class c ON t.tgrelid = c.oid
363
+ JOIN pg_namespace n ON c.relnamespace = n.oid
364
+ JOIN pg_proc p ON t.tgfoid = p.oid
365
+ WHERE n.nspname = 'public'
366
+ AND NOT t.tgisinternal
367
+ ORDER BY c.relname, t.tgname;
368
+ `);
369
+ triggers = triggersResult.rows.map(t => ({
370
+ name: t.name,
371
+ tableName: t.table_name,
372
+ timing: t.timing,
373
+ event: t.event,
374
+ functionName: t.function_name,
375
+ definition: t.definition || '',
376
+ isEnabled: t.is_enabled,
377
+ }));
378
+ }
379
+ onProgress?.('complete');
380
+ return {
381
+ tables,
382
+ enums,
383
+ domains: [],
384
+ compositeTypes: [],
385
+ sequences: [],
386
+ functions,
387
+ triggers,
388
+ policies: [],
389
+ partitions,
390
+ foreignServers: [],
391
+ foreignTables: [],
392
+ extensions,
393
+ };
394
+ }
395
+ finally {
396
+ await pool.end();
397
+ }
398
+ }