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
@@ -0,0 +1,1414 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { rm } from 'fs/promises';
4
+ import { existsSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { execFile } from 'child_process';
7
+ import { promisify } from 'util';
8
+ import inquirer from 'inquirer';
9
+ import { containerManager } from '../../core/container-manager.js';
10
+ import { processManager } from '../../core/process-manager.js';
11
+ import { configManager } from '../../core/config-manager.js';
12
+ import { getEngine } from '../../engines/index.js';
13
+ import { postgresqlBinaryManager } from '../../engines/postgresql/binary-manager.js';
14
+ import { paths } from '../../config/paths.js';
15
+ import { platformService } from '../../core/platform-service.js';
16
+ import { detectPackageManager, findBinary, } from '../../core/dependency-manager.js';
17
+ import { getRequiredClientTools, getPackagesForTools, } from '../../core/hostdb-metadata.js';
18
+ import { promptConfirm } from '../ui/prompts.js';
19
+ import { createSpinner } from '../ui/spinner.js';
20
+ import { uiError, uiWarning, uiInfo, formatBytes } from '../ui/theme.js';
21
+ import { getEngineIcon } from '../constants.js';
22
+ import { getInstalledEngines, getInstalledPostgresEngines, getEngineMetadata, } from '../helpers.js';
23
+ import { Engine, Platform, ALL_ENGINES } from '../../types/index.js';
24
+ import { loadEnginesJson, filterEnginesByPlatform, } from '../../config/engines-registry.js';
25
+ import { mysqlBinaryManager } from '../../engines/mysql/binary-manager.js';
26
+ import { mariadbBinaryManager } from '../../engines/mariadb/binary-manager.js';
27
+ import { mongodbBinaryManager } from '../../engines/mongodb/binary-manager.js';
28
+ import { redisBinaryManager } from '../../engines/redis/binary-manager.js';
29
+ import { valkeyBinaryManager } from '../../engines/valkey/binary-manager.js';
30
+ import { sqliteBinaryManager } from '../../engines/sqlite/binary-manager.js';
31
+ import { duckdbBinaryManager } from '../../engines/duckdb/binary-manager.js';
32
+ import { clickhouseBinaryManager } from '../../engines/clickhouse/binary-manager.js';
33
+ import { qdrantBinaryManager } from '../../engines/qdrant/binary-manager.js';
34
+ import { meilisearchBinaryManager } from '../../engines/meilisearch/binary-manager.js';
35
+ import { ferretdbBinaryManager } from '../../engines/ferretdb/binary-manager.js';
36
+ import { couchdbBinaryManager } from '../../engines/couchdb/binary-manager.js';
37
+ import { cockroachdbBinaryManager } from '../../engines/cockroachdb/binary-manager.js';
38
+ import { surrealdbBinaryManager } from '../../engines/surrealdb/binary-manager.js';
39
+ import { questdbBinaryManager } from '../../engines/questdb/binary-manager.js';
40
+ import { typedbBinaryManager } from '../../engines/typedb/binary-manager.js';
41
+ import { influxdbBinaryManager } from '../../engines/influxdb/binary-manager.js';
42
+ import { weaviateBinaryManager } from '../../engines/weaviate/binary-manager.js';
43
+ import { tigerbeetleBinaryManager } from '../../engines/tigerbeetle/binary-manager.js';
44
+ import { DEFAULT_DOCUMENTDB_VERSION, DEFAULT_V1_POSTGRESQL_VERSION, normalizeDocumentDBVersion, isV1, } from '../../engines/ferretdb/version-maps.js';
45
+ const execFileAsync = promisify(execFile);
46
+ /**
47
+ * Check which client tools are bundled in the downloaded binaries
48
+ * @param binPath Path to the extracted binary directory
49
+ * @param tools List of tool names to check
50
+ * @returns Array of tools that were found bundled
51
+ */
52
+ function checkBundledTools(binPath, tools) {
53
+ const ext = platformService.getExecutableExtension();
54
+ const bundled = [];
55
+ for (const tool of tools) {
56
+ const toolPath = join(binPath, 'bin', `${tool}${ext}`);
57
+ if (existsSync(toolPath)) {
58
+ bundled.push(tool);
59
+ }
60
+ }
61
+ return bundled;
62
+ }
63
+ /**
64
+ * Install missing client tools using the system package manager
65
+ * Uses hostdb's downloads.json to determine the correct packages
66
+ *
67
+ * @param engine Engine name (e.g., 'postgresql', 'mysql')
68
+ * @param bundledTools Tools already bundled with the downloaded binaries
69
+ * @param onProgress Progress callback for UI updates
70
+ */
71
+ async function installMissingClientTools(engine, bundledTools, onProgress) {
72
+ const installed = [];
73
+ const failed = [];
74
+ const skipped = [];
75
+ const needsPathRefresh = [];
76
+ // Timeout for package installation commands (5 minutes)
77
+ const INSTALL_TIMEOUT_MS = 5 * 60 * 1000;
78
+ // Get required client tools from hostdb databases.json
79
+ const requiredTools = await getRequiredClientTools(engine);
80
+ if (requiredTools.length === 0) {
81
+ return { installed, failed, skipped, needsPathRefresh };
82
+ }
83
+ // Find which tools are missing (not bundled and not already installed)
84
+ const missingTools = [];
85
+ for (const tool of requiredTools) {
86
+ if (bundledTools.includes(tool)) {
87
+ // Already bundled in the download
88
+ continue;
89
+ }
90
+ // Check if already installed on system
91
+ const existing = await findBinary(tool);
92
+ if (existing) {
93
+ // Register it in config and skip installation
94
+ await configManager.setBinaryPath(tool, existing.path, 'system');
95
+ skipped.push(tool);
96
+ continue;
97
+ }
98
+ missingTools.push(tool);
99
+ }
100
+ if (missingTools.length === 0) {
101
+ return { installed, failed, skipped, needsPathRefresh };
102
+ }
103
+ // Detect package manager
104
+ const pm = await detectPackageManager();
105
+ if (!pm) {
106
+ // No package manager available, all missing tools fail
107
+ return { installed, failed: missingTools, skipped, needsPathRefresh };
108
+ }
109
+ // Explicit mapping from package manager name variants to canonical keys
110
+ const PACKAGE_MANAGER_ALIASES = {
111
+ // Homebrew
112
+ brew: 'brew',
113
+ homebrew: 'brew',
114
+ // APT
115
+ apt: 'apt',
116
+ 'apt-get': 'apt',
117
+ aptget: 'apt',
118
+ // YUM
119
+ yum: 'yum',
120
+ // DNF
121
+ dnf: 'dnf',
122
+ // Chocolatey
123
+ choco: 'choco',
124
+ chocolatey: 'choco',
125
+ };
126
+ const lookupKey = pm.name.toLowerCase().trim();
127
+ const pmKey = PACKAGE_MANAGER_ALIASES[lookupKey];
128
+ if (!pmKey) {
129
+ // Unknown package manager, cannot install automatically
130
+ console.warn(`Unknown package manager: ${pm.name}, skipping automatic installation`);
131
+ return { installed, failed: missingTools, skipped, needsPathRefresh };
132
+ }
133
+ // Get the packages needed for missing tools
134
+ const packages = await getPackagesForTools(missingTools, pmKey);
135
+ // Pattern for validating package names (prevents command injection)
136
+ // Allows alphanumeric, @, ., _, -, / (for scoped packages and paths)
137
+ const SAFE_PACKAGE_PATTERN = /^[@a-zA-Z0-9][a-zA-Z0-9._/-]*$/;
138
+ // Check if running as root (no sudo needed)
139
+ const isRoot = process.getuid?.() === 0;
140
+ for (const pkg of packages) {
141
+ // Validate package name to prevent command injection
142
+ if (!SAFE_PACKAGE_PATTERN.test(pkg.package)) {
143
+ console.warn(`Skipping invalid package name: ${pkg.package}`);
144
+ failed.push(...pkg.tools);
145
+ continue;
146
+ }
147
+ // Also validate tap if present
148
+ if (pkg.tap && !SAFE_PACKAGE_PATTERN.test(pkg.tap)) {
149
+ console.warn(`Skipping invalid tap name: ${pkg.tap}`);
150
+ failed.push(...pkg.tools);
151
+ continue;
152
+ }
153
+ onProgress?.(`Installing ${pkg.package} (provides: ${pkg.tools.join(', ')})...`);
154
+ try {
155
+ // Handle Homebrew taps
156
+ if (pmKey === 'brew' && pkg.tap) {
157
+ await execFileAsync('brew', ['tap', pkg.tap], {
158
+ timeout: INSTALL_TIMEOUT_MS,
159
+ });
160
+ }
161
+ // All package managers use execFileAsync with explicit argument arrays
162
+ if (pmKey === 'apt') {
163
+ // APT: Run apt-get update and apt-get install as separate commands
164
+ const aptExecutable = isRoot ? 'apt-get' : 'sudo';
165
+ const updateArgs = isRoot ? ['update'] : ['apt-get', 'update'];
166
+ const installArgs = isRoot
167
+ ? ['install', '-y', pkg.package]
168
+ : ['apt-get', 'install', '-y', pkg.package];
169
+ await execFileAsync(aptExecutable, updateArgs, {
170
+ timeout: INSTALL_TIMEOUT_MS,
171
+ });
172
+ await execFileAsync(aptExecutable, installArgs, {
173
+ timeout: INSTALL_TIMEOUT_MS,
174
+ });
175
+ }
176
+ else if (pmKey === 'brew') {
177
+ // Homebrew: No sudo needed
178
+ await execFileAsync('brew', ['install', pkg.package], {
179
+ timeout: INSTALL_TIMEOUT_MS,
180
+ });
181
+ }
182
+ else if (pmKey === 'yum') {
183
+ // YUM: Needs sudo for non-root
184
+ const executable = isRoot ? 'yum' : 'sudo';
185
+ const args = isRoot
186
+ ? ['install', '-y', pkg.package]
187
+ : ['yum', 'install', '-y', pkg.package];
188
+ await execFileAsync(executable, args, { timeout: INSTALL_TIMEOUT_MS });
189
+ }
190
+ else if (pmKey === 'dnf') {
191
+ // DNF: Needs sudo for non-root
192
+ const executable = isRoot ? 'dnf' : 'sudo';
193
+ const args = isRoot
194
+ ? ['install', '-y', pkg.package]
195
+ : ['dnf', 'install', '-y', pkg.package];
196
+ await execFileAsync(executable, args, { timeout: INSTALL_TIMEOUT_MS });
197
+ }
198
+ else if (pmKey === 'choco') {
199
+ // Chocolatey: No sudo on Windows
200
+ await execFileAsync('choco', ['install', pkg.package, '-y'], {
201
+ timeout: INSTALL_TIMEOUT_MS,
202
+ });
203
+ }
204
+ else {
205
+ // Unknown package manager - should not reach here due to earlier validation
206
+ failed.push(...pkg.tools);
207
+ continue;
208
+ }
209
+ // Register the installed tools
210
+ for (const tool of pkg.tools) {
211
+ const result = await findBinary(tool);
212
+ if (result) {
213
+ await configManager.setBinaryPath(tool, result.path, 'system');
214
+ installed.push(tool);
215
+ }
216
+ else {
217
+ // Package installed but binary not found in PATH
218
+ // This is likely a PATH refresh issue, not an installation failure
219
+ needsPathRefresh.push(tool);
220
+ }
221
+ }
222
+ }
223
+ catch (error) {
224
+ const e = error;
225
+ if (e.killed) {
226
+ // Timeout - process was killed
227
+ console.error(chalk.red(` Installation of ${pkg.package} timed out after 5 minutes`));
228
+ }
229
+ else {
230
+ console.error(chalk.red(` Failed to install ${pkg.package}: ${e.message}`));
231
+ }
232
+ failed.push(...pkg.tools);
233
+ }
234
+ }
235
+ return { installed, failed, skipped, needsPathRefresh };
236
+ }
237
+ /**
238
+ * Check for bundled client tools and install any that are missing
239
+ *
240
+ * @param engineName - Engine name (e.g., 'postgresql', 'mysql')
241
+ * @param binPath - Path to the extracted binary directory
242
+ */
243
+ async function checkAndInstallClientTools(engineName, binPath) {
244
+ const requiredTools = await getRequiredClientTools(engineName);
245
+ const bundledTools = checkBundledTools(binPath, requiredTools);
246
+ if (bundledTools.length >= requiredTools.length) {
247
+ return; // All tools are bundled
248
+ }
249
+ const clientSpinner = createSpinner('Checking client tools...');
250
+ clientSpinner.start();
251
+ const result = await installMissingClientTools(engineName, bundledTools, (msg) => {
252
+ clientSpinner.text = msg;
253
+ });
254
+ // Report all non-empty categories (not mutually exclusive)
255
+ const messages = [];
256
+ if (result.installed.length > 0) {
257
+ messages.push(`installed: ${result.installed.join(', ')}`);
258
+ }
259
+ if (result.skipped.length > 0) {
260
+ messages.push(`already available: ${result.skipped.join(', ')}`);
261
+ }
262
+ // Determine overall status
263
+ const hasFailures = result.failed.length > 0;
264
+ const hasPathIssues = result.needsPathRefresh.length > 0;
265
+ if (hasFailures || hasPathIssues) {
266
+ // Build warning message
267
+ const warnings = [];
268
+ if (result.failed.length > 0) {
269
+ warnings.push(`failed: ${result.failed.join(', ')}`);
270
+ }
271
+ if (result.needsPathRefresh.length > 0) {
272
+ warnings.push(`needs PATH refresh: ${result.needsPathRefresh.join(', ')}`);
273
+ }
274
+ if (messages.length > 0) {
275
+ clientSpinner.warn(`${messages.join('; ')}; ${warnings.join('; ')}`);
276
+ }
277
+ else {
278
+ clientSpinner.warn(warnings.join('; '));
279
+ }
280
+ // Show additional help for PATH issues
281
+ if (hasPathIssues) {
282
+ console.log(chalk.yellow(' Some tools were installed but not found in PATH. Refresh your shell and re-run:'));
283
+ console.log(chalk.gray(` spindb engines download ${engineName}`));
284
+ }
285
+ }
286
+ else if (messages.length > 0) {
287
+ clientSpinner.succeed(messages.join('; '));
288
+ }
289
+ else {
290
+ clientSpinner.succeed('All client tools available');
291
+ }
292
+ }
293
+ // List subcommand action
294
+ async function listEngines(options) {
295
+ const engines = await getInstalledEngines();
296
+ if (options.json) {
297
+ const enginesWithMetadata = await Promise.all(engines.map(async (e) => ({
298
+ ...e,
299
+ ...(await getEngineMetadata(e.engine)),
300
+ })));
301
+ console.log(JSON.stringify(enginesWithMetadata, null, 2));
302
+ return;
303
+ }
304
+ if (engines.length === 0) {
305
+ console.log(uiInfo('No engines installed yet.'));
306
+ console.log(chalk.gray(' Database engines are downloaded automatically when you create a container.'));
307
+ console.log(chalk.gray(' Or download manually: spindb engines download <engine> <version>'));
308
+ return;
309
+ }
310
+ // Sort engines alphabetically by engine name
311
+ const sortedEngines = [...engines].sort((a, b) => a.engine.localeCompare(b.engine));
312
+ // Table header
313
+ // Icon is 5 chars, longest engine name is 11 (meilisearch/cockroachdb), so 18 total for ENGINE column
314
+ console.log();
315
+ console.log(chalk.gray(' ') +
316
+ chalk.bold.white('ENGINE'.padEnd(18)) +
317
+ chalk.bold.white('VERSION'.padEnd(12)) +
318
+ chalk.bold.white('SOURCE'.padEnd(18)) +
319
+ chalk.bold.white('SIZE'));
320
+ console.log(chalk.gray(' ' + '─'.repeat(59)));
321
+ // Display all engines in alphabetical order
322
+ for (const engine of sortedEngines) {
323
+ const platformInfo = `${engine.platform}-${engine.arch}`;
324
+ console.log(chalk.gray(' ') +
325
+ getEngineIcon(engine.engine) +
326
+ chalk.cyan(engine.engine.padEnd(13)) +
327
+ chalk.yellow(engine.version.padEnd(12)) +
328
+ chalk.gray(platformInfo.padEnd(18)) +
329
+ chalk.white(formatBytes(engine.sizeBytes)));
330
+ }
331
+ console.log(chalk.gray(' ' + '─'.repeat(59)));
332
+ // Summary - group by engine name (already sorted)
333
+ console.log();
334
+ // Engine display name map for summary
335
+ const ENGINE_DISPLAY_NAMES = {
336
+ clickhouse: 'ClickHouse',
337
+ cockroachdb: 'CockroachDB',
338
+ couchdb: 'CouchDB',
339
+ duckdb: 'DuckDB',
340
+ ferretdb: 'FerretDB',
341
+ influxdb: 'InfluxDB',
342
+ mariadb: 'MariaDB',
343
+ meilisearch: 'Meilisearch',
344
+ mongodb: 'MongoDB',
345
+ mysql: 'MySQL',
346
+ postgresql: 'PostgreSQL',
347
+ qdrant: 'Qdrant',
348
+ questdb: 'QuestDB',
349
+ redis: 'Redis',
350
+ sqlite: 'SQLite',
351
+ surrealdb: 'SurrealDB',
352
+ typedb: 'TypeDB',
353
+ valkey: 'Valkey',
354
+ weaviate: 'Weaviate',
355
+ tigerbeetle: 'TigerBeetle',
356
+ };
357
+ // Group engines by name for summary
358
+ const engineGroups = new Map();
359
+ for (const engine of sortedEngines) {
360
+ const group = engineGroups.get(engine.engine) || [];
361
+ group.push(engine);
362
+ engineGroups.set(engine.engine, group);
363
+ }
364
+ for (const [engineName, group] of engineGroups) {
365
+ const displayName = ENGINE_DISPLAY_NAMES[engineName] || engineName;
366
+ const totalSize = group.reduce((acc, e) => acc + e.sizeBytes, 0);
367
+ console.log(chalk.gray(` ${displayName}: ${group.length} version(s), ${formatBytes(totalSize)}`));
368
+ }
369
+ console.log();
370
+ }
371
+ // Delete subcommand action
372
+ async function deleteEngine(engine, version, options) {
373
+ // Get PostgreSQL engines only (MySQL can't be deleted via spindb)
374
+ const pgEngines = await getInstalledPostgresEngines();
375
+ if (pgEngines.length === 0) {
376
+ console.log(uiWarning('No deletable engines found.'));
377
+ console.log(chalk.gray(' Engine deletion is currently supported for PostgreSQL only.'));
378
+ return;
379
+ }
380
+ let engineName = engine;
381
+ let engineVersion = version;
382
+ // Interactive selection if not provided
383
+ if (!engineName || !engineVersion) {
384
+ const choices = pgEngines.map((e) => ({
385
+ name: `${getEngineIcon(e.engine)}${e.engine} ${e.version} ${chalk.gray(`(${formatBytes(e.sizeBytes)})`)}`,
386
+ value: `${e.engine}:${e.version}:${e.path}`,
387
+ }));
388
+ const { selected } = await inquirer.prompt([
389
+ {
390
+ type: 'list',
391
+ name: 'selected',
392
+ message: 'Select engine to delete:',
393
+ choices,
394
+ },
395
+ ]);
396
+ const [eng, ver] = selected.split(':');
397
+ engineName = eng;
398
+ engineVersion = ver;
399
+ }
400
+ // Find the engine
401
+ const targetEngine = pgEngines.find((e) => e.engine === engineName && e.version === engineVersion);
402
+ if (!targetEngine) {
403
+ console.error(uiError(`Engine "${engineName} ${engineVersion}" not found`));
404
+ process.exit(1);
405
+ }
406
+ // Check if any containers are using this engine version (for warning only)
407
+ const containers = await containerManager.list();
408
+ const usingContainers = containers.filter((c) => c.engine === engineName && c.version === engineVersion);
409
+ // Check for running containers using this engine
410
+ const runningContainers = usingContainers.filter((c) => c.status === 'running');
411
+ // Confirm deletion (warn about containers)
412
+ if (!options.yes) {
413
+ if (usingContainers.length > 0) {
414
+ const runningCount = runningContainers.length;
415
+ const stoppedCount = usingContainers.length - runningCount;
416
+ if (runningCount > 0) {
417
+ console.log(uiWarning(`${runningCount} running container(s) will be stopped: ${runningContainers.map((c) => c.name).join(', ')}`));
418
+ }
419
+ if (stoppedCount > 0) {
420
+ const stoppedContainers = usingContainers.filter((c) => c.status !== 'running');
421
+ console.log(chalk.gray(` ${stoppedCount} stopped container(s) will be orphaned: ${stoppedContainers.map((c) => c.name).join(', ')}`));
422
+ }
423
+ console.log(chalk.gray(' You can re-download the engine later to use these containers.'));
424
+ console.log();
425
+ }
426
+ // Check for cross-engine dependencies (QuestDB depends on PostgreSQL's psql)
427
+ if (engineName === Engine.PostgreSQL) {
428
+ const questdbContainers = containers.filter((c) => c.engine === Engine.QuestDB);
429
+ if (questdbContainers.length > 0) {
430
+ console.log(uiWarning(`${questdbContainers.length} QuestDB container(s) depend on PostgreSQL's psql for backup/restore:`));
431
+ console.log(chalk.gray(` ${questdbContainers.map((c) => c.name).join(', ')}`));
432
+ console.log(chalk.gray(' Deleting PostgreSQL will break backup/restore for these containers.'));
433
+ console.log();
434
+ }
435
+ }
436
+ const confirmed = await promptConfirm(`Delete ${engineName} ${engineVersion}? This cannot be undone.`, false);
437
+ if (!confirmed) {
438
+ console.log(uiWarning('Deletion cancelled'));
439
+ return;
440
+ }
441
+ }
442
+ // Stop any running containers first (while we still have the binary)
443
+ if (runningContainers.length > 0) {
444
+ const stopSpinner = createSpinner(`Stopping ${runningContainers.length} running container(s)...`);
445
+ stopSpinner.start();
446
+ const engine = getEngine(Engine.PostgreSQL);
447
+ const failedToStop = [];
448
+ for (const container of runningContainers) {
449
+ stopSpinner.text = `Stopping ${container.name}...`;
450
+ try {
451
+ await engine.stop(container);
452
+ await containerManager.updateConfig(container.name, {
453
+ status: 'stopped',
454
+ });
455
+ }
456
+ catch (error) {
457
+ // Log the original failure before attempting fallback
458
+ const err = error;
459
+ console.error(chalk.gray(` Failed to stop ${container.name} via engine.stop: ${err.message}`));
460
+ // Try fallback kill
461
+ const killed = await processManager.killProcess(container.name, {
462
+ engine: container.engine,
463
+ });
464
+ if (killed) {
465
+ await containerManager.updateConfig(container.name, {
466
+ status: 'stopped',
467
+ });
468
+ }
469
+ else {
470
+ failedToStop.push(container.name);
471
+ }
472
+ }
473
+ }
474
+ if (failedToStop.length > 0) {
475
+ stopSpinner.warn(`Could not stop ${failedToStop.length} container(s): ${failedToStop.join(', ')}`);
476
+ console.log(chalk.yellow(' These containers may still be running. Deleting the engine could leave them in a broken state.'));
477
+ if (!options.yes) {
478
+ const continueAnyway = await promptConfirm('Continue with engine deletion anyway?', false);
479
+ if (!continueAnyway) {
480
+ console.log(uiWarning('Deletion cancelled'));
481
+ return;
482
+ }
483
+ }
484
+ else {
485
+ console.log(chalk.yellow(' Proceeding with deletion (--yes specified)'));
486
+ }
487
+ }
488
+ else {
489
+ stopSpinner.succeed(`Stopped ${runningContainers.length} container(s)`);
490
+ }
491
+ }
492
+ // Delete the engine
493
+ const spinner = createSpinner(`Deleting ${engineName} ${engineVersion}...`);
494
+ spinner.start();
495
+ try {
496
+ await rm(targetEngine.path, { recursive: true, force: true });
497
+ spinner.succeed(`Deleted ${engineName} ${engineVersion}`);
498
+ }
499
+ catch (error) {
500
+ const e = error;
501
+ spinner.fail(`Failed to delete: ${e.message}`);
502
+ process.exit(1);
503
+ }
504
+ }
505
+ // Main engines command
506
+ export const enginesCommand = new Command('engines')
507
+ .description('Manage installed database engines')
508
+ .option('--json', 'Output as JSON')
509
+ .passThroughOptions()
510
+ .action(async (options) => {
511
+ try {
512
+ // Default action: list installed engines (same as 'engines list')
513
+ await listEngines(options);
514
+ }
515
+ catch (error) {
516
+ const e = error;
517
+ console.error(uiError(e.message));
518
+ process.exit(1);
519
+ }
520
+ });
521
+ // Delete subcommand
522
+ enginesCommand
523
+ .command('delete [engine] [version]')
524
+ .description('Delete an installed engine version')
525
+ .option('-y, --yes', 'Skip confirmation')
526
+ .action(async (engine, version, options) => {
527
+ try {
528
+ await deleteEngine(engine, version, options);
529
+ }
530
+ catch (error) {
531
+ const e = error;
532
+ console.error(uiError(e.message));
533
+ process.exit(1);
534
+ }
535
+ });
536
+ // Download subcommand
537
+ enginesCommand
538
+ .command('download <engine> [version]')
539
+ .description('Download/install engine binaries')
540
+ .action(async (engineName, version) => {
541
+ try {
542
+ const normalizedEngine = engineName.toLowerCase();
543
+ // PostgreSQL: download binaries
544
+ if (['postgresql', 'pg', 'postgres'].includes(normalizedEngine)) {
545
+ if (!version) {
546
+ console.error(uiError('PostgreSQL requires a version (e.g., 17)'));
547
+ process.exit(1);
548
+ }
549
+ const engine = getEngine(Engine.PostgreSQL);
550
+ const spinner = createSpinner(`Checking PostgreSQL ${version} binaries...`);
551
+ spinner.start();
552
+ // Always call ensureBinaries - it handles cached binaries gracefully
553
+ // and registers client tool paths in config (needed for dependency checks)
554
+ let wasCached = false;
555
+ await engine.ensureBinaries(version, ({ stage, message }) => {
556
+ if (stage === 'cached') {
557
+ wasCached = true;
558
+ spinner.text = `PostgreSQL ${version} binaries ready (cached)`;
559
+ }
560
+ else {
561
+ spinner.text = message;
562
+ }
563
+ });
564
+ if (wasCached) {
565
+ spinner.succeed(`PostgreSQL ${version} binaries already installed`);
566
+ }
567
+ else {
568
+ spinner.succeed(`PostgreSQL ${version} binaries downloaded`);
569
+ }
570
+ // Show the path for reference
571
+ const { platform, arch } = platformService.getPlatformInfo();
572
+ const fullVersion = postgresqlBinaryManager.getFullVersion(version);
573
+ const binPath = paths.getBinaryPath({
574
+ engine: 'postgresql',
575
+ version: fullVersion,
576
+ platform,
577
+ arch,
578
+ });
579
+ console.log(chalk.gray(` Location: ${binPath}`));
580
+ // Check for bundled client tools and install missing ones
581
+ await checkAndInstallClientTools('postgresql', binPath);
582
+ return;
583
+ }
584
+ // MySQL: download from hostdb
585
+ if (['mysql'].includes(normalizedEngine)) {
586
+ if (!version) {
587
+ console.error(uiError('MySQL requires a version (e.g., 8.0, 8.4, 9)'));
588
+ process.exit(1);
589
+ }
590
+ const engine = getEngine(Engine.MySQL);
591
+ const spinner = createSpinner(`Checking MySQL ${version} binaries...`);
592
+ spinner.start();
593
+ let wasCached = false;
594
+ await engine.ensureBinaries(version, ({ stage, message }) => {
595
+ if (stage === 'cached') {
596
+ wasCached = true;
597
+ spinner.text = `MySQL ${version} binaries ready (cached)`;
598
+ }
599
+ else {
600
+ spinner.text = message;
601
+ }
602
+ });
603
+ if (wasCached) {
604
+ spinner.succeed(`MySQL ${version} binaries already installed`);
605
+ }
606
+ else {
607
+ spinner.succeed(`MySQL ${version} binaries downloaded`);
608
+ }
609
+ const { platform: mysqlPlatform, arch: mysqlArch } = platformService.getPlatformInfo();
610
+ const mysqlFullVersion = mysqlBinaryManager.getFullVersion(version);
611
+ const mysqlBinPath = paths.getBinaryPath({
612
+ engine: 'mysql',
613
+ version: mysqlFullVersion,
614
+ platform: mysqlPlatform,
615
+ arch: mysqlArch,
616
+ });
617
+ console.log(chalk.gray(` Location: ${mysqlBinPath}`));
618
+ // Check for bundled client tools and install missing ones
619
+ await checkAndInstallClientTools('mysql', mysqlBinPath);
620
+ return;
621
+ }
622
+ // MariaDB: download from hostdb
623
+ if (['mariadb', 'maria'].includes(normalizedEngine)) {
624
+ if (!version) {
625
+ console.error(uiError('MariaDB requires a version (e.g., 10.11, 11.4, 11.8)'));
626
+ process.exit(1);
627
+ }
628
+ const engine = getEngine(Engine.MariaDB);
629
+ const spinner = createSpinner(`Checking MariaDB ${version} binaries...`);
630
+ spinner.start();
631
+ let wasCached = false;
632
+ await engine.ensureBinaries(version, ({ stage, message }) => {
633
+ if (stage === 'cached') {
634
+ wasCached = true;
635
+ spinner.text = `MariaDB ${version} binaries ready (cached)`;
636
+ }
637
+ else {
638
+ spinner.text = message;
639
+ }
640
+ });
641
+ if (wasCached) {
642
+ spinner.succeed(`MariaDB ${version} binaries already installed`);
643
+ }
644
+ else {
645
+ spinner.succeed(`MariaDB ${version} binaries downloaded`);
646
+ }
647
+ const { platform: mariadbPlatform, arch: mariadbArch } = platformService.getPlatformInfo();
648
+ const mariadbFullVersion = mariadbBinaryManager.getFullVersion(version);
649
+ const mariadbBinPath = paths.getBinaryPath({
650
+ engine: 'mariadb',
651
+ version: mariadbFullVersion,
652
+ platform: mariadbPlatform,
653
+ arch: mariadbArch,
654
+ });
655
+ console.log(chalk.gray(` Location: ${mariadbBinPath}`));
656
+ // Check for bundled client tools and install missing ones
657
+ await checkAndInstallClientTools('mariadb', mariadbBinPath);
658
+ return;
659
+ }
660
+ if (['sqlite', 'sqlite3'].includes(normalizedEngine)) {
661
+ if (!version) {
662
+ console.error(uiError('SQLite requires a version (e.g., 3)'));
663
+ process.exit(1);
664
+ }
665
+ const engine = getEngine(Engine.SQLite);
666
+ const spinner = createSpinner(`Checking SQLite ${version} binaries...`);
667
+ spinner.start();
668
+ let wasCached = false;
669
+ await engine.ensureBinaries(version, ({ stage, message }) => {
670
+ if (stage === 'cached') {
671
+ wasCached = true;
672
+ spinner.text = `SQLite ${version} binaries ready (cached)`;
673
+ }
674
+ else {
675
+ spinner.text = message;
676
+ }
677
+ });
678
+ if (wasCached) {
679
+ spinner.succeed(`SQLite ${version} binaries already installed`);
680
+ }
681
+ else {
682
+ spinner.succeed(`SQLite ${version} binaries downloaded`);
683
+ }
684
+ const { platform: sqlitePlatform, arch: sqliteArch } = platformService.getPlatformInfo();
685
+ const sqliteFullVersion = sqliteBinaryManager.getFullVersion(version);
686
+ const sqliteBinPath = paths.getBinaryPath({
687
+ engine: 'sqlite',
688
+ version: sqliteFullVersion,
689
+ platform: sqlitePlatform,
690
+ arch: sqliteArch,
691
+ });
692
+ console.log(chalk.gray(` Location: ${sqliteBinPath}`));
693
+ return;
694
+ }
695
+ if (['duckdb', 'duck'].includes(normalizedEngine)) {
696
+ if (!version) {
697
+ console.error(uiError('DuckDB requires a version (e.g., 1)'));
698
+ process.exit(1);
699
+ }
700
+ const engine = getEngine(Engine.DuckDB);
701
+ const spinner = createSpinner(`Checking DuckDB ${version} binaries...`);
702
+ spinner.start();
703
+ let wasCached = false;
704
+ await engine.ensureBinaries(version, ({ stage, message }) => {
705
+ if (stage === 'cached') {
706
+ wasCached = true;
707
+ spinner.text = `DuckDB ${version} binaries ready (cached)`;
708
+ }
709
+ else {
710
+ spinner.text = message;
711
+ }
712
+ });
713
+ if (wasCached) {
714
+ spinner.succeed(`DuckDB ${version} binaries already installed`);
715
+ }
716
+ else {
717
+ spinner.succeed(`DuckDB ${version} binaries downloaded`);
718
+ }
719
+ const { platform: duckdbPlatform, arch: duckdbArch } = platformService.getPlatformInfo();
720
+ const duckdbFullVersion = duckdbBinaryManager.getFullVersion(version);
721
+ const duckdbBinPath = paths.getBinaryPath({
722
+ engine: 'duckdb',
723
+ version: duckdbFullVersion,
724
+ platform: duckdbPlatform,
725
+ arch: duckdbArch,
726
+ });
727
+ console.log(chalk.gray(` Location: ${duckdbBinPath}`));
728
+ return;
729
+ }
730
+ if (['mongodb', 'mongo'].includes(normalizedEngine)) {
731
+ if (!version) {
732
+ console.error(uiError('MongoDB requires a version (e.g., 7.0, 8.0)'));
733
+ process.exit(1);
734
+ }
735
+ const engine = getEngine(Engine.MongoDB);
736
+ const spinner = createSpinner(`Checking MongoDB ${version} binaries...`);
737
+ spinner.start();
738
+ // Always call ensureBinaries - it handles cached binaries gracefully
739
+ let wasCached = false;
740
+ await engine.ensureBinaries(version, ({ stage, message }) => {
741
+ if (stage === 'cached') {
742
+ wasCached = true;
743
+ spinner.text = `MongoDB ${version} binaries ready (cached)`;
744
+ }
745
+ else {
746
+ spinner.text = message;
747
+ }
748
+ });
749
+ if (wasCached) {
750
+ spinner.succeed(`MongoDB ${version} binaries already installed`);
751
+ }
752
+ else {
753
+ spinner.succeed(`MongoDB ${version} binaries downloaded`);
754
+ }
755
+ // Show the path for reference
756
+ const { platform, arch } = platformService.getPlatformInfo();
757
+ const fullVersion = mongodbBinaryManager.getFullVersion(version);
758
+ const binPath = paths.getBinaryPath({
759
+ engine: 'mongodb',
760
+ version: fullVersion,
761
+ platform,
762
+ arch,
763
+ });
764
+ console.log(chalk.gray(` Location: ${binPath}`));
765
+ // Check for bundled client tools and install missing ones
766
+ await checkAndInstallClientTools('mongodb', binPath);
767
+ return;
768
+ }
769
+ if (normalizedEngine === 'redis') {
770
+ if (!version) {
771
+ console.error(uiError('Redis requires a version (e.g., 8)'));
772
+ process.exit(1);
773
+ }
774
+ const engine = getEngine(Engine.Redis);
775
+ const spinner = createSpinner(`Checking Redis ${version} binaries...`);
776
+ spinner.start();
777
+ // Always call ensureBinaries - it handles cached binaries gracefully
778
+ let wasCached = false;
779
+ await engine.ensureBinaries(version, ({ stage, message }) => {
780
+ if (stage === 'cached') {
781
+ wasCached = true;
782
+ spinner.text = `Redis ${version} binaries ready (cached)`;
783
+ }
784
+ else {
785
+ spinner.text = message;
786
+ }
787
+ });
788
+ if (wasCached) {
789
+ spinner.succeed(`Redis ${version} binaries already installed`);
790
+ }
791
+ else {
792
+ spinner.succeed(`Redis ${version} binaries downloaded`);
793
+ }
794
+ // Show the path for reference
795
+ const { platform: redisPlatform, arch: redisArch } = platformService.getPlatformInfo();
796
+ const redisFullVersion = redisBinaryManager.getFullVersion(version);
797
+ const binPath = paths.getBinaryPath({
798
+ engine: 'redis',
799
+ version: redisFullVersion,
800
+ platform: redisPlatform,
801
+ arch: redisArch,
802
+ });
803
+ console.log(chalk.gray(` Location: ${binPath}`));
804
+ // Check for bundled client tools and install missing ones
805
+ await checkAndInstallClientTools('redis', binPath);
806
+ return;
807
+ }
808
+ if (normalizedEngine === 'valkey') {
809
+ if (!version) {
810
+ console.error(uiError('Valkey requires a version (e.g., 9)'));
811
+ process.exit(1);
812
+ }
813
+ const engine = getEngine(Engine.Valkey);
814
+ const spinner = createSpinner(`Checking Valkey ${version} binaries...`);
815
+ spinner.start();
816
+ // Always call ensureBinaries - it handles cached binaries gracefully
817
+ let wasCached = false;
818
+ await engine.ensureBinaries(version, ({ stage, message }) => {
819
+ if (stage === 'cached') {
820
+ wasCached = true;
821
+ spinner.text = `Valkey ${version} binaries ready (cached)`;
822
+ }
823
+ else {
824
+ spinner.text = message;
825
+ }
826
+ });
827
+ if (wasCached) {
828
+ spinner.succeed(`Valkey ${version} binaries already installed`);
829
+ }
830
+ else {
831
+ spinner.succeed(`Valkey ${version} binaries downloaded`);
832
+ }
833
+ // Show the path for reference
834
+ const { platform: valkeyPlatform, arch: valkeyArch } = platformService.getPlatformInfo();
835
+ const valkeyFullVersion = valkeyBinaryManager.getFullVersion(version);
836
+ const binPath = paths.getBinaryPath({
837
+ engine: 'valkey',
838
+ version: valkeyFullVersion,
839
+ platform: valkeyPlatform,
840
+ arch: valkeyArch,
841
+ });
842
+ console.log(chalk.gray(` Location: ${binPath}`));
843
+ // Check for bundled client tools and install missing ones
844
+ await checkAndInstallClientTools('valkey', binPath);
845
+ return;
846
+ }
847
+ if (['clickhouse', 'ch'].includes(normalizedEngine)) {
848
+ // Check platform support
849
+ const { platform } = platformService.getPlatformInfo();
850
+ if (platform === Platform.Win32) {
851
+ console.error(uiError('ClickHouse is not supported on Windows via hostdb'));
852
+ console.log(chalk.gray(' ClickHouse binaries are only available for macOS and Linux.'));
853
+ process.exit(1);
854
+ }
855
+ if (!version) {
856
+ console.error(uiError('ClickHouse requires a version (e.g., 25.12)'));
857
+ process.exit(1);
858
+ }
859
+ const engine = getEngine(Engine.ClickHouse);
860
+ const spinner = createSpinner(`Checking ClickHouse ${version} binaries...`);
861
+ spinner.start();
862
+ let wasCached = false;
863
+ await engine.ensureBinaries(version, ({ stage, message }) => {
864
+ if (stage === 'cached') {
865
+ wasCached = true;
866
+ spinner.text = `ClickHouse ${version} binaries ready (cached)`;
867
+ }
868
+ else {
869
+ spinner.text = message;
870
+ }
871
+ });
872
+ if (wasCached) {
873
+ spinner.succeed(`ClickHouse ${version} binaries already installed`);
874
+ }
875
+ else {
876
+ spinner.succeed(`ClickHouse ${version} binaries downloaded`);
877
+ }
878
+ // Show the path for reference
879
+ const { platform: chPlatform, arch: chArch } = platformService.getPlatformInfo();
880
+ const chFullVersion = clickhouseBinaryManager.getFullVersion(version);
881
+ const binPath = paths.getBinaryPath({
882
+ engine: 'clickhouse',
883
+ version: chFullVersion,
884
+ platform: chPlatform,
885
+ arch: chArch,
886
+ });
887
+ console.log(chalk.gray(` Location: ${binPath}`));
888
+ // Check for bundled client tools and install missing ones
889
+ await checkAndInstallClientTools('clickhouse', binPath);
890
+ return;
891
+ }
892
+ if (['qdrant', 'qd'].includes(normalizedEngine)) {
893
+ if (!version) {
894
+ console.error(uiError('Qdrant requires a version (e.g., 1)'));
895
+ process.exit(1);
896
+ }
897
+ const engine = getEngine(Engine.Qdrant);
898
+ const spinner = createSpinner(`Checking Qdrant ${version} binaries...`);
899
+ spinner.start();
900
+ let wasCached = false;
901
+ await engine.ensureBinaries(version, ({ stage, message }) => {
902
+ if (stage === 'cached') {
903
+ wasCached = true;
904
+ spinner.text = `Qdrant ${version} binaries ready (cached)`;
905
+ }
906
+ else {
907
+ spinner.text = message;
908
+ }
909
+ });
910
+ if (wasCached) {
911
+ spinner.succeed(`Qdrant ${version} binaries already installed`);
912
+ }
913
+ else {
914
+ spinner.succeed(`Qdrant ${version} binaries downloaded`);
915
+ }
916
+ // Show the path for reference
917
+ const { platform: qdrantPlatform, arch: qdrantArch } = platformService.getPlatformInfo();
918
+ const qdrantFullVersion = qdrantBinaryManager.getFullVersion(version);
919
+ const binPath = paths.getBinaryPath({
920
+ engine: 'qdrant',
921
+ version: qdrantFullVersion,
922
+ platform: qdrantPlatform,
923
+ arch: qdrantArch,
924
+ });
925
+ console.log(chalk.gray(` Location: ${binPath}`));
926
+ // Skip client tools check for Qdrant - it's a REST API server
927
+ // with no CLI client tools (uses HTTP/gRPC protocols instead)
928
+ return;
929
+ }
930
+ if (['meilisearch', 'meili', 'ms'].includes(normalizedEngine)) {
931
+ if (!version) {
932
+ console.error(uiError('Meilisearch requires a version (e.g., 1)'));
933
+ process.exit(1);
934
+ }
935
+ const engine = getEngine(Engine.Meilisearch);
936
+ const spinner = createSpinner(`Checking Meilisearch ${version} binaries...`);
937
+ spinner.start();
938
+ let wasCached = false;
939
+ await engine.ensureBinaries(version, ({ stage, message }) => {
940
+ if (stage === 'cached') {
941
+ wasCached = true;
942
+ spinner.text = `Meilisearch ${version} binaries ready (cached)`;
943
+ }
944
+ else {
945
+ spinner.text = message;
946
+ }
947
+ });
948
+ if (wasCached) {
949
+ spinner.succeed(`Meilisearch ${version} binaries already installed`);
950
+ }
951
+ else {
952
+ spinner.succeed(`Meilisearch ${version} binaries downloaded`);
953
+ }
954
+ // Show the path for reference
955
+ const { platform: meilisearchPlatform, arch: meilisearchArch } = platformService.getPlatformInfo();
956
+ const meilisearchFullVersion = meilisearchBinaryManager.getFullVersion(version);
957
+ const binPath = paths.getBinaryPath({
958
+ engine: 'meilisearch',
959
+ version: meilisearchFullVersion,
960
+ platform: meilisearchPlatform,
961
+ arch: meilisearchArch,
962
+ });
963
+ console.log(chalk.gray(` Location: ${binPath}`));
964
+ // Skip client tools check for Meilisearch - it's a REST API server
965
+ // with no CLI client tools (uses HTTP protocols instead)
966
+ return;
967
+ }
968
+ if (['ferretdb', 'ferret'].includes(normalizedEngine)) {
969
+ const { platform } = platformService.getPlatformInfo();
970
+ if (!version) {
971
+ // Auto-select v1 on Windows (v2 not supported)
972
+ if (platform === Platform.Win32) {
973
+ version = '1';
974
+ console.log(chalk.gray(' Auto-selecting FerretDB v1 (v2 is not available on Windows)'));
975
+ }
976
+ else {
977
+ console.error(uiError('FerretDB requires a version (e.g., 1 or 2)'));
978
+ process.exit(1);
979
+ }
980
+ }
981
+ // Block v2 on Windows with helpful message
982
+ if (platform === Platform.Win32 && !isV1(version)) {
983
+ console.error(uiError('FerretDB v2 is not supported on Windows (postgresql-documentdb has startup issues)'));
984
+ console.log(chalk.gray(' Use FerretDB v1 instead, which uses plain PostgreSQL:'));
985
+ console.log(chalk.cyan(' spindb engines download ferretdb 1'));
986
+ process.exit(1);
987
+ }
988
+ const engine = getEngine(Engine.FerretDB);
989
+ const v1 = isV1(version);
990
+ const spinner = createSpinner(`Checking FerretDB ${version} binaries...`);
991
+ spinner.start();
992
+ let wasCached = false;
993
+ await engine.ensureBinaries(version, ({ stage, message }) => {
994
+ if (stage === 'cached') {
995
+ wasCached = true;
996
+ spinner.text = `FerretDB ${version} binaries ready (cached)`;
997
+ }
998
+ else {
999
+ spinner.text = message;
1000
+ }
1001
+ });
1002
+ if (wasCached) {
1003
+ spinner.succeed(`FerretDB ${version} binaries already installed`);
1004
+ }
1005
+ else {
1006
+ spinner.succeed(`FerretDB ${version} binaries downloaded`);
1007
+ }
1008
+ // Show the path for reference
1009
+ const { platform: ferretPlatform, arch: ferretArch } = platformService.getPlatformInfo();
1010
+ const ferretFullVersion = ferretdbBinaryManager.getFullVersion(version);
1011
+ const binPath = ferretdbBinaryManager.getFerretDBBinaryPath(ferretFullVersion, ferretPlatform, ferretArch);
1012
+ console.log(chalk.gray(` FerretDB location: ${binPath}`));
1013
+ // Show backend location (version-dependent)
1014
+ if (v1) {
1015
+ const pgFullVersion = postgresqlBinaryManager.getFullVersion(DEFAULT_V1_POSTGRESQL_VERSION);
1016
+ const pgPath = paths.getBinaryPath({
1017
+ engine: 'postgresql',
1018
+ version: pgFullVersion,
1019
+ platform: ferretPlatform,
1020
+ arch: ferretArch,
1021
+ });
1022
+ console.log(chalk.gray(` PostgreSQL backend location: ${pgPath}`));
1023
+ }
1024
+ else {
1025
+ const fullDocumentDBVersion = normalizeDocumentDBVersion(DEFAULT_DOCUMENTDB_VERSION);
1026
+ const documentdbPath = ferretdbBinaryManager.getDocumentDBBinaryPath(fullDocumentDBVersion, ferretPlatform, ferretArch);
1027
+ console.log(chalk.gray(` postgresql-documentdb location: ${documentdbPath}`));
1028
+ }
1029
+ // Skip client tools check - FerretDB uses MongoDB client tools (mongosh)
1030
+ // which are installed separately via: spindb engines download mongodb
1031
+ console.log(chalk.gray(' Note: Use mongosh to connect (install via: spindb engines download mongodb)'));
1032
+ return;
1033
+ }
1034
+ if (['couchdb', 'couch'].includes(normalizedEngine)) {
1035
+ if (!version) {
1036
+ console.error(uiError('CouchDB requires a version (e.g., 3)'));
1037
+ process.exit(1);
1038
+ }
1039
+ const engine = getEngine(Engine.CouchDB);
1040
+ const spinner = createSpinner(`Checking CouchDB ${version} binaries...`);
1041
+ spinner.start();
1042
+ let wasCached = false;
1043
+ await engine.ensureBinaries(version, ({ stage, message }) => {
1044
+ if (stage === 'cached') {
1045
+ wasCached = true;
1046
+ spinner.text = `CouchDB ${version} binaries ready (cached)`;
1047
+ }
1048
+ else {
1049
+ spinner.text = message;
1050
+ }
1051
+ });
1052
+ if (wasCached) {
1053
+ spinner.succeed(`CouchDB ${version} binaries already installed`);
1054
+ }
1055
+ else {
1056
+ spinner.succeed(`CouchDB ${version} binaries downloaded`);
1057
+ }
1058
+ // Show the path for reference
1059
+ const { platform: couchdbPlatform, arch: couchdbArch } = platformService.getPlatformInfo();
1060
+ const couchdbFullVersion = couchdbBinaryManager.getFullVersion(version);
1061
+ const binPath = paths.getBinaryPath({
1062
+ engine: 'couchdb',
1063
+ version: couchdbFullVersion,
1064
+ platform: couchdbPlatform,
1065
+ arch: couchdbArch,
1066
+ });
1067
+ console.log(chalk.gray(` Location: ${binPath}`));
1068
+ // Skip client tools check for CouchDB - it's a REST API server
1069
+ // with no CLI client tools (uses HTTP protocols instead)
1070
+ return;
1071
+ }
1072
+ if (['cockroachdb', 'crdb'].includes(normalizedEngine)) {
1073
+ if (!version) {
1074
+ console.error(uiError('CockroachDB requires a version (e.g., 25)'));
1075
+ process.exit(1);
1076
+ }
1077
+ const engine = getEngine(Engine.CockroachDB);
1078
+ const spinner = createSpinner(`Checking CockroachDB ${version} binaries...`);
1079
+ spinner.start();
1080
+ let wasCached = false;
1081
+ await engine.ensureBinaries(version, ({ stage, message }) => {
1082
+ if (stage === 'cached') {
1083
+ wasCached = true;
1084
+ spinner.text = `CockroachDB ${version} binaries ready (cached)`;
1085
+ }
1086
+ else {
1087
+ spinner.text = message;
1088
+ }
1089
+ });
1090
+ if (wasCached) {
1091
+ spinner.succeed(`CockroachDB ${version} binaries already installed`);
1092
+ }
1093
+ else {
1094
+ spinner.succeed(`CockroachDB ${version} binaries downloaded`);
1095
+ }
1096
+ // Show the path for reference
1097
+ const { platform: cockroachdbPlatform, arch: cockroachdbArch } = platformService.getPlatformInfo();
1098
+ const cockroachdbFullVersion = cockroachdbBinaryManager.getFullVersion(version);
1099
+ const binPath = paths.getBinaryPath({
1100
+ engine: 'cockroachdb',
1101
+ version: cockroachdbFullVersion,
1102
+ platform: cockroachdbPlatform,
1103
+ arch: cockroachdbArch,
1104
+ });
1105
+ console.log(chalk.gray(` Location: ${binPath}`));
1106
+ // Skip client tools check for CockroachDB - the cockroach binary is both server and client
1107
+ return;
1108
+ }
1109
+ if (['surrealdb', 'surreal'].includes(normalizedEngine)) {
1110
+ if (!version) {
1111
+ console.error(uiError('SurrealDB requires a version (e.g., 2)'));
1112
+ process.exit(1);
1113
+ }
1114
+ const engine = getEngine(Engine.SurrealDB);
1115
+ const spinner = createSpinner(`Checking SurrealDB ${version} binaries...`);
1116
+ spinner.start();
1117
+ let wasCached = false;
1118
+ await engine.ensureBinaries(version, ({ stage, message }) => {
1119
+ if (stage === 'cached') {
1120
+ wasCached = true;
1121
+ spinner.text = `SurrealDB ${version} binaries ready (cached)`;
1122
+ }
1123
+ else {
1124
+ spinner.text = message;
1125
+ }
1126
+ });
1127
+ if (wasCached) {
1128
+ spinner.succeed(`SurrealDB ${version} binaries already installed`);
1129
+ }
1130
+ else {
1131
+ spinner.succeed(`SurrealDB ${version} binaries downloaded`);
1132
+ }
1133
+ // Show the path for reference
1134
+ const { platform: surrealdbPlatform, arch: surrealdbArch } = platformService.getPlatformInfo();
1135
+ const surrealdbFullVersion = surrealdbBinaryManager.getFullVersion(version);
1136
+ const binPath = paths.getBinaryPath({
1137
+ engine: 'surrealdb',
1138
+ version: surrealdbFullVersion,
1139
+ platform: surrealdbPlatform,
1140
+ arch: surrealdbArch,
1141
+ });
1142
+ console.log(chalk.gray(` Location: ${binPath}`));
1143
+ // Skip client tools check for SurrealDB - the surreal binary is both server and client
1144
+ return;
1145
+ }
1146
+ if (['questdb', 'quest'].includes(normalizedEngine)) {
1147
+ if (!version) {
1148
+ console.error(uiError('QuestDB requires a version (e.g., 9)'));
1149
+ process.exit(1);
1150
+ }
1151
+ const engine = getEngine(Engine.QuestDB);
1152
+ const spinner = createSpinner(`Checking QuestDB ${version} binaries...`);
1153
+ spinner.start();
1154
+ let wasCached = false;
1155
+ await engine.ensureBinaries(version, ({ stage, message }) => {
1156
+ if (stage === 'cached') {
1157
+ wasCached = true;
1158
+ spinner.text = `QuestDB ${version} binaries ready (cached)`;
1159
+ }
1160
+ else {
1161
+ spinner.text = message;
1162
+ }
1163
+ });
1164
+ if (wasCached) {
1165
+ spinner.succeed(`QuestDB ${version} binaries already installed`);
1166
+ }
1167
+ else {
1168
+ spinner.succeed(`QuestDB ${version} binaries downloaded`);
1169
+ }
1170
+ // Show the path for reference
1171
+ const { platform: questdbPlatform, arch: questdbArch } = platformService.getPlatformInfo();
1172
+ const questdbFullVersion = questdbBinaryManager.getFullVersion(version);
1173
+ const binPath = paths.getBinaryPath({
1174
+ engine: 'questdb',
1175
+ version: questdbFullVersion,
1176
+ platform: questdbPlatform,
1177
+ arch: questdbArch,
1178
+ });
1179
+ console.log(chalk.gray(` Location: ${binPath}`));
1180
+ // Skip client tools check for QuestDB - uses psql or Web Console
1181
+ return;
1182
+ }
1183
+ if (['typedb', 'tdb'].includes(normalizedEngine)) {
1184
+ if (!version) {
1185
+ console.error(uiError('TypeDB requires a version (e.g., 3)'));
1186
+ process.exit(1);
1187
+ }
1188
+ const { platform, arch } = platformService.getPlatformInfo();
1189
+ const platformKey = `${platform}-${arch}`;
1190
+ const supportedPlatforms = new Set([
1191
+ 'darwin-x64',
1192
+ 'darwin-arm64',
1193
+ 'linux-x64',
1194
+ 'linux-arm64',
1195
+ 'win32-x64',
1196
+ ]);
1197
+ if (!supportedPlatforms.has(platformKey)) {
1198
+ console.error(uiError(`TypeDB binaries are not available for ${platformKey}. Supported: darwin-x64, darwin-arm64, linux-x64, linux-arm64, win32-x64.`));
1199
+ process.exit(1);
1200
+ }
1201
+ const engine = getEngine(Engine.TypeDB);
1202
+ const spinner = createSpinner(`Checking TypeDB ${version} binaries...`);
1203
+ spinner.start();
1204
+ let wasCached = false;
1205
+ await engine.ensureBinaries(version, ({ stage, message }) => {
1206
+ if (stage === 'cached') {
1207
+ wasCached = true;
1208
+ spinner.text = `TypeDB ${version} binaries ready (cached)`;
1209
+ }
1210
+ else {
1211
+ spinner.text = message;
1212
+ }
1213
+ });
1214
+ if (wasCached) {
1215
+ spinner.succeed(`TypeDB ${version} binaries already installed`);
1216
+ }
1217
+ else {
1218
+ spinner.succeed(`TypeDB ${version} binaries downloaded`);
1219
+ }
1220
+ // Show the path for reference
1221
+ const { platform: typedbPlatform, arch: typedbArch } = platformService.getPlatformInfo();
1222
+ const typedbFullVersion = typedbBinaryManager.getFullVersion(version);
1223
+ const binPath = paths.getBinaryPath({
1224
+ engine: 'typedb',
1225
+ version: typedbFullVersion,
1226
+ platform: typedbPlatform,
1227
+ arch: typedbArch,
1228
+ });
1229
+ console.log(chalk.gray(` Location: ${binPath}`));
1230
+ // Skip client tools check - TypeDB console is bundled
1231
+ return;
1232
+ }
1233
+ if (['influxdb', 'influx'].includes(normalizedEngine)) {
1234
+ if (!version) {
1235
+ console.error(uiError('InfluxDB requires a version (e.g., 3)'));
1236
+ process.exit(1);
1237
+ }
1238
+ const engine = getEngine(Engine.InfluxDB);
1239
+ const spinner = createSpinner(`Checking InfluxDB ${version} binaries...`);
1240
+ spinner.start();
1241
+ let wasCached = false;
1242
+ await engine.ensureBinaries(version, ({ stage, message }) => {
1243
+ if (stage === 'cached') {
1244
+ wasCached = true;
1245
+ spinner.text = `InfluxDB ${version} binaries ready (cached)`;
1246
+ }
1247
+ else {
1248
+ spinner.text = message;
1249
+ }
1250
+ });
1251
+ if (wasCached) {
1252
+ spinner.succeed(`InfluxDB ${version} binaries already installed`);
1253
+ }
1254
+ else {
1255
+ spinner.succeed(`InfluxDB ${version} binaries downloaded`);
1256
+ }
1257
+ // Show the path for reference
1258
+ const { platform: influxdbPlatform, arch: influxdbArch } = platformService.getPlatformInfo();
1259
+ const influxdbFullVersion = influxdbBinaryManager.getFullVersion(version);
1260
+ const binPath = paths.getBinaryPath({
1261
+ engine: 'influxdb',
1262
+ version: influxdbFullVersion,
1263
+ platform: influxdbPlatform,
1264
+ arch: influxdbArch,
1265
+ });
1266
+ console.log(chalk.gray(` Location: ${binPath}`));
1267
+ // Skip client tools check for InfluxDB - it's a REST API server
1268
+ // with no CLI client tools (uses HTTP protocols instead)
1269
+ return;
1270
+ }
1271
+ if (['weaviate', 'wv'].includes(normalizedEngine)) {
1272
+ if (!version) {
1273
+ console.error(uiError('Weaviate requires a version (e.g., 1)'));
1274
+ process.exit(1);
1275
+ }
1276
+ const engine = getEngine(Engine.Weaviate);
1277
+ const spinner = createSpinner(`Checking Weaviate ${version} binaries...`);
1278
+ spinner.start();
1279
+ let wasCached = false;
1280
+ await engine.ensureBinaries(version, ({ stage, message }) => {
1281
+ if (stage === 'cached') {
1282
+ wasCached = true;
1283
+ spinner.text = `Weaviate ${version} binaries ready (cached)`;
1284
+ }
1285
+ else {
1286
+ spinner.text = message;
1287
+ }
1288
+ });
1289
+ if (wasCached) {
1290
+ spinner.succeed(`Weaviate ${version} binaries already installed`);
1291
+ }
1292
+ else {
1293
+ spinner.succeed(`Weaviate ${version} binaries downloaded`);
1294
+ }
1295
+ // Show the path for reference
1296
+ const { platform: weaviatePlatform, arch: weaviateArch } = platformService.getPlatformInfo();
1297
+ const weaviateFullVersion = weaviateBinaryManager.getFullVersion(version);
1298
+ const binPath = paths.getBinaryPath({
1299
+ engine: 'weaviate',
1300
+ version: weaviateFullVersion,
1301
+ platform: weaviatePlatform,
1302
+ arch: weaviateArch,
1303
+ });
1304
+ console.log(chalk.gray(` Location: ${binPath}`));
1305
+ // Skip client tools check for Weaviate - it's a REST API server
1306
+ // with no CLI client tools (uses HTTP protocols instead)
1307
+ return;
1308
+ }
1309
+ if (['tigerbeetle', 'tb'].includes(normalizedEngine)) {
1310
+ if (!version) {
1311
+ console.error(uiError('TigerBeetle requires a version (e.g., 0.16)'));
1312
+ process.exit(1);
1313
+ }
1314
+ const engine = getEngine(Engine.TigerBeetle);
1315
+ const spinner = createSpinner(`Checking TigerBeetle ${version} binaries...`);
1316
+ spinner.start();
1317
+ let wasCached = false;
1318
+ await engine.ensureBinaries(version, ({ stage, message }) => {
1319
+ if (stage === 'cached') {
1320
+ wasCached = true;
1321
+ spinner.text = `TigerBeetle ${version} binaries ready (cached)`;
1322
+ }
1323
+ else {
1324
+ spinner.text = message;
1325
+ }
1326
+ });
1327
+ if (wasCached) {
1328
+ spinner.succeed(`TigerBeetle ${version} binaries already installed`);
1329
+ }
1330
+ else {
1331
+ spinner.succeed(`TigerBeetle ${version} binaries downloaded`);
1332
+ }
1333
+ // Show the path for reference
1334
+ const { platform: tbPlatform, arch: tbArch } = platformService.getPlatformInfo();
1335
+ const tbFullVersion = tigerbeetleBinaryManager.getFullVersion(version);
1336
+ const binPath = paths.getBinaryPath({
1337
+ engine: 'tigerbeetle',
1338
+ version: tbFullVersion,
1339
+ platform: tbPlatform,
1340
+ arch: tbArch,
1341
+ });
1342
+ console.log(chalk.gray(` Location: ${binPath}`));
1343
+ return;
1344
+ }
1345
+ console.error(uiError(`Unknown engine "${engineName}". Supported: ${ALL_ENGINES.join(', ')}`));
1346
+ process.exit(1);
1347
+ }
1348
+ catch (error) {
1349
+ const e = error;
1350
+ console.error(uiError(e.message));
1351
+ process.exit(1);
1352
+ }
1353
+ });
1354
+ // List subcommand (explicit alias for default action)
1355
+ enginesCommand
1356
+ .command('list')
1357
+ .description('List installed database engines')
1358
+ .option('--json', 'Output as JSON')
1359
+ .action(async (options) => {
1360
+ try {
1361
+ await listEngines(options);
1362
+ }
1363
+ catch (error) {
1364
+ const e = error;
1365
+ console.error(uiError(e.message));
1366
+ process.exit(1);
1367
+ }
1368
+ });
1369
+ // Supported subcommand - list all supported engines from engines.json
1370
+ enginesCommand
1371
+ .command('supported')
1372
+ .description('List all supported database engines')
1373
+ .option('--json', 'Output as JSON')
1374
+ .option('--all', 'Include pending and planned engines')
1375
+ .action(async (options) => {
1376
+ try {
1377
+ const rawData = await loadEnginesJson();
1378
+ const { platform, arch } = platformService.getPlatformInfo();
1379
+ const platformKey = `${platform}-${arch}`;
1380
+ const enginesData = filterEnginesByPlatform(rawData, platformKey);
1381
+ if (options.json) {
1382
+ // Output full JSON
1383
+ console.log(JSON.stringify(enginesData, null, 2));
1384
+ return;
1385
+ }
1386
+ // Simple list output
1387
+ const entries = Object.entries(enginesData.engines);
1388
+ for (const [name, config] of entries) {
1389
+ // Skip non-integrated unless --all flag is set
1390
+ if (!options.all && config.status !== 'integrated') {
1391
+ continue;
1392
+ }
1393
+ if (options.all) {
1394
+ // Show status in parentheses
1395
+ const statusColor = config.status === 'integrated'
1396
+ ? chalk.green
1397
+ : config.status === 'pending'
1398
+ ? chalk.blue
1399
+ : chalk.gray;
1400
+ console.log(`${config.icon} ${name} ${statusColor(`(${config.status})`)}`);
1401
+ }
1402
+ else {
1403
+ // Just engine name with icon
1404
+ console.log(`${config.icon} ${name}`);
1405
+ }
1406
+ }
1407
+ }
1408
+ catch (error) {
1409
+ const e = error;
1410
+ console.error(uiError(e.message));
1411
+ process.exit(1);
1412
+ }
1413
+ });
1414
+ //# sourceMappingURL=engines.js.map