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,1002 @@
1
+ import inquirer from 'inquirer';
2
+ import inquirerAutocomplete from 'inquirer-autocomplete-prompt';
3
+ import chalk from 'chalk';
4
+ // Register the autocomplete prompt type
5
+ inquirer.registerPrompt('autocomplete', inquirerAutocomplete);
6
+ import ora from 'ora';
7
+ import { existsSync, statSync } from 'fs';
8
+ import { resolve, join } from 'path';
9
+ import { homedir } from 'os';
10
+ import { listEngines, getEngine } from '../../engines/index.js';
11
+ import { defaults, getEngineDefaults } from '../../config/defaults.js';
12
+ import { portManager } from '../../core/port-manager.js';
13
+ import { containerManager } from '../../core/container-manager.js';
14
+ import { getEngineDependencies } from '../../config/os-dependencies.js';
15
+ import { getEngineIcon, getPageSize } from '../constants.js';
16
+ import { BACKUP_FORMATS, supportsFormatChoice, getDefaultFormat, } from '../../config/backup-formats.js';
17
+ // Navigation sentinel values for menu navigation
18
+ export const BACK_VALUE = '__back__';
19
+ export const MAIN_MENU_VALUE = '__main__';
20
+ export const ESCAPE_VALUE = '__escape__';
21
+ export const TOGGLE_PREFIX = '__toggle__:';
22
+ // Global escape handler state
23
+ let globalEscapeEnabled = false;
24
+ let escapeTriggered = false;
25
+ let escapeReject = null;
26
+ // Store the raw UI object so we can access activePrompt dynamically
27
+ // (activePrompt may not be set at capture time due to async initialization)
28
+ let currentPromptUi = null;
29
+ // Toggle handler state (Shift+Tab to toggle container start/stop)
30
+ let toggleEnabled = false;
31
+ // Set of values that are valid toggle targets (container names)
32
+ let toggleValidTargets = new Set();
33
+ // Custom error class for escape
34
+ export class EscapeError extends Error {
35
+ constructor() {
36
+ super('Escape pressed');
37
+ this.name = 'EscapeError';
38
+ }
39
+ }
40
+ // Custom error class for toggle (Shift+Tab)
41
+ export class ToggleError extends Error {
42
+ targetValue;
43
+ constructor(targetValue) {
44
+ super('Toggle pressed');
45
+ this.name = 'ToggleError';
46
+ this.targetValue = targetValue;
47
+ }
48
+ }
49
+ // Module-scoped stdin data handler for escape key and special key detection
50
+ // Defined at module scope so disableGlobalEscape() can remove it
51
+ function onEscapeData(data) {
52
+ // Ctrl+C is byte 3 - handle graceful exit
53
+ if (data.length === 1 && data[0] === 3) {
54
+ console.log(chalk.gray('\n Goodbye!\n'));
55
+ process.exit(0);
56
+ }
57
+ // Handle multi-byte escape sequences (arrow keys, Shift+Tab)
58
+ // These start with ESC (27) followed by '[' (91) and a letter
59
+ if (data.length === 3 && data[0] === 27 && data[1] === 91) {
60
+ const keyCode = data[2];
61
+ // Shift+Tab: \x1b[Z (27, 91, 90)
62
+ // Access inquirer's internal state to get the currently highlighted value
63
+ if (keyCode === 90 && toggleEnabled && currentPromptUi) {
64
+ try {
65
+ // Access activePrompt dynamically (it may not be set at capture time)
66
+ // inquirer-autocomplete-prompt uses 'selected' for cursor index
67
+ // and currentChoices.getChoice(index) to get the choice object
68
+ const activePrompt = currentPromptUi.activePrompt;
69
+ if (activePrompt?.currentChoices?.getChoice &&
70
+ activePrompt.selected !== undefined) {
71
+ const currentChoice = activePrompt.currentChoices.getChoice(activePrompt.selected);
72
+ // Check if the highlighted item is a valid toggle target (a container)
73
+ // Skip separators (type === 'separator') and non-container items
74
+ if (currentChoice &&
75
+ currentChoice.value &&
76
+ currentChoice.type !== 'separator' &&
77
+ toggleValidTargets.has(currentChoice.value)) {
78
+ // Reject the prompt with the container value to toggle
79
+ if (escapeReject) {
80
+ const reject = escapeReject;
81
+ escapeReject = null;
82
+ reject(new ToggleError(currentChoice.value));
83
+ }
84
+ // Close the prompt UI
85
+ if (typeof currentPromptUi.close === 'function') {
86
+ try {
87
+ currentPromptUi.close();
88
+ }
89
+ catch {
90
+ // Swallow errors from inquirer internals
91
+ }
92
+ currentPromptUi = null;
93
+ }
94
+ }
95
+ }
96
+ }
97
+ catch {
98
+ // Ignore errors accessing inquirer internals - the prompt state
99
+ // may be inconsistent during filtering or other operations
100
+ }
101
+ return;
102
+ }
103
+ return; // Don't process other escape sequences as standalone escape
104
+ }
105
+ // Escape key is byte 27 (0x1b) by itself
106
+ // Arrow keys and other sequences start with 27 but have more bytes
107
+ if (data.length === 1 && data[0] === 27) {
108
+ escapeTriggered = true;
109
+ // First reject the escape promise to interrupt the prompt
110
+ if (escapeReject) {
111
+ const reject = escapeReject;
112
+ escapeReject = null;
113
+ reject(new EscapeError());
114
+ }
115
+ // Then close the prompt UI to stop it from rendering
116
+ // Do this after rejecting so the error propagates first
117
+ // Wrap in try/catch as inquirer internals may change between versions
118
+ if (currentPromptUi && typeof currentPromptUi.close === 'function') {
119
+ try {
120
+ currentPromptUi.close();
121
+ }
122
+ catch {
123
+ // Swallow errors from inquirer internals - close() behavior may vary
124
+ }
125
+ currentPromptUi = null;
126
+ }
127
+ // Clear the screen
128
+ console.clear();
129
+ }
130
+ }
131
+ /**
132
+ * Enable global escape key handling for the interactive menu.
133
+ * When escape is pressed, the current prompt is closed and escapeTriggered flag is set.
134
+ * Call this once at the start of the interactive menu session.
135
+ */
136
+ export function enableGlobalEscape() {
137
+ if (globalEscapeEnabled)
138
+ return;
139
+ globalEscapeEnabled = true;
140
+ process.stdin.on('data', onEscapeData);
141
+ }
142
+ /**
143
+ * Disable global escape key handling and clean up state.
144
+ * Call this when exiting interactive mode or in tests to remove the stdin listener.
145
+ */
146
+ export function disableGlobalEscape() {
147
+ if (!globalEscapeEnabled)
148
+ return;
149
+ process.stdin.off('data', onEscapeData);
150
+ globalEscapeEnabled = false;
151
+ escapeTriggered = false;
152
+ escapeReject = null;
153
+ currentPromptUi = null;
154
+ }
155
+ /**
156
+ * Check if escape was triggered and reset the flag.
157
+ * Call this at the start of main menu to handle escape from anywhere.
158
+ */
159
+ export function checkAndResetEscape() {
160
+ const wasTriggered = escapeTriggered;
161
+ escapeTriggered = false;
162
+ return wasTriggered;
163
+ }
164
+ /**
165
+ * Enable toggle tracking for the container list.
166
+ * @param validTargets - Set of values that are valid toggle targets (container names)
167
+ */
168
+ export function enableToggleTracking(validTargets) {
169
+ toggleEnabled = true;
170
+ toggleValidTargets = validTargets;
171
+ }
172
+ /**
173
+ * Disable toggle tracking and clean up state.
174
+ */
175
+ export function disableToggleTracking() {
176
+ toggleEnabled = false;
177
+ toggleValidTargets = new Set();
178
+ }
179
+ /**
180
+ * Wrapper around inquirer.prompt that registers/unregisters with global escape handler.
181
+ * Use this instead of inquirer.prompt() directly for escape key support.
182
+ *
183
+ * Automatically detects non-interactive mode (piped input, scripts, CI) and throws
184
+ * a clear error instead of hanging on user input that can never come.
185
+ */
186
+ export async function escapeablePrompt(questions) {
187
+ // Detect non-interactive mode (piped input, scripts, CI environments)
188
+ if (!process.stdin.isTTY) {
189
+ throw new Error('Cannot prompt in non-interactive mode. Use appropriate flags (--force, --yes, --json) or provide required arguments.');
190
+ }
191
+ // Create a promise that rejects when escape is pressed
192
+ const escapePromise = new Promise((_, reject) => {
193
+ escapeReject = reject;
194
+ });
195
+ try {
196
+ const p = inquirer.prompt(questions);
197
+ // Register the prompt UI so we can close it on escape
198
+ // Use runtime guard to safely access inquirer's internal ui property
199
+ // which may change between versions.
200
+ // Validated against inquirer@9.3.7 - the prompt object exposes a .ui
201
+ // property with a .close() method for programmatic prompt termination.
202
+ const promptWithUi = p;
203
+ if (promptWithUi.ui &&
204
+ typeof promptWithUi.ui === 'object' &&
205
+ promptWithUi.ui !== null &&
206
+ typeof promptWithUi.ui.close === 'function') {
207
+ currentPromptUi = promptWithUi.ui;
208
+ }
209
+ else {
210
+ currentPromptUi = null;
211
+ }
212
+ // Race the prompt against the escape promise
213
+ const result = (await Promise.race([p, escapePromise]));
214
+ return result;
215
+ }
216
+ finally {
217
+ escapeReject = null;
218
+ currentPromptUi = null;
219
+ }
220
+ }
221
+ /**
222
+ * Filterable list prompt using inquirer-autocomplete-prompt.
223
+ * Allows typing to filter items while still using arrow keys to navigate.
224
+ *
225
+ * @param choices - Array of choices (items to filter + navigation items)
226
+ * @param message - Prompt message
227
+ * @param options.filterableCount - Number of items at the start that should be filterable
228
+ * (remaining items like Back/separators are always shown)
229
+ * @param options.pageSize - Number of items to show at once
230
+ * @param options.emptyText - Text to show when filter matches nothing
231
+ * @param options.enableToggle - Enable Shift+Tab to toggle items (returns TOGGLE_PREFIX + value)
232
+ */
233
+ export async function filterableListPrompt(choices, message, options) {
234
+ // Split choices into filterable items and static footer (separators, back buttons, etc.)
235
+ const filterableItems = choices.slice(0, options.filterableCount);
236
+ const footerItems = choices.slice(options.filterableCount);
237
+ // Enable toggle tracking if requested
238
+ // Build a set of valid toggle targets (the container values from filterable items)
239
+ if (options.enableToggle) {
240
+ const validTargets = new Set(filterableItems.map((item) => item.value));
241
+ enableToggleTracking(validTargets);
242
+ }
243
+ // Source function for autocomplete - filters items based on input
244
+ const header = options.headerItems || [];
245
+ async function source(_answers, input) {
246
+ const searchTerm = (input || '').toLowerCase().trim();
247
+ let result;
248
+ if (!searchTerm) {
249
+ // No filter - show all items
250
+ result = [...header, ...filterableItems, ...footerItems];
251
+ }
252
+ else {
253
+ // Filter items by matching search term against the display name
254
+ // Strip ANSI codes for matching but keep them for display
255
+ // eslint-disable-next-line no-control-regex
256
+ const ansiPattern = /\x1b\[[0-9;]*m/g;
257
+ const filtered = filterableItems.filter((item) => {
258
+ // Strip ANSI escape codes for matching
259
+ const plainName = item.name.replace(ansiPattern, '');
260
+ return plainName.toLowerCase().includes(searchTerm);
261
+ });
262
+ if (filtered.length === 0) {
263
+ // No matches - show empty message and footer
264
+ result = [
265
+ new inquirer.Separator(chalk.gray(options.emptyText || `No matches for "${input}"`)),
266
+ ...footerItems,
267
+ ];
268
+ }
269
+ else {
270
+ result = [...header, ...filtered, ...footerItems];
271
+ }
272
+ }
273
+ return result;
274
+ }
275
+ // Create escape promise for escape key handling
276
+ const escapePromise = new Promise((_, reject) => {
277
+ escapeReject = reject;
278
+ });
279
+ try {
280
+ const p = inquirer.prompt([
281
+ {
282
+ type: 'autocomplete',
283
+ name: 'selection',
284
+ message,
285
+ source,
286
+ pageSize: options.pageSize || getPageSize(),
287
+ emptyText: options.emptyText || 'No matches',
288
+ suggestOnly: false,
289
+ // Suppress the default "(Use arrow keys or type to search)" suffix
290
+ // since we include custom instructions in the message
291
+ suffix: '',
292
+ // Pre-select a value (cursor starts on this item)
293
+ default: options.defaultValue,
294
+ },
295
+ ]);
296
+ // Register the prompt UI for escape and toggle handling
297
+ // Store the raw UI object so we can access activePrompt dynamically
298
+ // (activePrompt contains selected and currentChoices for the highlighted item)
299
+ const promptWithUi = p;
300
+ if (promptWithUi.ui &&
301
+ typeof promptWithUi.ui === 'object' &&
302
+ promptWithUi.ui !== null &&
303
+ typeof promptWithUi.ui.close === 'function') {
304
+ currentPromptUi = promptWithUi.ui;
305
+ }
306
+ else {
307
+ currentPromptUi = null;
308
+ }
309
+ const result = (await Promise.race([p, escapePromise]));
310
+ return result.selection;
311
+ }
312
+ catch (error) {
313
+ // Handle toggle (Shift+Tab) - return special value so caller can handle it
314
+ if (error instanceof ToggleError) {
315
+ return TOGGLE_PREFIX + error.targetValue;
316
+ }
317
+ throw error;
318
+ }
319
+ finally {
320
+ escapeReject = null;
321
+ currentPromptUi = null;
322
+ if (options.enableToggle) {
323
+ disableToggleTracking();
324
+ }
325
+ }
326
+ }
327
+ /**
328
+ * Check if a prompt result indicates escape was pressed
329
+ */
330
+ export function wasEscapePressed(result) {
331
+ if (typeof result === 'string')
332
+ return result === ESCAPE_VALUE;
333
+ if (typeof result === 'object' && result !== null) {
334
+ return Object.values(result).some((v) => v === ESCAPE_VALUE);
335
+ }
336
+ return false;
337
+ }
338
+ export async function promptContainerName(defaultName, options) {
339
+ const { name } = await escapeablePrompt([
340
+ {
341
+ type: 'input',
342
+ name: 'name',
343
+ message: 'Container name:',
344
+ default: options?.allowBack ? undefined : defaultName,
345
+ validate: (input) => {
346
+ if (options?.allowBack && !input)
347
+ return true; // Allow empty for back
348
+ if (!input)
349
+ return 'Name is required';
350
+ if (!/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(input)) {
351
+ return 'Name must start with a letter and contain only letters, numbers, hyphens, and underscores';
352
+ }
353
+ return true;
354
+ },
355
+ },
356
+ ]);
357
+ if (options?.allowBack && !name)
358
+ return null;
359
+ return name;
360
+ }
361
+ /**
362
+ * Prompt for database engine selection
363
+ * @param options.includeBack - Include back/main menu navigation options
364
+ * @returns Engine name, or BACK_VALUE/MAIN_MENU_VALUE for navigation
365
+ */
366
+ export async function promptEngine(options) {
367
+ const engines = listEngines();
368
+ const engineChoices = engines.map((e) => ({
369
+ name: `${getEngineIcon(e.name)} ${e.displayName} ${chalk.gray(`(versions: ${e.supportedVersions.join(', ')})`)}`,
370
+ value: e.name,
371
+ short: e.displayName,
372
+ }));
373
+ const footerChoices = [
374
+ new inquirer.Separator(),
375
+ new inquirer.Separator(chalk.gray(` ${engines.length} engines — type to filter`)),
376
+ ];
377
+ if (options?.includeBack) {
378
+ footerChoices.push(new inquirer.Separator());
379
+ footerChoices.push({
380
+ name: `${chalk.blue('←')} Back`,
381
+ value: BACK_VALUE,
382
+ });
383
+ footerChoices.push({
384
+ name: `${chalk.blue('⌂')} Back to main menu ${chalk.gray('(esc)')}`,
385
+ value: MAIN_MENU_VALUE,
386
+ });
387
+ }
388
+ footerChoices.push(new inquirer.Separator());
389
+ const allChoices = [...engineChoices, ...footerChoices];
390
+ const engine = await filterableListPrompt(allChoices, 'Select database engine:', {
391
+ filterableCount: engineChoices.length,
392
+ pageSize: getPageSize(),
393
+ emptyText: 'No engines match filter',
394
+ });
395
+ return engine;
396
+ }
397
+ /**
398
+ * Prompt for database version
399
+ * Two-step selection: first major version, then specific minor version (if available)
400
+ * @param options.includeBack - Include back/main menu navigation options
401
+ * @returns Version string, or BACK_VALUE/MAIN_MENU_VALUE for navigation
402
+ */
403
+ export async function promptVersion(engineName, options) {
404
+ const engine = getEngine(engineName);
405
+ const majorVersions = engine.supportedVersions;
406
+ // Fetch available versions with a loading indicator
407
+ const spinner = ora({
408
+ text: 'Fetching available versions...',
409
+ color: 'cyan',
410
+ }).start();
411
+ let availableVersions;
412
+ try {
413
+ availableVersions = await engine.fetchAvailableVersions();
414
+ spinner.stop();
415
+ }
416
+ catch {
417
+ spinner.stop();
418
+ // Fall back to major versions only
419
+ availableVersions = {};
420
+ for (const v of majorVersions) {
421
+ availableVersions[v] = [];
422
+ }
423
+ }
424
+ const majorChoices = [];
425
+ const engineDefs = getEngineDefaults(engineName);
426
+ for (let i = 0; i < majorVersions.length; i++) {
427
+ const major = majorVersions[i];
428
+ const fullVersions = availableVersions[major] || [];
429
+ const versionCount = fullVersions.length;
430
+ const isLatestMajor = major === engineDefs.latestVersion;
431
+ const countLabel = versionCount > 0 ? chalk.gray(`(${versionCount} versions)`) : '';
432
+ const label = isLatestMajor
433
+ ? `${engine.displayName} ${major} ${countLabel} ${chalk.green('← latest')}`
434
+ : `${engine.displayName} ${major} ${countLabel}`;
435
+ majorChoices.push({
436
+ name: label,
437
+ value: major,
438
+ short: `${engine.displayName} ${major}`,
439
+ });
440
+ }
441
+ if (options?.includeBack) {
442
+ majorChoices.push(new inquirer.Separator());
443
+ majorChoices.push({ name: `${chalk.blue('←')} Back`, value: BACK_VALUE });
444
+ majorChoices.push({
445
+ name: `${chalk.blue('⌂')} Back to main menu ${chalk.gray('(esc)')}`,
446
+ value: MAIN_MENU_VALUE,
447
+ });
448
+ }
449
+ const { majorVersion } = await escapeablePrompt([
450
+ {
451
+ type: 'list',
452
+ name: 'majorVersion',
453
+ message: 'Select major version:',
454
+ choices: majorChoices,
455
+ default: engineDefs.latestVersion, // Default to latest major
456
+ },
457
+ ]);
458
+ // Handle navigation (including escape)
459
+ if (majorVersion === ESCAPE_VALUE ||
460
+ majorVersion === BACK_VALUE ||
461
+ majorVersion === MAIN_MENU_VALUE) {
462
+ return majorVersion === ESCAPE_VALUE ? MAIN_MENU_VALUE : majorVersion;
463
+ }
464
+ // Step 2: Select specific version within the major version
465
+ const minorVersions = availableVersions[majorVersion] || [];
466
+ if (minorVersions.length === 0) {
467
+ // No versions fetched, return major version (will use fallback)
468
+ return majorVersion;
469
+ }
470
+ const minorChoices = minorVersions.map((v, i) => ({
471
+ name: i === 0 ? `${v} ${chalk.green('← latest')}` : v,
472
+ value: v,
473
+ short: v,
474
+ }));
475
+ if (options?.includeBack) {
476
+ minorChoices.push(new inquirer.Separator());
477
+ minorChoices.push({
478
+ name: `${chalk.blue('←')} Back to major versions`,
479
+ value: BACK_VALUE,
480
+ });
481
+ minorChoices.push({
482
+ name: `${chalk.blue('⌂')} Back to main menu ${chalk.gray('(esc)')}`,
483
+ value: MAIN_MENU_VALUE,
484
+ });
485
+ }
486
+ const { version } = await escapeablePrompt([
487
+ {
488
+ type: 'list',
489
+ name: 'version',
490
+ message: `Select ${engine.displayName} ${majorVersion} version:`,
491
+ choices: minorChoices,
492
+ default: minorVersions[0], // Default to latest
493
+ },
494
+ ]);
495
+ // Handle navigation from minor version selection (including escape)
496
+ if (version === ESCAPE_VALUE) {
497
+ return MAIN_MENU_VALUE;
498
+ }
499
+ if (version === BACK_VALUE) {
500
+ // Go back to major version selection (recursive call)
501
+ return promptVersion(engineName, options);
502
+ }
503
+ if (version === MAIN_MENU_VALUE) {
504
+ return MAIN_MENU_VALUE;
505
+ }
506
+ return version;
507
+ }
508
+ /**
509
+ * Prompt for port with conflict detection
510
+ * @param defaultPort - Default port number
511
+ * @param engine - Engine name for port range lookup
512
+ */
513
+ export async function promptPort(defaultPort = defaults.port, engine) {
514
+ // Get engine-specific port range
515
+ const portRange = engine
516
+ ? getEngineDefaults(engine).portRange
517
+ : defaults.portRange;
518
+ // Get running container ports for conflict detection
519
+ // Stopped containers don't block ports - users can manage conflicts themselves
520
+ const existingContainers = await containerManager.list();
521
+ const containerPorts = new Map();
522
+ for (const c of existingContainers) {
523
+ if (c.port > 0 && c.status === 'running') {
524
+ containerPorts.set(c.port, c.name);
525
+ }
526
+ }
527
+ // Check if default port has a conflict and find a better default
528
+ let suggestedPort = defaultPort;
529
+ const defaultPortContainer = containerPorts.get(defaultPort);
530
+ const defaultPortInUse = !defaultPortContainer && !(await portManager.isPortAvailable(defaultPort));
531
+ if (defaultPortContainer || defaultPortInUse) {
532
+ // Find next available port in the engine's port range
533
+ try {
534
+ const result = await portManager.findAvailablePortExcludingContainers({
535
+ preferredPort: defaultPort,
536
+ portRange,
537
+ });
538
+ suggestedPort = result.port;
539
+ }
540
+ catch {
541
+ // Fall back to default if no ports available
542
+ suggestedPort = defaultPort;
543
+ }
544
+ }
545
+ const { port } = await escapeablePrompt([
546
+ {
547
+ type: 'input',
548
+ name: 'port',
549
+ message: 'Port:',
550
+ default: String(suggestedPort),
551
+ validate: (input) => {
552
+ const num = parseInt(input, 10);
553
+ if (isNaN(num) || num < 1 || num > 65535) {
554
+ return 'Port must be a number between 1 and 65535';
555
+ }
556
+ return true;
557
+ },
558
+ filter: (input) => parseInt(input, 10),
559
+ },
560
+ ]);
561
+ // Check for conflicts after selection
562
+ const conflictContainer = containerPorts.get(port);
563
+ if (conflictContainer) {
564
+ console.log();
565
+ console.log(chalk.yellow(` ⚠ Warning: Port ${port} is already assigned to container "${conflictContainer}"`));
566
+ console.log(chalk.gray(' Only one container can run on this port at a time.'));
567
+ console.log();
568
+ const { proceed } = await escapeablePrompt([
569
+ {
570
+ type: 'list',
571
+ name: 'proceed',
572
+ message: 'What would you like to do?',
573
+ choices: [
574
+ { name: `Use port ${port} anyway`, value: 'continue' },
575
+ { name: 'Choose a different port', value: 'retry' },
576
+ ],
577
+ },
578
+ ]);
579
+ if (proceed === 'retry') {
580
+ return promptPort(defaultPort, engine);
581
+ }
582
+ }
583
+ else {
584
+ // Check if port is in use by something else
585
+ const portAvailable = await portManager.isPortAvailable(port);
586
+ if (!portAvailable) {
587
+ console.log();
588
+ console.log(chalk.yellow(` ⚠ Warning: Port ${port} is currently in use`));
589
+ console.log(chalk.gray(' The container will be created but may fail to start until the port is freed.'));
590
+ console.log();
591
+ const { proceed } = await escapeablePrompt([
592
+ {
593
+ type: 'list',
594
+ name: 'proceed',
595
+ message: 'What would you like to do?',
596
+ choices: [
597
+ { name: `Use port ${port} anyway`, value: 'continue' },
598
+ { name: 'Choose a different port', value: 'retry' },
599
+ ],
600
+ },
601
+ ]);
602
+ if (proceed === 'retry') {
603
+ return promptPort(defaultPort, engine);
604
+ }
605
+ }
606
+ }
607
+ return port;
608
+ }
609
+ // Prompt for confirmation using arrow-key selection
610
+ export async function promptConfirm(message, defaultValue = true) {
611
+ const { confirmed } = await escapeablePrompt([
612
+ {
613
+ type: 'list',
614
+ name: 'confirmed',
615
+ message,
616
+ choices: [
617
+ { name: 'Yes', value: 'yes' },
618
+ { name: 'No', value: 'no' },
619
+ ],
620
+ default: defaultValue ? 'yes' : 'no',
621
+ },
622
+ ]);
623
+ return confirmed === 'yes';
624
+ }
625
+ /**
626
+ * Prompt for container selection from a list with type-to-filter support
627
+ * @param containers - List of containers to choose from
628
+ * @param message - Prompt message
629
+ * @param options - Optional settings
630
+ * @param options.includeBack - Include back/main menu navigation options (returns null when selected)
631
+ */
632
+ export async function promptContainerSelect(containers, message = 'Select container:', options = {}) {
633
+ if (containers.length === 0) {
634
+ return null;
635
+ }
636
+ // Build filterable container choices
637
+ const containerChoices = containers.map((c) => ({
638
+ name: `${c.name} ${chalk.gray(`(${getEngineIcon(c.engine)}${c.engine} ${c.version}, port ${c.port})`)} ${c.status === 'running'
639
+ ? chalk.green('● running')
640
+ : chalk.gray('○ stopped')}`,
641
+ value: c.name,
642
+ short: c.name,
643
+ }));
644
+ // Build footer with navigation options
645
+ const footerChoices = [];
646
+ if (options.includeBack) {
647
+ footerChoices.push(new inquirer.Separator());
648
+ footerChoices.push({ name: `${chalk.blue('←')} Back`, value: BACK_VALUE });
649
+ footerChoices.push({
650
+ name: `${chalk.blue('⌂')} Back to main menu ${chalk.gray('(esc)')}`,
651
+ value: MAIN_MENU_VALUE,
652
+ });
653
+ footerChoices.push(new inquirer.Separator());
654
+ }
655
+ const allChoices = [...containerChoices, ...footerChoices];
656
+ const container = await filterableListPrompt(allChoices, message, {
657
+ filterableCount: containerChoices.length,
658
+ pageSize: getPageSize(),
659
+ emptyText: 'No containers match filter',
660
+ });
661
+ // Handle navigation (including escape)
662
+ if (container === ESCAPE_VALUE ||
663
+ container === BACK_VALUE ||
664
+ container === MAIN_MENU_VALUE) {
665
+ return null;
666
+ }
667
+ return container;
668
+ }
669
+ /**
670
+ * Sanitize a string to be a valid database name
671
+ * Replaces invalid characters with underscores
672
+ */
673
+ function sanitizeDatabaseName(name) {
674
+ // Replace invalid characters with underscores
675
+ // Note: hyphens are excluded because they require quoting in SQL
676
+ let sanitized = name.replace(/[^a-zA-Z0-9_]/g, '_');
677
+ // Ensure it starts with a letter or underscore
678
+ if (sanitized && !/^[a-zA-Z_]/.test(sanitized)) {
679
+ sanitized = '_' + sanitized;
680
+ }
681
+ // Collapse multiple underscores
682
+ sanitized = sanitized.replace(/_+/g, '_');
683
+ // Trim trailing underscores
684
+ sanitized = sanitized.replace(/_+$/, '');
685
+ // Fallback if result is empty (e.g., input was "---")
686
+ if (!sanitized) {
687
+ sanitized = 'db';
688
+ }
689
+ return sanitized;
690
+ }
691
+ export async function promptDatabaseName(defaultName, engine, options) {
692
+ // MySQL uses "schema" terminology (database and schema are synonymous)
693
+ const baseLabel = engine === 'mysql' ? 'Database (schema) name' : 'Database name';
694
+ // Sanitize the default name to ensure it's valid
695
+ const sanitizedDefault = defaultName
696
+ ? sanitizeDatabaseName(defaultName)
697
+ : undefined;
698
+ // When allowBack is true, show the default in the message (since we can't use inquirer's default)
699
+ const label = options?.allowBack && sanitizedDefault
700
+ ? `${baseLabel} [${sanitizedDefault}]:`
701
+ : `${baseLabel}:`;
702
+ const { database } = await escapeablePrompt([
703
+ {
704
+ type: 'input',
705
+ name: 'database',
706
+ message: label,
707
+ default: options?.allowBack ? undefined : sanitizedDefault,
708
+ validate: (input) => {
709
+ if (options?.allowBack && !input)
710
+ return true; // Allow empty for back
711
+ if (!input)
712
+ return 'Database name is required';
713
+ // PostgreSQL database naming rules (also valid for MySQL)
714
+ // Hyphens excluded to avoid requiring quoted identifiers in SQL
715
+ if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(input)) {
716
+ return 'Database name must start with a letter or underscore and contain only letters, numbers, and underscores';
717
+ }
718
+ if (input.length > 63) {
719
+ return 'Database name must be 63 characters or less';
720
+ }
721
+ if (options?.disallowExisting &&
722
+ options.existingDatabases?.includes(input)) {
723
+ return `Database "${input}" already exists. Choose a different name.`;
724
+ }
725
+ return true;
726
+ },
727
+ },
728
+ ]);
729
+ if (options?.allowBack && !database)
730
+ return null;
731
+ return database;
732
+ }
733
+ export async function promptDatabaseSelect(databases, message = 'Select database:', options) {
734
+ if (databases.length === 0) {
735
+ throw new Error('No databases available to select');
736
+ }
737
+ if (databases.length === 1 && !options?.includeBack) {
738
+ return databases[0];
739
+ }
740
+ const choices = databases.map((db, index) => ({
741
+ name: index === 0 ? `${db} ${chalk.gray('(primary)')}` : db,
742
+ value: db,
743
+ short: db,
744
+ }));
745
+ if (options?.includeBack) {
746
+ choices.push(new inquirer.Separator());
747
+ choices.push({ name: `${chalk.blue('←')} Back`, value: BACK_VALUE });
748
+ }
749
+ const { database } = await escapeablePrompt([
750
+ {
751
+ type: 'list',
752
+ name: 'database',
753
+ message,
754
+ choices,
755
+ },
756
+ ]);
757
+ if (database === BACK_VALUE)
758
+ return null;
759
+ return database;
760
+ }
761
+ export async function promptBackupFormat(engine, options) {
762
+ // If engine doesn't support format choice (e.g., ClickHouse), return default
763
+ if (!supportsFormatChoice(engine)) {
764
+ return getDefaultFormat(engine);
765
+ }
766
+ const engineFormats = BACKUP_FORMATS[engine];
767
+ // Build choices dynamically from the engine's format definitions
768
+ const choices = Object.entries(engineFormats.formats).map(([key, info]) => ({
769
+ name: `${info.label} ${chalk.gray(`- ${info.description}`)}`,
770
+ value: key,
771
+ }));
772
+ if (options?.includeBack) {
773
+ choices.push(new inquirer.Separator());
774
+ choices.push({ name: `${chalk.blue('←')} Back`, value: BACK_VALUE });
775
+ }
776
+ const { format } = await escapeablePrompt([
777
+ {
778
+ type: 'list',
779
+ name: 'format',
780
+ message: 'Select backup format:',
781
+ choices,
782
+ default: engineFormats.defaultFormat,
783
+ },
784
+ ]);
785
+ if (format === BACK_VALUE)
786
+ return null;
787
+ return format;
788
+ }
789
+ /**
790
+ * Prompt for backup output directory
791
+ * @returns Directory path or null if cancelled
792
+ */
793
+ export async function promptBackupDirectory() {
794
+ const cwd = process.cwd();
795
+ const { choice } = await escapeablePrompt([
796
+ {
797
+ type: 'list',
798
+ name: 'choice',
799
+ message: 'Where to save the backup?',
800
+ choices: [
801
+ {
802
+ name: `${chalk.cyan('.')} Current directory ${chalk.gray(`(${cwd})`)}`,
803
+ value: 'cwd',
804
+ },
805
+ {
806
+ name: `${chalk.yellow('...')} Choose different directory`,
807
+ value: 'custom',
808
+ },
809
+ new inquirer.Separator(),
810
+ { name: `${chalk.blue('←')} Back`, value: BACK_VALUE },
811
+ ],
812
+ },
813
+ ]);
814
+ if (choice === BACK_VALUE)
815
+ return null;
816
+ if (choice === 'cwd')
817
+ return cwd;
818
+ const { customPath } = await escapeablePrompt([
819
+ {
820
+ type: 'input',
821
+ name: 'customPath',
822
+ message: 'Enter directory path:',
823
+ default: cwd,
824
+ validate: (input) => {
825
+ if (!input.trim())
826
+ return 'Directory path is required';
827
+ const resolved = resolve(input.replace(/^~/, process.env.HOME || ''));
828
+ if (existsSync(resolved)) {
829
+ if (!statSync(resolved).isDirectory()) {
830
+ return 'Path is not a directory';
831
+ }
832
+ }
833
+ // Directory will be created if it doesn't exist
834
+ return true;
835
+ },
836
+ },
837
+ ]);
838
+ return resolve(customPath.replace(/^~/, process.env.HOME || ''));
839
+ }
840
+ export async function promptBackupFilename(defaultName, options) {
841
+ // Show the default in the message when allowBack is true
842
+ const message = options?.allowBack
843
+ ? `Backup filename [${defaultName}]:`
844
+ : 'Backup filename:';
845
+ const { filename } = await escapeablePrompt([
846
+ {
847
+ type: 'input',
848
+ name: 'filename',
849
+ message,
850
+ default: options?.allowBack ? undefined : defaultName,
851
+ validate: (input) => {
852
+ if (options?.allowBack && !input)
853
+ return true; // Allow empty for back
854
+ if (!input)
855
+ return 'Filename is required';
856
+ if (!/^[a-zA-Z0-9_-]+$/.test(input)) {
857
+ return 'Filename must contain only letters, numbers, underscores, and hyphens';
858
+ }
859
+ return true;
860
+ },
861
+ },
862
+ ]);
863
+ if (options?.allowBack && !filename)
864
+ return null;
865
+ return filename;
866
+ }
867
+ /**
868
+ * Prompt for file-based database (SQLite/DuckDB) file location
869
+ * Similar to the relocate logic in container-handlers.ts
870
+ */
871
+ export async function promptFileDatabasePath(containerName, extension = '.sqlite') {
872
+ const defaultPath = `./${containerName}${extension}`;
873
+ const dbType = extension === '.duckdb' ? 'DuckDB' : 'SQLite';
874
+ console.log(chalk.gray(` ${dbType} databases are stored as files in your project directory.`));
875
+ console.log(chalk.gray(` Default: ${defaultPath}`));
876
+ console.log();
877
+ const { useDefault } = await escapeablePrompt([
878
+ {
879
+ type: 'list',
880
+ name: 'useDefault',
881
+ message: 'Where should the database file be created?',
882
+ choices: [
883
+ { name: `Use default location (${defaultPath})`, value: 'default' },
884
+ { name: 'Specify custom path', value: 'custom' },
885
+ ],
886
+ },
887
+ ]);
888
+ if (useDefault === 'default') {
889
+ return undefined; // Use default
890
+ }
891
+ const { inputPath } = await escapeablePrompt([
892
+ {
893
+ type: 'input',
894
+ name: 'inputPath',
895
+ message: 'File path:',
896
+ default: defaultPath,
897
+ validate: (input) => {
898
+ if (!input)
899
+ return 'Path is required';
900
+ return true;
901
+ },
902
+ },
903
+ ]);
904
+ // Expand ~ to home directory
905
+ let expandedPath = inputPath;
906
+ if (inputPath === '~') {
907
+ expandedPath = homedir();
908
+ }
909
+ else if (inputPath.startsWith('~/')) {
910
+ expandedPath = join(homedir(), inputPath.slice(2));
911
+ }
912
+ // Convert relative paths to absolute
913
+ if (!expandedPath.startsWith('/')) {
914
+ expandedPath = resolve(process.cwd(), expandedPath);
915
+ }
916
+ // Check if path looks like a file (has db extension) or directory
917
+ const hasDbExtension = /\.(sqlite3?|db|duckdb|ddb)$/i.test(expandedPath);
918
+ // Treat as directory if:
919
+ // - ends with /
920
+ // - exists and is a directory
921
+ // - doesn't have a database file extension (assume it's a directory path)
922
+ const isDirectory = expandedPath.endsWith('/') ||
923
+ (existsSync(expandedPath) && statSync(expandedPath).isDirectory()) ||
924
+ !hasDbExtension;
925
+ let finalPath;
926
+ if (isDirectory) {
927
+ // Remove trailing slash if present, then append filename
928
+ const dirPath = expandedPath.endsWith('/')
929
+ ? expandedPath.slice(0, -1)
930
+ : expandedPath;
931
+ finalPath = join(dirPath, `${containerName}${extension}`);
932
+ }
933
+ else {
934
+ finalPath = expandedPath;
935
+ }
936
+ // Check if file already exists
937
+ if (existsSync(finalPath)) {
938
+ console.log(chalk.yellow(` Warning: File already exists: ${finalPath}`));
939
+ const { overwrite } = await escapeablePrompt([
940
+ {
941
+ type: 'list',
942
+ name: 'overwrite',
943
+ message: 'A file already exists at this location. What would you like to do?',
944
+ choices: [
945
+ { name: 'Choose a different path', value: 'different' },
946
+ { name: 'Cancel', value: 'cancel' },
947
+ ],
948
+ },
949
+ ]);
950
+ if (overwrite === 'cancel') {
951
+ throw new Error('Creation cancelled');
952
+ }
953
+ // Recursively prompt again
954
+ return promptFileDatabasePath(containerName, extension);
955
+ }
956
+ return finalPath;
957
+ }
958
+ // Full interactive create flow
959
+ export async function promptCreateOptions() {
960
+ console.log(chalk.cyan('\n ▣ Create New Database Container\n'));
961
+ const engine = await promptEngine();
962
+ const version = await promptVersion(engine);
963
+ const name = await promptContainerName();
964
+ const database = await promptDatabaseName(name, engine); // Default to container name
965
+ // File-based databases (SQLite/DuckDB) don't need a port but need a path
966
+ let port = 0;
967
+ let path;
968
+ if (engine === 'sqlite') {
969
+ path = await promptFileDatabasePath(name, '.sqlite');
970
+ }
971
+ else if (engine === 'duckdb') {
972
+ path = await promptFileDatabasePath(name, '.duckdb');
973
+ }
974
+ else {
975
+ const engineDefaults = getEngineDefaults(engine);
976
+ port = await promptPort(engineDefaults.defaultPort, engine);
977
+ }
978
+ return { name, engine, version, port, database, path };
979
+ }
980
+ /**
981
+ * Prompt user to install missing database client tools
982
+ *
983
+ * All engine binaries (including client tools) are bundled with hostdb downloads.
984
+ * This function directs users to `spindb engines download <engine>` instead of
985
+ * trying to install via system package managers.
986
+ *
987
+ * @param missingTool - The name of the missing tool (e.g., 'psql', 'pg_dump', 'redis-cli')
988
+ * @param engine - The database engine (defaults to 'postgresql')
989
+ * @returns Always returns false (tools must be downloaded via `spindb engines download`)
990
+ */
991
+ export async function promptInstallDependencies(missingTool, engine = 'postgresql') {
992
+ const engineDeps = getEngineDependencies(engine);
993
+ const engineName = engineDeps?.displayName || engine;
994
+ console.log();
995
+ console.log(chalk.yellow(` Database client tool "${missingTool}" is not installed.`));
996
+ console.log();
997
+ console.log(chalk.cyan(` ${engineName} tools are bundled with the engine binaries from hostdb.`));
998
+ console.log(chalk.cyan(` Download them with: spindb engines download ${engine}`));
999
+ console.log();
1000
+ return false;
1001
+ }
1002
+ //# sourceMappingURL=prompts.js.map