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,139 +1,20 @@
|
|
|
1
1
|
import { BaseAdapter } from './base-adapter.js';
|
|
2
|
-
/**
|
|
3
|
-
* MySQL adapter implementation with authentication support.
|
|
4
|
-
*
|
|
5
|
-
* This adapter provides MySQL-specific implementations for database operations,
|
|
6
|
-
* integrating with the authentication layer for secure connections via SSH tunnels,
|
|
7
|
-
* direct connections, or cloud IAM (AWS RDS, GCP Cloud SQL).
|
|
8
|
-
*
|
|
9
|
-
* **MySQL-Specific Features:**
|
|
10
|
-
* - ON DUPLICATE KEY UPDATE for upserts
|
|
11
|
-
* - JSON_EXTRACT() and JSON_OBJECT() for JSON operations
|
|
12
|
-
* - GROUP_CONCAT() for string aggregation
|
|
13
|
-
* - LAST_INSERT_ID() for retrieving inserted IDs
|
|
14
|
-
* - UNIX_TIMESTAMP() and FROM_UNIXTIME() for epoch conversions
|
|
15
|
-
* - AUTO_INCREMENT with UNSIGNED for ID columns
|
|
16
|
-
* - UTF8MB4 character set support for full Unicode
|
|
17
|
-
*
|
|
18
|
-
* **Supported MySQL Versions:**
|
|
19
|
-
* - MySQL 8.0+ (full feature support)
|
|
20
|
-
* - MySQL 5.7+ (basic feature support)
|
|
21
|
-
*
|
|
22
|
-
* **Authentication Methods:**
|
|
23
|
-
* - Direct: Standard username/password authentication
|
|
24
|
-
* - SSH Tunnel: Connect via SSH bastion host
|
|
25
|
-
* - AWS RDS IAM: Token-based authentication for AWS RDS
|
|
26
|
-
* - GCP Cloud SQL IAM: Token-based authentication for Cloud SQL
|
|
27
|
-
*
|
|
28
|
-
* @extends BaseAdapter
|
|
29
|
-
*
|
|
30
|
-
* @example
|
|
31
|
-
* // Direct connection
|
|
32
|
-
* const adapter = new MySQLAdapter({
|
|
33
|
-
* type: 'mysql',
|
|
34
|
-
* connection: {
|
|
35
|
-
* host: 'localhost',
|
|
36
|
-
* port: 3306,
|
|
37
|
-
* database: 'mydb'
|
|
38
|
-
* },
|
|
39
|
-
* auth: {
|
|
40
|
-
* type: 'direct',
|
|
41
|
-
* user: 'root',
|
|
42
|
-
* password: 'password'
|
|
43
|
-
* }
|
|
44
|
-
* });
|
|
45
|
-
*
|
|
46
|
-
* @example
|
|
47
|
-
* // SSH tunnel connection
|
|
48
|
-
* const adapter = new MySQLAdapter({
|
|
49
|
-
* type: 'mysql',
|
|
50
|
-
* connection: {
|
|
51
|
-
* host: 'db.internal',
|
|
52
|
-
* port: 3306,
|
|
53
|
-
* database: 'production'
|
|
54
|
-
* },
|
|
55
|
-
* auth: {
|
|
56
|
-
* type: 'ssh',
|
|
57
|
-
* user: 'dbuser',
|
|
58
|
-
* password: 'dbpass',
|
|
59
|
-
* ssh: {
|
|
60
|
-
* host: 'bastion.example.com',
|
|
61
|
-
* username: 'deploy',
|
|
62
|
-
* privateKeyPath: '/path/to/key.pem'
|
|
63
|
-
* }
|
|
64
|
-
* }
|
|
65
|
-
* });
|
|
66
|
-
*
|
|
67
|
-
* @example
|
|
68
|
-
* // AWS RDS IAM authentication
|
|
69
|
-
* const adapter = new MySQLAdapter({
|
|
70
|
-
* type: 'mysql',
|
|
71
|
-
* connection: {
|
|
72
|
-
* host: 'mydb.cluster-xxx.us-east-1.rds.amazonaws.com',
|
|
73
|
-
* port: 3306,
|
|
74
|
-
* database: 'production'
|
|
75
|
-
* },
|
|
76
|
-
* auth: {
|
|
77
|
-
* type: 'aws-iam',
|
|
78
|
-
* region: 'us-east-1'
|
|
79
|
-
* }
|
|
80
|
-
* });
|
|
81
|
-
*/
|
|
2
|
+
/** MySQL adapter with authentication support. */
|
|
82
3
|
export class MySQLAdapter extends BaseAdapter {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
supportsSavepoints = true; // Full savepoint support
|
|
4
|
+
supportsReturning = false;
|
|
5
|
+
supportsJSON = true;
|
|
6
|
+
supportsUpsert = true;
|
|
7
|
+
supportsCTE = true;
|
|
8
|
+
supportsWindowFunctions = true;
|
|
9
|
+
supportsSavepoints = true;
|
|
90
10
|
databaseName = 'mysql';
|
|
91
|
-
/**
|
|
92
|
-
* Creates a new MySQL adapter instance.
|
|
93
|
-
*
|
|
94
|
-
* @param {DatabaseConfig} config - Database configuration with auth settings
|
|
95
|
-
*/
|
|
96
11
|
constructor(config) {
|
|
97
12
|
super(config);
|
|
98
13
|
}
|
|
99
|
-
/**
|
|
100
|
-
* Returns the Knex dialect for MySQL.
|
|
101
|
-
*
|
|
102
|
-
* Uses 'mysql2' driver which supports:
|
|
103
|
-
* - Prepared statements
|
|
104
|
-
* - Binary protocol
|
|
105
|
-
* - Promise-based API
|
|
106
|
-
* - Full Unicode (UTF8MB4)
|
|
107
|
-
*
|
|
108
|
-
* @returns {string} 'mysql2' dialect identifier
|
|
109
|
-
*/
|
|
110
14
|
getDialect() {
|
|
111
15
|
return 'mysql2';
|
|
112
16
|
}
|
|
113
|
-
/**
|
|
114
|
-
* Initializes MySQL-specific session settings.
|
|
115
|
-
*
|
|
116
|
-
* **Configuration Applied:**
|
|
117
|
-
* - Character set: UTF8MB4 for full Unicode support (including emojis)
|
|
118
|
-
* - Collation: utf8mb4_unicode_ci for proper sorting
|
|
119
|
-
* - SQL mode: TRADITIONAL for strict SQL compliance
|
|
120
|
-
* - Timezone: UTC for consistent timestamp handling
|
|
121
|
-
* - Transaction isolation: READ COMMITTED (default)
|
|
122
|
-
*
|
|
123
|
-
* **Important Notes:**
|
|
124
|
-
* - UTF8MB4 requires MySQL 5.5.3+
|
|
125
|
-
* - These settings apply to the current session only
|
|
126
|
-
* - Connection pool creates new sessions with these settings
|
|
127
|
-
*
|
|
128
|
-
* @returns {Promise<void>}
|
|
129
|
-
*
|
|
130
|
-
* @throws {Error} If MySQL server version is incompatible
|
|
131
|
-
*
|
|
132
|
-
* @example
|
|
133
|
-
* // Called automatically after connect()
|
|
134
|
-
* await adapter.connect();
|
|
135
|
-
* // Session is now configured with UTF8MB4 and UTC timezone
|
|
136
|
-
*/
|
|
17
|
+
/** Initializes MySQL-specific session settings (UTF8MB4, UTC, TRADITIONAL). */
|
|
137
18
|
async initialize() {
|
|
138
19
|
const knex = this.getKnex();
|
|
139
20
|
// Validate database exists
|
|
@@ -164,46 +45,7 @@ export class MySQLAdapter extends BaseAdapter {
|
|
|
164
45
|
// Set SQL mode for strict compliance and safety
|
|
165
46
|
await knex.raw("SET sql_mode = 'TRADITIONAL'");
|
|
166
47
|
}
|
|
167
|
-
|
|
168
|
-
// Query Adaptations - MySQL-specific implementations
|
|
169
|
-
// ============================================================================
|
|
170
|
-
/**
|
|
171
|
-
* Inserts a row and returns the inserted record.
|
|
172
|
-
*
|
|
173
|
-
* MySQL doesn't support RETURNING clause, so this method:
|
|
174
|
-
* 1. Inserts the row
|
|
175
|
-
* 2. Retrieves LAST_INSERT_ID()
|
|
176
|
-
* 3. Queries the inserted row by ID
|
|
177
|
-
*
|
|
178
|
-
* **Important Notes:**
|
|
179
|
-
* - Assumes table has an auto-increment `id` column
|
|
180
|
-
* - LAST_INSERT_ID() is connection-specific (thread-safe)
|
|
181
|
-
* - For tables without auto-increment ID, use composite unique keys
|
|
182
|
-
*
|
|
183
|
-
* @template T - Record type
|
|
184
|
-
* @param {string} table - Table name
|
|
185
|
-
* @param {Partial<T>} data - Data to insert
|
|
186
|
-
* @returns {Promise<T>} Inserted record
|
|
187
|
-
*
|
|
188
|
-
* @throws {Error} If insert fails or record cannot be retrieved
|
|
189
|
-
*
|
|
190
|
-
* @example
|
|
191
|
-
* // Insert user and return full record
|
|
192
|
-
* const user = await adapter.insertReturning<User>('users', {
|
|
193
|
-
* name: 'Alice',
|
|
194
|
-
* email: 'alice@example.com'
|
|
195
|
-
* });
|
|
196
|
-
* console.log(user.id); // Auto-generated ID
|
|
197
|
-
*
|
|
198
|
-
* @example
|
|
199
|
-
* // With transaction
|
|
200
|
-
* await adapter.transaction(async (trx) => {
|
|
201
|
-
* const user = await adapter.insertReturning<User>('users', {
|
|
202
|
-
* name: 'Bob'
|
|
203
|
-
* });
|
|
204
|
-
* await trx('profiles').insert({ user_id: user.id });
|
|
205
|
-
* });
|
|
206
|
-
*/
|
|
48
|
+
/** Inserts a row and returns the inserted record via LAST_INSERT_ID(). */
|
|
207
49
|
async insertReturning(table, data) {
|
|
208
50
|
const knex = this.getKnex();
|
|
209
51
|
// Insert and get the auto-increment ID
|
|
@@ -215,43 +57,7 @@ export class MySQLAdapter extends BaseAdapter {
|
|
|
215
57
|
}
|
|
216
58
|
return result;
|
|
217
59
|
}
|
|
218
|
-
/**
|
|
219
|
-
* Upserts a row using MySQL's ON DUPLICATE KEY UPDATE syntax.
|
|
220
|
-
*
|
|
221
|
-
* **Behavior:**
|
|
222
|
-
* - If row with conflicting key exists: UPDATE specified columns
|
|
223
|
-
* - If no conflict: INSERT new row
|
|
224
|
-
* - Returns number of affected rows (1 = insert, 2 = update)
|
|
225
|
-
*
|
|
226
|
-
* **Important Notes:**
|
|
227
|
-
* - Requires UNIQUE index or PRIMARY KEY on conflictColumns
|
|
228
|
-
* - MySQL counts updates as 2 affected rows (1 delete + 1 insert internally)
|
|
229
|
-
* - If updateColumns not specified, updates all columns except conflict columns
|
|
230
|
-
*
|
|
231
|
-
* @template T - Record type
|
|
232
|
-
* @param {string} table - Table name
|
|
233
|
-
* @param {Partial<T>} data - Data to insert/update
|
|
234
|
-
* @param {string[]} conflictColumns - Columns that define uniqueness (must have UNIQUE index)
|
|
235
|
-
* @param {string[]} [updateColumns] - Columns to update on conflict (default: all except conflict columns)
|
|
236
|
-
* @returns {Promise<number>} Affected rows (1 = insert, 2 = update)
|
|
237
|
-
*
|
|
238
|
-
* @throws {Error} If conflictColumns don't have UNIQUE index
|
|
239
|
-
*
|
|
240
|
-
* @example
|
|
241
|
-
* // Upsert user by email (UNIQUE index on email)
|
|
242
|
-
* await adapter.upsert('users',
|
|
243
|
-
* { email: 'alice@example.com', name: 'Alice Updated', age: 30 },
|
|
244
|
-
* ['email'], // Conflict column
|
|
245
|
-
* ['name', 'age'] // Update these on conflict
|
|
246
|
-
* );
|
|
247
|
-
*
|
|
248
|
-
* @example
|
|
249
|
-
* // Upsert with composite key
|
|
250
|
-
* await adapter.upsert('user_settings',
|
|
251
|
-
* { user_id: 1, setting_key: 'theme', value: 'dark' },
|
|
252
|
-
* ['user_id', 'setting_key'] // Composite UNIQUE key
|
|
253
|
-
* );
|
|
254
|
-
*/
|
|
60
|
+
/** Upserts a row using ON DUPLICATE KEY UPDATE. */
|
|
255
61
|
async upsert(table, data, conflictColumns, updateColumns) {
|
|
256
62
|
const knex = this.getKnex();
|
|
257
63
|
// Determine which columns to update on conflict
|
|
@@ -268,76 +74,14 @@ export class MySQLAdapter extends BaseAdapter {
|
|
|
268
74
|
.merge(updateData);
|
|
269
75
|
return result.length;
|
|
270
76
|
}
|
|
271
|
-
/**
|
|
272
|
-
* Extracts a value from a JSON column using JSON_EXTRACT().
|
|
273
|
-
*
|
|
274
|
-
* **MySQL JSON Path Syntax:**
|
|
275
|
-
* - `$` - Root element
|
|
276
|
-
* - `$.key` - Object member
|
|
277
|
-
* - `$[n]` - Array element
|
|
278
|
-
* - `$.key[n]` - Nested access
|
|
279
|
-
* - `$.*.key` - Wildcard member
|
|
280
|
-
*
|
|
281
|
-
* **Important Notes:**
|
|
282
|
-
* - Returns JSON value (may need JSON_UNQUOTE() for strings)
|
|
283
|
-
* - Path must start with `$` (auto-prepended if missing)
|
|
284
|
-
* - Returns NULL if path doesn't exist
|
|
285
|
-
*
|
|
286
|
-
* @param {string} column - JSON column name
|
|
287
|
-
* @param {string} path - JSON path (e.g., '$.address.city' or 'address.city')
|
|
288
|
-
* @returns {Knex.Raw} Raw SQL expression for JSON extraction
|
|
289
|
-
*
|
|
290
|
-
* @example
|
|
291
|
-
* // Extract nested value
|
|
292
|
-
* const query = knex('users').select(
|
|
293
|
-
* adapter.jsonExtract('metadata', '$.address.city').as('city')
|
|
294
|
-
* );
|
|
295
|
-
* // SELECT JSON_EXTRACT(`metadata`, '$.address.city') AS `city` FROM `users`
|
|
296
|
-
*
|
|
297
|
-
* @example
|
|
298
|
-
* // Array element access
|
|
299
|
-
* const query = knex('orders').select(
|
|
300
|
-
* adapter.jsonExtract('items', '$[0].name').as('first_item')
|
|
301
|
-
* );
|
|
302
|
-
*/
|
|
77
|
+
/** Extracts a value from a JSON column using JSON_EXTRACT(). */
|
|
303
78
|
jsonExtract(column, path) {
|
|
304
79
|
const knex = this.getKnex();
|
|
305
80
|
// Ensure path starts with $ for MySQL JSON path syntax
|
|
306
81
|
const jsonPath = path.startsWith('$') ? path : `$.${path}`;
|
|
307
82
|
return knex.raw('JSON_EXTRACT(??, ?)', [column, jsonPath]);
|
|
308
83
|
}
|
|
309
|
-
/**
|
|
310
|
-
* Builds a JSON object from field values using JSON_OBJECT().
|
|
311
|
-
*
|
|
312
|
-
* **Behavior:**
|
|
313
|
-
* - Takes key-value pairs and returns JSON object
|
|
314
|
-
* - Automatically handles NULL values
|
|
315
|
-
* - Returns NULL if all values are NULL
|
|
316
|
-
*
|
|
317
|
-
* @param {Record<string, any>} fields - Object with key-value pairs
|
|
318
|
-
* @returns {Knex.Raw} Raw SQL expression for JSON object construction
|
|
319
|
-
*
|
|
320
|
-
* @example
|
|
321
|
-
* // Build JSON object from columns
|
|
322
|
-
* const query = knex('users').select(
|
|
323
|
-
* adapter.jsonBuildObject({
|
|
324
|
-
* name: knex.ref('name'),
|
|
325
|
-
* email: knex.ref('email'),
|
|
326
|
-
* age: knex.ref('age')
|
|
327
|
-
* }).as('user_json')
|
|
328
|
-
* );
|
|
329
|
-
* // SELECT JSON_OBJECT('name', `name`, 'email', `email`, 'age', `age`) AS `user_json`
|
|
330
|
-
*
|
|
331
|
-
* @example
|
|
332
|
-
* // With literal values
|
|
333
|
-
* const query = knex('orders').insert({
|
|
334
|
-
* metadata: adapter.jsonBuildObject({
|
|
335
|
-
* source: 'web',
|
|
336
|
-
* campaign: 'summer-sale',
|
|
337
|
-
* discount: 10
|
|
338
|
-
* })
|
|
339
|
-
* });
|
|
340
|
-
*/
|
|
84
|
+
/** Builds a JSON object using JSON_OBJECT(). */
|
|
341
85
|
jsonBuildObject(fields) {
|
|
342
86
|
const knex = this.getKnex();
|
|
343
87
|
const keys = Object.keys(fields);
|
|
@@ -352,328 +96,47 @@ export class MySQLAdapter extends BaseAdapter {
|
|
|
352
96
|
const placeholders = args.map(() => '?').join(', ');
|
|
353
97
|
return knex.raw(`JSON_OBJECT(${placeholders})`, args);
|
|
354
98
|
}
|
|
355
|
-
/**
|
|
356
|
-
* Returns current Unix timestamp using UNIX_TIMESTAMP().
|
|
357
|
-
*
|
|
358
|
-
* **Behavior:**
|
|
359
|
-
* - Returns seconds since Unix epoch (1970-01-01 00:00:00 UTC)
|
|
360
|
-
* - Always returns UTC timestamp regardless of session timezone
|
|
361
|
-
* - Integer value (no fractional seconds)
|
|
362
|
-
*
|
|
363
|
-
* @returns {Knex.Raw} Raw SQL expression for current timestamp
|
|
364
|
-
*
|
|
365
|
-
* @example
|
|
366
|
-
* // Insert with current timestamp
|
|
367
|
-
* await knex('events').insert({
|
|
368
|
-
* name: 'user_login',
|
|
369
|
-
* created_at: adapter.currentTimestamp()
|
|
370
|
-
* });
|
|
371
|
-
* // INSERT INTO `events` (`name`, `created_at`) VALUES ('user_login', UNIX_TIMESTAMP())
|
|
372
|
-
*
|
|
373
|
-
* @example
|
|
374
|
-
* // Update with current timestamp
|
|
375
|
-
* await knex('users')
|
|
376
|
-
* .where({ id: userId })
|
|
377
|
-
* .update({ last_seen: adapter.currentTimestamp() });
|
|
378
|
-
*/
|
|
99
|
+
/** Returns current Unix timestamp using UNIX_TIMESTAMP(). */
|
|
379
100
|
currentTimestamp() {
|
|
380
101
|
return this.getKnex().raw('UNIX_TIMESTAMP()');
|
|
381
102
|
}
|
|
382
|
-
/**
|
|
383
|
-
* Converts Unix epoch timestamp to MySQL datetime using FROM_UNIXTIME().
|
|
384
|
-
*
|
|
385
|
-
* **Behavior:**
|
|
386
|
-
* - Converts integer epoch to DATETIME
|
|
387
|
-
* - Returns UTC datetime (session timezone affects display)
|
|
388
|
-
* - Handles NULL values
|
|
389
|
-
*
|
|
390
|
-
* @param {string} epochColumn - Column containing Unix epoch timestamp
|
|
391
|
-
* @returns {Knex.Raw} Raw SQL expression for epoch conversion
|
|
392
|
-
*
|
|
393
|
-
* @example
|
|
394
|
-
* // Convert epoch to datetime for display
|
|
395
|
-
* const query = knex('events').select(
|
|
396
|
-
* 'name',
|
|
397
|
-
* adapter.fromUnixEpoch('created_at').as('created_datetime')
|
|
398
|
-
* );
|
|
399
|
-
* // SELECT `name`, FROM_UNIXTIME(`created_at`) AS `created_datetime` FROM `events`
|
|
400
|
-
*
|
|
401
|
-
* @example
|
|
402
|
-
* // Filter by datetime range using epoch column
|
|
403
|
-
* const query = knex('logs')
|
|
404
|
-
* .where(adapter.fromUnixEpoch('timestamp'), '>=', '2024-01-01')
|
|
405
|
-
* .andWhere(adapter.fromUnixEpoch('timestamp'), '<', '2024-02-01');
|
|
406
|
-
*/
|
|
103
|
+
/** Converts Unix epoch to datetime using FROM_UNIXTIME(). */
|
|
407
104
|
fromUnixEpoch(epochColumn) {
|
|
408
105
|
return this.getKnex().raw('FROM_UNIXTIME(??)', [epochColumn]);
|
|
409
106
|
}
|
|
410
|
-
/**
|
|
411
|
-
* Converts MySQL datetime to Unix epoch using UNIX_TIMESTAMP().
|
|
412
|
-
*
|
|
413
|
-
* **Behavior:**
|
|
414
|
-
* - Converts DATETIME/TIMESTAMP to integer epoch
|
|
415
|
-
* - Assumes input is UTC
|
|
416
|
-
* - Handles NULL values
|
|
417
|
-
*
|
|
418
|
-
* @param {string} timestampColumn - Column containing datetime value
|
|
419
|
-
* @returns {Knex.Raw} Raw SQL expression for datetime conversion
|
|
420
|
-
*
|
|
421
|
-
* @example
|
|
422
|
-
* // Convert datetime to epoch for storage
|
|
423
|
-
* const query = knex('events').insert({
|
|
424
|
-
* name: 'signup',
|
|
425
|
-
* timestamp: adapter.toUnixEpoch('NOW()')
|
|
426
|
-
* });
|
|
427
|
-
*
|
|
428
|
-
* @example
|
|
429
|
-
* // Calculate time difference in seconds
|
|
430
|
-
* const query = knex('sessions').select(
|
|
431
|
-
* knex.raw('?? - ??', [
|
|
432
|
-
* adapter.toUnixEpoch('logout_time'),
|
|
433
|
-
* adapter.toUnixEpoch('login_time')
|
|
434
|
-
* ]).as('duration_seconds')
|
|
435
|
-
* );
|
|
436
|
-
*/
|
|
107
|
+
/** Converts datetime to Unix epoch using UNIX_TIMESTAMP(). */
|
|
437
108
|
toUnixEpoch(timestampColumn) {
|
|
438
109
|
return this.getKnex().raw('UNIX_TIMESTAMP(??)', [timestampColumn]);
|
|
439
110
|
}
|
|
440
|
-
/**
|
|
441
|
-
* Concatenates string values using CONCAT().
|
|
442
|
-
*
|
|
443
|
-
* **Behavior:**
|
|
444
|
-
* - Returns NULL if any argument is NULL
|
|
445
|
-
* - Automatically converts non-string types to strings
|
|
446
|
-
* - Empty strings are preserved
|
|
447
|
-
*
|
|
448
|
-
* **Alternative:** Use CONCAT_WS() for separator-based concatenation
|
|
449
|
-
*
|
|
450
|
-
* @param {...(string | Knex.Raw)[]} values - Values to concatenate
|
|
451
|
-
* @returns {Knex.Raw} Raw SQL expression for concatenation
|
|
452
|
-
*
|
|
453
|
-
* @example
|
|
454
|
-
* // Concatenate columns
|
|
455
|
-
* const query = knex('users').select(
|
|
456
|
-
* adapter.concat(
|
|
457
|
-
* knex.ref('first_name'),
|
|
458
|
-
* ' ',
|
|
459
|
-
* knex.ref('last_name')
|
|
460
|
-
* ).as('full_name')
|
|
461
|
-
* );
|
|
462
|
-
* // SELECT CONCAT(`first_name`, ' ', `last_name`) AS `full_name` FROM `users`
|
|
463
|
-
*
|
|
464
|
-
* @example
|
|
465
|
-
* // Build URL from parts
|
|
466
|
-
* const query = knex('products').select(
|
|
467
|
-
* adapter.concat(
|
|
468
|
-
* 'https://example.com/products/',
|
|
469
|
-
* knex.ref('slug')
|
|
470
|
-
* ).as('url')
|
|
471
|
-
* );
|
|
472
|
-
*/
|
|
111
|
+
/** Concatenates string values using CONCAT(). */
|
|
473
112
|
concat(...values) {
|
|
474
113
|
const knex = this.getKnex();
|
|
475
114
|
const placeholders = values.map(() => '?').join(', ');
|
|
476
115
|
return knex.raw(`CONCAT(${placeholders})`, values);
|
|
477
116
|
}
|
|
478
|
-
/**
|
|
479
|
-
* Aggregates strings with separator using GROUP_CONCAT().
|
|
480
|
-
*
|
|
481
|
-
* **Behavior:**
|
|
482
|
-
* - Concatenates values from multiple rows into single string
|
|
483
|
-
* - Default separator: comma (,)
|
|
484
|
-
* - NULL values are skipped
|
|
485
|
-
* - Result may be truncated by group_concat_max_len setting
|
|
486
|
-
*
|
|
487
|
-
* **Important Notes:**
|
|
488
|
-
* - Default max length: 1024 bytes (can be increased with SET group_concat_max_len)
|
|
489
|
-
* - Use with GROUP BY for grouped aggregation
|
|
490
|
-
* - For large results, increase group_concat_max_len session variable
|
|
491
|
-
*
|
|
492
|
-
* @param {string} column - Column to aggregate
|
|
493
|
-
* @param {string} [separator=','] - Separator between values
|
|
494
|
-
* @returns {Knex.Raw} Raw SQL expression for string aggregation
|
|
495
|
-
*
|
|
496
|
-
* @example
|
|
497
|
-
* // Get comma-separated list of tags
|
|
498
|
-
* const query = knex('posts')
|
|
499
|
-
* .select('posts.id', 'posts.title')
|
|
500
|
-
* .select(adapter.stringAgg('tags.name').as('tags'))
|
|
501
|
-
* .leftJoin('post_tags', 'posts.id', 'post_tags.post_id')
|
|
502
|
-
* .leftJoin('tags', 'post_tags.tag_id', 'tags.id')
|
|
503
|
-
* .groupBy('posts.id');
|
|
504
|
-
* // Result: { id: 1, title: 'Post', tags: 'javascript,typescript,node' }
|
|
505
|
-
*
|
|
506
|
-
* @example
|
|
507
|
-
* // Custom separator
|
|
508
|
-
* const query = knex('users')
|
|
509
|
-
* .select('department')
|
|
510
|
-
* .select(adapter.stringAgg('name', '; ').as('members'))
|
|
511
|
-
* .groupBy('department');
|
|
512
|
-
*/
|
|
117
|
+
/** Aggregates strings with separator using GROUP_CONCAT(). */
|
|
513
118
|
stringAgg(column, separator = ',') {
|
|
514
119
|
return this.getKnex().raw('GROUP_CONCAT(?? SEPARATOR ?)', [column, separator]);
|
|
515
120
|
}
|
|
516
|
-
|
|
517
|
-
// Transaction Support
|
|
518
|
-
// ============================================================================
|
|
519
|
-
/**
|
|
520
|
-
* Executes a callback within a database transaction.
|
|
521
|
-
*
|
|
522
|
-
* Delegates to BaseAdapter's transaction() method, which uses Knex's
|
|
523
|
-
* transaction management with automatic commit/rollback.
|
|
524
|
-
*
|
|
525
|
-
* **MySQL Transaction Characteristics:**
|
|
526
|
-
* - Default isolation level: REPEATABLE READ
|
|
527
|
-
* - Supports nested transactions via savepoints
|
|
528
|
-
* - Automatic rollback on error
|
|
529
|
-
* - Deadlock detection and retry recommended for production
|
|
530
|
-
*
|
|
531
|
-
* @template T - Return type
|
|
532
|
-
* @param {Function} callback - Transaction callback
|
|
533
|
-
* @param {Object} [options] - Transaction options
|
|
534
|
-
* @param {string} [options.isolationLevel] - Isolation level
|
|
535
|
-
* @returns {Promise<T>} Transaction result
|
|
536
|
-
*
|
|
537
|
-
* @example
|
|
538
|
-
* // Bank transfer with transaction
|
|
539
|
-
* await adapter.transaction(async (trx) => {
|
|
540
|
-
* await trx('accounts')
|
|
541
|
-
* .where({ id: fromAccount })
|
|
542
|
-
* .decrement('balance', amount);
|
|
543
|
-
*
|
|
544
|
-
* await trx('accounts')
|
|
545
|
-
* .where({ id: toAccount })
|
|
546
|
-
* .increment('balance', amount);
|
|
547
|
-
* });
|
|
548
|
-
*
|
|
549
|
-
* @example
|
|
550
|
-
* // With isolation level
|
|
551
|
-
* await adapter.transaction(async (trx) => {
|
|
552
|
-
* // ... transaction operations ...
|
|
553
|
-
* }, { isolationLevel: 'serializable' });
|
|
554
|
-
*/
|
|
121
|
+
/** Executes a callback within a MySQL transaction. */
|
|
555
122
|
async transaction(callback, options) {
|
|
556
|
-
// Delegate to BaseAdapter's implementation
|
|
557
123
|
return super.transaction(callback, options);
|
|
558
124
|
}
|
|
559
|
-
/**
|
|
560
|
-
* Creates a savepoint within a transaction.
|
|
561
|
-
*
|
|
562
|
-
* **MySQL Savepoint Behavior:**
|
|
563
|
-
* - Allows partial rollback within transaction
|
|
564
|
-
* - Savepoint names are case-insensitive
|
|
565
|
-
* - Automatically released on transaction commit
|
|
566
|
-
* - Rolled back on transaction rollback
|
|
567
|
-
*
|
|
568
|
-
* @template T - Return type
|
|
569
|
-
* @param {Knex.Transaction} trx - Parent transaction
|
|
570
|
-
* @param {Function} callback - Savepoint callback
|
|
571
|
-
* @returns {Promise<T>} Savepoint result
|
|
572
|
-
*
|
|
573
|
-
* @throws {Error} If savepoint operation fails
|
|
574
|
-
*
|
|
575
|
-
* @example
|
|
576
|
-
* // Use savepoint for partial rollback
|
|
577
|
-
* await adapter.transaction(async (trx) => {
|
|
578
|
-
* await trx('users').insert({ name: 'Alice' });
|
|
579
|
-
*
|
|
580
|
-
* try {
|
|
581
|
-
* await adapter.savepoint(trx, async (sp) => {
|
|
582
|
-
* await sp('users').insert({ name: 'Bob' });
|
|
583
|
-
* throw new Error('Bob insert failed');
|
|
584
|
-
* });
|
|
585
|
-
* } catch (error) {
|
|
586
|
-
* // Bob insert rolled back, Alice insert preserved
|
|
587
|
-
* }
|
|
588
|
-
*
|
|
589
|
-
* await trx('users').insert({ name: 'Charlie' });
|
|
590
|
-
* });
|
|
591
|
-
*/
|
|
125
|
+
/** Creates a savepoint within a transaction. */
|
|
592
126
|
async savepoint(trx, callback) {
|
|
593
127
|
return trx.savepoint(callback);
|
|
594
128
|
}
|
|
595
|
-
|
|
596
|
-
// Schema Management
|
|
597
|
-
// ============================================================================
|
|
598
|
-
/**
|
|
599
|
-
* Checks if a table exists in the database.
|
|
600
|
-
*
|
|
601
|
-
* Queries INFORMATION_SCHEMA.TABLES which is the standard MySQL approach
|
|
602
|
-
* for table existence checking.
|
|
603
|
-
*
|
|
604
|
-
* **Important Notes:**
|
|
605
|
-
* - Case sensitivity depends on operating system (Linux: case-sensitive, Windows: case-insensitive)
|
|
606
|
-
* - Uses current database (from connection config)
|
|
607
|
-
* - Checks both base tables and views
|
|
608
|
-
*
|
|
609
|
-
* @param {string} tableName - Table name to check
|
|
610
|
-
* @returns {Promise<boolean>} True if table exists, false otherwise
|
|
611
|
-
*
|
|
612
|
-
* @example
|
|
613
|
-
* // Check before creating table
|
|
614
|
-
* if (!(await adapter.tableExists('users'))) {
|
|
615
|
-
* await knex.schema.createTable('users', (table) => {
|
|
616
|
-
* adapter.autoIncrementColumn(table);
|
|
617
|
-
* table.string('name');
|
|
618
|
-
* });
|
|
619
|
-
* }
|
|
620
|
-
*
|
|
621
|
-
* @example
|
|
622
|
-
* // Conditional migration
|
|
623
|
-
* if (await adapter.tableExists('old_table')) {
|
|
624
|
-
* await knex.raw('RENAME TABLE old_table TO new_table');
|
|
625
|
-
* }
|
|
626
|
-
*/
|
|
129
|
+
/** Checks if a table exists via INFORMATION_SCHEMA. */
|
|
627
130
|
async tableExists(tableName) {
|
|
628
131
|
const knex = this.getKnex();
|
|
629
132
|
const database = this.config.connection.database;
|
|
630
|
-
const result = await knex.raw(`SELECT TABLE_NAME
|
|
631
|
-
FROM INFORMATION_SCHEMA.TABLES
|
|
632
|
-
WHERE TABLE_SCHEMA = ?
|
|
133
|
+
const result = await knex.raw(`SELECT TABLE_NAME
|
|
134
|
+
FROM INFORMATION_SCHEMA.TABLES
|
|
135
|
+
WHERE TABLE_SCHEMA = ?
|
|
633
136
|
AND TABLE_NAME = ?`, [database, tableName]);
|
|
634
137
|
return result[0].length > 0;
|
|
635
138
|
}
|
|
636
|
-
/**
|
|
637
|
-
* Adds an auto-increment primary key column to a table.
|
|
638
|
-
*
|
|
639
|
-
* **MySQL AUTO_INCREMENT Behavior:**
|
|
640
|
-
* - Generates sequential integer IDs starting from 1
|
|
641
|
-
* - Must be indexed (PRIMARY KEY or UNIQUE)
|
|
642
|
-
* - Only one AUTO_INCREMENT column per table
|
|
643
|
-
* - Uses UNSIGNED INT for larger range (0 to 4,294,967,295)
|
|
644
|
-
*
|
|
645
|
-
* **Column Characteristics:**
|
|
646
|
-
* - Type: INTEGER UNSIGNED
|
|
647
|
-
* - Primary Key: Yes
|
|
648
|
-
* - Auto Increment: Yes
|
|
649
|
-
* - Not Nullable: Yes
|
|
650
|
-
*
|
|
651
|
-
* @param {Knex.CreateTableBuilder} table - Knex table builder
|
|
652
|
-
* @param {string} [columnName='id'] - Column name (default: 'id')
|
|
653
|
-
*
|
|
654
|
-
* @example
|
|
655
|
-
* // Create table with auto-increment ID
|
|
656
|
-
* await knex.schema.createTable('users', (table) => {
|
|
657
|
-
* adapter.autoIncrementColumn(table);
|
|
658
|
-
* table.string('name').notNullable();
|
|
659
|
-
* table.string('email').unique();
|
|
660
|
-
* table.timestamps(true, true);
|
|
661
|
-
* });
|
|
662
|
-
* // CREATE TABLE `users` (
|
|
663
|
-
* // `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
|
664
|
-
* // `name` VARCHAR(255) NOT NULL,
|
|
665
|
-
* // `email` VARCHAR(255) UNIQUE,
|
|
666
|
-
* // `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
667
|
-
* // `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
668
|
-
* // )
|
|
669
|
-
*
|
|
670
|
-
* @example
|
|
671
|
-
* // Custom column name
|
|
672
|
-
* await knex.schema.createTable('orders', (table) => {
|
|
673
|
-
* adapter.autoIncrementColumn(table, 'order_id');
|
|
674
|
-
* table.integer('user_id').unsigned().notNullable();
|
|
675
|
-
* });
|
|
676
|
-
*/
|
|
139
|
+
/** Adds an auto-increment primary key column (UNSIGNED INT). */
|
|
677
140
|
autoIncrementColumn(table, columnName = 'id') {
|
|
678
141
|
// Use increments() which creates UNSIGNED INT AUTO_INCREMENT PRIMARY KEY
|
|
679
142
|
table.increments(columnName).unsigned();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mysql-adapter.js","sourceRoot":"","sources":["../../src/adapters/mysql-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD
|
|
1
|
+
{"version":3,"file":"mysql-adapter.js","sourceRoot":"","sources":["../../src/adapters/mysql-adapter.ts"],"names":[],"mappings":"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"}
|