spindb 0.37.2 → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (811) hide show
  1. package/dist/cli/bin.js +9 -0
  2. package/dist/cli/bin.js.map +1 -0
  3. package/dist/cli/commands/attach.js +102 -0
  4. package/dist/cli/commands/attach.js.map +1 -0
  5. package/dist/cli/commands/backup.js +197 -0
  6. package/dist/cli/commands/backup.js.map +1 -0
  7. package/dist/cli/commands/backups.js +190 -0
  8. package/dist/cli/commands/backups.js.map +1 -0
  9. package/dist/cli/commands/clone.js +119 -0
  10. package/dist/cli/commands/clone.js.map +1 -0
  11. package/dist/cli/commands/config.js +276 -0
  12. package/dist/cli/commands/config.js.map +1 -0
  13. package/dist/cli/commands/connect.js +559 -0
  14. package/dist/cli/commands/connect.js.map +1 -0
  15. package/dist/cli/commands/create.js +952 -0
  16. package/dist/cli/commands/create.js.map +1 -0
  17. package/dist/cli/commands/databases.js +485 -0
  18. package/dist/cli/commands/databases.js.map +1 -0
  19. package/dist/cli/commands/delete.js +106 -0
  20. package/dist/cli/commands/delete.js.map +1 -0
  21. package/dist/cli/commands/deps.js +238 -0
  22. package/dist/cli/commands/deps.js.map +1 -0
  23. package/dist/cli/commands/detach.js +81 -0
  24. package/dist/cli/commands/detach.js.map +1 -0
  25. package/dist/cli/commands/doctor.js +567 -0
  26. package/dist/cli/commands/doctor.js.map +1 -0
  27. package/dist/cli/commands/duckdb.js +207 -0
  28. package/dist/cli/commands/duckdb.js.map +1 -0
  29. package/dist/cli/commands/edit.js +524 -0
  30. package/dist/cli/commands/edit.js.map +1 -0
  31. package/dist/cli/commands/engines.js +1414 -0
  32. package/dist/cli/commands/engines.js.map +1 -0
  33. package/dist/cli/commands/export.js +383 -0
  34. package/dist/cli/commands/export.js.map +1 -0
  35. package/dist/cli/commands/info.js +270 -0
  36. package/dist/cli/commands/info.js.map +1 -0
  37. package/dist/cli/commands/list.js +215 -0
  38. package/dist/cli/commands/list.js.map +1 -0
  39. package/dist/cli/commands/logs.js +81 -0
  40. package/dist/cli/commands/logs.js.map +1 -0
  41. package/dist/cli/commands/menu/backup-handlers.js +1202 -0
  42. package/dist/cli/commands/menu/backup-handlers.js.map +1 -0
  43. package/dist/cli/commands/menu/container-handlers.js +1788 -0
  44. package/dist/cli/commands/menu/container-handlers.js.map +1 -0
  45. package/dist/cli/commands/menu/engine-handlers.js +235 -0
  46. package/dist/cli/commands/menu/engine-handlers.js.map +1 -0
  47. package/dist/cli/commands/menu/index.js +266 -0
  48. package/dist/cli/commands/menu/index.js.map +1 -0
  49. package/dist/cli/commands/menu/settings-handlers.js +320 -0
  50. package/dist/cli/commands/menu/settings-handlers.js.map +1 -0
  51. package/dist/cli/commands/menu/shared.js +13 -0
  52. package/dist/cli/commands/menu/shared.js.map +1 -0
  53. package/dist/cli/commands/menu/shell-handlers.js +1573 -0
  54. package/dist/cli/commands/menu/shell-handlers.js.map +1 -0
  55. package/dist/cli/commands/menu/sql-handlers.js +185 -0
  56. package/dist/cli/commands/menu/sql-handlers.js.map +1 -0
  57. package/dist/cli/commands/menu/update-handlers.js +322 -0
  58. package/dist/cli/commands/menu/update-handlers.js.map +1 -0
  59. package/dist/cli/commands/menu/validators.js +9 -0
  60. package/dist/cli/commands/menu/validators.js.map +1 -0
  61. package/dist/cli/commands/ports.js +166 -0
  62. package/dist/cli/commands/ports.js.map +1 -0
  63. package/dist/cli/commands/pull.js +166 -0
  64. package/dist/cli/commands/pull.js.map +1 -0
  65. package/dist/cli/commands/query.js +180 -0
  66. package/dist/cli/commands/query.js.map +1 -0
  67. package/dist/cli/commands/restore.js +428 -0
  68. package/dist/cli/commands/restore.js.map +1 -0
  69. package/dist/cli/commands/run.js +115 -0
  70. package/dist/cli/commands/run.js.map +1 -0
  71. package/dist/cli/commands/self-update.js +99 -0
  72. package/dist/cli/commands/self-update.js.map +1 -0
  73. package/dist/cli/commands/sqlite.js +207 -0
  74. package/dist/cli/commands/sqlite.js.map +1 -0
  75. package/dist/cli/commands/start.js +196 -0
  76. package/dist/cli/commands/start.js.map +1 -0
  77. package/dist/cli/commands/stop.js +182 -0
  78. package/dist/cli/commands/stop.js.map +1 -0
  79. package/dist/cli/commands/url.js +88 -0
  80. package/dist/cli/commands/url.js.map +1 -0
  81. package/dist/cli/commands/users.js +189 -0
  82. package/dist/cli/commands/users.js.map +1 -0
  83. package/dist/cli/commands/version.js +52 -0
  84. package/dist/cli/commands/version.js.map +1 -0
  85. package/dist/cli/commands/which.js +258 -0
  86. package/dist/cli/commands/which.js.map +1 -0
  87. package/dist/cli/constants.js +212 -0
  88. package/dist/cli/constants.js.map +1 -0
  89. package/dist/cli/helpers.js +1120 -0
  90. package/dist/cli/helpers.js.map +1 -0
  91. package/dist/cli/index.js +146 -0
  92. package/dist/cli/index.js.map +1 -0
  93. package/dist/cli/ui/prompts.js +1002 -0
  94. package/dist/cli/ui/prompts.js.map +1 -0
  95. package/dist/cli/ui/spinner.js +74 -0
  96. package/dist/cli/ui/spinner.js.map +1 -0
  97. package/dist/cli/ui/theme.js +99 -0
  98. package/dist/cli/ui/theme.js.map +1 -0
  99. package/dist/cli/utils/file-follower.js +79 -0
  100. package/dist/cli/utils/file-follower.js.map +1 -0
  101. package/dist/config/backup-formats.js +363 -0
  102. package/dist/config/backup-formats.js.map +1 -0
  103. package/dist/config/defaults.js +25 -0
  104. package/dist/config/defaults.js.map +1 -0
  105. package/dist/config/engine-defaults.js +303 -0
  106. package/dist/config/engine-defaults.js.map +1 -0
  107. package/dist/config/engines-registry.js +103 -0
  108. package/dist/config/engines-registry.js.map +1 -0
  109. package/dist/config/os-dependencies.js +767 -0
  110. package/dist/config/os-dependencies.js.map +1 -0
  111. package/dist/config/paths.js +156 -0
  112. package/dist/config/paths.js.map +1 -0
  113. package/dist/config/version.js +3 -0
  114. package/dist/config/version.js.map +1 -0
  115. package/dist/core/backup-restore.js +219 -0
  116. package/dist/core/backup-restore.js.map +1 -0
  117. package/dist/core/base-binary-manager.js +403 -0
  118. package/dist/core/base-binary-manager.js.map +1 -0
  119. package/dist/core/base-document-binary-manager.js +364 -0
  120. package/dist/core/base-document-binary-manager.js.map +1 -0
  121. package/dist/core/base-embedded-binary-manager.js +364 -0
  122. package/dist/core/base-embedded-binary-manager.js.map +1 -0
  123. package/dist/core/base-server-binary-manager.js +368 -0
  124. package/dist/core/base-server-binary-manager.js.map +1 -0
  125. package/dist/core/config-manager.js +495 -0
  126. package/dist/core/config-manager.js.map +1 -0
  127. package/dist/core/container-manager.js +609 -0
  128. package/dist/core/container-manager.js.map +1 -0
  129. package/dist/core/credential-generator.js +67 -0
  130. package/dist/core/credential-generator.js.map +1 -0
  131. package/dist/core/credential-manager.js +211 -0
  132. package/dist/core/credential-manager.js.map +1 -0
  133. package/dist/core/dblab-utils.js +105 -0
  134. package/dist/core/dblab-utils.js.map +1 -0
  135. package/dist/core/dependency-manager.js +359 -0
  136. package/dist/core/dependency-manager.js.map +1 -0
  137. package/dist/core/docker-exporter.js +1077 -0
  138. package/dist/core/docker-exporter.js.map +1 -0
  139. package/dist/core/error-handler.js +295 -0
  140. package/dist/core/error-handler.js.map +1 -0
  141. package/dist/core/fs-error-utils.js +74 -0
  142. package/dist/core/fs-error-utils.js.map +1 -0
  143. package/dist/core/homebrew-version-manager.js +280 -0
  144. package/dist/core/homebrew-version-manager.js.map +1 -0
  145. package/dist/core/hostdb-client.js +252 -0
  146. package/dist/core/hostdb-client.js.map +1 -0
  147. package/dist/core/hostdb-metadata.js +243 -0
  148. package/dist/core/hostdb-metadata.js.map +1 -0
  149. package/dist/core/hostdb-releases-factory.js +161 -0
  150. package/dist/core/hostdb-releases-factory.js.map +1 -0
  151. package/dist/core/library-env.js +88 -0
  152. package/dist/core/library-env.js.map +1 -0
  153. package/dist/core/pgweb-utils.js +53 -0
  154. package/dist/core/pgweb-utils.js.map +1 -0
  155. package/dist/core/platform-service.js +632 -0
  156. package/dist/core/platform-service.js.map +1 -0
  157. package/dist/core/port-manager.js +136 -0
  158. package/dist/core/port-manager.js.map +1 -0
  159. package/dist/core/process-manager.js +445 -0
  160. package/dist/core/process-manager.js.map +1 -0
  161. package/dist/core/pull-manager.js +418 -0
  162. package/dist/core/pull-manager.js.map +1 -0
  163. package/dist/core/query-parser.js +449 -0
  164. package/dist/core/query-parser.js.map +1 -0
  165. package/dist/core/spawn-utils.js +90 -0
  166. package/dist/core/spawn-utils.js.map +1 -0
  167. package/dist/core/start-with-retry.js +90 -0
  168. package/dist/core/start-with-retry.js.map +1 -0
  169. package/dist/core/test-cleanup.js +85 -0
  170. package/dist/core/test-cleanup.js.map +1 -0
  171. package/dist/core/tls-generator.js +84 -0
  172. package/dist/core/tls-generator.js.map +1 -0
  173. package/dist/core/transaction-manager.js +139 -0
  174. package/dist/core/transaction-manager.js.map +1 -0
  175. package/dist/core/update-manager.js +241 -0
  176. package/dist/core/update-manager.js.map +1 -0
  177. package/dist/core/version-migration.js +260 -0
  178. package/dist/core/version-migration.js.map +1 -0
  179. package/dist/core/version-utils.js +91 -0
  180. package/dist/core/version-utils.js.map +1 -0
  181. package/dist/engines/base-engine.js +179 -0
  182. package/dist/engines/base-engine.js.map +1 -0
  183. package/dist/engines/clickhouse/backup.js +289 -0
  184. package/dist/engines/clickhouse/backup.js.map +1 -0
  185. package/dist/engines/clickhouse/binary-manager.js +145 -0
  186. package/dist/engines/clickhouse/binary-manager.js.map +1 -0
  187. package/dist/engines/clickhouse/binary-urls.js +100 -0
  188. package/dist/engines/clickhouse/binary-urls.js.map +1 -0
  189. package/dist/engines/clickhouse/cli-utils.js +143 -0
  190. package/dist/engines/clickhouse/cli-utils.js.map +1 -0
  191. package/dist/engines/clickhouse/hostdb-releases.js +24 -0
  192. package/dist/engines/clickhouse/hostdb-releases.js.map +1 -0
  193. package/dist/engines/clickhouse/index.js +1077 -0
  194. package/dist/engines/clickhouse/index.js.map +1 -0
  195. package/dist/engines/clickhouse/restore.js +335 -0
  196. package/dist/engines/clickhouse/restore.js.map +1 -0
  197. package/dist/engines/clickhouse/version-maps.js +83 -0
  198. package/dist/engines/clickhouse/version-maps.js.map +1 -0
  199. package/dist/engines/clickhouse/version-validator.js +133 -0
  200. package/dist/engines/clickhouse/version-validator.js.map +1 -0
  201. package/dist/engines/cockroachdb/backup.js +261 -0
  202. package/dist/engines/cockroachdb/backup.js.map +1 -0
  203. package/dist/engines/cockroachdb/binary-manager.js +33 -0
  204. package/dist/engines/cockroachdb/binary-manager.js.map +1 -0
  205. package/dist/engines/cockroachdb/binary-urls.js +33 -0
  206. package/dist/engines/cockroachdb/binary-urls.js.map +1 -0
  207. package/dist/engines/cockroachdb/cli-utils.js +338 -0
  208. package/dist/engines/cockroachdb/cli-utils.js.map +1 -0
  209. package/dist/engines/cockroachdb/hostdb-releases.js +21 -0
  210. package/dist/engines/cockroachdb/hostdb-releases.js.map +1 -0
  211. package/dist/engines/cockroachdb/index.js +1016 -0
  212. package/dist/engines/cockroachdb/index.js.map +1 -0
  213. package/dist/engines/cockroachdb/restore.js +323 -0
  214. package/dist/engines/cockroachdb/restore.js.map +1 -0
  215. package/dist/engines/cockroachdb/version-maps.js +37 -0
  216. package/dist/engines/cockroachdb/version-maps.js.map +1 -0
  217. package/dist/engines/couchdb/api-client.js +64 -0
  218. package/dist/engines/couchdb/api-client.js.map +1 -0
  219. package/dist/engines/couchdb/backup.js +90 -0
  220. package/dist/engines/couchdb/backup.js.map +1 -0
  221. package/dist/engines/couchdb/binary-manager.js +62 -0
  222. package/dist/engines/couchdb/binary-manager.js.map +1 -0
  223. package/dist/engines/couchdb/binary-urls.js +92 -0
  224. package/dist/engines/couchdb/binary-urls.js.map +1 -0
  225. package/dist/engines/couchdb/hostdb-releases.js +21 -0
  226. package/dist/engines/couchdb/hostdb-releases.js.map +1 -0
  227. package/dist/engines/couchdb/index.js +1043 -0
  228. package/dist/engines/couchdb/index.js.map +1 -0
  229. package/dist/engines/couchdb/restore.js +198 -0
  230. package/dist/engines/couchdb/restore.js.map +1 -0
  231. package/dist/engines/couchdb/version-maps.js +67 -0
  232. package/dist/engines/couchdb/version-maps.js.map +1 -0
  233. package/dist/engines/couchdb/version-validator.js +88 -0
  234. package/dist/engines/couchdb/version-validator.js.map +1 -0
  235. package/dist/engines/duckdb/binary-manager.js +33 -0
  236. package/dist/engines/duckdb/binary-manager.js.map +1 -0
  237. package/{engines/duckdb/binary-urls.ts → dist/engines/duckdb/binary-urls.js} +11 -16
  238. package/dist/engines/duckdb/binary-urls.js.map +1 -0
  239. package/dist/engines/duckdb/hostdb-releases.js +21 -0
  240. package/dist/engines/duckdb/hostdb-releases.js.map +1 -0
  241. package/dist/engines/duckdb/index.js +594 -0
  242. package/dist/engines/duckdb/index.js.map +1 -0
  243. package/dist/engines/duckdb/registry.js +265 -0
  244. package/dist/engines/duckdb/registry.js.map +1 -0
  245. package/dist/engines/duckdb/scanner.js +12 -0
  246. package/dist/engines/duckdb/scanner.js.map +1 -0
  247. package/dist/engines/duckdb/version-maps.js +67 -0
  248. package/dist/engines/duckdb/version-maps.js.map +1 -0
  249. package/dist/engines/duckdb/version-validator.js +62 -0
  250. package/dist/engines/duckdb/version-validator.js.map +1 -0
  251. package/dist/engines/ferretdb/backup.js +170 -0
  252. package/dist/engines/ferretdb/backup.js.map +1 -0
  253. package/dist/engines/ferretdb/binary-manager.js +765 -0
  254. package/dist/engines/ferretdb/binary-manager.js.map +1 -0
  255. package/dist/engines/ferretdb/binary-urls.js +135 -0
  256. package/dist/engines/ferretdb/binary-urls.js.map +1 -0
  257. package/dist/engines/ferretdb/index.js +1517 -0
  258. package/dist/engines/ferretdb/index.js.map +1 -0
  259. package/dist/engines/ferretdb/restore.js +310 -0
  260. package/dist/engines/ferretdb/restore.js.map +1 -0
  261. package/{engines/ferretdb/version-maps.ts → dist/engines/ferretdb/version-maps.js} +62 -79
  262. package/dist/engines/ferretdb/version-maps.js.map +1 -0
  263. package/dist/engines/file-based-utils.js +184 -0
  264. package/dist/engines/file-based-utils.js.map +1 -0
  265. package/dist/engines/index.js +124 -0
  266. package/dist/engines/index.js.map +1 -0
  267. package/dist/engines/influxdb/api-client.js +54 -0
  268. package/dist/engines/influxdb/api-client.js.map +1 -0
  269. package/dist/engines/influxdb/backup.js +119 -0
  270. package/dist/engines/influxdb/backup.js.map +1 -0
  271. package/dist/engines/influxdb/binary-manager.js +87 -0
  272. package/dist/engines/influxdb/binary-manager.js.map +1 -0
  273. package/dist/engines/influxdb/binary-urls.js +56 -0
  274. package/dist/engines/influxdb/binary-urls.js.map +1 -0
  275. package/dist/engines/influxdb/hostdb-releases.js +21 -0
  276. package/dist/engines/influxdb/hostdb-releases.js.map +1 -0
  277. package/dist/engines/influxdb/index.js +962 -0
  278. package/dist/engines/influxdb/index.js.map +1 -0
  279. package/dist/engines/influxdb/restore.js +329 -0
  280. package/dist/engines/influxdb/restore.js.map +1 -0
  281. package/dist/engines/influxdb/version-maps.js +64 -0
  282. package/dist/engines/influxdb/version-maps.js.map +1 -0
  283. package/dist/engines/influxdb/version-validator.js +109 -0
  284. package/dist/engines/influxdb/version-validator.js.map +1 -0
  285. package/dist/engines/mariadb/backup.js +178 -0
  286. package/dist/engines/mariadb/backup.js.map +1 -0
  287. package/dist/engines/mariadb/binary-manager.js +33 -0
  288. package/dist/engines/mariadb/binary-manager.js.map +1 -0
  289. package/{engines/mariadb/binary-urls.ts → dist/engines/mariadb/binary-urls.js} +38 -55
  290. package/dist/engines/mariadb/binary-urls.js.map +1 -0
  291. package/dist/engines/mariadb/hostdb-releases.js +21 -0
  292. package/dist/engines/mariadb/hostdb-releases.js.map +1 -0
  293. package/dist/engines/mariadb/index.js +1011 -0
  294. package/dist/engines/mariadb/index.js.map +1 -0
  295. package/dist/engines/mariadb/restore.js +322 -0
  296. package/dist/engines/mariadb/restore.js.map +1 -0
  297. package/dist/engines/mariadb/version-maps.js +63 -0
  298. package/dist/engines/mariadb/version-maps.js.map +1 -0
  299. package/dist/engines/mariadb/version-validator.js +143 -0
  300. package/dist/engines/mariadb/version-validator.js.map +1 -0
  301. package/dist/engines/meilisearch/api-client.js +50 -0
  302. package/dist/engines/meilisearch/api-client.js.map +1 -0
  303. package/dist/engines/meilisearch/backup.js +167 -0
  304. package/dist/engines/meilisearch/backup.js.map +1 -0
  305. package/dist/engines/meilisearch/binary-manager.js +31 -0
  306. package/dist/engines/meilisearch/binary-manager.js.map +1 -0
  307. package/dist/engines/meilisearch/binary-urls.js +56 -0
  308. package/dist/engines/meilisearch/binary-urls.js.map +1 -0
  309. package/dist/engines/meilisearch/hostdb-releases.js +21 -0
  310. package/dist/engines/meilisearch/hostdb-releases.js.map +1 -0
  311. package/dist/engines/meilisearch/index.js +992 -0
  312. package/dist/engines/meilisearch/index.js.map +1 -0
  313. package/dist/engines/meilisearch/restore.js +167 -0
  314. package/dist/engines/meilisearch/restore.js.map +1 -0
  315. package/dist/engines/meilisearch/version-maps.js +67 -0
  316. package/dist/engines/meilisearch/version-maps.js.map +1 -0
  317. package/dist/engines/meilisearch/version-validator.js +109 -0
  318. package/dist/engines/meilisearch/version-validator.js.map +1 -0
  319. package/dist/engines/mongodb/backup.js +109 -0
  320. package/dist/engines/mongodb/backup.js.map +1 -0
  321. package/dist/engines/mongodb/binary-manager.js +36 -0
  322. package/dist/engines/mongodb/binary-manager.js.map +1 -0
  323. package/dist/engines/mongodb/binary-urls.js +46 -0
  324. package/dist/engines/mongodb/binary-urls.js.map +1 -0
  325. package/dist/engines/mongodb/cli-utils.js +131 -0
  326. package/dist/engines/mongodb/cli-utils.js.map +1 -0
  327. package/dist/engines/mongodb/hostdb-releases.js +77 -0
  328. package/dist/engines/mongodb/hostdb-releases.js.map +1 -0
  329. package/dist/engines/mongodb/index.js +873 -0
  330. package/dist/engines/mongodb/index.js.map +1 -0
  331. package/dist/engines/mongodb/restore.js +276 -0
  332. package/dist/engines/mongodb/restore.js.map +1 -0
  333. package/dist/engines/mongodb/version-maps.js +79 -0
  334. package/dist/engines/mongodb/version-maps.js.map +1 -0
  335. package/dist/engines/mongodb/version-validator.js +133 -0
  336. package/dist/engines/mongodb/version-validator.js.map +1 -0
  337. package/dist/engines/mysql/backup.js +210 -0
  338. package/dist/engines/mysql/backup.js.map +1 -0
  339. package/dist/engines/mysql/binary-detection.js +325 -0
  340. package/dist/engines/mysql/binary-detection.js.map +1 -0
  341. package/dist/engines/mysql/binary-manager.js +30 -0
  342. package/dist/engines/mysql/binary-manager.js.map +1 -0
  343. package/dist/engines/mysql/binary-urls.js +87 -0
  344. package/dist/engines/mysql/binary-urls.js.map +1 -0
  345. package/{engines/mysql/hostdb-releases.ts → dist/engines/mysql/hostdb-releases.js} +20 -23
  346. package/dist/engines/mysql/hostdb-releases.js.map +1 -0
  347. package/dist/engines/mysql/index.js +1066 -0
  348. package/dist/engines/mysql/index.js.map +1 -0
  349. package/dist/engines/mysql/restore.js +361 -0
  350. package/dist/engines/mysql/restore.js.map +1 -0
  351. package/dist/engines/mysql/version-maps.js +79 -0
  352. package/dist/engines/mysql/version-maps.js.map +1 -0
  353. package/dist/engines/mysql/version-validator.js +266 -0
  354. package/dist/engines/mysql/version-validator.js.map +1 -0
  355. package/dist/engines/postgresql/backup.js +118 -0
  356. package/dist/engines/postgresql/backup.js.map +1 -0
  357. package/dist/engines/postgresql/binary-manager.js +85 -0
  358. package/dist/engines/postgresql/binary-manager.js.map +1 -0
  359. package/dist/engines/postgresql/binary-urls.js +80 -0
  360. package/dist/engines/postgresql/binary-urls.js.map +1 -0
  361. package/dist/engines/postgresql/hostdb-releases.js +21 -0
  362. package/dist/engines/postgresql/hostdb-releases.js.map +1 -0
  363. package/dist/engines/postgresql/index.js +852 -0
  364. package/dist/engines/postgresql/index.js.map +1 -0
  365. package/dist/engines/postgresql/remote-version.js +109 -0
  366. package/dist/engines/postgresql/remote-version.js.map +1 -0
  367. package/dist/engines/postgresql/restore.js +254 -0
  368. package/dist/engines/postgresql/restore.js.map +1 -0
  369. package/dist/engines/postgresql/version-maps.js +73 -0
  370. package/dist/engines/postgresql/version-maps.js.map +1 -0
  371. package/dist/engines/postgresql/version-validator.js +286 -0
  372. package/dist/engines/postgresql/version-validator.js.map +1 -0
  373. package/dist/engines/qdrant/api-client.js +50 -0
  374. package/dist/engines/qdrant/api-client.js.map +1 -0
  375. package/dist/engines/qdrant/backup.js +115 -0
  376. package/dist/engines/qdrant/backup.js.map +1 -0
  377. package/dist/engines/qdrant/binary-manager.js +31 -0
  378. package/dist/engines/qdrant/binary-manager.js.map +1 -0
  379. package/dist/engines/qdrant/binary-urls.js +92 -0
  380. package/dist/engines/qdrant/binary-urls.js.map +1 -0
  381. package/dist/engines/qdrant/cli-utils.js +39 -0
  382. package/dist/engines/qdrant/cli-utils.js.map +1 -0
  383. package/dist/engines/qdrant/hostdb-releases.js +21 -0
  384. package/dist/engines/qdrant/hostdb-releases.js.map +1 -0
  385. package/dist/engines/qdrant/index.js +1002 -0
  386. package/dist/engines/qdrant/index.js.map +1 -0
  387. package/dist/engines/qdrant/restore.js +154 -0
  388. package/dist/engines/qdrant/restore.js.map +1 -0
  389. package/dist/engines/qdrant/version-maps.js +67 -0
  390. package/dist/engines/qdrant/version-maps.js.map +1 -0
  391. package/dist/engines/qdrant/version-validator.js +109 -0
  392. package/dist/engines/qdrant/version-validator.js.map +1 -0
  393. package/dist/engines/questdb/backup.js +191 -0
  394. package/dist/engines/questdb/backup.js.map +1 -0
  395. package/dist/engines/questdb/binary-manager.js +247 -0
  396. package/dist/engines/questdb/binary-manager.js.map +1 -0
  397. package/dist/engines/questdb/binary-urls.js +27 -0
  398. package/dist/engines/questdb/binary-urls.js.map +1 -0
  399. package/dist/engines/questdb/hostdb-releases.js +21 -0
  400. package/dist/engines/questdb/hostdb-releases.js.map +1 -0
  401. package/dist/engines/questdb/index.js +814 -0
  402. package/dist/engines/questdb/index.js.map +1 -0
  403. package/dist/engines/questdb/restore.js +202 -0
  404. package/dist/engines/questdb/restore.js.map +1 -0
  405. package/dist/engines/questdb/version-maps.js +33 -0
  406. package/dist/engines/questdb/version-maps.js.map +1 -0
  407. package/dist/engines/questdb/version-validator.js +99 -0
  408. package/dist/engines/questdb/version-validator.js.map +1 -0
  409. package/dist/engines/redis/backup.js +292 -0
  410. package/dist/engines/redis/backup.js.map +1 -0
  411. package/dist/engines/redis/binary-manager.js +32 -0
  412. package/dist/engines/redis/binary-manager.js.map +1 -0
  413. package/dist/engines/redis/binary-urls.js +96 -0
  414. package/dist/engines/redis/binary-urls.js.map +1 -0
  415. package/dist/engines/redis/cli-utils.js +38 -0
  416. package/dist/engines/redis/cli-utils.js.map +1 -0
  417. package/dist/engines/redis/hostdb-releases.js +21 -0
  418. package/dist/engines/redis/hostdb-releases.js.map +1 -0
  419. package/dist/engines/redis/index.js +1263 -0
  420. package/dist/engines/redis/index.js.map +1 -0
  421. package/dist/engines/redis/restore.js +338 -0
  422. package/dist/engines/redis/restore.js.map +1 -0
  423. package/dist/engines/redis/version-maps.js +70 -0
  424. package/dist/engines/redis/version-maps.js.map +1 -0
  425. package/dist/engines/redis/version-validator.js +109 -0
  426. package/dist/engines/redis/version-validator.js.map +1 -0
  427. package/dist/engines/sqlite/binary-manager.js +39 -0
  428. package/dist/engines/sqlite/binary-manager.js.map +1 -0
  429. package/{engines/sqlite/binary-urls.ts → dist/engines/sqlite/binary-urls.js} +11 -16
  430. package/dist/engines/sqlite/binary-urls.js.map +1 -0
  431. package/dist/engines/sqlite/hostdb-releases.js +21 -0
  432. package/dist/engines/sqlite/hostdb-releases.js.map +1 -0
  433. package/dist/engines/sqlite/index.js +493 -0
  434. package/dist/engines/sqlite/index.js.map +1 -0
  435. package/dist/engines/sqlite/registry.js +163 -0
  436. package/dist/engines/sqlite/registry.js.map +1 -0
  437. package/dist/engines/sqlite/scanner.js +12 -0
  438. package/dist/engines/sqlite/scanner.js.map +1 -0
  439. package/dist/engines/sqlite/version-maps.js +57 -0
  440. package/dist/engines/sqlite/version-maps.js.map +1 -0
  441. package/dist/engines/surrealdb/backup.js +97 -0
  442. package/dist/engines/surrealdb/backup.js.map +1 -0
  443. package/dist/engines/surrealdb/binary-manager.js +33 -0
  444. package/dist/engines/surrealdb/binary-manager.js.map +1 -0
  445. package/dist/engines/surrealdb/binary-urls.js +33 -0
  446. package/dist/engines/surrealdb/binary-urls.js.map +1 -0
  447. package/dist/engines/surrealdb/cli-utils.js +147 -0
  448. package/dist/engines/surrealdb/cli-utils.js.map +1 -0
  449. package/dist/engines/surrealdb/hostdb-releases.js +21 -0
  450. package/dist/engines/surrealdb/hostdb-releases.js.map +1 -0
  451. package/dist/engines/surrealdb/index.js +1022 -0
  452. package/dist/engines/surrealdb/index.js.map +1 -0
  453. package/dist/engines/surrealdb/restore.js +224 -0
  454. package/dist/engines/surrealdb/restore.js.map +1 -0
  455. package/dist/engines/surrealdb/version-maps.js +36 -0
  456. package/dist/engines/surrealdb/version-maps.js.map +1 -0
  457. package/dist/engines/tigerbeetle/backup.js +36 -0
  458. package/dist/engines/tigerbeetle/backup.js.map +1 -0
  459. package/dist/engines/tigerbeetle/binary-manager.js +72 -0
  460. package/dist/engines/tigerbeetle/binary-manager.js.map +1 -0
  461. package/dist/engines/tigerbeetle/binary-urls.js +49 -0
  462. package/dist/engines/tigerbeetle/binary-urls.js.map +1 -0
  463. package/dist/engines/tigerbeetle/hostdb-releases.js +21 -0
  464. package/dist/engines/tigerbeetle/hostdb-releases.js.map +1 -0
  465. package/dist/engines/tigerbeetle/index.js +559 -0
  466. package/dist/engines/tigerbeetle/index.js.map +1 -0
  467. package/dist/engines/tigerbeetle/restore.js +91 -0
  468. package/dist/engines/tigerbeetle/restore.js.map +1 -0
  469. package/{engines/tigerbeetle/version-maps.ts → dist/engines/tigerbeetle/version-maps.js} +22 -31
  470. package/dist/engines/tigerbeetle/version-maps.js.map +1 -0
  471. package/dist/engines/tigerbeetle/version-validator.js +108 -0
  472. package/dist/engines/tigerbeetle/version-validator.js.map +1 -0
  473. package/dist/engines/typedb/backup.js +129 -0
  474. package/dist/engines/typedb/backup.js.map +1 -0
  475. package/dist/engines/typedb/binary-manager.js +151 -0
  476. package/dist/engines/typedb/binary-manager.js.map +1 -0
  477. package/dist/engines/typedb/binary-urls.js +33 -0
  478. package/dist/engines/typedb/binary-urls.js.map +1 -0
  479. package/dist/engines/typedb/cli-utils.js +163 -0
  480. package/dist/engines/typedb/cli-utils.js.map +1 -0
  481. package/dist/engines/typedb/hostdb-releases.js +21 -0
  482. package/dist/engines/typedb/hostdb-releases.js.map +1 -0
  483. package/dist/engines/typedb/index.js +1003 -0
  484. package/dist/engines/typedb/index.js.map +1 -0
  485. package/dist/engines/typedb/restore.js +279 -0
  486. package/dist/engines/typedb/restore.js.map +1 -0
  487. package/dist/engines/typedb/version-maps.js +40 -0
  488. package/dist/engines/typedb/version-maps.js.map +1 -0
  489. package/dist/engines/typedb/version-validator.js +103 -0
  490. package/dist/engines/typedb/version-validator.js.map +1 -0
  491. package/dist/engines/valkey/backup.js +292 -0
  492. package/dist/engines/valkey/backup.js.map +1 -0
  493. package/dist/engines/valkey/binary-manager.js +33 -0
  494. package/dist/engines/valkey/binary-manager.js.map +1 -0
  495. package/dist/engines/valkey/binary-urls.js +98 -0
  496. package/dist/engines/valkey/binary-urls.js.map +1 -0
  497. package/dist/engines/valkey/cli-utils.js +38 -0
  498. package/dist/engines/valkey/cli-utils.js.map +1 -0
  499. package/dist/engines/valkey/hostdb-releases.js +21 -0
  500. package/dist/engines/valkey/hostdb-releases.js.map +1 -0
  501. package/dist/engines/valkey/index.js +1257 -0
  502. package/dist/engines/valkey/index.js.map +1 -0
  503. package/dist/engines/valkey/restore.js +340 -0
  504. package/dist/engines/valkey/restore.js.map +1 -0
  505. package/dist/engines/valkey/version-maps.js +70 -0
  506. package/dist/engines/valkey/version-maps.js.map +1 -0
  507. package/dist/engines/valkey/version-validator.js +112 -0
  508. package/dist/engines/valkey/version-validator.js.map +1 -0
  509. package/dist/engines/weaviate/api-client.js +50 -0
  510. package/dist/engines/weaviate/api-client.js.map +1 -0
  511. package/dist/engines/weaviate/backup.js +95 -0
  512. package/dist/engines/weaviate/backup.js.map +1 -0
  513. package/dist/engines/weaviate/binary-manager.js +58 -0
  514. package/dist/engines/weaviate/binary-manager.js.map +1 -0
  515. package/dist/engines/weaviate/binary-urls.js +92 -0
  516. package/dist/engines/weaviate/binary-urls.js.map +1 -0
  517. package/dist/engines/weaviate/cli-utils.js +39 -0
  518. package/dist/engines/weaviate/cli-utils.js.map +1 -0
  519. package/dist/engines/weaviate/hostdb-releases.js +21 -0
  520. package/dist/engines/weaviate/hostdb-releases.js.map +1 -0
  521. package/dist/engines/weaviate/index.js +871 -0
  522. package/dist/engines/weaviate/index.js.map +1 -0
  523. package/dist/engines/weaviate/restore.js +185 -0
  524. package/dist/engines/weaviate/restore.js.map +1 -0
  525. package/dist/engines/weaviate/version-maps.js +67 -0
  526. package/dist/engines/weaviate/version-maps.js.map +1 -0
  527. package/dist/engines/weaviate/version-validator.js +109 -0
  528. package/dist/engines/weaviate/version-validator.js.map +1 -0
  529. package/dist/types/index.js +102 -0
  530. package/dist/types/index.js.map +1 -0
  531. package/package.json +12 -9
  532. package/bin/cli.js +0 -68
  533. package/cli/bin.ts +0 -10
  534. package/cli/commands/attach.ts +0 -139
  535. package/cli/commands/backup.ts +0 -290
  536. package/cli/commands/backups.ts +0 -247
  537. package/cli/commands/clone.ts +0 -159
  538. package/cli/commands/config.ts +0 -367
  539. package/cli/commands/connect.ts +0 -684
  540. package/cli/commands/create.ts +0 -1201
  541. package/cli/commands/databases.ts +0 -630
  542. package/cli/commands/delete.ts +0 -133
  543. package/cli/commands/deps.ts +0 -342
  544. package/cli/commands/detach.ts +0 -107
  545. package/cli/commands/doctor.ts +0 -689
  546. package/cli/commands/duckdb.ts +0 -273
  547. package/cli/commands/edit.ts +0 -683
  548. package/cli/commands/engines.ts +0 -1914
  549. package/cli/commands/export.ts +0 -544
  550. package/cli/commands/info.ts +0 -340
  551. package/cli/commands/list.ts +0 -284
  552. package/cli/commands/logs.ts +0 -102
  553. package/cli/commands/menu/backup-handlers.ts +0 -1571
  554. package/cli/commands/menu/container-handlers.ts +0 -2288
  555. package/cli/commands/menu/engine-handlers.ts +0 -355
  556. package/cli/commands/menu/index.ts +0 -342
  557. package/cli/commands/menu/settings-handlers.ts +0 -365
  558. package/cli/commands/menu/shared.ts +0 -23
  559. package/cli/commands/menu/shell-handlers.ts +0 -1811
  560. package/cli/commands/menu/sql-handlers.ts +0 -231
  561. package/cli/commands/menu/update-handlers.ts +0 -378
  562. package/cli/commands/menu/validators.ts +0 -8
  563. package/cli/commands/ports.ts +0 -211
  564. package/cli/commands/pull.ts +0 -223
  565. package/cli/commands/query.ts +0 -241
  566. package/cli/commands/restore.ts +0 -587
  567. package/cli/commands/run.ts +0 -178
  568. package/cli/commands/self-update.ts +0 -121
  569. package/cli/commands/sqlite.ts +0 -273
  570. package/cli/commands/start.ts +0 -218
  571. package/cli/commands/stop.ts +0 -241
  572. package/cli/commands/url.ts +0 -104
  573. package/cli/commands/users.ts +0 -264
  574. package/cli/commands/version.ts +0 -55
  575. package/cli/commands/which.ts +0 -290
  576. package/cli/constants.ts +0 -233
  577. package/cli/helpers.ts +0 -1593
  578. package/cli/index.ts +0 -162
  579. package/cli/ui/prompts.ts +0 -1525
  580. package/cli/ui/spinner.ts +0 -88
  581. package/cli/ui/theme.ts +0 -128
  582. package/cli/utils/file-follower.ts +0 -93
  583. package/config/backup-formats.ts +0 -446
  584. package/config/defaults.ts +0 -56
  585. package/config/engine-defaults.ts +0 -336
  586. package/config/engines-registry.ts +0 -150
  587. package/config/engines.schema.json +0 -135
  588. package/config/os-dependencies.ts +0 -888
  589. package/config/paths.ts +0 -200
  590. package/core/backup-restore.ts +0 -330
  591. package/core/base-binary-manager.ts +0 -562
  592. package/core/base-document-binary-manager.ts +0 -523
  593. package/core/base-embedded-binary-manager.ts +0 -547
  594. package/core/base-server-binary-manager.ts +0 -523
  595. package/core/config-manager.ts +0 -652
  596. package/core/container-manager.ts +0 -787
  597. package/core/credential-generator.ts +0 -93
  598. package/core/credential-manager.ts +0 -259
  599. package/core/dblab-utils.ts +0 -113
  600. package/core/dependency-manager.ts +0 -512
  601. package/core/docker-exporter.ts +0 -1345
  602. package/core/error-handler.ts +0 -419
  603. package/core/fs-error-utils.ts +0 -82
  604. package/core/homebrew-version-manager.ts +0 -352
  605. package/core/hostdb-client.ts +0 -344
  606. package/core/hostdb-metadata.ts +0 -350
  607. package/core/hostdb-releases-factory.ts +0 -237
  608. package/core/library-env.ts +0 -118
  609. package/core/pgweb-utils.ts +0 -62
  610. package/core/platform-service.ts +0 -829
  611. package/core/port-manager.ts +0 -165
  612. package/core/process-manager.ts +0 -576
  613. package/core/pull-manager.ts +0 -511
  614. package/core/query-parser.ts +0 -514
  615. package/core/spawn-utils.ts +0 -122
  616. package/core/start-with-retry.ts +0 -130
  617. package/core/test-cleanup.ts +0 -108
  618. package/core/tls-generator.ts +0 -116
  619. package/core/transaction-manager.ts +0 -158
  620. package/core/update-manager.ts +0 -308
  621. package/core/version-migration.ts +0 -346
  622. package/core/version-utils.ts +0 -104
  623. package/engines/base-engine.ts +0 -340
  624. package/engines/clickhouse/README.md +0 -231
  625. package/engines/clickhouse/backup.ts +0 -398
  626. package/engines/clickhouse/binary-manager.ts +0 -201
  627. package/engines/clickhouse/binary-urls.ts +0 -125
  628. package/engines/clickhouse/cli-utils.ts +0 -176
  629. package/engines/clickhouse/hostdb-releases.ts +0 -30
  630. package/engines/clickhouse/index.ts +0 -1345
  631. package/engines/clickhouse/restore.ts +0 -466
  632. package/engines/clickhouse/version-maps.ts +0 -95
  633. package/engines/clickhouse/version-validator.ts +0 -154
  634. package/engines/cockroachdb/README.md +0 -170
  635. package/engines/cockroachdb/backup.ts +0 -376
  636. package/engines/cockroachdb/binary-manager.ts +0 -45
  637. package/engines/cockroachdb/binary-urls.ts +0 -40
  638. package/engines/cockroachdb/cli-utils.ts +0 -384
  639. package/engines/cockroachdb/hostdb-releases.ts +0 -26
  640. package/engines/cockroachdb/index.ts +0 -1276
  641. package/engines/cockroachdb/restore.ts +0 -455
  642. package/engines/cockroachdb/version-maps.ts +0 -42
  643. package/engines/couchdb/README.md +0 -257
  644. package/engines/couchdb/api-client.ts +0 -81
  645. package/engines/couchdb/backup.ts +0 -137
  646. package/engines/couchdb/binary-manager.ts +0 -86
  647. package/engines/couchdb/binary-urls.ts +0 -115
  648. package/engines/couchdb/hostdb-releases.ts +0 -23
  649. package/engines/couchdb/index.ts +0 -1429
  650. package/engines/couchdb/restore.ts +0 -290
  651. package/engines/couchdb/version-maps.ts +0 -78
  652. package/engines/couchdb/version-validator.ts +0 -111
  653. package/engines/duckdb/README.md +0 -154
  654. package/engines/duckdb/binary-manager.ts +0 -45
  655. package/engines/duckdb/hostdb-releases.ts +0 -23
  656. package/engines/duckdb/index.ts +0 -749
  657. package/engines/duckdb/registry.ts +0 -303
  658. package/engines/duckdb/scanner.ts +0 -22
  659. package/engines/duckdb/version-maps.ts +0 -78
  660. package/engines/duckdb/version-validator.ts +0 -78
  661. package/engines/ferretdb/README.md +0 -262
  662. package/engines/ferretdb/backup.ts +0 -173
  663. package/engines/ferretdb/binary-manager.ts +0 -1095
  664. package/engines/ferretdb/binary-urls.ts +0 -183
  665. package/engines/ferretdb/index.ts +0 -1907
  666. package/engines/ferretdb/restore.ts +0 -357
  667. package/engines/file-based-utils.ts +0 -262
  668. package/engines/index.ts +0 -131
  669. package/engines/influxdb/README.md +0 -180
  670. package/engines/influxdb/api-client.ts +0 -64
  671. package/engines/influxdb/backup.ts +0 -160
  672. package/engines/influxdb/binary-manager.ts +0 -110
  673. package/engines/influxdb/binary-urls.ts +0 -69
  674. package/engines/influxdb/hostdb-releases.ts +0 -23
  675. package/engines/influxdb/index.ts +0 -1272
  676. package/engines/influxdb/restore.ts +0 -417
  677. package/engines/influxdb/version-maps.ts +0 -75
  678. package/engines/influxdb/version-validator.ts +0 -128
  679. package/engines/mariadb/README.md +0 -141
  680. package/engines/mariadb/backup.ts +0 -233
  681. package/engines/mariadb/binary-manager.ts +0 -45
  682. package/engines/mariadb/hostdb-releases.ts +0 -23
  683. package/engines/mariadb/index.ts +0 -1300
  684. package/engines/mariadb/restore.ts +0 -447
  685. package/engines/mariadb/version-maps.ts +0 -72
  686. package/engines/mariadb/version-validator.ts +0 -181
  687. package/engines/meilisearch/README.md +0 -255
  688. package/engines/meilisearch/api-client.ts +0 -61
  689. package/engines/meilisearch/backup.ts +0 -233
  690. package/engines/meilisearch/binary-manager.ts +0 -43
  691. package/engines/meilisearch/binary-urls.ts +0 -69
  692. package/engines/meilisearch/hostdb-releases.ts +0 -26
  693. package/engines/meilisearch/index.ts +0 -1292
  694. package/engines/meilisearch/restore.ts +0 -219
  695. package/engines/meilisearch/version-maps.ts +0 -78
  696. package/engines/meilisearch/version-validator.ts +0 -128
  697. package/engines/mongodb/README.md +0 -162
  698. package/engines/mongodb/backup.ts +0 -127
  699. package/engines/mongodb/binary-manager.ts +0 -48
  700. package/engines/mongodb/binary-urls.ts +0 -63
  701. package/engines/mongodb/cli-utils.ts +0 -171
  702. package/engines/mongodb/hostdb-releases.ts +0 -91
  703. package/engines/mongodb/index.ts +0 -1118
  704. package/engines/mongodb/restore.ts +0 -361
  705. package/engines/mongodb/version-maps.ts +0 -91
  706. package/engines/mongodb/version-validator.ts +0 -160
  707. package/engines/mysql/README.md +0 -142
  708. package/engines/mysql/backup.ts +0 -270
  709. package/engines/mysql/binary-detection.ts +0 -408
  710. package/engines/mysql/binary-manager.ts +0 -42
  711. package/engines/mysql/binary-urls.ts +0 -104
  712. package/engines/mysql/index.ts +0 -1361
  713. package/engines/mysql/restore.ts +0 -500
  714. package/engines/mysql/version-maps.ts +0 -91
  715. package/engines/mysql/version-validator.ts +0 -369
  716. package/engines/postgresql/README.md +0 -158
  717. package/engines/postgresql/backup.ts +0 -151
  718. package/engines/postgresql/binary-manager.ts +0 -114
  719. package/engines/postgresql/binary-urls.ts +0 -99
  720. package/engines/postgresql/hostdb-releases.ts +0 -26
  721. package/engines/postgresql/index.ts +0 -1143
  722. package/engines/postgresql/remote-version.ts +0 -161
  723. package/engines/postgresql/restore.ts +0 -342
  724. package/engines/postgresql/version-maps.ts +0 -83
  725. package/engines/postgresql/version-validator.ts +0 -413
  726. package/engines/qdrant/README.md +0 -222
  727. package/engines/qdrant/api-client.ts +0 -61
  728. package/engines/qdrant/backup.ts +0 -165
  729. package/engines/qdrant/binary-manager.ts +0 -43
  730. package/engines/qdrant/binary-urls.ts +0 -115
  731. package/engines/qdrant/cli-utils.ts +0 -43
  732. package/engines/qdrant/hostdb-releases.ts +0 -23
  733. package/engines/qdrant/index.ts +0 -1312
  734. package/engines/qdrant/restore.ts +0 -203
  735. package/engines/qdrant/version-maps.ts +0 -78
  736. package/engines/qdrant/version-validator.ts +0 -128
  737. package/engines/questdb/README.md +0 -334
  738. package/engines/questdb/backup.ts +0 -220
  739. package/engines/questdb/binary-manager.ts +0 -310
  740. package/engines/questdb/binary-urls.ts +0 -34
  741. package/engines/questdb/hostdb-releases.ts +0 -23
  742. package/engines/questdb/index.ts +0 -1023
  743. package/engines/questdb/restore.ts +0 -260
  744. package/engines/questdb/version-maps.ts +0 -37
  745. package/engines/questdb/version-validator.ts +0 -121
  746. package/engines/redis/README.md +0 -173
  747. package/engines/redis/backup.ts +0 -389
  748. package/engines/redis/binary-manager.ts +0 -44
  749. package/engines/redis/binary-urls.ts +0 -117
  750. package/engines/redis/cli-utils.ts +0 -42
  751. package/engines/redis/hostdb-releases.ts +0 -23
  752. package/engines/redis/index.ts +0 -1583
  753. package/engines/redis/restore.ts +0 -443
  754. package/engines/redis/version-maps.ts +0 -81
  755. package/engines/redis/version-validator.ts +0 -131
  756. package/engines/sqlite/README.md +0 -162
  757. package/engines/sqlite/binary-manager.ts +0 -52
  758. package/engines/sqlite/hostdb-releases.ts +0 -23
  759. package/engines/sqlite/index.ts +0 -641
  760. package/engines/sqlite/registry.ts +0 -198
  761. package/engines/sqlite/scanner.ts +0 -22
  762. package/engines/sqlite/version-maps.ts +0 -64
  763. package/engines/surrealdb/README.md +0 -218
  764. package/engines/surrealdb/backup.ts +0 -131
  765. package/engines/surrealdb/binary-manager.ts +0 -45
  766. package/engines/surrealdb/binary-urls.ts +0 -40
  767. package/engines/surrealdb/cli-utils.ts +0 -173
  768. package/engines/surrealdb/hostdb-releases.ts +0 -23
  769. package/engines/surrealdb/index.ts +0 -1246
  770. package/engines/surrealdb/restore.ts +0 -302
  771. package/engines/surrealdb/version-maps.ts +0 -41
  772. package/engines/tigerbeetle/README.md +0 -61
  773. package/engines/tigerbeetle/backup.ts +0 -49
  774. package/engines/tigerbeetle/binary-manager.ts +0 -95
  775. package/engines/tigerbeetle/binary-urls.ts +0 -62
  776. package/engines/tigerbeetle/hostdb-releases.ts +0 -26
  777. package/engines/tigerbeetle/index.ts +0 -746
  778. package/engines/tigerbeetle/restore.ts +0 -130
  779. package/engines/tigerbeetle/version-validator.ts +0 -126
  780. package/engines/typedb/backup.ts +0 -167
  781. package/engines/typedb/binary-manager.ts +0 -200
  782. package/engines/typedb/binary-urls.ts +0 -40
  783. package/engines/typedb/cli-utils.ts +0 -210
  784. package/engines/typedb/hostdb-releases.ts +0 -23
  785. package/engines/typedb/index.ts +0 -1275
  786. package/engines/typedb/restore.ts +0 -377
  787. package/engines/typedb/version-maps.ts +0 -48
  788. package/engines/typedb/version-validator.ts +0 -127
  789. package/engines/valkey/README.md +0 -219
  790. package/engines/valkey/backup.ts +0 -389
  791. package/engines/valkey/binary-manager.ts +0 -45
  792. package/engines/valkey/binary-urls.ts +0 -122
  793. package/engines/valkey/cli-utils.ts +0 -42
  794. package/engines/valkey/hostdb-releases.ts +0 -23
  795. package/engines/valkey/index.ts +0 -1585
  796. package/engines/valkey/restore.ts +0 -446
  797. package/engines/valkey/version-maps.ts +0 -81
  798. package/engines/valkey/version-validator.ts +0 -131
  799. package/engines/weaviate/README.md +0 -302
  800. package/engines/weaviate/api-client.ts +0 -61
  801. package/engines/weaviate/backup.ts +0 -145
  802. package/engines/weaviate/binary-manager.ts +0 -80
  803. package/engines/weaviate/binary-urls.ts +0 -115
  804. package/engines/weaviate/cli-utils.ts +0 -43
  805. package/engines/weaviate/hostdb-releases.ts +0 -23
  806. package/engines/weaviate/index.ts +0 -1139
  807. package/engines/weaviate/restore.ts +0 -235
  808. package/engines/weaviate/version-maps.ts +0 -78
  809. package/engines/weaviate/version-validator.ts +0 -128
  810. package/types/index.ts +0 -624
  811. /package/{config → dist/config}/engines.json +0 -0
