spindb 0.37.2 → 0.38.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 (811) hide show
  1. package/dist/cli/bin.js +9 -0
  2. package/dist/cli/bin.js.map +1 -0
  3. package/dist/cli/commands/attach.js +102 -0
  4. package/dist/cli/commands/attach.js.map +1 -0
  5. package/dist/cli/commands/backup.js +197 -0
  6. package/dist/cli/commands/backup.js.map +1 -0
  7. package/dist/cli/commands/backups.js +190 -0
  8. package/dist/cli/commands/backups.js.map +1 -0
  9. package/dist/cli/commands/clone.js +119 -0
  10. package/dist/cli/commands/clone.js.map +1 -0
  11. package/dist/cli/commands/config.js +276 -0
  12. package/dist/cli/commands/config.js.map +1 -0
  13. package/dist/cli/commands/connect.js +559 -0
  14. package/dist/cli/commands/connect.js.map +1 -0
  15. package/dist/cli/commands/create.js +952 -0
  16. package/dist/cli/commands/create.js.map +1 -0
  17. package/dist/cli/commands/databases.js +485 -0
  18. package/dist/cli/commands/databases.js.map +1 -0
  19. package/dist/cli/commands/delete.js +106 -0
  20. package/dist/cli/commands/delete.js.map +1 -0
  21. package/dist/cli/commands/deps.js +238 -0
  22. package/dist/cli/commands/deps.js.map +1 -0
  23. package/dist/cli/commands/detach.js +81 -0
  24. package/dist/cli/commands/detach.js.map +1 -0
  25. package/dist/cli/commands/doctor.js +567 -0
  26. package/dist/cli/commands/doctor.js.map +1 -0
  27. package/dist/cli/commands/duckdb.js +207 -0
  28. package/dist/cli/commands/duckdb.js.map +1 -0
  29. package/dist/cli/commands/edit.js +524 -0
  30. package/dist/cli/commands/edit.js.map +1 -0
  31. package/dist/cli/commands/engines.js +1414 -0
  32. package/dist/cli/commands/engines.js.map +1 -0
  33. package/dist/cli/commands/export.js +383 -0
  34. package/dist/cli/commands/export.js.map +1 -0
  35. package/dist/cli/commands/info.js +270 -0
  36. package/dist/cli/commands/info.js.map +1 -0
  37. package/dist/cli/commands/list.js +215 -0
  38. package/dist/cli/commands/list.js.map +1 -0
  39. package/dist/cli/commands/logs.js +81 -0
  40. package/dist/cli/commands/logs.js.map +1 -0
  41. package/dist/cli/commands/menu/backup-handlers.js +1202 -0
  42. package/dist/cli/commands/menu/backup-handlers.js.map +1 -0
  43. package/dist/cli/commands/menu/container-handlers.js +1788 -0
  44. package/dist/cli/commands/menu/container-handlers.js.map +1 -0
  45. package/dist/cli/commands/menu/engine-handlers.js +235 -0
  46. package/dist/cli/commands/menu/engine-handlers.js.map +1 -0
  47. package/dist/cli/commands/menu/index.js +266 -0
  48. package/dist/cli/commands/menu/index.js.map +1 -0
  49. package/dist/cli/commands/menu/settings-handlers.js +320 -0
  50. package/dist/cli/commands/menu/settings-handlers.js.map +1 -0
  51. package/dist/cli/commands/menu/shared.js +13 -0
  52. package/dist/cli/commands/menu/shared.js.map +1 -0
  53. package/dist/cli/commands/menu/shell-handlers.js +1573 -0
  54. package/dist/cli/commands/menu/shell-handlers.js.map +1 -0
  55. package/dist/cli/commands/menu/sql-handlers.js +185 -0
  56. package/dist/cli/commands/menu/sql-handlers.js.map +1 -0
  57. package/dist/cli/commands/menu/update-handlers.js +322 -0
  58. package/dist/cli/commands/menu/update-handlers.js.map +1 -0
  59. package/dist/cli/commands/menu/validators.js +9 -0
  60. package/dist/cli/commands/menu/validators.js.map +1 -0
  61. package/dist/cli/commands/ports.js +166 -0
  62. package/dist/cli/commands/ports.js.map +1 -0
  63. package/dist/cli/commands/pull.js +166 -0
  64. package/dist/cli/commands/pull.js.map +1 -0
  65. package/dist/cli/commands/query.js +180 -0
  66. package/dist/cli/commands/query.js.map +1 -0
  67. package/dist/cli/commands/restore.js +428 -0
  68. package/dist/cli/commands/restore.js.map +1 -0
  69. package/dist/cli/commands/run.js +115 -0
  70. package/dist/cli/commands/run.js.map +1 -0
  71. package/dist/cli/commands/self-update.js +99 -0
  72. package/dist/cli/commands/self-update.js.map +1 -0
  73. package/dist/cli/commands/sqlite.js +207 -0
  74. package/dist/cli/commands/sqlite.js.map +1 -0
  75. package/dist/cli/commands/start.js +196 -0
  76. package/dist/cli/commands/start.js.map +1 -0
  77. package/dist/cli/commands/stop.js +182 -0
  78. package/dist/cli/commands/stop.js.map +1 -0
  79. package/dist/cli/commands/url.js +88 -0
  80. package/dist/cli/commands/url.js.map +1 -0
  81. package/dist/cli/commands/users.js +189 -0
  82. package/dist/cli/commands/users.js.map +1 -0
  83. package/dist/cli/commands/version.js +52 -0
  84. package/dist/cli/commands/version.js.map +1 -0
  85. package/dist/cli/commands/which.js +258 -0
  86. package/dist/cli/commands/which.js.map +1 -0
  87. package/dist/cli/constants.js +212 -0
  88. package/dist/cli/constants.js.map +1 -0
  89. package/dist/cli/helpers.js +1120 -0
  90. package/dist/cli/helpers.js.map +1 -0
  91. package/dist/cli/index.js +146 -0
  92. package/dist/cli/index.js.map +1 -0
  93. package/dist/cli/ui/prompts.js +1002 -0
  94. package/dist/cli/ui/prompts.js.map +1 -0
  95. package/dist/cli/ui/spinner.js +74 -0
  96. package/dist/cli/ui/spinner.js.map +1 -0
  97. package/dist/cli/ui/theme.js +99 -0
  98. package/dist/cli/ui/theme.js.map +1 -0
  99. package/dist/cli/utils/file-follower.js +79 -0
  100. package/dist/cli/utils/file-follower.js.map +1 -0
  101. package/dist/config/backup-formats.js +363 -0
  102. package/dist/config/backup-formats.js.map +1 -0
  103. package/dist/config/defaults.js +25 -0
  104. package/dist/config/defaults.js.map +1 -0
  105. package/dist/config/engine-defaults.js +303 -0
  106. package/dist/config/engine-defaults.js.map +1 -0
  107. package/dist/config/engines-registry.js +103 -0
  108. package/dist/config/engines-registry.js.map +1 -0
  109. package/dist/config/os-dependencies.js +767 -0
  110. package/dist/config/os-dependencies.js.map +1 -0
  111. package/dist/config/paths.js +156 -0
  112. package/dist/config/paths.js.map +1 -0
  113. package/dist/config/version.js +3 -0
  114. package/dist/config/version.js.map +1 -0
  115. package/dist/core/backup-restore.js +219 -0
  116. package/dist/core/backup-restore.js.map +1 -0
  117. package/dist/core/base-binary-manager.js +403 -0
  118. package/dist/core/base-binary-manager.js.map +1 -0
  119. package/dist/core/base-document-binary-manager.js +364 -0
  120. package/dist/core/base-document-binary-manager.js.map +1 -0
  121. package/dist/core/base-embedded-binary-manager.js +364 -0
  122. package/dist/core/base-embedded-binary-manager.js.map +1 -0
  123. package/dist/core/base-server-binary-manager.js +368 -0
  124. package/dist/core/base-server-binary-manager.js.map +1 -0
  125. package/dist/core/config-manager.js +495 -0
  126. package/dist/core/config-manager.js.map +1 -0
  127. package/dist/core/container-manager.js +609 -0
  128. package/dist/core/container-manager.js.map +1 -0
  129. package/dist/core/credential-generator.js +67 -0
  130. package/dist/core/credential-generator.js.map +1 -0
  131. package/dist/core/credential-manager.js +211 -0
  132. package/dist/core/credential-manager.js.map +1 -0
  133. package/dist/core/dblab-utils.js +105 -0
  134. package/dist/core/dblab-utils.js.map +1 -0
  135. package/dist/core/dependency-manager.js +359 -0
  136. package/dist/core/dependency-manager.js.map +1 -0
  137. package/dist/core/docker-exporter.js +1077 -0
  138. package/dist/core/docker-exporter.js.map +1 -0
  139. package/dist/core/error-handler.js +295 -0
  140. package/dist/core/error-handler.js.map +1 -0
  141. package/dist/core/fs-error-utils.js +74 -0
  142. package/dist/core/fs-error-utils.js.map +1 -0
  143. package/dist/core/homebrew-version-manager.js +280 -0
  144. package/dist/core/homebrew-version-manager.js.map +1 -0
  145. package/dist/core/hostdb-client.js +252 -0
  146. package/dist/core/hostdb-client.js.map +1 -0
  147. package/dist/core/hostdb-metadata.js +243 -0
  148. package/dist/core/hostdb-metadata.js.map +1 -0
  149. package/dist/core/hostdb-releases-factory.js +161 -0
  150. package/dist/core/hostdb-releases-factory.js.map +1 -0
  151. package/dist/core/library-env.js +88 -0
  152. package/dist/core/library-env.js.map +1 -0
  153. package/dist/core/pgweb-utils.js +53 -0
  154. package/dist/core/pgweb-utils.js.map +1 -0
  155. package/dist/core/platform-service.js +632 -0
  156. package/dist/core/platform-service.js.map +1 -0
  157. package/dist/core/port-manager.js +136 -0
  158. package/dist/core/port-manager.js.map +1 -0
  159. package/dist/core/process-manager.js +445 -0
  160. package/dist/core/process-manager.js.map +1 -0
  161. package/dist/core/pull-manager.js +418 -0
  162. package/dist/core/pull-manager.js.map +1 -0
  163. package/dist/core/query-parser.js +449 -0
  164. package/dist/core/query-parser.js.map +1 -0
  165. package/dist/core/spawn-utils.js +90 -0
  166. package/dist/core/spawn-utils.js.map +1 -0
  167. package/dist/core/start-with-retry.js +90 -0
  168. package/dist/core/start-with-retry.js.map +1 -0
  169. package/dist/core/test-cleanup.js +85 -0
  170. package/dist/core/test-cleanup.js.map +1 -0
  171. package/dist/core/tls-generator.js +84 -0
  172. package/dist/core/tls-generator.js.map +1 -0
  173. package/dist/core/transaction-manager.js +139 -0
  174. package/dist/core/transaction-manager.js.map +1 -0
  175. package/dist/core/update-manager.js +241 -0
  176. package/dist/core/update-manager.js.map +1 -0
  177. package/dist/core/version-migration.js +260 -0
  178. package/dist/core/version-migration.js.map +1 -0
  179. package/dist/core/version-utils.js +91 -0
  180. package/dist/core/version-utils.js.map +1 -0
  181. package/dist/engines/base-engine.js +179 -0
  182. package/dist/engines/base-engine.js.map +1 -0
  183. package/dist/engines/clickhouse/backup.js +289 -0
  184. package/dist/engines/clickhouse/backup.js.map +1 -0
  185. package/dist/engines/clickhouse/binary-manager.js +145 -0
  186. package/dist/engines/clickhouse/binary-manager.js.map +1 -0
  187. package/dist/engines/clickhouse/binary-urls.js +100 -0
  188. package/dist/engines/clickhouse/binary-urls.js.map +1 -0
  189. package/dist/engines/clickhouse/cli-utils.js +143 -0
  190. package/dist/engines/clickhouse/cli-utils.js.map +1 -0
  191. package/dist/engines/clickhouse/hostdb-releases.js +24 -0
  192. package/dist/engines/clickhouse/hostdb-releases.js.map +1 -0
  193. package/dist/engines/clickhouse/index.js +1077 -0
  194. package/dist/engines/clickhouse/index.js.map +1 -0
  195. package/dist/engines/clickhouse/restore.js +335 -0
  196. package/dist/engines/clickhouse/restore.js.map +1 -0
  197. package/dist/engines/clickhouse/version-maps.js +83 -0
  198. package/dist/engines/clickhouse/version-maps.js.map +1 -0
  199. package/dist/engines/clickhouse/version-validator.js +133 -0
  200. package/dist/engines/clickhouse/version-validator.js.map +1 -0
  201. package/dist/engines/cockroachdb/backup.js +261 -0
  202. package/dist/engines/cockroachdb/backup.js.map +1 -0
  203. package/dist/engines/cockroachdb/binary-manager.js +33 -0
  204. package/dist/engines/cockroachdb/binary-manager.js.map +1 -0
  205. package/dist/engines/cockroachdb/binary-urls.js +33 -0
  206. package/dist/engines/cockroachdb/binary-urls.js.map +1 -0
  207. package/dist/engines/cockroachdb/cli-utils.js +338 -0
  208. package/dist/engines/cockroachdb/cli-utils.js.map +1 -0
  209. package/dist/engines/cockroachdb/hostdb-releases.js +21 -0
  210. package/dist/engines/cockroachdb/hostdb-releases.js.map +1 -0
  211. package/dist/engines/cockroachdb/index.js +1016 -0
  212. package/dist/engines/cockroachdb/index.js.map +1 -0
  213. package/dist/engines/cockroachdb/restore.js +323 -0
  214. package/dist/engines/cockroachdb/restore.js.map +1 -0
  215. package/dist/engines/cockroachdb/version-maps.js +37 -0
  216. package/dist/engines/cockroachdb/version-maps.js.map +1 -0
  217. package/dist/engines/couchdb/api-client.js +64 -0
  218. package/dist/engines/couchdb/api-client.js.map +1 -0
  219. package/dist/engines/couchdb/backup.js +90 -0
  220. package/dist/engines/couchdb/backup.js.map +1 -0
  221. package/dist/engines/couchdb/binary-manager.js +62 -0
  222. package/dist/engines/couchdb/binary-manager.js.map +1 -0
  223. package/dist/engines/couchdb/binary-urls.js +92 -0
  224. package/dist/engines/couchdb/binary-urls.js.map +1 -0
  225. package/dist/engines/couchdb/hostdb-releases.js +21 -0
  226. package/dist/engines/couchdb/hostdb-releases.js.map +1 -0
  227. package/dist/engines/couchdb/index.js +1043 -0
  228. package/dist/engines/couchdb/index.js.map +1 -0
  229. package/dist/engines/couchdb/restore.js +198 -0
  230. package/dist/engines/couchdb/restore.js.map +1 -0
  231. package/dist/engines/couchdb/version-maps.js +67 -0
  232. package/dist/engines/couchdb/version-maps.js.map +1 -0
  233. package/dist/engines/couchdb/version-validator.js +88 -0
  234. package/dist/engines/couchdb/version-validator.js.map +1 -0
  235. package/dist/engines/duckdb/binary-manager.js +33 -0
  236. package/dist/engines/duckdb/binary-manager.js.map +1 -0
  237. package/{engines/duckdb/binary-urls.ts → dist/engines/duckdb/binary-urls.js} +11 -16
  238. package/dist/engines/duckdb/binary-urls.js.map +1 -0
  239. package/dist/engines/duckdb/hostdb-releases.js +21 -0
  240. package/dist/engines/duckdb/hostdb-releases.js.map +1 -0
  241. package/dist/engines/duckdb/index.js +594 -0
  242. package/dist/engines/duckdb/index.js.map +1 -0
  243. package/dist/engines/duckdb/registry.js +265 -0
  244. package/dist/engines/duckdb/registry.js.map +1 -0
  245. package/dist/engines/duckdb/scanner.js +12 -0
  246. package/dist/engines/duckdb/scanner.js.map +1 -0
  247. package/dist/engines/duckdb/version-maps.js +67 -0
  248. package/dist/engines/duckdb/version-maps.js.map +1 -0
  249. package/dist/engines/duckdb/version-validator.js +62 -0
  250. package/dist/engines/duckdb/version-validator.js.map +1 -0
  251. package/dist/engines/ferretdb/backup.js +170 -0
  252. package/dist/engines/ferretdb/backup.js.map +1 -0
  253. package/dist/engines/ferretdb/binary-manager.js +765 -0
  254. package/dist/engines/ferretdb/binary-manager.js.map +1 -0
  255. package/dist/engines/ferretdb/binary-urls.js +135 -0
  256. package/dist/engines/ferretdb/binary-urls.js.map +1 -0
  257. package/dist/engines/ferretdb/index.js +1517 -0
  258. package/dist/engines/ferretdb/index.js.map +1 -0
  259. package/dist/engines/ferretdb/restore.js +310 -0
  260. package/dist/engines/ferretdb/restore.js.map +1 -0
  261. package/{engines/ferretdb/version-maps.ts → dist/engines/ferretdb/version-maps.js} +62 -79
  262. package/dist/engines/ferretdb/version-maps.js.map +1 -0
  263. package/dist/engines/file-based-utils.js +184 -0
  264. package/dist/engines/file-based-utils.js.map +1 -0
  265. package/dist/engines/index.js +124 -0
  266. package/dist/engines/index.js.map +1 -0
  267. package/dist/engines/influxdb/api-client.js +54 -0
  268. package/dist/engines/influxdb/api-client.js.map +1 -0
  269. package/dist/engines/influxdb/backup.js +119 -0
  270. package/dist/engines/influxdb/backup.js.map +1 -0
  271. package/dist/engines/influxdb/binary-manager.js +87 -0
  272. package/dist/engines/influxdb/binary-manager.js.map +1 -0
  273. package/dist/engines/influxdb/binary-urls.js +56 -0
  274. package/dist/engines/influxdb/binary-urls.js.map +1 -0
  275. package/dist/engines/influxdb/hostdb-releases.js +21 -0
  276. package/dist/engines/influxdb/hostdb-releases.js.map +1 -0
  277. package/dist/engines/influxdb/index.js +962 -0
  278. package/dist/engines/influxdb/index.js.map +1 -0
  279. package/dist/engines/influxdb/restore.js +329 -0
  280. package/dist/engines/influxdb/restore.js.map +1 -0
  281. package/dist/engines/influxdb/version-maps.js +64 -0
  282. package/dist/engines/influxdb/version-maps.js.map +1 -0
  283. package/dist/engines/influxdb/version-validator.js +109 -0
  284. package/dist/engines/influxdb/version-validator.js.map +1 -0
  285. package/dist/engines/mariadb/backup.js +178 -0
  286. package/dist/engines/mariadb/backup.js.map +1 -0
  287. package/dist/engines/mariadb/binary-manager.js +33 -0
  288. package/dist/engines/mariadb/binary-manager.js.map +1 -0
  289. package/{engines/mariadb/binary-urls.ts → dist/engines/mariadb/binary-urls.js} +38 -55
  290. package/dist/engines/mariadb/binary-urls.js.map +1 -0
  291. package/dist/engines/mariadb/hostdb-releases.js +21 -0
  292. package/dist/engines/mariadb/hostdb-releases.js.map +1 -0
  293. package/dist/engines/mariadb/index.js +1011 -0
  294. package/dist/engines/mariadb/index.js.map +1 -0
  295. package/dist/engines/mariadb/restore.js +322 -0
  296. package/dist/engines/mariadb/restore.js.map +1 -0
  297. package/dist/engines/mariadb/version-maps.js +63 -0
  298. package/dist/engines/mariadb/version-maps.js.map +1 -0
  299. package/dist/engines/mariadb/version-validator.js +143 -0
  300. package/dist/engines/mariadb/version-validator.js.map +1 -0
  301. package/dist/engines/meilisearch/api-client.js +50 -0
  302. package/dist/engines/meilisearch/api-client.js.map +1 -0
  303. package/dist/engines/meilisearch/backup.js +167 -0
  304. package/dist/engines/meilisearch/backup.js.map +1 -0
  305. package/dist/engines/meilisearch/binary-manager.js +31 -0
  306. package/dist/engines/meilisearch/binary-manager.js.map +1 -0
  307. package/dist/engines/meilisearch/binary-urls.js +56 -0
  308. package/dist/engines/meilisearch/binary-urls.js.map +1 -0
  309. package/dist/engines/meilisearch/hostdb-releases.js +21 -0
  310. package/dist/engines/meilisearch/hostdb-releases.js.map +1 -0
  311. package/dist/engines/meilisearch/index.js +992 -0
  312. package/dist/engines/meilisearch/index.js.map +1 -0
  313. package/dist/engines/meilisearch/restore.js +167 -0
  314. package/dist/engines/meilisearch/restore.js.map +1 -0
  315. package/dist/engines/meilisearch/version-maps.js +67 -0
  316. package/dist/engines/meilisearch/version-maps.js.map +1 -0
  317. package/dist/engines/meilisearch/version-validator.js +109 -0
  318. package/dist/engines/meilisearch/version-validator.js.map +1 -0
  319. package/dist/engines/mongodb/backup.js +109 -0
  320. package/dist/engines/mongodb/backup.js.map +1 -0
  321. package/dist/engines/mongodb/binary-manager.js +36 -0
  322. package/dist/engines/mongodb/binary-manager.js.map +1 -0
  323. package/dist/engines/mongodb/binary-urls.js +46 -0
  324. package/dist/engines/mongodb/binary-urls.js.map +1 -0
  325. package/dist/engines/mongodb/cli-utils.js +131 -0
  326. package/dist/engines/mongodb/cli-utils.js.map +1 -0
  327. package/dist/engines/mongodb/hostdb-releases.js +77 -0
  328. package/dist/engines/mongodb/hostdb-releases.js.map +1 -0
  329. package/dist/engines/mongodb/index.js +873 -0
  330. package/dist/engines/mongodb/index.js.map +1 -0
  331. package/dist/engines/mongodb/restore.js +276 -0
  332. package/dist/engines/mongodb/restore.js.map +1 -0
  333. package/dist/engines/mongodb/version-maps.js +79 -0
  334. package/dist/engines/mongodb/version-maps.js.map +1 -0
  335. package/dist/engines/mongodb/version-validator.js +133 -0
  336. package/dist/engines/mongodb/version-validator.js.map +1 -0
  337. package/dist/engines/mysql/backup.js +210 -0
  338. package/dist/engines/mysql/backup.js.map +1 -0
  339. package/dist/engines/mysql/binary-detection.js +325 -0
  340. package/dist/engines/mysql/binary-detection.js.map +1 -0
  341. package/dist/engines/mysql/binary-manager.js +30 -0
  342. package/dist/engines/mysql/binary-manager.js.map +1 -0
  343. package/dist/engines/mysql/binary-urls.js +87 -0
  344. package/dist/engines/mysql/binary-urls.js.map +1 -0
  345. package/{engines/mysql/hostdb-releases.ts → dist/engines/mysql/hostdb-releases.js} +20 -23
  346. package/dist/engines/mysql/hostdb-releases.js.map +1 -0
  347. package/dist/engines/mysql/index.js +1066 -0
  348. package/dist/engines/mysql/index.js.map +1 -0
  349. package/dist/engines/mysql/restore.js +361 -0
  350. package/dist/engines/mysql/restore.js.map +1 -0
  351. package/dist/engines/mysql/version-maps.js +79 -0
  352. package/dist/engines/mysql/version-maps.js.map +1 -0
  353. package/dist/engines/mysql/version-validator.js +266 -0
  354. package/dist/engines/mysql/version-validator.js.map +1 -0
  355. package/dist/engines/postgresql/backup.js +118 -0
  356. package/dist/engines/postgresql/backup.js.map +1 -0
  357. package/dist/engines/postgresql/binary-manager.js +85 -0
  358. package/dist/engines/postgresql/binary-manager.js.map +1 -0
  359. package/dist/engines/postgresql/binary-urls.js +80 -0
  360. package/dist/engines/postgresql/binary-urls.js.map +1 -0
  361. package/dist/engines/postgresql/hostdb-releases.js +21 -0
  362. package/dist/engines/postgresql/hostdb-releases.js.map +1 -0
  363. package/dist/engines/postgresql/index.js +852 -0
  364. package/dist/engines/postgresql/index.js.map +1 -0
  365. package/dist/engines/postgresql/remote-version.js +109 -0
  366. package/dist/engines/postgresql/remote-version.js.map +1 -0
  367. package/dist/engines/postgresql/restore.js +254 -0
  368. package/dist/engines/postgresql/restore.js.map +1 -0
  369. package/dist/engines/postgresql/version-maps.js +73 -0
  370. package/dist/engines/postgresql/version-maps.js.map +1 -0
  371. package/dist/engines/postgresql/version-validator.js +286 -0
  372. package/dist/engines/postgresql/version-validator.js.map +1 -0
  373. package/dist/engines/qdrant/api-client.js +50 -0
  374. package/dist/engines/qdrant/api-client.js.map +1 -0
  375. package/dist/engines/qdrant/backup.js +115 -0
  376. package/dist/engines/qdrant/backup.js.map +1 -0
  377. package/dist/engines/qdrant/binary-manager.js +31 -0
  378. package/dist/engines/qdrant/binary-manager.js.map +1 -0
  379. package/dist/engines/qdrant/binary-urls.js +92 -0
  380. package/dist/engines/qdrant/binary-urls.js.map +1 -0
  381. package/dist/engines/qdrant/cli-utils.js +39 -0
  382. package/dist/engines/qdrant/cli-utils.js.map +1 -0
  383. package/dist/engines/qdrant/hostdb-releases.js +21 -0
  384. package/dist/engines/qdrant/hostdb-releases.js.map +1 -0
  385. package/dist/engines/qdrant/index.js +1002 -0
  386. package/dist/engines/qdrant/index.js.map +1 -0
  387. package/dist/engines/qdrant/restore.js +154 -0
  388. package/dist/engines/qdrant/restore.js.map +1 -0
  389. package/dist/engines/qdrant/version-maps.js +67 -0
  390. package/dist/engines/qdrant/version-maps.js.map +1 -0
  391. package/dist/engines/qdrant/version-validator.js +109 -0
  392. package/dist/engines/qdrant/version-validator.js.map +1 -0
  393. package/dist/engines/questdb/backup.js +191 -0
  394. package/dist/engines/questdb/backup.js.map +1 -0
  395. package/dist/engines/questdb/binary-manager.js +247 -0
  396. package/dist/engines/questdb/binary-manager.js.map +1 -0
  397. package/dist/engines/questdb/binary-urls.js +27 -0
  398. package/dist/engines/questdb/binary-urls.js.map +1 -0
  399. package/dist/engines/questdb/hostdb-releases.js +21 -0
  400. package/dist/engines/questdb/hostdb-releases.js.map +1 -0
  401. package/dist/engines/questdb/index.js +814 -0
  402. package/dist/engines/questdb/index.js.map +1 -0
  403. package/dist/engines/questdb/restore.js +202 -0
  404. package/dist/engines/questdb/restore.js.map +1 -0
  405. package/dist/engines/questdb/version-maps.js +33 -0
  406. package/dist/engines/questdb/version-maps.js.map +1 -0
  407. package/dist/engines/questdb/version-validator.js +99 -0
  408. package/dist/engines/questdb/version-validator.js.map +1 -0
  409. package/dist/engines/redis/backup.js +292 -0
  410. package/dist/engines/redis/backup.js.map +1 -0
  411. package/dist/engines/redis/binary-manager.js +32 -0
  412. package/dist/engines/redis/binary-manager.js.map +1 -0
  413. package/dist/engines/redis/binary-urls.js +96 -0
  414. package/dist/engines/redis/binary-urls.js.map +1 -0
  415. package/dist/engines/redis/cli-utils.js +38 -0
  416. package/dist/engines/redis/cli-utils.js.map +1 -0
  417. package/dist/engines/redis/hostdb-releases.js +21 -0
  418. package/dist/engines/redis/hostdb-releases.js.map +1 -0
  419. package/dist/engines/redis/index.js +1263 -0
  420. package/dist/engines/redis/index.js.map +1 -0
  421. package/dist/engines/redis/restore.js +338 -0
  422. package/dist/engines/redis/restore.js.map +1 -0
  423. package/dist/engines/redis/version-maps.js +70 -0
  424. package/dist/engines/redis/version-maps.js.map +1 -0
  425. package/dist/engines/redis/version-validator.js +109 -0
  426. package/dist/engines/redis/version-validator.js.map +1 -0
  427. package/dist/engines/sqlite/binary-manager.js +39 -0
  428. package/dist/engines/sqlite/binary-manager.js.map +1 -0
  429. package/{engines/sqlite/binary-urls.ts → dist/engines/sqlite/binary-urls.js} +11 -16
  430. package/dist/engines/sqlite/binary-urls.js.map +1 -0
  431. package/dist/engines/sqlite/hostdb-releases.js +21 -0
  432. package/dist/engines/sqlite/hostdb-releases.js.map +1 -0
  433. package/dist/engines/sqlite/index.js +493 -0
  434. package/dist/engines/sqlite/index.js.map +1 -0
  435. package/dist/engines/sqlite/registry.js +163 -0
  436. package/dist/engines/sqlite/registry.js.map +1 -0
  437. package/dist/engines/sqlite/scanner.js +12 -0
  438. package/dist/engines/sqlite/scanner.js.map +1 -0
  439. package/dist/engines/sqlite/version-maps.js +57 -0
  440. package/dist/engines/sqlite/version-maps.js.map +1 -0
  441. package/dist/engines/surrealdb/backup.js +97 -0
  442. package/dist/engines/surrealdb/backup.js.map +1 -0
  443. package/dist/engines/surrealdb/binary-manager.js +33 -0
  444. package/dist/engines/surrealdb/binary-manager.js.map +1 -0
  445. package/dist/engines/surrealdb/binary-urls.js +33 -0
  446. package/dist/engines/surrealdb/binary-urls.js.map +1 -0
  447. package/dist/engines/surrealdb/cli-utils.js +147 -0
  448. package/dist/engines/surrealdb/cli-utils.js.map +1 -0
  449. package/dist/engines/surrealdb/hostdb-releases.js +21 -0
  450. package/dist/engines/surrealdb/hostdb-releases.js.map +1 -0
  451. package/dist/engines/surrealdb/index.js +1022 -0
  452. package/dist/engines/surrealdb/index.js.map +1 -0
  453. package/dist/engines/surrealdb/restore.js +224 -0
  454. package/dist/engines/surrealdb/restore.js.map +1 -0
  455. package/dist/engines/surrealdb/version-maps.js +36 -0
  456. package/dist/engines/surrealdb/version-maps.js.map +1 -0
  457. package/dist/engines/tigerbeetle/backup.js +36 -0
  458. package/dist/engines/tigerbeetle/backup.js.map +1 -0
  459. package/dist/engines/tigerbeetle/binary-manager.js +72 -0
  460. package/dist/engines/tigerbeetle/binary-manager.js.map +1 -0
  461. package/dist/engines/tigerbeetle/binary-urls.js +49 -0
  462. package/dist/engines/tigerbeetle/binary-urls.js.map +1 -0
  463. package/dist/engines/tigerbeetle/hostdb-releases.js +21 -0
  464. package/dist/engines/tigerbeetle/hostdb-releases.js.map +1 -0
  465. package/dist/engines/tigerbeetle/index.js +559 -0
  466. package/dist/engines/tigerbeetle/index.js.map +1 -0
  467. package/dist/engines/tigerbeetle/restore.js +91 -0
  468. package/dist/engines/tigerbeetle/restore.js.map +1 -0
  469. package/{engines/tigerbeetle/version-maps.ts → dist/engines/tigerbeetle/version-maps.js} +22 -31
  470. package/dist/engines/tigerbeetle/version-maps.js.map +1 -0
  471. package/dist/engines/tigerbeetle/version-validator.js +108 -0
  472. package/dist/engines/tigerbeetle/version-validator.js.map +1 -0
  473. package/dist/engines/typedb/backup.js +129 -0
  474. package/dist/engines/typedb/backup.js.map +1 -0
  475. package/dist/engines/typedb/binary-manager.js +151 -0
  476. package/dist/engines/typedb/binary-manager.js.map +1 -0
  477. package/dist/engines/typedb/binary-urls.js +33 -0
  478. package/dist/engines/typedb/binary-urls.js.map +1 -0
  479. package/dist/engines/typedb/cli-utils.js +163 -0
  480. package/dist/engines/typedb/cli-utils.js.map +1 -0
  481. package/dist/engines/typedb/hostdb-releases.js +21 -0
  482. package/dist/engines/typedb/hostdb-releases.js.map +1 -0
  483. package/dist/engines/typedb/index.js +1003 -0
  484. package/dist/engines/typedb/index.js.map +1 -0
  485. package/dist/engines/typedb/restore.js +279 -0
  486. package/dist/engines/typedb/restore.js.map +1 -0
  487. package/dist/engines/typedb/version-maps.js +40 -0
  488. package/dist/engines/typedb/version-maps.js.map +1 -0
  489. package/dist/engines/typedb/version-validator.js +103 -0
  490. package/dist/engines/typedb/version-validator.js.map +1 -0
  491. package/dist/engines/valkey/backup.js +292 -0
  492. package/dist/engines/valkey/backup.js.map +1 -0
  493. package/dist/engines/valkey/binary-manager.js +33 -0
  494. package/dist/engines/valkey/binary-manager.js.map +1 -0
  495. package/dist/engines/valkey/binary-urls.js +98 -0
  496. package/dist/engines/valkey/binary-urls.js.map +1 -0
  497. package/dist/engines/valkey/cli-utils.js +38 -0
  498. package/dist/engines/valkey/cli-utils.js.map +1 -0
  499. package/dist/engines/valkey/hostdb-releases.js +21 -0
  500. package/dist/engines/valkey/hostdb-releases.js.map +1 -0
  501. package/dist/engines/valkey/index.js +1257 -0
  502. package/dist/engines/valkey/index.js.map +1 -0
  503. package/dist/engines/valkey/restore.js +340 -0
  504. package/dist/engines/valkey/restore.js.map +1 -0
  505. package/dist/engines/valkey/version-maps.js +70 -0
  506. package/dist/engines/valkey/version-maps.js.map +1 -0
  507. package/dist/engines/valkey/version-validator.js +112 -0
  508. package/dist/engines/valkey/version-validator.js.map +1 -0
  509. package/dist/engines/weaviate/api-client.js +50 -0
  510. package/dist/engines/weaviate/api-client.js.map +1 -0
  511. package/dist/engines/weaviate/backup.js +95 -0
  512. package/dist/engines/weaviate/backup.js.map +1 -0
  513. package/dist/engines/weaviate/binary-manager.js +58 -0
  514. package/dist/engines/weaviate/binary-manager.js.map +1 -0
  515. package/dist/engines/weaviate/binary-urls.js +92 -0
  516. package/dist/engines/weaviate/binary-urls.js.map +1 -0
  517. package/dist/engines/weaviate/cli-utils.js +39 -0
  518. package/dist/engines/weaviate/cli-utils.js.map +1 -0
  519. package/dist/engines/weaviate/hostdb-releases.js +21 -0
  520. package/dist/engines/weaviate/hostdb-releases.js.map +1 -0
  521. package/dist/engines/weaviate/index.js +871 -0
  522. package/dist/engines/weaviate/index.js.map +1 -0
  523. package/dist/engines/weaviate/restore.js +185 -0
  524. package/dist/engines/weaviate/restore.js.map +1 -0
  525. package/dist/engines/weaviate/version-maps.js +67 -0
  526. package/dist/engines/weaviate/version-maps.js.map +1 -0
  527. package/dist/engines/weaviate/version-validator.js +109 -0
  528. package/dist/engines/weaviate/version-validator.js.map +1 -0
  529. package/dist/types/index.js +102 -0
  530. package/dist/types/index.js.map +1 -0
  531. package/package.json +12 -9
  532. package/bin/cli.js +0 -68
  533. package/cli/bin.ts +0 -10
  534. package/cli/commands/attach.ts +0 -139
  535. package/cli/commands/backup.ts +0 -290
  536. package/cli/commands/backups.ts +0 -247
  537. package/cli/commands/clone.ts +0 -159
  538. package/cli/commands/config.ts +0 -367
  539. package/cli/commands/connect.ts +0 -684
  540. package/cli/commands/create.ts +0 -1201
  541. package/cli/commands/databases.ts +0 -630
  542. package/cli/commands/delete.ts +0 -133
  543. package/cli/commands/deps.ts +0 -342
  544. package/cli/commands/detach.ts +0 -107
  545. package/cli/commands/doctor.ts +0 -689
  546. package/cli/commands/duckdb.ts +0 -273
  547. package/cli/commands/edit.ts +0 -683
  548. package/cli/commands/engines.ts +0 -1914
  549. package/cli/commands/export.ts +0 -544
  550. package/cli/commands/info.ts +0 -340
  551. package/cli/commands/list.ts +0 -284
  552. package/cli/commands/logs.ts +0 -102
  553. package/cli/commands/menu/backup-handlers.ts +0 -1571
  554. package/cli/commands/menu/container-handlers.ts +0 -2288
  555. package/cli/commands/menu/engine-handlers.ts +0 -355
  556. package/cli/commands/menu/index.ts +0 -342
  557. package/cli/commands/menu/settings-handlers.ts +0 -365
  558. package/cli/commands/menu/shared.ts +0 -23
  559. package/cli/commands/menu/shell-handlers.ts +0 -1811
  560. package/cli/commands/menu/sql-handlers.ts +0 -231
  561. package/cli/commands/menu/update-handlers.ts +0 -378
  562. package/cli/commands/menu/validators.ts +0 -8
  563. package/cli/commands/ports.ts +0 -211
  564. package/cli/commands/pull.ts +0 -223
  565. package/cli/commands/query.ts +0 -241
  566. package/cli/commands/restore.ts +0 -587
  567. package/cli/commands/run.ts +0 -178
  568. package/cli/commands/self-update.ts +0 -121
  569. package/cli/commands/sqlite.ts +0 -273
  570. package/cli/commands/start.ts +0 -218
  571. package/cli/commands/stop.ts +0 -241
  572. package/cli/commands/url.ts +0 -104
  573. package/cli/commands/users.ts +0 -264
  574. package/cli/commands/version.ts +0 -55
  575. package/cli/commands/which.ts +0 -290
  576. package/cli/constants.ts +0 -233
  577. package/cli/helpers.ts +0 -1593
  578. package/cli/index.ts +0 -162
  579. package/cli/ui/prompts.ts +0 -1525
  580. package/cli/ui/spinner.ts +0 -88
  581. package/cli/ui/theme.ts +0 -128
  582. package/cli/utils/file-follower.ts +0 -93
  583. package/config/backup-formats.ts +0 -446
  584. package/config/defaults.ts +0 -56
  585. package/config/engine-defaults.ts +0 -336
  586. package/config/engines-registry.ts +0 -150
  587. package/config/engines.schema.json +0 -135
  588. package/config/os-dependencies.ts +0 -888
  589. package/config/paths.ts +0 -200
  590. package/core/backup-restore.ts +0 -330
  591. package/core/base-binary-manager.ts +0 -562
  592. package/core/base-document-binary-manager.ts +0 -523
  593. package/core/base-embedded-binary-manager.ts +0 -547
  594. package/core/base-server-binary-manager.ts +0 -523
  595. package/core/config-manager.ts +0 -652
  596. package/core/container-manager.ts +0 -787
  597. package/core/credential-generator.ts +0 -93
  598. package/core/credential-manager.ts +0 -259
  599. package/core/dblab-utils.ts +0 -113
  600. package/core/dependency-manager.ts +0 -512
  601. package/core/docker-exporter.ts +0 -1345
  602. package/core/error-handler.ts +0 -419
  603. package/core/fs-error-utils.ts +0 -82
  604. package/core/homebrew-version-manager.ts +0 -352
  605. package/core/hostdb-client.ts +0 -344
  606. package/core/hostdb-metadata.ts +0 -350
  607. package/core/hostdb-releases-factory.ts +0 -237
  608. package/core/library-env.ts +0 -118
  609. package/core/pgweb-utils.ts +0 -62
  610. package/core/platform-service.ts +0 -829
  611. package/core/port-manager.ts +0 -165
  612. package/core/process-manager.ts +0 -576
  613. package/core/pull-manager.ts +0 -511
  614. package/core/query-parser.ts +0 -514
  615. package/core/spawn-utils.ts +0 -122
  616. package/core/start-with-retry.ts +0 -130
  617. package/core/test-cleanup.ts +0 -108
  618. package/core/tls-generator.ts +0 -116
  619. package/core/transaction-manager.ts +0 -158
  620. package/core/update-manager.ts +0 -308
  621. package/core/version-migration.ts +0 -346
  622. package/core/version-utils.ts +0 -104
  623. package/engines/base-engine.ts +0 -340
  624. package/engines/clickhouse/README.md +0 -231
  625. package/engines/clickhouse/backup.ts +0 -398
  626. package/engines/clickhouse/binary-manager.ts +0 -201
  627. package/engines/clickhouse/binary-urls.ts +0 -125
  628. package/engines/clickhouse/cli-utils.ts +0 -176
  629. package/engines/clickhouse/hostdb-releases.ts +0 -30
  630. package/engines/clickhouse/index.ts +0 -1345
  631. package/engines/clickhouse/restore.ts +0 -466
  632. package/engines/clickhouse/version-maps.ts +0 -95
  633. package/engines/clickhouse/version-validator.ts +0 -154
  634. package/engines/cockroachdb/README.md +0 -170
  635. package/engines/cockroachdb/backup.ts +0 -376
  636. package/engines/cockroachdb/binary-manager.ts +0 -45
  637. package/engines/cockroachdb/binary-urls.ts +0 -40
  638. package/engines/cockroachdb/cli-utils.ts +0 -384
  639. package/engines/cockroachdb/hostdb-releases.ts +0 -26
  640. package/engines/cockroachdb/index.ts +0 -1276
  641. package/engines/cockroachdb/restore.ts +0 -455
  642. package/engines/cockroachdb/version-maps.ts +0 -42
  643. package/engines/couchdb/README.md +0 -257
  644. package/engines/couchdb/api-client.ts +0 -81
  645. package/engines/couchdb/backup.ts +0 -137
  646. package/engines/couchdb/binary-manager.ts +0 -86
  647. package/engines/couchdb/binary-urls.ts +0 -115
  648. package/engines/couchdb/hostdb-releases.ts +0 -23
  649. package/engines/couchdb/index.ts +0 -1429
  650. package/engines/couchdb/restore.ts +0 -290
  651. package/engines/couchdb/version-maps.ts +0 -78
  652. package/engines/couchdb/version-validator.ts +0 -111
  653. package/engines/duckdb/README.md +0 -154
  654. package/engines/duckdb/binary-manager.ts +0 -45
  655. package/engines/duckdb/hostdb-releases.ts +0 -23
  656. package/engines/duckdb/index.ts +0 -749
  657. package/engines/duckdb/registry.ts +0 -303
  658. package/engines/duckdb/scanner.ts +0 -22
  659. package/engines/duckdb/version-maps.ts +0 -78
  660. package/engines/duckdb/version-validator.ts +0 -78
  661. package/engines/ferretdb/README.md +0 -262
  662. package/engines/ferretdb/backup.ts +0 -173
  663. package/engines/ferretdb/binary-manager.ts +0 -1095
  664. package/engines/ferretdb/binary-urls.ts +0 -183
  665. package/engines/ferretdb/index.ts +0 -1907
  666. package/engines/ferretdb/restore.ts +0 -357
  667. package/engines/file-based-utils.ts +0 -262
  668. package/engines/index.ts +0 -131
  669. package/engines/influxdb/README.md +0 -180
  670. package/engines/influxdb/api-client.ts +0 -64
  671. package/engines/influxdb/backup.ts +0 -160
  672. package/engines/influxdb/binary-manager.ts +0 -110
  673. package/engines/influxdb/binary-urls.ts +0 -69
  674. package/engines/influxdb/hostdb-releases.ts +0 -23
  675. package/engines/influxdb/index.ts +0 -1272
  676. package/engines/influxdb/restore.ts +0 -417
  677. package/engines/influxdb/version-maps.ts +0 -75
  678. package/engines/influxdb/version-validator.ts +0 -128
  679. package/engines/mariadb/README.md +0 -141
  680. package/engines/mariadb/backup.ts +0 -233
  681. package/engines/mariadb/binary-manager.ts +0 -45
  682. package/engines/mariadb/hostdb-releases.ts +0 -23
  683. package/engines/mariadb/index.ts +0 -1300
  684. package/engines/mariadb/restore.ts +0 -447
  685. package/engines/mariadb/version-maps.ts +0 -72
  686. package/engines/mariadb/version-validator.ts +0 -181
  687. package/engines/meilisearch/README.md +0 -255
  688. package/engines/meilisearch/api-client.ts +0 -61
  689. package/engines/meilisearch/backup.ts +0 -233
  690. package/engines/meilisearch/binary-manager.ts +0 -43
  691. package/engines/meilisearch/binary-urls.ts +0 -69
  692. package/engines/meilisearch/hostdb-releases.ts +0 -26
  693. package/engines/meilisearch/index.ts +0 -1292
  694. package/engines/meilisearch/restore.ts +0 -219
  695. package/engines/meilisearch/version-maps.ts +0 -78
  696. package/engines/meilisearch/version-validator.ts +0 -128
  697. package/engines/mongodb/README.md +0 -162
  698. package/engines/mongodb/backup.ts +0 -127
  699. package/engines/mongodb/binary-manager.ts +0 -48
  700. package/engines/mongodb/binary-urls.ts +0 -63
  701. package/engines/mongodb/cli-utils.ts +0 -171
  702. package/engines/mongodb/hostdb-releases.ts +0 -91
  703. package/engines/mongodb/index.ts +0 -1118
  704. package/engines/mongodb/restore.ts +0 -361
  705. package/engines/mongodb/version-maps.ts +0 -91
  706. package/engines/mongodb/version-validator.ts +0 -160
  707. package/engines/mysql/README.md +0 -142
  708. package/engines/mysql/backup.ts +0 -270
  709. package/engines/mysql/binary-detection.ts +0 -408
  710. package/engines/mysql/binary-manager.ts +0 -42
  711. package/engines/mysql/binary-urls.ts +0 -104
  712. package/engines/mysql/index.ts +0 -1361
  713. package/engines/mysql/restore.ts +0 -500
  714. package/engines/mysql/version-maps.ts +0 -91
  715. package/engines/mysql/version-validator.ts +0 -369
  716. package/engines/postgresql/README.md +0 -158
  717. package/engines/postgresql/backup.ts +0 -151
  718. package/engines/postgresql/binary-manager.ts +0 -114
  719. package/engines/postgresql/binary-urls.ts +0 -99
  720. package/engines/postgresql/hostdb-releases.ts +0 -26
  721. package/engines/postgresql/index.ts +0 -1143
  722. package/engines/postgresql/remote-version.ts +0 -161
  723. package/engines/postgresql/restore.ts +0 -342
  724. package/engines/postgresql/version-maps.ts +0 -83
  725. package/engines/postgresql/version-validator.ts +0 -413
  726. package/engines/qdrant/README.md +0 -222
  727. package/engines/qdrant/api-client.ts +0 -61
  728. package/engines/qdrant/backup.ts +0 -165
  729. package/engines/qdrant/binary-manager.ts +0 -43
  730. package/engines/qdrant/binary-urls.ts +0 -115
  731. package/engines/qdrant/cli-utils.ts +0 -43
  732. package/engines/qdrant/hostdb-releases.ts +0 -23
  733. package/engines/qdrant/index.ts +0 -1312
  734. package/engines/qdrant/restore.ts +0 -203
  735. package/engines/qdrant/version-maps.ts +0 -78
  736. package/engines/qdrant/version-validator.ts +0 -128
  737. package/engines/questdb/README.md +0 -334
  738. package/engines/questdb/backup.ts +0 -220
  739. package/engines/questdb/binary-manager.ts +0 -310
  740. package/engines/questdb/binary-urls.ts +0 -34
  741. package/engines/questdb/hostdb-releases.ts +0 -23
  742. package/engines/questdb/index.ts +0 -1023
  743. package/engines/questdb/restore.ts +0 -260
  744. package/engines/questdb/version-maps.ts +0 -37
  745. package/engines/questdb/version-validator.ts +0 -121
  746. package/engines/redis/README.md +0 -173
  747. package/engines/redis/backup.ts +0 -389
  748. package/engines/redis/binary-manager.ts +0 -44
  749. package/engines/redis/binary-urls.ts +0 -117
  750. package/engines/redis/cli-utils.ts +0 -42
  751. package/engines/redis/hostdb-releases.ts +0 -23
  752. package/engines/redis/index.ts +0 -1583
  753. package/engines/redis/restore.ts +0 -443
  754. package/engines/redis/version-maps.ts +0 -81
  755. package/engines/redis/version-validator.ts +0 -131
  756. package/engines/sqlite/README.md +0 -162
  757. package/engines/sqlite/binary-manager.ts +0 -52
  758. package/engines/sqlite/hostdb-releases.ts +0 -23
  759. package/engines/sqlite/index.ts +0 -641
  760. package/engines/sqlite/registry.ts +0 -198
  761. package/engines/sqlite/scanner.ts +0 -22
  762. package/engines/sqlite/version-maps.ts +0 -64
  763. package/engines/surrealdb/README.md +0 -218
  764. package/engines/surrealdb/backup.ts +0 -131
  765. package/engines/surrealdb/binary-manager.ts +0 -45
  766. package/engines/surrealdb/binary-urls.ts +0 -40
  767. package/engines/surrealdb/cli-utils.ts +0 -173
  768. package/engines/surrealdb/hostdb-releases.ts +0 -23
  769. package/engines/surrealdb/index.ts +0 -1246
  770. package/engines/surrealdb/restore.ts +0 -302
  771. package/engines/surrealdb/version-maps.ts +0 -41
  772. package/engines/tigerbeetle/README.md +0 -61
  773. package/engines/tigerbeetle/backup.ts +0 -49
  774. package/engines/tigerbeetle/binary-manager.ts +0 -95
  775. package/engines/tigerbeetle/binary-urls.ts +0 -62
  776. package/engines/tigerbeetle/hostdb-releases.ts +0 -26
  777. package/engines/tigerbeetle/index.ts +0 -746
  778. package/engines/tigerbeetle/restore.ts +0 -130
  779. package/engines/tigerbeetle/version-validator.ts +0 -126
  780. package/engines/typedb/backup.ts +0 -167
  781. package/engines/typedb/binary-manager.ts +0 -200
  782. package/engines/typedb/binary-urls.ts +0 -40
  783. package/engines/typedb/cli-utils.ts +0 -210
  784. package/engines/typedb/hostdb-releases.ts +0 -23
  785. package/engines/typedb/index.ts +0 -1275
  786. package/engines/typedb/restore.ts +0 -377
  787. package/engines/typedb/version-maps.ts +0 -48
  788. package/engines/typedb/version-validator.ts +0 -127
  789. package/engines/valkey/README.md +0 -219
  790. package/engines/valkey/backup.ts +0 -389
  791. package/engines/valkey/binary-manager.ts +0 -45
  792. package/engines/valkey/binary-urls.ts +0 -122
  793. package/engines/valkey/cli-utils.ts +0 -42
  794. package/engines/valkey/hostdb-releases.ts +0 -23
  795. package/engines/valkey/index.ts +0 -1585
  796. package/engines/valkey/restore.ts +0 -446
  797. package/engines/valkey/version-maps.ts +0 -81
  798. package/engines/valkey/version-validator.ts +0 -131
  799. package/engines/weaviate/README.md +0 -302
  800. package/engines/weaviate/api-client.ts +0 -61
  801. package/engines/weaviate/backup.ts +0 -145
  802. package/engines/weaviate/binary-manager.ts +0 -80
  803. package/engines/weaviate/binary-urls.ts +0 -115
  804. package/engines/weaviate/cli-utils.ts +0 -43
  805. package/engines/weaviate/hostdb-releases.ts +0 -23
  806. package/engines/weaviate/index.ts +0 -1139
  807. package/engines/weaviate/restore.ts +0 -235
  808. package/engines/weaviate/version-maps.ts +0 -78
  809. package/engines/weaviate/version-validator.ts +0 -128
  810. package/types/index.ts +0 -624
  811. /package/{config → dist/config}/engines.json +0 -0
