sqlew 5.0.8 → 5.2.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/CHANGELOG.md +56 -0
- package/README.md +19 -10
- package/dist/adapters/auth/auth-factory.d.ts +2 -81
- package/dist/adapters/auth/auth-factory.d.ts.map +1 -1
- package/dist/adapters/auth/auth-factory.js +2 -82
- package/dist/adapters/auth/auth-factory.js.map +1 -1
- package/dist/adapters/auth/base-auth-provider.d.ts +18 -303
- package/dist/adapters/auth/base-auth-provider.d.ts.map +1 -1
- package/dist/adapters/auth/base-auth-provider.js +2 -104
- package/dist/adapters/auth/base-auth-provider.js.map +1 -1
- package/dist/adapters/auth/direct-auth-provider.d.ts +4 -348
- package/dist/adapters/auth/direct-auth-provider.d.ts.map +1 -1
- package/dist/adapters/auth/direct-auth-provider.js +6 -356
- package/dist/adapters/auth/direct-auth-provider.js.map +1 -1
- package/dist/adapters/base-adapter.d.ts +31 -598
- package/dist/adapters/base-adapter.d.ts.map +1 -1
- package/dist/adapters/base-adapter.js +10 -458
- package/dist/adapters/base-adapter.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -11
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -11
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/mysql-adapter.d.ts +15 -541
- package/dist/adapters/mysql-adapter.d.ts.map +1 -1
- package/dist/adapters/mysql-adapter.js +24 -561
- package/dist/adapters/mysql-adapter.js.map +1 -1
- package/dist/adapters/postgresql-adapter.d.ts +15 -203
- package/dist/adapters/postgresql-adapter.d.ts.map +1 -1
- package/dist/adapters/postgresql-adapter.js +24 -223
- package/dist/adapters/postgresql-adapter.js.map +1 -1
- package/dist/adapters/sqlite-adapter.d.ts +4 -28
- package/dist/adapters/sqlite-adapter.d.ts.map +1 -1
- package/dist/adapters/sqlite-adapter.js +4 -32
- package/dist/adapters/sqlite-adapter.js.map +1 -1
- package/dist/adapters/types.d.ts +1 -4
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/backend/backend-factory.d.ts +3 -3
- package/dist/backend/backend-factory.js +3 -3
- package/dist/backend/local-backend.d.ts.map +1 -1
- package/dist/backend/local-backend.js +0 -5
- package/dist/backend/local-backend.js.map +1 -1
- package/dist/cli/db-export.d.ts.map +1 -1
- package/dist/cli/db-export.js +54 -32
- package/dist/cli/db-export.js.map +1 -1
- package/dist/cli/db-import.d.ts.map +1 -1
- package/dist/cli/db-import.js +32 -31
- package/dist/cli/db-import.js.map +1 -1
- package/dist/cli/hooks/on-exit-plan.d.ts.map +1 -1
- package/dist/cli/hooks/on-exit-plan.js +42 -1
- package/dist/cli/hooks/on-exit-plan.js.map +1 -1
- package/dist/cli/hooks/on-prompt.d.ts.map +1 -1
- package/dist/cli/hooks/on-prompt.js +5 -0
- package/dist/cli/hooks/on-prompt.js.map +1 -1
- package/dist/cli/hooks/plan-processor.d.ts.map +1 -1
- package/dist/cli/hooks/plan-processor.js +16 -2
- package/dist/cli/hooks/plan-processor.js.map +1 -1
- package/dist/cli/hooks/stdin-parser.d.ts +41 -0
- package/dist/cli/hooks/stdin-parser.d.ts.map +1 -1
- package/dist/cli/hooks/stdin-parser.js +140 -4
- package/dist/cli/hooks/stdin-parser.js.map +1 -1
- package/dist/cli/hooks/track-plan.d.ts +13 -0
- package/dist/cli/hooks/track-plan.d.ts.map +1 -1
- package/dist/cli/hooks/track-plan.js +58 -3
- package/dist/cli/hooks/track-plan.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -12
- package/dist/cli.js.map +1 -1
- package/dist/config/cloud-config-loader.d.ts +8 -8
- package/dist/config/cloud-config-loader.d.ts.map +1 -1
- package/dist/config/cloud-config-loader.js +12 -12
- package/dist/config/cloud-config-loader.js.map +1 -1
- package/dist/config/global-config.d.ts +24 -46
- package/dist/config/global-config.d.ts.map +1 -1
- package/dist/config/global-config.js +174 -56
- package/dist/config/global-config.js.map +1 -1
- package/dist/config/loader.d.ts +1 -18
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +1 -89
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +2 -64
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +0 -18
- package/dist/config/types.js.map +1 -1
- package/dist/database/index.d.ts +1 -2
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +1 -3
- package/dist/database/index.js.map +1 -1
- package/dist/database/migrations/v4/20251126000001_v4_migrate_data.d.ts.map +1 -1
- package/dist/database/migrations/v4/20251126000001_v4_migrate_data.js +2 -1
- package/dist/database/migrations/v4/20251126000001_v4_migrate_data.js.map +1 -1
- package/dist/database/operations/queries.d.ts +0 -4
- package/dist/database/operations/queries.d.ts.map +1 -1
- package/dist/database/operations/queries.js +0 -8
- package/dist/database/operations/queries.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/init-rules.d.ts.map +1 -1
- package/dist/init-rules.js +0 -1
- package/dist/init-rules.js.map +1 -1
- package/dist/knexfile.d.ts.map +1 -1
- package/dist/knexfile.js +2 -1
- package/dist/knexfile.js.map +1 -1
- package/dist/migration/local-to-global.d.ts +19 -0
- package/dist/migration/local-to-global.d.ts.map +1 -0
- package/dist/migration/local-to-global.js +133 -0
- package/dist/migration/local-to-global.js.map +1 -0
- package/dist/saas-connector/client/types.d.ts +1 -1
- package/dist/saas-connector/client/types.d.ts.map +1 -1
- package/dist/schema.js +1 -1
- package/dist/server/setup.d.ts.map +1 -1
- package/dist/server/setup.js +15 -7
- package/dist/server/setup.js.map +1 -1
- package/dist/tests/backend/backend-factory.test.js +2 -2
- package/dist/tests/backend/backend-factory.test.js.map +1 -1
- package/dist/tests/docker/native/constraint-operations.test.d.ts +2 -17
- package/dist/tests/docker/native/constraint-operations.test.d.ts.map +1 -1
- package/dist/tests/docker/native/constraint-operations.test.js +3 -82
- package/dist/tests/docker/native/constraint-operations.test.js.map +1 -1
- package/dist/tests/docker/native/db-init.d.ts +3 -34
- package/dist/tests/docker/native/db-init.d.ts.map +1 -1
- package/dist/tests/docker/native/db-init.js +15 -77
- package/dist/tests/docker/native/db-init.js.map +1 -1
- package/dist/tests/docker/native/decision-operations.test.d.ts +2 -10
- package/dist/tests/docker/native/decision-operations.test.d.ts.map +1 -1
- package/dist/tests/docker/native/decision-operations.test.js +2 -84
- package/dist/tests/docker/native/decision-operations.test.js.map +1 -1
- package/dist/tests/docker/native/help-system.test.d.ts +2 -5
- package/dist/tests/docker/native/help-system.test.d.ts.map +1 -1
- package/dist/tests/docker/native/help-system.test.js +2 -47
- package/dist/tests/docker/native/help-system.test.js.map +1 -1
- package/dist/tests/docker/native/suggest-tool.test.d.ts +3 -11
- package/dist/tests/docker/native/suggest-tool.test.d.ts.map +1 -1
- package/dist/tests/docker/native/suggest-tool.test.js +3 -60
- package/dist/tests/docker/native/suggest-tool.test.js.map +1 -1
- package/dist/tests/docker/native/test-harness.d.ts +2 -23
- package/dist/tests/docker/native/test-harness.d.ts.map +1 -1
- package/dist/tests/docker/native/test-harness.js +5 -59
- package/dist/tests/docker/native/test-harness.js.map +1 -1
- package/dist/tests/feature/decision/analytics.test.js +2 -1
- package/dist/tests/feature/decision/analytics.test.js.map +1 -1
- package/dist/tests/feature/decision/batch-validation-comprehensive.test.js +2 -7
- package/dist/tests/feature/decision/batch-validation-comprehensive.test.js.map +1 -1
- package/dist/tests/feature/decision/batch-validation.test.js +2 -1
- package/dist/tests/feature/decision/batch-validation.test.js.map +1 -1
- package/dist/tests/integration/auto-trigger-suggestions.test.js +4 -37
- package/dist/tests/integration/auto-trigger-suggestions.test.js.map +1 -1
- package/dist/tests/integration/hybrid-similarity-detection.test.js +2 -1
- package/dist/tests/integration/hybrid-similarity-detection.test.js.map +1 -1
- package/dist/tests/integration/json-export-import.test.d.ts.map +1 -0
- package/dist/tests/integration/json-export-import.test.js.map +1 -0
- package/dist/tests/unit/case-insensitive-validator.test.d.ts +0 -7
- package/dist/tests/unit/case-insensitive-validator.test.d.ts.map +1 -1
- package/dist/tests/unit/case-insensitive-validator.test.js +0 -22
- package/dist/tests/unit/case-insensitive-validator.test.js.map +1 -1
- package/dist/tests/unit/config/cloud-config-loader.test.js +4 -2
- package/dist/tests/unit/config/cloud-config-loader.test.js.map +1 -1
- package/dist/tests/unit/config/global-db-migration.test.d.ts +12 -0
- package/dist/tests/unit/config/global-db-migration.test.d.ts.map +1 -0
- package/dist/tests/unit/config/global-db-migration.test.js +117 -0
- package/dist/tests/unit/config/global-db-migration.test.js.map +1 -0
- package/dist/tests/unit/constraint-scorer.test.d.ts +2 -7
- package/dist/tests/unit/constraint-scorer.test.d.ts.map +1 -1
- package/dist/tests/unit/constraint-scorer.test.js +2 -28
- package/dist/tests/unit/constraint-scorer.test.js.map +1 -1
- package/dist/tests/unit/hooks/grok-hook-normalization.test.d.ts +9 -0
- package/dist/tests/unit/hooks/grok-hook-normalization.test.d.ts.map +1 -0
- package/dist/tests/unit/hooks/grok-hook-normalization.test.js +98 -0
- package/dist/tests/unit/hooks/grok-hook-normalization.test.js.map +1 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.d.ts +7 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.d.ts.map +1 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.js +55 -0
- package/dist/tests/unit/hooks/grok-plan-template-injection.test.js.map +1 -0
- package/dist/tests/unit/universal-knex.test.js +9 -0
- package/dist/tests/unit/universal-knex.test.js.map +1 -1
- package/dist/tests/unit/validation/parameter-validation.test.js +0 -24
- package/dist/tests/unit/validation/parameter-validation.test.js.map +1 -1
- package/dist/tests/utils/db-config.d.ts.map +1 -1
- package/dist/tests/utils/db-config.js +0 -9
- package/dist/tests/utils/db-config.js.map +1 -1
- package/dist/tests/utils/db-import.d.ts.map +1 -1
- package/dist/tests/utils/db-import.js +0 -3
- package/dist/tests/utils/db-import.js.map +1 -1
- package/dist/tests/utils/db-schema.d.ts.map +1 -1
- package/dist/tests/utils/db-schema.js +48 -51
- package/dist/tests/utils/db-schema.js.map +1 -1
- package/dist/tests/utils/db-seeding.d.ts.map +1 -1
- package/dist/tests/utils/db-seeding.js +0 -3
- package/dist/tests/utils/db-seeding.js.map +1 -1
- package/dist/tests/utils/index.d.ts +0 -1
- package/dist/tests/utils/index.d.ts.map +1 -1
- package/dist/tests/utils/index.js +0 -2
- package/dist/tests/utils/index.js.map +1 -1
- package/dist/tests/utils/test-helpers.d.ts +6 -76
- package/dist/tests/utils/test-helpers.d.ts.map +1 -1
- package/dist/tests/utils/test-helpers.js +56 -162
- package/dist/tests/utils/test-helpers.js.map +1 -1
- package/dist/tests/utils/test-lifecycle.d.ts +2 -28
- package/dist/tests/utils/test-lifecycle.d.ts.map +1 -1
- package/dist/tests/utils/test-lifecycle.js +2 -31
- package/dist/tests/utils/test-lifecycle.js.map +1 -1
- package/dist/tools/context/index.d.ts +0 -1
- package/dist/tools/context/index.d.ts.map +1 -1
- package/dist/tools/context/index.js +0 -2
- package/dist/tools/context/index.js.map +1 -1
- package/dist/tools/context/types.d.ts +1 -1
- package/dist/tools/context/types.d.ts.map +1 -1
- package/dist/types/actions.d.ts +6 -29
- package/dist/types/actions.d.ts.map +1 -1
- package/dist/types/actions.js +1 -2
- package/dist/types/actions.js.map +1 -1
- package/dist/types/constraint/params.d.ts +24 -1
- package/dist/types/constraint/params.d.ts.map +1 -1
- package/dist/types/constraint/params.js +3 -0
- package/dist/types/constraint/params.js.map +1 -1
- package/dist/types/constraint/responses.d.ts +18 -1
- package/dist/types/constraint/responses.d.ts.map +1 -1
- package/dist/types/constraint/responses.js +3 -0
- package/dist/types/constraint/responses.js.map +1 -1
- package/dist/types/decision/batch.d.ts +2 -5
- package/dist/types/decision/batch.d.ts.map +1 -1
- package/dist/types/decision/batch.js +3 -3
- package/dist/types/decision/batch.js.map +1 -1
- package/dist/types/decision/params.d.ts +7 -4
- package/dist/types/decision/params.d.ts.map +1 -1
- package/dist/types/decision/responses.d.ts +49 -35
- package/dist/types/decision/responses.d.ts.map +1 -1
- package/dist/types/decision/templates.d.ts +2 -18
- package/dist/types/decision/templates.d.ts.map +1 -1
- package/dist/types/decision/templates.js +3 -3
- package/dist/types/decision/templates.js.map +1 -1
- package/dist/types/enums.d.ts +11 -13
- package/dist/types/enums.d.ts.map +1 -1
- package/dist/types/enums.js +5 -13
- package/dist/types/enums.js.map +1 -1
- package/dist/types/import-export.d.ts +7 -30
- package/dist/types/import-export.d.ts.map +1 -1
- package/dist/types/import-export.js +1 -2
- package/dist/types/import-export.js.map +1 -1
- package/dist/types/index.d.ts +18 -22
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +4 -32
- package/dist/types/index.js.map +1 -1
- package/dist/types/master-entities.d.ts +1 -10
- package/dist/types/master-entities.d.ts.map +1 -1
- package/dist/types/master-entities.js +1 -2
- package/dist/types/master-entities.js.map +1 -1
- package/dist/types/transaction-entities.d.ts +2 -21
- package/dist/types/transaction-entities.d.ts.map +1 -1
- package/dist/types/transaction-entities.js +1 -1
- package/dist/types/validation.d.ts +1 -16
- package/dist/types/validation.d.ts.map +1 -1
- package/dist/types/validation.js +1 -2
- package/dist/types/validation.js.map +1 -1
- package/dist/types/view-entities.d.ts +3 -12
- package/dist/types/view-entities.d.ts.map +1 -1
- package/dist/types/view-entities.js +1 -1
- package/dist/types.d.ts +4 -718
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -39
- package/dist/types.js.map +1 -1
- package/dist/utils/parameter-validator.d.ts +2 -2
- package/dist/utils/parameter-validator.d.ts.map +1 -1
- package/dist/utils/parameter-validator.js.map +1 -1
- package/dist/utils/path-normalize.d.ts +23 -0
- package/dist/utils/path-normalize.d.ts.map +1 -0
- package/dist/utils/path-normalize.js +38 -0
- package/dist/utils/path-normalize.js.map +1 -0
- package/dist/utils/project-root.d.ts +6 -3
- package/dist/utils/project-root.d.ts.map +1 -1
- package/dist/utils/project-root.js +11 -3
- package/dist/utils/project-root.js.map +1 -1
- package/dist/watcher/base-watcher.d.ts +0 -4
- package/dist/watcher/base-watcher.d.ts.map +1 -1
- package/dist/watcher/base-watcher.js +11 -22
- package/dist/watcher/base-watcher.js.map +1 -1
- package/docs/CLI_USAGE.md +27 -107
- package/docs/CONFIGURATION.md +10 -5
- package/docs/DATABASE_AUTH.md +3 -3
- package/docs/HOOKS_GUIDE.md +40 -6
- package/docs/MIGRATION_TO_SAAS.md +2 -2
- package/docs/SHARED_DATABASE.md +108 -0
- package/package.json +4 -3
- package/dist/adapters/auth/auth-types.d.ts +0 -30
- package/dist/adapters/auth/auth-types.d.ts.map +0 -1
- package/dist/adapters/auth/auth-types.js +0 -30
- package/dist/adapters/auth/auth-types.js.map +0 -1
- package/dist/cli/db-dump.d.ts +0 -36
- package/dist/cli/db-dump.d.ts.map +0 -1
- package/dist/cli/db-dump.js +0 -384
- package/dist/cli/db-dump.js.map +0 -1
- package/dist/database/config/config-ops.d.ts +0 -42
- package/dist/database/config/config-ops.d.ts.map +0 -1
- package/dist/database/config/config-ops.js +0 -102
- package/dist/database/config/config-ops.js.map +0 -1
- package/dist/formatters/adr-formatter.d.ts +0 -22
- package/dist/formatters/adr-formatter.d.ts.map +0 -1
- package/dist/formatters/adr-formatter.js +0 -127
- package/dist/formatters/adr-formatter.js.map +0 -1
- package/dist/formatters/confluence-formatter.d.ts +0 -26
- package/dist/formatters/confluence-formatter.d.ts.map +0 -1
- package/dist/formatters/confluence-formatter.js +0 -129
- package/dist/formatters/confluence-formatter.js.map +0 -1
- package/dist/formatters/index.d.ts +0 -34
- package/dist/formatters/index.d.ts.map +0 -1
- package/dist/formatters/index.js +0 -57
- package/dist/formatters/index.js.map +0 -1
- package/dist/formatters/markdown-formatter.d.ts +0 -16
- package/dist/formatters/markdown-formatter.d.ts.map +0 -1
- package/dist/formatters/markdown-formatter.js +0 -110
- package/dist/formatters/markdown-formatter.js.map +0 -1
- package/dist/formatters/notion-formatter.d.ts +0 -29
- package/dist/formatters/notion-formatter.d.ts.map +0 -1
- package/dist/formatters/notion-formatter.js +0 -177
- package/dist/formatters/notion-formatter.js.map +0 -1
- package/dist/formatters/types.d.ts +0 -31
- package/dist/formatters/types.d.ts.map +0 -1
- package/dist/formatters/types.js +0 -6
- package/dist/formatters/types.js.map +0 -1
- package/dist/tests/database/sql-dump/converters.test.d.ts +0 -7
- package/dist/tests/database/sql-dump/converters.test.d.ts.map +0 -1
- package/dist/tests/database/sql-dump/converters.test.js +0 -314
- package/dist/tests/database/sql-dump/converters.test.js.map +0 -1
- package/dist/tests/database/sql-dump/default-conversions.test.d.ts +0 -8
- package/dist/tests/database/sql-dump/default-conversions.test.d.ts.map +0 -1
- package/dist/tests/database/sql-dump/default-conversions.test.js +0 -141
- package/dist/tests/database/sql-dump/default-conversions.test.js.map +0 -1
- package/dist/tests/database/sql-dump/table-ordering.test.d.ts +0 -27
- package/dist/tests/database/sql-dump/table-ordering.test.d.ts.map +0 -1
- package/dist/tests/database/sql-dump/table-ordering.test.js +0 -284
- package/dist/tests/database/sql-dump/table-ordering.test.js.map +0 -1
- package/dist/tests/database/sql-dump/type-conversion.test.d.ts +0 -8
- package/dist/tests/database/sql-dump/type-conversion.test.d.ts.map +0 -1
- package/dist/tests/database/sql-dump/type-conversion.test.js +0 -361
- package/dist/tests/database/sql-dump/type-conversion.test.js.map +0 -1
- package/dist/tests/docker/cross-database.test.d.ts +0 -21
- package/dist/tests/docker/cross-database.test.d.ts.map +0 -1
- package/dist/tests/docker/cross-database.test.js +0 -308
- package/dist/tests/docker/cross-database.test.js.map +0 -1
- package/dist/tests/docker/dump-import.test.d.ts +0 -15
- package/dist/tests/docker/dump-import.test.d.ts.map +0 -1
- package/dist/tests/docker/dump-import.test.js +0 -424
- package/dist/tests/docker/dump-import.test.js.map +0 -1
- package/dist/tests/docker/fk-constraints.test.d.ts +0 -13
- package/dist/tests/docker/fk-constraints.test.d.ts.map +0 -1
- package/dist/tests/docker/fk-constraints.test.js +0 -381
- package/dist/tests/docker/fk-constraints.test.js.map +0 -1
- package/dist/tests/docker/indexes.test.d.ts +0 -12
- package/dist/tests/docker/indexes.test.d.ts.map +0 -1
- package/dist/tests/docker/indexes.test.js +0 -250
- package/dist/tests/docker/indexes.test.js.map +0 -1
- package/dist/tests/docker/integration.test.d.ts +0 -16
- package/dist/tests/docker/integration.test.d.ts.map +0 -1
- package/dist/tests/docker/integration.test.js +0 -323
- package/dist/tests/docker/integration.test.js.map +0 -1
- package/dist/tests/docker/multi-project-migration.test.d.ts +0 -17
- package/dist/tests/docker/multi-project-migration.test.d.ts.map +0 -1
- package/dist/tests/docker/multi-project-migration.test.js +0 -394
- package/dist/tests/docker/multi-project-migration.test.js.map +0 -1
- package/dist/tests/docker/schema-migration.test.d.ts +0 -8
- package/dist/tests/docker/schema-migration.test.d.ts.map +0 -1
- package/dist/tests/docker/schema-migration.test.js +0 -98
- package/dist/tests/docker/schema-migration.test.js.map +0 -1
- package/dist/tests/integration/e2e-workflow1-debug.test.d.ts +0 -5
- package/dist/tests/integration/e2e-workflow1-debug.test.d.ts.map +0 -1
- package/dist/tests/integration/e2e-workflow1-debug.test.js +0 -85
- package/dist/tests/integration/e2e-workflow1-debug.test.js.map +0 -1
- package/dist/tests/integration/suggest-simple.test.d.ts +0 -5
- package/dist/tests/integration/suggest-simple.test.d.ts.map +0 -1
- package/dist/tests/integration/suggest-simple.test.js +0 -90
- package/dist/tests/integration/suggest-simple.test.js.map +0 -1
- package/dist/tests/migrations/test-all-versions-real.d.ts +0 -8
- package/dist/tests/migrations/test-all-versions-real.d.ts.map +0 -1
- package/dist/tests/migrations/test-all-versions-real.js +0 -236
- package/dist/tests/migrations/test-all-versions-real.js.map +0 -1
- package/dist/tests/migrations/test-all-versions.d.ts +0 -14
- package/dist/tests/migrations/test-all-versions.d.ts.map +0 -1
- package/dist/tests/migrations/test-all-versions.js +0 -519
- package/dist/tests/migrations/test-all-versions.js.map +0 -1
- package/dist/tests/migrations/v4/v4-fresh-install.test.d.ts +0 -7
- package/dist/tests/migrations/v4/v4-fresh-install.test.d.ts.map +0 -1
- package/dist/tests/migrations/v4/v4-fresh-install.test.js +0 -168
- package/dist/tests/migrations/v4/v4-fresh-install.test.js.map +0 -1
- package/dist/tests/migrations/v4/v4-migrate-data.test.d.ts +0 -13
- package/dist/tests/migrations/v4/v4-migrate-data.test.d.ts.map +0 -1
- package/dist/tests/migrations/v4/v4-migrate-data.test.js +0 -264
- package/dist/tests/migrations/v4/v4-migrate-data.test.js.map +0 -1
- package/dist/tests/unit/utils/case-insensitive-validator.test.d.ts +0 -2
- package/dist/tests/unit/utils/case-insensitive-validator.test.d.ts.map +0 -1
- package/dist/tests/unit/utils/case-insensitive-validator.test.js +0 -97
- package/dist/tests/unit/utils/case-insensitive-validator.test.js.map +0 -1
- package/dist/tests/utils/json-export-import.test.d.ts.map +0 -1
- package/dist/tests/utils/json-export-import.test.js.map +0 -1
- package/dist/tests/utils/task-helpers.d.ts +0 -67
- package/dist/tests/utils/task-helpers.d.ts.map +0 -1
- package/dist/tests/utils/task-helpers.js +0 -134
- package/dist/tests/utils/task-helpers.js.map +0 -1
- package/dist/tools/context/actions/export.d.ts +0 -35
- package/dist/tools/context/actions/export.d.ts.map +0 -1
- package/dist/tools/context/actions/export.js +0 -93
- package/dist/tools/context/actions/export.js.map +0 -1
- package/dist/types/file/params.d.ts +0 -40
- package/dist/types/file/params.d.ts.map +0 -1
- package/dist/types/file/params.js +0 -6
- package/dist/types/file/params.js.map +0 -1
- package/dist/types/file/responses.d.ts +0 -2
- package/dist/types/file/responses.d.ts.map +0 -1
- package/dist/types/file/responses.js +0 -2
- package/dist/types/file/responses.js.map +0 -1
- package/dist/types/task/params.d.ts +0 -173
- package/dist/types/task/params.d.ts.map +0 -1
- package/dist/types/task/params.js +0 -8
- package/dist/types/task/params.js.map +0 -1
- package/dist/types/task/responses.d.ts +0 -334
- package/dist/types/task/responses.d.ts.map +0 -1
- package/dist/types/task/responses.js +0 -8
- package/dist/types/task/responses.js.map +0 -1
- package/dist/utils/sql-dump/core/dependency-sort.d.ts +0 -16
- package/dist/utils/sql-dump/core/dependency-sort.d.ts.map +0 -1
- package/dist/utils/sql-dump/core/dependency-sort.js +0 -105
- package/dist/utils/sql-dump/core/dependency-sort.js.map +0 -1
- package/dist/utils/sql-dump/core/generate-dump.d.ts +0 -13
- package/dist/utils/sql-dump/core/generate-dump.d.ts.map +0 -1
- package/dist/utils/sql-dump/core/generate-dump.js +0 -201
- package/dist/utils/sql-dump/core/generate-dump.js.map +0 -1
- package/dist/utils/sql-dump/core/index-export.d.ts +0 -10
- package/dist/utils/sql-dump/core/index-export.d.ts.map +0 -1
- package/dist/utils/sql-dump/core/index-export.js +0 -173
- package/dist/utils/sql-dump/core/index-export.js.map +0 -1
- package/dist/utils/sql-dump/core/sequence-reset.d.ts +0 -6
- package/dist/utils/sql-dump/core/sequence-reset.d.ts.map +0 -1
- package/dist/utils/sql-dump/core/sequence-reset.js +0 -28
- package/dist/utils/sql-dump/core/sequence-reset.js.map +0 -1
- package/dist/utils/sql-dump/core/table-export.d.ts +0 -2
- package/dist/utils/sql-dump/core/table-export.d.ts.map +0 -1
- package/dist/utils/sql-dump/core/table-export.js +0 -4
- package/dist/utils/sql-dump/core/table-export.js.map +0 -1
- package/dist/utils/sql-dump/core/view-export.d.ts +0 -2
- package/dist/utils/sql-dump/core/view-export.d.ts.map +0 -1
- package/dist/utils/sql-dump/core/view-export.js +0 -4
- package/dist/utils/sql-dump/core/view-export.js.map +0 -1
- package/dist/utils/sql-dump/formatters/bulk-insert.d.ts +0 -14
- package/dist/utils/sql-dump/formatters/bulk-insert.d.ts.map +0 -1
- package/dist/utils/sql-dump/formatters/bulk-insert.js +0 -177
- package/dist/utils/sql-dump/formatters/bulk-insert.js.map +0 -1
- package/dist/utils/sql-dump/formatters/identifiers.d.ts +0 -6
- package/dist/utils/sql-dump/formatters/identifiers.d.ts.map +0 -1
- package/dist/utils/sql-dump/formatters/identifiers.js +0 -16
- package/dist/utils/sql-dump/formatters/identifiers.js.map +0 -1
- package/dist/utils/sql-dump/formatters/value-formatter.d.ts +0 -14
- package/dist/utils/sql-dump/formatters/value-formatter.d.ts.map +0 -1
- package/dist/utils/sql-dump/formatters/value-formatter.js +0 -281
- package/dist/utils/sql-dump/formatters/value-formatter.js.map +0 -1
- package/dist/utils/sql-dump/generators/controls.d.ts +0 -10
- package/dist/utils/sql-dump/generators/controls.d.ts.map +0 -1
- package/dist/utils/sql-dump/generators/controls.js +0 -36
- package/dist/utils/sql-dump/generators/controls.js.map +0 -1
- package/dist/utils/sql-dump/generators/headers.d.ts +0 -6
- package/dist/utils/sql-dump/generators/headers.d.ts.map +0 -1
- package/dist/utils/sql-dump/generators/headers.js +0 -19
- package/dist/utils/sql-dump/generators/headers.js.map +0 -1
- package/dist/utils/sql-dump/index.d.ts +0 -14
- package/dist/utils/sql-dump/index.d.ts.map +0 -1
- package/dist/utils/sql-dump/index.js +0 -16
- package/dist/utils/sql-dump/index.js.map +0 -1
- package/dist/utils/sql-dump/schema/indexes.d.ts +0 -20
- package/dist/utils/sql-dump/schema/indexes.d.ts.map +0 -1
- package/dist/utils/sql-dump/schema/indexes.js +0 -108
- package/dist/utils/sql-dump/schema/indexes.js.map +0 -1
- package/dist/utils/sql-dump/schema/primary-keys.d.ts +0 -6
- package/dist/utils/sql-dump/schema/primary-keys.d.ts.map +0 -1
- package/dist/utils/sql-dump/schema/primary-keys.js +0 -41
- package/dist/utils/sql-dump/schema/primary-keys.js.map +0 -1
- package/dist/utils/sql-dump/schema/tables.d.ts +0 -15
- package/dist/utils/sql-dump/schema/tables.d.ts.map +0 -1
- package/dist/utils/sql-dump/schema/tables.js +0 -518
- package/dist/utils/sql-dump/schema/tables.js.map +0 -1
- package/dist/utils/sql-dump/schema/views.d.ts +0 -11
- package/dist/utils/sql-dump/schema/views.d.ts.map +0 -1
- package/dist/utils/sql-dump/schema/views.js +0 -116
- package/dist/utils/sql-dump/schema/views.js.map +0 -1
- package/dist/utils/sql-dump/types.d.ts +0 -10
- package/dist/utils/sql-dump/types.d.ts.map +0 -1
- package/dist/utils/sql-dump/types.js +0 -3
- package/dist/utils/sql-dump/types.js.map +0 -1
- package/dist/utils/sql-dump-converters.d.ts +0 -188
- package/dist/utils/sql-dump-converters.d.ts.map +0 -1
- package/dist/utils/sql-dump-converters.js +0 -315
- package/dist/utils/sql-dump-converters.js.map +0 -1
- package/dist/watcher/gitignore-parser.d.ts +0 -70
- package/dist/watcher/gitignore-parser.d.ts.map +0 -1
- package/dist/watcher/gitignore-parser.js +0 -195
- package/dist/watcher/gitignore-parser.js.map +0 -1
- package/dist/watcher/index.d.ts +0 -9
- package/dist/watcher/index.d.ts.map +0 -1
- package/dist/watcher/index.js +0 -8
- package/dist/watcher/index.js.map +0 -1
- /package/dist/tests/{utils → integration}/json-export-import.test.d.ts +0 -0
- /package/dist/tests/{utils → integration}/json-export-import.test.js +0 -0
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Multi-Project Schema Migration Tests (v3.7.0)
|
|
3
|
-
*
|
|
4
|
-
* Tests comprehensive cross-database migration following user requirements:
|
|
5
|
-
* 1. Initialize SQLite, MySQL, MariaDB, PostgreSQL with migrations
|
|
6
|
-
* 2. Seed each database with multi-project test data
|
|
7
|
-
* 3. Export each database using sql-dump
|
|
8
|
-
* 4. Drop all schemas
|
|
9
|
-
* 5. Test whether dump SQL can be imported to all databases
|
|
10
|
-
*
|
|
11
|
-
* Uses DRY shared test utilities from test-helpers.ts
|
|
12
|
-
*
|
|
13
|
-
* NOTE: These tests require Docker containers (MySQL, MariaDB, PostgreSQL)
|
|
14
|
-
* Set SKIP_DOCKER_TESTS=true or CI=true to skip in CI environments
|
|
15
|
-
*/
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=multi-project-migration.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multi-project-migration.test.d.ts","sourceRoot":"","sources":["../../../src/tests/docker/multi-project-migration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -1,394 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Multi-Project Schema Migration Tests (v3.7.0)
|
|
3
|
-
*
|
|
4
|
-
* Tests comprehensive cross-database migration following user requirements:
|
|
5
|
-
* 1. Initialize SQLite, MySQL, MariaDB, PostgreSQL with migrations
|
|
6
|
-
* 2. Seed each database with multi-project test data
|
|
7
|
-
* 3. Export each database using sql-dump
|
|
8
|
-
* 4. Drop all schemas
|
|
9
|
-
* 5. Test whether dump SQL can be imported to all databases
|
|
10
|
-
*
|
|
11
|
-
* Uses DRY shared test utilities from test-helpers.ts
|
|
12
|
-
*
|
|
13
|
-
* NOTE: These tests require Docker containers (MySQL, MariaDB, PostgreSQL)
|
|
14
|
-
* Set SKIP_DOCKER_TESTS=true or CI=true to skip in CI environments
|
|
15
|
-
*/
|
|
16
|
-
// Skip Docker-dependent tests in CI environments
|
|
17
|
-
if (process.env.SKIP_DOCKER_TESTS === 'true' || process.env.CI === 'true') {
|
|
18
|
-
console.log('⏭️ Skipping Docker-dependent multi-project migration tests (CI environment)');
|
|
19
|
-
process.exit(0);
|
|
20
|
-
}
|
|
21
|
-
// Skip when run as part of broader test suites (Docker containers are shared resources)
|
|
22
|
-
// Only run when explicitly invoked via 'npm run test:docker' or run individually
|
|
23
|
-
const isDockerTestSuite = process.env.npm_lifecycle_event === 'test:docker';
|
|
24
|
-
const isMainTestSuite = process.env.npm_lifecycle_event === 'test' ||
|
|
25
|
-
process.env.npm_lifecycle_event === 'test:database' ||
|
|
26
|
-
process.env.npm_lifecycle_event === 'test:integration';
|
|
27
|
-
if (!isDockerTestSuite && isMainTestSuite) {
|
|
28
|
-
console.log('⏭️ Skipping Docker-dependent tests (requires exclusive Docker access)');
|
|
29
|
-
console.log(' Run individually or use: npm run test:docker');
|
|
30
|
-
process.exit(0);
|
|
31
|
-
}
|
|
32
|
-
import { describe, it, before, after } from 'node:test';
|
|
33
|
-
import assert from 'node:assert';
|
|
34
|
-
import { generateSqlDump } from '../../utils/sql-dump/index.js';
|
|
35
|
-
import { getDbConfig, connectDb, disconnectDb, dropAllTables, getTables, assertTableCountsMatch, assertRowCountsMatch, assertFKConstraintsExist, seedTestData, assertSeededDataExists, importSqlToDocker, } from '../utils/test-helpers.js';
|
|
36
|
-
import { join } from 'node:path';
|
|
37
|
-
import { existsSync, mkdirSync, unlinkSync } from 'node:fs';
|
|
38
|
-
// Test database path
|
|
39
|
-
const testDbPath = join(process.cwd(), '.sqlew/test-multi-project.db');
|
|
40
|
-
describe('Multi-Project Schema Migration Tests (v3.7.0)', () => {
|
|
41
|
-
let sqliteDb;
|
|
42
|
-
let mysqlDb;
|
|
43
|
-
let mariadbDb;
|
|
44
|
-
let postgresDb;
|
|
45
|
-
before(async () => {
|
|
46
|
-
console.log(' 📦 Setting up test databases...');
|
|
47
|
-
// Ensure test directory exists
|
|
48
|
-
const testDir = join(process.cwd(), '.sqlew');
|
|
49
|
-
if (!existsSync(testDir)) {
|
|
50
|
-
mkdirSync(testDir, { recursive: true });
|
|
51
|
-
}
|
|
52
|
-
// Remove existing test database
|
|
53
|
-
if (existsSync(testDbPath)) {
|
|
54
|
-
unlinkSync(testDbPath);
|
|
55
|
-
}
|
|
56
|
-
// Connect to all databases
|
|
57
|
-
const sqliteConfig = getDbConfig('sqlite', testDbPath);
|
|
58
|
-
const mysqlConfig = getDbConfig('mysql');
|
|
59
|
-
const mariadbConfig = getDbConfig('mariadb');
|
|
60
|
-
const postgresConfig = getDbConfig('postgresql');
|
|
61
|
-
sqliteDb = await connectDb(sqliteConfig);
|
|
62
|
-
mysqlDb = await connectDb(mysqlConfig);
|
|
63
|
-
mariadbDb = await connectDb(mariadbConfig);
|
|
64
|
-
postgresDb = await connectDb(postgresConfig);
|
|
65
|
-
console.log(' ✅ All databases connected');
|
|
66
|
-
});
|
|
67
|
-
after(async () => {
|
|
68
|
-
if (sqliteDb)
|
|
69
|
-
await disconnectDb(sqliteDb);
|
|
70
|
-
if (mysqlDb)
|
|
71
|
-
await disconnectDb(mysqlDb);
|
|
72
|
-
if (mariadbDb)
|
|
73
|
-
await disconnectDb(mariadbDb);
|
|
74
|
-
if (postgresDb)
|
|
75
|
-
await disconnectDb(postgresDb);
|
|
76
|
-
// Clean up test database
|
|
77
|
-
if (existsSync(testDbPath)) {
|
|
78
|
-
unlinkSync(testDbPath);
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
// ========================================================================
|
|
82
|
-
// REQUIREMENT 1: Initialize databases with migrations
|
|
83
|
-
// ========================================================================
|
|
84
|
-
describe('Requirement 1: Initialize databases with migrations', () => {
|
|
85
|
-
it('should initialize SQLite with migrations', async () => {
|
|
86
|
-
console.log(' 🔄 Running SQLite migrations...');
|
|
87
|
-
const [batchNo, log] = await sqliteDb.migrate.latest();
|
|
88
|
-
console.log(` ✅ Migrations completed (batch ${batchNo}, ${log.length} migrations)`);
|
|
89
|
-
// Verify multi-project tables exist
|
|
90
|
-
const hasMProjects = await sqliteDb.schema.hasTable('m_projects');
|
|
91
|
-
const hasTDecisions = await sqliteDb.schema.hasTable('t_decisions');
|
|
92
|
-
const hasTTasks = await sqliteDb.schema.hasTable('v4_tasks');
|
|
93
|
-
assert.ok(hasMProjects, 'Should have m_projects table');
|
|
94
|
-
assert.ok(hasTDecisions, 'Should have t_decisions table');
|
|
95
|
-
assert.ok(hasTTasks, 'Should have v4_tasks table');
|
|
96
|
-
// Verify project_id columns exist
|
|
97
|
-
const hasProjectIdInDecisions = await sqliteDb.schema.hasColumn('t_decisions', 'project_id');
|
|
98
|
-
const hasProjectIdInTasks = await sqliteDb.schema.hasColumn('v4_tasks', 'project_id');
|
|
99
|
-
assert.ok(hasProjectIdInDecisions, 't_decisions should have project_id');
|
|
100
|
-
assert.ok(hasProjectIdInTasks, 'v4_tasks should have project_id');
|
|
101
|
-
console.log(' ✅ Multi-project schema verified');
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
// ========================================================================
|
|
105
|
-
// REQUIREMENT 2: Seed each database with test data
|
|
106
|
-
// ========================================================================
|
|
107
|
-
describe('Requirement 2: Seed with multi-project test data', () => {
|
|
108
|
-
it('should seed SQLite with multi-project data', async () => {
|
|
109
|
-
console.log(' 🌱 Seeding SQLite with test data...');
|
|
110
|
-
await seedTestData(sqliteDb);
|
|
111
|
-
await assertSeededDataExists(sqliteDb);
|
|
112
|
-
// Verify multi-project isolation
|
|
113
|
-
// Note: Migration creates 1 default project (mcp-sqlew), we add 2 test projects
|
|
114
|
-
const projects = await sqliteDb('m_projects').select();
|
|
115
|
-
assert.ok(projects.length >= 2, 'Should have at least 2 test projects');
|
|
116
|
-
const decisions = await sqliteDb('t_decisions').select();
|
|
117
|
-
assert.strictEqual(decisions.length, 2, 'Should have 2 decisions');
|
|
118
|
-
// Verify decisions are in different projects
|
|
119
|
-
const project1Decisions = decisions.filter(d => d.project_id === 10);
|
|
120
|
-
const project2Decisions = decisions.filter(d => d.project_id === 20);
|
|
121
|
-
assert.strictEqual(project1Decisions.length, 1, 'Project 10 should have 1 decision');
|
|
122
|
-
assert.strictEqual(project2Decisions.length, 1, 'Project 20 should have 1 decision');
|
|
123
|
-
console.log(' ✅ Multi-project data seeded and verified');
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
// ========================================================================
|
|
127
|
-
// REQUIREMENT 3: Export each database using sql-dump
|
|
128
|
-
// ========================================================================
|
|
129
|
-
describe('Requirement 3: Export databases using sql-dump', () => {
|
|
130
|
-
it('should export SQLite to MySQL format', async () => {
|
|
131
|
-
console.log(' 📤 Exporting SQLite → MySQL...');
|
|
132
|
-
const dump = await generateSqlDump(sqliteDb, 'mysql', {
|
|
133
|
-
includeHeader: true,
|
|
134
|
-
includeSchema: true,
|
|
135
|
-
chunkSize: 100,
|
|
136
|
-
});
|
|
137
|
-
// Verify dump contains schema and data
|
|
138
|
-
assert.ok(dump.includes('CREATE TABLE'), 'Should contain CREATE TABLE statements');
|
|
139
|
-
assert.ok(dump.includes('INSERT INTO') || dump.includes('insert into'), 'Should contain INSERT statements');
|
|
140
|
-
assert.ok(dump.includes('m_projects'), 'Should include m_projects table');
|
|
141
|
-
assert.ok(dump.includes('t_decisions'), 'Should include t_decisions table');
|
|
142
|
-
console.log(` ✅ MySQL dump generated (${dump.length} chars)`);
|
|
143
|
-
});
|
|
144
|
-
it('should export SQLite to PostgreSQL format', async () => {
|
|
145
|
-
console.log(' 📤 Exporting SQLite → PostgreSQL...');
|
|
146
|
-
const dump = await generateSqlDump(sqliteDb, 'postgresql', {
|
|
147
|
-
includeHeader: true,
|
|
148
|
-
includeSchema: true,
|
|
149
|
-
chunkSize: 100,
|
|
150
|
-
});
|
|
151
|
-
// Verify PostgreSQL-specific syntax
|
|
152
|
-
assert.ok(dump.includes('CREATE TABLE'), 'Should contain CREATE TABLE statements');
|
|
153
|
-
assert.ok(dump.includes('INSERT INTO') || dump.includes('insert into'), 'Should contain INSERT statements');
|
|
154
|
-
assert.ok(dump.includes('SERIAL') || dump.includes('PRIMARY KEY'), 'Should use PostgreSQL syntax');
|
|
155
|
-
console.log(` ✅ PostgreSQL dump generated (${dump.length} chars)`);
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
// ========================================================================
|
|
159
|
-
// REQUIREMENT 4: Drop all schemas
|
|
160
|
-
// ========================================================================
|
|
161
|
-
describe('Requirement 4: Drop all schemas from databases', () => {
|
|
162
|
-
it('should drop all tables from MySQL', async () => {
|
|
163
|
-
console.log(' 🗑️ Dropping MySQL tables...');
|
|
164
|
-
await dropAllTables(mysqlDb, 'mysql');
|
|
165
|
-
const tables = await getTables(mysqlDb, 'mysql');
|
|
166
|
-
assert.strictEqual(tables.length, 0, 'MySQL should have no tables');
|
|
167
|
-
console.log(' ✅ MySQL tables dropped');
|
|
168
|
-
});
|
|
169
|
-
it('should drop all tables from MariaDB', async () => {
|
|
170
|
-
console.log(' 🗑️ Dropping MariaDB tables...');
|
|
171
|
-
await dropAllTables(mariadbDb, 'mariadb');
|
|
172
|
-
const tables = await getTables(mariadbDb, 'mariadb');
|
|
173
|
-
assert.strictEqual(tables.length, 0, 'MariaDB should have no tables');
|
|
174
|
-
console.log(' ✅ MariaDB tables dropped');
|
|
175
|
-
});
|
|
176
|
-
it('should drop all tables from PostgreSQL', async () => {
|
|
177
|
-
console.log(' 🗑️ Dropping PostgreSQL tables...');
|
|
178
|
-
await dropAllTables(postgresDb, 'postgresql');
|
|
179
|
-
const tables = await getTables(postgresDb, 'postgresql');
|
|
180
|
-
assert.strictEqual(tables.length, 0, 'PostgreSQL should have no tables');
|
|
181
|
-
console.log(' ✅ PostgreSQL tables dropped');
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
// ========================================================================
|
|
185
|
-
// REQUIREMENT 5: Test whether dump SQL can be imported
|
|
186
|
-
// ========================================================================
|
|
187
|
-
describe('Requirement 5: Import dump SQL to all databases', () => {
|
|
188
|
-
it('should import SQLite dump to MySQL', async () => {
|
|
189
|
-
console.log(' 📥 Importing SQLite dump → MySQL...');
|
|
190
|
-
// Generate dump
|
|
191
|
-
const dump = await generateSqlDump(sqliteDb, 'mysql', {
|
|
192
|
-
includeSchema: true,
|
|
193
|
-
chunkSize: 100,
|
|
194
|
-
});
|
|
195
|
-
// Import via Docker
|
|
196
|
-
const config = getDbConfig('mysql');
|
|
197
|
-
await importSqlToDocker(dump, config.containerName, 'mysql');
|
|
198
|
-
console.log(' ✅ Import completed');
|
|
199
|
-
// Verify tables exist
|
|
200
|
-
await assertTableCountsMatch(sqliteDb, 'sqlite', mysqlDb, 'mysql');
|
|
201
|
-
// Verify multi-project tables
|
|
202
|
-
const hasProjects = await mysqlDb.schema.hasTable('m_projects');
|
|
203
|
-
const hasDecisions = await mysqlDb.schema.hasTable('t_decisions');
|
|
204
|
-
assert.ok(hasProjects, 'MySQL should have m_projects table');
|
|
205
|
-
assert.ok(hasDecisions, 'MySQL should have t_decisions table');
|
|
206
|
-
// Verify data
|
|
207
|
-
await assertRowCountsMatch(sqliteDb, mysqlDb, 'm_projects');
|
|
208
|
-
await assertRowCountsMatch(sqliteDb, mysqlDb, 't_decisions');
|
|
209
|
-
console.log(' ✅ MySQL data verified');
|
|
210
|
-
});
|
|
211
|
-
it('should import SQLite dump to MariaDB', async () => {
|
|
212
|
-
console.log(' 📥 Importing SQLite dump → MariaDB...');
|
|
213
|
-
// Generate dump
|
|
214
|
-
const dump = await generateSqlDump(sqliteDb, 'mysql', {
|
|
215
|
-
includeSchema: true,
|
|
216
|
-
chunkSize: 100,
|
|
217
|
-
});
|
|
218
|
-
// Import via Docker
|
|
219
|
-
const config = getDbConfig('mariadb');
|
|
220
|
-
await importSqlToDocker(dump, config.containerName, 'mariadb');
|
|
221
|
-
console.log(' ✅ Import completed');
|
|
222
|
-
// Verify tables exist
|
|
223
|
-
await assertTableCountsMatch(sqliteDb, 'sqlite', mariadbDb, 'mariadb');
|
|
224
|
-
// Verify data
|
|
225
|
-
await assertRowCountsMatch(sqliteDb, mariadbDb, 'm_projects');
|
|
226
|
-
await assertRowCountsMatch(sqliteDb, mariadbDb, 't_decisions');
|
|
227
|
-
console.log(' ✅ MariaDB data verified');
|
|
228
|
-
});
|
|
229
|
-
it('should import SQLite dump to PostgreSQL', async () => {
|
|
230
|
-
console.log(' 📥 Importing SQLite dump → PostgreSQL...');
|
|
231
|
-
// Generate dump
|
|
232
|
-
const dump = await generateSqlDump(sqliteDb, 'postgresql', {
|
|
233
|
-
includeSchema: true,
|
|
234
|
-
chunkSize: 100,
|
|
235
|
-
});
|
|
236
|
-
// Import via Docker
|
|
237
|
-
const config = getDbConfig('postgresql');
|
|
238
|
-
await importSqlToDocker(dump, config.containerName, 'postgresql');
|
|
239
|
-
console.log(' ✅ Import completed');
|
|
240
|
-
// Verify tables exist
|
|
241
|
-
await assertTableCountsMatch(sqliteDb, 'sqlite', postgresDb, 'postgresql');
|
|
242
|
-
// Verify data
|
|
243
|
-
await assertRowCountsMatch(sqliteDb, postgresDb, 'm_projects');
|
|
244
|
-
await assertRowCountsMatch(sqliteDb, postgresDb, 't_decisions');
|
|
245
|
-
console.log(' ✅ PostgreSQL data verified');
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
// ========================================================================
|
|
249
|
-
// BONUS: Verify multi-project schema integrity
|
|
250
|
-
// ========================================================================
|
|
251
|
-
describe('Bonus: Verify multi-project schema integrity', () => {
|
|
252
|
-
it('should verify composite PRIMARY KEY on MySQL', async () => {
|
|
253
|
-
console.log(' 🔍 Verifying MySQL composite PRIMARY KEY...');
|
|
254
|
-
const pkQuery = await mysqlDb.raw(`
|
|
255
|
-
SELECT COLUMN_NAME
|
|
256
|
-
FROM INFORMATION_SCHEMA.COLUMNS
|
|
257
|
-
WHERE TABLE_SCHEMA = 'mcp_test'
|
|
258
|
-
AND TABLE_NAME = 't_decisions'
|
|
259
|
-
AND COLUMN_KEY = 'PRI'
|
|
260
|
-
ORDER BY ORDINAL_POSITION
|
|
261
|
-
`);
|
|
262
|
-
const pkColumns = pkQuery[0].map((r) => r.COLUMN_NAME);
|
|
263
|
-
assert.deepStrictEqual(pkColumns, ['key_id', 'project_id'], 'Should have composite PK (key_id, project_id)');
|
|
264
|
-
console.log(' ✅ MySQL composite PK verified');
|
|
265
|
-
});
|
|
266
|
-
it('should verify composite PRIMARY KEY on PostgreSQL', async () => {
|
|
267
|
-
console.log(' 🔍 Verifying PostgreSQL composite PRIMARY KEY...');
|
|
268
|
-
const pkQuery = await postgresDb.raw(`
|
|
269
|
-
SELECT a.attname
|
|
270
|
-
FROM pg_index i
|
|
271
|
-
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
|
|
272
|
-
WHERE i.indrelid = 't_decisions'::regclass AND i.indisprimary
|
|
273
|
-
ORDER BY array_position(i.indkey, a.attnum)
|
|
274
|
-
`);
|
|
275
|
-
const pkColumns = pkQuery.rows.map((r) => r.attname);
|
|
276
|
-
assert.deepStrictEqual(pkColumns, ['key_id', 'project_id'], 'Should have composite PK (key_id, project_id)');
|
|
277
|
-
console.log(' ✅ PostgreSQL composite PK verified');
|
|
278
|
-
});
|
|
279
|
-
it('should verify FK constraints preserved on MySQL', async () => {
|
|
280
|
-
console.log(' 🔍 Verifying MySQL FK constraints...');
|
|
281
|
-
// t_decisions should have FK to m_projects
|
|
282
|
-
await assertFKConstraintsExist(mysqlDb, 'mysql', 't_decisions', 1);
|
|
283
|
-
// v4_tasks should have FK to m_projects
|
|
284
|
-
await assertFKConstraintsExist(mysqlDb, 'mysql', 'v4_tasks', 1);
|
|
285
|
-
console.log(' ✅ MySQL FK constraints verified');
|
|
286
|
-
});
|
|
287
|
-
it('should verify FK constraints preserved on PostgreSQL', async () => {
|
|
288
|
-
console.log(' 🔍 Verifying PostgreSQL FK constraints...');
|
|
289
|
-
// t_decisions should have FK to m_projects
|
|
290
|
-
await assertFKConstraintsExist(postgresDb, 'postgresql', 't_decisions', 1);
|
|
291
|
-
// v4_tasks should have FK to m_projects
|
|
292
|
-
await assertFKConstraintsExist(postgresDb, 'postgresql', 'v4_tasks', 1);
|
|
293
|
-
console.log(' ✅ PostgreSQL FK constraints verified');
|
|
294
|
-
});
|
|
295
|
-
it('should verify multi-project data isolation', async () => {
|
|
296
|
-
console.log(' 🔍 Verifying multi-project data isolation...');
|
|
297
|
-
// MySQL: Verify data is properly isolated by project_id
|
|
298
|
-
const mysqlDecisions = await mysqlDb('t_decisions').select();
|
|
299
|
-
const mysqlProjects = mysqlDecisions.map(d => d.project_id).sort((a, b) => a - b);
|
|
300
|
-
assert.deepStrictEqual(mysqlProjects, [10, 20], 'MySQL should have decisions in projects 10 and 20');
|
|
301
|
-
// PostgreSQL: Verify same isolation
|
|
302
|
-
const pgDecisions = await postgresDb('t_decisions').select();
|
|
303
|
-
const pgProjects = pgDecisions.map(d => d.project_id).sort((a, b) => a - b);
|
|
304
|
-
assert.deepStrictEqual(pgProjects, [10, 20], 'PostgreSQL should have decisions in projects 10 and 20');
|
|
305
|
-
console.log(' ✅ Multi-project isolation verified');
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
// ========================================================================
|
|
309
|
-
// VALIDATION: Detect TEXT PRIMARY KEY and nullable composite PK errors
|
|
310
|
-
// ========================================================================
|
|
311
|
-
describe('Schema Validation: TEXT PRIMARY KEY and nullable composite PK', () => {
|
|
312
|
-
it('should validate no TEXT columns used as PRIMARY KEY in MySQL dump', async () => {
|
|
313
|
-
console.log(' 🔍 Validating MySQL dump for TEXT PRIMARY KEY errors...');
|
|
314
|
-
// Generate MySQL dump
|
|
315
|
-
const dump = await generateSqlDump(sqliteDb, 'mysql', {
|
|
316
|
-
includeSchema: true,
|
|
317
|
-
chunkSize: 100,
|
|
318
|
-
});
|
|
319
|
-
// Check for TEXT PRIMARY KEY pattern (MariaDB 10.5 incompatible)
|
|
320
|
-
const textPrimaryKeyPattern = /\bTEXT\s+PRIMARY\s+KEY/gi;
|
|
321
|
-
const matches = dump.match(textPrimaryKeyPattern);
|
|
322
|
-
if (matches) {
|
|
323
|
-
console.log(` ❌ Found ${matches.length} TEXT PRIMARY KEY instances (MariaDB 10.5 incompatible):`);
|
|
324
|
-
const lines = dump.split('\n');
|
|
325
|
-
lines.forEach((line, idx) => {
|
|
326
|
-
if (textPrimaryKeyPattern.test(line)) {
|
|
327
|
-
console.log(` Line ${idx + 1}: ${line.trim()}`);
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
assert.strictEqual(matches, null, 'MySQL dump should not contain TEXT PRIMARY KEY (MariaDB 10.5 incompatible)');
|
|
332
|
-
console.log(' ✅ No TEXT PRIMARY KEY found in MySQL dump');
|
|
333
|
-
});
|
|
334
|
-
it('should validate no nullable columns in composite PRIMARY KEY in MySQL dump', async () => {
|
|
335
|
-
console.log(' 🔍 Validating MySQL dump for nullable composite PRIMARY KEY errors...');
|
|
336
|
-
// Generate MySQL dump
|
|
337
|
-
const dump = await generateSqlDump(sqliteDb, 'mysql', {
|
|
338
|
-
includeSchema: true,
|
|
339
|
-
chunkSize: 100,
|
|
340
|
-
});
|
|
341
|
-
// Extract CREATE TABLE statements
|
|
342
|
-
const createTableRegex = /CREATE TABLE[^;]+;/gi;
|
|
343
|
-
const createStatements = dump.match(createTableRegex) || [];
|
|
344
|
-
const errors = [];
|
|
345
|
-
for (const stmt of createStatements) {
|
|
346
|
-
// Check if statement has composite PRIMARY KEY
|
|
347
|
-
const compositePkMatch = stmt.match(/PRIMARY\s+KEY\s*\(([^)]+)\)/i);
|
|
348
|
-
if (!compositePkMatch)
|
|
349
|
-
continue;
|
|
350
|
-
const pkColumns = compositePkMatch[1].split(',').map(c => c.trim().replace(/[`"']/g, ''));
|
|
351
|
-
if (pkColumns.length < 2)
|
|
352
|
-
continue; // Not a composite PK
|
|
353
|
-
// Extract table name
|
|
354
|
-
const tableNameMatch = stmt.match(/CREATE TABLE\s+[`"]?(\w+)[`"]?/i);
|
|
355
|
-
const tableName = tableNameMatch ? tableNameMatch[1] : 'unknown';
|
|
356
|
-
// Check if any PK column is nullable
|
|
357
|
-
for (const col of pkColumns) {
|
|
358
|
-
// Pattern: column_name type NULL or column_name type (without NOT NULL)
|
|
359
|
-
const colDefPattern = new RegExp(`[(\`"]?${col}[)\`"]?\\s+\\w+(?:\\(\\d+\\))?\\s+(?!NOT\\s+NULL)`, 'i');
|
|
360
|
-
if (colDefPattern.test(stmt) && /\s+NULL\s+/i.test(stmt)) {
|
|
361
|
-
errors.push(`Table ${tableName}: Composite PRIMARY KEY column '${col}' appears nullable`);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
if (errors.length > 0) {
|
|
366
|
-
console.log(` ❌ Found ${errors.length} nullable composite PRIMARY KEY errors:`);
|
|
367
|
-
errors.forEach(err => console.log(` - ${err}`));
|
|
368
|
-
assert.fail(`Found nullable columns in composite PRIMARY KEY: ${errors.join('; ')}`);
|
|
369
|
-
}
|
|
370
|
-
console.log(' ✅ No nullable composite PRIMARY KEY found in MySQL dump');
|
|
371
|
-
});
|
|
372
|
-
// Note: v4_config removed in v4.0 - config is now in-memory
|
|
373
|
-
// Test 'should validate m_config table uses single-column PRIMARY KEY' removed
|
|
374
|
-
it('should validate m_help_tools.tool_name is VARCHAR not TEXT', async () => {
|
|
375
|
-
console.log(' 🔍 Validating m_help_tools.tool_name data type...');
|
|
376
|
-
// Generate MySQL dump
|
|
377
|
-
const dump = await generateSqlDump(sqliteDb, 'mysql', {
|
|
378
|
-
includeSchema: true,
|
|
379
|
-
chunkSize: 100,
|
|
380
|
-
});
|
|
381
|
-
// Find m_help_tools CREATE TABLE statement (multi-line safe)
|
|
382
|
-
const helpToolsMatch = dump.match(/CREATE TABLE[\s\S]*?m_help_tools[\s\S]*?;/i);
|
|
383
|
-
assert.ok(helpToolsMatch, 'Should find m_help_tools table in dump');
|
|
384
|
-
const helpToolsStmt = helpToolsMatch[0];
|
|
385
|
-
// Check tool_name is VARCHAR, not TEXT
|
|
386
|
-
const toolNamePattern = /tool_name[\s\S]*?(VARCHAR|TEXT)/i;
|
|
387
|
-
const match = helpToolsStmt.match(toolNamePattern);
|
|
388
|
-
assert.ok(match, 'Should find tool_name column definition');
|
|
389
|
-
assert.strictEqual(match[1].toUpperCase(), 'VARCHAR', 'tool_name should be VARCHAR not TEXT (MariaDB 10.5 compatibility)');
|
|
390
|
-
console.log(' ✅ m_help_tools.tool_name correctly uses VARCHAR');
|
|
391
|
-
});
|
|
392
|
-
});
|
|
393
|
-
});
|
|
394
|
-
//# sourceMappingURL=multi-project-migration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multi-project-migration.test.js","sourceRoot":"","sources":["../../../src/tests/docker/multi-project-migration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema-migration.test.d.ts","sourceRoot":"","sources":["../../../src/tests/docker/schema-migration.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Schema-only migration tests (CREATE TABLE + CREATE VIEW)
|
|
3
|
-
*
|
|
4
|
-
* Tests that schema structures can be migrated across databases
|
|
5
|
-
* without data type conversion issues.
|
|
6
|
-
*/
|
|
7
|
-
import knex from 'knex';
|
|
8
|
-
import { generateSqlDump } from '../../utils/sql-dump/index.js';
|
|
9
|
-
import { describe, it, before, after } from 'node:test';
|
|
10
|
-
import assert from 'node:assert';
|
|
11
|
-
import { writeFileSync, unlinkSync } from 'node:fs';
|
|
12
|
-
import { exec } from 'node:child_process';
|
|
13
|
-
import { promisify } from 'node:util';
|
|
14
|
-
import { getTestConfig, getDockerExecPrefix } from '../database/testing-config.js';
|
|
15
|
-
const execAsync = promisify(exec);
|
|
16
|
-
// Test database configurations
|
|
17
|
-
const configs = {
|
|
18
|
-
sqlite: getTestConfig('sqlite'),
|
|
19
|
-
postgresql: getTestConfig('postgresql'),
|
|
20
|
-
};
|
|
21
|
-
describe('Schema Migration Tests (No Data)', () => {
|
|
22
|
-
let sqliteDb;
|
|
23
|
-
let postgresDb;
|
|
24
|
-
before(async () => {
|
|
25
|
-
sqliteDb = knex(configs.sqlite);
|
|
26
|
-
postgresDb = knex(configs.postgresql);
|
|
27
|
-
console.log(' Verifying database connections...');
|
|
28
|
-
await postgresDb.raw('SELECT 1');
|
|
29
|
-
console.log(' ✅ Databases connected');
|
|
30
|
-
});
|
|
31
|
-
after(async () => {
|
|
32
|
-
await sqliteDb.destroy();
|
|
33
|
-
await postgresDb.destroy();
|
|
34
|
-
});
|
|
35
|
-
it('should generate schema-only dump (CREATE TABLE + CREATE VIEW)', async () => {
|
|
36
|
-
console.log(' Generating schema-only dump...');
|
|
37
|
-
const dump = await generateSqlDump(sqliteDb, 'postgresql', {
|
|
38
|
-
includeHeader: true,
|
|
39
|
-
includeSchema: true,
|
|
40
|
-
chunkSize: 0, // No data, schema only
|
|
41
|
-
});
|
|
42
|
-
// Verify schema elements present
|
|
43
|
-
assert.ok(dump.includes('CREATE TABLE'), 'Should contain CREATE TABLE statements');
|
|
44
|
-
assert.ok(dump.includes('CREATE VIEW'), 'Should contain CREATE VIEW statements');
|
|
45
|
-
assert.ok(!dump.includes('insert into'), 'Should NOT contain INSERT statements');
|
|
46
|
-
console.log(` ✅ Schema dump generated (${dump.length} chars)`);
|
|
47
|
-
});
|
|
48
|
-
it('should migrate schema to PostgreSQL successfully', async () => {
|
|
49
|
-
console.log(' Migrating schema to PostgreSQL...');
|
|
50
|
-
// Generate schema-only dump
|
|
51
|
-
const dump = await generateSqlDump(sqliteDb, 'postgresql', {
|
|
52
|
-
includeSchema: true,
|
|
53
|
-
chunkSize: 0, // Schema only, no data
|
|
54
|
-
});
|
|
55
|
-
// Drop and recreate schema
|
|
56
|
-
await postgresDb.raw('DROP SCHEMA public CASCADE');
|
|
57
|
-
await postgresDb.raw('CREATE SCHEMA public');
|
|
58
|
-
// Import via psql
|
|
59
|
-
const tempFile = '/tmp/sqlew-schema-test.sql';
|
|
60
|
-
writeFileSync(tempFile, dump);
|
|
61
|
-
try {
|
|
62
|
-
const dockerPrefix = getDockerExecPrefix('postgresql');
|
|
63
|
-
const containerName = dockerPrefix.split(' ')[2]; // Extract container name from "docker exec container_name"
|
|
64
|
-
await execAsync(`docker cp ${tempFile} ${containerName}:/tmp/schema.sql`);
|
|
65
|
-
await execAsync(`${dockerPrefix} psql -U mcp_user -d mcp_test -f /tmp/schema.sql -v ON_ERROR_STOP=1 -q`);
|
|
66
|
-
}
|
|
67
|
-
finally {
|
|
68
|
-
unlinkSync(tempFile);
|
|
69
|
-
}
|
|
70
|
-
// Verify tables created
|
|
71
|
-
const tables = await postgresDb.raw(`
|
|
72
|
-
SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename LIKE 'm_%' OR tablename LIKE 't_%'
|
|
73
|
-
`);
|
|
74
|
-
assert.ok(tables.rows.length > 10, 'Should create multiple tables');
|
|
75
|
-
console.log(` ✅ Schema migrated: ${tables.rows.length} tables created`);
|
|
76
|
-
// Verify views created
|
|
77
|
-
const views = await postgresDb.raw(`
|
|
78
|
-
SELECT viewname FROM pg_views WHERE schemaname = 'public'
|
|
79
|
-
`);
|
|
80
|
-
assert.ok(views.rows.length > 0, 'Should create views');
|
|
81
|
-
console.log(` ✅ Views created: ${views.rows.length} views`);
|
|
82
|
-
});
|
|
83
|
-
it('should verify view definitions are valid', async () => {
|
|
84
|
-
console.log(' Verifying view definitions...');
|
|
85
|
-
// Query each view to ensure it's valid SQL
|
|
86
|
-
const views = await postgresDb.raw(`
|
|
87
|
-
SELECT viewname FROM pg_views WHERE schemaname = 'public'
|
|
88
|
-
`);
|
|
89
|
-
for (const row of views.rows) {
|
|
90
|
-
const viewName = row.viewname;
|
|
91
|
-
// Query the view (should not throw)
|
|
92
|
-
await postgresDb.raw(`SELECT * FROM "${viewName}" LIMIT 0`);
|
|
93
|
-
console.log(` ✅ View "${viewName}" is valid`);
|
|
94
|
-
}
|
|
95
|
-
console.log(` ✅ All ${views.rows.length} views are valid`);
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
//# sourceMappingURL=schema-migration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema-migration.test.js","sourceRoot":"","sources":["../../../src/tests/docker/schema-migration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"e2e-workflow1-debug.test.d.ts","sourceRoot":"","sources":["../../../src/tests/integration/e2e-workflow1-debug.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|