@@ -1,1345 +0,0 @@
1
- import { spawn, type SpawnOptions } from 'child_process'
2
- import { existsSync } from 'fs'
3
- import { mkdir, writeFile, readFile, unlink, chmod } from 'fs/promises'
4
- import { join } from 'path'
5
- import { BaseEngine } from '../base-engine'
6
- import { paths } from '../../config/paths'
7
- import { getEngineDefaults } from '../../config/defaults'
8
- import { platformService } from '../../core/platform-service'
9
- import { configManager } from '../../core/config-manager'
10
- import {
11
- logDebug,
12
- logWarning,
13
- assertValidUsername,
14
- } from '../../core/error-handler'
15
- import { processManager } from '../../core/process-manager'
16
- import { clickhouseBinaryManager } from './binary-manager'
17
- import { getBinaryUrl } from './binary-urls'
18
- import {
19
- normalizeVersion,
20
- SUPPORTED_MAJOR_VERSIONS,
21
- CLICKHOUSE_VERSION_MAP,
22
- } from './version-maps'
23
- import { fetchAvailableVersions as fetchHostdbVersions } from './hostdb-releases'
24
- import {
25
- detectBackupFormat as detectBackupFormatImpl,
26
- restoreBackup,
27
- } from './restore'
28
- import { createBackup } from './backup'
29
- import {
30
- validateClickHouseIdentifier,
31
- escapeClickHouseIdentifier,
32
- } from './cli-utils'
33
- import {
34
- type Platform,
35
- type Arch,
36
- type ContainerConfig,
37
- type ProgressCallback,
38
- type BackupFormat,
39
- type BackupOptions,
40
- type BackupResult,
41
- type RestoreResult,
42
- type DumpResult,
43
- type StatusResult,
44
- type QueryResult,
45
- type QueryOptions,
46
- type CreateUserOptions,
47
- type UserCredentials,
48
- } from '../../types'
49
- import { parseClickHouseJSONResult } from '../../core/query-parser'
50
-
51
- const ENGINE = 'clickhouse'
52
- const engineDef = getEngineDefaults(ENGINE)
53
-
54
- /**
55
- * Generate ClickHouse server configuration XML
56
- */
57
- function generateClickHouseConfig(options: {
58
- port: number
59
- httpPort: number
60
- dataDir: string
61
- logDir: string
62
- tmpDir: string
63
- pidFile: string
64
- }): string {
65
- const { port, httpPort, dataDir, logDir, tmpDir, pidFile } = options
66
-
67
- return `<?xml version="1.0"?>
68
- <clickhouse>
69
- <logger>
70
- <level>information</level>
71
- <log>${logDir}/clickhouse-server.log</log>
72
- <errorlog>${logDir}/clickhouse-server.err.log</errorlog>
73
- <size>100M</size>
74
- <count>3</count>
75
- </logger>
76
-
77
- <http_port>${httpPort}</http_port>
78
- <tcp_port>${port}</tcp_port>
79
-
80
- <listen_host>127.0.0.1</listen_host>
81
-
82
- <pid_file>${pidFile}</pid_file>
83
-
84
- <path>${dataDir}/</path>
85
- <tmp_path>${tmpDir}/</tmp_path>
86
- <user_files_path>${dataDir}/user_files/</user_files_path>
87
-
88
- <users_config>users.xml</users_config>
89
-
90
- <default_profile>default</default_profile>
91
- <default_database>default</default_database>
92
-
93
- <mark_cache_size>5368709120</mark_cache_size>
94
- <max_concurrent_queries>100</max_concurrent_queries>
95
-
96
- <user_directories>
97
- <users_xml>
98
- <path>users.xml</path>
99
- </users_xml>
100
- <local_directory>
101
- <path>${dataDir}/access/</path>
102
- </local_directory>
103
- </user_directories>
104
- </clickhouse>
105
- `
106
- }
107
-
108
- /**
109
- * Generate ClickHouse users configuration XML
110
- */
111
- function generateUsersConfig(): string {
112
- return `<?xml version="1.0"?>
113
- <clickhouse>
114
- <profiles>
115
- <default>
116
- <max_memory_usage>10000000000</max_memory_usage>
117
- <use_uncompressed_cache>0</use_uncompressed_cache>
118
- <load_balancing>random</load_balancing>
119
- </default>
120
- </profiles>
121
-
122
- <users>
123
- <default>
124
- <password></password>
125
- <networks>
126
- <ip>127.0.0.1</ip>
127
- </networks>
128
- <profile>default</profile>
129
- <quota>default</quota>
130
- <access_management>1</access_management>
131
- </default>
132
- </users>
133
-
134
- <quotas>
135
- <default>
136
- <interval>
137
- <duration>3600</duration>
138
- <queries>0</queries>
139
- <errors>0</errors>
140
- <result_rows>0</result_rows>
141
- <read_rows>0</read_rows>
142
- <execution_time>0</execution_time>
143
- </interval>
144
- </default>
145
- </quotas>
146
- </clickhouse>
147
- `
148
- }
149
-
150
- /**
151
- * Parse a ClickHouse connection string
152
- * Format: clickhouse://[user:password@]host[:port][/database]
153
- *
154
- * Examples:
155
- * - clickhouse://localhost:8123
156
- * - clickhouse://default:password@localhost:8123/mydb
157
- * - clickhouse://user:pass@remote.host:8123/analytics
158
- */
159
- function parseClickHouseConnectionString(connectionString: string): {
160
- baseUrl: string
161
- user: string | undefined
162
- password: string | undefined
163
- database: string
164
- } {
165
- let url: URL
166
-
167
- // Normalize connection string
168
- let normalized = connectionString.trim()
169
-
170
- // Support clickhouse:// scheme (convert to http:// for URL parsing)
171
- if (normalized.startsWith('clickhouse://')) {
172
- normalized = normalized.replace('clickhouse://', 'http://')
173
- } else if (
174
- !normalized.startsWith('http://') &&
175
- !normalized.startsWith('https://')
176
- ) {
177
- throw new Error(
178
- `Invalid ClickHouse connection string: ${connectionString}\n` +
179
- 'Expected format: clickhouse://[user:password@]host:port[/database]',
180
- )
181
- }
182
-
183
- try {
184
- url = new URL(normalized)
185
- } catch {
186
- throw new Error(
187
- `Invalid ClickHouse connection string: ${connectionString}\n` +
188
- 'Expected format: clickhouse://[user:password@]host:port[/database]',
189
- )
190
- }
191
-
192
- const host = url.hostname || 'localhost'
193
- // ClickHouse HTTP API default port is 8123
194
- const port = parseInt(url.port, 10) || 8123
195
- const scheme = url.protocol === 'https:' ? 'https' : 'http'
196
-
197
- const user = url.username || undefined
198
- const password = url.password || undefined
199
-
200
- // Database is in the path
201
- let database = 'default'
202
- if (url.pathname && url.pathname !== '/') {
203
- database = url.pathname.replace(/^\//, '')
204
- }
205
-
206
- const baseUrl = `${scheme}://${host}:${port}`
207
-
208
- return { baseUrl, user, password, database }
209
- }
210
-
211
- export class ClickHouseEngine extends BaseEngine {
212
- name = ENGINE
213
- displayName = 'ClickHouse'
214
- defaultPort = engineDef.defaultPort
215
- supportedVersions = SUPPORTED_MAJOR_VERSIONS
216
-
217
- // Get platform info for binary operations
218
- getPlatformInfo(): { platform: Platform; arch: Arch } {
219
- return platformService.getPlatformInfo()
220
- }
221
-
222
- // Fetch available versions from hostdb (dynamically or from cache/fallback)
223
- async fetchAvailableVersions(): Promise<Record<string, string[]>> {
224
- return fetchHostdbVersions()
225
- }
226
-
227
- // Get binary download URL from hostdb
228
- getBinaryUrl(version: string, platform: Platform, arch: Arch): string {
229
- return getBinaryUrl(version, platform, arch)
230
- }
231
-
232
- // Resolves version string to full version (e.g., '25.12' -> '25.12.3.21')
233
- resolveFullVersion(version: string): string {
234
- if (/^\d+\.\d+\.\d+\.\d+$/.test(version)) {
235
- return version
236
- }
237
- return CLICKHOUSE_VERSION_MAP[version] || version
238
- }
239
-
240
- // Get the path where binaries for a version would be installed
241
- getBinaryPath(version: string): string {
242
- const fullVersion = this.resolveFullVersion(version)
243
- const { platform: p, arch: a } = this.getPlatformInfo()
244
- return paths.getBinaryPath({
245
- engine: 'clickhouse',
246
- version: fullVersion,
247
- platform: p,
248
- arch: a,
249
- })
250
- }
251
-
252
- // Verify that ClickHouse binaries are available
253
- async verifyBinary(binPath: string): Promise<boolean> {
254
- const clickhousePath = join(binPath, 'bin', 'clickhouse')
255
- return existsSync(clickhousePath)
256
- }
257
-
258
- // Check if a specific ClickHouse version is installed (downloaded)
259
- async isBinaryInstalled(version: string): Promise<boolean> {
260
- const { platform, arch } = this.getPlatformInfo()
261
- return clickhouseBinaryManager.isInstalled(version, platform, arch)
262
- }
263
-
264
- /**
265
- * Ensure ClickHouse binaries are available for a specific version
266
- * Downloads from hostdb if not already installed
267
- * Returns the path to the bin directory
268
- */
269
- async ensureBinaries(
270
- version: string,
271
- onProgress?: ProgressCallback,
272
- ): Promise<string> {
273
- const { platform, arch } = this.getPlatformInfo()
274
-
275
- const binPath = await clickhouseBinaryManager.ensureInstalled(
276
- version,
277
- platform,
278
- arch,
279
- onProgress,
280
- )
281
-
282
- // Register binary in config
283
- const clickhousePath = join(binPath, 'bin', 'clickhouse')
284
- if (existsSync(clickhousePath)) {
285
- await configManager.setBinaryPath('clickhouse', clickhousePath, 'bundled')
286
- }
287
-
288
- return binPath
289
- }
290
-
291
- /**
292
- * Initialize a new ClickHouse data directory
293
- * Creates the directory structure and configuration files
294
- */
295
- async initDataDir(
296
- containerName: string,
297
- _version: string,
298
- options: Record<string, unknown> = {},
299
- ): Promise<string> {
300
- const dataDir = paths.getContainerDataPath(containerName, {
301
- engine: ENGINE,
302
- })
303
- const containerDir = paths.getContainerPath(containerName, {
304
- engine: ENGINE,
305
- })
306
- const logDir = containerDir
307
- const tmpDir = join(dataDir, 'tmp')
308
- const port = (options.port as number) || engineDef.defaultPort
309
- const httpPort = port + 1 // HTTP port is native port + 1
310
-
311
- // Create directories
312
- await mkdir(dataDir, { recursive: true })
313
- await mkdir(tmpDir, { recursive: true })
314
- await mkdir(join(dataDir, 'user_files'), { recursive: true })
315
- const accessDir = join(dataDir, 'access')
316
- await mkdir(accessDir, { recursive: true, mode: 0o700 })
317
- await chmod(accessDir, 0o700).catch((err) => {
318
- logDebug(`Failed to chmod ${accessDir}: ${err}`)
319
- })
320
-
321
- logDebug(`Created ClickHouse data directory: ${dataDir}`)
322
-
323
- // Generate config.xml
324
- const configPath = join(containerDir, 'config.xml')
325
- const pidFile = join(containerDir, engineDef.pidFileName)
326
- const configContent = generateClickHouseConfig({
327
- port,
328
- httpPort,
329
- dataDir,
330
- logDir,
331
- tmpDir,
332
- pidFile,
333
- })
334
- await writeFile(configPath, configContent)
335
- logDebug(`Generated ClickHouse config: ${configPath}`)
336
-
337
- // Generate users.xml
338
- const usersConfigPath = join(containerDir, 'users.xml')
339
- const usersConfigContent = generateUsersConfig()
340
- await writeFile(usersConfigPath, usersConfigContent)
341
- logDebug(`Generated ClickHouse users config: ${usersConfigPath}`)
342
-
343
- return dataDir
344
- }
345
-
346
- /**
347
- * Regenerate config.xml with updated paths after container rename
348
- * Called by container-manager after moving the directory
349
- */
350
- async regenerateConfig(containerName: string, port: number): Promise<void> {
351
- const dataDir = paths.getContainerDataPath(containerName, {
352
- engine: ENGINE,
353
- })
354
- const containerDir = paths.getContainerPath(containerName, {
355
- engine: ENGINE,
356
- })
357
- const logDir = containerDir
358
- const tmpDir = join(dataDir, 'tmp')
359
- const httpPort = port + 1
360
-
361
- const accessDir = join(dataDir, 'access')
362
- try {
363
- await mkdir(accessDir, { recursive: true, mode: 0o700 })
364
- await chmod(accessDir, 0o700).catch((err) => {
365
- logDebug(`Failed to chmod ${accessDir}: ${err}`)
366
- })
367
- } catch (error) {
368
- logWarning(
369
- `Failed to create ClickHouse access directory ${accessDir}: ${error}`,
370
- )
371
- }
372
-
373
- const configPath = join(containerDir, 'config.xml')
374
- const pidFile = join(containerDir, engineDef.pidFileName)
375
- const configContent = generateClickHouseConfig({
376
- port,
377
- httpPort,
378
- dataDir,
379
- logDir,
380
- tmpDir,
381
- pidFile,
382
- })
383
- await writeFile(configPath, configContent)
384
- logDebug(`Regenerated ClickHouse config after rename: ${configPath}`)
385
- }
386
-
387
- // Get the path to clickhouse binary for a version
388
- async getClickHousePath(version: string): Promise<string> {
389
- const { platform, arch } = this.getPlatformInfo()
390
- const fullVersion = normalizeVersion(version)
391
- const binPath = paths.getBinaryPath({
392
- engine: 'clickhouse',
393
- version: fullVersion,
394
- platform,
395
- arch,
396
- })
397
- const clickhousePath = join(binPath, 'bin', 'clickhouse')
398
- if (existsSync(clickhousePath)) {
399
- return clickhousePath
400
- }
401
- throw new Error(
402
- `ClickHouse ${version} is not installed. Run: spindb engines download clickhouse ${version}`,
403
- )
404
- }
405
-
406
- // Get the path to clickhouse binary (for client operations)
407
- override async getClickHouseClientPath(version?: string): Promise<string> {
408
- // Check config cache first
409
- const cached = await configManager.getBinaryPath('clickhouse')
410
- if (cached && existsSync(cached)) {
411
- return cached
412
- }
413
-
414
- // If version provided, use downloaded binary
415
- if (version) {
416
- return this.getClickHousePath(version)
417
- }
418
-
419
- throw new Error(
420
- 'ClickHouse binary not found. Run: spindb engines download clickhouse <version>',
421
- )
422
- }
423
-
424
- /**
425
- * Start ClickHouse server
426
- */
427
- async start(
428
- container: ContainerConfig,
429
- onProgress?: ProgressCallback,
430
- ): Promise<{ port: number; connectionString: string }> {
431
- const { name, port, version, binaryPath } = container
432
-
433
- // Check if already running
434
- const alreadyRunning = await processManager.isRunning(name, {
435
- engine: ENGINE,
436
- })
437
- if (alreadyRunning) {
438
- return {
439
- port,
440
- connectionString: this.getConnectionString(container),
441
- }
442
- }
443
-
444
- // Get ClickHouse binary path
445
- let clickhouseBinary: string | null = null
446
-
447
- if (binaryPath && existsSync(binaryPath)) {
448
- const serverPath = join(binaryPath, 'bin', 'clickhouse')
449
- if (existsSync(serverPath)) {
450
- clickhouseBinary = serverPath
451
- logDebug(`Using stored binary path: ${clickhouseBinary}`)
452
- }
453
- }
454
-
455
- if (!clickhouseBinary) {
456
- try {
457
- clickhouseBinary = await this.getClickHousePath(version)
458
- } catch (error) {
459
- const originalMessage =
460
- error instanceof Error ? error.message : String(error)
461
- throw new Error(
462
- `ClickHouse ${version} is not installed. Run: spindb engines download clickhouse ${version}\n` +
463
- ` Original error: ${originalMessage}`,
464
- )
465
- }
466
- }
467
-
468
- const containerDir = paths.getContainerPath(name, { engine: ENGINE })
469
- const configPath = join(containerDir, 'config.xml')
470
- const logFile = join(containerDir, 'clickhouse-server.log')
471
- const pidFile = join(containerDir, 'clickhouse.pid')
472
-
473
- onProgress?.({ stage: 'starting', message: 'Starting ClickHouse...' })
474
-
475
- logDebug(`Starting ClickHouse with config: ${configPath}`)
476
-
477
- const args = ['server', '--config-file', configPath, '--daemon']
478
-
479
- // Spawn the daemon process and wait for it to exit
480
- // ClickHouse with --daemon forks immediately and the parent exits
481
- const spawnResult = await new Promise<{
482
- code: number | null
483
- stdout: string
484
- stderr: string
485
- }>((resolve, reject) => {
486
- const proc = spawn(clickhouseBinary!, args, {
487
- stdio: ['ignore', 'pipe', 'pipe'],
488
- detached: true,
489
- })
490
-
491
- let stdout = ''
492
- let stderr = ''
493
-
494
- proc.stdout?.on('data', (data: Buffer) => {
495
- stdout += data.toString()
496
- logDebug(`clickhouse stdout: ${data.toString()}`)
497
- })
498
- proc.stderr?.on('data', (data: Buffer) => {
499
- stderr += data.toString()
500
- logDebug(`clickhouse stderr: ${data.toString()}`)
501
- })
502
-
503
- proc.on('error', reject)
504
-
505
- proc.on('close', (code) => {
506
- logDebug(`ClickHouse spawn process closed with code: ${code}`)
507
- // Don't unref until we capture the result
508
- proc.unref()
509
- resolve({ code, stdout, stderr })
510
- })
511
- })
512
-
513
- // Check if spawn was successful
514
- if (spawnResult.code !== 0 && spawnResult.code !== null) {
515
- throw new Error(
516
- spawnResult.stderr ||
517
- spawnResult.stdout ||
518
- `clickhouse server exited with code ${spawnResult.code}`,
519
- )
520
- }
521
-
522
- // Wait for server to be ready (outside of event handler to keep event loop alive)
523
- logDebug(`Waiting for ClickHouse server to be ready on port ${port}...`)
524
- const ready = await this.waitForReady(port, version)
525
- logDebug(`waitForReady returned: ${ready}`)
526
-
527
- if (!ready) {
528
- throw new Error(
529
- `ClickHouse failed to start within timeout. Check logs at: ${logFile}`,
530
- )
531
- }
532
-
533
- // ClickHouse in daemon mode doesn't respect <pid_file> config
534
- // So we manually find and write the PID after server is ready
535
- logDebug(`Finding PID for port ${port}...`)
536
- try {
537
- const pids = await platformService.findProcessByPort(port)
538
- logDebug(`findProcessByPort output: ${JSON.stringify(pids)}`)
539
- if (pids.length > 0) {
540
- const serverPid = String(pids[0])
541
- logDebug(`Writing PID ${serverPid} to ${pidFile}`)
542
- await writeFile(pidFile, serverPid, 'utf8')
543
- logDebug(`Wrote PID ${serverPid} to ${pidFile}`)
544
- } else {
545
- logDebug(`No PIDs found for port ${port}`)
546
- }
547
- } catch (pidError) {
548
- // Non-fatal: PID file is optional for operation
549
- logDebug(`Could not write PID file: ${pidError}`)
550
- }
551
-
552
- return {
553
- port,
554
- connectionString: this.getConnectionString(container),
555
- }
556
- }
557
-
558
- // Wait for ClickHouse to be ready
559
- // ClickHouse can take longer to start on CI runners due to resource constraints
560
- private async waitForReady(
561
- port: number,
562
- version: string,
563
- timeoutMs = 120000,
564
- ): Promise<boolean> {
565
- logDebug(`waitForReady called for port ${port}, version ${version}`)
566
- const startTime = Date.now()
567
- const checkInterval = 500
568
-
569
- let clickhouse: string
570
- try {
571
- logDebug('Getting clickhouse client path...')
572
- clickhouse = await this.getClickHouseClientPath(version)
573
- logDebug(`Got clickhouse client path: ${clickhouse}`)
574
- } catch (err) {
575
- logDebug(`Error getting clickhouse client path: ${err}`)
576
- logWarning(
577
- 'ClickHouse binary not found, cannot verify server is ready. Assuming ready after delay.',
578
- )
579
- await new Promise((resolve) => setTimeout(resolve, 3000))
580
- return true
581
- }
582
-
583
- logDebug(`Starting connection loop, timeout: ${timeoutMs}ms`)
584
- let attempt = 0
585
- while (Date.now() - startTime < timeoutMs) {
586
- attempt++
587
- logDebug(`Connection attempt ${attempt}...`)
588
- try {
589
- const args = [
590
- 'client',
591
- '--host',
592
- '127.0.0.1',
593
- '--port',
594
- String(port),
595
- '--query',
596
- 'SELECT 1',
597
- ]
598
- await new Promise<void>((resolve, reject) => {
599
- const proc = spawn(clickhouse, args, {
600
- stdio: ['ignore', 'pipe', 'pipe'],
601
- })
602
- proc.on('close', (code) => {
603
- logDebug(`Client process closed with code ${code}`)
604
- if (code === 0) resolve()
605
- else reject(new Error(`Exit code ${code}`))
606
- })
607
- proc.on('error', (err) => {
608
- logDebug(`Client process error: ${err}`)
609
- reject(err)
610
- })
611
- })
612
- logDebug(`ClickHouse ready on port ${port}`)
613
- return true
614
- } catch (err) {
615
- logDebug(`Attempt ${attempt} failed: ${err}`)
616
- await new Promise((resolve) => setTimeout(resolve, checkInterval))
617
- }
618
- }
619
-
620
- logWarning(`ClickHouse did not become ready within ${timeoutMs}ms`)
621
- return false
622
- }
623
-
624
- /**
625
- * Stop ClickHouse server
626
- */
627
- async stop(container: ContainerConfig): Promise<void> {
628
- const { name, port } = container
629
- const containerDir = paths.getContainerPath(name, { engine: ENGINE })
630
- const pidFile = join(containerDir, 'clickhouse.pid')
631
-
632
- logDebug(`Stopping ClickHouse container "${name}" on port ${port}`)
633
-
634
- // Find PID by checking the process using cross-platform helper
635
- let pid: number | null = null
636
-
637
- // Try to find ClickHouse process by port
638
- try {
639
- const pids = await platformService.findProcessByPort(port)
640
- if (pids.length > 0) {
641
- pid = pids[0]
642
- }
643
- } catch {
644
- // Ignore
645
- }
646
-
647
- // Kill process if found
648
- if (pid && platformService.isProcessRunning(pid)) {
649
- logDebug(`Killing ClickHouse process ${pid}`)
650
- try {
651
- await platformService.terminateProcess(pid, false)
652
- await new Promise((resolve) => setTimeout(resolve, 2000))
653
-
654
- if (platformService.isProcessRunning(pid)) {
655
- logWarning(`Graceful termination failed, force killing ${pid}`)
656
- await platformService.terminateProcess(pid, true)
657
- }
658
- } catch (error) {
659
- logDebug(`Process termination error: ${error}`)
660
- }
661
- }
662
-
663
- // Cleanup PID file
664
- if (existsSync(pidFile)) {
665
- try {
666
- await unlink(pidFile)
667
- } catch {
668
- // Ignore
669
- }
670
- }
671
-
672
- logDebug('ClickHouse stopped')
673
- }
674
-
675
- // Get ClickHouse server status
676
- async status(container: ContainerConfig): Promise<StatusResult> {
677
- const { port, version } = container
678
-
679
- // Try to connect
680
- try {
681
- const clickhouse = await this.getClickHouseClientPath(version)
682
- const args = [
683
- 'client',
684
- '--host',
685
- '127.0.0.1',
686
- '--port',
687
- String(port),
688
- '--query',
689
- 'SELECT 1',
690
- ]
691
- await new Promise<void>((resolve, reject) => {
692
- const proc = spawn(clickhouse, args, {
693
- stdio: ['ignore', 'pipe', 'pipe'],
694
- })
695
- proc.on('close', (code) => {
696
- if (code === 0) resolve()
697
- else reject(new Error(`Exit code ${code}`))
698
- })
699
- proc.on('error', reject)
700
- })
701
- return { running: true, message: 'ClickHouse is running' }
702
- } catch {
703
- return { running: false, message: 'ClickHouse is not running' }
704
- }
705
- }
706
-
707
- // Detect backup format
708
- async detectBackupFormat(filePath: string): Promise<BackupFormat> {
709
- return detectBackupFormatImpl(filePath)
710
- }
711
-
712
- /**
713
- * Restore a backup
714
- */
715
- async restore(
716
- container: ContainerConfig,
717
- backupPath: string,
718
- options: { database?: string; clean?: boolean } = {},
719
- ): Promise<RestoreResult> {
720
- const { name, port, version } = container
721
-
722
- return restoreBackup(backupPath, {
723
- containerName: name,
724
- port,
725
- database: options.database || container.database || 'default',
726
- version,
727
- clean: options.clean,
728
- })
729
- }
730
-
731
- /**
732
- * Get connection string
733
- * Format: clickhouse://127.0.0.1:PORT/DATABASE
734
- */
735
- getConnectionString(container: ContainerConfig, database?: string): string {
736
- const { port } = container
737
- const db = database || container.database || 'default'
738
- return `clickhouse://127.0.0.1:${port}/${db}`
739
- }
740
-
741
- // Open clickhouse client interactive shell
742
- async connect(container: ContainerConfig, database?: string): Promise<void> {
743
- const { port, version } = container
744
- const db = database || container.database || 'default'
745
-
746
- const clickhouse = await this.getClickHouseClientPath(version)
747
-
748
- const spawnOptions: SpawnOptions = {
749
- stdio: 'inherit',
750
- }
751
-
752
- return new Promise((resolve, reject) => {
753
- const proc = spawn(
754
- clickhouse,
755
- [
756
- 'client',
757
- '--host',
758
- '127.0.0.1',
759
- '--port',
760
- String(port),
761
- '--database',
762
- db,
763
- ],
764
- spawnOptions,
765
- )
766
-
767
- proc.on('error', reject)
768
- proc.on('close', () => resolve())
769
- })
770
- }
771
-
772
- /**
773
- * Create a new database
774
- */
775
- async createDatabase(
776
- container: ContainerConfig,
777
- database: string,
778
- ): Promise<void> {
779
- const { port, version } = container
780
-
781
- // Validate database identifier to prevent SQL injection
782
- validateClickHouseIdentifier(database, 'database')
783
- const escapedDb = escapeClickHouseIdentifier(database)
784
-
785
- const clickhouse = await this.getClickHouseClientPath(version)
786
-
787
- const args = [
788
- 'client',
789
- '--host',
790
- '127.0.0.1',
791
- '--port',
792
- String(port),
793
- '--query',
794
- `CREATE DATABASE IF NOT EXISTS ${escapedDb}`,
795
- ]
796
-
797
- await new Promise<void>((resolve, reject) => {
798
- const proc = spawn(clickhouse, args, {
799
- stdio: ['ignore', 'pipe', 'pipe'],
800
- })
801
-
802
- let stderr = ''
803
- proc.stderr?.on('data', (data: Buffer) => {
804
- stderr += data.toString()
805
- })
806
-
807
- proc.on('close', (code) => {
808
- if (code === 0) {
809
- logDebug(`Created ClickHouse database: ${database}`)
810
- resolve()
811
- } else {
812
- reject(new Error(`Failed to create database: ${stderr}`))
813
- }
814
- })
815
- proc.on('error', reject)
816
- })
817
- }
818
-
819
- /**
820
- * Drop a database
821
- */
822
- async dropDatabase(
823
- container: ContainerConfig,
824
- database: string,
825
- ): Promise<void> {
826
- const { port, version } = container
827
-
828
- if (database === 'default' || database === 'system') {
829
- throw new Error(`Cannot drop system database: ${database}`)
830
- }
831
-
832
- // Validate database identifier to prevent SQL injection
833
- validateClickHouseIdentifier(database, 'database')
834
- const escapedDb = escapeClickHouseIdentifier(database)
835
-
836
- const clickhouse = await this.getClickHouseClientPath(version)
837
-
838
- const args = [
839
- 'client',
840
- '--host',
841
- '127.0.0.1',
842
- '--port',
843
- String(port),
844
- '--query',
845
- `DROP DATABASE IF EXISTS ${escapedDb}`,
846
- ]
847
-
848
- await new Promise<void>((resolve, reject) => {
849
- const proc = spawn(clickhouse, args, {
850
- stdio: ['ignore', 'pipe', 'pipe'],
851
- })
852
-
853
- let stderr = ''
854
- proc.stderr?.on('data', (data: Buffer) => {
855
- stderr += data.toString()
856
- })
857
-
858
- proc.on('close', (code) => {
859
- if (code === 0) {
860
- logDebug(`Dropped ClickHouse database: ${database}`)
861
- resolve()
862
- } else {
863
- reject(new Error(`Failed to drop database: ${stderr}`))
864
- }
865
- })
866
- proc.on('error', reject)
867
- })
868
- }
869
-
870
- /**
871
- * Get the database size in bytes
872
- */
873
- async getDatabaseSize(container: ContainerConfig): Promise<number | null> {
874
- const { port, version, database } = container
875
-
876
- try {
877
- const clickhouse = await this.getClickHouseClientPath(version)
878
- // Validate and escape the database name to prevent SQL injection
879
- const dbName = database || 'default'
880
- validateClickHouseIdentifier(dbName, 'database')
881
- // Escape single quotes for string literal in WHERE clause
882
- const escapedDbName = dbName.replace(/'/g, "''")
883
- const query = `SELECT sum(bytes_on_disk) FROM system.parts WHERE database = '${escapedDbName}'`
884
-
885
- const result = await new Promise<string>((resolve, reject) => {
886
- const args = [
887
- 'client',
888
- '--host',
889
- '127.0.0.1',
890
- '--port',
891
- String(port),
892
- '--query',
893
- query,
894
- ]
895
-
896
- const proc = spawn(clickhouse, args, {
897
- stdio: ['ignore', 'pipe', 'pipe'],
898
- })
899
-
900
- let stdout = ''
901
- proc.stdout?.on('data', (data: Buffer) => {
902
- stdout += data.toString()
903
- })
904
-
905
- proc.on('close', (code) => {
906
- if (code === 0) resolve(stdout.trim())
907
- else reject(new Error(`Exit code ${code}`))
908
- })
909
- proc.on('error', reject)
910
- })
911
-
912
- const size = parseInt(result, 10)
913
- return isNaN(size) ? null : size
914
- } catch {
915
- return null
916
- }
917
- }
918
-
919
- /**
920
- * Dump from a remote ClickHouse connection
921
- * Uses ClickHouse's HTTP API to export schema and data
922
- *
923
- * Connection string format: clickhouse://[user:password@]host[:port][/database]
924
- */
925
- async dumpFromConnectionString(
926
- connectionString: string,
927
- outputPath: string,
928
- ): Promise<DumpResult> {
929
- // Parse connection string
930
- const { baseUrl, user, password, database } =
931
- parseClickHouseConnectionString(connectionString)
932
-
933
- // Validate and escape database identifier for SQL injection prevention
934
- validateClickHouseIdentifier(database, 'database')
935
- const escapedDatabase = escapeClickHouseIdentifier(database)
936
-
937
- logDebug(`Connecting to remote ClickHouse at ${baseUrl} (db: ${database})`)
938
-
939
- // Build headers for authentication
940
- const headers: Record<string, string> = {}
941
- if (user) {
942
- headers['X-ClickHouse-User'] = user
943
- if (password) {
944
- headers['X-ClickHouse-Key'] = password
945
- }
946
- }
947
-
948
- // Helper to execute a query via HTTP API
949
- const execQuery = async (query: string): Promise<string> => {
950
- const url = new URL(baseUrl)
951
- url.searchParams.set('query', query)
952
- url.searchParams.set('database', database)
953
-
954
- const response = await fetch(url.toString(), {
955
- method: 'GET',
956
- headers,
957
- })
958
-
959
- if (!response.ok) {
960
- const errorText = await response.text()
961
- throw new Error(`ClickHouse query failed: ${errorText}`)
962
- }
963
-
964
- return response.text()
965
- }
966
-
967
- // Test connectivity
968
- try {
969
- const result = await execQuery('SELECT 1')
970
- if (!result.trim().includes('1')) {
971
- throw new Error(`Unexpected test query response: ${result.trim()}`)
972
- }
973
- } catch (error) {
974
- throw new Error(
975
- `Failed to connect to ClickHouse at ${baseUrl}: ${(error as Error).message}`,
976
- )
977
- }
978
-
979
- // Get list of tables
980
- const tablesResult = await execQuery(
981
- `SELECT name FROM system.tables WHERE database = '${database.replace(/'/g, "''")}' ORDER BY name`,
982
- )
983
- const tables = tablesResult
984
- .trim()
985
- .split('\n')
986
- .filter((t) => t.trim())
987
-
988
- logDebug(`Found ${tables.length} tables in database ${database}`)
989
-
990
- // Build SQL backup
991
- const lines: string[] = []
992
- lines.push('-- ClickHouse backup generated by SpinDB')
993
- lines.push(`-- Source: ${baseUrl}`)
994
- lines.push(`-- Database: ${database}`)
995
- lines.push(`-- Date: ${new Date().toISOString()}`)
996
- lines.push('')
997
-
998
- for (const table of tables) {
999
- // Validate table name
1000
- validateClickHouseIdentifier(table, 'table')
1001
- const escapedTable = escapeClickHouseIdentifier(table)
1002
-
1003
- lines.push(`-- Table: ${table}`)
1004
- lines.push('')
1005
-
1006
- // Get CREATE TABLE statement (using TSVRaw for unescaped output)
1007
- try {
1008
- const createUrl = new URL(baseUrl)
1009
- createUrl.searchParams.set(
1010
- 'query',
1011
- `SHOW CREATE TABLE ${escapedDatabase}.${escapedTable} FORMAT TSVRaw`,
1012
- )
1013
-
1014
- const createResponse = await fetch(createUrl.toString(), { headers })
1015
- if (!createResponse.ok) {
1016
- logWarning(`Could not get CREATE TABLE for ${table}`)
1017
- continue
1018
- }
1019
-
1020
- let createStmt = (await createResponse.text()).trim()
1021
-
1022
- // Strip database prefix for portability
1023
- const dbPrefixPattern = new RegExp(
1024
- `(CREATE TABLE\\s+)\`?${database.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\`?\\.`,
1025
- 'i',
1026
- )
1027
- createStmt = createStmt.replace(dbPrefixPattern, '$1')
1028
-
1029
- lines.push(createStmt + ';')
1030
- lines.push('')
1031
- } catch (error) {
1032
- logWarning(`Could not get CREATE TABLE for ${table}: ${error}`)
1033
- continue
1034
- }
1035
-
1036
- // Export data using SQLInsert format
1037
- try {
1038
- const dataUrl = new URL(baseUrl)
1039
- dataUrl.searchParams.set(
1040
- 'query',
1041
- `SELECT * FROM ${escapedDatabase}.${escapedTable} FORMAT SQLInsert`,
1042
- )
1043
-
1044
- const dataResponse = await fetch(dataUrl.toString(), { headers })
1045
- if (!dataResponse.ok) {
1046
- const errorText = await dataResponse.text()
1047
- logWarning(
1048
- `Could not export data for ${table}: HTTP ${dataResponse.status} - ${errorText}`,
1049
- )
1050
- } else {
1051
- const data = (await dataResponse.text()).trim()
1052
- if (data) {
1053
- // SQLInsert format uses 'table' as placeholder, replace with actual table name
1054
- // Handle variations: TABLE, `table`, "table", 'table' with optional whitespace
1055
- const insertData = data.replace(
1056
- /INSERT\s+INTO\s+[`"']?table[`"']?\s*\(/gi,
1057
- `INSERT INTO ${escapedTable} (`,
1058
- )
1059
- lines.push(insertData)
1060
- lines.push('')
1061
- }
1062
- }
1063
- } catch (error) {
1064
- logWarning(`Could not export data for ${table}: ${error}`)
1065
- }
1066
- }
1067
-
1068
- // Write to file
1069
- const content = lines.join('\n')
1070
- await writeFile(outputPath, content, 'utf-8')
1071
-
1072
- return {
1073
- filePath: outputPath,
1074
- warnings:
1075
- tables.length === 0
1076
- ? [`Database '${database}' has no tables`]
1077
- : undefined,
1078
- }
1079
- }
1080
-
1081
- // Create a backup
1082
- async backup(
1083
- container: ContainerConfig,
1084
- outputPath: string,
1085
- options: BackupOptions,
1086
- ): Promise<BackupResult> {
1087
- return createBackup(container, outputPath, options)
1088
- }
1089
-
1090
- // Run a SQL file or inline SQL statement
1091
- async runScript(
1092
- container: ContainerConfig,
1093
- options: { file?: string; sql?: string; database?: string },
1094
- ): Promise<void> {
1095
- const { port, version } = container
1096
- const db = options.database || container.database || 'default'
1097
-
1098
- const clickhouse = await this.getClickHouseClientPath(version)
1099
-
1100
- if (options.file) {
1101
- // Read file and pipe to clickhouse client
1102
- const fileContent = await readFile(options.file, 'utf-8')
1103
- const args = [
1104
- 'client',
1105
- '--host',
1106
- '127.0.0.1',
1107
- '--port',
1108
- String(port),
1109
- '--database',
1110
- db,
1111
- '--multiquery',
1112
- ]
1113
-
1114
- await new Promise<void>((resolve, reject) => {
1115
- const proc = spawn(clickhouse, args, {
1116
- stdio: ['pipe', 'inherit', 'inherit'],
1117
- })
1118
-
1119
- proc.on('error', reject)
1120
- proc.on('close', (code) => {
1121
- if (code === 0 || code === null) resolve()
1122
- else reject(new Error(`clickhouse client exited with code ${code}`))
1123
- })
1124
-
1125
- proc.stdin?.write(fileContent)
1126
- proc.stdin?.end()
1127
- })
1128
- } else if (options.sql) {
1129
- // Run inline SQL via stdin to avoid command injection
1130
- const args = [
1131
- 'client',
1132
- '--host',
1133
- '127.0.0.1',
1134
- '--port',
1135
- String(port),
1136
- '--database',
1137
- db,
1138
- '--multiquery',
1139
- ]
1140
-
1141
- await new Promise<void>((resolve, reject) => {
1142
- const proc = spawn(clickhouse, args, {
1143
- stdio: ['pipe', 'inherit', 'inherit'],
1144
- })
1145
-
1146
- proc.on('error', reject)
1147
- proc.on('close', (code) => {
1148
- if (code === 0 || code === null) resolve()
1149
- else reject(new Error(`clickhouse client exited with code ${code}`))
1150
- })
1151
-
1152
- proc.stdin?.write(options.sql)
1153
- proc.stdin?.end()
1154
- })
1155
- } else {
1156
- throw new Error('Either file or sql option must be provided')
1157
- }
1158
- }
1159
-
1160
- async executeQuery(
1161
- container: ContainerConfig,
1162
- query: string,
1163
- options?: QueryOptions,
1164
- ): Promise<QueryResult> {
1165
- const { port, version } = container
1166
- const db = options?.database || container.database || 'default'
1167
-
1168
- const clickhouse = await this.getClickHouseClientPath(version)
1169
-
1170
- // Handle FORMAT clause: replace existing FORMAT or append FORMAT JSON
1171
- // Regex matches "FORMAT <type>" with optional trailing whitespace/semicolon
1172
- let queryWithFormat = query.trim()
1173
- const formatRegex = /\bFORMAT\s+\w+\s*;?\s*$/i
1174
- if (formatRegex.test(queryWithFormat)) {
1175
- // Replace existing FORMAT clause with FORMAT JSON
1176
- queryWithFormat = queryWithFormat.replace(formatRegex, 'FORMAT JSON')
1177
- } else {
1178
- // No FORMAT clause, append FORMAT JSON
1179
- queryWithFormat = queryWithFormat.replace(/;?\s*$/, ' FORMAT JSON')
1180
- }
1181
-
1182
- return new Promise((resolve, reject) => {
1183
- const args = [
1184
- 'client',
1185
- '--host',
1186
- '127.0.0.1',
1187
- '--port',
1188
- String(port),
1189
- '--database',
1190
- db,
1191
- '--query',
1192
- queryWithFormat,
1193
- ]
1194
-
1195
- const proc = spawn(clickhouse, args, {
1196
- stdio: ['ignore', 'pipe', 'pipe'],
1197
- })
1198
-
1199
- let stdout = ''
1200
- let stderr = ''
1201
-
1202
- proc.stdout?.on('data', (data: Buffer) => {
1203
- stdout += data.toString()
1204
- })
1205
- proc.stderr?.on('data', (data: Buffer) => {
1206
- stderr += data.toString()
1207
- })
1208
-
1209
- proc.on('error', reject)
1210
-
1211
- proc.on('close', (code) => {
1212
- if (code === 0) {
1213
- resolve(parseClickHouseJSONResult(stdout))
1214
- } else {
1215
- reject(new Error(stderr || `clickhouse exited with code ${code}`))
1216
- }
1217
- })
1218
- })
1219
- }
1220
-
1221
- /**
1222
- * List all user databases, excluding system databases (system, information_schema, INFORMATION_SCHEMA).
1223
- */
1224
- async listDatabases(container: ContainerConfig): Promise<string[]> {
1225
- const { port, version } = container
1226
- const clickhouse = await this.getClickHouseClientPath(version)
1227
-
1228
- logDebug(`Listing databases on port ${port} with version ${version}`)
1229
-
1230
- return new Promise((resolve, reject) => {
1231
- const args = [
1232
- 'client',
1233
- '--host',
1234
- '127.0.0.1',
1235
- '--port',
1236
- String(port),
1237
- '--query',
1238
- 'SHOW DATABASES',
1239
- ]
1240
-
1241
- const proc = spawn(clickhouse, args, {
1242
- stdio: ['ignore', 'pipe', 'pipe'],
1243
- })
1244
-
1245
- let stdout = ''
1246
- let stderr = ''
1247
-
1248
- proc.stdout?.on('data', (data: Buffer) => {
1249
- stdout += data.toString()
1250
- })
1251
- proc.stderr?.on('data', (data: Buffer) => {
1252
- stderr += data.toString()
1253
- })
1254
-
1255
- proc.on('error', reject)
1256
-
1257
- proc.on('close', (code) => {
1258
- if (code !== 0) {
1259
- reject(new Error(stderr || `clickhouse exited with code ${code}`))
1260
- return
1261
- }
1262
-
1263
- // Parse output (one database per line)
1264
- const systemDatabases = [
1265
- 'system',
1266
- 'information_schema',
1267
- 'INFORMATION_SCHEMA',
1268
- ]
1269
- const databases = stdout
1270
- .trim()
1271
- .split('\n')
1272
- .map((db) => db.trim())
1273
- .filter((db) => db.length > 0 && !systemDatabases.includes(db))
1274
-
1275
- resolve(databases)
1276
- })
1277
- })
1278
- }
1279
-
1280
- async createUser(
1281
- container: ContainerConfig,
1282
- options: CreateUserOptions,
1283
- ): Promise<UserCredentials> {
1284
- const { username, password, database } = options
1285
- assertValidUsername(username)
1286
- const { port, version } = container
1287
- const db = database || container.database || 'default'
1288
-
1289
- validateClickHouseIdentifier(username, 'username')
1290
- validateClickHouseIdentifier(db, 'database')
1291
- const escapedUser = escapeClickHouseIdentifier(username)
1292
- const escapedDb = escapeClickHouseIdentifier(db)
1293
-
1294
- const clickhouse = await this.getClickHouseClientPath(version)
1295
-
1296
- const escapedPass = password.replace(/\\/g, '\\\\').replace(/'/g, "''")
1297
- const sql = `CREATE USER IF NOT EXISTS ${escapedUser} IDENTIFIED BY '${escapedPass}'; ALTER USER ${escapedUser} IDENTIFIED BY '${escapedPass}'; GRANT ALL ON ${escapedDb}.* TO ${escapedUser};`
1298
-
1299
- const args = [
1300
- 'client',
1301
- '--host',
1302
- '127.0.0.1',
1303
- '--port',
1304
- String(port),
1305
- '--multiquery',
1306
- ]
1307
-
1308
- await new Promise<void>((resolve, reject) => {
1309
- const proc = spawn(clickhouse, args, {
1310
- stdio: ['pipe', 'pipe', 'pipe'],
1311
- })
1312
-
1313
- let stderr = ''
1314
- proc.stderr?.on('data', (data: Buffer) => {
1315
- stderr += data.toString()
1316
- })
1317
-
1318
- proc.on('close', (code) => {
1319
- if (code === 0) {
1320
- logDebug(`Created ClickHouse user: ${username}`)
1321
- resolve()
1322
- } else {
1323
- reject(new Error(`Failed to create user: ${stderr}`))
1324
- }
1325
- })
1326
- proc.on('error', reject)
1327
-
1328
- proc.stdin?.write(sql)
1329
- proc.stdin?.end()
1330
- })
1331
-
1332
- const connectionString = `clickhouse://${encodeURIComponent(username)}:${encodeURIComponent(password)}@127.0.0.1:${port}/${db}`
1333
-
1334
- return {
1335
- username,
1336
- password,
1337
- connectionString,
1338
- engine: container.engine,
1339
- container: container.name,
1340
- database: db,
1341
- }
1342
- }
1343
- }
1344
-
1345
- export const clickhouseEngine = new ClickHouseEngine()