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,1043 @@
1
+ import { spawn } from 'child_process';
2
+ import { existsSync } from 'fs';
3
+ import { mkdir, writeFile, readFile, unlink } from 'fs/promises';
4
+ import { join, dirname } from 'path';
5
+ import { BaseEngine } from '../base-engine.js';
6
+ import { paths } from '../../config/paths.js';
7
+ import { getEngineDefaults } from '../../config/defaults.js';
8
+ import { platformService, isWindows } from '../../core/platform-service.js';
9
+ import { configManager } from '../../core/config-manager.js';
10
+ import { logDebug, logWarning, assertValidUsername, } from '../../core/error-handler.js';
11
+ import { processManager } from '../../core/process-manager.js';
12
+ import { portManager } from '../../core/port-manager.js';
13
+ import { couchdbBinaryManager } from './binary-manager.js';
14
+ import { getBinaryUrl } from './binary-urls.js';
15
+ import { normalizeVersion, SUPPORTED_MAJOR_VERSIONS, COUCHDB_VERSION_MAP, } from './version-maps.js';
16
+ import { fetchAvailableVersions as fetchHostdbVersions } from './hostdb-releases.js';
17
+ import { detectBackupFormat as detectBackupFormatImpl, restoreBackup, } from './restore.js';
18
+ import { createBackup } from './backup.js';
19
+ import { couchdbApiRequest } from './api-client.js';
20
+ import { parseRESTAPIResult } from '../../core/query-parser.js';
21
+ const ENGINE = 'couchdb';
22
+ const engineDef = getEngineDefaults(ENGINE);
23
+ /**
24
+ * Get the correct extension for CouchDB binary.
25
+ * On Windows, CouchDB uses a .cmd batch file, not .exe
26
+ */
27
+ function getCouchDBExtension() {
28
+ return isWindows() ? '.cmd' : '';
29
+ }
30
+ /**
31
+ * Generate CouchDB local.ini configuration content
32
+ * CouchDB 3.x requires at least one admin account to start
33
+ */
34
+ function generateCouchDBConfig(options) {
35
+ const bindAddress = options.bindAddress || '127.0.0.1';
36
+ return `; SpinDB generated CouchDB configuration
37
+ [couchdb]
38
+ database_dir = ${options.dataDir}
39
+ view_index_dir = ${options.dataDir}
40
+
41
+ [chttpd]
42
+ port = ${options.port}
43
+ bind_address = ${bindAddress}
44
+ ; Allow anonymous access for local development (no login required)
45
+ require_valid_user = false
46
+
47
+ [chttpd_auth]
48
+ ; Allow anonymous access to Fauxton dashboard
49
+ require_valid_user = false
50
+
51
+ [log]
52
+ file = ${options.logDir}/couchdb.log
53
+ level = info
54
+
55
+ [admins]
56
+ ; CouchDB 3.x requires admin account - credentials available if needed: admin/admin
57
+ admin = admin
58
+ `;
59
+ }
60
+ /**
61
+ * Generate container-specific vm.args with unique Erlang node name
62
+ * Each CouchDB instance needs a unique node name to avoid conflicts
63
+ */
64
+ function generateVmArgs(port, _containerDir) {
65
+ // Use port in node name to ensure uniqueness
66
+ const nodeName = `couchdb_${port}@127.0.0.1`;
67
+ // Read base vm.args and replace the node name
68
+ return `# SpinDB generated CouchDB vm.args
69
+ # Unique node name based on port to allow multiple instances
70
+ -name ${nodeName}
71
+
72
+ # All nodes must share the same magic cookie for distributed Erlang to work.
73
+ # -setcookie
74
+
75
+ # Which interfaces should the node listen on?
76
+ -kernel inet_dist_use_interface {127,0,0,1}
77
+
78
+ # Tell kernel and SASL not to log anything
79
+ -kernel error_logger silent
80
+ -sasl sasl_error_logger false
81
+
82
+ # Prevent overlapping partitions
83
+ -kernel prevent_overlapping_partitions false
84
+
85
+ # Erlang process limit
86
+ +P 1048576
87
+
88
+ # Increase the pool of dirty IO schedulers
89
+ +SDio 16
90
+
91
+ # Increase distribution buffer size
92
+ +zdbbl 32768
93
+
94
+ # Disable interactive shell
95
+ +Bd -noinput
96
+
97
+ # Set maximum SSL session lifetime
98
+ -ssl session_lifetime 300
99
+
100
+ # OS Mon Settings - disable all monitoring on Windows to avoid win32sysinfo issues
101
+ -os_mon start_cpu_sup false
102
+ -os_mon start_memsup false
103
+ -os_mon start_disksup false
104
+ `;
105
+ }
106
+ /**
107
+ * Generate Erlang sys.config to disable os_mon features before application starts.
108
+ * On Windows, os_mon tries to use win32sysinfo which may crash if the port program
109
+ * is missing or broken. Setting these in sys.config takes effect before os_mon starts.
110
+ */
111
+ function generateSysConfig() {
112
+ // Minimal Erlang sys.config - no comments, just config
113
+ // os_mon settings must be set BEFORE the application starts
114
+ return `[{os_mon,[{start_cpu_sup,false},{start_disksup,false},{start_memsup,false}]}].
115
+ `;
116
+ }
117
+ /**
118
+ * Parse a CouchDB connection string for remote operations
119
+ */
120
+ function parseCouchDBConnectionString(connectionString) {
121
+ let url;
122
+ let scheme = 'http';
123
+ // Handle couchdb:// scheme by converting to http://
124
+ let normalized = connectionString.trim();
125
+ if (normalized.startsWith('couchdb://')) {
126
+ normalized = normalized.replace('couchdb://', 'http://');
127
+ }
128
+ // Ensure scheme is present
129
+ if (!normalized.startsWith('http://') && !normalized.startsWith('https://')) {
130
+ normalized = `http://${normalized}`;
131
+ }
132
+ try {
133
+ url = new URL(normalized);
134
+ scheme = url.protocol.replace(':', '');
135
+ }
136
+ catch {
137
+ throw new Error(`Invalid CouchDB connection string: ${connectionString}\n` +
138
+ 'Expected format: http://host:port or couchdb://host:port');
139
+ }
140
+ const headers = {
141
+ 'Content-Type': 'application/json',
142
+ };
143
+ // Handle basic auth if present
144
+ if (url.username && url.password) {
145
+ const auth = Buffer.from(`${url.username}:${url.password}`).toString('base64');
146
+ headers['Authorization'] = `Basic ${auth}`;
147
+ }
148
+ // Construct base URL without auth and query params
149
+ const port = url.port || '5984';
150
+ const baseUrl = `${scheme}://${url.hostname}:${port}`;
151
+ // Extract database from pathname
152
+ const pathname = url.pathname || '';
153
+ const database = pathname.length > 1 ? pathname.slice(1).split('/')[0] : undefined;
154
+ return { baseUrl, headers, database };
155
+ }
156
+ /**
157
+ * Make an HTTP request to a remote CouchDB server
158
+ */
159
+ async function remoteCouchDBRequest(baseUrl, method, path, headers, body, timeoutMs = 30000) {
160
+ const url = `${baseUrl}${path}`;
161
+ const controller = new AbortController();
162
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
163
+ const options = {
164
+ method,
165
+ headers,
166
+ signal: controller.signal,
167
+ };
168
+ if (body) {
169
+ options.body = JSON.stringify(body);
170
+ }
171
+ try {
172
+ const response = await fetch(url, options);
173
+ let data;
174
+ const contentType = response.headers.get('content-type') || '';
175
+ if (contentType.includes('application/json')) {
176
+ data = await response.json();
177
+ }
178
+ else {
179
+ data = await response.text();
180
+ }
181
+ return { status: response.status, data };
182
+ }
183
+ catch (error) {
184
+ if (error instanceof Error && error.name === 'AbortError') {
185
+ throw new Error(`Remote CouchDB request timed out after ${timeoutMs / 1000}s: ${method} ${path}`);
186
+ }
187
+ throw error;
188
+ }
189
+ finally {
190
+ clearTimeout(timeoutId);
191
+ }
192
+ }
193
+ export class CouchDBEngine extends BaseEngine {
194
+ name = ENGINE;
195
+ displayName = 'CouchDB';
196
+ defaultPort = engineDef.defaultPort;
197
+ supportedVersions = SUPPORTED_MAJOR_VERSIONS;
198
+ // Get platform info for binary operations
199
+ getPlatformInfo() {
200
+ return platformService.getPlatformInfo();
201
+ }
202
+ // Fetch available versions from hostdb
203
+ async fetchAvailableVersions() {
204
+ return fetchHostdbVersions();
205
+ }
206
+ // Get binary download URL from hostdb
207
+ getBinaryUrl(version, platform, arch) {
208
+ return getBinaryUrl(version, platform, arch);
209
+ }
210
+ // Resolves version string to full version (e.g., '3' -> '3.5.1')
211
+ resolveFullVersion(version) {
212
+ if (/^\d+\.\d+\.\d+$/.test(version)) {
213
+ return version;
214
+ }
215
+ if (COUCHDB_VERSION_MAP[version]) {
216
+ return COUCHDB_VERSION_MAP[version];
217
+ }
218
+ // Normalize to exactly 3 segments (e.g., "3" -> "3.0.0", "3.5" -> "3.5.0")
219
+ const segments = version.split('.').slice(0, 3);
220
+ while (segments.length < 3) {
221
+ segments.push('0');
222
+ }
223
+ return segments.join('.');
224
+ }
225
+ // Get the path where binaries for a version would be installed
226
+ getBinaryPath(version) {
227
+ const fullVersion = this.resolveFullVersion(version);
228
+ const { platform: p, arch: a } = this.getPlatformInfo();
229
+ return paths.getBinaryPath({
230
+ engine: 'couchdb',
231
+ version: fullVersion,
232
+ platform: p,
233
+ arch: a,
234
+ });
235
+ }
236
+ // Verify that CouchDB binaries are available
237
+ async verifyBinary(binPath) {
238
+ // CouchDB has a startup script rather than a direct binary
239
+ // On Windows it's .cmd, on Unix it's just 'couchdb'
240
+ const serverPath = join(binPath, 'bin', `couchdb${getCouchDBExtension()}`);
241
+ return existsSync(serverPath);
242
+ }
243
+ // Check if a specific CouchDB version is installed
244
+ async isBinaryInstalled(version) {
245
+ const { platform, arch } = this.getPlatformInfo();
246
+ return couchdbBinaryManager.isInstalled(version, platform, arch);
247
+ }
248
+ /**
249
+ * Ensure CouchDB binaries are available for a specific version
250
+ */
251
+ async ensureBinaries(version, onProgress) {
252
+ const { platform, arch } = this.getPlatformInfo();
253
+ const binPath = await couchdbBinaryManager.ensureInstalled(version, platform, arch, onProgress);
254
+ // Register binaries in config
255
+ const toolPath = join(binPath, 'bin', `couchdb${getCouchDBExtension()}`);
256
+ if (existsSync(toolPath)) {
257
+ await configManager.setBinaryPath('couchdb', toolPath, 'bundled');
258
+ }
259
+ return binPath;
260
+ }
261
+ /**
262
+ * Initialize a new CouchDB data directory
263
+ */
264
+ async initDataDir(containerName, _version, options = {}) {
265
+ const dataDir = paths.getContainerDataPath(containerName, {
266
+ engine: ENGINE,
267
+ });
268
+ const containerDir = paths.getContainerPath(containerName, {
269
+ engine: ENGINE,
270
+ });
271
+ const port = options.port || engineDef.defaultPort;
272
+ // Create directories
273
+ if (!existsSync(dataDir)) {
274
+ await mkdir(dataDir, { recursive: true });
275
+ logDebug(`Created CouchDB data directory: ${dataDir}`);
276
+ }
277
+ const logDir = join(containerDir, 'log');
278
+ if (!existsSync(logDir)) {
279
+ await mkdir(logDir, { recursive: true });
280
+ }
281
+ // Generate local.ini config
282
+ const configPath = join(containerDir, 'local.ini');
283
+ const configContent = generateCouchDBConfig({
284
+ port,
285
+ dataDir,
286
+ logDir,
287
+ });
288
+ await writeFile(configPath, configContent);
289
+ logDebug(`Generated CouchDB config: ${configPath}`);
290
+ // Generate container-specific vm.args with unique node name
291
+ const vmArgsPath = join(containerDir, 'vm.args');
292
+ const vmArgsContent = generateVmArgs(port, containerDir);
293
+ await writeFile(vmArgsPath, vmArgsContent);
294
+ logDebug(`Generated CouchDB vm.args: ${vmArgsPath}`);
295
+ return dataDir;
296
+ }
297
+ // Get the path to couchdb server
298
+ async getCouchDBServerPath(version) {
299
+ const { platform, arch } = this.getPlatformInfo();
300
+ const fullVersion = normalizeVersion(version);
301
+ const binPath = paths.getBinaryPath({
302
+ engine: 'couchdb',
303
+ version: fullVersion,
304
+ platform,
305
+ arch,
306
+ });
307
+ const serverPath = join(binPath, 'bin', `couchdb${getCouchDBExtension()}`);
308
+ if (existsSync(serverPath)) {
309
+ return serverPath;
310
+ }
311
+ throw new Error(`CouchDB ${version} is not installed. Run: spindb engines download couchdb ${version}`);
312
+ }
313
+ // Get the path to couchdb binary
314
+ async getCouchDBPath(version) {
315
+ const cached = await configManager.getBinaryPath('couchdb');
316
+ if (cached && existsSync(cached)) {
317
+ return cached;
318
+ }
319
+ if (version) {
320
+ const { platform, arch } = this.getPlatformInfo();
321
+ const fullVersion = normalizeVersion(version);
322
+ const binPath = paths.getBinaryPath({
323
+ engine: 'couchdb',
324
+ version: fullVersion,
325
+ platform,
326
+ arch,
327
+ });
328
+ const couchdbPath = join(binPath, 'bin', `couchdb${getCouchDBExtension()}`);
329
+ if (existsSync(couchdbPath)) {
330
+ return couchdbPath;
331
+ }
332
+ }
333
+ throw new Error('couchdb not found. Run: spindb engines download couchdb <version>');
334
+ }
335
+ /**
336
+ * Start CouchDB server
337
+ */
338
+ async start(container, onProgress) {
339
+ const { name, port, version, binaryPath } = container;
340
+ // Check if already running
341
+ const alreadyRunning = await processManager.isRunning(name, {
342
+ engine: ENGINE,
343
+ });
344
+ if (alreadyRunning) {
345
+ return {
346
+ port,
347
+ connectionString: this.getConnectionString(container),
348
+ };
349
+ }
350
+ // Find couchdb binary
351
+ let couchdbServer = null;
352
+ if (binaryPath && existsSync(binaryPath)) {
353
+ const serverPath = join(binaryPath, 'bin', `couchdb${getCouchDBExtension()}`);
354
+ if (existsSync(serverPath)) {
355
+ couchdbServer = serverPath;
356
+ logDebug(`Using stored binary path: ${couchdbServer}`);
357
+ }
358
+ }
359
+ if (!couchdbServer) {
360
+ try {
361
+ couchdbServer = await this.getCouchDBServerPath(version);
362
+ }
363
+ catch (error) {
364
+ const originalMessage = error instanceof Error ? error.message : String(error);
365
+ throw new Error(`CouchDB ${version} is not installed. Run: spindb engines download couchdb ${version}\n` +
366
+ ` Original error: ${originalMessage}`);
367
+ }
368
+ }
369
+ logDebug(`Using couchdb for version ${version}: ${couchdbServer}`);
370
+ const containerDir = paths.getContainerPath(name, { engine: ENGINE });
371
+ const configPath = join(containerDir, 'local.ini');
372
+ const dataDir = paths.getContainerDataPath(name, { engine: ENGINE });
373
+ const logDir = join(containerDir, 'log');
374
+ const logFile = join(logDir, 'couchdb.log');
375
+ const pidFile = join(containerDir, 'couchdb.pid');
376
+ // Check port availability
377
+ const portWaitTimeout = isWindows() ? 60000 : 0;
378
+ const portCheckStart = Date.now();
379
+ const portCheckInterval = 1000;
380
+ while (!(await portManager.isPortAvailable(port))) {
381
+ if (Date.now() - portCheckStart >= portWaitTimeout) {
382
+ throw new Error(`Port ${port} is already in use.`);
383
+ }
384
+ logDebug(`Waiting for port ${port} to become available...`);
385
+ await new Promise((resolve) => setTimeout(resolve, portCheckInterval));
386
+ }
387
+ // Regenerate config with current port
388
+ const configContent = generateCouchDBConfig({
389
+ port,
390
+ dataDir,
391
+ logDir,
392
+ });
393
+ await writeFile(configPath, configContent);
394
+ // Regenerate vm.args with unique node name for this port
395
+ const vmArgsPath = join(containerDir, 'vm.args');
396
+ const vmArgsContent = generateVmArgs(port, containerDir);
397
+ await writeFile(vmArgsPath, vmArgsContent);
398
+ onProgress?.({ stage: 'starting', message: 'Starting CouchDB...' });
399
+ logDebug(`Starting couchdb with config: ${configPath}`);
400
+ // Get the binary directory for default config paths
401
+ const binDir = dirname(dirname(couchdbServer));
402
+ const defaultIni = join(binDir, 'etc', 'default.ini');
403
+ // CouchDB uses COUCHDB_INI_FILES to load config files in order
404
+ // COUCHDB_ARGS_FILE specifies custom vm.args with unique node name
405
+ // On Windows, CouchDB may need additional paths set
406
+ const env = {
407
+ ...process.env,
408
+ COUCHDB_INI_FILES: `${defaultIni} ${configPath}`,
409
+ COUCHDB_ARGS_FILE: vmArgsPath,
410
+ // Set CouchDB binary directory for Windows
411
+ COUCHDB_BINDIR: join(binDir, 'bin'),
412
+ COUCHDB_QUERY_SERVER_JAVASCRIPT: join(binDir, 'bin', 'couchjs'),
413
+ };
414
+ // On Windows, use sys.config to disable os_mon before it starts
415
+ // The vm.args settings are too late - os_mon crashes during init
416
+ // Erlang reads releases/sys.config at startup, so we modify that file
417
+ if (isWindows()) {
418
+ const sysConfigContent = generateSysConfig();
419
+ // The CRITICAL location - Erlang release reads from releases/sys.config
420
+ const releasesSysConfig = join(binDir, 'releases', 'sys.config');
421
+ await writeFile(releasesSysConfig, sysConfigContent);
422
+ // Copy vm.args to where Windows CouchDB expects it
423
+ const expectedVmArgs = join(binDir, 'etc', 'vm.args');
424
+ await writeFile(expectedVmArgs, vmArgsContent);
425
+ // Also update releases/vm.args
426
+ const releasesVmArgs = join(binDir, 'releases', 'vm.args');
427
+ await writeFile(releasesVmArgs, vmArgsContent);
428
+ // CRITICAL: Write config to binary's etc/local.ini
429
+ // Windows CouchDB doesn't respect COUCHDB_INI_FILES env var and may not scan local.d/
430
+ // Write directly to etc/local.ini which CouchDB definitely reads
431
+ // Note: This means only one container can run per binary install (typical for local dev)
432
+ const localIniPath = join(binDir, 'etc', 'local.ini');
433
+ await writeFile(localIniPath, configContent);
434
+ logDebug(`Wrote config to ${localIniPath}`);
435
+ // Modify the os_mon.app file directly to disable features
436
+ // This sets the default env values in the application spec itself
437
+ const osMonAppPath = join(binDir, 'lib', 'os_mon-2.9.1', 'ebin', 'os_mon.app');
438
+ try {
439
+ const osMonApp = await readFile(osMonAppPath, 'utf8');
440
+ // Replace the default env settings to disable all features
441
+ const modifiedApp = osMonApp
442
+ .replace('{start_cpu_sup, true}', '{start_cpu_sup, false}')
443
+ .replace('{start_disksup, true}', '{start_disksup, false}')
444
+ .replace('{start_memsup, true}', '{start_memsup, false}');
445
+ await writeFile(osMonAppPath, modifiedApp);
446
+ logDebug('Modified os_mon.app to disable features');
447
+ }
448
+ catch (err) {
449
+ logDebug(`Failed to modify os_mon.app: ${err}`);
450
+ }
451
+ // Add os_mon priv/bin to PATH so win32sysinfo.exe can be found
452
+ const osMonPrivBin = join(binDir, 'lib', 'os_mon-2.9.1', 'priv', 'bin');
453
+ const existingPath = env.PATH || process.env.PATH || '';
454
+ env.PATH = `${osMonPrivBin};${existingPath}`;
455
+ logDebug(`Wrote sys.config to ${releasesSysConfig}`);
456
+ logDebug(`Wrote vm.args to ${releasesVmArgs}`);
457
+ logDebug(`Added to PATH: ${osMonPrivBin}`);
458
+ }
459
+ // Spawn CouchDB process
460
+ if (isWindows()) {
461
+ return new Promise((resolve, reject) => {
462
+ // On Windows, run from the CouchDB installation directory
463
+ // The Erlang VM expects to find files relative to its installation
464
+ const spawnOpts = {
465
+ cwd: binDir,
466
+ stdio: ['ignore', 'pipe', 'pipe'],
467
+ detached: true,
468
+ windowsHide: true,
469
+ env,
470
+ };
471
+ // On Windows, .cmd files must be executed via cmd.exe
472
+ const proc = spawn('cmd.exe', ['/c', couchdbServer], spawnOpts);
473
+ let settled = false;
474
+ let stderrOutput = '';
475
+ let stdoutOutput = '';
476
+ proc.on('error', (err) => {
477
+ if (settled)
478
+ return;
479
+ settled = true;
480
+ reject(new Error(`Failed to spawn CouchDB server: ${err.message}`));
481
+ });
482
+ proc.on('exit', (code, signal) => {
483
+ if (settled)
484
+ return;
485
+ settled = true;
486
+ const reason = signal ? `signal ${signal}` : `code ${code}`;
487
+ reject(new Error(`CouchDB process exited unexpectedly (${reason}).\n` +
488
+ `Stderr: ${stderrOutput || '(none)'}\n` +
489
+ `Stdout: ${stdoutOutput || '(none)'}`));
490
+ });
491
+ proc.stdout?.on('data', (data) => {
492
+ stdoutOutput += data.toString();
493
+ });
494
+ proc.stderr?.on('data', (data) => {
495
+ stderrOutput += data.toString();
496
+ });
497
+ proc.unref();
498
+ setTimeout(async () => {
499
+ if (settled)
500
+ return;
501
+ if (!proc.pid) {
502
+ settled = true;
503
+ reject(new Error('CouchDB server process failed to start (no PID)'));
504
+ return;
505
+ }
506
+ try {
507
+ await writeFile(pidFile, String(proc.pid));
508
+ }
509
+ catch {
510
+ // Non-fatal
511
+ }
512
+ const ready = await this.waitForReady(port);
513
+ if (settled)
514
+ return;
515
+ if (ready) {
516
+ settled = true;
517
+ resolve({
518
+ port,
519
+ connectionString: this.getConnectionString(container),
520
+ });
521
+ }
522
+ else {
523
+ settled = true;
524
+ if (proc.pid && platformService.isProcessRunning(proc.pid)) {
525
+ try {
526
+ await platformService.terminateProcess(proc.pid, true);
527
+ }
528
+ catch {
529
+ // Ignore cleanup errors
530
+ }
531
+ }
532
+ reject(new Error(`CouchDB failed to start within timeout.\n` +
533
+ `Binary: ${couchdbServer}\n` +
534
+ `Config: ${configPath}\n` +
535
+ `Log file: ${logFile}`));
536
+ }
537
+ }, 500);
538
+ });
539
+ }
540
+ // macOS/Linux
541
+ const proc = spawn(couchdbServer, [], {
542
+ cwd: containerDir,
543
+ stdio: ['ignore', 'ignore', 'ignore'],
544
+ detached: true,
545
+ env,
546
+ });
547
+ proc.unref();
548
+ if (!proc.pid) {
549
+ throw new Error('CouchDB server process failed to start (no PID)');
550
+ }
551
+ try {
552
+ await writeFile(pidFile, String(proc.pid));
553
+ }
554
+ catch {
555
+ // Non-fatal
556
+ }
557
+ const ready = await this.waitForReady(port);
558
+ if (ready) {
559
+ return {
560
+ port,
561
+ connectionString: this.getConnectionString(container),
562
+ };
563
+ }
564
+ throw new Error(`CouchDB failed to start within timeout.\n` +
565
+ `Binary: ${couchdbServer}\n` +
566
+ `Config: ${configPath}\n` +
567
+ `Log file: ${logFile}`);
568
+ }
569
+ // Wait for CouchDB to be ready
570
+ async waitForReady(port, timeoutMs = 30000) {
571
+ const startTime = Date.now();
572
+ const checkInterval = 500;
573
+ while (Date.now() - startTime < timeoutMs) {
574
+ try {
575
+ const response = await couchdbApiRequest(port, 'GET', '/');
576
+ if (response.status === 200) {
577
+ logDebug(`CouchDB ready on port ${port}`);
578
+ return true;
579
+ }
580
+ }
581
+ catch {
582
+ // Connection failed, wait and retry
583
+ }
584
+ await new Promise((resolve) => setTimeout(resolve, checkInterval));
585
+ }
586
+ logDebug(`CouchDB did not become ready within ${timeoutMs}ms`);
587
+ return false;
588
+ }
589
+ /**
590
+ * Stop CouchDB server
591
+ */
592
+ async stop(container) {
593
+ const { name, port } = container;
594
+ const containerDir = paths.getContainerPath(name, { engine: ENGINE });
595
+ const pidFile = join(containerDir, 'couchdb.pid');
596
+ logDebug(`Stopping CouchDB container "${name}" on port ${port}`);
597
+ let pid = null;
598
+ if (existsSync(pidFile)) {
599
+ try {
600
+ const content = await readFile(pidFile, 'utf8');
601
+ pid = parseInt(content.trim(), 10);
602
+ }
603
+ catch {
604
+ // Ignore
605
+ }
606
+ }
607
+ if (pid && platformService.isProcessRunning(pid)) {
608
+ logDebug(`Killing CouchDB process ${pid}`);
609
+ try {
610
+ if (isWindows()) {
611
+ await platformService.terminateProcess(pid, true);
612
+ }
613
+ else {
614
+ await platformService.terminateProcess(pid, false);
615
+ await new Promise((resolve) => setTimeout(resolve, 2000));
616
+ if (platformService.isProcessRunning(pid)) {
617
+ logWarning(`Graceful termination failed, force killing ${pid}`);
618
+ await platformService.terminateProcess(pid, true);
619
+ }
620
+ }
621
+ }
622
+ catch (error) {
623
+ logDebug(`Process termination error: ${error}`);
624
+ }
625
+ }
626
+ if (isWindows()) {
627
+ await new Promise((resolve) => setTimeout(resolve, 3000));
628
+ }
629
+ // Kill any processes still listening on the port
630
+ const portPids = await platformService.findProcessByPort(port);
631
+ for (const portPid of portPids) {
632
+ if (platformService.isProcessRunning(portPid)) {
633
+ logDebug(`Killing process ${portPid} still on port ${port}`);
634
+ try {
635
+ await platformService.terminateProcess(portPid, true);
636
+ }
637
+ catch {
638
+ // Ignore
639
+ }
640
+ }
641
+ }
642
+ if (isWindows() && portPids.length > 0) {
643
+ await new Promise((resolve) => setTimeout(resolve, 2000));
644
+ }
645
+ // Cleanup PID file
646
+ if (existsSync(pidFile)) {
647
+ try {
648
+ await unlink(pidFile);
649
+ }
650
+ catch {
651
+ // Ignore
652
+ }
653
+ }
654
+ // Note: On Windows, we write to etc/local.ini which gets overwritten on each start
655
+ // No cleanup needed as the file is shared and will be updated on next container start
656
+ // Wait for port to be released on Windows
657
+ if (isWindows()) {
658
+ logDebug(`Waiting for port ${port} to be released...`);
659
+ const portWaitStart = Date.now();
660
+ const portWaitTimeout = 30000;
661
+ const checkInterval = 500;
662
+ while (Date.now() - portWaitStart < portWaitTimeout) {
663
+ if (await portManager.isPortAvailable(port)) {
664
+ logDebug('Port released successfully');
665
+ break;
666
+ }
667
+ await new Promise((resolve) => setTimeout(resolve, checkInterval));
668
+ }
669
+ }
670
+ logDebug('CouchDB stopped');
671
+ }
672
+ // Get CouchDB server status
673
+ async status(container) {
674
+ const { name, port } = container;
675
+ const containerDir = paths.getContainerPath(name, { engine: ENGINE });
676
+ const pidFile = join(containerDir, 'couchdb.pid');
677
+ // Try health check via REST API
678
+ try {
679
+ const response = await couchdbApiRequest(port, 'GET', '/');
680
+ if (response.status === 200) {
681
+ return { running: true, message: 'CouchDB is running' };
682
+ }
683
+ }
684
+ catch {
685
+ // Not responding, check PID
686
+ }
687
+ // Check PID file
688
+ if (existsSync(pidFile)) {
689
+ try {
690
+ const content = await readFile(pidFile, 'utf8');
691
+ const pid = parseInt(content.trim(), 10);
692
+ if (!isNaN(pid) && pid > 0 && platformService.isProcessRunning(pid)) {
693
+ return {
694
+ running: true,
695
+ message: `CouchDB is running (PID: ${pid})`,
696
+ };
697
+ }
698
+ }
699
+ catch {
700
+ // Ignore
701
+ }
702
+ }
703
+ return { running: false, message: 'CouchDB is not running' };
704
+ }
705
+ // Detect backup format
706
+ async detectBackupFormat(filePath) {
707
+ return detectBackupFormatImpl(filePath);
708
+ }
709
+ /**
710
+ * Restore a backup
711
+ * CouchDB can restore while running (uses REST API)
712
+ */
713
+ async restore(container, backupPath, options = {}) {
714
+ const { port } = container;
715
+ return restoreBackup(backupPath, {
716
+ port,
717
+ database: options.database,
718
+ flush: options.flush,
719
+ });
720
+ }
721
+ /**
722
+ * Get connection string
723
+ * Format: http://127.0.0.1:PORT
724
+ */
725
+ getConnectionString(container, database) {
726
+ const { port } = container;
727
+ const base = `http://127.0.0.1:${port}`;
728
+ return database ? `${base}/${database}` : base;
729
+ }
730
+ // Open Fauxton web UI
731
+ async connect(container, _database) {
732
+ const { port } = container;
733
+ const url = `http://127.0.0.1:${port}/_utils`;
734
+ console.log(`CouchDB REST API available at: http://127.0.0.1:${port}`);
735
+ console.log(`CouchDB Fauxton UI: ${url}`);
736
+ console.log('');
737
+ console.log('Example commands:');
738
+ console.log(` curl http://127.0.0.1:${port}`);
739
+ console.log(` curl http://127.0.0.1:${port}/_all_dbs`);
740
+ }
741
+ /**
742
+ * Create a new database
743
+ */
744
+ async createDatabase(container, database) {
745
+ const { port } = container;
746
+ const response = await couchdbApiRequest(port, 'PUT', `/${encodeURIComponent(database)}`);
747
+ if (response.status !== 201 && response.status !== 412) {
748
+ // 412 means database already exists
749
+ throw new Error(`Failed to create database: ${JSON.stringify(response.data)}`);
750
+ }
751
+ logDebug(`Created CouchDB database: ${database}`);
752
+ }
753
+ /**
754
+ * Drop a database
755
+ */
756
+ async dropDatabase(container, database) {
757
+ const { port } = container;
758
+ const response = await couchdbApiRequest(port, 'DELETE', `/${encodeURIComponent(database)}`);
759
+ // Accept 200 (OK) or 202 (Accepted) for async deletes
760
+ if (response.status !== 200 && response.status !== 202) {
761
+ throw new Error(`Failed to delete database: ${JSON.stringify(response.data)}`);
762
+ }
763
+ logDebug(`Deleted CouchDB database: ${database} (status: ${response.status})`);
764
+ }
765
+ /**
766
+ * Get the size of the CouchDB instance
767
+ */
768
+ async getDatabaseSize(container) {
769
+ const { port } = container;
770
+ try {
771
+ // CouchDB doesn't directly expose total size, but we can sum up database sizes
772
+ const dbsResponse = await couchdbApiRequest(port, 'GET', '/_all_dbs');
773
+ if (dbsResponse.status !== 200) {
774
+ return null;
775
+ }
776
+ const dbs = dbsResponse.data;
777
+ let totalSize = 0;
778
+ for (const db of dbs) {
779
+ if (db.startsWith('_'))
780
+ continue; // Skip system dbs
781
+ const infoResponse = await couchdbApiRequest(port, 'GET', `/${encodeURIComponent(db)}`);
782
+ if (infoResponse.status === 200) {
783
+ const info = infoResponse.data;
784
+ totalSize += info.sizes?.file || 0;
785
+ }
786
+ }
787
+ return totalSize > 0 ? totalSize : null;
788
+ }
789
+ catch {
790
+ return null;
791
+ }
792
+ }
793
+ /**
794
+ * Dump from a remote CouchDB connection
795
+ */
796
+ async dumpFromConnectionString(connectionString, outputPath) {
797
+ const { baseUrl, headers, database } = parseCouchDBConnectionString(connectionString);
798
+ logDebug(`Connecting to remote CouchDB at ${baseUrl}`);
799
+ // Check connectivity
800
+ const infoResponse = await remoteCouchDBRequest(baseUrl, 'GET', '/', headers);
801
+ if (infoResponse.status !== 200) {
802
+ throw new Error(`Failed to connect to CouchDB at ${baseUrl}: ${JSON.stringify(infoResponse.data)}`);
803
+ }
804
+ const serverInfo = infoResponse.data;
805
+ logDebug(`Connected to CouchDB ${serverInfo?.version || 'unknown'}`);
806
+ // Get databases to backup
807
+ let databasesToBackup;
808
+ if (database) {
809
+ databasesToBackup = [database];
810
+ }
811
+ else {
812
+ const dbsResponse = await remoteCouchDBRequest(baseUrl, 'GET', '/_all_dbs', headers);
813
+ if (dbsResponse.status !== 200) {
814
+ throw new Error(`Failed to list databases: ${JSON.stringify(dbsResponse.data)}`);
815
+ }
816
+ const allDbs = dbsResponse.data;
817
+ databasesToBackup = allDbs.filter((db) => !db.startsWith('_'));
818
+ }
819
+ logDebug(`Backing up ${databasesToBackup.length} database(s)`);
820
+ // Export documents from each database
821
+ const backup = {
822
+ version: serverInfo?.version || 'unknown',
823
+ created: new Date().toISOString(),
824
+ databases: [],
825
+ };
826
+ for (const dbName of databasesToBackup) {
827
+ logDebug(`Exporting database: ${dbName}`);
828
+ const docsResponse = await remoteCouchDBRequest(baseUrl, 'GET', `/${encodeURIComponent(dbName)}/_all_docs?include_docs=true`, headers, undefined, 300000);
829
+ if (docsResponse.status !== 200) {
830
+ throw new Error(`Failed to export database ${dbName}: ${JSON.stringify(docsResponse.data)}`);
831
+ }
832
+ const docsData = docsResponse.data;
833
+ const docs = docsData.rows
834
+ ?.map((row) => row.doc)
835
+ .filter((doc) => doc !== undefined) || [];
836
+ // Filter out design documents
837
+ const userDocs = docs.filter((doc) => {
838
+ const d = doc;
839
+ return d._id && !d._id.startsWith('_design/');
840
+ });
841
+ backup.databases.push({
842
+ name: dbName,
843
+ docs: userDocs,
844
+ });
845
+ }
846
+ // Write backup to file
847
+ await mkdir(dirname(outputPath), { recursive: true });
848
+ await writeFile(outputPath, JSON.stringify(backup, null, 2));
849
+ return {
850
+ filePath: outputPath,
851
+ warnings: databasesToBackup.length === 0
852
+ ? ['Remote CouchDB instance has no user databases']
853
+ : undefined,
854
+ };
855
+ }
856
+ // Create a backup
857
+ async backup(container, outputPath, options) {
858
+ return createBackup(container, outputPath, options);
859
+ }
860
+ // Run a command - CouchDB uses REST API, not command files
861
+ async runScript(container, options) {
862
+ const { port } = container;
863
+ if (options.file) {
864
+ throw new Error('CouchDB does not support command files. Use the REST API directly.\n' +
865
+ `Example: curl http://127.0.0.1:${port}/_all_dbs`);
866
+ }
867
+ if (options.sql) {
868
+ const command = options.sql.trim().toUpperCase();
869
+ if (command === 'LIST DATABASES' || command === 'SHOW DATABASES') {
870
+ const response = await couchdbApiRequest(port, 'GET', '/_all_dbs');
871
+ console.log(JSON.stringify(response.data, null, 2));
872
+ return;
873
+ }
874
+ throw new Error('CouchDB uses REST API for operations. Use curl or the CouchDB client libraries.\n' +
875
+ `API endpoint: http://127.0.0.1:${port}`);
876
+ }
877
+ throw new Error('Either file or sql option must be provided');
878
+ }
879
+ /**
880
+ * Execute a query via REST API
881
+ *
882
+ * Query format: METHOD /path [JSON body]
883
+ * Examples:
884
+ * GET /_all_dbs
885
+ * GET /mydb/_all_docs
886
+ * POST /mydb/_find {"selector": {"type": "user"}}
887
+ */
888
+ async executeQuery(container, query, options) {
889
+ const { port } = container;
890
+ // Parse the query string: METHOD /path [body]
891
+ // If options?.method is provided, query can be just the path
892
+ const trimmed = query.trim();
893
+ const spaceIdx = trimmed.indexOf(' ');
894
+ let method;
895
+ let rest;
896
+ if (options?.method) {
897
+ // Method provided via options
898
+ method = options.method;
899
+ if (spaceIdx !== -1) {
900
+ // Check if first token looks like a method (GET, POST, etc.)
901
+ const firstToken = trimmed.substring(0, spaceIdx).toUpperCase();
902
+ if (['GET', 'POST', 'PUT', 'DELETE'].includes(firstToken)) {
903
+ // Query has method prefix, use rest after it
904
+ rest = trimmed.substring(spaceIdx + 1).trim();
905
+ }
906
+ else {
907
+ // Query is path + body, use entire trimmed
908
+ rest = trimmed;
909
+ }
910
+ }
911
+ else {
912
+ // Query is just the path
913
+ rest = trimmed;
914
+ }
915
+ }
916
+ else {
917
+ // No method in options, must parse from query
918
+ if (spaceIdx === -1) {
919
+ throw new Error('Invalid query format. Expected: METHOD /path [body]\n' +
920
+ 'Example: GET /_all_dbs');
921
+ }
922
+ method = trimmed.substring(0, spaceIdx).toUpperCase();
923
+ rest = trimmed.substring(spaceIdx + 1).trim();
924
+ }
925
+ // Extract path and optional JSON body
926
+ let path;
927
+ let body = options?.body;
928
+ const bodyStart = rest.indexOf('{');
929
+ if (bodyStart !== -1 && !body) {
930
+ path = rest.substring(0, bodyStart).trim();
931
+ try {
932
+ body = JSON.parse(rest.substring(bodyStart));
933
+ }
934
+ catch {
935
+ throw new Error('Invalid JSON body in query');
936
+ }
937
+ }
938
+ else {
939
+ path = rest;
940
+ }
941
+ // Ensure path starts with /
942
+ if (!path.startsWith('/')) {
943
+ path = '/' + path;
944
+ }
945
+ const response = await couchdbApiRequest(port, method, path, body);
946
+ if (response.status >= 400) {
947
+ throw new Error(`CouchDB API error (${response.status}): ${JSON.stringify(response.data)}`);
948
+ }
949
+ return parseRESTAPIResult(JSON.stringify(response.data));
950
+ }
951
+ /**
952
+ * List all user databases, excluding system databases (_users, _replicator, _global_changes).
953
+ */
954
+ async listDatabases(container) {
955
+ const { port } = container;
956
+ const response = await couchdbApiRequest(port, 'GET', '/_all_dbs');
957
+ if (response.status >= 400) {
958
+ throw new Error(`CouchDB API error (${response.status}): ${JSON.stringify(response.data)}`);
959
+ }
960
+ const allDatabases = response.data;
961
+ const systemDatabases = ['_users', '_replicator', '_global_changes'];
962
+ const databases = allDatabases.filter((db) => !systemDatabases.includes(db) && !db.startsWith('_'));
963
+ return databases;
964
+ }
965
+ async createUser(container, options) {
966
+ const { username, password, database } = options;
967
+ assertValidUsername(username);
968
+ const { port } = container;
969
+ const db = database || container.database;
970
+ if (!db) {
971
+ throw new Error('No database specified. Use --database or create a database first.');
972
+ }
973
+ // Ensure _users system database exists (CouchDB 3.x doesn't auto-create it)
974
+ const usersDbResponse = await couchdbApiRequest(port, 'PUT', '/_users');
975
+ if (usersDbResponse.status !== 201 && usersDbResponse.status !== 412) {
976
+ throw new Error(`Failed to ensure _users database exists: ${JSON.stringify(usersDbResponse.data)}`);
977
+ }
978
+ // Create user document in _users database
979
+ const userDoc = {
980
+ _id: `org.couchdb.user:${username}`,
981
+ name: username,
982
+ type: 'user',
983
+ roles: [],
984
+ password,
985
+ };
986
+ const createResponse = await couchdbApiRequest(port, 'PUT', `/_users/org.couchdb.user:${encodeURIComponent(username)}`, userDoc);
987
+ if (createResponse.status !== 201 && createResponse.status !== 409) {
988
+ throw new Error(`Failed to create user: ${JSON.stringify(createResponse.data)}`);
989
+ }
990
+ if (createResponse.status === 409) {
991
+ // User exists — fetch current doc revision and update password
992
+ const getResponse = await couchdbApiRequest(port, 'GET', `/_users/org.couchdb.user:${encodeURIComponent(username)}`);
993
+ if (getResponse.status !== 200 || !getResponse.data) {
994
+ throw new Error(`Failed to fetch existing user "${username}" (status ${getResponse.status}): ${JSON.stringify(getResponse.data)}`);
995
+ }
996
+ const existingDoc = getResponse.data;
997
+ const rev = existingDoc._rev;
998
+ if (!rev) {
999
+ throw new Error(`User "${username}" already exists but document has no _rev field: ${JSON.stringify(getResponse.data)}`);
1000
+ }
1001
+ const updateResponse = await couchdbApiRequest(port, 'PUT', `/_users/org.couchdb.user:${encodeURIComponent(username)}`, { ...existingDoc, password, _rev: rev });
1002
+ if (updateResponse.status !== 201) {
1003
+ throw new Error(`Failed to update user: ${JSON.stringify(updateResponse.data)}`);
1004
+ }
1005
+ }
1006
+ // Ensure the target database exists before setting security
1007
+ const dbCreateResponse = await couchdbApiRequest(port, 'PUT', `/${encodeURIComponent(db)}`);
1008
+ // 201 = created, 412 = already exists — both are fine
1009
+ if (dbCreateResponse.status !== 201 && dbCreateResponse.status !== 412) {
1010
+ throw new Error(`Failed to ensure database "${db}" exists: ${JSON.stringify(dbCreateResponse.data)}`);
1011
+ }
1012
+ // Grant access to the target database via _security document
1013
+ const secResponse = await couchdbApiRequest(port, 'GET', `/${encodeURIComponent(db)}/_security`);
1014
+ if (secResponse.status !== 200) {
1015
+ throw new Error(`Failed to read database security for "${db}": ${JSON.stringify(secResponse.data)}`);
1016
+ }
1017
+ const security = (secResponse.data || {});
1018
+ const members = (security.members || {});
1019
+ const names = (members.names || []).slice();
1020
+ if (!names.includes(username)) {
1021
+ names.push(username);
1022
+ }
1023
+ const secPutResponse = await couchdbApiRequest(port, 'PUT', `/${encodeURIComponent(db)}/_security`, {
1024
+ ...security,
1025
+ members: { ...members, names },
1026
+ });
1027
+ if (secPutResponse.status !== 200 && secPutResponse.status !== 201) {
1028
+ throw new Error(`Failed to update database security for "${db}": ${JSON.stringify(secPutResponse.data)}`);
1029
+ }
1030
+ logDebug(`Created CouchDB user: ${username}`);
1031
+ const connectionString = `http://${encodeURIComponent(username)}:${encodeURIComponent(password)}@127.0.0.1:${port}/${encodeURIComponent(db)}`;
1032
+ return {
1033
+ username,
1034
+ password,
1035
+ connectionString,
1036
+ engine: container.engine,
1037
+ container: container.name,
1038
+ database: db,
1039
+ };
1040
+ }
1041
+ }
1042
+ export const couchdbEngine = new CouchDBEngine();
1043
+ //# sourceMappingURL=index.js.map