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,1276 +0,0 @@
1
- /**
2
- * CockroachDB Engine Implementation
3
- *
4
- * CockroachDB is a distributed SQL database with PostgreSQL wire protocol compatibility.
5
- * It provides horizontal scaling, strong consistency, and built-in survivability.
6
- *
7
- * Key characteristics:
8
- * - Default SQL port: 26257
9
- * - HTTP UI port: SQL port + 1 (default 26258)
10
- * - Uses PostgreSQL wire protocol for client connections
11
- * - Single binary: `cockroach` (handles server, sql client, and admin tasks)
12
- * - Default database: `defaultdb`
13
- * - Default user: `root` (no password in insecure mode)
14
- */
15
-
16
- import { spawn, type SpawnOptions } from 'child_process'
17
- import { existsSync } from 'fs'
18
- import { mkdir, writeFile, readFile, unlink } from 'fs/promises'
19
- import { join } from 'path'
20
- import { BaseEngine } from '../base-engine'
21
- import { paths } from '../../config/paths'
22
- import { getEngineDefaults } from '../../config/defaults'
23
- import { platformService } from '../../core/platform-service'
24
- import { configManager } from '../../core/config-manager'
25
- import {
26
- logDebug,
27
- logWarning,
28
- assertValidUsername,
29
- } from '../../core/error-handler'
30
- import { findBinary } from '../../core/dependency-manager'
31
- import { processManager } from '../../core/process-manager'
32
- import { cockroachdbBinaryManager } from './binary-manager'
33
- import { getBinaryUrl } from './binary-urls'
34
- import {
35
- normalizeVersion,
36
- SUPPORTED_MAJOR_VERSIONS,
37
- COCKROACHDB_VERSION_MAP,
38
- } from './version-maps'
39
- import { fetchAvailableVersions as fetchHostdbVersions } from './hostdb-releases'
40
- import {
41
- detectBackupFormat as detectBackupFormatImpl,
42
- restoreBackup,
43
- } from './restore'
44
- import { createBackup } from './backup'
45
- import {
46
- validateCockroachIdentifier,
47
- escapeCockroachIdentifier,
48
- escapeSqlValue,
49
- parseCsvLine,
50
- parseCsvRecords,
51
- isInsecureConnection,
52
- } from './cli-utils'
53
- import {
54
- type Platform,
55
- type Arch,
56
- type ContainerConfig,
57
- type ProgressCallback,
58
- type BackupFormat,
59
- type BackupOptions,
60
- type BackupResult,
61
- type RestoreResult,
62
- type DumpResult,
63
- type StatusResult,
64
- type QueryResult,
65
- type QueryOptions,
66
- type CreateUserOptions,
67
- type UserCredentials,
68
- } from '../../types'
69
- import { parseCSVToQueryResult } from '../../core/query-parser'
70
-
71
- const ENGINE = 'cockroachdb'
72
- const engineDef = getEngineDefaults(ENGINE)
73
-
74
- export class CockroachDBEngine extends BaseEngine {
75
- name = ENGINE
76
- displayName = 'CockroachDB'
77
- defaultPort = engineDef.defaultPort
78
- supportedVersions = SUPPORTED_MAJOR_VERSIONS
79
-
80
- // Get platform info for binary operations
81
- getPlatformInfo(): { platform: Platform; arch: Arch } {
82
- return platformService.getPlatformInfo()
83
- }
84
-
85
- // Fetch available versions from hostdb (dynamically or from cache/fallback)
86
- async fetchAvailableVersions(): Promise<Record<string, string[]>> {
87
- return fetchHostdbVersions()
88
- }
89
-
90
- // Get binary download URL from hostdb
91
- getBinaryUrl(version: string, platform: Platform, arch: Arch): string {
92
- return getBinaryUrl(version, platform, arch)
93
- }
94
-
95
- // Resolves version string to full version (e.g., '25' -> '25.4.2')
96
- resolveFullVersion(version: string): string {
97
- if (/^\d+\.\d+\.\d+$/.test(version)) {
98
- return version
99
- }
100
- return COCKROACHDB_VERSION_MAP[version] || version
101
- }
102
-
103
- // Get the path where binaries for a version would be installed
104
- getBinaryPath(version: string): string {
105
- const fullVersion = this.resolveFullVersion(version)
106
- const { platform: p, arch: a } = this.getPlatformInfo()
107
- return paths.getBinaryPath({
108
- engine: 'cockroachdb',
109
- version: fullVersion,
110
- platform: p,
111
- arch: a,
112
- })
113
- }
114
-
115
- // Verify that CockroachDB binaries are available
116
- async verifyBinary(binPath: string): Promise<boolean> {
117
- const ext = platformService.getExecutableExtension()
118
- const cockroachPath = join(binPath, 'bin', `cockroach${ext}`)
119
- return existsSync(cockroachPath)
120
- }
121
-
122
- // Check if a specific CockroachDB version is installed (downloaded)
123
- async isBinaryInstalled(version: string): Promise<boolean> {
124
- const { platform, arch } = this.getPlatformInfo()
125
- return cockroachdbBinaryManager.isInstalled(version, platform, arch)
126
- }
127
-
128
- /**
129
- * Ensure CockroachDB binaries are available for a specific version
130
- * Downloads from hostdb if not already installed
131
- * Returns the path to the bin directory
132
- */
133
- async ensureBinaries(
134
- version: string,
135
- onProgress?: ProgressCallback,
136
- ): Promise<string> {
137
- const { platform, arch } = this.getPlatformInfo()
138
-
139
- const binPath = await cockroachdbBinaryManager.ensureInstalled(
140
- version,
141
- platform,
142
- arch,
143
- onProgress,
144
- )
145
-
146
- // Register binary in config
147
- const ext = platformService.getExecutableExtension()
148
- const cockroachPath = join(binPath, 'bin', `cockroach${ext}`)
149
- if (existsSync(cockroachPath)) {
150
- await configManager.setBinaryPath('cockroach', cockroachPath, 'bundled')
151
- }
152
-
153
- return binPath
154
- }
155
-
156
- /**
157
- * Initialize a new CockroachDB data directory
158
- * Creates the directory structure for CockroachDB's storage
159
- */
160
- async initDataDir(
161
- containerName: string,
162
- _version: string,
163
- _options: Record<string, unknown> = {},
164
- ): Promise<string> {
165
- const dataDir = paths.getContainerDataPath(containerName, {
166
- engine: ENGINE,
167
- })
168
-
169
- // Create data directory
170
- await mkdir(dataDir, { recursive: true })
171
-
172
- logDebug(`Created CockroachDB data directory: ${dataDir}`)
173
-
174
- return dataDir
175
- }
176
-
177
- // Get the path to cockroach binary for a version
178
- async getCockroachPath(version: string): Promise<string> {
179
- const { platform, arch } = this.getPlatformInfo()
180
- const fullVersion = normalizeVersion(version)
181
- const ext = platformService.getExecutableExtension()
182
-
183
- const binPath = paths.getBinaryPath({
184
- engine: 'cockroachdb',
185
- version: fullVersion,
186
- platform,
187
- arch,
188
- })
189
- const cockroachPath = join(binPath, 'bin', `cockroach${ext}`)
190
-
191
- if (existsSync(cockroachPath)) {
192
- return cockroachPath
193
- }
194
-
195
- throw new Error(
196
- `CockroachDB ${version} is not installed. Run: spindb engines download cockroachdb ${version}`,
197
- )
198
- }
199
-
200
- /**
201
- * Start CockroachDB server
202
- */
203
- async start(
204
- container: ContainerConfig,
205
- onProgress?: ProgressCallback,
206
- ): Promise<{ port: number; connectionString: string }> {
207
- const { name, port, version, binaryPath } = container
208
-
209
- // Check if already running
210
- const alreadyRunning = await processManager.isRunning(name, {
211
- engine: ENGINE,
212
- })
213
- if (alreadyRunning) {
214
- return {
215
- port,
216
- connectionString: this.getConnectionString(container),
217
- }
218
- }
219
-
220
- // Get CockroachDB binary path
221
- let cockroachBinary: string | null = null
222
- const ext = platformService.getExecutableExtension()
223
-
224
- if (binaryPath && existsSync(binaryPath)) {
225
- const serverPath = join(binaryPath, 'bin', `cockroach${ext}`)
226
- if (existsSync(serverPath)) {
227
- cockroachBinary = serverPath
228
- logDebug(`Using stored binary path: ${cockroachBinary}`)
229
- }
230
- }
231
-
232
- if (!cockroachBinary) {
233
- try {
234
- cockroachBinary = await this.getCockroachPath(version)
235
- } catch (error) {
236
- const originalMessage =
237
- error instanceof Error ? error.message : String(error)
238
- throw new Error(
239
- `CockroachDB ${version} is not installed. Run: spindb engines download cockroachdb ${version}\n` +
240
- ` Original error: ${originalMessage}`,
241
- )
242
- }
243
- }
244
-
245
- const containerDir = paths.getContainerPath(name, { engine: ENGINE })
246
- const dataDir = paths.getContainerDataPath(name, { engine: ENGINE })
247
- const logFile = join(containerDir, 'cockroach.log')
248
- const pidFile = join(containerDir, 'cockroach.pid')
249
- const httpPort = port + 1 // HTTP admin UI port
250
-
251
- onProgress?.({ stage: 'starting', message: 'Starting CockroachDB...' })
252
-
253
- logDebug(`Starting CockroachDB with data dir: ${dataDir}`)
254
-
255
- // CockroachDB start command
256
- // Using --insecure for local development (no TLS)
257
- const args = [
258
- 'start-single-node',
259
- '--insecure',
260
- '--store',
261
- dataDir,
262
- '--listen-addr',
263
- `127.0.0.1:${port}`,
264
- '--http-addr',
265
- `127.0.0.1:${httpPort}`,
266
- '--pid-file',
267
- pidFile,
268
- '--log-dir',
269
- containerDir,
270
- ]
271
-
272
- // On Unix, use --background flag which forks a daemon process
273
- // On Windows, don't use --background - Windows doesn't have the same fork model
274
- // and CockroachDB's background mode can fail silently. Instead, we detach manually.
275
- const isWindows = process.platform === 'win32'
276
- if (!isWindows) {
277
- args.push('--background')
278
- }
279
-
280
- // IMPORTANT: Use 'ignore' for all stdio on all platforms.
281
- // Using 'pipe' keeps file descriptors open which prevents proc.unref() from
282
- // allowing Node.js to exit, causing spawn timeouts even when the process starts successfully.
283
- const proc = spawn(cockroachBinary!, args, {
284
- stdio: ['ignore', 'ignore', 'ignore'],
285
- detached: true,
286
- // On Windows, set cwd to container directory to ensure proper file handle behavior
287
- cwd: isWindows ? containerDir : undefined,
288
- // On Windows, hide the console window to prevent it from blocking
289
- windowsHide: true,
290
- })
291
-
292
- // On Windows without --background, write PID file ourselves
293
- // (On Unix, --background makes CockroachDB write the daemon PID)
294
- if (isWindows && proc.pid) {
295
- try {
296
- await writeFile(pidFile, proc.pid.toString(), 'utf-8')
297
- logDebug(`Wrote PID file: ${pidFile} (pid: ${proc.pid})`)
298
- } catch (err) {
299
- // PID file write failed - kill the process and fail fast
300
- // Without the PID file, we can't stop the container later
301
- const errMsg = `Failed to write PID file: ${err instanceof Error ? err.message : String(err)}`
302
- logDebug(errMsg)
303
- try {
304
- process.kill(proc.pid, 'SIGTERM')
305
- } catch {
306
- // Process may have already exited
307
- }
308
- throw new Error(errMsg)
309
- }
310
- }
311
-
312
- // Wait for the process to spawn
313
- // On Windows, the 'spawn' event doesn't fire reliably with detached processes,
314
- // so we use a simple delay and let waitForReady() handle detection.
315
- // On Unix with --background, we wait for the spawn event.
316
- if (isWindows) {
317
- // Add error handler to catch spawn failures on Windows
318
- await new Promise<void>((resolve, reject) => {
319
- proc.on('error', (err) => {
320
- logDebug(`CockroachDB spawn error on Windows: ${err}`)
321
- reject(err)
322
- })
323
- proc.unref()
324
- logDebug(
325
- `Windows: waiting fixed delay for CockroachDB to start (pid: ${proc.pid})`,
326
- )
327
- setTimeout(resolve, 3000)
328
- })
329
- } else {
330
- const spawnTimeout = 30000 // 30 seconds to spawn
331
- await new Promise<void>((resolve, reject) => {
332
- const timeoutId = setTimeout(() => {
333
- reject(
334
- new Error(
335
- `CockroachDB process failed to spawn within ${spawnTimeout}ms`,
336
- ),
337
- )
338
- }, spawnTimeout)
339
-
340
- proc.on('error', (err) => {
341
- clearTimeout(timeoutId)
342
- logDebug(`CockroachDB spawn error: ${err}`)
343
- reject(err)
344
- })
345
- proc.on('spawn', () => {
346
- clearTimeout(timeoutId)
347
- logDebug(`CockroachDB process spawned (pid: ${proc.pid})`)
348
- proc.unref()
349
- setTimeout(resolve, 500)
350
- })
351
- })
352
- }
353
-
354
- // Wait for server to be ready
355
- // Windows needs a longer timeout since CockroachDB initialization takes more time
356
- const timeout = isWindows ? 120000 : 60000
357
- logDebug(
358
- `Waiting for CockroachDB server to be ready on port ${port}... (timeout: ${timeout}ms)`,
359
- )
360
- const ready = await this.waitForReady(port, version, timeout)
361
- logDebug(`waitForReady returned: ${ready}`)
362
-
363
- if (!ready) {
364
- // Clean up the spawned process and PID file before throwing
365
- try {
366
- const pidStr = await readFile(pidFile, 'utf-8').catch(() => null)
367
- if (pidStr) {
368
- const pid = parseInt(pidStr.trim(), 10)
369
- if (!isNaN(pid)) {
370
- logDebug(`Cleaning up failed CockroachDB process (pid: ${pid})`)
371
- await platformService.terminateProcess(pid, true)
372
- }
373
- }
374
- await unlink(pidFile).catch(() => {})
375
- } catch {
376
- // Ignore cleanup errors
377
- }
378
- throw new Error(
379
- `CockroachDB failed to start within timeout. Check logs at: ${logFile}`,
380
- )
381
- }
382
-
383
- return {
384
- port,
385
- connectionString: this.getConnectionString(container),
386
- }
387
- }
388
-
389
- // Wait for CockroachDB to be ready
390
- private async waitForReady(
391
- port: number,
392
- version: string,
393
- timeoutMs = 60000,
394
- ): Promise<boolean> {
395
- logDebug(`waitForReady called for port ${port}, version ${version}`)
396
- const startTime = Date.now()
397
- const checkInterval = 500
398
-
399
- let cockroach: string
400
- try {
401
- logDebug('Getting cockroach binary path...')
402
- cockroach = await this.getCockroachPath(version)
403
- logDebug(`Got cockroach binary path: ${cockroach}`)
404
- } catch (err) {
405
- const errorMessage = err instanceof Error ? err.message : String(err)
406
- logDebug(`Error getting cockroach binary path: ${errorMessage}`)
407
- logWarning(
408
- `CockroachDB binary not found, cannot verify server is ready: ${errorMessage}`,
409
- )
410
- return false
411
- }
412
-
413
- logDebug(`Starting connection loop, timeout: ${timeoutMs}ms`)
414
- let attempt = 0
415
- while (Date.now() - startTime < timeoutMs) {
416
- attempt++
417
- logDebug(`Connection attempt ${attempt}...`)
418
- try {
419
- const args = [
420
- 'sql',
421
- '--insecure',
422
- '--host',
423
- `127.0.0.1:${port}`,
424
- '--execute',
425
- 'SELECT 1',
426
- ]
427
- await new Promise<void>((resolve, reject) => {
428
- const proc = spawn(cockroach, args, {
429
- stdio: ['ignore', 'pipe', 'pipe'],
430
- })
431
- proc.on('close', (code) => {
432
- logDebug(`Client process closed with code ${code}`)
433
- if (code === 0) resolve()
434
- else reject(new Error(`Exit code ${code}`))
435
- })
436
- proc.on('error', (err) => {
437
- logDebug(`Client process error: ${err}`)
438
- reject(err)
439
- })
440
- })
441
- logDebug(`CockroachDB ready on port ${port}`)
442
- return true
443
- } catch (err) {
444
- logDebug(`Attempt ${attempt} failed: ${err}`)
445
- await new Promise((resolve) => setTimeout(resolve, checkInterval))
446
- }
447
- }
448
-
449
- logWarning(`CockroachDB did not become ready within ${timeoutMs}ms`)
450
- return false
451
- }
452
-
453
- /**
454
- * Stop CockroachDB server
455
- */
456
- async stop(container: ContainerConfig): Promise<void> {
457
- const { name, port } = container
458
- const containerDir = paths.getContainerPath(name, { engine: ENGINE })
459
- const pidFile = join(containerDir, 'cockroach.pid')
460
-
461
- logDebug(`Stopping CockroachDB container "${name}" on port ${port}`)
462
-
463
- // Find PID by checking the process using cross-platform helper
464
- let pid: number | null = null
465
-
466
- // Try to find CockroachDB process by port
467
- try {
468
- const pids = await platformService.findProcessByPort(port)
469
- if (pids.length > 0) {
470
- pid = pids[0]
471
- }
472
- } catch {
473
- // Ignore
474
- }
475
-
476
- // Kill process if found
477
- if (pid && platformService.isProcessRunning(pid)) {
478
- logDebug(`Killing CockroachDB process ${pid}`)
479
- try {
480
- await platformService.terminateProcess(pid, false)
481
- // Wait for graceful termination
482
- // On Windows, CockroachDB's RocksDB uses memory-mapped files that
483
- // take longer to release, so we wait longer to avoid EBUSY errors
484
- const gracefulWait = process.platform === 'win32' ? 5000 : 2000
485
- await new Promise((resolve) => setTimeout(resolve, gracefulWait))
486
-
487
- if (platformService.isProcessRunning(pid)) {
488
- logWarning(`Graceful termination failed, force killing ${pid}`)
489
- await platformService.terminateProcess(pid, true)
490
- // Additional wait after force kill on Windows for file handle release
491
- if (process.platform === 'win32') {
492
- await new Promise((resolve) => setTimeout(resolve, 3000))
493
- }
494
- }
495
- } catch (error) {
496
- logDebug(`Process termination error: ${error}`)
497
- }
498
- }
499
-
500
- // Cleanup PID file
501
- if (existsSync(pidFile)) {
502
- try {
503
- await unlink(pidFile)
504
- } catch {
505
- // Ignore
506
- }
507
- }
508
-
509
- // Kill pgweb if running for this container
510
- await this.stopPgweb(name)
511
-
512
- logDebug('CockroachDB stopped')
513
- }
514
-
515
- // Get CockroachDB server status
516
- async status(container: ContainerConfig): Promise<StatusResult> {
517
- const { port, version } = container
518
-
519
- // Try to connect
520
- try {
521
- const cockroach = await this.getCockroachPath(version)
522
- const args = [
523
- 'sql',
524
- '--insecure',
525
- '--host',
526
- `127.0.0.1:${port}`,
527
- '--execute',
528
- 'SELECT 1',
529
- ]
530
- await new Promise<void>((resolve, reject) => {
531
- const proc = spawn(cockroach, args, {
532
- stdio: ['ignore', 'pipe', 'pipe'],
533
- })
534
- proc.on('close', (code) => {
535
- if (code === 0) resolve()
536
- else reject(new Error(`Exit code ${code}`))
537
- })
538
- proc.on('error', reject)
539
- })
540
- return { running: true, message: 'CockroachDB is running' }
541
- } catch {
542
- return { running: false, message: 'CockroachDB is not running' }
543
- }
544
- }
545
-
546
- // Detect backup format
547
- async detectBackupFormat(filePath: string): Promise<BackupFormat> {
548
- return detectBackupFormatImpl(filePath)
549
- }
550
-
551
- /**
552
- * Restore a backup
553
- */
554
- async restore(
555
- container: ContainerConfig,
556
- backupPath: string,
557
- options: { database?: string; clean?: boolean } = {},
558
- ): Promise<RestoreResult> {
559
- const { name, port, version } = container
560
-
561
- return restoreBackup(backupPath, {
562
- containerName: name,
563
- port,
564
- database: options.database || container.database || 'defaultdb',
565
- version,
566
- clean: options.clean,
567
- })
568
- }
569
-
570
- /**
571
- * Get connection string
572
- * Format: postgresql://root@127.0.0.1:PORT/DATABASE?sslmode=disable
573
- */
574
- getConnectionString(container: ContainerConfig, database?: string): string {
575
- const { port } = container
576
- const db = database || container.database || 'defaultdb'
577
- return `postgresql://root@127.0.0.1:${port}/${db}?sslmode=disable`
578
- }
579
-
580
- // Open cockroach sql interactive shell
581
- async connect(container: ContainerConfig, database?: string): Promise<void> {
582
- const { port, version } = container
583
- const db = database || container.database || 'defaultdb'
584
-
585
- const cockroach = await this.getCockroachPath(version)
586
-
587
- const spawnOptions: SpawnOptions = {
588
- stdio: 'inherit',
589
- }
590
-
591
- return new Promise((resolve, reject) => {
592
- const proc = spawn(
593
- cockroach,
594
- ['sql', '--insecure', '--host', `127.0.0.1:${port}`, '--database', db],
595
- spawnOptions,
596
- )
597
-
598
- proc.on('error', reject)
599
- proc.on('close', () => resolve())
600
- })
601
- }
602
-
603
- /**
604
- * Create a new database
605
- */
606
- async createDatabase(
607
- container: ContainerConfig,
608
- database: string,
609
- ): Promise<void> {
610
- const { port, version } = container
611
-
612
- // Validate database identifier to prevent SQL injection
613
- validateCockroachIdentifier(database, 'database')
614
- const escapedDb = escapeCockroachIdentifier(database)
615
-
616
- const cockroach = await this.getCockroachPath(version)
617
-
618
- const args = [
619
- 'sql',
620
- '--insecure',
621
- '--host',
622
- `127.0.0.1:${port}`,
623
- '--execute',
624
- `CREATE DATABASE IF NOT EXISTS ${escapedDb}`,
625
- ]
626
-
627
- await new Promise<void>((resolve, reject) => {
628
- const proc = spawn(cockroach, args, {
629
- stdio: ['ignore', 'pipe', 'pipe'],
630
- })
631
-
632
- let stderr = ''
633
- proc.stderr?.on('data', (data: Buffer) => {
634
- stderr += data.toString()
635
- })
636
-
637
- proc.on('close', (code) => {
638
- if (code === 0) {
639
- logDebug(`Created CockroachDB database: ${database}`)
640
- resolve()
641
- } else {
642
- reject(new Error(`Failed to create database: ${stderr}`))
643
- }
644
- })
645
- proc.on('error', reject)
646
- })
647
- }
648
-
649
- /**
650
- * Drop a database
651
- */
652
- async dropDatabase(
653
- container: ContainerConfig,
654
- database: string,
655
- ): Promise<void> {
656
- const { port, version } = container
657
-
658
- // Don't allow dropping system databases
659
- const systemDatabases = ['defaultdb', 'postgres', 'system']
660
- if (systemDatabases.includes(database.toLowerCase())) {
661
- throw new Error(`Cannot drop system database: ${database}`)
662
- }
663
-
664
- // Validate database identifier to prevent SQL injection
665
- validateCockroachIdentifier(database, 'database')
666
- const escapedDb = escapeCockroachIdentifier(database)
667
-
668
- const cockroach = await this.getCockroachPath(version)
669
-
670
- const args = [
671
- 'sql',
672
- '--insecure',
673
- '--host',
674
- `127.0.0.1:${port}`,
675
- '--execute',
676
- `DROP DATABASE IF EXISTS ${escapedDb}`,
677
- ]
678
-
679
- await new Promise<void>((resolve, reject) => {
680
- const proc = spawn(cockroach, args, {
681
- stdio: ['ignore', 'pipe', 'pipe'],
682
- })
683
-
684
- let stderr = ''
685
- proc.stderr?.on('data', (data: Buffer) => {
686
- stderr += data.toString()
687
- })
688
-
689
- proc.on('close', (code) => {
690
- if (code === 0) {
691
- logDebug(`Dropped CockroachDB database: ${database}`)
692
- resolve()
693
- } else {
694
- reject(new Error(`Failed to drop database: ${stderr}`))
695
- }
696
- })
697
- proc.on('error', reject)
698
- })
699
- }
700
-
701
- /**
702
- * Get the database size in bytes
703
- */
704
- async getDatabaseSize(container: ContainerConfig): Promise<number | null> {
705
- const { port, version, database } = container
706
- const db = database || 'defaultdb'
707
-
708
- try {
709
- const cockroach = await this.getCockroachPath(version)
710
- validateCockroachIdentifier(db, 'database')
711
-
712
- // CockroachDB query to get database size
713
- const query = `SELECT sum(range_size_mb) * 1024 * 1024 as size_bytes FROM [SHOW RANGES FROM DATABASE ${escapeCockroachIdentifier(db)}]`
714
-
715
- const result = await new Promise<string>((resolve, reject) => {
716
- const args = [
717
- 'sql',
718
- '--insecure',
719
- '--host',
720
- `127.0.0.1:${port}`,
721
- '--database',
722
- db,
723
- '--execute',
724
- query,
725
- '--format=csv',
726
- ]
727
-
728
- const proc = spawn(cockroach, args, {
729
- stdio: ['ignore', 'pipe', 'pipe'],
730
- })
731
-
732
- let stdout = ''
733
- proc.stdout?.on('data', (data: Buffer) => {
734
- stdout += data.toString()
735
- })
736
-
737
- proc.on('close', (code) => {
738
- if (code === 0) resolve(stdout.trim())
739
- else reject(new Error(`Exit code ${code}`))
740
- })
741
- proc.on('error', reject)
742
- })
743
-
744
- // Parse CSV output - skip header
745
- const lines = result.split('\n')
746
- if (lines.length >= 2) {
747
- const size = parseFloat(lines[1])
748
- return isNaN(size) ? null : Math.round(size)
749
- }
750
-
751
- return null
752
- } catch {
753
- return null
754
- }
755
- }
756
-
757
- /**
758
- * Dump from a remote CockroachDB connection
759
- * Uses cockroach sql to export schema and data
760
- *
761
- * Connection string format: postgresql://[user[:password]@]host[:port][/database][?sslmode=...]
762
- *
763
- * Supports both insecure (local dev) and secure (production) connections:
764
- * - sslmode=disable or localhost without sslmode: uses --insecure flag
765
- * - Other SSL modes: passes connection string directly (handles certs via URL params)
766
- */
767
- async dumpFromConnectionString(
768
- connectionString: string,
769
- outputPath: string,
770
- ): Promise<DumpResult> {
771
- // Parse connection string
772
- let url: URL
773
- try {
774
- url = new URL(connectionString)
775
- } catch {
776
- // Redact credentials before including in error message
777
- const sanitized = connectionString.replace(/\/\/([^@]+)@/, '//***@')
778
- throw new Error(
779
- `Invalid connection string: ${sanitized}\n` +
780
- 'Expected format: postgresql://[user[:password]@]host[:port][/database][?sslmode=...]',
781
- )
782
- }
783
-
784
- const host = url.hostname || '127.0.0.1'
785
- const port = parseInt(url.port, 10) || 26257
786
- const database = url.pathname.replace(/^\//, '') || 'defaultdb'
787
-
788
- logDebug(
789
- `Connecting to remote CockroachDB at ${host}:${port} (db: ${database})`,
790
- )
791
-
792
- // For remote dump, we need a local cockroach binary
793
- // Try multiple methods to find an installed version
794
- let cockroach: string | null = null
795
-
796
- // 1. Try 'cockroach' key in config
797
- const cachedCockroach = await configManager.getBinaryPath('cockroach')
798
- if (cachedCockroach && existsSync(cachedCockroach)) {
799
- cockroach = cachedCockroach
800
- logDebug(
801
- `Found cockroach binary via 'cockroach' config key: ${cockroach}`,
802
- )
803
- }
804
-
805
- // 2. Try to find via dependency manager (checks config + system PATH)
806
- if (!cockroach) {
807
- const binaryResult = await findBinary('cockroach')
808
- if (binaryResult?.path && existsSync(binaryResult.path)) {
809
- cockroach = binaryResult.path
810
- logDebug(`Found cockroach binary via dependency manager: ${cockroach}`)
811
- }
812
- }
813
-
814
- // 3. Try to use any downloaded version via getCockroachPath
815
- if (!cockroach) {
816
- for (const version of SUPPORTED_MAJOR_VERSIONS) {
817
- try {
818
- cockroach = await this.getCockroachPath(version)
819
- logDebug(
820
- `Found cockroach binary for version ${version}: ${cockroach}`,
821
- )
822
- break
823
- } catch {
824
- // Version not installed, try next
825
- }
826
- }
827
- }
828
-
829
- if (!cockroach) {
830
- throw new Error(
831
- 'CockroachDB binary not found. Run: spindb engines download cockroachdb 25\n' +
832
- 'A local CockroachDB binary is needed to dump from remote connections.',
833
- )
834
- }
835
-
836
- const lines: string[] = []
837
- lines.push('-- CockroachDB backup generated by SpinDB')
838
- lines.push(`-- Source: ${host}:${port}`)
839
- lines.push(`-- Database: ${database}`)
840
- lines.push(`-- Date: ${new Date().toISOString()}`)
841
- lines.push('')
842
-
843
- // Build connection args using --url to preserve auth/SSL settings
844
- const connArgs = ['sql', '--url', connectionString]
845
-
846
- // Only add --insecure for local dev or explicit sslmode=disable
847
- if (isInsecureConnection(connectionString)) {
848
- connArgs.push('--insecure')
849
- }
850
-
851
- // Get list of tables
852
- const tablesQuery = `SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE' ORDER BY table_name`
853
- const tablesResult = await this.execRemoteQuery(
854
- cockroach,
855
- connArgs,
856
- tablesQuery,
857
- )
858
- // Parse CSV output properly to handle quoted identifiers
859
- const tableRecords = parseCsvRecords(tablesResult, true) // Skip header
860
- const tables = tableRecords
861
- .map((line) => {
862
- const fields = parseCsvLine(line)
863
- return fields.length > 0 ? fields[0].value : ''
864
- })
865
- .filter((t) => t)
866
-
867
- logDebug(`Found ${tables.length} tables in database ${database}`)
868
-
869
- for (const table of tables) {
870
- // Table names from information_schema are safe (already unquoted by CSV parser)
871
- // Only validate that we got a non-empty name
872
- if (!table) {
873
- continue
874
- }
875
-
876
- lines.push(`-- Table: ${table}`)
877
- lines.push('')
878
-
879
- // Get CREATE TABLE - use proper identifier escaping
880
- try {
881
- const createQuery = `SHOW CREATE TABLE ${escapeCockroachIdentifier(table)}`
882
- const createResult = await this.execRemoteQuery(
883
- cockroach,
884
- connArgs,
885
- createQuery,
886
- )
887
- // Parse CSV output safely using record-aware parser
888
- // Format is: table_name,create_statement (create statement may contain newlines)
889
- const createRecords = parseCsvRecords(createResult, true) // Skip header
890
- if (createRecords.length > 0) {
891
- const columns = parseCsvLine(createRecords[0])
892
- if (columns.length >= 2) {
893
- // Second column is the CREATE TABLE statement
894
- const createStatement = columns[1].value.trim()
895
- lines.push(createStatement + ';')
896
- } else {
897
- logWarning(`Unexpected SHOW CREATE TABLE output for ${table}`)
898
- }
899
- }
900
- lines.push('')
901
- } catch (error) {
902
- logWarning(`Could not get CREATE TABLE for ${table}: ${error}`)
903
- continue
904
- }
905
-
906
- // Export table data
907
- try {
908
- // Get column names first
909
- // Escape single quotes in table name for string literal comparison
910
- const escapedTableForString = table.replace(/'/g, "''")
911
- const columnsQuery = `SELECT column_name FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '${escapedTableForString}' ORDER BY ordinal_position`
912
- const columnsResult = await this.execRemoteQuery(
913
- cockroach,
914
- connArgs,
915
- columnsQuery,
916
- )
917
- // Parse each CSV record properly to handle quoted column names
918
- const columnRecords = parseCsvRecords(columnsResult, true) // Skip header
919
- const columns = columnRecords
920
- .map((record) => {
921
- const fields = parseCsvLine(record)
922
- return fields.length > 0 ? fields[0].value.trim() : ''
923
- })
924
- .filter((c) => c)
925
-
926
- if (columns.length === 0) {
927
- logDebug(`No columns found for table ${table}, skipping data export`)
928
- continue
929
- }
930
-
931
- // Get all rows - use proper identifier escaping
932
- const dataQuery = `SELECT * FROM ${escapeCockroachIdentifier(table)}`
933
- const dataResult = await this.execRemoteQuery(
934
- cockroach,
935
- connArgs,
936
- dataQuery,
937
- )
938
- // Use record-aware parser to handle fields with embedded newlines
939
- const dataRecords = parseCsvRecords(dataResult, true) // Skip header
940
-
941
- if (dataRecords.length > 0) {
942
- lines.push(`-- Data for ${table}`)
943
-
944
- for (const dataRecord of dataRecords) {
945
- const fields = parseCsvLine(dataRecord)
946
- if (fields.length !== columns.length) {
947
- logWarning(
948
- `Column count mismatch for table ${table}: expected ${columns.length}, got ${fields.length}`,
949
- )
950
- continue
951
- }
952
-
953
- const escapedCols = columns
954
- .map((c) => escapeCockroachIdentifier(c))
955
- .join(', ')
956
- const escapedVals = fields
957
- .map((f) => escapeSqlValue(f.value, f.wasQuoted))
958
- .join(', ')
959
- lines.push(
960
- `INSERT INTO ${escapeCockroachIdentifier(table)} (${escapedCols}) VALUES (${escapedVals});`,
961
- )
962
- }
963
- lines.push('')
964
- }
965
- } catch (error) {
966
- logWarning(`Could not export data for table ${table}: ${error}`)
967
- }
968
- }
969
-
970
- // Write to file
971
- const content = lines.join('\n')
972
- await writeFile(outputPath, content, 'utf-8')
973
-
974
- return {
975
- filePath: outputPath,
976
- warnings:
977
- tables.length === 0
978
- ? [`Database '${database}' has no tables`]
979
- : undefined,
980
- }
981
- }
982
-
983
- // Helper to execute a query on a remote CockroachDB
984
- private async execRemoteQuery(
985
- cockroach: string,
986
- connArgs: string[],
987
- query: string,
988
- ): Promise<string> {
989
- return new Promise((resolve, reject) => {
990
- const args = [...connArgs, '--execute', query, '--format=csv']
991
-
992
- const proc = spawn(cockroach, args, {
993
- stdio: ['ignore', 'pipe', 'pipe'],
994
- })
995
-
996
- let stdout = ''
997
- let stderr = ''
998
-
999
- proc.stdout.on('data', (data: Buffer) => {
1000
- stdout += data.toString()
1001
- })
1002
- proc.stderr.on('data', (data: Buffer) => {
1003
- stderr += data.toString()
1004
- })
1005
-
1006
- proc.on('close', (code) => {
1007
- if (code === 0) {
1008
- resolve(stdout)
1009
- } else {
1010
- reject(new Error(stderr || `Exit code ${code}`))
1011
- }
1012
- })
1013
- proc.on('error', reject)
1014
- })
1015
- }
1016
-
1017
- // Create a backup
1018
- async backup(
1019
- container: ContainerConfig,
1020
- outputPath: string,
1021
- options: BackupOptions,
1022
- ): Promise<BackupResult> {
1023
- return createBackup(container, outputPath, options)
1024
- }
1025
-
1026
- // Run a SQL file or inline SQL statement
1027
- async runScript(
1028
- container: ContainerConfig,
1029
- options: { file?: string; sql?: string; database?: string },
1030
- ): Promise<void> {
1031
- const { port, version } = container
1032
- const db = options.database || container.database || 'defaultdb'
1033
-
1034
- const cockroach = await this.getCockroachPath(version)
1035
-
1036
- if (options.file) {
1037
- // Run SQL file
1038
- const args = [
1039
- 'sql',
1040
- '--insecure',
1041
- '--host',
1042
- `127.0.0.1:${port}`,
1043
- '--database',
1044
- db,
1045
- '--file',
1046
- options.file,
1047
- ]
1048
-
1049
- await new Promise<void>((resolve, reject) => {
1050
- const proc = spawn(cockroach, args, {
1051
- stdio: 'inherit',
1052
- })
1053
-
1054
- proc.on('error', reject)
1055
- proc.on('close', (code) => {
1056
- if (code === 0) {
1057
- resolve()
1058
- } else if (code === null) {
1059
- reject(new Error('cockroach sql was terminated by a signal'))
1060
- } else {
1061
- reject(new Error(`cockroach sql exited with code ${code}`))
1062
- }
1063
- })
1064
- })
1065
- } else if (options.sql) {
1066
- // Run inline SQL via stdin
1067
- const args = [
1068
- 'sql',
1069
- '--insecure',
1070
- '--host',
1071
- `127.0.0.1:${port}`,
1072
- '--database',
1073
- db,
1074
- ]
1075
-
1076
- await new Promise<void>((resolve, reject) => {
1077
- const proc = spawn(cockroach, args, {
1078
- stdio: ['pipe', 'inherit', 'inherit'],
1079
- })
1080
-
1081
- proc.on('error', reject)
1082
- proc.on('close', (code) => {
1083
- if (code === 0) {
1084
- resolve()
1085
- } else if (code === null) {
1086
- reject(new Error('cockroach sql was terminated by a signal'))
1087
- } else {
1088
- reject(new Error(`cockroach sql exited with code ${code}`))
1089
- }
1090
- })
1091
-
1092
- proc.stdin?.write(options.sql)
1093
- proc.stdin?.end()
1094
- })
1095
- } else {
1096
- throw new Error('Either file or sql option must be provided')
1097
- }
1098
- }
1099
-
1100
- /**
1101
- * Execute a SQL query and return structured results
1102
- */
1103
- async executeQuery(
1104
- container: ContainerConfig,
1105
- query: string,
1106
- options?: QueryOptions,
1107
- ): Promise<QueryResult> {
1108
- const { port, version } = container
1109
- const db = options?.database || container.database || 'defaultdb'
1110
-
1111
- const cockroach = await this.getCockroachPath(version)
1112
-
1113
- return new Promise((resolve, reject) => {
1114
- const args = [
1115
- 'sql',
1116
- '--insecure',
1117
- '--host',
1118
- `127.0.0.1:${port}`,
1119
- '--database',
1120
- db,
1121
- '--execute',
1122
- query,
1123
- '--format=csv',
1124
- ]
1125
-
1126
- const proc = spawn(cockroach, args, {
1127
- stdio: ['ignore', 'pipe', 'pipe'],
1128
- })
1129
-
1130
- let stdout = ''
1131
- let stderr = ''
1132
-
1133
- proc.stdout?.on('data', (data: Buffer) => {
1134
- stdout += data.toString()
1135
- })
1136
- proc.stderr?.on('data', (data: Buffer) => {
1137
- stderr += data.toString()
1138
- })
1139
-
1140
- proc.on('error', reject)
1141
-
1142
- proc.on('close', (code) => {
1143
- if (code !== 0) {
1144
- reject(new Error(stderr || `cockroach sql exited with code ${code}`))
1145
- return
1146
- }
1147
-
1148
- try {
1149
- resolve(parseCSVToQueryResult(stdout))
1150
- } catch (error) {
1151
- reject(
1152
- new Error(
1153
- `Failed to parse query result: ${error instanceof Error ? error.message : error}`,
1154
- ),
1155
- )
1156
- }
1157
- })
1158
- })
1159
- }
1160
-
1161
- /**
1162
- * List all user databases, excluding system databases (defaultdb, postgres, system).
1163
- */
1164
- async listDatabases(container: ContainerConfig): Promise<string[]> {
1165
- const { port, version } = container
1166
- const cockroach = await this.getCockroachPath(version)
1167
-
1168
- return new Promise((resolve, reject) => {
1169
- const args = [
1170
- 'sql',
1171
- '--insecure',
1172
- '--host',
1173
- `127.0.0.1:${port}`,
1174
- '--execute',
1175
- `SHOW DATABASES`,
1176
- '--format=csv',
1177
- ]
1178
-
1179
- const proc = spawn(cockroach, args, {
1180
- stdio: ['ignore', 'pipe', 'pipe'],
1181
- })
1182
-
1183
- let stdout = ''
1184
- let stderr = ''
1185
-
1186
- proc.stdout?.on('data', (data: Buffer) => {
1187
- stdout += data.toString()
1188
- })
1189
- proc.stderr?.on('data', (data: Buffer) => {
1190
- stderr += data.toString()
1191
- })
1192
-
1193
- proc.on('error', reject)
1194
-
1195
- proc.on('close', (code) => {
1196
- if (code !== 0) {
1197
- reject(new Error(stderr || `cockroach sql exited with code ${code}`))
1198
- return
1199
- }
1200
-
1201
- // Parse CSV output (first column is database_name, skip header)
1202
- const systemDatabases = ['defaultdb', 'postgres', 'system']
1203
- const lines = stdout.trim().split('\n')
1204
- const databases = lines
1205
- .slice(1) // Skip header
1206
- .map((line) => line.split(',')[0].trim())
1207
- .filter((db) => db.length > 0 && !systemDatabases.includes(db))
1208
-
1209
- resolve(databases)
1210
- })
1211
- })
1212
- }
1213
-
1214
- async createUser(
1215
- container: ContainerConfig,
1216
- options: CreateUserOptions,
1217
- ): Promise<UserCredentials> {
1218
- const { username, password, database } = options
1219
- assertValidUsername(username)
1220
- const { port, version } = container
1221
- const db = database || container.database || 'defaultdb'
1222
-
1223
- validateCockroachIdentifier(username, 'user')
1224
- validateCockroachIdentifier(db, 'database')
1225
- const escapedUser = escapeCockroachIdentifier(username)
1226
- const escapedDb = escapeCockroachIdentifier(db)
1227
-
1228
- const cockroach = await this.getCockroachPath(version)
1229
-
1230
- // CockroachDB in insecure mode doesn't support passwords.
1231
- // Create user without password and grant privileges.
1232
- // SQL is sent via stdin to avoid shell escaping issues with --execute.
1233
- const sql = `CREATE USER IF NOT EXISTS ${escapedUser}; GRANT ALL ON DATABASE ${escapedDb} TO ${escapedUser};`
1234
-
1235
- const args = ['sql', '--insecure', '--host', `127.0.0.1:${port}`]
1236
-
1237
- await new Promise<void>((resolve, reject) => {
1238
- const proc = spawn(cockroach, args, {
1239
- stdio: ['pipe', 'pipe', 'pipe'],
1240
- })
1241
-
1242
- let stderr = ''
1243
- proc.stderr?.on('data', (data: Buffer) => {
1244
- stderr += data.toString()
1245
- })
1246
-
1247
- proc.on('close', (code) => {
1248
- if (code === 0) {
1249
- resolve()
1250
- } else {
1251
- reject(new Error(`Failed to create user: ${stderr}`))
1252
- }
1253
- })
1254
- proc.on('error', reject)
1255
-
1256
- proc.stdin?.write(sql)
1257
- proc.stdin?.end()
1258
- })
1259
-
1260
- // In insecure mode, connections don't use passwords
1261
- const connectionString = `postgresql://${encodeURIComponent(username)}@127.0.0.1:${port}/${db}?sslmode=disable`
1262
-
1263
- return {
1264
- username,
1265
- // CockroachDB insecure mode does not enforce password authentication,
1266
- // but we return the caller-provided password for credential file consistency.
1267
- password,
1268
- connectionString,
1269
- engine: container.engine,
1270
- container: container.name,
1271
- database: db,
1272
- }
1273
- }
1274
- }
1275
-
1276
- export const cockroachdbEngine = new CockroachDBEngine()