@@ -1,1143 +0,0 @@
1
- import { join } from 'path'
2
- import { spawn, exec, type SpawnOptions } from 'child_process'
3
- import { promisify } from 'util'
4
- import { existsSync } from 'fs'
5
- import { readFile, writeFile } from 'fs/promises'
6
- import { BaseEngine } from '../base-engine'
7
- import { postgresqlBinaryManager } from './binary-manager'
8
- import { processManager } from '../../core/process-manager'
9
- import { configManager } from '../../core/config-manager'
10
- import { containerManager } from '../../core/container-manager'
11
- import {
12
- platformService,
13
- isWindows,
14
- getWindowsSpawnOptions,
15
- } from '../../core/platform-service'
16
- import { paths } from '../../config/paths'
17
- import { defaults, getEngineDefaults } from '../../config/defaults'
18
- import { getBinaryUrl } from './binary-urls'
19
- import { fetchAvailableVersions, getLatestVersion } from './hostdb-releases'
20
- import {
21
- SUPPORTED_MAJOR_VERSIONS,
22
- POSTGRESQL_VERSION_MAP,
23
- } from './version-maps'
24
- import { detectBackupFormat, restoreBackup } from './restore'
25
- import { createBackup } from './backup'
26
- import {
27
- validateDumpCompatibility,
28
- type DumpCompatibilityResult,
29
- } from './version-validator'
30
- import { switchHomebrewVersion } from '../../core/homebrew-version-manager'
31
- import {
32
- assertValidDatabaseName,
33
- assertValidUsername,
34
- SpinDBError,
35
- ErrorCodes,
36
- } from '../../core/error-handler'
37
- import { parseCSVToQueryResult } from '../../core/query-parser'
38
- import type {
39
- Platform,
40
- Arch,
41
- ContainerConfig,
42
- ProgressCallback,
43
- BackupFormat,
44
- BackupOptions,
45
- BackupResult,
46
- RestoreResult,
47
- DumpResult,
48
- StatusResult,
49
- QueryResult,
50
- QueryOptions,
51
- CreateUserOptions,
52
- UserCredentials,
53
- } from '../../types'
54
-
55
- const execAsync = promisify(exec)
56
-
57
- /**
58
- * Build a Windows-safe psql command string for either a file or inline SQL.
59
- * This is exported for unit testing.
60
- */
61
- export function buildWindowsPsqlCommand(
62
- psqlPath: string,
63
- port: number,
64
- user: string,
65
- db: string,
66
- options: { file?: string; sql?: string },
67
- ): string {
68
- if (!options.file && !options.sql) {
69
- throw new Error('Either file or sql option must be provided')
70
- }
71
-
72
- let cmd = `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${user} -d ${db}`
73
-
74
- if (options.file) {
75
- cmd += ` -f "${options.file}"`
76
- } else if (options.sql) {
77
- // Escape double quotes in the SQL so the outer double quotes are preserved
78
- const escaped = options.sql.replace(/"/g, '\\"')
79
- cmd += ` -c "${escaped}"`
80
- }
81
-
82
- return cmd
83
- }
84
-
85
- export class PostgreSQLEngine extends BaseEngine {
86
- name = 'postgresql'
87
- displayName = 'PostgreSQL'
88
- defaultPort = getEngineDefaults('postgresql').defaultPort
89
- supportedVersions = SUPPORTED_MAJOR_VERSIONS
90
-
91
- async fetchAvailableVersions(): Promise<Record<string, string[]>> {
92
- return fetchAvailableVersions()
93
- }
94
-
95
- getPlatformInfo(): { platform: Platform; arch: Arch } {
96
- const info = platformService.getPlatformInfo()
97
- return {
98
- platform: info.platform,
99
- arch: info.arch,
100
- }
101
- }
102
-
103
- // Resolves version string to full version (e.g., '17' -> '17.7.0').
104
- resolveFullVersion(version: string): string {
105
- // Check if already a full version (has at least one dot with numbers after)
106
- if (/^\d+\.\d+/.test(version)) {
107
- return version
108
- }
109
- // It's a major version, resolve using fallback map (sync, no network)
110
- return POSTGRESQL_VERSION_MAP[version] || `${version}.0.0`
111
- }
112
-
113
- async resolveFullVersionAsync(version: string): Promise<string> {
114
- // Check if already a full version
115
- if (/^\d+\.\d+/.test(version)) {
116
- return version
117
- }
118
- // Resolve from network/cache
119
- return getLatestVersion(version)
120
- }
121
-
122
- getBinaryPath(version: string): string {
123
- const fullVersion = this.resolveFullVersion(version)
124
- const { platform: p, arch: a } = this.getPlatformInfo()
125
- return paths.getBinaryPath({
126
- engine: 'postgresql',
127
- version: fullVersion,
128
- platform: p,
129
- arch: a,
130
- })
131
- }
132
-
133
- /**
134
- * Gets the binary path with self-healing fallback logic.
135
- *
136
- * If binaries for the exact version don't exist:
137
- * 1. Looks for any installed binaries with the same major version
138
- * 2. If found, uses those and optionally updates the container config
139
- * 3. If not found, downloads the current supported version for that major
140
- *
141
- * @param version - The version from container config (e.g., "17.7.0")
142
- * @param containerName - Container name for config updates (optional)
143
- * @param onProgress - Progress callback for downloads
144
- * @returns Object with binPath and actualVersion (may differ from requested)
145
- */
146
- async getBinaryPathWithFallback(
147
- version: string,
148
- containerName?: string,
149
- onProgress?: ProgressCallback,
150
- ): Promise<{ binPath: string; actualVersion: string; wasHealed: boolean }> {
151
- const fullVersion = this.resolveFullVersion(version)
152
- const { platform: p, arch: a } = this.getPlatformInfo()
153
-
154
- // Check if exact version binaries exist
155
- const expectedPath = paths.getBinaryPath({
156
- engine: 'postgresql',
157
- version: fullVersion,
158
- platform: p,
159
- arch: a,
160
- })
161
-
162
- const ext = platformService.getExecutableExtension()
163
- const pgCtlPath = join(expectedPath, 'bin', `pg_ctl${ext}`)
164
-
165
- if (existsSync(pgCtlPath)) {
166
- return {
167
- binPath: expectedPath,
168
- actualVersion: fullVersion,
169
- wasHealed: false,
170
- }
171
- }
172
-
173
- // Binaries don't exist - try to find same major version
174
- const majorVersion = fullVersion.split('.')[0]
175
-
176
- // Check if we have any installed binaries for this major version
177
- const installed = paths.findInstalledBinaryForMajor(
178
- 'postgresql',
179
- majorVersion,
180
- p,
181
- a,
182
- )
183
-
184
- if (installed) {
185
- // Found compatible binaries - verify they work
186
- const installedPgCtl = join(installed.path, 'bin', `pg_ctl${ext}`)
187
- if (existsSync(installedPgCtl)) {
188
- // Update container config if container name provided
189
- if (containerName) {
190
- await containerManager.updateConfig(containerName, {
191
- version: installed.version,
192
- })
193
- }
194
- return {
195
- binPath: installed.path,
196
- actualVersion: installed.version,
197
- wasHealed: true,
198
- }
199
- }
200
- }
201
-
202
- // No compatible binaries found - download the current supported version
203
- const targetVersion = POSTGRESQL_VERSION_MAP[majorVersion]
204
- if (!targetVersion) {
205
- throw new Error(
206
- `PostgreSQL major version ${majorVersion} is not supported. ` +
207
- `Supported versions: ${SUPPORTED_MAJOR_VERSIONS.join(', ')}`,
208
- )
209
- }
210
-
211
- onProgress?.({
212
- stage: 'downloading',
213
- message: `Binaries for PostgreSQL ${fullVersion} not found, downloading ${targetVersion}...`,
214
- })
215
-
216
- const binPath = await this.ensureBinaries(targetVersion, onProgress)
217
-
218
- // Update container config if container name provided
219
- if (containerName && targetVersion !== fullVersion) {
220
- await containerManager.updateConfig(containerName, {
221
- version: targetVersion,
222
- })
223
- }
224
-
225
- return {
226
- binPath,
227
- actualVersion: targetVersion,
228
- wasHealed: targetVersion !== fullVersion,
229
- }
230
- }
231
-
232
- getBinaryUrl(version: string, plat: Platform, arc: Arch): string {
233
- return getBinaryUrl(version, plat, arc)
234
- }
235
-
236
- async verifyBinary(binPath: string): Promise<boolean> {
237
- const { platform: p, arch: a } = this.getPlatformInfo()
238
- // Extract version from path like "postgresql-17.7.0-darwin-arm64"
239
- const match = binPath.match(/postgresql-(\d+(?:\.\d+)*)/)
240
- if (!match) {
241
- throw new Error(
242
- `Could not extract PostgreSQL version from path: ${binPath}`,
243
- )
244
- }
245
- const version = match[1]
246
- return postgresqlBinaryManager.verify(version, p, a)
247
- }
248
-
249
- // Downloads binaries and registers all tools (server and client) in config.
250
- // hostdb bundles all PostgreSQL binaries for all platforms.
251
- async ensureBinaries(
252
- version: string,
253
- onProgress?: ProgressCallback,
254
- ): Promise<string> {
255
- const { platform: p, arch: a } = this.getPlatformInfo()
256
- const binPath = await postgresqlBinaryManager.ensureInstalled(
257
- version,
258
- p,
259
- a,
260
- onProgress,
261
- )
262
-
263
- // Register all binaries from downloaded package in config
264
- const ext = platformService.getExecutableExtension()
265
-
266
- // All PostgreSQL tools bundled in hostdb downloads
267
- const allTools = [
268
- // Server binaries
269
- 'postgres',
270
- 'pg_ctl',
271
- 'initdb',
272
- // Client tools
273
- 'psql',
274
- 'pg_dump',
275
- 'pg_restore',
276
- 'pg_basebackup',
277
- ] as const
278
-
279
- for (const tool of allTools) {
280
- const toolPath = join(binPath, 'bin', `${tool}${ext}`)
281
- if (existsSync(toolPath)) {
282
- await configManager.setBinaryPath(tool, toolPath, 'bundled')
283
- }
284
- }
285
-
286
- return binPath
287
- }
288
-
289
- async isBinaryInstalled(version: string): Promise<boolean> {
290
- const { platform: p, arch: a } = this.getPlatformInfo()
291
- return postgresqlBinaryManager.isInstalled(version, p, a)
292
- }
293
-
294
- /**
295
- * Check if any compatible binaries are installed for the given version.
296
- * Returns true if either the exact version OR any same-major-version binaries exist.
297
- * This is used by the CLI to determine if it needs to prompt for download.
298
- */
299
- hasCompatibleBinaries(version: string): boolean {
300
- const fullVersion = this.resolveFullVersion(version)
301
- const { platform: p, arch: a } = this.getPlatformInfo()
302
-
303
- // Check if exact version exists
304
- const expectedPath = paths.getBinaryPath({
305
- engine: 'postgresql',
306
- version: fullVersion,
307
- platform: p,
308
- arch: a,
309
- })
310
-
311
- const ext = platformService.getExecutableExtension()
312
- const pgCtlPath = join(expectedPath, 'bin', `pg_ctl${ext}`)
313
-
314
- if (existsSync(pgCtlPath)) {
315
- return true
316
- }
317
-
318
- // Check if any same-major version exists
319
- const majorVersion = fullVersion.split('.')[0]
320
- const installed = paths.findInstalledBinaryForMajor(
321
- 'postgresql',
322
- majorVersion,
323
- p,
324
- a,
325
- )
326
-
327
- return installed !== null
328
- }
329
-
330
- async initDataDir(
331
- containerName: string,
332
- version: string,
333
- options: Record<string, unknown> = {},
334
- ): Promise<string> {
335
- const binPath = this.getBinaryPath(version)
336
- const ext = platformService.getExecutableExtension()
337
- const initdbPath = join(binPath, 'bin', `initdb${ext}`)
338
- const dataDir = paths.getContainerDataPath(containerName, {
339
- engine: this.name,
340
- })
341
-
342
- await processManager.initdb(initdbPath, dataDir, {
343
- superuser: (options.superuser as string) || defaults.superuser,
344
- })
345
-
346
- // Configure max_connections after initdb creates postgresql.conf
347
- const maxConnections =
348
- (options.maxConnections as number) ||
349
- getEngineDefaults('postgresql').maxConnections
350
- await this.setConfigValue(
351
- dataDir,
352
- 'max_connections',
353
- String(maxConnections),
354
- )
355
-
356
- return dataDir
357
- }
358
-
359
- getConfigPath(containerName: string): string {
360
- const dataDir = paths.getContainerDataPath(containerName, {
361
- engine: this.name,
362
- })
363
- return join(dataDir, 'postgresql.conf')
364
- }
365
-
366
- // Updates or appends a configuration value in postgresql.conf.
367
- async setConfigValue(
368
- dataDir: string,
369
- key: string,
370
- value: string,
371
- ): Promise<void> {
372
- const configPath = join(dataDir, 'postgresql.conf')
373
- let content = await readFile(configPath, 'utf8')
374
-
375
- // Match both commented (#key = ...) and uncommented (key = ...) lines
376
- const regex = new RegExp(`^#?\\s*${key}\\s*=.*$`, 'm')
377
-
378
- if (regex.test(content)) {
379
- // Update existing line (commented or not)
380
- content = content.replace(regex, `${key} = ${value}`)
381
- } else {
382
- // Append to end of file
383
- content = content.trimEnd() + `\n${key} = ${value}\n`
384
- }
385
-
386
- await writeFile(configPath, content, 'utf8')
387
- }
388
-
389
- async getConfigValue(dataDir: string, key: string): Promise<string | null> {
390
- const configPath = join(dataDir, 'postgresql.conf')
391
- const content = await readFile(configPath, 'utf8')
392
-
393
- // Match only uncommented lines
394
- const regex = new RegExp(`^${key}\\s*=\\s*(.+?)\\s*(?:#.*)?$`, 'm')
395
- const match = content.match(regex)
396
-
397
- if (match) {
398
- // Remove quotes if present
399
- return match[1].replace(/^['"]|['"]$/g, '')
400
- }
401
- return null
402
- }
403
-
404
- async start(
405
- container: ContainerConfig,
406
- onProgress?: ProgressCallback,
407
- ): Promise<{ port: number; connectionString: string }> {
408
- const { name, version, port } = container
409
-
410
- // Check if already running (idempotent behavior)
411
- const alreadyRunning = await processManager.isRunning(name, {
412
- engine: this.name,
413
- })
414
- if (alreadyRunning) {
415
- return {
416
- port,
417
- connectionString: this.getConnectionString(container),
418
- }
419
- }
420
-
421
- // Get binary path with self-healing fallback
422
- const { binPath, wasHealed } = await this.getBinaryPathWithFallback(
423
- version,
424
- name,
425
- onProgress,
426
- )
427
-
428
- if (wasHealed) {
429
- onProgress?.({
430
- stage: 'info',
431
- message: 'Container version updated to match available binaries',
432
- })
433
- }
434
-
435
- const ext = platformService.getExecutableExtension()
436
- const pgCtlPath = join(binPath, 'bin', `pg_ctl${ext}`)
437
- const dataDir = paths.getContainerDataPath(name, { engine: this.name })
438
- const logFile = paths.getContainerLogPath(name, { engine: this.name })
439
-
440
- onProgress?.({ stage: 'starting', message: 'Starting PostgreSQL...' })
441
-
442
- await processManager.start(pgCtlPath, dataDir, {
443
- port,
444
- logFile,
445
- })
446
-
447
- return {
448
- port,
449
- connectionString: this.getConnectionString(container),
450
- }
451
- }
452
-
453
- async stop(container: ContainerConfig): Promise<void> {
454
- const { name, version } = container
455
-
456
- // Get binary path with self-healing fallback (no progress callback for stop)
457
- const { binPath } = await this.getBinaryPathWithFallback(version, name)
458
-
459
- const ext = platformService.getExecutableExtension()
460
- const pgCtlPath = join(binPath, 'bin', `pg_ctl${ext}`)
461
- const dataDir = paths.getContainerDataPath(name, { engine: this.name })
462
-
463
- await processManager.stop(pgCtlPath, dataDir)
464
-
465
- // Kill pgweb if running for this container
466
- await this.stopPgweb(name)
467
- }
468
-
469
- async status(container: ContainerConfig): Promise<StatusResult> {
470
- const { name, version } = container
471
-
472
- // Get binary path with self-healing fallback (no progress callback for status)
473
- const { binPath } = await this.getBinaryPathWithFallback(version, name)
474
-
475
- const ext = platformService.getExecutableExtension()
476
- const pgCtlPath = join(binPath, 'bin', `pg_ctl${ext}`)
477
- const dataDir = paths.getContainerDataPath(name, { engine: this.name })
478
-
479
- return processManager.status(pgCtlPath, dataDir)
480
- }
481
-
482
- async detectBackupFormat(filePath: string): Promise<BackupFormat> {
483
- return detectBackupFormat(filePath)
484
- }
485
-
486
- async restore(
487
- container: ContainerConfig,
488
- backupPath: string,
489
- options: Record<string, unknown> = {},
490
- ): Promise<RestoreResult> {
491
- const { version, port } = container
492
- const binPath = this.getBinaryPath(version)
493
- const database = (options.database as string) || container.name
494
-
495
- // First create the database if it doesn't exist
496
- if (options.createDatabase !== false) {
497
- await this.createDatabase(container, database)
498
- }
499
-
500
- return restoreBackup(binPath, backupPath, {
501
- port,
502
- database,
503
- user: defaults.superuser,
504
- pgRestorePath: options.pgRestorePath as string, // Use custom path if provided
505
- containerVersion: version, // Pass container version for version-matched binary lookup
506
- ...(options as { format?: string }),
507
- })
508
- }
509
-
510
- getConnectionString(container: ContainerConfig, database?: string): string {
511
- const { port } = container
512
- const db = database || container.database || 'postgres'
513
- return `postgresql://${defaults.superuser}@127.0.0.1:${port}/${db}`
514
- }
515
-
516
- async getPsqlPath(): Promise<string> {
517
- const psqlPath = await configManager.getBinaryPath('psql')
518
- if (!psqlPath) {
519
- throw new Error(
520
- 'psql not found. Install PostgreSQL client tools:\n' +
521
- ' macOS: brew install libpq && brew link --force libpq\n' +
522
- ' Ubuntu/Debian: apt install postgresql-client\n\n' +
523
- 'Or configure manually: spindb config set psql /path/to/psql',
524
- )
525
- }
526
- return psqlPath
527
- }
528
-
529
- async getPgRestorePath(): Promise<string> {
530
- const pgRestorePath = await configManager.getBinaryPath('pg_restore')
531
- if (!pgRestorePath) {
532
- throw new Error(
533
- 'pg_restore not found. Install PostgreSQL client tools:\n' +
534
- ' macOS: brew install libpq && brew link --force libpq\n' +
535
- ' Ubuntu/Debian: apt install postgresql-client\n\n' +
536
- 'Or configure manually: spindb config set pg_restore /path/to/pg_restore',
537
- )
538
- }
539
- return pgRestorePath
540
- }
541
-
542
- async getPgDumpPath(): Promise<string> {
543
- const pgDumpPath = await configManager.getBinaryPath('pg_dump')
544
- if (!pgDumpPath) {
545
- throw new Error(
546
- 'pg_dump not found. Install PostgreSQL client tools:\n' +
547
- ' macOS: brew install libpq && brew link --force libpq\n' +
548
- ' Ubuntu/Debian: apt install postgresql-client\n\n' +
549
- 'Or configure manually: spindb config set pg_dump /path/to/pg_dump',
550
- )
551
- }
552
- return pgDumpPath
553
- }
554
-
555
- /**
556
- * Get a compatible pg_dump path for dumping from a remote database
557
- *
558
- * This checks the remote database version and finds a compatible pg_dump:
559
- * 1. First checks if the current pg_dump is compatible
560
- * 2. If not, tries to find a direct path to a compatible version
561
- * 3. If that fails, tries to switch Homebrew links
562
- * 4. If all else fails, throws an error with install instructions
563
- */
564
- async getCompatiblePgDumpPath(connectionString: string): Promise<{
565
- path: string
566
- switched: boolean
567
- warnings: string[]
568
- }> {
569
- const warnings: string[] = []
570
-
571
- // Get current pg_dump path with version validation
572
- const { path, versionMismatch, cachedVersion, actualVersion } =
573
- await configManager.getBinaryPathWithVersionCheck('pg_dump')
574
-
575
- if (!path) {
576
- throw new SpinDBError(
577
- ErrorCodes.DEPENDENCY_MISSING,
578
- 'pg_dump not found. Install PostgreSQL client tools.',
579
- 'fatal',
580
- 'macOS: brew install postgresql@17 && brew link --overwrite postgresql@17\n' +
581
- 'Ubuntu/Debian: apt install postgresql-client',
582
- )
583
- }
584
-
585
- if (versionMismatch) {
586
- warnings.push(
587
- `pg_dump version changed: ${cachedVersion} -> ${actualVersion} (Homebrew link changed)`,
588
- )
589
- }
590
-
591
- // Check compatibility with remote database
592
- let compatibility: DumpCompatibilityResult
593
- try {
594
- compatibility = await validateDumpCompatibility({
595
- connectionString,
596
- pgDumpPath: path,
597
- })
598
- } catch (error) {
599
- // Connection or version detection failed
600
- const e = error as Error
601
- throw new SpinDBError(
602
- ErrorCodes.CONNECTION_FAILED,
603
- `Failed to detect remote database version: ${e.message}`,
604
- 'fatal',
605
- 'Check your connection string and ensure the database is accessible.',
606
- )
607
- }
608
-
609
- if (compatibility.compatible) {
610
- return { path, switched: false, warnings }
611
- }
612
-
613
- // Handle incompatibility based on required action
614
- // All cases that don't return will fall through to VERSION_MISMATCH error below
615
- switch (compatibility.requiredAction) {
616
- case 'use_direct_path':
617
- if (compatibility.alternativePath) {
618
- warnings.push(
619
- `Using PostgreSQL ${compatibility.switchTarget} pg_dump (remote DB is v${compatibility.remoteDbVersion.majorVersion})`,
620
- )
621
- return {
622
- path: compatibility.alternativePath,
623
- switched: false,
624
- warnings,
625
- }
626
- }
627
- // No alternative path available - fall through to VERSION_MISMATCH error
628
- break
629
-
630
- case 'switch_homebrew':
631
- if (compatibility.switchTarget) {
632
- const switchResult = await switchHomebrewVersion(
633
- compatibility.switchTarget,
634
- )
635
- if (switchResult.success) {
636
- // Refresh config cache after switching
637
- await configManager.refreshBinaryWithVersion('pg_dump')
638
- await configManager.refreshBinaryWithVersion('pg_restore')
639
- await configManager.refreshBinaryWithVersion('psql')
640
-
641
- const newPath = await configManager.getBinaryPath('pg_dump')
642
- if (newPath) {
643
- warnings.push(
644
- `Switched Homebrew from PostgreSQL ${switchResult.previousVersion} to ${switchResult.currentVersion}`,
645
- )
646
- return { path: newPath, switched: true, warnings }
647
- }
648
- }
649
- }
650
- // Switch failed or no target - fall through to VERSION_MISMATCH error
651
- break
652
-
653
- case 'install':
654
- // User needs to install manually - fall through to VERSION_MISMATCH error
655
- break
656
- }
657
-
658
- // Cannot auto-fix - throw error with install instructions
659
- throw new SpinDBError(
660
- ErrorCodes.VERSION_MISMATCH,
661
- compatibility.error ||
662
- `Your pg_dump version (${compatibility.localToolVersion.major}) cannot dump from PostgreSQL ${compatibility.remoteDbVersion.majorVersion}`,
663
- 'fatal',
664
- `Install PostgreSQL ${compatibility.remoteDbVersion.majorVersion} client tools:\n` +
665
- ` brew install postgresql@${compatibility.remoteDbVersion.majorVersion}`,
666
- { compatibility },
667
- )
668
- }
669
-
670
- async connect(container: ContainerConfig, database?: string): Promise<void> {
671
- const { port } = container
672
- const db = database || 'postgres'
673
- const psqlPath = await this.getPsqlPath()
674
-
675
- const spawnOptions: SpawnOptions = {
676
- stdio: 'inherit',
677
- ...getWindowsSpawnOptions(),
678
- }
679
-
680
- return new Promise((resolve, reject) => {
681
- const proc = spawn(
682
- psqlPath,
683
- [
684
- '-h',
685
- '127.0.0.1',
686
- '-p',
687
- String(port),
688
- '-U',
689
- defaults.superuser,
690
- '-d',
691
- db,
692
- ],
693
- spawnOptions,
694
- )
695
-
696
- proc.on('error', (err: NodeJS.ErrnoException) => {
697
- reject(err)
698
- })
699
-
700
- proc.on('close', () => resolve())
701
- })
702
- }
703
-
704
- async createDatabase(
705
- container: ContainerConfig,
706
- database: string,
707
- ): Promise<void> {
708
- assertValidDatabaseName(database)
709
- const { port } = container
710
- const psqlPath = await this.getPsqlPath()
711
-
712
- // On Windows, single quotes don't work in cmd.exe - use double quotes and escape inner quotes
713
- const sql = `CREATE DATABASE "${database}"`
714
- const cmd = isWindows()
715
- ? `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c "${sql.replace(/"/g, '\\"')}"`
716
- : `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c '${sql}'`
717
-
718
- try {
719
- await execAsync(cmd)
720
- } catch (error) {
721
- const err = error as Error
722
- // Ignore "database already exists" error
723
- if (!err.message.includes('already exists')) {
724
- throw error
725
- }
726
- }
727
- }
728
-
729
- async dropDatabase(
730
- container: ContainerConfig,
731
- database: string,
732
- ): Promise<void> {
733
- assertValidDatabaseName(database)
734
- const { port } = container
735
- const psqlPath = await this.getPsqlPath()
736
-
737
- // On Windows, single quotes don't work in cmd.exe - use double quotes and escape inner quotes
738
- const sql = `DROP DATABASE IF EXISTS "${database}"`
739
- const cmd = isWindows()
740
- ? `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c "${sql.replace(/"/g, '\\"')}"`
741
- : `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c '${sql}'`
742
-
743
- try {
744
- await execAsync(cmd)
745
- } catch (error) {
746
- const err = error as Error
747
- // Ignore "database does not exist" error
748
- if (!err.message.includes('does not exist')) {
749
- throw error
750
- }
751
- }
752
- }
753
-
754
- async getDatabaseSize(container: ContainerConfig): Promise<number | null> {
755
- const { port, database } = container
756
- const db = database || 'postgres'
757
-
758
- // Validate database name to prevent SQL injection
759
- assertValidDatabaseName(db)
760
-
761
- try {
762
- const psqlPath = await this.getPsqlPath()
763
- // Query pg_database_size for the specific database
764
- // On Windows, use escaped double quotes; on Unix, use single quotes
765
- const sql = `SELECT pg_database_size('${db}')`
766
- const cmd = isWindows()
767
- ? `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -t -A -c "${sql.replace(/'/g, "''")}"`
768
- : `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -t -A -c "${sql}"`
769
- const { stdout } = await execAsync(cmd)
770
- const size = parseInt(stdout.trim(), 10)
771
- return isNaN(size) ? null : size
772
- } catch {
773
- // Container not running or query failed
774
- return null
775
- }
776
- }
777
-
778
- /**
779
- * Dump a remote database to a file
780
- *
781
- * This method automatically detects the remote database version and uses
782
- * a compatible pg_dump binary. If the current pg_dump is incompatible,
783
- * it will try to find or switch to a compatible version.
784
- */
785
- async dumpFromConnectionString(
786
- connectionString: string,
787
- outputPath: string,
788
- ): Promise<DumpResult> {
789
- // Get compatible pg_dump path (may switch versions or use direct path)
790
- const { path: pgDumpPath, warnings } =
791
- await this.getCompatiblePgDumpPath(connectionString)
792
-
793
- const spawnOptions: SpawnOptions = {
794
- stdio: ['pipe', 'pipe', 'pipe'],
795
- ...getWindowsSpawnOptions(),
796
- }
797
-
798
- return new Promise((resolve, reject) => {
799
- const args = [connectionString, '-Fc', '-f', outputPath]
800
-
801
- const proc = spawn(pgDumpPath, args, spawnOptions)
802
-
803
- let stdout = ''
804
- let stderr = ''
805
-
806
- proc.stdout?.on('data', (data: Buffer) => {
807
- stdout += data.toString()
808
- })
809
-
810
- proc.stderr?.on('data', (data: Buffer) => {
811
- stderr += data.toString()
812
- })
813
-
814
- proc.on('error', (err: NodeJS.ErrnoException) => {
815
- reject(err)
816
- })
817
-
818
- proc.on('close', (code) => {
819
- if (code === 0) {
820
- resolve({
821
- filePath: outputPath,
822
- stdout,
823
- stderr,
824
- code,
825
- warnings,
826
- })
827
- } else {
828
- // pg_dump failed
829
- const errorMessage = stderr || `pg_dump exited with code ${code}`
830
- reject(new Error(errorMessage))
831
- }
832
- })
833
- })
834
- }
835
-
836
- async backup(
837
- container: ContainerConfig,
838
- outputPath: string,
839
- options: BackupOptions,
840
- ): Promise<BackupResult> {
841
- return createBackup(container, outputPath, options)
842
- }
843
-
844
- async terminateConnections(
845
- container: ContainerConfig,
846
- database: string,
847
- ): Promise<void> {
848
- assertValidDatabaseName(database)
849
- const { port } = container
850
- const psqlPath = await this.getPsqlPath()
851
-
852
- // Terminate all connections to the database except our own
853
- const sql = `SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${database}' AND pid <> pg_backend_pid()`
854
-
855
- // Connect to 'postgres' database for admin operations
856
- // Escape single quotes for shell: ' becomes '\'' (end quote, escaped quote, start quote)
857
- const shellEscapedSql = sql.replace(/'/g, "'\\''")
858
- const cmd = isWindows()
859
- ? `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c "${sql.replace(/"/g, '\\"')}"`
860
- : `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c '${shellEscapedSql}'`
861
-
862
- try {
863
- await execAsync(cmd)
864
- } catch {
865
- // Ignore errors - connections may already be gone
866
- }
867
- }
868
-
869
- async runScript(
870
- container: ContainerConfig,
871
- options: { file?: string; sql?: string; database?: string },
872
- ): Promise<void> {
873
- const { port } = container
874
- const db = options.database || container.database || 'postgres'
875
- const psqlPath = await this.getPsqlPath()
876
-
877
- // On Windows, build a single command string and use exec to avoid
878
- // passing an args array with shell:true (DEP0190 and quoting issues).
879
- if (isWindows()) {
880
- const cmd = buildWindowsPsqlCommand(
881
- psqlPath,
882
- port,
883
- defaults.superuser,
884
- db,
885
- options,
886
- )
887
- try {
888
- const { stdout, stderr } = await execAsync(cmd)
889
- if (stdout) process.stdout.write(stdout)
890
- if (stderr) process.stderr.write(stderr)
891
- return
892
- } catch (error) {
893
- const err = error as Error
894
- throw new Error(`psql failed: ${err.message}`)
895
- }
896
- }
897
-
898
- // Non-Windows: spawn directly with args (no shell)
899
- const args = [
900
- '-h',
901
- '127.0.0.1',
902
- '-p',
903
- String(port),
904
- '-U',
905
- defaults.superuser,
906
- '-d',
907
- db,
908
- ]
909
-
910
- if (options.file) {
911
- args.push('-f', options.file)
912
- } else if (options.sql) {
913
- args.push('-c', options.sql)
914
- } else {
915
- throw new Error('Either file or sql option must be provided')
916
- }
917
-
918
- const spawnOptions: SpawnOptions = {
919
- stdio: 'inherit',
920
- }
921
-
922
- return new Promise((resolve, reject) => {
923
- const proc = spawn(psqlPath, args, spawnOptions)
924
-
925
- proc.on('error', (err: NodeJS.ErrnoException) => {
926
- reject(err)
927
- })
928
-
929
- proc.on('close', (code) => {
930
- if (code === 0) {
931
- resolve()
932
- } else {
933
- reject(new Error(`psql exited with code ${code}`))
934
- }
935
- })
936
- })
937
- }
938
-
939
- async executeQuery(
940
- container: ContainerConfig,
941
- query: string,
942
- options?: QueryOptions,
943
- ): Promise<QueryResult> {
944
- const { port } = container
945
- const db = options?.database || container.database || 'postgres'
946
- const psqlPath = await this.getPsqlPath()
947
-
948
- // Use --csv for machine-readable output
949
- const args = [
950
- '-X', // Skip ~/.psqlrc to ensure deterministic CSV output
951
- '-h',
952
- '127.0.0.1',
953
- '-p',
954
- String(port),
955
- '-U',
956
- defaults.superuser,
957
- '-d',
958
- db,
959
- '--csv',
960
- '-c',
961
- query,
962
- ]
963
-
964
- return new Promise((resolve, reject) => {
965
- const proc = spawn(psqlPath, args, {
966
- stdio: ['pipe', 'pipe', 'pipe'],
967
- })
968
-
969
- let stdout = ''
970
- let stderr = ''
971
-
972
- proc.stdout?.on('data', (data: Buffer) => {
973
- stdout += data.toString()
974
- })
975
- proc.stderr?.on('data', (data: Buffer) => {
976
- stderr += data.toString()
977
- })
978
-
979
- proc.on('error', (err: NodeJS.ErrnoException) => {
980
- reject(err)
981
- })
982
-
983
- proc.on('close', (code) => {
984
- if (code === 0) {
985
- resolve(parseCSVToQueryResult(stdout))
986
- } else {
987
- reject(new Error(stderr || `psql exited with code ${code}`))
988
- }
989
- })
990
- })
991
- }
992
-
993
- /**
994
- * List all user databases, excluding system databases (template0, template1, postgres).
995
- */
996
- async listDatabases(container: ContainerConfig): Promise<string[]> {
997
- const { port } = container
998
- const psqlPath = await this.getPsqlPath()
999
-
1000
- // Query pg_database for all non-system databases
1001
- const sql = `SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1', 'postgres') AND datistemplate = false ORDER BY datname`
1002
-
1003
- const args = [
1004
- '-X', // Skip ~/.psqlrc
1005
- '-h',
1006
- '127.0.0.1',
1007
- '-p',
1008
- String(port),
1009
- '-U',
1010
- defaults.superuser,
1011
- '-d',
1012
- 'postgres',
1013
- '-t', // Tuples only (no headers)
1014
- '-A', // Unaligned output
1015
- '-c',
1016
- sql,
1017
- ]
1018
-
1019
- return new Promise((resolve, reject) => {
1020
- const proc = spawn(psqlPath, args, {
1021
- stdio: ['pipe', 'pipe', 'pipe'],
1022
- })
1023
-
1024
- let stdout = ''
1025
- let stderr = ''
1026
-
1027
- proc.stdout?.on('data', (data: Buffer) => {
1028
- stdout += data.toString()
1029
- })
1030
- proc.stderr?.on('data', (data: Buffer) => {
1031
- stderr += data.toString()
1032
- })
1033
-
1034
- proc.on('error', (err: NodeJS.ErrnoException) => {
1035
- reject(err)
1036
- })
1037
-
1038
- proc.on('close', (code) => {
1039
- if (code === 0) {
1040
- const databases = stdout
1041
- .trim()
1042
- .split('\n')
1043
- .map((db) => db.trim())
1044
- .filter((db) => db.length > 0)
1045
- resolve(databases)
1046
- } else {
1047
- reject(new Error(stderr || `psql exited with code ${code}`))
1048
- }
1049
- })
1050
- })
1051
- }
1052
-
1053
- async createUser(
1054
- container: ContainerConfig,
1055
- options: CreateUserOptions,
1056
- ): Promise<UserCredentials> {
1057
- const { username, password, database } = options
1058
- assertValidUsername(username)
1059
- const { port } = container
1060
- const db = database || container.database
1061
- if (!db) {
1062
- throw new Error(
1063
- 'No target database specified. Provide a database name with --database or ensure the container has a default database.',
1064
- )
1065
- }
1066
- assertValidDatabaseName(db)
1067
- const psqlPath = await this.getPsqlPath()
1068
-
1069
- // Pass SQL via stdin (psql -f -) to avoid exposing passwords in process listings
1070
- const psqlBaseArgs = [
1071
- '-h',
1072
- '127.0.0.1',
1073
- '-p',
1074
- String(port),
1075
- '-U',
1076
- defaults.superuser,
1077
- '-d',
1078
- 'postgres',
1079
- '-f',
1080
- '-',
1081
- ]
1082
-
1083
- const runPsqlViaStdin = (sql: string): Promise<void> =>
1084
- new Promise((resolve, reject) => {
1085
- const proc = spawn(psqlPath, psqlBaseArgs, {
1086
- stdio: ['pipe', 'pipe', 'pipe'],
1087
- ...getWindowsSpawnOptions(),
1088
- })
1089
-
1090
- let stderr = ''
1091
- proc.stderr?.on('data', (data: Buffer) => {
1092
- stderr += data.toString()
1093
- })
1094
-
1095
- proc.on('error', reject)
1096
-
1097
- proc.on('close', (code) => {
1098
- if (code === 0) resolve()
1099
- else reject(new Error(stderr || `psql exited with code ${code}`))
1100
- })
1101
-
1102
- proc.stdin?.write(sql)
1103
- proc.stdin?.end()
1104
- })
1105
-
1106
- // Escape username for safe identifier interpolation (defense-in-depth)
1107
- const escapedIdent = username.replace(/"/g, '""')
1108
- const escapedPass = password.replace(/'/g, "''")
1109
-
1110
- // Create the role with login and password
1111
- const createRoleSql = `CREATE ROLE "${escapedIdent}" WITH LOGIN PASSWORD '${escapedPass}'`
1112
-
1113
- try {
1114
- await runPsqlViaStdin(createRoleSql)
1115
- } catch (error) {
1116
- const err = error as Error
1117
- if (err.message.includes('already exists')) {
1118
- // User exists — update password instead
1119
- const alterSql = `ALTER ROLE "${escapedIdent}" WITH PASSWORD '${escapedPass}'`
1120
- await runPsqlViaStdin(alterSql)
1121
- } else {
1122
- throw error
1123
- }
1124
- }
1125
-
1126
- // Grant all privileges on the target database
1127
- const grantSql = `GRANT ALL PRIVILEGES ON DATABASE "${db}" TO "${escapedIdent}"`
1128
- await runPsqlViaStdin(grantSql)
1129
-
1130
- const connectionString = `postgresql://${encodeURIComponent(username)}:${encodeURIComponent(password)}@127.0.0.1:${port}/${db}`
1131
-
1132
- return {
1133
- username,
1134
- password,
1135
- connectionString,
1136
- engine: container.engine,
1137
- container: container.name,
1138
- database: db,
1139
- }
1140
- }
1141
- }
1142
-
1143
- export const postgresqlEngine = new PostgreSQLEngine()