spindb 0.37.2 → 0.38.0

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