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.
- package/dist/cli/bin.js +9 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/attach.js +102 -0
- package/dist/cli/commands/attach.js.map +1 -0
- package/dist/cli/commands/backup.js +197 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/backups.js +190 -0
- package/dist/cli/commands/backups.js.map +1 -0
- package/dist/cli/commands/clone.js +119 -0
- package/dist/cli/commands/clone.js.map +1 -0
- package/dist/cli/commands/config.js +276 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/connect.js +559 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/create.js +952 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/databases.js +485 -0
- package/dist/cli/commands/databases.js.map +1 -0
- package/dist/cli/commands/delete.js +106 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/deps.js +238 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/detach.js +81 -0
- package/dist/cli/commands/detach.js.map +1 -0
- package/dist/cli/commands/doctor.js +567 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/duckdb.js +207 -0
- package/dist/cli/commands/duckdb.js.map +1 -0
- package/dist/cli/commands/edit.js +524 -0
- package/dist/cli/commands/edit.js.map +1 -0
- package/dist/cli/commands/engines.js +1414 -0
- package/dist/cli/commands/engines.js.map +1 -0
- package/dist/cli/commands/export.js +383 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/info.js +270 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/list.js +215 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/logs.js +81 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/menu/backup-handlers.js +1202 -0
- package/dist/cli/commands/menu/backup-handlers.js.map +1 -0
- package/dist/cli/commands/menu/container-handlers.js +1788 -0
- package/dist/cli/commands/menu/container-handlers.js.map +1 -0
- package/dist/cli/commands/menu/engine-handlers.js +235 -0
- package/dist/cli/commands/menu/engine-handlers.js.map +1 -0
- package/dist/cli/commands/menu/index.js +266 -0
- package/dist/cli/commands/menu/index.js.map +1 -0
- package/dist/cli/commands/menu/settings-handlers.js +320 -0
- package/dist/cli/commands/menu/settings-handlers.js.map +1 -0
- package/dist/cli/commands/menu/shared.js +13 -0
- package/dist/cli/commands/menu/shared.js.map +1 -0
- package/dist/cli/commands/menu/shell-handlers.js +1573 -0
- package/dist/cli/commands/menu/shell-handlers.js.map +1 -0
- package/dist/cli/commands/menu/sql-handlers.js +185 -0
- package/dist/cli/commands/menu/sql-handlers.js.map +1 -0
- package/dist/cli/commands/menu/update-handlers.js +322 -0
- package/dist/cli/commands/menu/update-handlers.js.map +1 -0
- package/dist/cli/commands/menu/validators.js +9 -0
- package/dist/cli/commands/menu/validators.js.map +1 -0
- package/dist/cli/commands/ports.js +166 -0
- package/dist/cli/commands/ports.js.map +1 -0
- package/dist/cli/commands/pull.js +166 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/query.js +180 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/restore.js +428 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/run.js +115 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/self-update.js +99 -0
- package/dist/cli/commands/self-update.js.map +1 -0
- package/dist/cli/commands/sqlite.js +207 -0
- package/dist/cli/commands/sqlite.js.map +1 -0
- package/dist/cli/commands/start.js +196 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stop.js +182 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/url.js +88 -0
- package/dist/cli/commands/url.js.map +1 -0
- package/dist/cli/commands/users.js +189 -0
- package/dist/cli/commands/users.js.map +1 -0
- package/dist/cli/commands/version.js +52 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/commands/which.js +258 -0
- package/dist/cli/commands/which.js.map +1 -0
- package/dist/cli/constants.js +212 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/helpers.js +1120 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.js +146 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/prompts.js +1002 -0
- package/dist/cli/ui/prompts.js.map +1 -0
- package/dist/cli/ui/spinner.js +74 -0
- package/dist/cli/ui/spinner.js.map +1 -0
- package/dist/cli/ui/theme.js +99 -0
- package/dist/cli/ui/theme.js.map +1 -0
- package/dist/cli/utils/file-follower.js +79 -0
- package/dist/cli/utils/file-follower.js.map +1 -0
- package/dist/config/backup-formats.js +363 -0
- package/dist/config/backup-formats.js.map +1 -0
- package/dist/config/defaults.js +25 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/engine-defaults.js +303 -0
- package/dist/config/engine-defaults.js.map +1 -0
- package/dist/config/engines-registry.js +103 -0
- package/dist/config/engines-registry.js.map +1 -0
- package/dist/config/os-dependencies.js +767 -0
- package/dist/config/os-dependencies.js.map +1 -0
- package/dist/config/paths.js +156 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/version.js +3 -0
- package/dist/config/version.js.map +1 -0
- package/dist/core/backup-restore.js +219 -0
- package/dist/core/backup-restore.js.map +1 -0
- package/dist/core/base-binary-manager.js +403 -0
- package/dist/core/base-binary-manager.js.map +1 -0
- package/dist/core/base-document-binary-manager.js +364 -0
- package/dist/core/base-document-binary-manager.js.map +1 -0
- package/dist/core/base-embedded-binary-manager.js +364 -0
- package/dist/core/base-embedded-binary-manager.js.map +1 -0
- package/dist/core/base-server-binary-manager.js +368 -0
- package/dist/core/base-server-binary-manager.js.map +1 -0
- package/dist/core/config-manager.js +495 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/container-manager.js +609 -0
- package/dist/core/container-manager.js.map +1 -0
- package/dist/core/credential-generator.js +67 -0
- package/dist/core/credential-generator.js.map +1 -0
- package/dist/core/credential-manager.js +211 -0
- package/dist/core/credential-manager.js.map +1 -0
- package/dist/core/dblab-utils.js +105 -0
- package/dist/core/dblab-utils.js.map +1 -0
- package/dist/core/dependency-manager.js +359 -0
- package/dist/core/dependency-manager.js.map +1 -0
- package/dist/core/docker-exporter.js +1077 -0
- package/dist/core/docker-exporter.js.map +1 -0
- package/dist/core/error-handler.js +295 -0
- package/dist/core/error-handler.js.map +1 -0
- package/dist/core/fs-error-utils.js +74 -0
- package/dist/core/fs-error-utils.js.map +1 -0
- package/dist/core/homebrew-version-manager.js +280 -0
- package/dist/core/homebrew-version-manager.js.map +1 -0
- package/dist/core/hostdb-client.js +252 -0
- package/dist/core/hostdb-client.js.map +1 -0
- package/dist/core/hostdb-metadata.js +243 -0
- package/dist/core/hostdb-metadata.js.map +1 -0
- package/dist/core/hostdb-releases-factory.js +161 -0
- package/dist/core/hostdb-releases-factory.js.map +1 -0
- package/dist/core/library-env.js +88 -0
- package/dist/core/library-env.js.map +1 -0
- package/dist/core/pgweb-utils.js +53 -0
- package/dist/core/pgweb-utils.js.map +1 -0
- package/dist/core/platform-service.js +632 -0
- package/dist/core/platform-service.js.map +1 -0
- package/dist/core/port-manager.js +136 -0
- package/dist/core/port-manager.js.map +1 -0
- package/dist/core/process-manager.js +445 -0
- package/dist/core/process-manager.js.map +1 -0
- package/dist/core/pull-manager.js +418 -0
- package/dist/core/pull-manager.js.map +1 -0
- package/dist/core/query-parser.js +449 -0
- package/dist/core/query-parser.js.map +1 -0
- package/dist/core/spawn-utils.js +90 -0
- package/dist/core/spawn-utils.js.map +1 -0
- package/dist/core/start-with-retry.js +90 -0
- package/dist/core/start-with-retry.js.map +1 -0
- package/dist/core/test-cleanup.js +85 -0
- package/dist/core/test-cleanup.js.map +1 -0
- package/dist/core/tls-generator.js +84 -0
- package/dist/core/tls-generator.js.map +1 -0
- package/dist/core/transaction-manager.js +139 -0
- package/dist/core/transaction-manager.js.map +1 -0
- package/dist/core/update-manager.js +241 -0
- package/dist/core/update-manager.js.map +1 -0
- package/dist/core/version-migration.js +260 -0
- package/dist/core/version-migration.js.map +1 -0
- package/dist/core/version-utils.js +91 -0
- package/dist/core/version-utils.js.map +1 -0
- package/dist/engines/base-engine.js +179 -0
- package/dist/engines/base-engine.js.map +1 -0
- package/dist/engines/clickhouse/backup.js +289 -0
- package/dist/engines/clickhouse/backup.js.map +1 -0
- package/dist/engines/clickhouse/binary-manager.js +145 -0
- package/dist/engines/clickhouse/binary-manager.js.map +1 -0
- package/dist/engines/clickhouse/binary-urls.js +100 -0
- package/dist/engines/clickhouse/binary-urls.js.map +1 -0
- package/dist/engines/clickhouse/cli-utils.js +143 -0
- package/dist/engines/clickhouse/cli-utils.js.map +1 -0
- package/dist/engines/clickhouse/hostdb-releases.js +24 -0
- package/dist/engines/clickhouse/hostdb-releases.js.map +1 -0
- package/dist/engines/clickhouse/index.js +1077 -0
- package/dist/engines/clickhouse/index.js.map +1 -0
- package/dist/engines/clickhouse/restore.js +335 -0
- package/dist/engines/clickhouse/restore.js.map +1 -0
- package/dist/engines/clickhouse/version-maps.js +83 -0
- package/dist/engines/clickhouse/version-maps.js.map +1 -0
- package/dist/engines/clickhouse/version-validator.js +133 -0
- package/dist/engines/clickhouse/version-validator.js.map +1 -0
- package/dist/engines/cockroachdb/backup.js +261 -0
- package/dist/engines/cockroachdb/backup.js.map +1 -0
- package/dist/engines/cockroachdb/binary-manager.js +33 -0
- package/dist/engines/cockroachdb/binary-manager.js.map +1 -0
- package/dist/engines/cockroachdb/binary-urls.js +33 -0
- package/dist/engines/cockroachdb/binary-urls.js.map +1 -0
- package/dist/engines/cockroachdb/cli-utils.js +338 -0
- package/dist/engines/cockroachdb/cli-utils.js.map +1 -0
- package/dist/engines/cockroachdb/hostdb-releases.js +21 -0
- package/dist/engines/cockroachdb/hostdb-releases.js.map +1 -0
- package/dist/engines/cockroachdb/index.js +1016 -0
- package/dist/engines/cockroachdb/index.js.map +1 -0
- package/dist/engines/cockroachdb/restore.js +323 -0
- package/dist/engines/cockroachdb/restore.js.map +1 -0
- package/dist/engines/cockroachdb/version-maps.js +37 -0
- package/dist/engines/cockroachdb/version-maps.js.map +1 -0
- package/dist/engines/couchdb/api-client.js +64 -0
- package/dist/engines/couchdb/api-client.js.map +1 -0
- package/dist/engines/couchdb/backup.js +90 -0
- package/dist/engines/couchdb/backup.js.map +1 -0
- package/dist/engines/couchdb/binary-manager.js +62 -0
- package/dist/engines/couchdb/binary-manager.js.map +1 -0
- package/dist/engines/couchdb/binary-urls.js +92 -0
- package/dist/engines/couchdb/binary-urls.js.map +1 -0
- package/dist/engines/couchdb/hostdb-releases.js +21 -0
- package/dist/engines/couchdb/hostdb-releases.js.map +1 -0
- package/dist/engines/couchdb/index.js +1043 -0
- package/dist/engines/couchdb/index.js.map +1 -0
- package/dist/engines/couchdb/restore.js +198 -0
- package/dist/engines/couchdb/restore.js.map +1 -0
- package/dist/engines/couchdb/version-maps.js +67 -0
- package/dist/engines/couchdb/version-maps.js.map +1 -0
- package/dist/engines/couchdb/version-validator.js +88 -0
- package/dist/engines/couchdb/version-validator.js.map +1 -0
- package/dist/engines/duckdb/binary-manager.js +33 -0
- package/dist/engines/duckdb/binary-manager.js.map +1 -0
- package/{engines/duckdb/binary-urls.ts → dist/engines/duckdb/binary-urls.js} +11 -16
- package/dist/engines/duckdb/binary-urls.js.map +1 -0
- package/dist/engines/duckdb/hostdb-releases.js +21 -0
- package/dist/engines/duckdb/hostdb-releases.js.map +1 -0
- package/dist/engines/duckdb/index.js +594 -0
- package/dist/engines/duckdb/index.js.map +1 -0
- package/dist/engines/duckdb/registry.js +265 -0
- package/dist/engines/duckdb/registry.js.map +1 -0
- package/dist/engines/duckdb/scanner.js +12 -0
- package/dist/engines/duckdb/scanner.js.map +1 -0
- package/dist/engines/duckdb/version-maps.js +67 -0
- package/dist/engines/duckdb/version-maps.js.map +1 -0
- package/dist/engines/duckdb/version-validator.js +62 -0
- package/dist/engines/duckdb/version-validator.js.map +1 -0
- package/dist/engines/ferretdb/backup.js +170 -0
- package/dist/engines/ferretdb/backup.js.map +1 -0
- package/dist/engines/ferretdb/binary-manager.js +765 -0
- package/dist/engines/ferretdb/binary-manager.js.map +1 -0
- package/dist/engines/ferretdb/binary-urls.js +135 -0
- package/dist/engines/ferretdb/binary-urls.js.map +1 -0
- package/dist/engines/ferretdb/index.js +1517 -0
- package/dist/engines/ferretdb/index.js.map +1 -0
- package/dist/engines/ferretdb/restore.js +310 -0
- package/dist/engines/ferretdb/restore.js.map +1 -0
- package/{engines/ferretdb/version-maps.ts → dist/engines/ferretdb/version-maps.js} +62 -79
- package/dist/engines/ferretdb/version-maps.js.map +1 -0
- package/dist/engines/file-based-utils.js +184 -0
- package/dist/engines/file-based-utils.js.map +1 -0
- package/dist/engines/index.js +124 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/influxdb/api-client.js +54 -0
- package/dist/engines/influxdb/api-client.js.map +1 -0
- package/dist/engines/influxdb/backup.js +119 -0
- package/dist/engines/influxdb/backup.js.map +1 -0
- package/dist/engines/influxdb/binary-manager.js +87 -0
- package/dist/engines/influxdb/binary-manager.js.map +1 -0
- package/dist/engines/influxdb/binary-urls.js +56 -0
- package/dist/engines/influxdb/binary-urls.js.map +1 -0
- package/dist/engines/influxdb/hostdb-releases.js +21 -0
- package/dist/engines/influxdb/hostdb-releases.js.map +1 -0
- package/dist/engines/influxdb/index.js +962 -0
- package/dist/engines/influxdb/index.js.map +1 -0
- package/dist/engines/influxdb/restore.js +329 -0
- package/dist/engines/influxdb/restore.js.map +1 -0
- package/dist/engines/influxdb/version-maps.js +64 -0
- package/dist/engines/influxdb/version-maps.js.map +1 -0
- package/dist/engines/influxdb/version-validator.js +109 -0
- package/dist/engines/influxdb/version-validator.js.map +1 -0
- package/dist/engines/mariadb/backup.js +178 -0
- package/dist/engines/mariadb/backup.js.map +1 -0
- package/dist/engines/mariadb/binary-manager.js +33 -0
- package/dist/engines/mariadb/binary-manager.js.map +1 -0
- package/{engines/mariadb/binary-urls.ts → dist/engines/mariadb/binary-urls.js} +38 -55
- package/dist/engines/mariadb/binary-urls.js.map +1 -0
- package/dist/engines/mariadb/hostdb-releases.js +21 -0
- package/dist/engines/mariadb/hostdb-releases.js.map +1 -0
- package/dist/engines/mariadb/index.js +1011 -0
- package/dist/engines/mariadb/index.js.map +1 -0
- package/dist/engines/mariadb/restore.js +322 -0
- package/dist/engines/mariadb/restore.js.map +1 -0
- package/dist/engines/mariadb/version-maps.js +63 -0
- package/dist/engines/mariadb/version-maps.js.map +1 -0
- package/dist/engines/mariadb/version-validator.js +143 -0
- package/dist/engines/mariadb/version-validator.js.map +1 -0
- package/dist/engines/meilisearch/api-client.js +50 -0
- package/dist/engines/meilisearch/api-client.js.map +1 -0
- package/dist/engines/meilisearch/backup.js +167 -0
- package/dist/engines/meilisearch/backup.js.map +1 -0
- package/dist/engines/meilisearch/binary-manager.js +31 -0
- package/dist/engines/meilisearch/binary-manager.js.map +1 -0
- package/dist/engines/meilisearch/binary-urls.js +56 -0
- package/dist/engines/meilisearch/binary-urls.js.map +1 -0
- package/dist/engines/meilisearch/hostdb-releases.js +21 -0
- package/dist/engines/meilisearch/hostdb-releases.js.map +1 -0
- package/dist/engines/meilisearch/index.js +992 -0
- package/dist/engines/meilisearch/index.js.map +1 -0
- package/dist/engines/meilisearch/restore.js +167 -0
- package/dist/engines/meilisearch/restore.js.map +1 -0
- package/dist/engines/meilisearch/version-maps.js +67 -0
- package/dist/engines/meilisearch/version-maps.js.map +1 -0
- package/dist/engines/meilisearch/version-validator.js +109 -0
- package/dist/engines/meilisearch/version-validator.js.map +1 -0
- package/dist/engines/mongodb/backup.js +109 -0
- package/dist/engines/mongodb/backup.js.map +1 -0
- package/dist/engines/mongodb/binary-manager.js +36 -0
- package/dist/engines/mongodb/binary-manager.js.map +1 -0
- package/dist/engines/mongodb/binary-urls.js +46 -0
- package/dist/engines/mongodb/binary-urls.js.map +1 -0
- package/dist/engines/mongodb/cli-utils.js +131 -0
- package/dist/engines/mongodb/cli-utils.js.map +1 -0
- package/dist/engines/mongodb/hostdb-releases.js +77 -0
- package/dist/engines/mongodb/hostdb-releases.js.map +1 -0
- package/dist/engines/mongodb/index.js +873 -0
- package/dist/engines/mongodb/index.js.map +1 -0
- package/dist/engines/mongodb/restore.js +276 -0
- package/dist/engines/mongodb/restore.js.map +1 -0
- package/dist/engines/mongodb/version-maps.js +79 -0
- package/dist/engines/mongodb/version-maps.js.map +1 -0
- package/dist/engines/mongodb/version-validator.js +133 -0
- package/dist/engines/mongodb/version-validator.js.map +1 -0
- package/dist/engines/mysql/backup.js +210 -0
- package/dist/engines/mysql/backup.js.map +1 -0
- package/dist/engines/mysql/binary-detection.js +325 -0
- package/dist/engines/mysql/binary-detection.js.map +1 -0
- package/dist/engines/mysql/binary-manager.js +30 -0
- package/dist/engines/mysql/binary-manager.js.map +1 -0
- package/dist/engines/mysql/binary-urls.js +87 -0
- package/dist/engines/mysql/binary-urls.js.map +1 -0
- package/{engines/mysql/hostdb-releases.ts → dist/engines/mysql/hostdb-releases.js} +20 -23
- package/dist/engines/mysql/hostdb-releases.js.map +1 -0
- package/dist/engines/mysql/index.js +1066 -0
- package/dist/engines/mysql/index.js.map +1 -0
- package/dist/engines/mysql/restore.js +361 -0
- package/dist/engines/mysql/restore.js.map +1 -0
- package/dist/engines/mysql/version-maps.js +79 -0
- package/dist/engines/mysql/version-maps.js.map +1 -0
- package/dist/engines/mysql/version-validator.js +266 -0
- package/dist/engines/mysql/version-validator.js.map +1 -0
- package/dist/engines/postgresql/backup.js +118 -0
- package/dist/engines/postgresql/backup.js.map +1 -0
- package/dist/engines/postgresql/binary-manager.js +85 -0
- package/dist/engines/postgresql/binary-manager.js.map +1 -0
- package/dist/engines/postgresql/binary-urls.js +80 -0
- package/dist/engines/postgresql/binary-urls.js.map +1 -0
- package/dist/engines/postgresql/hostdb-releases.js +21 -0
- package/dist/engines/postgresql/hostdb-releases.js.map +1 -0
- package/dist/engines/postgresql/index.js +852 -0
- package/dist/engines/postgresql/index.js.map +1 -0
- package/dist/engines/postgresql/remote-version.js +109 -0
- package/dist/engines/postgresql/remote-version.js.map +1 -0
- package/dist/engines/postgresql/restore.js +254 -0
- package/dist/engines/postgresql/restore.js.map +1 -0
- package/dist/engines/postgresql/version-maps.js +73 -0
- package/dist/engines/postgresql/version-maps.js.map +1 -0
- package/dist/engines/postgresql/version-validator.js +286 -0
- package/dist/engines/postgresql/version-validator.js.map +1 -0
- package/dist/engines/qdrant/api-client.js +50 -0
- package/dist/engines/qdrant/api-client.js.map +1 -0
- package/dist/engines/qdrant/backup.js +115 -0
- package/dist/engines/qdrant/backup.js.map +1 -0
- package/dist/engines/qdrant/binary-manager.js +31 -0
- package/dist/engines/qdrant/binary-manager.js.map +1 -0
- package/dist/engines/qdrant/binary-urls.js +92 -0
- package/dist/engines/qdrant/binary-urls.js.map +1 -0
- package/dist/engines/qdrant/cli-utils.js +39 -0
- package/dist/engines/qdrant/cli-utils.js.map +1 -0
- package/dist/engines/qdrant/hostdb-releases.js +21 -0
- package/dist/engines/qdrant/hostdb-releases.js.map +1 -0
- package/dist/engines/qdrant/index.js +1002 -0
- package/dist/engines/qdrant/index.js.map +1 -0
- package/dist/engines/qdrant/restore.js +154 -0
- package/dist/engines/qdrant/restore.js.map +1 -0
- package/dist/engines/qdrant/version-maps.js +67 -0
- package/dist/engines/qdrant/version-maps.js.map +1 -0
- package/dist/engines/qdrant/version-validator.js +109 -0
- package/dist/engines/qdrant/version-validator.js.map +1 -0
- package/dist/engines/questdb/backup.js +191 -0
- package/dist/engines/questdb/backup.js.map +1 -0
- package/dist/engines/questdb/binary-manager.js +247 -0
- package/dist/engines/questdb/binary-manager.js.map +1 -0
- package/dist/engines/questdb/binary-urls.js +27 -0
- package/dist/engines/questdb/binary-urls.js.map +1 -0
- package/dist/engines/questdb/hostdb-releases.js +21 -0
- package/dist/engines/questdb/hostdb-releases.js.map +1 -0
- package/dist/engines/questdb/index.js +814 -0
- package/dist/engines/questdb/index.js.map +1 -0
- package/dist/engines/questdb/restore.js +202 -0
- package/dist/engines/questdb/restore.js.map +1 -0
- package/dist/engines/questdb/version-maps.js +33 -0
- package/dist/engines/questdb/version-maps.js.map +1 -0
- package/dist/engines/questdb/version-validator.js +99 -0
- package/dist/engines/questdb/version-validator.js.map +1 -0
- package/dist/engines/redis/backup.js +292 -0
- package/dist/engines/redis/backup.js.map +1 -0
- package/dist/engines/redis/binary-manager.js +32 -0
- package/dist/engines/redis/binary-manager.js.map +1 -0
- package/dist/engines/redis/binary-urls.js +96 -0
- package/dist/engines/redis/binary-urls.js.map +1 -0
- package/dist/engines/redis/cli-utils.js +38 -0
- package/dist/engines/redis/cli-utils.js.map +1 -0
- package/dist/engines/redis/hostdb-releases.js +21 -0
- package/dist/engines/redis/hostdb-releases.js.map +1 -0
- package/dist/engines/redis/index.js +1263 -0
- package/dist/engines/redis/index.js.map +1 -0
- package/dist/engines/redis/restore.js +338 -0
- package/dist/engines/redis/restore.js.map +1 -0
- package/dist/engines/redis/version-maps.js +70 -0
- package/dist/engines/redis/version-maps.js.map +1 -0
- package/dist/engines/redis/version-validator.js +109 -0
- package/dist/engines/redis/version-validator.js.map +1 -0
- package/dist/engines/sqlite/binary-manager.js +39 -0
- package/dist/engines/sqlite/binary-manager.js.map +1 -0
- package/{engines/sqlite/binary-urls.ts → dist/engines/sqlite/binary-urls.js} +11 -16
- package/dist/engines/sqlite/binary-urls.js.map +1 -0
- package/dist/engines/sqlite/hostdb-releases.js +21 -0
- package/dist/engines/sqlite/hostdb-releases.js.map +1 -0
- package/dist/engines/sqlite/index.js +493 -0
- package/dist/engines/sqlite/index.js.map +1 -0
- package/dist/engines/sqlite/registry.js +163 -0
- package/dist/engines/sqlite/registry.js.map +1 -0
- package/dist/engines/sqlite/scanner.js +12 -0
- package/dist/engines/sqlite/scanner.js.map +1 -0
- package/dist/engines/sqlite/version-maps.js +57 -0
- package/dist/engines/sqlite/version-maps.js.map +1 -0
- package/dist/engines/surrealdb/backup.js +97 -0
- package/dist/engines/surrealdb/backup.js.map +1 -0
- package/dist/engines/surrealdb/binary-manager.js +33 -0
- package/dist/engines/surrealdb/binary-manager.js.map +1 -0
- package/dist/engines/surrealdb/binary-urls.js +33 -0
- package/dist/engines/surrealdb/binary-urls.js.map +1 -0
- package/dist/engines/surrealdb/cli-utils.js +147 -0
- package/dist/engines/surrealdb/cli-utils.js.map +1 -0
- package/dist/engines/surrealdb/hostdb-releases.js +21 -0
- package/dist/engines/surrealdb/hostdb-releases.js.map +1 -0
- package/dist/engines/surrealdb/index.js +1022 -0
- package/dist/engines/surrealdb/index.js.map +1 -0
- package/dist/engines/surrealdb/restore.js +224 -0
- package/dist/engines/surrealdb/restore.js.map +1 -0
- package/dist/engines/surrealdb/version-maps.js +36 -0
- package/dist/engines/surrealdb/version-maps.js.map +1 -0
- package/dist/engines/tigerbeetle/backup.js +36 -0
- package/dist/engines/tigerbeetle/backup.js.map +1 -0
- package/dist/engines/tigerbeetle/binary-manager.js +72 -0
- package/dist/engines/tigerbeetle/binary-manager.js.map +1 -0
- package/dist/engines/tigerbeetle/binary-urls.js +49 -0
- package/dist/engines/tigerbeetle/binary-urls.js.map +1 -0
- package/dist/engines/tigerbeetle/hostdb-releases.js +21 -0
- package/dist/engines/tigerbeetle/hostdb-releases.js.map +1 -0
- package/dist/engines/tigerbeetle/index.js +559 -0
- package/dist/engines/tigerbeetle/index.js.map +1 -0
- package/dist/engines/tigerbeetle/restore.js +91 -0
- package/dist/engines/tigerbeetle/restore.js.map +1 -0
- package/{engines/tigerbeetle/version-maps.ts → dist/engines/tigerbeetle/version-maps.js} +22 -31
- package/dist/engines/tigerbeetle/version-maps.js.map +1 -0
- package/dist/engines/tigerbeetle/version-validator.js +108 -0
- package/dist/engines/tigerbeetle/version-validator.js.map +1 -0
- package/dist/engines/typedb/backup.js +129 -0
- package/dist/engines/typedb/backup.js.map +1 -0
- package/dist/engines/typedb/binary-manager.js +151 -0
- package/dist/engines/typedb/binary-manager.js.map +1 -0
- package/dist/engines/typedb/binary-urls.js +33 -0
- package/dist/engines/typedb/binary-urls.js.map +1 -0
- package/dist/engines/typedb/cli-utils.js +163 -0
- package/dist/engines/typedb/cli-utils.js.map +1 -0
- package/dist/engines/typedb/hostdb-releases.js +21 -0
- package/dist/engines/typedb/hostdb-releases.js.map +1 -0
- package/dist/engines/typedb/index.js +1003 -0
- package/dist/engines/typedb/index.js.map +1 -0
- package/dist/engines/typedb/restore.js +279 -0
- package/dist/engines/typedb/restore.js.map +1 -0
- package/dist/engines/typedb/version-maps.js +40 -0
- package/dist/engines/typedb/version-maps.js.map +1 -0
- package/dist/engines/typedb/version-validator.js +103 -0
- package/dist/engines/typedb/version-validator.js.map +1 -0
- package/dist/engines/valkey/backup.js +292 -0
- package/dist/engines/valkey/backup.js.map +1 -0
- package/dist/engines/valkey/binary-manager.js +33 -0
- package/dist/engines/valkey/binary-manager.js.map +1 -0
- package/dist/engines/valkey/binary-urls.js +98 -0
- package/dist/engines/valkey/binary-urls.js.map +1 -0
- package/dist/engines/valkey/cli-utils.js +38 -0
- package/dist/engines/valkey/cli-utils.js.map +1 -0
- package/dist/engines/valkey/hostdb-releases.js +21 -0
- package/dist/engines/valkey/hostdb-releases.js.map +1 -0
- package/dist/engines/valkey/index.js +1257 -0
- package/dist/engines/valkey/index.js.map +1 -0
- package/dist/engines/valkey/restore.js +340 -0
- package/dist/engines/valkey/restore.js.map +1 -0
- package/dist/engines/valkey/version-maps.js +70 -0
- package/dist/engines/valkey/version-maps.js.map +1 -0
- package/dist/engines/valkey/version-validator.js +112 -0
- package/dist/engines/valkey/version-validator.js.map +1 -0
- package/dist/engines/weaviate/api-client.js +50 -0
- package/dist/engines/weaviate/api-client.js.map +1 -0
- package/dist/engines/weaviate/backup.js +95 -0
- package/dist/engines/weaviate/backup.js.map +1 -0
- package/dist/engines/weaviate/binary-manager.js +58 -0
- package/dist/engines/weaviate/binary-manager.js.map +1 -0
- package/dist/engines/weaviate/binary-urls.js +92 -0
- package/dist/engines/weaviate/binary-urls.js.map +1 -0
- package/dist/engines/weaviate/cli-utils.js +39 -0
- package/dist/engines/weaviate/cli-utils.js.map +1 -0
- package/dist/engines/weaviate/hostdb-releases.js +21 -0
- package/dist/engines/weaviate/hostdb-releases.js.map +1 -0
- package/dist/engines/weaviate/index.js +871 -0
- package/dist/engines/weaviate/index.js.map +1 -0
- package/dist/engines/weaviate/restore.js +185 -0
- package/dist/engines/weaviate/restore.js.map +1 -0
- package/dist/engines/weaviate/version-maps.js +67 -0
- package/dist/engines/weaviate/version-maps.js.map +1 -0
- package/dist/engines/weaviate/version-validator.js +109 -0
- package/dist/engines/weaviate/version-validator.js.map +1 -0
- package/dist/types/index.js +102 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +12 -9
- package/bin/cli.js +0 -68
- package/cli/bin.ts +0 -10
- package/cli/commands/attach.ts +0 -139
- package/cli/commands/backup.ts +0 -290
- package/cli/commands/backups.ts +0 -247
- package/cli/commands/clone.ts +0 -159
- package/cli/commands/config.ts +0 -367
- package/cli/commands/connect.ts +0 -684
- package/cli/commands/create.ts +0 -1201
- package/cli/commands/databases.ts +0 -630
- package/cli/commands/delete.ts +0 -133
- package/cli/commands/deps.ts +0 -342
- package/cli/commands/detach.ts +0 -107
- package/cli/commands/doctor.ts +0 -689
- package/cli/commands/duckdb.ts +0 -273
- package/cli/commands/edit.ts +0 -683
- package/cli/commands/engines.ts +0 -1914
- package/cli/commands/export.ts +0 -544
- package/cli/commands/info.ts +0 -340
- package/cli/commands/list.ts +0 -284
- package/cli/commands/logs.ts +0 -102
- package/cli/commands/menu/backup-handlers.ts +0 -1571
- package/cli/commands/menu/container-handlers.ts +0 -2288
- package/cli/commands/menu/engine-handlers.ts +0 -355
- package/cli/commands/menu/index.ts +0 -342
- package/cli/commands/menu/settings-handlers.ts +0 -365
- package/cli/commands/menu/shared.ts +0 -23
- package/cli/commands/menu/shell-handlers.ts +0 -1811
- package/cli/commands/menu/sql-handlers.ts +0 -231
- package/cli/commands/menu/update-handlers.ts +0 -378
- package/cli/commands/menu/validators.ts +0 -8
- package/cli/commands/ports.ts +0 -211
- package/cli/commands/pull.ts +0 -223
- package/cli/commands/query.ts +0 -241
- package/cli/commands/restore.ts +0 -587
- package/cli/commands/run.ts +0 -178
- package/cli/commands/self-update.ts +0 -121
- package/cli/commands/sqlite.ts +0 -273
- package/cli/commands/start.ts +0 -218
- package/cli/commands/stop.ts +0 -241
- package/cli/commands/url.ts +0 -104
- package/cli/commands/users.ts +0 -264
- package/cli/commands/version.ts +0 -55
- package/cli/commands/which.ts +0 -290
- package/cli/constants.ts +0 -233
- package/cli/helpers.ts +0 -1593
- package/cli/index.ts +0 -162
- package/cli/ui/prompts.ts +0 -1525
- package/cli/ui/spinner.ts +0 -88
- package/cli/ui/theme.ts +0 -128
- package/cli/utils/file-follower.ts +0 -93
- package/config/backup-formats.ts +0 -446
- package/config/defaults.ts +0 -56
- package/config/engine-defaults.ts +0 -336
- package/config/engines-registry.ts +0 -150
- package/config/engines.schema.json +0 -135
- package/config/os-dependencies.ts +0 -888
- package/config/paths.ts +0 -200
- package/core/backup-restore.ts +0 -330
- package/core/base-binary-manager.ts +0 -562
- package/core/base-document-binary-manager.ts +0 -523
- package/core/base-embedded-binary-manager.ts +0 -547
- package/core/base-server-binary-manager.ts +0 -523
- package/core/config-manager.ts +0 -652
- package/core/container-manager.ts +0 -787
- package/core/credential-generator.ts +0 -93
- package/core/credential-manager.ts +0 -259
- package/core/dblab-utils.ts +0 -113
- package/core/dependency-manager.ts +0 -512
- package/core/docker-exporter.ts +0 -1345
- package/core/error-handler.ts +0 -419
- package/core/fs-error-utils.ts +0 -82
- package/core/homebrew-version-manager.ts +0 -352
- package/core/hostdb-client.ts +0 -344
- package/core/hostdb-metadata.ts +0 -350
- package/core/hostdb-releases-factory.ts +0 -237
- package/core/library-env.ts +0 -118
- package/core/pgweb-utils.ts +0 -62
- package/core/platform-service.ts +0 -829
- package/core/port-manager.ts +0 -165
- package/core/process-manager.ts +0 -576
- package/core/pull-manager.ts +0 -511
- package/core/query-parser.ts +0 -514
- package/core/spawn-utils.ts +0 -122
- package/core/start-with-retry.ts +0 -130
- package/core/test-cleanup.ts +0 -108
- package/core/tls-generator.ts +0 -116
- package/core/transaction-manager.ts +0 -158
- package/core/update-manager.ts +0 -308
- package/core/version-migration.ts +0 -346
- package/core/version-utils.ts +0 -104
- package/engines/base-engine.ts +0 -340
- package/engines/clickhouse/README.md +0 -231
- package/engines/clickhouse/backup.ts +0 -398
- package/engines/clickhouse/binary-manager.ts +0 -201
- package/engines/clickhouse/binary-urls.ts +0 -125
- package/engines/clickhouse/cli-utils.ts +0 -176
- package/engines/clickhouse/hostdb-releases.ts +0 -30
- package/engines/clickhouse/index.ts +0 -1345
- package/engines/clickhouse/restore.ts +0 -466
- package/engines/clickhouse/version-maps.ts +0 -95
- package/engines/clickhouse/version-validator.ts +0 -154
- package/engines/cockroachdb/README.md +0 -170
- package/engines/cockroachdb/backup.ts +0 -376
- package/engines/cockroachdb/binary-manager.ts +0 -45
- package/engines/cockroachdb/binary-urls.ts +0 -40
- package/engines/cockroachdb/cli-utils.ts +0 -384
- package/engines/cockroachdb/hostdb-releases.ts +0 -26
- package/engines/cockroachdb/index.ts +0 -1276
- package/engines/cockroachdb/restore.ts +0 -455
- package/engines/cockroachdb/version-maps.ts +0 -42
- package/engines/couchdb/README.md +0 -257
- package/engines/couchdb/api-client.ts +0 -81
- package/engines/couchdb/backup.ts +0 -137
- package/engines/couchdb/binary-manager.ts +0 -86
- package/engines/couchdb/binary-urls.ts +0 -115
- package/engines/couchdb/hostdb-releases.ts +0 -23
- package/engines/couchdb/index.ts +0 -1429
- package/engines/couchdb/restore.ts +0 -290
- package/engines/couchdb/version-maps.ts +0 -78
- package/engines/couchdb/version-validator.ts +0 -111
- package/engines/duckdb/README.md +0 -154
- package/engines/duckdb/binary-manager.ts +0 -45
- package/engines/duckdb/hostdb-releases.ts +0 -23
- package/engines/duckdb/index.ts +0 -749
- package/engines/duckdb/registry.ts +0 -303
- package/engines/duckdb/scanner.ts +0 -22
- package/engines/duckdb/version-maps.ts +0 -78
- package/engines/duckdb/version-validator.ts +0 -78
- package/engines/ferretdb/README.md +0 -262
- package/engines/ferretdb/backup.ts +0 -173
- package/engines/ferretdb/binary-manager.ts +0 -1095
- package/engines/ferretdb/binary-urls.ts +0 -183
- package/engines/ferretdb/index.ts +0 -1907
- package/engines/ferretdb/restore.ts +0 -357
- package/engines/file-based-utils.ts +0 -262
- package/engines/index.ts +0 -131
- package/engines/influxdb/README.md +0 -180
- package/engines/influxdb/api-client.ts +0 -64
- package/engines/influxdb/backup.ts +0 -160
- package/engines/influxdb/binary-manager.ts +0 -110
- package/engines/influxdb/binary-urls.ts +0 -69
- package/engines/influxdb/hostdb-releases.ts +0 -23
- package/engines/influxdb/index.ts +0 -1272
- package/engines/influxdb/restore.ts +0 -417
- package/engines/influxdb/version-maps.ts +0 -75
- package/engines/influxdb/version-validator.ts +0 -128
- package/engines/mariadb/README.md +0 -141
- package/engines/mariadb/backup.ts +0 -233
- package/engines/mariadb/binary-manager.ts +0 -45
- package/engines/mariadb/hostdb-releases.ts +0 -23
- package/engines/mariadb/index.ts +0 -1300
- package/engines/mariadb/restore.ts +0 -447
- package/engines/mariadb/version-maps.ts +0 -72
- package/engines/mariadb/version-validator.ts +0 -181
- package/engines/meilisearch/README.md +0 -255
- package/engines/meilisearch/api-client.ts +0 -61
- package/engines/meilisearch/backup.ts +0 -233
- package/engines/meilisearch/binary-manager.ts +0 -43
- package/engines/meilisearch/binary-urls.ts +0 -69
- package/engines/meilisearch/hostdb-releases.ts +0 -26
- package/engines/meilisearch/index.ts +0 -1292
- package/engines/meilisearch/restore.ts +0 -219
- package/engines/meilisearch/version-maps.ts +0 -78
- package/engines/meilisearch/version-validator.ts +0 -128
- package/engines/mongodb/README.md +0 -162
- package/engines/mongodb/backup.ts +0 -127
- package/engines/mongodb/binary-manager.ts +0 -48
- package/engines/mongodb/binary-urls.ts +0 -63
- package/engines/mongodb/cli-utils.ts +0 -171
- package/engines/mongodb/hostdb-releases.ts +0 -91
- package/engines/mongodb/index.ts +0 -1118
- package/engines/mongodb/restore.ts +0 -361
- package/engines/mongodb/version-maps.ts +0 -91
- package/engines/mongodb/version-validator.ts +0 -160
- package/engines/mysql/README.md +0 -142
- package/engines/mysql/backup.ts +0 -270
- package/engines/mysql/binary-detection.ts +0 -408
- package/engines/mysql/binary-manager.ts +0 -42
- package/engines/mysql/binary-urls.ts +0 -104
- package/engines/mysql/index.ts +0 -1361
- package/engines/mysql/restore.ts +0 -500
- package/engines/mysql/version-maps.ts +0 -91
- package/engines/mysql/version-validator.ts +0 -369
- package/engines/postgresql/README.md +0 -158
- package/engines/postgresql/backup.ts +0 -151
- package/engines/postgresql/binary-manager.ts +0 -114
- package/engines/postgresql/binary-urls.ts +0 -99
- package/engines/postgresql/hostdb-releases.ts +0 -26
- package/engines/postgresql/index.ts +0 -1143
- package/engines/postgresql/remote-version.ts +0 -161
- package/engines/postgresql/restore.ts +0 -342
- package/engines/postgresql/version-maps.ts +0 -83
- package/engines/postgresql/version-validator.ts +0 -413
- package/engines/qdrant/README.md +0 -222
- package/engines/qdrant/api-client.ts +0 -61
- package/engines/qdrant/backup.ts +0 -165
- package/engines/qdrant/binary-manager.ts +0 -43
- package/engines/qdrant/binary-urls.ts +0 -115
- package/engines/qdrant/cli-utils.ts +0 -43
- package/engines/qdrant/hostdb-releases.ts +0 -23
- package/engines/qdrant/index.ts +0 -1312
- package/engines/qdrant/restore.ts +0 -203
- package/engines/qdrant/version-maps.ts +0 -78
- package/engines/qdrant/version-validator.ts +0 -128
- package/engines/questdb/README.md +0 -334
- package/engines/questdb/backup.ts +0 -220
- package/engines/questdb/binary-manager.ts +0 -310
- package/engines/questdb/binary-urls.ts +0 -34
- package/engines/questdb/hostdb-releases.ts +0 -23
- package/engines/questdb/index.ts +0 -1023
- package/engines/questdb/restore.ts +0 -260
- package/engines/questdb/version-maps.ts +0 -37
- package/engines/questdb/version-validator.ts +0 -121
- package/engines/redis/README.md +0 -173
- package/engines/redis/backup.ts +0 -389
- package/engines/redis/binary-manager.ts +0 -44
- package/engines/redis/binary-urls.ts +0 -117
- package/engines/redis/cli-utils.ts +0 -42
- package/engines/redis/hostdb-releases.ts +0 -23
- package/engines/redis/index.ts +0 -1583
- package/engines/redis/restore.ts +0 -443
- package/engines/redis/version-maps.ts +0 -81
- package/engines/redis/version-validator.ts +0 -131
- package/engines/sqlite/README.md +0 -162
- package/engines/sqlite/binary-manager.ts +0 -52
- package/engines/sqlite/hostdb-releases.ts +0 -23
- package/engines/sqlite/index.ts +0 -641
- package/engines/sqlite/registry.ts +0 -198
- package/engines/sqlite/scanner.ts +0 -22
- package/engines/sqlite/version-maps.ts +0 -64
- package/engines/surrealdb/README.md +0 -218
- package/engines/surrealdb/backup.ts +0 -131
- package/engines/surrealdb/binary-manager.ts +0 -45
- package/engines/surrealdb/binary-urls.ts +0 -40
- package/engines/surrealdb/cli-utils.ts +0 -173
- package/engines/surrealdb/hostdb-releases.ts +0 -23
- package/engines/surrealdb/index.ts +0 -1246
- package/engines/surrealdb/restore.ts +0 -302
- package/engines/surrealdb/version-maps.ts +0 -41
- package/engines/tigerbeetle/README.md +0 -61
- package/engines/tigerbeetle/backup.ts +0 -49
- package/engines/tigerbeetle/binary-manager.ts +0 -95
- package/engines/tigerbeetle/binary-urls.ts +0 -62
- package/engines/tigerbeetle/hostdb-releases.ts +0 -26
- package/engines/tigerbeetle/index.ts +0 -746
- package/engines/tigerbeetle/restore.ts +0 -130
- package/engines/tigerbeetle/version-validator.ts +0 -126
- package/engines/typedb/backup.ts +0 -167
- package/engines/typedb/binary-manager.ts +0 -200
- package/engines/typedb/binary-urls.ts +0 -40
- package/engines/typedb/cli-utils.ts +0 -210
- package/engines/typedb/hostdb-releases.ts +0 -23
- package/engines/typedb/index.ts +0 -1275
- package/engines/typedb/restore.ts +0 -377
- package/engines/typedb/version-maps.ts +0 -48
- package/engines/typedb/version-validator.ts +0 -127
- package/engines/valkey/README.md +0 -219
- package/engines/valkey/backup.ts +0 -389
- package/engines/valkey/binary-manager.ts +0 -45
- package/engines/valkey/binary-urls.ts +0 -122
- package/engines/valkey/cli-utils.ts +0 -42
- package/engines/valkey/hostdb-releases.ts +0 -23
- package/engines/valkey/index.ts +0 -1585
- package/engines/valkey/restore.ts +0 -446
- package/engines/valkey/version-maps.ts +0 -81
- package/engines/valkey/version-validator.ts +0 -131
- package/engines/weaviate/README.md +0 -302
- package/engines/weaviate/api-client.ts +0 -61
- package/engines/weaviate/backup.ts +0 -145
- package/engines/weaviate/binary-manager.ts +0 -80
- package/engines/weaviate/binary-urls.ts +0 -115
- package/engines/weaviate/cli-utils.ts +0 -43
- package/engines/weaviate/hostdb-releases.ts +0 -23
- package/engines/weaviate/index.ts +0 -1139
- package/engines/weaviate/restore.ts +0 -235
- package/engines/weaviate/version-maps.ts +0 -78
- package/engines/weaviate/version-validator.ts +0 -128
- package/types/index.ts +0 -624
- /package/{config → dist/config}/engines.json +0 -0
|
@@ -0,0 +1,873 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB Engine implementation
|
|
3
|
+
* Manages MongoDB database containers using hostdb-downloaded binaries
|
|
4
|
+
*/
|
|
5
|
+
import { spawn, exec } from 'child_process';
|
|
6
|
+
import { promisify } from 'util';
|
|
7
|
+
import { existsSync } from 'fs';
|
|
8
|
+
import net from 'net';
|
|
9
|
+
import { mkdir, writeFile, readFile, unlink } from 'fs/promises';
|
|
10
|
+
import { join, basename } from 'path';
|
|
11
|
+
import { BaseEngine } from '../base-engine.js';
|
|
12
|
+
import { paths } from '../../config/paths.js';
|
|
13
|
+
import { getEngineDefaults } from '../../config/defaults.js';
|
|
14
|
+
import { platformService, isWindows } from '../../core/platform-service.js';
|
|
15
|
+
import { configManager } from '../../core/config-manager.js';
|
|
16
|
+
import { logDebug, logWarning, assertValidDatabaseName, assertValidUsername, } from '../../core/error-handler.js';
|
|
17
|
+
import { processManager } from '../../core/process-manager.js';
|
|
18
|
+
import { mongodbBinaryManager } from './binary-manager.js';
|
|
19
|
+
import { SUPPORTED_MAJOR_VERSIONS, FALLBACK_VERSION_MAP } from './version-maps.js';
|
|
20
|
+
import { getBinaryUrl } from './binary-urls.js';
|
|
21
|
+
import { detectBackupFormat as detectBackupFormatImpl, restoreBackup, parseConnectionString, } from './restore.js';
|
|
22
|
+
import { createBackup } from './backup.js';
|
|
23
|
+
import { getMongodumpPath, MONGODUMP_NOT_FOUND_ERROR } from './cli-utils.js';
|
|
24
|
+
import { Platform, } from '../../types/index.js';
|
|
25
|
+
import { parseMongoDBResult } from '../../core/query-parser.js';
|
|
26
|
+
const execAsync = promisify(exec);
|
|
27
|
+
const ENGINE = 'mongodb';
|
|
28
|
+
const engineDef = getEngineDefaults(ENGINE);
|
|
29
|
+
// Build a mongosh command for inline JavaScript execution
|
|
30
|
+
export function buildMongoshCommand(mongoshPath, port, database, script, options) {
|
|
31
|
+
const quietFlag = options?.quiet ? ' --quiet' : '';
|
|
32
|
+
if (isWindows()) {
|
|
33
|
+
// Windows: use double quotes
|
|
34
|
+
const escaped = script.replace(/"/g, '\\"');
|
|
35
|
+
return `"${mongoshPath}" --host 127.0.0.1 --port ${port} ${database}${quietFlag} --eval "${escaped}"`;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Unix: use single quotes
|
|
39
|
+
const escaped = script.replace(/'/g, "'\\''");
|
|
40
|
+
return `"${mongoshPath}" --host 127.0.0.1 --port ${port} ${database}${quietFlag} --eval '${escaped}'`;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Extract JSON from mongosh output that may contain extra messages/prompts
|
|
45
|
+
* Returns the parsed JSON or null if extraction fails
|
|
46
|
+
*/
|
|
47
|
+
function extractJson(output) {
|
|
48
|
+
const trimmed = output.trim();
|
|
49
|
+
// Find the first '{' and last '}' to extract JSON object
|
|
50
|
+
const firstBrace = trimmed.indexOf('{');
|
|
51
|
+
const lastBrace = trimmed.lastIndexOf('}');
|
|
52
|
+
if (firstBrace === -1 || lastBrace === -1 || lastBrace <= firstBrace) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
return JSON.parse(trimmed.substring(firstBrace, lastBrace + 1));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class MongoDBEngine extends BaseEngine {
|
|
63
|
+
name = ENGINE;
|
|
64
|
+
displayName = 'MongoDB';
|
|
65
|
+
defaultPort = engineDef.defaultPort;
|
|
66
|
+
supportedVersions = SUPPORTED_MAJOR_VERSIONS;
|
|
67
|
+
// Get the current platform and architecture
|
|
68
|
+
getPlatformInfo() {
|
|
69
|
+
return platformService.getPlatformInfo();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Returns available MongoDB versions from the fallback version map.
|
|
73
|
+
*
|
|
74
|
+
* Note: This returns cached/fallback data from FALLBACK_VERSION_MAP and does not
|
|
75
|
+
* perform network I/O. This matches the behavior of other engines that maintain
|
|
76
|
+
* a static version map synchronized with hostdb releases.json.
|
|
77
|
+
*/
|
|
78
|
+
async fetchAvailableVersions() {
|
|
79
|
+
const versions = {};
|
|
80
|
+
for (const [majorMinor, full] of Object.entries(FALLBACK_VERSION_MAP)) {
|
|
81
|
+
versions[majorMinor] = [full];
|
|
82
|
+
}
|
|
83
|
+
return versions;
|
|
84
|
+
}
|
|
85
|
+
// Get binary download URL from hostdb
|
|
86
|
+
getBinaryUrl(version, platform, arch) {
|
|
87
|
+
return getBinaryUrl(version, platform, arch);
|
|
88
|
+
}
|
|
89
|
+
// Resolves version string to full version (e.g., '8' -> '8.0.17')
|
|
90
|
+
resolveFullVersion(version) {
|
|
91
|
+
// Check if already a full version (has at least two dots)
|
|
92
|
+
if (/^\d+\.\d+\.\d+$/.test(version)) {
|
|
93
|
+
return version;
|
|
94
|
+
}
|
|
95
|
+
// It's a major or major.minor version, resolve using fallback map
|
|
96
|
+
return FALLBACK_VERSION_MAP[version] || `${version}.0.0`;
|
|
97
|
+
}
|
|
98
|
+
// Get the path where binaries for a version would be installed
|
|
99
|
+
getBinaryPath(version) {
|
|
100
|
+
const fullVersion = this.resolveFullVersion(version);
|
|
101
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
102
|
+
return paths.getBinaryPath({
|
|
103
|
+
engine: 'mongodb',
|
|
104
|
+
version: fullVersion,
|
|
105
|
+
platform: p,
|
|
106
|
+
arch: a,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Verify that MongoDB binaries are available and functional
|
|
111
|
+
*
|
|
112
|
+
* Delegates to mongodbBinaryManager.verify() which:
|
|
113
|
+
* 1. Checks file existence
|
|
114
|
+
* 2. Executes `mongod --version`
|
|
115
|
+
* 3. Validates version output matches expected version
|
|
116
|
+
*
|
|
117
|
+
* @param binPath - Path to MongoDB binary directory (e.g., ~/.spindb/bin/mongodb-8.0.17-darwin-arm64)
|
|
118
|
+
* @param version - Optional explicit version to verify against
|
|
119
|
+
*/
|
|
120
|
+
async verifyBinary(binPath, version) {
|
|
121
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
122
|
+
// Use explicit version if provided
|
|
123
|
+
if (version) {
|
|
124
|
+
return mongodbBinaryManager.verify(version, p, a);
|
|
125
|
+
}
|
|
126
|
+
// Fallback: extract version from directory name (format: mongodb-{version}-{platform}-{arch})
|
|
127
|
+
// Use basename to avoid issues with dashes in parent directory names
|
|
128
|
+
const dirName = basename(binPath);
|
|
129
|
+
const match = dirName.match(/^mongodb-([\d.]+)-/);
|
|
130
|
+
if (match) {
|
|
131
|
+
const extractedVersion = match[1];
|
|
132
|
+
return mongodbBinaryManager.verify(extractedVersion, p, a);
|
|
133
|
+
}
|
|
134
|
+
// Last resort: just check file existence
|
|
135
|
+
const ext = platformService.getExecutableExtension();
|
|
136
|
+
const mongodPath = join(binPath, 'bin', `mongod${ext}`);
|
|
137
|
+
return existsSync(mongodPath);
|
|
138
|
+
}
|
|
139
|
+
// Check if a specific MongoDB version is installed
|
|
140
|
+
async isBinaryInstalled(version) {
|
|
141
|
+
const { platform, arch } = this.getPlatformInfo();
|
|
142
|
+
return mongodbBinaryManager.isInstalled(version, platform, arch);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Ensure MongoDB binaries are available for a specific version
|
|
146
|
+
* Downloads from hostdb for all platforms
|
|
147
|
+
*/
|
|
148
|
+
async ensureBinaries(version, onProgress) {
|
|
149
|
+
const { platform, arch } = this.getPlatformInfo();
|
|
150
|
+
// Download from hostdb
|
|
151
|
+
const binPath = await mongodbBinaryManager.ensureInstalled(version, platform, arch, onProgress);
|
|
152
|
+
// Register binaries in config (includes server + client tools)
|
|
153
|
+
const ext = platformService.getExecutableExtension();
|
|
154
|
+
const bundledTools = [
|
|
155
|
+
'mongod', // server
|
|
156
|
+
'mongosh', // shell client
|
|
157
|
+
'mongodump', // backup utility
|
|
158
|
+
'mongorestore', // restore utility
|
|
159
|
+
];
|
|
160
|
+
for (const tool of bundledTools) {
|
|
161
|
+
const toolPath = join(binPath, 'bin', `${tool}${ext}`);
|
|
162
|
+
if (existsSync(toolPath)) {
|
|
163
|
+
await configManager.setBinaryPath(tool, toolPath, 'bundled');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return binPath;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Initialize a new MongoDB data directory
|
|
170
|
+
* Unlike MySQL, MongoDB doesn't require initialization - just create the directory
|
|
171
|
+
*/
|
|
172
|
+
async initDataDir(containerName, _version, _options = {}) {
|
|
173
|
+
const dataDir = paths.getContainerDataPath(containerName, {
|
|
174
|
+
engine: ENGINE,
|
|
175
|
+
});
|
|
176
|
+
// Create data directory if it doesn't exist
|
|
177
|
+
if (!existsSync(dataDir)) {
|
|
178
|
+
await mkdir(dataDir, { recursive: true });
|
|
179
|
+
logDebug(`Created MongoDB data directory: ${dataDir}`);
|
|
180
|
+
}
|
|
181
|
+
return dataDir;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Start MongoDB server
|
|
185
|
+
* CLI wrapper: mongod --dbpath {dir} --port {port} --bind_ip 127.0.0.1
|
|
186
|
+
*/
|
|
187
|
+
async start(container, onProgress) {
|
|
188
|
+
const { name, port, version, binaryPath } = container;
|
|
189
|
+
// Check if already running (idempotent behavior)
|
|
190
|
+
const alreadyRunning = await processManager.isRunning(name, {
|
|
191
|
+
engine: ENGINE,
|
|
192
|
+
});
|
|
193
|
+
if (alreadyRunning) {
|
|
194
|
+
return {
|
|
195
|
+
port,
|
|
196
|
+
connectionString: this.getConnectionString(container),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// Use stored binary path if available (from container creation)
|
|
200
|
+
// This ensures version consistency - the container uses the same binary it was created with
|
|
201
|
+
let mongod = null;
|
|
202
|
+
if (binaryPath && existsSync(binaryPath)) {
|
|
203
|
+
// binaryPath is the directory (e.g., ~/.spindb/bin/mongodb-8.0.17-linux-arm64)
|
|
204
|
+
// We need to construct the full path to mongod
|
|
205
|
+
const ext = platformService.getExecutableExtension();
|
|
206
|
+
const serverPath = join(binaryPath, 'bin', `mongod${ext}`);
|
|
207
|
+
if (existsSync(serverPath)) {
|
|
208
|
+
mongod = serverPath;
|
|
209
|
+
logDebug(`Using stored binary path: ${mongod}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// If we didn't find the binary above, fall back to normal path
|
|
213
|
+
if (!mongod) {
|
|
214
|
+
// Get mongod from config or download if needed
|
|
215
|
+
const mongodPath = await configManager.getBinaryPath('mongod');
|
|
216
|
+
if (mongodPath && existsSync(mongodPath)) {
|
|
217
|
+
mongod = mongodPath;
|
|
218
|
+
logDebug(`Using registered binary path: ${mongod}`);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
// Try to ensure binaries are available
|
|
222
|
+
const binPath = await this.ensureBinaries(version, onProgress);
|
|
223
|
+
const ext = platformService.getExecutableExtension();
|
|
224
|
+
mongod = join(binPath, 'bin', `mongod${ext}`);
|
|
225
|
+
if (!existsSync(mongod)) {
|
|
226
|
+
throw new Error(`MongoDB ${version} is not installed. ` +
|
|
227
|
+
`Run: spindb engines download mongodb ${version}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
logDebug(`Using mongod for version ${version}: ${mongod}`);
|
|
232
|
+
const dataDir = paths.getContainerDataPath(name, { engine: ENGINE });
|
|
233
|
+
const logFile = paths.getContainerLogPath(name, { engine: ENGINE });
|
|
234
|
+
const containerDir = paths.getContainerPath(name, { engine: ENGINE });
|
|
235
|
+
const pidFile = join(containerDir, 'mongod.pid');
|
|
236
|
+
onProgress?.({ stage: 'starting', message: 'Starting MongoDB...' });
|
|
237
|
+
const args = [
|
|
238
|
+
'--dbpath',
|
|
239
|
+
dataDir,
|
|
240
|
+
'--port',
|
|
241
|
+
String(port),
|
|
242
|
+
'--bind_ip',
|
|
243
|
+
'127.0.0.1',
|
|
244
|
+
'--logpath',
|
|
245
|
+
logFile,
|
|
246
|
+
'--logappend',
|
|
247
|
+
];
|
|
248
|
+
// Note: --fork is not supported on macOS (Sonoma+), so we use detached spawn
|
|
249
|
+
// for both macOS and Windows. Only Linux still supports --fork.
|
|
250
|
+
const { platform } = platformService.getPlatformInfo();
|
|
251
|
+
const useDetachedSpawn = platform === Platform.Win32 || platform === Platform.Darwin;
|
|
252
|
+
if (!useDetachedSpawn) {
|
|
253
|
+
// Linux: can use --fork for native daemonization
|
|
254
|
+
args.push('--fork');
|
|
255
|
+
}
|
|
256
|
+
logDebug(`Starting mongod with args: ${args.join(' ')}`);
|
|
257
|
+
if (useDetachedSpawn) {
|
|
258
|
+
// macOS/Windows: spawn detached process
|
|
259
|
+
const spawnOpts = {
|
|
260
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
261
|
+
detached: true,
|
|
262
|
+
};
|
|
263
|
+
if (isWindows()) {
|
|
264
|
+
spawnOpts.windowsHide = true;
|
|
265
|
+
}
|
|
266
|
+
const proc = spawn(mongod, args, spawnOpts);
|
|
267
|
+
proc.stdout?.on('data', (data) => {
|
|
268
|
+
logDebug(`mongod stdout: ${data.toString()}`);
|
|
269
|
+
});
|
|
270
|
+
proc.stderr?.on('data', (data) => {
|
|
271
|
+
logDebug(`mongod stderr: ${data.toString()}`);
|
|
272
|
+
});
|
|
273
|
+
proc.unref();
|
|
274
|
+
// Write PID file
|
|
275
|
+
if (proc.pid) {
|
|
276
|
+
await writeFile(pidFile, String(proc.pid));
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
// Linux: mongod --fork handles daemonization itself
|
|
281
|
+
return new Promise((resolve, reject) => {
|
|
282
|
+
const proc = spawn(mongod, args, {
|
|
283
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
284
|
+
});
|
|
285
|
+
let stdout = '';
|
|
286
|
+
let stderr = '';
|
|
287
|
+
proc.stdout?.on('data', (data) => {
|
|
288
|
+
stdout += data.toString();
|
|
289
|
+
});
|
|
290
|
+
proc.stderr?.on('data', (data) => {
|
|
291
|
+
stderr += data.toString();
|
|
292
|
+
});
|
|
293
|
+
proc.on('close', async (code) => {
|
|
294
|
+
if (code === 0) {
|
|
295
|
+
// MongoDB forked successfully, now wait for it to be ready
|
|
296
|
+
const ready = await this.waitForReady(port);
|
|
297
|
+
if (ready) {
|
|
298
|
+
// Read PID from lock file
|
|
299
|
+
const lockFile = join(dataDir, 'mongod.lock');
|
|
300
|
+
try {
|
|
301
|
+
const pid = await readFile(lockFile, 'utf8');
|
|
302
|
+
await writeFile(pidFile, pid.trim());
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
// Lock file might not exist yet
|
|
306
|
+
}
|
|
307
|
+
resolve({
|
|
308
|
+
port,
|
|
309
|
+
connectionString: this.getConnectionString(container),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
reject(new Error('MongoDB failed to start within timeout'));
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
reject(new Error(stderr || stdout || `mongod exited with code ${code}`));
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
proc.on('error', reject);
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
// Wait for MongoDB to be ready (Windows path)
|
|
324
|
+
const ready = await this.waitForReady(port);
|
|
325
|
+
if (!ready) {
|
|
326
|
+
throw new Error('MongoDB failed to start within timeout');
|
|
327
|
+
}
|
|
328
|
+
return {
|
|
329
|
+
port,
|
|
330
|
+
connectionString: this.getConnectionString(container),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
// Check if a TCP port is accepting connections
|
|
334
|
+
checkPortOpen(port) {
|
|
335
|
+
return new Promise((resolve) => {
|
|
336
|
+
const socket = new net.Socket();
|
|
337
|
+
socket.setTimeout(1000);
|
|
338
|
+
socket.once('connect', () => {
|
|
339
|
+
socket.destroy();
|
|
340
|
+
resolve(true);
|
|
341
|
+
});
|
|
342
|
+
socket.once('error', () => {
|
|
343
|
+
socket.destroy();
|
|
344
|
+
resolve(false);
|
|
345
|
+
});
|
|
346
|
+
socket.once('timeout', () => {
|
|
347
|
+
socket.destroy();
|
|
348
|
+
resolve(false);
|
|
349
|
+
});
|
|
350
|
+
socket.connect(port, '127.0.0.1');
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Wait for MongoDB to be ready to accept connections
|
|
355
|
+
*
|
|
356
|
+
* Uses two strategies depending on tool availability:
|
|
357
|
+
* 1. **Preferred (mongosh available)**: Executes `db.runCommand({ping:1})` via mongosh
|
|
358
|
+
* to verify MongoDB is fully operational and responding to commands.
|
|
359
|
+
* 2. **Fallback (mongosh unavailable)**: Uses TCP port check via checkPortOpen().
|
|
360
|
+
* TCP connectivity is a less thorough check than a mongosh ping - it only confirms
|
|
361
|
+
* the port is accepting connections, not that MongoDB is fully initialized and
|
|
362
|
+
* ready to process queries. However, for local development containers this is
|
|
363
|
+
* acceptable since MongoDB typically accepts connections shortly after becoming
|
|
364
|
+
* ready, and this avoids requiring mongosh to be installed.
|
|
365
|
+
*/
|
|
366
|
+
async waitForReady(port, timeoutMs = 30000) {
|
|
367
|
+
const startTime = Date.now();
|
|
368
|
+
const checkInterval = 500;
|
|
369
|
+
const mongosh = await configManager.getBinaryPath('mongosh');
|
|
370
|
+
if (!mongosh) {
|
|
371
|
+
// Fallback: TCP port check when mongosh is unavailable
|
|
372
|
+
// Less thorough than db.runCommand({ping:1}) but sufficient for local dev containers
|
|
373
|
+
logDebug(`mongosh not found, using TCP port check for MongoDB on port ${port}`);
|
|
374
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
375
|
+
const isOpen = await this.checkPortOpen(port);
|
|
376
|
+
if (isOpen)
|
|
377
|
+
return true;
|
|
378
|
+
await new Promise((r) => setTimeout(r, checkInterval));
|
|
379
|
+
}
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
383
|
+
try {
|
|
384
|
+
const cmd = buildMongoshCommand(mongosh, port, 'admin', 'db.runCommand({ping:1})', { quiet: true });
|
|
385
|
+
await execAsync(cmd, { timeout: 5000 });
|
|
386
|
+
return true;
|
|
387
|
+
}
|
|
388
|
+
catch {
|
|
389
|
+
await new Promise((resolve) => setTimeout(resolve, checkInterval));
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Stop MongoDB server
|
|
396
|
+
* Uses db.adminCommand({shutdown:1}) via mongosh or SIGTERM
|
|
397
|
+
*/
|
|
398
|
+
async stop(container) {
|
|
399
|
+
const { name, port } = container;
|
|
400
|
+
const containerDir = paths.getContainerPath(name, { engine: ENGINE });
|
|
401
|
+
const dataDir = paths.getContainerDataPath(name, { engine: ENGINE });
|
|
402
|
+
const pidFile = join(containerDir, 'mongod.pid');
|
|
403
|
+
const lockFile = join(dataDir, 'mongod.lock');
|
|
404
|
+
logDebug(`Stopping MongoDB container "${name}" on port ${port}`);
|
|
405
|
+
// Try graceful shutdown via mongosh
|
|
406
|
+
const mongosh = await configManager.getBinaryPath('mongosh');
|
|
407
|
+
if (mongosh) {
|
|
408
|
+
try {
|
|
409
|
+
const cmd = buildMongoshCommand(mongosh, port, 'admin', 'db.adminCommand({shutdown:1})');
|
|
410
|
+
await execAsync(cmd, { timeout: 10000 });
|
|
411
|
+
logDebug('MongoDB shutdown command sent');
|
|
412
|
+
// Wait a bit for process to exit
|
|
413
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
414
|
+
}
|
|
415
|
+
catch (error) {
|
|
416
|
+
logDebug(`mongosh shutdown failed: ${error}`);
|
|
417
|
+
// Continue to PID-based shutdown
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
// Get PID and force kill if needed
|
|
421
|
+
let pid = null;
|
|
422
|
+
// Try PID file first
|
|
423
|
+
if (existsSync(pidFile)) {
|
|
424
|
+
try {
|
|
425
|
+
const content = await readFile(pidFile, 'utf8');
|
|
426
|
+
pid = parseInt(content.trim(), 10);
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
// Ignore
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
// Try lock file if no PID from pid file
|
|
433
|
+
if (!pid && existsSync(lockFile)) {
|
|
434
|
+
try {
|
|
435
|
+
const content = await readFile(lockFile, 'utf8');
|
|
436
|
+
const parsed = parseInt(content.trim(), 10);
|
|
437
|
+
if (!isNaN(parsed) && parsed > 0) {
|
|
438
|
+
pid = parsed;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
catch {
|
|
442
|
+
// Ignore
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// Kill process if still running
|
|
446
|
+
if (pid && platformService.isProcessRunning(pid)) {
|
|
447
|
+
logDebug(`Killing MongoDB process ${pid}`);
|
|
448
|
+
try {
|
|
449
|
+
await platformService.terminateProcess(pid, false);
|
|
450
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
451
|
+
if (platformService.isProcessRunning(pid)) {
|
|
452
|
+
logWarning(`Graceful termination failed, force killing ${pid}`);
|
|
453
|
+
await platformService.terminateProcess(pid, true);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
catch (error) {
|
|
457
|
+
logDebug(`Process termination error: ${error}`);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
// Cleanup PID file
|
|
461
|
+
if (existsSync(pidFile)) {
|
|
462
|
+
try {
|
|
463
|
+
await unlink(pidFile);
|
|
464
|
+
}
|
|
465
|
+
catch {
|
|
466
|
+
// Ignore
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
logDebug('MongoDB stopped');
|
|
470
|
+
}
|
|
471
|
+
// Get MongoDB server status
|
|
472
|
+
async status(container) {
|
|
473
|
+
const { name, port } = container;
|
|
474
|
+
const containerDir = paths.getContainerPath(name, { engine: ENGINE });
|
|
475
|
+
const dataDir = paths.getContainerDataPath(name, { engine: ENGINE });
|
|
476
|
+
const pidFile = join(containerDir, 'mongod.pid');
|
|
477
|
+
const lockFile = join(dataDir, 'mongod.lock');
|
|
478
|
+
// Try pinging with mongosh
|
|
479
|
+
const mongosh = await configManager.getBinaryPath('mongosh');
|
|
480
|
+
if (mongosh) {
|
|
481
|
+
try {
|
|
482
|
+
const cmd = buildMongoshCommand(mongosh, port, 'admin', 'db.runCommand({ping:1})', { quiet: true });
|
|
483
|
+
await execAsync(cmd, { timeout: 5000 });
|
|
484
|
+
return { running: true, message: 'MongoDB is running' };
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
// Not responding, check PID
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
// Check PID file
|
|
491
|
+
for (const file of [pidFile, lockFile]) {
|
|
492
|
+
if (existsSync(file)) {
|
|
493
|
+
try {
|
|
494
|
+
const content = await readFile(file, 'utf8');
|
|
495
|
+
const pid = parseInt(content.trim(), 10);
|
|
496
|
+
if (!isNaN(pid) && pid > 0 && platformService.isProcessRunning(pid)) {
|
|
497
|
+
return {
|
|
498
|
+
running: true,
|
|
499
|
+
message: `MongoDB is running (PID: ${pid})`,
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
catch {
|
|
504
|
+
// Ignore
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
return { running: false, message: 'MongoDB is not running' };
|
|
509
|
+
}
|
|
510
|
+
// Detect backup format
|
|
511
|
+
async detectBackupFormat(filePath) {
|
|
512
|
+
return detectBackupFormatImpl(filePath);
|
|
513
|
+
}
|
|
514
|
+
// Restore a backup
|
|
515
|
+
async restore(container, backupPath, options = {}) {
|
|
516
|
+
const { port, version } = container;
|
|
517
|
+
const database = options.database || container.database;
|
|
518
|
+
return restoreBackup(backupPath, {
|
|
519
|
+
port,
|
|
520
|
+
database,
|
|
521
|
+
drop: options.drop !== false,
|
|
522
|
+
validateVersion: options.validateVersion !== false,
|
|
523
|
+
containerVersion: version,
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
// Get connection string
|
|
527
|
+
getConnectionString(container, database) {
|
|
528
|
+
const { port } = container;
|
|
529
|
+
const db = database || container.database || 'test';
|
|
530
|
+
return `mongodb://127.0.0.1:${port}/${db}`;
|
|
531
|
+
}
|
|
532
|
+
// Get path to mongosh
|
|
533
|
+
async getMongoshPath() {
|
|
534
|
+
const cached = await configManager.getBinaryPath('mongosh');
|
|
535
|
+
if (cached && existsSync(cached))
|
|
536
|
+
return cached;
|
|
537
|
+
// Try to find in PATH as fallback
|
|
538
|
+
const detected = await platformService.findToolPath('mongosh');
|
|
539
|
+
if (detected) {
|
|
540
|
+
await configManager.setBinaryPath('mongosh', detected, 'system');
|
|
541
|
+
return detected;
|
|
542
|
+
}
|
|
543
|
+
throw new Error('mongosh not found. Download MongoDB binaries:\n' +
|
|
544
|
+
' Run: spindb engines download mongodb <version>\n' +
|
|
545
|
+
' Or install mongosh from: https://www.mongodb.com/try/download/shell');
|
|
546
|
+
}
|
|
547
|
+
// Open mongosh interactive shell
|
|
548
|
+
async connect(container, database) {
|
|
549
|
+
const { port } = container;
|
|
550
|
+
const db = database || container.database || 'test';
|
|
551
|
+
const mongosh = await this.getMongoshPath();
|
|
552
|
+
// Note: Don't use shell mode - spawn handles paths with spaces correctly
|
|
553
|
+
// when shell: false (the default). Shell mode breaks paths like "C:\Program Files\..."
|
|
554
|
+
const spawnOptions = {
|
|
555
|
+
stdio: 'inherit',
|
|
556
|
+
};
|
|
557
|
+
return new Promise((resolve, reject) => {
|
|
558
|
+
const proc = spawn(mongosh, ['--host', '127.0.0.1', '--port', String(port), db], spawnOptions);
|
|
559
|
+
proc.on('error', reject);
|
|
560
|
+
proc.on('close', () => resolve());
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Create a new database
|
|
565
|
+
* MongoDB creates databases implicitly when you first write to them.
|
|
566
|
+
* To force immediate creation, we create a temporary collection and drop it.
|
|
567
|
+
* This leaves the database visible in tools without any marker clutter.
|
|
568
|
+
*/
|
|
569
|
+
async createDatabase(container, database) {
|
|
570
|
+
assertValidDatabaseName(database);
|
|
571
|
+
const { port } = container;
|
|
572
|
+
const mongosh = await this.getMongoshPath();
|
|
573
|
+
// MongoDB creates databases implicitly when you write to them.
|
|
574
|
+
// Create a temp collection then immediately drop it to force database creation
|
|
575
|
+
// without leaving any visible marker collections.
|
|
576
|
+
// First drop any existing _spindb_init collection (ignore errors), then create and drop.
|
|
577
|
+
// This ensures cleanup even if a previous createDatabase was interrupted.
|
|
578
|
+
// NOTE: Use db.getCollection() instead of db._spindb_init shorthand because
|
|
579
|
+
// mongosh doesn't support shorthand notation for collection names starting with underscore.
|
|
580
|
+
const cmd = buildMongoshCommand(mongosh, port, database, 'try { db.getCollection("_spindb_init").drop(); } catch(e) {} db.createCollection("_spindb_init"); db.getCollection("_spindb_init").drop();');
|
|
581
|
+
await execAsync(cmd, { timeout: 10000 });
|
|
582
|
+
}
|
|
583
|
+
// Drop a database
|
|
584
|
+
async dropDatabase(container, database) {
|
|
585
|
+
assertValidDatabaseName(database);
|
|
586
|
+
const { port } = container;
|
|
587
|
+
const mongosh = await this.getMongoshPath();
|
|
588
|
+
const cmd = buildMongoshCommand(mongosh, port, database, 'db.dropDatabase()');
|
|
589
|
+
try {
|
|
590
|
+
await execAsync(cmd, { timeout: 10000 });
|
|
591
|
+
}
|
|
592
|
+
catch (error) {
|
|
593
|
+
const err = error;
|
|
594
|
+
// Ignore "database doesn't exist" scenarios
|
|
595
|
+
logDebug(`dropDatabase result: ${err.message}`);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
// Get the size of the database in bytes
|
|
599
|
+
async getDatabaseSize(container) {
|
|
600
|
+
const { port, database } = container;
|
|
601
|
+
const db = database || 'test';
|
|
602
|
+
try {
|
|
603
|
+
const mongosh = await this.getMongoshPath();
|
|
604
|
+
const cmd = buildMongoshCommand(mongosh, port, db, 'JSON.stringify(db.stats())', { quiet: true });
|
|
605
|
+
const { stdout } = await execAsync(cmd, { timeout: 10000 });
|
|
606
|
+
// Defensively extract JSON from output (may contain extra messages)
|
|
607
|
+
const stats = extractJson(stdout);
|
|
608
|
+
return stats?.dataSize || null;
|
|
609
|
+
}
|
|
610
|
+
catch {
|
|
611
|
+
return null;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
// Create a dump from a remote database
|
|
615
|
+
async dumpFromConnectionString(connectionString, outputPath) {
|
|
616
|
+
const mongodump = await getMongodumpPath();
|
|
617
|
+
if (!mongodump) {
|
|
618
|
+
throw new Error(MONGODUMP_NOT_FOUND_ERROR);
|
|
619
|
+
}
|
|
620
|
+
const parsed = parseConnectionString(connectionString);
|
|
621
|
+
// Always use --uri to avoid exposing credentials as separate CLI arguments
|
|
622
|
+
// The URI keeps credentials embedded (still visible in process listings,
|
|
623
|
+
// but this is MongoDB's recommended approach and handles all edge cases)
|
|
624
|
+
const args = [
|
|
625
|
+
'--uri',
|
|
626
|
+
connectionString,
|
|
627
|
+
'--db',
|
|
628
|
+
parsed.database,
|
|
629
|
+
'--archive=' + outputPath,
|
|
630
|
+
'--gzip',
|
|
631
|
+
];
|
|
632
|
+
// Note: Don't use shell mode - spawn handles paths with spaces correctly
|
|
633
|
+
// when shell: false (the default). Shell mode breaks paths like "C:\Program Files\..."
|
|
634
|
+
const spawnOptions = {
|
|
635
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
636
|
+
};
|
|
637
|
+
return new Promise((resolve, reject) => {
|
|
638
|
+
const proc = spawn(mongodump, args, spawnOptions);
|
|
639
|
+
let stdout = '';
|
|
640
|
+
let stderr = '';
|
|
641
|
+
proc.stdout?.on('data', (data) => {
|
|
642
|
+
stdout += data.toString();
|
|
643
|
+
});
|
|
644
|
+
proc.stderr?.on('data', (data) => {
|
|
645
|
+
stderr += data.toString();
|
|
646
|
+
});
|
|
647
|
+
proc.on('error', reject);
|
|
648
|
+
proc.on('close', (code) => {
|
|
649
|
+
if (code === 0) {
|
|
650
|
+
resolve({
|
|
651
|
+
filePath: outputPath,
|
|
652
|
+
stdout,
|
|
653
|
+
stderr,
|
|
654
|
+
code,
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
else {
|
|
658
|
+
reject(new Error(stderr || `mongodump exited with code ${code}`));
|
|
659
|
+
}
|
|
660
|
+
});
|
|
661
|
+
});
|
|
662
|
+
}
|
|
663
|
+
// Create a backup
|
|
664
|
+
async backup(container, outputPath, options) {
|
|
665
|
+
return createBackup(container, outputPath, options);
|
|
666
|
+
}
|
|
667
|
+
// Run a JavaScript file or inline script against the database
|
|
668
|
+
async runScript(container, options) {
|
|
669
|
+
const { port } = container;
|
|
670
|
+
const db = options.database || container.database || 'test';
|
|
671
|
+
const mongosh = await this.getMongoshPath();
|
|
672
|
+
if (options.file) {
|
|
673
|
+
// Run script file
|
|
674
|
+
// Note: Don't use shell mode here - spawn handles paths with spaces correctly
|
|
675
|
+
// when shell: false (the default). Shell mode would require quoting the path.
|
|
676
|
+
const spawnOptions = {
|
|
677
|
+
stdio: 'inherit',
|
|
678
|
+
};
|
|
679
|
+
return new Promise((resolve, reject) => {
|
|
680
|
+
const proc = spawn(mongosh, [
|
|
681
|
+
'--host',
|
|
682
|
+
'127.0.0.1',
|
|
683
|
+
'--port',
|
|
684
|
+
String(port),
|
|
685
|
+
db,
|
|
686
|
+
'--file',
|
|
687
|
+
options.file,
|
|
688
|
+
], spawnOptions);
|
|
689
|
+
proc.on('error', reject);
|
|
690
|
+
proc.on('close', (code) => {
|
|
691
|
+
if (code === 0) {
|
|
692
|
+
resolve();
|
|
693
|
+
}
|
|
694
|
+
else {
|
|
695
|
+
reject(new Error(`mongosh exited with code ${code}`));
|
|
696
|
+
}
|
|
697
|
+
});
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
else if (options.sql) {
|
|
701
|
+
// Run inline script (using sql field for compatibility, but it's actually JS)
|
|
702
|
+
const cmd = buildMongoshCommand(mongosh, port, db, options.sql);
|
|
703
|
+
const { stdout, stderr } = await execAsync(cmd, { timeout: 60000 });
|
|
704
|
+
if (stdout)
|
|
705
|
+
process.stdout.write(stdout);
|
|
706
|
+
if (stderr)
|
|
707
|
+
process.stderr.write(stderr);
|
|
708
|
+
}
|
|
709
|
+
else {
|
|
710
|
+
throw new Error('Either file or sql option must be provided');
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
async executeQuery(container, query, options) {
|
|
714
|
+
const { port } = container;
|
|
715
|
+
const db = options?.database || container.database || 'test';
|
|
716
|
+
const mongosh = await this.getMongoshPath();
|
|
717
|
+
// Reject "use " shell helper - it doesn't work with JSON output
|
|
718
|
+
const trimmedQuery = query.trim();
|
|
719
|
+
if (trimmedQuery.toLowerCase().startsWith('use ')) {
|
|
720
|
+
throw new Error('The "use" command is not supported in executeQuery. ' +
|
|
721
|
+
'To switch databases, set options.database or container.database instead.');
|
|
722
|
+
}
|
|
723
|
+
// Auto-prepend db. if not already present for collection methods
|
|
724
|
+
// But don't prepend for shell helper functions
|
|
725
|
+
let script = trimmedQuery;
|
|
726
|
+
const shellFunctions = [
|
|
727
|
+
'print',
|
|
728
|
+
'printjson',
|
|
729
|
+
'sleep',
|
|
730
|
+
'ObjectId',
|
|
731
|
+
'ISODate',
|
|
732
|
+
'NumberLong',
|
|
733
|
+
'NumberInt',
|
|
734
|
+
'NumberDecimal',
|
|
735
|
+
'UUID',
|
|
736
|
+
'BinData',
|
|
737
|
+
'Timestamp',
|
|
738
|
+
'MinKey',
|
|
739
|
+
'MaxKey',
|
|
740
|
+
];
|
|
741
|
+
const startsWithShellFunction = shellFunctions.some((fn) => script.startsWith(`${fn}(`) || script.startsWith(`${fn} (`));
|
|
742
|
+
if (!script.startsWith('db.') && !startsWithShellFunction) {
|
|
743
|
+
script = `db.${script}`;
|
|
744
|
+
}
|
|
745
|
+
// Wrap in JSON.stringify for parseable output
|
|
746
|
+
// Handle both toArray() results and single document results
|
|
747
|
+
const wrappedScript = `JSON.stringify(${script})`;
|
|
748
|
+
const cmd = buildMongoshCommand(mongosh, port, db, wrappedScript, {
|
|
749
|
+
quiet: true,
|
|
750
|
+
});
|
|
751
|
+
const { stdout, stderr } = await execAsync(cmd, { timeout: 60000 });
|
|
752
|
+
if (stderr && !stdout.trim()) {
|
|
753
|
+
throw new Error(`${stderr}${stdout ? `\nOutput: ${stdout}` : ''}`);
|
|
754
|
+
}
|
|
755
|
+
// Extract JSON from output (mongosh may include extra output)
|
|
756
|
+
const jsonMatch = stdout.match(/\[[\s\S]*\]|\{[\s\S]*\}/);
|
|
757
|
+
if (!jsonMatch) {
|
|
758
|
+
// Handle scalar results
|
|
759
|
+
return {
|
|
760
|
+
columns: ['result'],
|
|
761
|
+
rows: [{ result: stdout.trim() }],
|
|
762
|
+
rowCount: 1,
|
|
763
|
+
};
|
|
764
|
+
}
|
|
765
|
+
return parseMongoDBResult(jsonMatch[0]);
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* List all user databases, excluding system databases (admin, config, local).
|
|
769
|
+
*/
|
|
770
|
+
async listDatabases(container) {
|
|
771
|
+
const { port } = container;
|
|
772
|
+
const mongosh = await this.getMongoshPath();
|
|
773
|
+
return new Promise((resolve, reject) => {
|
|
774
|
+
// Use JSON output for reliable parsing
|
|
775
|
+
const script = `JSON.stringify(db.adminCommand({listDatabases: 1}).databases.map(d => d.name))`;
|
|
776
|
+
const args = ['--quiet', '--host', `127.0.0.1:${port}`, '--eval', script];
|
|
777
|
+
const proc = spawn(mongosh, args, {
|
|
778
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
779
|
+
});
|
|
780
|
+
let stdout = '';
|
|
781
|
+
let stderr = '';
|
|
782
|
+
proc.stdout?.on('data', (data) => {
|
|
783
|
+
stdout += data.toString();
|
|
784
|
+
});
|
|
785
|
+
proc.stderr?.on('data', (data) => {
|
|
786
|
+
stderr += data.toString();
|
|
787
|
+
});
|
|
788
|
+
proc.on('error', reject);
|
|
789
|
+
proc.on('close', (code) => {
|
|
790
|
+
if (code !== 0) {
|
|
791
|
+
reject(new Error(stderr || `mongosh exited with code ${code}`));
|
|
792
|
+
return;
|
|
793
|
+
}
|
|
794
|
+
try {
|
|
795
|
+
const allDatabases = JSON.parse(stdout.trim());
|
|
796
|
+
const systemDatabases = ['admin', 'config', 'local'];
|
|
797
|
+
const databases = allDatabases.filter((db) => !systemDatabases.includes(db));
|
|
798
|
+
resolve(databases);
|
|
799
|
+
}
|
|
800
|
+
catch (error) {
|
|
801
|
+
reject(new Error(`Failed to parse database list: ${error}`));
|
|
802
|
+
}
|
|
803
|
+
});
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
async createUser(container, options) {
|
|
807
|
+
const { username, password, database } = options;
|
|
808
|
+
assertValidUsername(username);
|
|
809
|
+
const { port } = container;
|
|
810
|
+
const db = database || container.database || 'admin';
|
|
811
|
+
assertValidDatabaseName(db);
|
|
812
|
+
const mongosh = await this.getMongoshPath();
|
|
813
|
+
// Create user with readWrite role on the target database
|
|
814
|
+
// Auth is not enforced (no --auth flag) but user is still created
|
|
815
|
+
// Use JSON.stringify for password to safely escape all special characters in JS context
|
|
816
|
+
// Pass script via stdin to avoid exposing passwords in process listings
|
|
817
|
+
const jsonPwd = JSON.stringify(password);
|
|
818
|
+
const script = `db.getSiblingDB('${db}').createUser({user:'${username}',pwd:${jsonPwd},roles:[{role:'readWrite',db:'${db}'}]})`;
|
|
819
|
+
const mongoshArgs = ['--host', '127.0.0.1', '--port', String(port), 'admin'];
|
|
820
|
+
const runMongoshViaStdin = (js) => new Promise((resolve, reject) => {
|
|
821
|
+
const proc = spawn(mongosh, mongoshArgs, {
|
|
822
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
823
|
+
});
|
|
824
|
+
let stderr = '';
|
|
825
|
+
proc.stderr?.on('data', (data) => {
|
|
826
|
+
stderr += data.toString();
|
|
827
|
+
});
|
|
828
|
+
const timeout = setTimeout(() => {
|
|
829
|
+
proc.kill('SIGTERM');
|
|
830
|
+
reject(new Error('mongosh timed out after 10 seconds'));
|
|
831
|
+
}, 10000);
|
|
832
|
+
proc.on('error', (err) => {
|
|
833
|
+
clearTimeout(timeout);
|
|
834
|
+
reject(err);
|
|
835
|
+
});
|
|
836
|
+
proc.on('close', (code) => {
|
|
837
|
+
clearTimeout(timeout);
|
|
838
|
+
if (code === 0)
|
|
839
|
+
resolve();
|
|
840
|
+
else
|
|
841
|
+
reject(new Error(stderr || `mongosh exited with code ${code}`));
|
|
842
|
+
});
|
|
843
|
+
proc.stdin?.write(js);
|
|
844
|
+
proc.stdin?.end();
|
|
845
|
+
});
|
|
846
|
+
try {
|
|
847
|
+
await runMongoshViaStdin(script);
|
|
848
|
+
}
|
|
849
|
+
catch (error) {
|
|
850
|
+
const err = error;
|
|
851
|
+
if (err.message.includes('51003') ||
|
|
852
|
+
err.message.includes('already exists')) {
|
|
853
|
+
// User exists — update password instead
|
|
854
|
+
const updateScript = `db.getSiblingDB('${db}').updateUser('${username}',{pwd:${jsonPwd}})`;
|
|
855
|
+
await runMongoshViaStdin(updateScript);
|
|
856
|
+
}
|
|
857
|
+
else {
|
|
858
|
+
throw error;
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
const connectionString = `mongodb://${encodeURIComponent(username)}:${encodeURIComponent(password)}@127.0.0.1:${port}/${db}`;
|
|
862
|
+
return {
|
|
863
|
+
username,
|
|
864
|
+
password,
|
|
865
|
+
connectionString,
|
|
866
|
+
engine: container.engine,
|
|
867
|
+
container: container.name,
|
|
868
|
+
database: db,
|
|
869
|
+
};
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
export const mongodbEngine = new MongoDBEngine();
|
|
873
|
+
//# sourceMappingURL=index.js.map
|