sqlew 3.6.10 → 3.7.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 +318 -0
- package/README.md +54 -39
- package/assets/config.example.toml +93 -0
- package/assets/kanban-visualizer.png +0 -0
- package/assets/sample-agents/sqlew-architect.md +32 -13
- package/assets/sample-agents/sqlew-researcher.md +70 -17
- package/assets/sample-agents/sqlew-scrum-master.md +60 -25
- package/assets/schema.sql +2 -2
- package/dist/adapters/auth/auth-factory.d.ts +86 -0
- package/dist/adapters/auth/auth-factory.d.ts.map +1 -0
- package/dist/adapters/auth/auth-factory.js +103 -0
- package/dist/adapters/auth/auth-factory.js.map +1 -0
- package/dist/adapters/auth/auth-types.d.ts +30 -0
- package/dist/adapters/auth/auth-types.d.ts.map +1 -0
- package/dist/adapters/auth/auth-types.js +30 -0
- package/dist/adapters/auth/auth-types.js.map +1 -0
- package/dist/adapters/auth/base-auth-provider.d.ts +327 -0
- package/dist/adapters/auth/base-auth-provider.d.ts.map +1 -0
- package/dist/adapters/auth/base-auth-provider.js +111 -0
- package/dist/adapters/auth/base-auth-provider.js.map +1 -0
- package/dist/adapters/auth/direct-auth-provider.d.ts +356 -0
- package/dist/adapters/auth/direct-auth-provider.d.ts.map +1 -0
- package/dist/adapters/auth/direct-auth-provider.js +406 -0
- package/dist/adapters/auth/direct-auth-provider.js.map +1 -0
- package/dist/adapters/base-adapter.d.ts +638 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +557 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +13 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +27 -5
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/mysql-adapter.d.ts +547 -6
- package/dist/adapters/mysql-adapter.d.ts.map +1 -1
- package/dist/adapters/mysql-adapter.js +651 -32
- package/dist/adapters/mysql-adapter.js.map +1 -1
- package/dist/adapters/postgresql-adapter.d.ts +15 -4
- package/dist/adapters/postgresql-adapter.d.ts.map +1 -1
- package/dist/adapters/postgresql-adapter.js +19 -2
- package/dist/adapters/postgresql-adapter.js.map +1 -1
- package/dist/adapters/sqlite-adapter.d.ts +35 -5
- package/dist/adapters/sqlite-adapter.d.ts.map +1 -1
- package/dist/adapters/sqlite-adapter.js +57 -18
- package/dist/adapters/sqlite-adapter.js.map +1 -1
- package/dist/cli/db-dump.d.ts +32 -0
- package/dist/cli/db-dump.d.ts.map +1 -0
- package/dist/cli/db-dump.js +409 -0
- package/dist/cli/db-dump.js.map +1 -0
- package/dist/cli.js +24 -14
- package/dist/cli.js.map +1 -1
- package/dist/config/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.js +7 -2
- package/dist/config/knex/bootstrap/20251025020452_create_master_tables.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.js +49 -50
- package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021351_create_indexes.d.ts.map +1 -0
- package/dist/config/knex/bootstrap/20251025021351_create_indexes.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.js +11 -6
- package/dist/config/knex/bootstrap/20251025021416_seed_master_data.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025070349_create_views.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.js +66 -14
- package/dist/config/knex/bootstrap/20251025070349_create_views.js.map +1 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +22 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
- package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +1 -0
- package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.js +6 -0
- package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.js.map +1 -0
- package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js +6 -0
- package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
- package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.js +6 -0
- package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.js.map +1 -0
- package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +1 -0
- package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js +7 -0
- package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js +62 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +1 -0
- package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +1 -0
- package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.js +6 -0
- package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.js.map +1 -0
- package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.js +6 -0
- package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.js.map +1 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts +13 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js +48 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js.map +1 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts +24 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js +189 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js.map +1 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts +16 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js +65 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js.map +1 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts +23 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js +118 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js.map +1 -0
- package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +1 -0
- package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +1 -0
- package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +1 -0
- package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +1 -0
- package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +1 -0
- package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +1 -0
- package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +1 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts +49 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js +864 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js.map +1 -0
- package/dist/config/loader.d.ts +19 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +149 -4
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +261 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/config/writer.d.ts +65 -0
- package/dist/config/writer.d.ts.map +1 -0
- package/dist/config/writer.js +139 -0
- package/dist/config/writer.js.map +1 -0
- package/dist/database.d.ts +11 -2
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +62 -6
- package/dist/database.js.map +1 -1
- package/dist/index.js +165 -35
- package/dist/index.js.map +1 -1
- package/dist/knexfile.d.ts.map +1 -1
- package/dist/knexfile.js +88 -12
- package/dist/knexfile.js.map +1 -1
- package/dist/tests/all-features.test.js +15 -3
- package/dist/tests/all-features.test.js.map +1 -1
- package/dist/tests/config-loader.test.d.ts +6 -0
- package/dist/tests/config-loader.test.d.ts.map +1 -0
- package/dist/tests/config-loader.test.js +201 -0
- package/dist/tests/config-loader.test.js.map +1 -0
- package/dist/tests/connection-manager-integration.test.d.ts +2 -0
- package/dist/tests/connection-manager-integration.test.d.ts.map +1 -0
- package/dist/tests/connection-manager-integration.test.js +431 -0
- package/dist/tests/connection-manager-integration.test.js.map +1 -0
- package/dist/tests/connection-manager.test.d.ts +2 -0
- package/dist/tests/connection-manager.test.d.ts.map +1 -0
- package/dist/tests/connection-manager.test.js +361 -0
- package/dist/tests/connection-manager.test.js.map +1 -0
- package/dist/tests/dump-import.test.d.ts +15 -0
- package/dist/tests/dump-import.test.d.ts.map +1 -0
- package/dist/tests/dump-import.test.js +430 -0
- package/dist/tests/dump-import.test.js.map +1 -0
- package/dist/tests/migration-idempotency.test.d.ts +2 -0
- package/dist/tests/migration-idempotency.test.d.ts.map +1 -0
- package/dist/tests/migration-idempotency.test.js +330 -0
- package/dist/tests/migration-idempotency.test.js.map +1 -0
- package/dist/tests/migration-upgrade-paths.test.d.ts +2 -0
- package/dist/tests/migration-upgrade-paths.test.d.ts.map +1 -0
- package/dist/tests/migration-upgrade-paths.test.js +248 -0
- package/dist/tests/migration-upgrade-paths.test.js.map +1 -0
- package/dist/tests/multi-project-migration.test.d.ts +17 -0
- package/dist/tests/multi-project-migration.test.d.ts.map +1 -0
- package/dist/tests/multi-project-migration.test.js +399 -0
- package/dist/tests/multi-project-migration.test.js.map +1 -0
- package/dist/tests/multi-project.test.d.ts +5 -0
- package/dist/tests/multi-project.test.d.ts.map +1 -0
- package/dist/tests/multi-project.test.js +238 -0
- package/dist/tests/multi-project.test.js.map +1 -0
- package/dist/tests/schema-migration.test.d.ts +8 -0
- package/dist/tests/schema-migration.test.d.ts.map +1 -0
- package/dist/tests/schema-migration.test.js +108 -0
- package/dist/tests/schema-migration.test.js.map +1 -0
- package/dist/tests/sql-dump-converters.test.d.ts +7 -0
- package/dist/tests/sql-dump-converters.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-converters.test.js +314 -0
- package/dist/tests/sql-dump-converters.test.js.map +1 -0
- package/dist/tests/sql-dump-cross-database.test.d.ts +21 -0
- package/dist/tests/sql-dump-cross-database.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-cross-database.test.js +314 -0
- package/dist/tests/sql-dump-cross-database.test.js.map +1 -0
- package/dist/tests/sql-dump-default-conversions.test.d.ts +8 -0
- package/dist/tests/sql-dump-default-conversions.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-default-conversions.test.js +141 -0
- package/dist/tests/sql-dump-default-conversions.test.js.map +1 -0
- package/dist/tests/sql-dump-fk-constraints.test.d.ts +13 -0
- package/dist/tests/sql-dump-fk-constraints.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-fk-constraints.test.js +381 -0
- package/dist/tests/sql-dump-fk-constraints.test.js.map +1 -0
- package/dist/tests/sql-dump-indexes.test.d.ts +12 -0
- package/dist/tests/sql-dump-indexes.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-indexes.test.js +269 -0
- package/dist/tests/sql-dump-indexes.test.js.map +1 -0
- package/dist/tests/sql-dump-integration.test.d.ts +16 -0
- package/dist/tests/sql-dump-integration.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-integration.test.js +342 -0
- package/dist/tests/sql-dump-integration.test.js.map +1 -0
- package/dist/tests/sql-dump-table-ordering.test.d.ts +8 -0
- package/dist/tests/sql-dump-table-ordering.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-table-ordering.test.js +253 -0
- package/dist/tests/sql-dump-table-ordering.test.js.map +1 -0
- package/dist/tests/tasks.link-file-backward-compat.test.js +11 -1
- package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
- package/dist/tests/tasks.watch-files-action.test.js +11 -1
- package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
- package/dist/tests/type-conversion.test.d.ts +8 -0
- package/dist/tests/type-conversion.test.d.ts.map +1 -0
- package/dist/tests/type-conversion.test.js +312 -0
- package/dist/tests/type-conversion.test.js.map +1 -0
- package/dist/tests/utils/test-helpers.d.ts +93 -0
- package/dist/tests/utils/test-helpers.d.ts.map +1 -0
- package/dist/tests/utils/test-helpers.js +407 -0
- package/dist/tests/utils/test-helpers.js.map +1 -0
- package/dist/tools/config.d.ts +58 -0
- package/dist/tools/config.d.ts.map +1 -0
- package/dist/tools/config.js +281 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/constraints.d.ts.map +1 -1
- package/dist/tools/constraints.js +138 -122
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +216 -109
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +123 -102
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +581 -518
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts +5 -0
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +176 -122
- package/dist/tools/utils.js.map +1 -1
- package/dist/types.d.ts +9 -26
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/cleanup.d.ts +3 -0
- package/dist/utils/cleanup.d.ts.map +1 -1
- package/dist/utils/cleanup.js +14 -2
- package/dist/utils/cleanup.js.map +1 -1
- package/dist/utils/connection-manager.d.ts +59 -0
- package/dist/utils/connection-manager.d.ts.map +1 -0
- package/dist/utils/connection-manager.js +178 -0
- package/dist/utils/connection-manager.js.map +1 -0
- package/dist/utils/debug-logger.d.ts +8 -4
- package/dist/utils/debug-logger.d.ts.map +1 -1
- package/dist/utils/debug-logger.js +27 -7
- package/dist/utils/debug-logger.js.map +1 -1
- package/dist/utils/error-handler.d.ts +2 -2
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +10 -7
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/parameter-validator.d.ts.map +1 -1
- package/dist/utils/parameter-validator.js +36 -15
- package/dist/utils/parameter-validator.js.map +1 -1
- package/dist/utils/project-context.d.ts +111 -0
- package/dist/utils/project-context.d.ts.map +1 -0
- package/dist/utils/project-context.js +187 -0
- package/dist/utils/project-context.js.map +1 -0
- package/dist/utils/sql-dump-converters.d.ts +188 -0
- package/dist/utils/sql-dump-converters.d.ts.map +1 -0
- package/dist/utils/sql-dump-converters.js +311 -0
- package/dist/utils/sql-dump-converters.js.map +1 -0
- package/dist/utils/sql-dump.d.ts +102 -0
- package/dist/utils/sql-dump.d.ts.map +1 -0
- package/dist/utils/sql-dump.js +1550 -0
- package/dist/utils/sql-dump.js.map +1 -0
- package/dist/utils/vcs-adapter.d.ts +42 -0
- package/dist/utils/vcs-adapter.d.ts.map +1 -1
- package/dist/utils/vcs-adapter.js +154 -0
- package/dist/utils/vcs-adapter.js.map +1 -1
- package/docs/BASEADAPTER_IMPLEMENTATION.md +399 -0
- package/docs/DATABASE_AUTH.md +445 -0
- package/docs/DATABASE_MIGRATION.md +247 -0
- package/docs/MULTI_PROJECT_ARCHITECTURE.md +497 -0
- package/package.json +12 -4
- package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025070349_create_views.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025070349_create_views.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +0 -15
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js +0 -34
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +0 -1
- /package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.js +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js +0 -0
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Foreign Key Constraint Validation Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests FK constraint preservation and enforcement during cross-database migrations.
|
|
5
|
+
* Specifically designed to catch SQLite→MySQL FK errors.
|
|
6
|
+
*
|
|
7
|
+
* Uses DRY shared test utilities from test-helpers.ts
|
|
8
|
+
*
|
|
9
|
+
* NOTE: These tests require Docker containers (MySQL, PostgreSQL)
|
|
10
|
+
* Set SKIP_DOCKER_TESTS=true or CI=true to skip in CI environments
|
|
11
|
+
*/
|
|
12
|
+
// Skip Docker-dependent tests in CI environments
|
|
13
|
+
if (process.env.SKIP_DOCKER_TESTS === 'true' || process.env.CI === 'true') {
|
|
14
|
+
console.log('⏭️ Skipping Docker-dependent FK constraint tests (CI environment)');
|
|
15
|
+
process.exit(0);
|
|
16
|
+
}
|
|
17
|
+
import { describe, it, before, after } from 'node:test';
|
|
18
|
+
import assert from 'node:assert';
|
|
19
|
+
import { generateSqlDump } from '../utils/sql-dump.js';
|
|
20
|
+
import { getDbConfig, connectDb, disconnectDb, dropAllTables, getFKConstraints, importSqlToDocker, } from './utils/test-helpers.js';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { existsSync, mkdirSync, unlinkSync } from 'node:fs';
|
|
23
|
+
const testDbPath = join(process.cwd(), '.sqlew/test-fk-constraints.db');
|
|
24
|
+
describe('FK Constraint Validation Tests', () => {
|
|
25
|
+
let sqliteDb;
|
|
26
|
+
let mysqlDb;
|
|
27
|
+
let postgresDb;
|
|
28
|
+
before(async () => {
|
|
29
|
+
console.log(' 📦 Setting up test databases for FK validation...');
|
|
30
|
+
const testDir = join(process.cwd(), '.sqlew');
|
|
31
|
+
if (!existsSync(testDir)) {
|
|
32
|
+
mkdirSync(testDir, { recursive: true });
|
|
33
|
+
}
|
|
34
|
+
if (existsSync(testDbPath)) {
|
|
35
|
+
unlinkSync(testDbPath);
|
|
36
|
+
}
|
|
37
|
+
const sqliteConfig = getDbConfig('sqlite', testDbPath);
|
|
38
|
+
const mysqlConfig = getDbConfig('mysql');
|
|
39
|
+
const postgresConfig = getDbConfig('postgresql');
|
|
40
|
+
sqliteDb = await connectDb(sqliteConfig);
|
|
41
|
+
mysqlDb = await connectDb(mysqlConfig);
|
|
42
|
+
postgresDb = await connectDb(postgresConfig);
|
|
43
|
+
console.log(' ✅ All databases connected');
|
|
44
|
+
});
|
|
45
|
+
after(async () => {
|
|
46
|
+
if (sqliteDb)
|
|
47
|
+
await disconnectDb(sqliteDb);
|
|
48
|
+
if (mysqlDb)
|
|
49
|
+
await disconnectDb(mysqlDb);
|
|
50
|
+
if (postgresDb)
|
|
51
|
+
await disconnectDb(postgresDb);
|
|
52
|
+
if (existsSync(testDbPath)) {
|
|
53
|
+
unlinkSync(testDbPath);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
// ==========================================================================
|
|
57
|
+
// Test 1: Detect NULL in FK columns (MySQL composite PK requirement)
|
|
58
|
+
// ==========================================================================
|
|
59
|
+
describe('Test 1: Detect NULL values in FK columns', () => {
|
|
60
|
+
it('should create SQLite schema with potential NULL FK columns', async () => {
|
|
61
|
+
console.log(' 🏗️ Creating test schema...');
|
|
62
|
+
await sqliteDb.schema.createTable('parent_table', (table) => {
|
|
63
|
+
table.increments('id').primary();
|
|
64
|
+
table.string('name').notNullable();
|
|
65
|
+
});
|
|
66
|
+
await sqliteDb.schema.createTable('child_table', (table) => {
|
|
67
|
+
table.increments('id').primary();
|
|
68
|
+
table.integer('parent_id').unsigned().nullable(); // NULLABLE FK column
|
|
69
|
+
table.foreign('parent_id').references('parent_table.id');
|
|
70
|
+
});
|
|
71
|
+
// Insert data with NULL FK
|
|
72
|
+
await sqliteDb('parent_table').insert({ id: 1, name: 'Parent 1' });
|
|
73
|
+
await sqliteDb('child_table').insert([
|
|
74
|
+
{ id: 1, parent_id: 1 },
|
|
75
|
+
{ id: 2, parent_id: null }, // NULL FK value
|
|
76
|
+
]);
|
|
77
|
+
console.log(' ✅ Schema created with NULL FK values');
|
|
78
|
+
});
|
|
79
|
+
it('should identify NULL FK columns before migration', async () => {
|
|
80
|
+
console.log(' 🔍 Checking for NULL FK values...');
|
|
81
|
+
const nullFKs = await sqliteDb('child_table').whereNull('parent_id');
|
|
82
|
+
assert.ok(nullFKs.length > 0, 'Should detect NULL FK values');
|
|
83
|
+
console.log(` ⚠️ Found ${nullFKs.length} rows with NULL FK values`);
|
|
84
|
+
});
|
|
85
|
+
it('should export to MySQL and catch NULL FK issues', async () => {
|
|
86
|
+
console.log(' 📤 Exporting SQLite → MySQL...');
|
|
87
|
+
const dump = await generateSqlDump(sqliteDb, 'mysql', {
|
|
88
|
+
includeSchema: true,
|
|
89
|
+
chunkSize: 100,
|
|
90
|
+
});
|
|
91
|
+
// Clean MySQL
|
|
92
|
+
await dropAllTables(mysqlDb, 'mysql');
|
|
93
|
+
// Attempt import
|
|
94
|
+
try {
|
|
95
|
+
const config = getDbConfig('mysql');
|
|
96
|
+
await importSqlToDocker(dump, config.containerName, 'mysql');
|
|
97
|
+
// If import succeeds, verify data
|
|
98
|
+
const mysqlNullFKs = await mysqlDb('child_table').whereNull('parent_id');
|
|
99
|
+
console.log(` ✅ Import succeeded, ${mysqlNullFKs.length} NULL FK values preserved`);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// Expected: MySQL may reject NULL in composite PKs
|
|
103
|
+
console.log(` ⚠️ Import failed as expected: ${error.message}`);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
// ==========================================================================
|
|
108
|
+
// Test 2: FK constraint enforcement after migration
|
|
109
|
+
// ==========================================================================
|
|
110
|
+
describe('Test 2: FK constraint enforcement', () => {
|
|
111
|
+
before(async () => {
|
|
112
|
+
// Clean databases
|
|
113
|
+
await dropAllTables(sqliteDb, 'sqlite');
|
|
114
|
+
await dropAllTables(mysqlDb, 'mysql');
|
|
115
|
+
await dropAllTables(postgresDb, 'postgresql');
|
|
116
|
+
});
|
|
117
|
+
it('should create schema with FK constraints', async () => {
|
|
118
|
+
console.log(' 🏗️ Creating FK constraint test schema...');
|
|
119
|
+
await sqliteDb.schema.createTable('departments', (table) => {
|
|
120
|
+
table.increments('id').primary();
|
|
121
|
+
table.string('name').notNullable();
|
|
122
|
+
});
|
|
123
|
+
await sqliteDb.schema.createTable('employees', (table) => {
|
|
124
|
+
table.increments('id').primary();
|
|
125
|
+
table.string('name').notNullable();
|
|
126
|
+
table.integer('department_id').unsigned().notNullable(); // NOT NULL
|
|
127
|
+
table.foreign('department_id').references('departments.id');
|
|
128
|
+
});
|
|
129
|
+
// Seed data
|
|
130
|
+
await sqliteDb('departments').insert([
|
|
131
|
+
{ id: 1, name: 'Engineering' },
|
|
132
|
+
{ id: 2, name: 'Sales' },
|
|
133
|
+
]);
|
|
134
|
+
await sqliteDb('employees').insert([
|
|
135
|
+
{ id: 1, name: 'Alice', department_id: 1 },
|
|
136
|
+
{ id: 2, name: 'Bob', department_id: 2 },
|
|
137
|
+
]);
|
|
138
|
+
console.log(' ✅ Schema created with NOT NULL FK columns');
|
|
139
|
+
});
|
|
140
|
+
it('should migrate schema to MySQL with FK constraints', async () => {
|
|
141
|
+
console.log(' 📤 Migrating to MySQL...');
|
|
142
|
+
const dump = await generateSqlDump(sqliteDb, 'mysql', {
|
|
143
|
+
includeSchema: true,
|
|
144
|
+
chunkSize: 100,
|
|
145
|
+
});
|
|
146
|
+
await dropAllTables(mysqlDb, 'mysql');
|
|
147
|
+
const config = getDbConfig('mysql');
|
|
148
|
+
await importSqlToDocker(dump, config.containerName, 'mysql');
|
|
149
|
+
console.log(' ✅ MySQL import successful');
|
|
150
|
+
// Verify FK constraints exist
|
|
151
|
+
const fks = await getFKConstraints(mysqlDb, 'mysql', 'employees');
|
|
152
|
+
assert.ok(fks.length > 0, 'MySQL should have FK constraints on employees table');
|
|
153
|
+
console.log(` ✅ Found ${fks.length} FK constraints in MySQL`);
|
|
154
|
+
});
|
|
155
|
+
it('should enforce FK constraints on MySQL (reject invalid FK)', async () => {
|
|
156
|
+
console.log(' 🧪 Testing FK constraint enforcement on MySQL...');
|
|
157
|
+
try {
|
|
158
|
+
// Try to insert employee with non-existent department
|
|
159
|
+
await mysqlDb('employees').insert({
|
|
160
|
+
id: 999,
|
|
161
|
+
name: 'Invalid Employee',
|
|
162
|
+
department_id: 9999, // Non-existent department
|
|
163
|
+
});
|
|
164
|
+
assert.fail('MySQL should reject invalid FK reference');
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
// Expected: FK constraint violation
|
|
168
|
+
assert.ok(error.message.includes('foreign key constraint') || error.code === 'ER_NO_REFERENCED_ROW_2', 'Should throw FK constraint error');
|
|
169
|
+
console.log(' ✅ MySQL correctly rejected invalid FK');
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
it('should migrate schema to PostgreSQL with FK constraints', async () => {
|
|
173
|
+
console.log(' 📤 Migrating to PostgreSQL...');
|
|
174
|
+
const dump = await generateSqlDump(sqliteDb, 'postgresql', {
|
|
175
|
+
includeSchema: true,
|
|
176
|
+
chunkSize: 100,
|
|
177
|
+
});
|
|
178
|
+
await dropAllTables(postgresDb, 'postgresql');
|
|
179
|
+
const config = getDbConfig('postgresql');
|
|
180
|
+
await importSqlToDocker(dump, config.containerName, 'postgresql');
|
|
181
|
+
console.log(' ✅ PostgreSQL import successful');
|
|
182
|
+
// Verify FK constraints exist
|
|
183
|
+
const fks = await getFKConstraints(postgresDb, 'postgresql', 'employees');
|
|
184
|
+
assert.ok(fks.length > 0, 'PostgreSQL should have FK constraints on employees table');
|
|
185
|
+
console.log(` ✅ Found ${fks.length} FK constraints in PostgreSQL`);
|
|
186
|
+
});
|
|
187
|
+
it('should enforce FK constraints on PostgreSQL (reject invalid FK)', async () => {
|
|
188
|
+
console.log(' 🧪 Testing FK constraint enforcement on PostgreSQL...');
|
|
189
|
+
try {
|
|
190
|
+
// Try to insert employee with non-existent department
|
|
191
|
+
await postgresDb('employees').insert({
|
|
192
|
+
id: 999,
|
|
193
|
+
name: 'Invalid Employee',
|
|
194
|
+
department_id: 9999, // Non-existent department
|
|
195
|
+
});
|
|
196
|
+
assert.fail('PostgreSQL should reject invalid FK reference');
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
// Expected: FK constraint violation
|
|
200
|
+
assert.ok(error.message.includes('foreign key constraint') || error.code === '23503', 'Should throw FK constraint error');
|
|
201
|
+
console.log(' ✅ PostgreSQL correctly rejected invalid FK');
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
// ==========================================================================
|
|
206
|
+
// Test 3: CASCADE behaviors
|
|
207
|
+
// ==========================================================================
|
|
208
|
+
describe('Test 3: CASCADE behaviors', () => {
|
|
209
|
+
before(async () => {
|
|
210
|
+
// Clean databases
|
|
211
|
+
await dropAllTables(sqliteDb, 'sqlite');
|
|
212
|
+
await dropAllTables(mysqlDb, 'mysql');
|
|
213
|
+
await dropAllTables(postgresDb, 'postgresql');
|
|
214
|
+
});
|
|
215
|
+
it('should create schema with CASCADE constraints', async () => {
|
|
216
|
+
console.log(' 🏗️ Creating CASCADE test schema...');
|
|
217
|
+
await sqliteDb.schema.createTable('categories', (table) => {
|
|
218
|
+
table.increments('id').primary();
|
|
219
|
+
table.string('name').notNullable();
|
|
220
|
+
});
|
|
221
|
+
await sqliteDb.schema.createTable('products', (table) => {
|
|
222
|
+
table.increments('id').primary();
|
|
223
|
+
table.string('name').notNullable();
|
|
224
|
+
table.integer('category_id').unsigned().notNullable();
|
|
225
|
+
table.foreign('category_id')
|
|
226
|
+
.references('categories.id')
|
|
227
|
+
.onDelete('CASCADE')
|
|
228
|
+
.onUpdate('CASCADE');
|
|
229
|
+
});
|
|
230
|
+
// Seed data
|
|
231
|
+
await sqliteDb('categories').insert({ id: 1, name: 'Electronics' });
|
|
232
|
+
await sqliteDb('products').insert([
|
|
233
|
+
{ id: 1, name: 'Laptop', category_id: 1 },
|
|
234
|
+
{ id: 2, name: 'Phone', category_id: 1 },
|
|
235
|
+
]);
|
|
236
|
+
console.log(' ✅ Schema created with CASCADE constraints');
|
|
237
|
+
});
|
|
238
|
+
it('should migrate CASCADE constraints to MySQL', async () => {
|
|
239
|
+
console.log(' 📤 Migrating CASCADE to MySQL...');
|
|
240
|
+
const dump = await generateSqlDump(sqliteDb, 'mysql', {
|
|
241
|
+
includeSchema: true,
|
|
242
|
+
chunkSize: 100,
|
|
243
|
+
});
|
|
244
|
+
await dropAllTables(mysqlDb, 'mysql');
|
|
245
|
+
const config = getDbConfig('mysql');
|
|
246
|
+
await importSqlToDocker(dump, config.containerName, 'mysql');
|
|
247
|
+
console.log(' ✅ MySQL import with CASCADE successful');
|
|
248
|
+
});
|
|
249
|
+
it('should test DELETE CASCADE on MySQL', async () => {
|
|
250
|
+
console.log(' 🧪 Testing DELETE CASCADE on MySQL...');
|
|
251
|
+
// Verify products exist before delete
|
|
252
|
+
const productsBefore = await mysqlDb('products').where({ category_id: 1 });
|
|
253
|
+
assert.strictEqual(productsBefore.length, 2, 'Should have 2 products before delete');
|
|
254
|
+
// Delete category
|
|
255
|
+
await mysqlDb('categories').where({ id: 1 }).del();
|
|
256
|
+
// Verify products were cascaded
|
|
257
|
+
const productsAfter = await mysqlDb('products').where({ category_id: 1 });
|
|
258
|
+
assert.strictEqual(productsAfter.length, 0, 'Products should be deleted via CASCADE');
|
|
259
|
+
console.log(' ✅ DELETE CASCADE works on MySQL');
|
|
260
|
+
});
|
|
261
|
+
it('should migrate CASCADE constraints to PostgreSQL', async () => {
|
|
262
|
+
console.log(' 📤 Migrating CASCADE to PostgreSQL...');
|
|
263
|
+
const dump = await generateSqlDump(sqliteDb, 'postgresql', {
|
|
264
|
+
includeSchema: true,
|
|
265
|
+
chunkSize: 100,
|
|
266
|
+
});
|
|
267
|
+
await dropAllTables(postgresDb, 'postgresql');
|
|
268
|
+
const config = getDbConfig('postgresql');
|
|
269
|
+
await importSqlToDocker(dump, config.containerName, 'postgresql');
|
|
270
|
+
console.log(' ✅ PostgreSQL import with CASCADE successful');
|
|
271
|
+
});
|
|
272
|
+
it('should test DELETE CASCADE on PostgreSQL', async () => {
|
|
273
|
+
console.log(' 🧪 Testing DELETE CASCADE on PostgreSQL...');
|
|
274
|
+
// Verify products exist before delete
|
|
275
|
+
const productsBefore = await postgresDb('products').where({ category_id: 1 });
|
|
276
|
+
assert.strictEqual(productsBefore.length, 2, 'Should have 2 products before delete');
|
|
277
|
+
// Delete category
|
|
278
|
+
await postgresDb('categories').where({ id: 1 }).del();
|
|
279
|
+
// Verify products were cascaded
|
|
280
|
+
const productsAfter = await postgresDb('products').where({ category_id: 1 });
|
|
281
|
+
assert.strictEqual(productsAfter.length, 0, 'Products should be deleted via CASCADE');
|
|
282
|
+
console.log(' ✅ DELETE CASCADE works on PostgreSQL');
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
// ==========================================================================
|
|
286
|
+
// Test 4: Multi-column FK constraints
|
|
287
|
+
// ==========================================================================
|
|
288
|
+
describe('Test 4: Multi-column (composite) FK constraints', () => {
|
|
289
|
+
before(async () => {
|
|
290
|
+
await dropAllTables(sqliteDb, 'sqlite');
|
|
291
|
+
await dropAllTables(mysqlDb, 'mysql');
|
|
292
|
+
});
|
|
293
|
+
it('should create schema with composite FK', async () => {
|
|
294
|
+
console.log(' 🏗️ Creating composite FK schema...');
|
|
295
|
+
await sqliteDb.schema.createTable('orders', (table) => {
|
|
296
|
+
table.integer('order_id').unsigned().notNullable();
|
|
297
|
+
table.integer('customer_id').unsigned().notNullable();
|
|
298
|
+
table.string('status').notNullable();
|
|
299
|
+
table.primary(['order_id', 'customer_id']);
|
|
300
|
+
});
|
|
301
|
+
await sqliteDb.schema.createTable('order_items', (table) => {
|
|
302
|
+
table.increments('id').primary();
|
|
303
|
+
table.integer('order_id').unsigned().notNullable();
|
|
304
|
+
table.integer('customer_id').unsigned().notNullable();
|
|
305
|
+
table.string('product').notNullable();
|
|
306
|
+
table.foreign(['order_id', 'customer_id'])
|
|
307
|
+
.references(['order_id', 'customer_id'])
|
|
308
|
+
.inTable('orders');
|
|
309
|
+
});
|
|
310
|
+
// Seed data
|
|
311
|
+
await sqliteDb('orders').insert({ order_id: 1, customer_id: 100, status: 'pending' });
|
|
312
|
+
await sqliteDb('order_items').insert({
|
|
313
|
+
id: 1,
|
|
314
|
+
order_id: 1,
|
|
315
|
+
customer_id: 100,
|
|
316
|
+
product: 'Widget',
|
|
317
|
+
});
|
|
318
|
+
console.log(' ✅ Composite FK schema created');
|
|
319
|
+
});
|
|
320
|
+
it('should migrate composite FK to MySQL', async () => {
|
|
321
|
+
console.log(' 📤 Migrating composite FK to MySQL...');
|
|
322
|
+
const dump = await generateSqlDump(sqliteDb, 'mysql', {
|
|
323
|
+
includeSchema: true,
|
|
324
|
+
chunkSize: 100,
|
|
325
|
+
});
|
|
326
|
+
await dropAllTables(mysqlDb, 'mysql');
|
|
327
|
+
try {
|
|
328
|
+
const config = getDbConfig('mysql');
|
|
329
|
+
await importSqlToDocker(dump, config.containerName, 'mysql');
|
|
330
|
+
console.log(' ✅ MySQL composite FK import successful');
|
|
331
|
+
// Verify FK exists
|
|
332
|
+
const fks = await getFKConstraints(mysqlDb, 'mysql', 'order_items');
|
|
333
|
+
console.log(` ✅ Found ${fks.length} composite FK constraints`);
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
console.log(` ⚠️ Composite FK import failed: ${error.message}`);
|
|
337
|
+
// This may fail if dump doesn't preserve composite FKs correctly
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
// ==========================================================================
|
|
342
|
+
// Test 5: Detect missing NOT NULL on FK columns
|
|
343
|
+
// ==========================================================================
|
|
344
|
+
describe('Test 5: Verify NOT NULL on all FK columns', () => {
|
|
345
|
+
it('should scan SQLite schema for nullable FK columns', async () => {
|
|
346
|
+
console.log(' 🔍 Scanning for nullable FK columns in real schema...');
|
|
347
|
+
// Run migrations to get real mcp-sqlew schema
|
|
348
|
+
await dropAllTables(sqliteDb, 'sqlite');
|
|
349
|
+
await sqliteDb.migrate.latest();
|
|
350
|
+
// Get all tables
|
|
351
|
+
const tables = await sqliteDb.raw(`
|
|
352
|
+
SELECT name FROM sqlite_master
|
|
353
|
+
WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name != 'knex_migrations'
|
|
354
|
+
`);
|
|
355
|
+
const issues = [];
|
|
356
|
+
// Check each table for FK columns
|
|
357
|
+
for (const row of tables) {
|
|
358
|
+
const tableName = row.name;
|
|
359
|
+
const fkList = await sqliteDb.raw(`PRAGMA foreign_key_list(${tableName})`);
|
|
360
|
+
for (const fk of fkList) {
|
|
361
|
+
const columnName = fk.from;
|
|
362
|
+
// Check if column is nullable
|
|
363
|
+
const tableInfo = await sqliteDb.raw(`PRAGMA table_info(${tableName})`);
|
|
364
|
+
const column = tableInfo.find((col) => col.name === columnName);
|
|
365
|
+
if (column && column.notnull === 0) {
|
|
366
|
+
issues.push({ table: tableName, column: columnName });
|
|
367
|
+
console.log(` ⚠️ ${tableName}.${columnName} is FK but NULLABLE`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (issues.length > 0) {
|
|
372
|
+
console.log(` ⚠️ Found ${issues.length} nullable FK columns`);
|
|
373
|
+
console.log(' 💡 These may cause MySQL composite PK errors');
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
console.log(' ✅ No nullable FK columns found');
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
//# sourceMappingURL=sql-dump-fk-constraints.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-dump-fk-constraints.test.js","sourceRoot":"","sources":["../../src/tests/sql-dump-fk-constraints.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for index export functionality across MySQL, PostgreSQL, and SQLite
|
|
3
|
+
*
|
|
4
|
+
* Tests index detection, CREATE INDEX statement generation, and cross-database
|
|
5
|
+
* conversion including MySQL prefix length handling.
|
|
6
|
+
*
|
|
7
|
+
* Prerequisites:
|
|
8
|
+
* - Docker installed and running
|
|
9
|
+
* - Run: docker-compose -f docker/docker-compose.test.yml up -d
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=sql-dump-indexes.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-dump-indexes.test.d.ts","sourceRoot":"","sources":["../../src/tests/sql-dump-indexes.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|