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,1077 @@
1
+ /**
2
+ * Docker Exporter
3
+ *
4
+ * Generates Docker artifacts (Dockerfile, docker-compose.yml, entrypoint.sh, etc.)
5
+ * for running SpinDB containers in Docker.
6
+ *
7
+ * Architecture: SpinDB runs inside the container and manages the database,
8
+ * using the same hostdb binaries as local development.
9
+ */
10
+ import { mkdir, writeFile, copyFile, rm, readdir, readFile } from 'fs/promises';
11
+ import { join, basename } from 'path';
12
+ import { existsSync } from 'fs';
13
+ import { homedir } from 'os';
14
+ import { Engine, isFileBasedEngine, assertExhaustive, } from '../types/index.js';
15
+ import { engineDefaults } from '../config/engine-defaults.js';
16
+ import { getDefaultFormat, getBackupExtension } from '../config/backup-formats.js';
17
+ import { generateCredentials } from './credential-generator.js';
18
+ import { generateTLSCertificates, isOpenSSLAvailable } from './tls-generator.js';
19
+ import { withTransaction } from './transaction-manager.js';
20
+ /**
21
+ * Get the display name for an engine
22
+ */
23
+ function getEngineDisplayName(engine) {
24
+ const displayNames = {
25
+ [Engine.PostgreSQL]: 'PostgreSQL',
26
+ [Engine.MySQL]: 'MySQL',
27
+ [Engine.MariaDB]: 'MariaDB',
28
+ [Engine.SQLite]: 'SQLite',
29
+ [Engine.DuckDB]: 'DuckDB',
30
+ [Engine.MongoDB]: 'MongoDB',
31
+ [Engine.FerretDB]: 'FerretDB',
32
+ [Engine.Redis]: 'Redis',
33
+ [Engine.Valkey]: 'Valkey',
34
+ [Engine.ClickHouse]: 'ClickHouse',
35
+ [Engine.Qdrant]: 'Qdrant',
36
+ [Engine.Meilisearch]: 'Meilisearch',
37
+ [Engine.CouchDB]: 'CouchDB',
38
+ [Engine.CockroachDB]: 'CockroachDB',
39
+ [Engine.SurrealDB]: 'SurrealDB',
40
+ [Engine.QuestDB]: 'QuestDB',
41
+ [Engine.TypeDB]: 'TypeDB',
42
+ [Engine.InfluxDB]: 'InfluxDB',
43
+ [Engine.Weaviate]: 'Weaviate',
44
+ [Engine.TigerBeetle]: 'TigerBeetle',
45
+ };
46
+ return displayNames[engine] || engine;
47
+ }
48
+ /**
49
+ * Engine binary configuration for Docker exports
50
+ *
51
+ * Defines primary binaries per engine for PATH setup and documentation.
52
+ * This structure supports future enhancements:
53
+ * - excludedBinaries: binaries to omit from PATH (e.g., internal tools)
54
+ * - renamedBinaries: map of original -> renamed (e.g., for collision avoidance)
55
+ * - priority: for multi-engine containers, which engine's binary wins
56
+ */
57
+ const _ENGINE_BINARY_CONFIG = {
58
+ [Engine.PostgreSQL]: {
59
+ primaryBinaries: ['psql', 'pg_dump', 'pg_restore', 'createdb', 'dropdb'],
60
+ },
61
+ [Engine.MySQL]: {
62
+ primaryBinaries: ['mysql', 'mysqldump', 'mysqladmin'],
63
+ },
64
+ [Engine.MariaDB]: {
65
+ primaryBinaries: ['mariadb', 'mariadb-dump', 'mariadb-admin'],
66
+ },
67
+ [Engine.SQLite]: {
68
+ primaryBinaries: ['sqlite3'],
69
+ },
70
+ [Engine.DuckDB]: {
71
+ primaryBinaries: ['duckdb'],
72
+ },
73
+ [Engine.MongoDB]: {
74
+ primaryBinaries: ['mongosh', 'mongodump', 'mongorestore'],
75
+ },
76
+ [Engine.FerretDB]: {
77
+ primaryBinaries: ['mongosh', 'psql'], // FerretDB uses mongosh + PostgreSQL backend
78
+ },
79
+ [Engine.Redis]: {
80
+ primaryBinaries: ['redis-cli', 'redis-server'],
81
+ },
82
+ [Engine.Valkey]: {
83
+ primaryBinaries: ['valkey-cli', 'valkey-server'],
84
+ },
85
+ [Engine.ClickHouse]: {
86
+ primaryBinaries: ['clickhouse', 'clickhouse-client'],
87
+ },
88
+ [Engine.Qdrant]: {
89
+ primaryBinaries: [], // REST API only, no CLI tools
90
+ },
91
+ [Engine.Meilisearch]: {
92
+ primaryBinaries: [], // REST API only, no CLI tools
93
+ },
94
+ [Engine.CouchDB]: {
95
+ primaryBinaries: [], // REST API only, no CLI tools
96
+ },
97
+ [Engine.CockroachDB]: {
98
+ primaryBinaries: ['cockroach'],
99
+ },
100
+ [Engine.SurrealDB]: {
101
+ primaryBinaries: ['surreal'],
102
+ },
103
+ [Engine.QuestDB]: {
104
+ primaryBinaries: [], // Uses psql from PostgreSQL for connections
105
+ },
106
+ [Engine.TypeDB]: {
107
+ primaryBinaries: ['typedb', 'typedb_console_bin'],
108
+ },
109
+ [Engine.InfluxDB]: {
110
+ primaryBinaries: [], // REST API only, no CLI tools
111
+ },
112
+ [Engine.Weaviate]: {
113
+ primaryBinaries: [], // REST/GraphQL API only, no CLI tools
114
+ },
115
+ [Engine.TigerBeetle]: {
116
+ primaryBinaries: ['tigerbeetle'],
117
+ },
118
+ };
119
+ /**
120
+ * Get the connection string template for an engine
121
+ * Includes placeholders for credentials and optionally TLS
122
+ *
123
+ * @param engine - Database engine
124
+ * @param port - Port number
125
+ * @param database - Database name
126
+ * @param useTLS - Whether to include TLS parameters (default: true)
127
+ */
128
+ function getConnectionStringTemplate(engine, port, database, useTLS = true) {
129
+ switch (engine) {
130
+ case Engine.PostgreSQL:
131
+ case Engine.CockroachDB:
132
+ case Engine.QuestDB:
133
+ return useTLS
134
+ ? `postgresql://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}?sslmode=require`
135
+ : `postgresql://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`;
136
+ case Engine.MySQL:
137
+ case Engine.MariaDB:
138
+ return useTLS
139
+ ? `mysql://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}?ssl=true`
140
+ : `mysql://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`;
141
+ case Engine.MongoDB:
142
+ case Engine.FerretDB:
143
+ return useTLS
144
+ ? `mongodb://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}?tls=true`
145
+ : `mongodb://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`;
146
+ case Engine.Redis:
147
+ case Engine.Valkey:
148
+ return useTLS
149
+ ? `rediss://:\${SPINDB_PASSWORD}@<host>:${port}`
150
+ : `redis://:\${SPINDB_PASSWORD}@<host>:${port}`;
151
+ case Engine.ClickHouse:
152
+ return useTLS
153
+ ? `clickhouse://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}?secure=true`
154
+ : `clickhouse://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`;
155
+ case Engine.Qdrant:
156
+ return useTLS ? `https://<host>:${port}` : `http://<host>:${port}`;
157
+ case Engine.Meilisearch:
158
+ case Engine.InfluxDB:
159
+ case Engine.Weaviate:
160
+ return useTLS ? `https://<host>:${port}` : `http://<host>:${port}`;
161
+ case Engine.CouchDB:
162
+ return useTLS
163
+ ? `https://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`
164
+ : `http://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}/${database}`;
165
+ case Engine.SurrealDB:
166
+ return useTLS
167
+ ? `wss://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}`
168
+ : `ws://\${SPINDB_USER}:\${SPINDB_PASSWORD}@<host>:${port}`;
169
+ case Engine.TypeDB:
170
+ return `typedb://<host>:${port}`;
171
+ case Engine.TigerBeetle:
172
+ return `<host>:${port}`;
173
+ case Engine.SQLite:
174
+ case Engine.DuckDB:
175
+ return `File-based database (no network connection)`;
176
+ default:
177
+ assertExhaustive(engine, `Unhandled engine in getConnectionUri: ${engine}`);
178
+ }
179
+ }
180
+ /**
181
+ * Generate the Dockerfile content
182
+ */
183
+ function generateDockerfile(engine, isFileBased, useTLS) {
184
+ // File-based engines don't have a running server, so check container exists
185
+ // Server-based engines check for running status
186
+ const healthcheck = isFileBased
187
+ ? `HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \\
188
+ CMD gosu spindb spindb list --json | grep -q '"engine":.*"${engine}"'`
189
+ : `HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \\
190
+ CMD gosu spindb spindb list --json | grep -q '"status":.*"running"'`;
191
+ // Only copy TLS certificates if they were generated
192
+ const copyCerts = useTLS
193
+ ? `
194
+ # Copy TLS certificates
195
+ COPY --chown=spindb:spindb ./certs/ /home/spindb/.spindb/certs/
196
+ `
197
+ : '';
198
+ return `# SpinDB Docker Container
199
+ # Runs SpinDB inside Docker to manage database lifecycle
200
+
201
+ FROM ubuntu:22.04
202
+
203
+ # Prevent interactive prompts during package installation
204
+ ENV DEBIAN_FRONTEND=noninteractive
205
+
206
+ # Install base dependencies
207
+ # libnuma1: Required by PostgreSQL binaries
208
+ # libxml2: XML library required by PostgreSQL
209
+ # libicu70: ICU library required by PostgreSQL (Ubuntu 22.04 ships ICU 70)
210
+ # libaio1: Async I/O library required by MySQL
211
+ # libncurses6: Terminal library required by MariaDB
212
+ # locales: Needed for PostgreSQL locale configuration
213
+ # lsof: Needed by SpinDB's findProcessByPort()
214
+ # gosu: For running commands as non-root user
215
+ RUN apt-get update && apt-get install -y \\
216
+ curl \\
217
+ openssl \\
218
+ ca-certificates \\
219
+ gnupg \\
220
+ libnuma1 \\
221
+ libxml2 \\
222
+ libicu70 \\
223
+ libaio1 \\
224
+ libncurses6 \\
225
+ locales \\
226
+ lsof \\
227
+ gosu \\
228
+ && locale-gen en_US.UTF-8 \\
229
+ && rm -rf /var/lib/apt/lists/*
230
+
231
+ # Set locale environment variables
232
+ ENV LANG=en_US.UTF-8
233
+ ENV LC_ALL=en_US.UTF-8
234
+
235
+ # Install Node.js 22 LTS (matches SpinDB's engine requirements)
236
+ RUN mkdir -p /etc/apt/keyrings \\
237
+ && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \\
238
+ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \\
239
+ && apt-get update \\
240
+ && apt-get install -y nodejs \\
241
+ && rm -rf /var/lib/apt/lists/*
242
+
243
+ # Create spindb user (non-root for database processes)
244
+ RUN groupadd -r spindb && useradd -r -g spindb -d /home/spindb -m -s /bin/bash spindb
245
+
246
+ # Install pnpm and SpinDB globally
247
+ ENV PNPM_HOME="/home/spindb/.local/share/pnpm"
248
+ ENV PATH="$PNPM_HOME:$PATH"
249
+ RUN npm install -g pnpm \\
250
+ && mkdir -p "$PNPM_HOME" \\
251
+ && pnpm add -g spindb
252
+
253
+ # Create spindb directories with proper ownership
254
+ RUN mkdir -p /home/spindb/.spindb/containers /home/spindb/.spindb/bin /home/spindb/.spindb/certs /home/spindb/.spindb/init \\
255
+ && chown -R spindb:spindb /home/spindb
256
+ ${copyCerts}
257
+ # Copy database backup/data
258
+ COPY --chown=spindb:spindb ./data/ /home/spindb/.spindb/init/
259
+
260
+ # Copy entrypoint script
261
+ COPY ./entrypoint.sh /entrypoint.sh
262
+ RUN chmod +x /entrypoint.sh
263
+
264
+ # Environment variables (can be overridden)
265
+ ENV SPINDB_ENGINE=${engine}
266
+ ENV HOME=/home/spindb
267
+
268
+ # Expose database port
269
+ EXPOSE \${SPINDB_PORT:-${engineDefaults[engine].defaultPort}}
270
+
271
+ # Health check (run as spindb user)
272
+ ${healthcheck}
273
+
274
+ ENTRYPOINT ["/entrypoint.sh"]
275
+ `;
276
+ }
277
+ /**
278
+ * Generate the entrypoint.sh content
279
+ */
280
+ function generateEntrypoint(engine, containerName, database, databases, version, port, useTLS) {
281
+ const isFileBased = isFileBasedEngine(engine);
282
+ // Engine-specific network configuration (run after create, before start)
283
+ // This configures databases to accept connections from Docker network
284
+ let networkConfig = '';
285
+ switch (engine) {
286
+ case Engine.PostgreSQL:
287
+ case Engine.CockroachDB:
288
+ // PostgreSQL/CockroachDB need to listen on all interfaces and allow network connections
289
+ networkConfig = `
290
+ # Configure PostgreSQL to accept connections from Docker network
291
+ echo "Configuring network access..."
292
+ PG_CONF="/home/spindb/.spindb/containers/${engine}/\${CONTAINER_NAME}/data/postgresql.conf"
293
+ PG_HBA="/home/spindb/.spindb/containers/${engine}/\${CONTAINER_NAME}/data/pg_hba.conf"
294
+
295
+ # Set listen_addresses to allow connections from any interface
296
+ if [ -f "$PG_CONF" ]; then
297
+ sed -i "s/^#*listen_addresses.*/listen_addresses = '*'/" "$PG_CONF"
298
+ fi
299
+
300
+ # Add rule to allow password-authenticated connections from any IP
301
+ if [ -f "$PG_HBA" ] && ! grep -q "0.0.0.0/0" "$PG_HBA"; then
302
+ echo "host all all 0.0.0.0/0 scram-sha-256" >> "$PG_HBA"
303
+ fi
304
+ `;
305
+ break;
306
+ default:
307
+ // Other engines don't need special network config (they listen on all interfaces by default)
308
+ break;
309
+ }
310
+ // Engine-specific user creation commands
311
+ let userCreationCommands = '';
312
+ switch (engine) {
313
+ case Engine.PostgreSQL:
314
+ userCreationCommands = `
315
+ # Create user with password
316
+ echo "[$(date '+%H:%M:%S')] Creating database user '$SPINDB_USER'..."
317
+ cat > /tmp/create-user.sql <<EOSQL
318
+ DO \\$\\$
319
+ BEGIN
320
+ IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '$SPINDB_USER') THEN
321
+ CREATE ROLE "$SPINDB_USER" WITH LOGIN PASSWORD '$SPINDB_PASSWORD' CREATEDB;
322
+ ELSE
323
+ ALTER ROLE "$SPINDB_USER" WITH PASSWORD '$SPINDB_PASSWORD';
324
+ END IF;
325
+ END
326
+ \\$\\$;
327
+ GRANT ALL PRIVILEGES ON DATABASE "$DATABASE" TO "$SPINDB_USER";
328
+ EOSQL
329
+ if ! run_as_spindb spindb run "$CONTAINER_NAME" /tmp/create-user.sql --database postgres; then
330
+ echo "[$(date '+%H:%M:%S')] ERROR: Failed to create database user"
331
+ rm -f /tmp/create-user.sql
332
+ exit 1
333
+ fi
334
+ rm -f /tmp/create-user.sql
335
+ echo "[$(date '+%H:%M:%S')] User '$SPINDB_USER' created successfully"
336
+ `;
337
+ break;
338
+ case Engine.MySQL:
339
+ case Engine.MariaDB:
340
+ userCreationCommands = `
341
+ # Create user with password
342
+ echo "Creating database user..."
343
+ cat > /tmp/create-user.sql <<EOSQL
344
+ CREATE USER IF NOT EXISTS '$SPINDB_USER'@'%' IDENTIFIED BY '$SPINDB_PASSWORD';
345
+ GRANT ALL PRIVILEGES ON \\\`$DATABASE\\\`.* TO '$SPINDB_USER'@'%';
346
+ FLUSH PRIVILEGES;
347
+ EOSQL
348
+ run_as_spindb spindb run "$CONTAINER_NAME" /tmp/create-user.sql --database mysql
349
+ rm -f /tmp/create-user.sql
350
+ `;
351
+ break;
352
+ case Engine.MongoDB:
353
+ case Engine.FerretDB:
354
+ userCreationCommands = `
355
+ # Create user with password
356
+ echo "Creating database user..."
357
+ cat > /tmp/create-user.js <<EOJS
358
+ db.createUser({
359
+ user: "$SPINDB_USER",
360
+ pwd: "$SPINDB_PASSWORD",
361
+ roles: [{ role: "readWrite", db: "$DATABASE" }]
362
+ });
363
+ EOJS
364
+ run_as_spindb spindb run "$CONTAINER_NAME" /tmp/create-user.js --database admin
365
+ rm -f /tmp/create-user.js
366
+ `;
367
+ break;
368
+ case Engine.Redis:
369
+ case Engine.Valkey:
370
+ // Redis uses requirepass, configured at start time
371
+ userCreationCommands = `
372
+ # Redis/Valkey authentication is configured at server start via --requirepass
373
+ echo "Authentication configured via server settings"
374
+ `;
375
+ break;
376
+ case Engine.ClickHouse:
377
+ userCreationCommands = `
378
+ # Create user with password
379
+ echo "Creating database user..."
380
+ cat > /tmp/create-user.sql <<EOSQL
381
+ CREATE USER IF NOT EXISTS $SPINDB_USER IDENTIFIED BY '$SPINDB_PASSWORD';
382
+ GRANT ALL ON $DATABASE.* TO $SPINDB_USER;
383
+ EOSQL
384
+ run_as_spindb spindb run "$CONTAINER_NAME" /tmp/create-user.sql
385
+ rm -f /tmp/create-user.sql
386
+ `;
387
+ break;
388
+ case Engine.CouchDB:
389
+ userCreationCommands = `
390
+ # CouchDB admin user is configured at server start
391
+ echo "Admin credentials configured via server settings"
392
+ `;
393
+ break;
394
+ case Engine.CockroachDB:
395
+ userCreationCommands = `
396
+ # Create user with password
397
+ echo "Creating database user..."
398
+ cat > /tmp/create-user.sql <<EOSQL
399
+ CREATE USER IF NOT EXISTS $SPINDB_USER WITH PASSWORD '$SPINDB_PASSWORD';
400
+ GRANT ALL ON DATABASE $DATABASE TO $SPINDB_USER;
401
+ EOSQL
402
+ run_as_spindb spindb run "$CONTAINER_NAME" /tmp/create-user.sql --database defaultdb
403
+ rm -f /tmp/create-user.sql
404
+ `;
405
+ break;
406
+ case Engine.SurrealDB:
407
+ userCreationCommands = `
408
+ # SurrealDB credentials are configured at server start
409
+ echo "Credentials configured via server settings"
410
+ `;
411
+ break;
412
+ case Engine.QuestDB:
413
+ userCreationCommands = `
414
+ # QuestDB user is configured via config
415
+ echo "User configured via server settings"
416
+ `;
417
+ break;
418
+ case Engine.Qdrant:
419
+ case Engine.Meilisearch:
420
+ case Engine.Weaviate:
421
+ userCreationCommands = `
422
+ # API key is configured at server start
423
+ echo "API key configured via server settings"
424
+ `;
425
+ break;
426
+ case Engine.InfluxDB:
427
+ userCreationCommands = `
428
+ # InfluxDB 3.x local dev runs without authentication
429
+ echo "No authentication required for local InfluxDB 3.x"
430
+ `;
431
+ break;
432
+ case Engine.TypeDB:
433
+ userCreationCommands = `
434
+ # TypeDB community edition does not support user management
435
+ echo "No authentication required"
436
+ `;
437
+ break;
438
+ case Engine.TigerBeetle:
439
+ userCreationCommands = `
440
+ # TigerBeetle has no authentication
441
+ echo "No authentication required"
442
+ `;
443
+ break;
444
+ case Engine.SQLite:
445
+ case Engine.DuckDB:
446
+ userCreationCommands = `
447
+ # File-based database - no user creation needed
448
+ echo "File-based database initialized"
449
+ `;
450
+ break;
451
+ default:
452
+ assertExhaustive(engine, `Unhandled engine in generateEntrypoint: ${engine}`);
453
+ }
454
+ // Generate restore commands for all databases
455
+ // Note: Uses /home/spindb/.spindb/init/ since container runs as spindb user
456
+ const initDir = '/home/spindb/.spindb/init';
457
+ const fileExt = engine === Engine.SQLite ? 'sqlite' : 'duckdb';
458
+ // File-based path is computed at runtime in the shell script using $FILE_DB_PATH
459
+ const restoreSection = isFileBased
460
+ ? `
461
+ # File-based database - copy data file to the path used by spindb create --path
462
+ if ls ${initDir}/*.${fileExt} 1> /dev/null 2>&1; then
463
+ echo "Copying database file..."
464
+ cp ${initDir}/*.${fileExt} "$FILE_DB_PATH"
465
+ fi
466
+ `
467
+ : databases.length > 1
468
+ ? `
469
+ # Restore data for all databases
470
+ echo "[$(date '+%H:%M:%S')] Checking for backup files in ${initDir}..."
471
+ ls -la ${initDir}/ 2>/dev/null || echo " (directory empty or not found)"
472
+ DATABASES="${databases.join(' ')}"
473
+ for DB in $DATABASES; do
474
+ # Find backup file for this database (pattern: containerName-dbName.*)
475
+ BACKUP_FILE=$(ls ${initDir}/${containerName}-$DB.* 2>/dev/null | head -1)
476
+ if [ -n "$BACKUP_FILE" ]; then
477
+ echo "[$(date '+%H:%M:%S')] Found backup for database '$DB': $BACKUP_FILE"
478
+ # Add database to tracking if not already tracked
479
+ run_as_spindb spindb databases add "$CONTAINER_NAME" "$DB" 2>/dev/null || true
480
+ if ! run_as_spindb spindb restore "$CONTAINER_NAME" "$BACKUP_FILE" --database "$DB" --force; then
481
+ echo "[$(date '+%H:%M:%S')] ERROR: Restore of '$DB' failed"
482
+ exit 1
483
+ fi
484
+ echo "[$(date '+%H:%M:%S')] Restore of '$DB' completed successfully"
485
+ else
486
+ echo "[$(date '+%H:%M:%S')] WARNING: No backup file found for database '$DB'"
487
+ fi
488
+ done
489
+ `
490
+ : `
491
+ # Restore data if backup exists
492
+ echo "[$(date '+%H:%M:%S')] Checking for backup files in ${initDir}..."
493
+ ls -la ${initDir}/ 2>/dev/null || echo " (directory empty or not found)"
494
+ if ls ${initDir}/* 1> /dev/null 2>&1; then
495
+ BACKUP_FILE=$(ls ${initDir}/* | head -1)
496
+ echo "[$(date '+%H:%M:%S')] Found backup file: $BACKUP_FILE"
497
+ echo "[$(date '+%H:%M:%S')] Restoring to database '$DATABASE'..."
498
+ if ! run_as_spindb spindb restore "$CONTAINER_NAME" "$BACKUP_FILE" --database "$DATABASE" --force; then
499
+ echo "[$(date '+%H:%M:%S')] ERROR: Restore failed with exit code $?"
500
+ exit 1
501
+ fi
502
+ echo "[$(date '+%H:%M:%S')] Restore completed successfully"
503
+ else
504
+ echo "[$(date '+%H:%M:%S')] WARNING: No backup files found in ${initDir}"
505
+ fi
506
+ `;
507
+ // Post-restore commands - grant table/sequence permissions to the spindb user
508
+ // Tables created during restore are owned by postgres, so spindb user needs grants
509
+ let postRestoreCommands = '';
510
+ switch (engine) {
511
+ case Engine.PostgreSQL:
512
+ case Engine.CockroachDB:
513
+ postRestoreCommands = `
514
+ # Grant table and sequence permissions to spindb user
515
+ # (Tables from restore are owned by postgres, spindb user needs access)
516
+ echo "[$(date '+%H:%M:%S')] Granting table permissions to '$SPINDB_USER'..."
517
+ cat > /tmp/grant-permissions.sql <<EOSQL
518
+ GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "$SPINDB_USER";
519
+ GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "$SPINDB_USER";
520
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO "$SPINDB_USER";
521
+ ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO "$SPINDB_USER";
522
+ EOSQL
523
+ if ! run_as_spindb spindb run "$CONTAINER_NAME" /tmp/grant-permissions.sql --database "$DATABASE"; then
524
+ echo "[$(date '+%H:%M:%S')] ERROR: Failed to grant permissions"
525
+ rm -f /tmp/grant-permissions.sql
526
+ exit 1
527
+ fi
528
+ rm -f /tmp/grant-permissions.sql
529
+ echo "[$(date '+%H:%M:%S')] Permissions granted successfully"
530
+ `;
531
+ break;
532
+ case Engine.MySQL:
533
+ case Engine.MariaDB:
534
+ // MySQL grants are already handled by GRANT ALL ON database.* in user creation
535
+ postRestoreCommands = '';
536
+ break;
537
+ default:
538
+ // Other engines don't need post-restore permission grants
539
+ postRestoreCommands = '';
540
+ break;
541
+ }
542
+ return `#!/bin/bash
543
+ set -e
544
+
545
+ # Container configuration (from environment variables)
546
+ CONTAINER_NAME="\${SPINDB_CONTAINER:-${containerName}}"
547
+ DATABASE="\${SPINDB_DATABASE:-${database}}"
548
+ ENGINE="\${SPINDB_ENGINE:-${engine}}"
549
+ VERSION="\${SPINDB_VERSION:-${version}}"
550
+ PORT="\${SPINDB_PORT:-${port}}"
551
+ SPINDB_USER="\${SPINDB_USER:-spindb}"
552
+ SPINDB_PASSWORD="\${SPINDB_PASSWORD:?Error: SPINDB_PASSWORD environment variable is required}"
553
+
554
+ # Validate password doesn't contain characters that break SQL/JS here-docs
555
+ # These characters would cause syntax errors in the user creation commands
556
+ if echo "$SPINDB_PASSWORD" | grep -qE "['"'\\\`$!]'; then
557
+ echo "ERROR: SPINDB_PASSWORD contains unsafe characters for shell scripts." >&2
558
+ echo 'Avoid using: '"'"' " \\ \` $ ! in passwords when running in Docker.' >&2
559
+ echo "These characters break SQL/JS here-docs in the entrypoint script." >&2
560
+ exit 1
561
+ fi
562
+ ${isFileBased
563
+ ? `
564
+ # File-based database path (computed from runtime CONTAINER_NAME)
565
+ FILE_DB_PATH="/home/spindb/.spindb/containers/${engine}/\${CONTAINER_NAME}/\${CONTAINER_NAME}.${fileExt}"
566
+ `
567
+ : ''}
568
+ # Export environment variables for the spindb user
569
+ export SPINDB_CONTAINER SPINDB_DATABASE SPINDB_ENGINE SPINDB_VERSION SPINDB_PORT SPINDB_USER SPINDB_PASSWORD
570
+
571
+ # PATH will be updated after spindb downloads engine binaries
572
+
573
+ # Fix permissions on mounted volume (may have been created with root ownership)
574
+ echo "Setting up directories..."
575
+ chown -R spindb:spindb /home/spindb/.spindb 2>/dev/null || true
576
+
577
+ echo "========================================"
578
+ echo "SpinDB Docker Container"
579
+ echo "========================================"
580
+ echo "Engine: $ENGINE $VERSION"
581
+ echo "Container: $CONTAINER_NAME"
582
+ echo "Database: $DATABASE"
583
+ echo "Port: $PORT"
584
+ echo "========================================"
585
+
586
+ # Run all spindb commands as the spindb user (databases cannot run as root)
587
+ run_as_spindb() {
588
+ gosu spindb "$@"
589
+ }
590
+
591
+ # Check if container already exists
592
+ if run_as_spindb spindb list --json 2>/dev/null | grep -q '"name": "'"$CONTAINER_NAME"'"'; then
593
+ echo "[$(date '+%H:%M:%S')] Container '$CONTAINER_NAME' already exists"
594
+ ${isFileBased
595
+ ? `# File-based database: no server to start`
596
+ : `# Check if database is running, start if not (handles Docker restart)
597
+ if ! run_as_spindb spindb list --json 2>/dev/null | grep -q '"status":.*"running"'; then
598
+ echo "[$(date '+%H:%M:%S')] Database not running, starting..."
599
+ if ! run_as_spindb spindb start "$CONTAINER_NAME"; then
600
+ echo "[$(date '+%H:%M:%S')] ERROR: Failed to start database"
601
+ exit 1
602
+ fi
603
+ fi`}
604
+ else
605
+ echo "[$(date '+%H:%M:%S')] Creating container '$CONTAINER_NAME'..."
606
+ ${isFileBased
607
+ ? `# File-based database: use deterministic path for database file
608
+ if ! run_as_spindb spindb create "$CONTAINER_NAME" --engine "$ENGINE" --db-version "$VERSION" --path "$FILE_DB_PATH" --force; then
609
+ echo "[$(date '+%H:%M:%S')] ERROR: Failed to create container"
610
+ exit 1
611
+ fi`
612
+ : `# Use --start to ensure database is created (non-TTY defaults to no-start)
613
+ if ! run_as_spindb spindb create "$CONTAINER_NAME" --engine "$ENGINE" --db-version "$VERSION" --port "$PORT" --database "$DATABASE" --force --start; then
614
+ echo "[$(date '+%H:%M:%S')] ERROR: Failed to create container"
615
+ exit 1
616
+ fi`}
617
+ echo "[$(date '+%H:%M:%S')] Container created successfully"
618
+ fi
619
+
620
+ # Add engine binary directory to PATH (idempotent - only adds if not present)
621
+ # This allows users to run psql, mysql, etc. directly in the container
622
+ # Note: We add the actual bin directory to PATH instead of creating symlinks
623
+ # because some binaries (like psql) are wrapper scripts that use relative paths
624
+ echo "Setting up database binaries in PATH..."
625
+ BIN_DIR=$(ls -d /home/spindb/.spindb/bin/\${ENGINE}-*/bin 2>/dev/null | head -1)
626
+ if [ -d "$BIN_DIR" ]; then
627
+ export PATH="$BIN_DIR:$PATH"
628
+ # Create/overwrite script in /etc/profile.d for system-wide access (idempotent)
629
+ # This ensures PATH is set for login shells without duplication
630
+ echo "export PATH=\\"$BIN_DIR:\\$PATH\\"" > /etc/profile.d/spindb-bins.sh
631
+ echo "Binaries available in PATH: $(ls "$BIN_DIR" | tr '\\n' ' ')"
632
+ else
633
+ echo "Warning: No engine binaries found"
634
+ fi
635
+ ${networkConfig}${isFileBased
636
+ ? `
637
+ # File-based database: no server to start, just verify file exists after restore
638
+ `
639
+ : `
640
+ # Database was started by 'spindb create --start' above
641
+ # Wait for database to be fully ready for connections
642
+ echo "[$(date '+%H:%M:%S')] Waiting for database to be ready..."
643
+ RETRIES=30
644
+ until run_as_spindb spindb list --json 2>/dev/null | grep -q '"status":.*"running"' || [ $RETRIES -eq 0 ]; do
645
+ echo "[$(date '+%H:%M:%S')] Waiting for database... ($RETRIES attempts remaining)"
646
+ sleep 2
647
+ RETRIES=$((RETRIES-1))
648
+ done
649
+
650
+ if [ $RETRIES -eq 0 ]; then
651
+ echo "[$(date '+%H:%M:%S')] ERROR: Database failed to start"
652
+ exit 1
653
+ fi`}
654
+
655
+ echo "[$(date '+%H:%M:%S')] Database is running!"
656
+
657
+ # Initialization marker file - ensures user creation and data restore only run once
658
+ INIT_MARKER="/home/spindb/.spindb/.initialized-$CONTAINER_NAME"
659
+ if [ ! -f "$INIT_MARKER" ]; then
660
+ echo "[$(date '+%H:%M:%S')] ======== FIRST-TIME INITIALIZATION ========"
661
+ ${userCreationCommands}
662
+ ${restoreSection}
663
+ ${postRestoreCommands}
664
+ # Mark initialization complete
665
+ touch "$INIT_MARKER"
666
+ chown spindb:spindb "$INIT_MARKER"
667
+ echo "[$(date '+%H:%M:%S')] ======== INITIALIZATION COMPLETE ========"
668
+ else
669
+ echo "[$(date '+%H:%M:%S')] Container already initialized, skipping data restore."
670
+ fi
671
+
672
+ echo "========================================"
673
+ echo "SPINDB_READY"
674
+ echo "SpinDB container ready!"
675
+ echo ""
676
+ echo "Connection: ${getConnectionStringTemplate(engine, port, database, useTLS).replace(/\$/g, '\\$')}"
677
+ echo "========================================"
678
+ ${isFileBased
679
+ ? `
680
+ # File-based database: just keep container alive (no server to monitor)
681
+ exec tail -f /dev/null`
682
+ : `
683
+ # Keep container running
684
+ # Trap SIGTERM and SIGINT for graceful shutdown
685
+ trap "echo 'Shutting down...'; run_as_spindb spindb stop '$CONTAINER_NAME'; exit 0" SIGTERM SIGINT
686
+
687
+ # Keep the container running (as spindb user)
688
+ exec gosu spindb tail -f /dev/null &
689
+ while true; do
690
+ sleep 60
691
+ # Check if database is still running
692
+ if ! run_as_spindb spindb list --json 2>/dev/null | grep -q '"status":.*"running"'; then
693
+ echo "Database stopped unexpectedly, restarting..."
694
+ run_as_spindb spindb start "$CONTAINER_NAME" || true
695
+ fi
696
+ done`}
697
+ `;
698
+ }
699
+ /**
700
+ * Generate docker-compose.yml content
701
+ */
702
+ function generateDockerCompose(containerName, engine, version, port, database, isFileBased) {
703
+ // Engine-aware healthcheck matching Dockerfile behavior
704
+ // Server-based: check for running status
705
+ // File-based: check that container exists (no server process to check)
706
+ // Note: Double quotes must be escaped for YAML string context
707
+ const healthcheckCommand = isFileBased
708
+ ? `gosu spindb spindb list --json | grep -q '\\"engine\\":.*\\"${engine}\\"'`
709
+ : `gosu spindb spindb list --json | grep -q '\\"status\\":.*\\"running\\"'`;
710
+ const startPeriod = isFileBased ? '30s' : '60s';
711
+ return `name: spindb-${containerName}
712
+
713
+ services:
714
+ ${containerName}:
715
+ build: .
716
+ container_name: spindb-${containerName}
717
+ restart: unless-stopped
718
+ environment:
719
+ SPINDB_CONTAINER: \${CONTAINER_NAME:-${containerName}}
720
+ SPINDB_ENGINE: \${ENGINE:-${engine}}
721
+ SPINDB_VERSION: \${VERSION:-${version}}
722
+ SPINDB_PORT: \${PORT:-${port}}
723
+ SPINDB_DATABASE: \${DATABASE:-${database}}
724
+ SPINDB_USER: \${SPINDB_USER:-spindb}
725
+ SPINDB_PASSWORD: \${SPINDB_PASSWORD:?Set SPINDB_PASSWORD in .env file}
726
+ ports:
727
+ - "\${PORT:-${port}}:\${PORT:-${port}}"
728
+ volumes:
729
+ - spindb-data:/home/spindb/.spindb
730
+ healthcheck:
731
+ test: ["CMD-SHELL", "${healthcheckCommand}"]
732
+ interval: 30s
733
+ timeout: 10s
734
+ start_period: ${startPeriod}
735
+ retries: 3
736
+
737
+ volumes:
738
+ spindb-data:
739
+ `;
740
+ }
741
+ /**
742
+ * Generate .env file content
743
+ */
744
+ function generateEnvFile(containerName, engine, version, port, database, credentials) {
745
+ return `# SpinDB Docker Configuration
746
+ # Generated by: spindb export docker
747
+
748
+ # Container settings
749
+ CONTAINER_NAME=${containerName}
750
+ ENGINE=${engine}
751
+ VERSION=${version}
752
+ PORT=${port}
753
+ DATABASE=${database}
754
+
755
+ # Credentials (auto-generated, change in production)
756
+ SPINDB_USER=${credentials.username}
757
+ SPINDB_PASSWORD=${credentials.password}
758
+ `;
759
+ }
760
+ /**
761
+ * Generate README.md content
762
+ */
763
+ function generateReadme(containerName, engine, version, port, database, useTLS) {
764
+ const displayName = getEngineDisplayName(engine);
765
+ const connectionTemplate = getConnectionStringTemplate(engine, port, database, useTLS);
766
+ // TLS-conditional content
767
+ const tlsSecurityNote = useTLS
768
+ ? '- TLS certificates in `certs/` are self-signed. For production, replace with valid certificates.'
769
+ : '- TLS is disabled for this export. Consider enabling TLS for production use.';
770
+ const certsFileEntry = useTLS ? '| `certs/` | TLS certificates |\n' : '';
771
+ const tlsCustomization = useTLS
772
+ ? `
773
+ ### Use Custom Certificates
774
+
775
+ Replace the files in \`certs/\`:
776
+ - \`server.crt\` - TLS certificate
777
+ - \`server.key\` - TLS private key
778
+
779
+ ### Disable TLS
780
+
781
+ Edit \`entrypoint.sh\` and remove TLS-related flags (not recommended for production).
782
+ `
783
+ : `
784
+ ### Enable TLS
785
+
786
+ To enable TLS, re-export the container without the \`--skip-tls\` flag (requires OpenSSL).
787
+ `;
788
+ return `# ${containerName} - SpinDB Docker Export
789
+
790
+ This directory contains a Docker-ready package for running your SpinDB ${displayName} container.
791
+
792
+ ## Quick Start
793
+
794
+ \`\`\`bash
795
+ # Start the container
796
+ docker compose up -d
797
+
798
+ # View logs
799
+ docker compose logs -f
800
+
801
+ # Stop the container
802
+ docker compose down
803
+ \`\`\`
804
+
805
+ ## Configuration
806
+
807
+ | Setting | Value |
808
+ |---------|-------|
809
+ | Engine | ${displayName} ${version} |
810
+ | Port | ${port} |
811
+ | Database | ${database} |
812
+ | Username | spindb |
813
+
814
+ ## Connection String
815
+
816
+ \`\`\`
817
+ ${connectionTemplate}
818
+ \`\`\`
819
+
820
+ Replace \`<host>\` with your server's hostname or IP address.
821
+ Replace \`\${SPINDB_USER}\` and \`\${SPINDB_PASSWORD}\` with the values from \`.env\`.
822
+
823
+ ## Security Notes
824
+
825
+ - The \`.env\` file contains auto-generated credentials. **Change these in production.**
826
+ ${tlsSecurityNote}
827
+ - The default \`spindb\` user has full access to the database. Create restricted users for applications.
828
+
829
+ ## Files
830
+
831
+ | File | Description |
832
+ |------|-------------|
833
+ | \`Dockerfile\` | Docker image definition |
834
+ | \`docker-compose.yml\` | Container orchestration |
835
+ | \`.env\` | Environment variables and credentials |
836
+ | \`entrypoint.sh\` | Container startup script |
837
+ ${certsFileEntry}| \`data/\` | Database backup for initialization |
838
+
839
+ ## Customization
840
+
841
+ ### Change Port
842
+
843
+ Edit \`.env\`:
844
+ \`\`\`
845
+ PORT=5433
846
+ \`\`\`
847
+ ${tlsCustomization}
848
+ ---
849
+
850
+ Generated by [SpinDB](https://github.com/robertjbass/spindb)
851
+ `;
852
+ }
853
+ /**
854
+ * Export a SpinDB container to Docker-ready artifacts
855
+ */
856
+ export async function exportToDocker(container, options) {
857
+ const { outputDir, port = container.port, includeData = true, backupPath, backupPaths, skipTLS = false, } = options;
858
+ const engine = container.engine;
859
+ const version = container.version;
860
+ const database = container.database;
861
+ const containerName = container.name;
862
+ // Get all databases for the container
863
+ const databases = container.databases || [database];
864
+ return withTransaction(async (tx) => {
865
+ // Check if output directory already exists
866
+ const outputDirExisted = existsSync(outputDir);
867
+ if (outputDirExisted) {
868
+ // If it exists, check if it's empty or only contains 'data' (from backup step)
869
+ const existingFiles = await readdir(outputDir);
870
+ const nonDataFiles = existingFiles.filter((f) => f !== 'data');
871
+ if (nonDataFiles.length > 0) {
872
+ throw new Error(`Output directory "${outputDir}" already exists and is not empty. ` +
873
+ `Please use an empty directory or remove the existing files.`);
874
+ }
875
+ // Directory exists but is empty or only has data/ - don't register rollback for it
876
+ }
877
+ else {
878
+ // Directory doesn't exist - create it and register rollback
879
+ await mkdir(outputDir, { recursive: true });
880
+ tx.addRollback({
881
+ description: `Delete output directory: ${outputDir}`,
882
+ execute: async () => {
883
+ await rm(outputDir, { recursive: true, force: true });
884
+ },
885
+ });
886
+ }
887
+ // Create subdirectories (always register rollback for these since we create them)
888
+ const certsDir = join(outputDir, 'certs');
889
+ const dataDir = join(outputDir, 'data');
890
+ await mkdir(certsDir, { recursive: true });
891
+ tx.addRollback({
892
+ description: `Delete certs directory: ${certsDir}`,
893
+ execute: async () => {
894
+ await rm(certsDir, { recursive: true, force: true });
895
+ },
896
+ });
897
+ await mkdir(dataDir, { recursive: true });
898
+ tx.addRollback({
899
+ description: `Delete data directory: ${dataDir}`,
900
+ execute: async () => {
901
+ await rm(dataDir, { recursive: true, force: true });
902
+ },
903
+ });
904
+ const files = [];
905
+ // Generate credentials
906
+ const credentials = generateCredentials();
907
+ // Check OpenSSL availability once for TLS decisions
908
+ const hasOpenSSL = await isOpenSSLAvailable();
909
+ // Generate TLS certificates (if openssl is available and not skipped)
910
+ if (!skipTLS && hasOpenSSL) {
911
+ await generateTLSCertificates({
912
+ outputDir: join(outputDir, 'certs'),
913
+ commonName: 'localhost',
914
+ validDays: 365,
915
+ });
916
+ files.push('certs/server.crt', 'certs/server.key');
917
+ }
918
+ // Copy backup files if provided (multiple databases)
919
+ if (includeData && backupPaths && backupPaths.length > 0) {
920
+ for (const bp of backupPaths) {
921
+ if (existsSync(bp.path)) {
922
+ const backupFilename = basename(bp.path);
923
+ await copyFile(bp.path, join(outputDir, 'data', backupFilename));
924
+ files.push(`data/${backupFilename}`);
925
+ }
926
+ }
927
+ }
928
+ else if (includeData && backupPath && existsSync(backupPath)) {
929
+ // Single backup file (legacy support)
930
+ const backupFilename = basename(backupPath);
931
+ await copyFile(backupPath, join(outputDir, 'data', backupFilename));
932
+ files.push(`data/${backupFilename}`);
933
+ }
934
+ // Determine TLS status for Dockerfile and entrypoint
935
+ const useTLS = !skipTLS && hasOpenSSL;
936
+ // Generate Dockerfile
937
+ const dockerfile = generateDockerfile(engine, isFileBasedEngine(engine), useTLS);
938
+ await writeFile(join(outputDir, 'Dockerfile'), dockerfile);
939
+ files.push('Dockerfile');
940
+ // Generate entrypoint.sh
941
+ const entrypoint = generateEntrypoint(engine, containerName, database, databases, version, port, useTLS);
942
+ await writeFile(join(outputDir, 'entrypoint.sh'), entrypoint, {
943
+ mode: 0o755,
944
+ });
945
+ files.push('entrypoint.sh');
946
+ // Generate docker-compose.yml
947
+ const dockerCompose = generateDockerCompose(containerName, engine, version, port, database, isFileBasedEngine(engine));
948
+ await writeFile(join(outputDir, 'docker-compose.yml'), dockerCompose);
949
+ files.push('docker-compose.yml');
950
+ // Generate .env file
951
+ const envFile = generateEnvFile(containerName, engine, version, port, database, credentials);
952
+ await writeFile(join(outputDir, '.env'), envFile);
953
+ files.push('.env');
954
+ // Generate README.md
955
+ const readme = generateReadme(containerName, engine, version, port, database, useTLS);
956
+ await writeFile(join(outputDir, 'README.md'), readme);
957
+ files.push('README.md');
958
+ return {
959
+ outputDir,
960
+ credentials,
961
+ port,
962
+ engine,
963
+ version,
964
+ database,
965
+ files,
966
+ };
967
+ });
968
+ }
969
+ /**
970
+ * Get the backup file path that would be used for a container export
971
+ */
972
+ export function getExportBackupPath(outputDir, containerName, database, engine) {
973
+ const format = getDefaultFormat(engine);
974
+ const extension = getBackupExtension(engine, format);
975
+ return join(outputDir, 'data', `${containerName}-${database}${extension}`);
976
+ }
977
+ /**
978
+ * Get the default Docker export directory for a container
979
+ */
980
+ export function getDefaultDockerExportPath(containerName, engine) {
981
+ return join(homedir(), '.spindb', 'containers', engine, containerName, 'docker');
982
+ }
983
+ /**
984
+ * Check if a Docker export already exists for a container
985
+ */
986
+ export function dockerExportExists(containerName, engine) {
987
+ const exportPath = getDefaultDockerExportPath(containerName, engine);
988
+ const envPath = join(exportPath, '.env');
989
+ return existsSync(envPath);
990
+ }
991
+ /**
992
+ * Read Docker credentials from an existing export's .env file
993
+ */
994
+ export async function getDockerCredentials(containerName, engine) {
995
+ const exportPath = getDefaultDockerExportPath(containerName, engine);
996
+ const envPath = join(exportPath, '.env');
997
+ if (!existsSync(envPath)) {
998
+ return null;
999
+ }
1000
+ try {
1001
+ const envContent = await readFile(envPath, 'utf-8');
1002
+ const lines = envContent.split('\n');
1003
+ const values = {};
1004
+ for (const line of lines) {
1005
+ const match = line.match(/^([A-Z_]+)=(.*)$/);
1006
+ if (match) {
1007
+ values[match[1]] = match[2];
1008
+ }
1009
+ }
1010
+ return {
1011
+ username: values.SPINDB_USER || 'spindb',
1012
+ password: values.SPINDB_PASSWORD || '',
1013
+ port: parseInt(values.PORT || '0', 10),
1014
+ database: values.DATABASE || '',
1015
+ engine: values.ENGINE || engine,
1016
+ version: values.VERSION || '',
1017
+ containerName: values.CONTAINER_NAME || containerName,
1018
+ };
1019
+ }
1020
+ catch {
1021
+ return null;
1022
+ }
1023
+ }
1024
+ /**
1025
+ * Get the Docker connection string for an existing export
1026
+ * Returns the connection string with actual credentials substituted
1027
+ */
1028
+ export async function getDockerConnectionString(containerName, engine, options = {}) {
1029
+ const credentials = await getDockerCredentials(containerName, engine);
1030
+ if (!credentials) {
1031
+ return null;
1032
+ }
1033
+ const host = options.host || 'localhost';
1034
+ const { username, password, port, database } = credentials;
1035
+ // URL-encode credentials to escape reserved URI characters
1036
+ const encodedUsername = encodeURIComponent(username);
1037
+ const encodedPassword = encodeURIComponent(password);
1038
+ const encodedDatabase = encodeURIComponent(database);
1039
+ // Build connection string based on engine type
1040
+ switch (engine) {
1041
+ case Engine.PostgreSQL:
1042
+ case Engine.CockroachDB:
1043
+ case Engine.QuestDB:
1044
+ return `postgresql://${encodedUsername}:${encodedPassword}@${host}:${port}/${encodedDatabase}`;
1045
+ case Engine.MySQL:
1046
+ case Engine.MariaDB:
1047
+ return `mysql://${encodedUsername}:${encodedPassword}@${host}:${port}/${encodedDatabase}`;
1048
+ case Engine.MongoDB:
1049
+ case Engine.FerretDB:
1050
+ return `mongodb://${encodedUsername}:${encodedPassword}@${host}:${port}/${encodedDatabase}`;
1051
+ case Engine.Redis:
1052
+ case Engine.Valkey:
1053
+ return `redis://:${encodedPassword}@${host}:${port}`;
1054
+ case Engine.ClickHouse:
1055
+ return `clickhouse://${encodedUsername}:${encodedPassword}@${host}:${port}/${encodedDatabase}`;
1056
+ case Engine.Qdrant:
1057
+ return `http://${host}:${port}`;
1058
+ case Engine.Meilisearch:
1059
+ case Engine.InfluxDB:
1060
+ case Engine.Weaviate:
1061
+ return `http://${host}:${port}`;
1062
+ case Engine.CouchDB:
1063
+ return `http://${username}:${password}@${host}:${port}/${database}`;
1064
+ case Engine.SurrealDB:
1065
+ return `ws://${username}:${password}@${host}:${port}`;
1066
+ case Engine.TypeDB:
1067
+ return `typedb://${host}:${port}`;
1068
+ case Engine.TigerBeetle:
1069
+ return `${host}:${port}`;
1070
+ case Engine.SQLite:
1071
+ case Engine.DuckDB:
1072
+ return `File-based database (no network connection)`;
1073
+ default:
1074
+ assertExhaustive(engine, `Unhandled engine in getDockerConnectionString: ${engine}`);
1075
+ }
1076
+ }
1077
+ //# sourceMappingURL=docker-exporter.js.map