@supabase/pg-delta 1.0.0-alpha.2 → 1.0.0-alpha.20
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/README.md +48 -3
- package/dist/cli/app.js +26 -3
- package/dist/cli/bin/cli.js +5 -0
- package/dist/cli/commands/catalog-export.d.ts +5 -0
- package/dist/cli/commands/catalog-export.js +64 -0
- package/dist/cli/commands/declarative-apply.d.ts +6 -0
- package/dist/cli/commands/declarative-apply.js +288 -0
- package/dist/cli/commands/declarative-export.d.ts +5 -0
- package/dist/cli/commands/declarative-export.js +240 -0
- package/dist/cli/commands/plan.js +47 -16
- package/dist/cli/commands/sync.js +8 -12
- package/dist/cli/exit-code.d.ts +2 -0
- package/dist/cli/exit-code.js +7 -0
- package/dist/cli/formatters/tree/tree.js +3 -2
- package/dist/cli/utils/apply-display.d.ts +52 -0
- package/dist/cli/utils/apply-display.js +183 -0
- package/dist/cli/utils/export-display.d.ts +43 -0
- package/dist/cli/utils/export-display.js +202 -0
- package/dist/cli/utils/integrations.d.ts +30 -6
- package/dist/cli/utils/integrations.js +98 -6
- package/dist/cli/utils/resolve-input.d.ts +7 -0
- package/dist/cli/utils/resolve-input.js +13 -0
- package/dist/cli/utils.d.ts +2 -0
- package/dist/cli/utils.js +1 -1
- package/dist/core/catalog-export/index.d.ts +11 -0
- package/dist/core/catalog-export/index.js +10 -0
- package/dist/core/catalog.diff.d.ts +1 -0
- package/dist/core/catalog.diff.js +71 -49
- package/dist/core/catalog.model.d.ts +14 -1
- package/dist/core/catalog.model.js +103 -1
- package/dist/core/catalog.snapshot.d.ts +66 -0
- package/dist/core/catalog.snapshot.js +206 -0
- package/dist/core/change-utils.d.ts +9 -0
- package/dist/core/change-utils.js +71 -0
- package/dist/core/change.types.d.ts +22 -0
- package/dist/core/change.types.js +37 -1
- package/dist/core/connection-url.d.ts +32 -0
- package/dist/core/connection-url.js +77 -0
- package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
- package/dist/core/declarative-apply/discover-sql.js +86 -0
- package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
- package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
- package/dist/core/declarative-apply/index.d.ts +49 -0
- package/dist/core/declarative-apply/index.js +134 -0
- package/dist/core/declarative-apply/round-apply.d.ts +100 -0
- package/dist/core/declarative-apply/round-apply.js +378 -0
- package/dist/core/depend.js +25 -0
- package/dist/core/expand-replace-dependencies.d.ts +8 -2
- package/dist/core/expand-replace-dependencies.js +116 -10
- package/dist/core/export/file-mapper.d.ts +71 -0
- package/dist/core/export/file-mapper.js +474 -0
- package/dist/core/export/grouper.d.ts +13 -0
- package/dist/core/export/grouper.js +76 -0
- package/dist/core/export/index.d.ts +45 -0
- package/dist/core/export/index.js +66 -0
- package/dist/core/export/types.d.ts +84 -0
- package/dist/core/export/types.js +25 -0
- package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/dist/core/integrations/filter/dsl.d.ts +82 -41
- package/dist/core/integrations/filter/dsl.js +127 -61
- package/dist/core/integrations/filter/flatten.d.ts +51 -0
- package/dist/core/integrations/filter/flatten.js +116 -0
- package/dist/core/integrations/integration-dsl.d.ts +27 -1
- package/dist/core/integrations/integration.types.d.ts +26 -1
- package/dist/core/integrations/integration.types.js +31 -1
- package/dist/core/integrations/merge.d.ts +20 -0
- package/dist/core/integrations/merge.js +60 -0
- package/dist/core/integrations/serialize/dsl.d.ts +8 -12
- package/dist/core/integrations/serialize/dsl.js +2 -2
- package/dist/core/integrations/serialize/serialize.types.d.ts +31 -0
- package/dist/core/integrations/supabase.d.ts +8 -0
- package/dist/core/integrations/supabase.js +69 -8
- package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
- package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
- package/dist/core/objects/aggregate/aggregate.model.d.ts +8 -8
- package/dist/core/objects/aggregate/aggregate.model.js +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.alter.d.ts +2 -1
- package/dist/core/objects/aggregate/changes/aggregate.alter.js +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.comment.d.ts +3 -2
- package/dist/core/objects/aggregate/changes/aggregate.comment.js +2 -2
- package/dist/core/objects/aggregate/changes/aggregate.create.d.ts +2 -1
- package/dist/core/objects/aggregate/changes/aggregate.create.js +2 -2
- package/dist/core/objects/aggregate/changes/aggregate.drop.d.ts +2 -1
- package/dist/core/objects/aggregate/changes/aggregate.drop.js +2 -2
- package/dist/core/objects/aggregate/changes/aggregate.privilege.d.ts +4 -3
- package/dist/core/objects/aggregate/changes/aggregate.privilege.js +3 -3
- package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +1 -0
- package/dist/core/objects/base.change.d.ts +12 -1
- package/dist/core/objects/base.change.js +10 -0
- package/dist/core/objects/base.model.d.ts +4 -1
- package/dist/core/objects/base.model.js +5 -2
- package/dist/core/objects/base.privilege-diff.d.ts +38 -13
- package/dist/core/objects/base.privilege-diff.js +104 -22
- package/dist/core/objects/base.privilege.d.ts +1 -0
- package/dist/core/objects/base.privilege.js +9 -2
- package/dist/core/objects/collation/changes/collation.alter.d.ts +3 -2
- package/dist/core/objects/collation/changes/collation.alter.js +2 -2
- package/dist/core/objects/collation/changes/collation.comment.d.ts +3 -2
- package/dist/core/objects/collation/changes/collation.comment.js +2 -2
- package/dist/core/objects/collation/changes/collation.create.d.ts +2 -1
- package/dist/core/objects/collation/changes/collation.create.js +1 -1
- package/dist/core/objects/collation/changes/collation.drop.d.ts +2 -1
- package/dist/core/objects/collation/changes/collation.drop.js +1 -1
- package/dist/core/objects/collation/changes/collation.types.d.ts +1 -0
- package/dist/core/objects/collation/collation.diff.d.ts +2 -3
- package/dist/core/objects/diff-context.d.ts +15 -0
- package/dist/core/objects/diff-context.js +1 -0
- package/dist/core/objects/domain/changes/domain.alter.d.ts +9 -8
- package/dist/core/objects/domain/changes/domain.alter.js +8 -8
- package/dist/core/objects/domain/changes/domain.comment.d.ts +3 -2
- package/dist/core/objects/domain/changes/domain.comment.js +2 -2
- package/dist/core/objects/domain/changes/domain.create.d.ts +3 -2
- package/dist/core/objects/domain/changes/domain.create.js +12 -4
- package/dist/core/objects/domain/changes/domain.drop.d.ts +2 -1
- package/dist/core/objects/domain/changes/domain.drop.js +1 -1
- package/dist/core/objects/domain/changes/domain.privilege.d.ts +4 -3
- package/dist/core/objects/domain/changes/domain.privilege.js +3 -3
- package/dist/core/objects/domain/changes/domain.types.d.ts +1 -0
- package/dist/core/objects/domain/domain.diff.d.ts +2 -8
- package/dist/core/objects/domain/domain.diff.js +16 -77
- package/dist/core/objects/domain/domain.model.js +1 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.alter.d.ts +3 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.alter.js +2 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.comment.d.ts +3 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.comment.js +2 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.create.d.ts +2 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.create.js +1 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.drop.d.ts +2 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.drop.js +1 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +1 -0
- package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
- package/dist/core/objects/extension/changes/extension.alter.d.ts +3 -2
- package/dist/core/objects/extension/changes/extension.alter.js +2 -2
- package/dist/core/objects/extension/changes/extension.comment.d.ts +3 -2
- package/dist/core/objects/extension/changes/extension.comment.js +2 -2
- package/dist/core/objects/extension/changes/extension.create.d.ts +2 -1
- package/dist/core/objects/extension/changes/extension.create.js +4 -2
- package/dist/core/objects/extension/changes/extension.drop.d.ts +2 -1
- package/dist/core/objects/extension/changes/extension.drop.js +1 -1
- package/dist/core/objects/extension/changes/extension.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.d.ts +10 -9
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.js +9 -9
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.d.ts +1 -0
- package/dist/core/objects/index/changes/index.alter.d.ts +4 -3
- package/dist/core/objects/index/changes/index.alter.js +3 -3
- package/dist/core/objects/index/changes/index.comment.d.ts +3 -2
- package/dist/core/objects/index/changes/index.comment.js +2 -2
- package/dist/core/objects/index/changes/index.create.d.ts +2 -1
- package/dist/core/objects/index/changes/index.create.js +1 -1
- package/dist/core/objects/index/changes/index.drop.d.ts +2 -1
- package/dist/core/objects/index/changes/index.drop.js +1 -1
- package/dist/core/objects/index/changes/index.types.d.ts +1 -0
- package/dist/core/objects/index/index.model.js +12 -2
- package/dist/core/objects/language/changes/language.alter.d.ts +2 -1
- package/dist/core/objects/language/changes/language.alter.js +1 -1
- package/dist/core/objects/language/changes/language.comment.d.ts +3 -2
- package/dist/core/objects/language/changes/language.comment.js +2 -2
- package/dist/core/objects/language/changes/language.create.d.ts +2 -1
- package/dist/core/objects/language/changes/language.create.js +1 -1
- package/dist/core/objects/language/changes/language.drop.d.ts +2 -1
- package/dist/core/objects/language/changes/language.drop.js +1 -1
- package/dist/core/objects/language/changes/language.privilege.d.ts +4 -3
- package/dist/core/objects/language/changes/language.privilege.js +3 -3
- package/dist/core/objects/language/changes/language.types.d.ts +1 -0
- package/dist/core/objects/language/language.diff.d.ts +2 -5
- package/dist/core/objects/language/language.diff.js +7 -39
- package/dist/core/objects/materialized-view/changes/materialized-view.alter.d.ts +3 -2
- package/dist/core/objects/materialized-view/changes/materialized-view.alter.js +2 -2
- package/dist/core/objects/materialized-view/changes/materialized-view.comment.d.ts +5 -4
- package/dist/core/objects/materialized-view/changes/materialized-view.comment.js +4 -4
- package/dist/core/objects/materialized-view/changes/materialized-view.create.d.ts +2 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.create.js +1 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.drop.d.ts +2 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.drop.js +1 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.privilege.d.ts +4 -3
- package/dist/core/objects/materialized-view/changes/materialized-view.privilege.js +3 -3
- package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +1 -0
- package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
- package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
- package/dist/core/objects/materialized-view/materialized-view.model.d.ts +3 -3
- package/dist/core/objects/materialized-view/materialized-view.model.js +1 -1
- package/dist/core/objects/procedure/changes/procedure.alter.d.ts +8 -7
- package/dist/core/objects/procedure/changes/procedure.alter.js +19 -19
- package/dist/core/objects/procedure/changes/procedure.comment.d.ts +3 -2
- package/dist/core/objects/procedure/changes/procedure.comment.js +2 -2
- package/dist/core/objects/procedure/changes/procedure.create.d.ts +2 -1
- package/dist/core/objects/procedure/changes/procedure.create.js +1 -1
- package/dist/core/objects/procedure/changes/procedure.drop.d.ts +2 -1
- package/dist/core/objects/procedure/changes/procedure.drop.js +1 -1
- package/dist/core/objects/procedure/changes/procedure.privilege.d.ts +4 -3
- package/dist/core/objects/procedure/changes/procedure.privilege.js +3 -3
- package/dist/core/objects/procedure/changes/procedure.types.d.ts +1 -0
- package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
- package/dist/core/objects/procedure/procedure.diff.js +57 -97
- package/dist/core/objects/procedure/procedure.model.d.ts +9 -9
- package/dist/core/objects/procedure/procedure.model.js +1 -1
- package/dist/core/objects/publication/changes/publication.alter.d.ts +9 -16
- package/dist/core/objects/publication/changes/publication.alter.js +12 -21
- package/dist/core/objects/publication/changes/publication.comment.d.ts +3 -2
- package/dist/core/objects/publication/changes/publication.comment.js +2 -2
- package/dist/core/objects/publication/changes/publication.create.d.ts +2 -1
- package/dist/core/objects/publication/changes/publication.create.js +1 -1
- package/dist/core/objects/publication/changes/publication.drop.d.ts +2 -1
- package/dist/core/objects/publication/changes/publication.drop.js +1 -1
- package/dist/core/objects/publication/changes/publication.types.d.ts +3 -2
- package/dist/core/objects/publication/publication.diff.d.ts +2 -3
- package/dist/core/objects/publication/publication.diff.js +8 -13
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.d.ts +4 -3
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +6 -6
- package/dist/core/objects/rls-policy/changes/rls-policy.comment.d.ts +3 -2
- package/dist/core/objects/rls-policy/changes/rls-policy.comment.js +2 -2
- package/dist/core/objects/rls-policy/changes/rls-policy.create.d.ts +2 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.create.js +24 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.drop.d.ts +2 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.drop.js +1 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.types.d.ts +1 -0
- package/dist/core/objects/rls-policy/rls-policy.model.d.ts +51 -2
- package/dist/core/objects/rls-policy/rls-policy.model.js +122 -1
- package/dist/core/objects/role/changes/role.alter.d.ts +3 -2
- package/dist/core/objects/role/changes/role.alter.js +2 -2
- package/dist/core/objects/role/changes/role.comment.d.ts +3 -2
- package/dist/core/objects/role/changes/role.comment.js +2 -2
- package/dist/core/objects/role/changes/role.create.d.ts +2 -1
- package/dist/core/objects/role/changes/role.create.js +1 -1
- package/dist/core/objects/role/changes/role.drop.d.ts +2 -1
- package/dist/core/objects/role/changes/role.drop.js +1 -1
- package/dist/core/objects/role/changes/role.privilege.d.ts +6 -5
- package/dist/core/objects/role/changes/role.privilege.js +5 -5
- package/dist/core/objects/role/changes/role.types.d.ts +1 -0
- package/dist/core/objects/role/role.diff.js +22 -1
- package/dist/core/objects/role/role.model.d.ts +4 -3
- package/dist/core/objects/role/role.model.js +118 -12
- package/dist/core/objects/rule/changes/rule.alter.d.ts +3 -2
- package/dist/core/objects/rule/changes/rule.alter.js +2 -2
- package/dist/core/objects/rule/changes/rule.comment.d.ts +3 -2
- package/dist/core/objects/rule/changes/rule.comment.js +2 -2
- package/dist/core/objects/rule/changes/rule.create.d.ts +2 -1
- package/dist/core/objects/rule/changes/rule.create.js +1 -1
- package/dist/core/objects/rule/changes/rule.drop.d.ts +2 -1
- package/dist/core/objects/rule/changes/rule.drop.js +1 -1
- package/dist/core/objects/rule/changes/rule.types.d.ts +1 -0
- package/dist/core/objects/rule/rule.model.d.ts +1 -1
- package/dist/core/objects/schema/changes/schema.alter.d.ts +2 -1
- package/dist/core/objects/schema/changes/schema.alter.js +1 -1
- package/dist/core/objects/schema/changes/schema.comment.d.ts +3 -2
- package/dist/core/objects/schema/changes/schema.comment.js +2 -2
- package/dist/core/objects/schema/changes/schema.create.d.ts +3 -5
- package/dist/core/objects/schema/changes/schema.drop.d.ts +2 -1
- package/dist/core/objects/schema/changes/schema.drop.js +1 -1
- package/dist/core/objects/schema/changes/schema.privilege.d.ts +4 -3
- package/dist/core/objects/schema/changes/schema.privilege.js +3 -3
- package/dist/core/objects/schema/changes/schema.types.d.ts +1 -0
- package/dist/core/objects/schema/schema.diff.d.ts +2 -8
- package/dist/core/objects/schema/schema.diff.js +16 -77
- package/dist/core/objects/schema/schema.model.js +1 -1
- package/dist/core/objects/sequence/changes/sequence.alter.d.ts +3 -2
- package/dist/core/objects/sequence/changes/sequence.alter.js +2 -2
- package/dist/core/objects/sequence/changes/sequence.comment.d.ts +3 -2
- package/dist/core/objects/sequence/changes/sequence.comment.js +2 -2
- package/dist/core/objects/sequence/changes/sequence.create.d.ts +2 -1
- package/dist/core/objects/sequence/changes/sequence.create.js +1 -1
- package/dist/core/objects/sequence/changes/sequence.drop.d.ts +2 -1
- package/dist/core/objects/sequence/changes/sequence.drop.js +11 -3
- package/dist/core/objects/sequence/changes/sequence.privilege.d.ts +4 -3
- package/dist/core/objects/sequence/changes/sequence.privilege.js +3 -3
- package/dist/core/objects/sequence/changes/sequence.types.d.ts +1 -0
- package/dist/core/objects/sequence/sequence.diff.d.ts +5 -8
- package/dist/core/objects/sequence/sequence.diff.js +42 -85
- package/dist/core/objects/sequence/sequence.model.js +1 -1
- package/dist/core/objects/subscription/changes/subscription.alter.d.ts +7 -6
- package/dist/core/objects/subscription/changes/subscription.alter.js +6 -6
- package/dist/core/objects/subscription/changes/subscription.comment.d.ts +3 -2
- package/dist/core/objects/subscription/changes/subscription.comment.js +2 -2
- package/dist/core/objects/subscription/changes/subscription.create.d.ts +2 -1
- package/dist/core/objects/subscription/changes/subscription.create.js +1 -1
- package/dist/core/objects/subscription/changes/subscription.drop.d.ts +2 -1
- package/dist/core/objects/subscription/changes/subscription.drop.js +1 -1
- package/dist/core/objects/subscription/changes/subscription.types.d.ts +1 -0
- package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
- package/dist/core/objects/table/changes/table.alter.d.ts +65 -22
- package/dist/core/objects/table/changes/table.alter.js +111 -23
- package/dist/core/objects/table/changes/table.comment.d.ts +7 -6
- package/dist/core/objects/table/changes/table.comment.js +6 -6
- package/dist/core/objects/table/changes/table.create.d.ts +2 -1
- package/dist/core/objects/table/changes/table.create.js +4 -1
- package/dist/core/objects/table/changes/table.drop.d.ts +16 -3
- package/dist/core/objects/table/changes/table.drop.js +24 -1
- package/dist/core/objects/table/changes/table.privilege.d.ts +4 -3
- package/dist/core/objects/table/changes/table.privilege.js +3 -3
- package/dist/core/objects/table/changes/table.types.d.ts +1 -0
- package/dist/core/objects/table/table.diff.d.ts +2 -8
- package/dist/core/objects/table/table.diff.js +80 -160
- package/dist/core/objects/table/table.model.d.ts +29 -22
- package/dist/core/objects/table/table.model.js +6 -1
- package/dist/core/objects/trigger/changes/trigger.alter.d.ts +2 -1
- package/dist/core/objects/trigger/changes/trigger.alter.js +24 -1
- package/dist/core/objects/trigger/changes/trigger.comment.d.ts +3 -2
- package/dist/core/objects/trigger/changes/trigger.comment.js +2 -2
- package/dist/core/objects/trigger/changes/trigger.create.d.ts +2 -1
- package/dist/core/objects/trigger/changes/trigger.create.js +5 -6
- package/dist/core/objects/trigger/changes/trigger.drop.d.ts +2 -1
- package/dist/core/objects/trigger/changes/trigger.drop.js +1 -1
- package/dist/core/objects/trigger/changes/trigger.types.d.ts +1 -0
- package/dist/core/objects/trigger/trigger.diff.js +7 -2
- package/dist/core/objects/trigger/trigger.model.d.ts +10 -1
- package/dist/core/objects/trigger/trigger.model.js +19 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.alter.d.ts +5 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.alter.js +4 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.comment.d.ts +5 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.comment.js +4 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.create.d.ts +2 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.create.js +1 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.drop.d.ts +2 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.drop.js +1 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.privilege.d.ts +4 -3
- package/dist/core/objects/type/composite-type/changes/composite-type.privilege.js +3 -3
- package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +1 -0
- package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
- package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
- package/dist/core/objects/type/composite-type/composite-type.model.d.ts +3 -3
- package/dist/core/objects/type/composite-type/composite-type.model.js +2 -1
- package/dist/core/objects/type/enum/changes/enum.alter.d.ts +3 -2
- package/dist/core/objects/type/enum/changes/enum.alter.js +2 -2
- package/dist/core/objects/type/enum/changes/enum.comment.d.ts +3 -2
- package/dist/core/objects/type/enum/changes/enum.comment.js +2 -2
- package/dist/core/objects/type/enum/changes/enum.create.d.ts +2 -1
- package/dist/core/objects/type/enum/changes/enum.create.js +1 -1
- package/dist/core/objects/type/enum/changes/enum.drop.d.ts +2 -1
- package/dist/core/objects/type/enum/changes/enum.drop.js +1 -1
- package/dist/core/objects/type/enum/changes/enum.privilege.d.ts +4 -3
- package/dist/core/objects/type/enum/changes/enum.privilege.js +3 -3
- package/dist/core/objects/type/enum/changes/enum.types.d.ts +1 -0
- package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
- package/dist/core/objects/type/enum/enum.diff.js +25 -112
- package/dist/core/objects/type/enum/enum.model.js +1 -1
- package/dist/core/objects/type/range/changes/range.alter.d.ts +2 -1
- package/dist/core/objects/type/range/changes/range.alter.js +1 -1
- package/dist/core/objects/type/range/changes/range.comment.d.ts +3 -2
- package/dist/core/objects/type/range/changes/range.comment.js +2 -2
- package/dist/core/objects/type/range/changes/range.create.d.ts +2 -1
- package/dist/core/objects/type/range/changes/range.create.js +7 -4
- package/dist/core/objects/type/range/changes/range.drop.d.ts +2 -1
- package/dist/core/objects/type/range/changes/range.drop.js +1 -1
- package/dist/core/objects/type/range/changes/range.privilege.d.ts +4 -3
- package/dist/core/objects/type/range/changes/range.privilege.js +3 -3
- package/dist/core/objects/type/range/changes/range.types.d.ts +1 -0
- package/dist/core/objects/type/range/range.diff.d.ts +2 -8
- package/dist/core/objects/type/range/range.diff.js +16 -77
- package/dist/core/objects/type/range/range.model.js +1 -1
- package/dist/core/objects/type/type.types.d.ts +1 -0
- package/dist/core/objects/view/changes/view.alter.d.ts +4 -3
- package/dist/core/objects/view/changes/view.alter.js +3 -3
- package/dist/core/objects/view/changes/view.comment.d.ts +3 -2
- package/dist/core/objects/view/changes/view.comment.js +2 -2
- package/dist/core/objects/view/changes/view.create.d.ts +2 -1
- package/dist/core/objects/view/changes/view.create.js +1 -1
- package/dist/core/objects/view/changes/view.drop.d.ts +2 -1
- package/dist/core/objects/view/changes/view.drop.js +1 -1
- package/dist/core/objects/view/changes/view.privilege.d.ts +4 -3
- package/dist/core/objects/view/changes/view.privilege.js +3 -3
- package/dist/core/objects/view/changes/view.types.d.ts +1 -0
- package/dist/core/objects/view/view.diff.d.ts +2 -8
- package/dist/core/objects/view/view.diff.js +37 -168
- package/dist/core/objects/view/view.model.d.ts +18 -4
- package/dist/core/objects/view/view.model.js +3 -13
- package/dist/core/plan/apply.js +11 -28
- package/dist/core/plan/create.d.ts +19 -6
- package/dist/core/plan/create.js +154 -171
- package/dist/core/plan/serialize.js +16 -4
- package/dist/core/plan/sql-format/constants.d.ts +2 -0
- package/dist/core/plan/sql-format/constants.js +11 -0
- package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
- package/dist/core/plan/sql-format/fixtures.js +2455 -0
- package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
- package/dist/core/plan/sql-format/format-utils.js +274 -0
- package/dist/core/plan/sql-format/formatters.d.ts +20 -0
- package/dist/core/plan/sql-format/formatters.js +737 -0
- package/dist/core/plan/sql-format/index.d.ts +2 -0
- package/dist/core/plan/sql-format/index.js +98 -0
- package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
- package/dist/core/plan/sql-format/keyword-case.js +893 -0
- package/dist/core/plan/sql-format/protect.d.ts +3 -0
- package/dist/core/plan/sql-format/protect.js +269 -0
- package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
- package/dist/core/plan/sql-format/sql-scanner.js +202 -0
- package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
- package/dist/core/plan/sql-format/tokenizer.js +118 -0
- package/dist/core/plan/sql-format/types.d.ts +28 -0
- package/dist/core/plan/sql-format/types.js +1 -0
- package/dist/core/plan/sql-format/wrap.d.ts +2 -0
- package/dist/core/plan/sql-format/wrap.js +165 -0
- package/dist/core/plan/sql-format.d.ts +2 -0
- package/dist/core/plan/sql-format.js +1 -0
- package/dist/core/plan/ssl-config.d.ts +32 -0
- package/dist/core/plan/ssl-config.js +115 -0
- package/dist/core/plan/statements.d.ts +2 -1
- package/dist/core/plan/statements.js +6 -2
- package/dist/core/plan/types.d.ts +9 -6
- package/dist/core/post-diff-cycle-breaking.d.ts +29 -0
- package/dist/core/post-diff-cycle-breaking.js +209 -0
- package/dist/core/postgres-config.d.ts +89 -3
- package/dist/core/postgres-config.js +273 -4
- package/dist/core/sort/custom-constraints.js +65 -1
- package/dist/core/sort/graph-builder.js +10 -0
- package/dist/core/sort/logical-sort.js +34 -47
- package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
- package/dist/core/test-utils/assert-valid-sql.js +19 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -1
- package/package.json +59 -22
- package/src/cli/app.ts +52 -0
- package/src/cli/bin/cli.ts +15 -0
- package/src/cli/commands/apply.ts +101 -0
- package/src/cli/commands/catalog-export.ts +78 -0
- package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
- package/src/cli/commands/declarative-apply.ts +380 -0
- package/src/cli/commands/declarative-export.ts +322 -0
- package/src/cli/commands/plan.ts +210 -0
- package/src/cli/commands/sync.ts +178 -0
- package/src/cli/exit-code.test.ts +19 -0
- package/src/cli/exit-code.ts +7 -0
- package/src/cli/formatters/index.ts +5 -0
- package/src/cli/formatters/tree/tree-builder.ts +380 -0
- package/src/cli/formatters/tree/tree-renderer.ts +372 -0
- package/src/cli/formatters/tree/tree.ts +238 -0
- package/src/cli/utils/apply-display.test.ts +348 -0
- package/src/cli/utils/apply-display.ts +238 -0
- package/src/cli/utils/export-display.test.ts +103 -0
- package/src/cli/utils/export-display.ts +275 -0
- package/src/cli/utils/integrations.test.ts +251 -0
- package/src/cli/utils/integrations.ts +170 -0
- package/src/cli/utils/resolve-input.test.ts +38 -0
- package/src/cli/utils/resolve-input.ts +17 -0
- package/src/cli/utils.ts +231 -0
- package/src/core/catalog-export/index.ts +20 -0
- package/src/core/catalog.diff.ts +253 -0
- package/src/core/catalog.model.test.ts +122 -0
- package/src/core/catalog.model.ts +510 -0
- package/src/core/catalog.snapshot.test.ts +488 -0
- package/src/core/catalog.snapshot.ts +289 -0
- package/src/core/change-utils.test.ts +61 -0
- package/src/core/change-utils.ts +73 -0
- package/src/core/change.types.ts +94 -0
- package/src/core/connection-url.test.ts +142 -0
- package/src/core/connection-url.ts +82 -0
- package/src/core/context.ts +26 -0
- package/src/core/declarative-apply/discover-sql.test.ts +103 -0
- package/src/core/declarative-apply/discover-sql.ts +107 -0
- package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
- package/src/core/declarative-apply/index.test.ts +67 -0
- package/src/core/declarative-apply/index.ts +205 -0
- package/src/core/declarative-apply/round-apply.test.ts +504 -0
- package/src/core/declarative-apply/round-apply.ts +562 -0
- package/src/core/depend.ts +1895 -0
- package/src/core/expand-replace-dependencies.test.ts +552 -0
- package/src/core/expand-replace-dependencies.ts +536 -0
- package/src/core/export/file-mapper.test.ts +816 -0
- package/src/core/export/file-mapper.ts +579 -0
- package/src/core/export/grouper.ts +108 -0
- package/src/core/export/index.ts +138 -0
- package/src/core/export/types.ts +104 -0
- package/src/core/fingerprint.ts +204 -0
- package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/src/core/integrations/filter/dsl.test.ts +450 -0
- package/src/core/integrations/filter/dsl.ts +305 -0
- package/src/core/integrations/filter/filter.types.ts +3 -0
- package/src/core/integrations/filter/flatten.test.ts +282 -0
- package/src/core/integrations/filter/flatten.ts +150 -0
- package/src/core/integrations/integration-dsl.ts +50 -0
- package/src/core/integrations/integration.types.ts +65 -0
- package/src/core/integrations/merge.test.ts +128 -0
- package/src/core/integrations/merge.ts +72 -0
- package/src/core/integrations/serialize/dsl.test.ts +110 -0
- package/src/core/integrations/serialize/dsl.ts +71 -0
- package/src/core/integrations/serialize/serialize.types.ts +40 -0
- package/src/core/integrations/supabase.ts +180 -0
- package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
- package/src/core/objects/aggregate/aggregate.model.ts +317 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.ts +33 -0
- package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.ts +63 -0
- package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
- package/src/core/objects/aggregate/changes/aggregate.create.ts +330 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.ts +33 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.ts +147 -0
- package/src/core/objects/aggregate/changes/aggregate.types.ts +13 -0
- package/src/core/objects/base.change.ts +74 -0
- package/src/core/objects/base.default-privileges.ts +204 -0
- package/src/core/objects/base.diff.ts +20 -0
- package/src/core/objects/base.model.test.ts +43 -0
- package/src/core/objects/base.model.ts +85 -0
- package/src/core/objects/base.privilege-diff.ts +447 -0
- package/src/core/objects/base.privilege.ts +191 -0
- package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
- package/src/core/objects/collation/changes/collation.alter.ts +80 -0
- package/src/core/objects/collation/changes/collation.base.ts +20 -0
- package/src/core/objects/collation/changes/collation.comment.ts +69 -0
- package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
- package/src/core/objects/collation/changes/collation.create.ts +107 -0
- package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
- package/src/core/objects/collation/changes/collation.drop.ts +38 -0
- package/src/core/objects/collation/changes/collation.types.ts +11 -0
- package/src/core/objects/collation/collation.diff.test.ts +97 -0
- package/src/core/objects/collation/collation.diff.ts +127 -0
- package/src/core/objects/collation/collation.model.ts +224 -0
- package/src/core/objects/diff-context.ts +16 -0
- package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
- package/src/core/objects/domain/changes/domain.alter.ts +287 -0
- package/src/core/objects/domain/changes/domain.base.ts +20 -0
- package/src/core/objects/domain/changes/domain.comment.ts +60 -0
- package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
- package/src/core/objects/domain/changes/domain.create.ts +141 -0
- package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
- package/src/core/objects/domain/changes/domain.drop.ts +35 -0
- package/src/core/objects/domain/changes/domain.privilege.ts +172 -0
- package/src/core/objects/domain/changes/domain.types.ts +13 -0
- package/src/core/objects/domain/domain.diff.test.ts +284 -0
- package/src/core/objects/domain/domain.diff.ts +295 -0
- package/src/core/objects/domain/domain.model.ts +190 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +83 -0
- package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
- package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +67 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.ts +73 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +35 -0
- package/src/core/objects/event-trigger/changes/event-trigger.types.ts +11 -0
- package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
- package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
- package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
- package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
- package/src/core/objects/extension/changes/extension.alter.ts +79 -0
- package/src/core/objects/extension/changes/extension.base.ts +20 -0
- package/src/core/objects/extension/changes/extension.comment.ts +65 -0
- package/src/core/objects/extension/changes/extension.create.test.ts +50 -0
- package/src/core/objects/extension/changes/extension.create.ts +66 -0
- package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
- package/src/core/objects/extension/changes/extension.drop.ts +35 -0
- package/src/core/objects/extension/changes/extension.types.ts +11 -0
- package/src/core/objects/extension/extension.diff.test.ts +42 -0
- package/src/core/objects/extension/extension.diff.ts +90 -0
- package/src/core/objects/extension/extension.model.test.ts +98 -0
- package/src/core/objects/extension/extension.model.ts +280 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +102 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +73 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +96 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +37 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +173 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +13 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +11 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +342 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +73 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +82 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +38 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +182 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +13 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +127 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +61 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +82 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +35 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +165 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +13 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
- package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +70 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +67 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +41 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +9 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
- package/src/core/objects/index/changes/index.alter.test.ts +209 -0
- package/src/core/objects/index/changes/index.alter.ts +145 -0
- package/src/core/objects/index/changes/index.base.ts +20 -0
- package/src/core/objects/index/changes/index.comment.ts +64 -0
- package/src/core/objects/index/changes/index.create.test.ts +69 -0
- package/src/core/objects/index/changes/index.create.ts +69 -0
- package/src/core/objects/index/changes/index.drop.test.ts +47 -0
- package/src/core/objects/index/changes/index.drop.ts +35 -0
- package/src/core/objects/index/changes/index.types.ts +7 -0
- package/src/core/objects/index/changes/utils.ts +16 -0
- package/src/core/objects/index/index.diff.test.ts +153 -0
- package/src/core/objects/index/index.diff.ts +243 -0
- package/src/core/objects/index/index.model.test.ts +83 -0
- package/src/core/objects/index/index.model.ts +379 -0
- package/src/core/objects/language/changes/language.alter.test.ts +36 -0
- package/src/core/objects/language/changes/language.alter.ts +54 -0
- package/src/core/objects/language/changes/language.base.ts +20 -0
- package/src/core/objects/language/changes/language.comment.ts +59 -0
- package/src/core/objects/language/changes/language.create.test.ts +30 -0
- package/src/core/objects/language/changes/language.create.ts +105 -0
- package/src/core/objects/language/changes/language.drop.test.ts +28 -0
- package/src/core/objects/language/changes/language.drop.ts +40 -0
- package/src/core/objects/language/changes/language.privilege.ts +173 -0
- package/src/core/objects/language/changes/language.types.ts +13 -0
- package/src/core/objects/language/language.diff.test.ts +135 -0
- package/src/core/objects/language/language.diff.ts +144 -0
- package/src/core/objects/language/language.model.ts +150 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +114 -0
- package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
- package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +177 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.ts +94 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +61 -0
- package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +213 -0
- package/src/core/objects/materialized-view/changes/materialized-view.types.ts +13 -0
- package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
- package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
- package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
- package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
- package/src/core/objects/procedure/changes/procedure.alter.ts +291 -0
- package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
- package/src/core/objects/procedure/changes/procedure.comment.ts +71 -0
- package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
- package/src/core/objects/procedure/changes/procedure.create.ts +93 -0
- package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
- package/src/core/objects/procedure/changes/procedure.drop.ts +50 -0
- package/src/core/objects/procedure/changes/procedure.privilege.ts +189 -0
- package/src/core/objects/procedure/changes/procedure.types.ts +13 -0
- package/src/core/objects/procedure/procedure.diff.test.ts +284 -0
- package/src/core/objects/procedure/procedure.diff.ts +371 -0
- package/src/core/objects/procedure/procedure.model.ts +264 -0
- package/src/core/objects/procedure/utils.ts +58 -0
- package/src/core/objects/publication/changes/publication.alter.test.ts +221 -0
- package/src/core/objects/publication/changes/publication.alter.ts +232 -0
- package/src/core/objects/publication/changes/publication.base.ts +20 -0
- package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
- package/src/core/objects/publication/changes/publication.comment.ts +65 -0
- package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
- package/src/core/objects/publication/changes/publication.create.ts +83 -0
- package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
- package/src/core/objects/publication/changes/publication.drop.ts +30 -0
- package/src/core/objects/publication/changes/publication.types.ts +25 -0
- package/src/core/objects/publication/publication.diff.test.ts +297 -0
- package/src/core/objects/publication/publication.diff.ts +247 -0
- package/src/core/objects/publication/publication.model.ts +206 -0
- package/src/core/objects/publication/utils.ts +55 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +283 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +129 -0
- package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
- package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +70 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +209 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.ts +128 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +33 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +40 -0
- package/src/core/objects/rls-policy/changes/rls-policy.types.ts +11 -0
- package/src/core/objects/rls-policy/rls-policy.diff.test.ts +81 -0
- package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
- package/src/core/objects/rls-policy/rls-policy.model.ts +273 -0
- package/src/core/objects/role/changes/role.alter.test.ts +362 -0
- package/src/core/objects/role/changes/role.alter.ts +111 -0
- package/src/core/objects/role/changes/role.base.ts +24 -0
- package/src/core/objects/role/changes/role.comment.ts +56 -0
- package/src/core/objects/role/changes/role.create.test.ts +56 -0
- package/src/core/objects/role/changes/role.create.ts +103 -0
- package/src/core/objects/role/changes/role.drop.test.ts +32 -0
- package/src/core/objects/role/changes/role.drop.ts +35 -0
- package/src/core/objects/role/changes/role.privilege.ts +377 -0
- package/src/core/objects/role/changes/role.types.ts +13 -0
- package/src/core/objects/role/role.diff.test.ts +279 -0
- package/src/core/objects/role/role.diff.ts +499 -0
- package/src/core/objects/role/role.model.ts +452 -0
- package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
- package/src/core/objects/rule/changes/rule.alter.ts +73 -0
- package/src/core/objects/rule/changes/rule.base.ts +20 -0
- package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
- package/src/core/objects/rule/changes/rule.comment.ts +63 -0
- package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
- package/src/core/objects/rule/changes/rule.create.ts +43 -0
- package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
- package/src/core/objects/rule/changes/rule.drop.ts +30 -0
- package/src/core/objects/rule/changes/rule.types.ts +13 -0
- package/src/core/objects/rule/rule.diff.test.ts +132 -0
- package/src/core/objects/rule/rule.diff.ts +79 -0
- package/src/core/objects/rule/rule.model.ts +173 -0
- package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
- package/src/core/objects/schema/changes/schema.alter.ts +46 -0
- package/src/core/objects/schema/changes/schema.base.ts +20 -0
- package/src/core/objects/schema/changes/schema.comment.ts +57 -0
- package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
- package/src/core/objects/schema/changes/schema.create.ts +47 -0
- package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
- package/src/core/objects/schema/changes/schema.drop.ts +35 -0
- package/src/core/objects/schema/changes/schema.privilege.ts +176 -0
- package/src/core/objects/schema/changes/schema.types.ts +13 -0
- package/src/core/objects/schema/schema.diff.test.ts +42 -0
- package/src/core/objects/schema/schema.diff.ts +146 -0
- package/src/core/objects/schema/schema.model.ts +107 -0
- package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
- package/src/core/objects/sequence/changes/sequence.alter.ts +116 -0
- package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
- package/src/core/objects/sequence/changes/sequence.comment.ts +61 -0
- package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
- package/src/core/objects/sequence/changes/sequence.create.ts +112 -0
- package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
- package/src/core/objects/sequence/changes/sequence.drop.ts +50 -0
- package/src/core/objects/sequence/changes/sequence.privilege.ts +180 -0
- package/src/core/objects/sequence/changes/sequence.types.ts +13 -0
- package/src/core/objects/sequence/sequence.diff.test.ts +429 -0
- package/src/core/objects/sequence/sequence.diff.ts +326 -0
- package/src/core/objects/sequence/sequence.model.ts +185 -0
- package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
- package/src/core/objects/subscription/changes/subscription.alter.ts +111 -0
- package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
- package/src/core/objects/subscription/changes/subscription.comment.ts +65 -0
- package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
- package/src/core/objects/subscription/changes/subscription.create.ts +70 -0
- package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
- package/src/core/objects/subscription/changes/subscription.drop.ts +21 -0
- package/src/core/objects/subscription/changes/subscription.types.ts +23 -0
- package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
- package/src/core/objects/subscription/subscription.diff.ts +242 -0
- package/src/core/objects/subscription/subscription.model.ts +190 -0
- package/src/core/objects/subscription/utils.ts +156 -0
- package/src/core/objects/table/changes/table.alter.test.ts +899 -0
- package/src/core/objects/table/changes/table.alter.ts +910 -0
- package/src/core/objects/table/changes/table.base.ts +20 -0
- package/src/core/objects/table/changes/table.comment.ts +267 -0
- package/src/core/objects/table/changes/table.create.test.ts +188 -0
- package/src/core/objects/table/changes/table.create.ts +193 -0
- package/src/core/objects/table/changes/table.drop.test.ts +36 -0
- package/src/core/objects/table/changes/table.drop.ts +87 -0
- package/src/core/objects/table/changes/table.privilege.ts +201 -0
- package/src/core/objects/table/changes/table.types.ts +13 -0
- package/src/core/objects/table/table.diff.test.ts +1146 -0
- package/src/core/objects/table/table.diff.ts +889 -0
- package/src/core/objects/table/table.model.ts +462 -0
- package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
- package/src/core/objects/trigger/changes/trigger.alter.ts +77 -0
- package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
- package/src/core/objects/trigger/changes/trigger.comment.ts +65 -0
- package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
- package/src/core/objects/trigger/changes/trigger.create.ts +89 -0
- package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
- package/src/core/objects/trigger/changes/trigger.drop.ts +40 -0
- package/src/core/objects/trigger/changes/trigger.types.ts +11 -0
- package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
- package/src/core/objects/trigger/trigger.diff.ts +121 -0
- package/src/core/objects/trigger/trigger.model.ts +268 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +175 -0
- package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
- package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +146 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.ts +96 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +38 -0
- package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +176 -0
- package/src/core/objects/type/composite-type/changes/composite-type.types.ts +13 -0
- package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
- package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
- package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
- package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
- package/src/core/objects/type/enum/changes/enum.alter.ts +92 -0
- package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
- package/src/core/objects/type/enum/changes/enum.comment.ts +65 -0
- package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
- package/src/core/objects/type/enum/changes/enum.create.ts +57 -0
- package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
- package/src/core/objects/type/enum/changes/enum.drop.ts +35 -0
- package/src/core/objects/type/enum/changes/enum.privilege.ts +176 -0
- package/src/core/objects/type/enum/changes/enum.types.ts +13 -0
- package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
- package/src/core/objects/type/enum/enum.diff.ts +308 -0
- package/src/core/objects/type/enum/enum.model.ts +194 -0
- package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
- package/src/core/objects/type/range/changes/range.alter.ts +52 -0
- package/src/core/objects/type/range/changes/range.base.ts +20 -0
- package/src/core/objects/type/range/changes/range.comment.ts +65 -0
- package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
- package/src/core/objects/type/range/changes/range.create.ts +156 -0
- package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
- package/src/core/objects/type/range/changes/range.drop.ts +35 -0
- package/src/core/objects/type/range/changes/range.privilege.ts +176 -0
- package/src/core/objects/type/range/changes/range.types.ts +13 -0
- package/src/core/objects/type/range/range.diff.test.ts +147 -0
- package/src/core/objects/type/range/range.diff.ts +197 -0
- package/src/core/objects/type/range/range.model.ts +187 -0
- package/src/core/objects/type/type.types.ts +6 -0
- package/src/core/objects/utils.ts +171 -0
- package/src/core/objects/view/changes/view.alter.test.ts +115 -0
- package/src/core/objects/view/changes/view.alter.ts +113 -0
- package/src/core/objects/view/changes/view.base.ts +20 -0
- package/src/core/objects/view/changes/view.comment.ts +60 -0
- package/src/core/objects/view/changes/view.create.test.ts +70 -0
- package/src/core/objects/view/changes/view.create.ts +74 -0
- package/src/core/objects/view/changes/view.drop.test.ts +37 -0
- package/src/core/objects/view/changes/view.drop.ts +41 -0
- package/src/core/objects/view/changes/view.privilege.ts +201 -0
- package/src/core/objects/view/changes/view.types.ts +13 -0
- package/src/core/objects/view/view.diff.test.ts +269 -0
- package/src/core/objects/view/view.diff.ts +230 -0
- package/src/core/objects/view/view.model.ts +262 -0
- package/src/core/plan/apply.ts +172 -0
- package/src/core/plan/create.ts +368 -0
- package/src/core/plan/hierarchy.ts +574 -0
- package/src/core/plan/index.ts +29 -0
- package/src/core/plan/io.ts +20 -0
- package/src/core/plan/risk.ts +48 -0
- package/src/core/plan/serialize.test.ts +317 -0
- package/src/core/plan/serialize.ts +209 -0
- package/src/core/plan/sql-format/constants.ts +13 -0
- package/src/core/plan/sql-format/fixtures.ts +2811 -0
- package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
- package/src/core/plan/sql-format/format-functions.test.ts +127 -0
- package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
- package/src/core/plan/sql-format/format-off.test.ts +806 -0
- package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
- package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
- package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
- package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
- package/src/core/plan/sql-format/format-stress.test.ts +616 -0
- package/src/core/plan/sql-format/format-utils.test.ts +91 -0
- package/src/core/plan/sql-format/format-utils.ts +391 -0
- package/src/core/plan/sql-format/formatters.ts +921 -0
- package/src/core/plan/sql-format/index.ts +149 -0
- package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
- package/src/core/plan/sql-format/keyword-case.ts +1120 -0
- package/src/core/plan/sql-format/protect.test.ts +127 -0
- package/src/core/plan/sql-format/protect.ts +337 -0
- package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
- package/src/core/plan/sql-format/sql-scanner.ts +252 -0
- package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
- package/src/core/plan/sql-format/tokenizer.ts +152 -0
- package/src/core/plan/sql-format/types.ts +31 -0
- package/src/core/plan/sql-format/wrap.test.ts +119 -0
- package/src/core/plan/sql-format/wrap.ts +196 -0
- package/src/core/plan/sql-format.ts +2 -0
- package/src/core/plan/ssl-config.ts +172 -0
- package/src/core/plan/statements.ts +22 -0
- package/src/core/plan/types.ts +168 -0
- package/src/core/post-diff-cycle-breaking.test.ts +459 -0
- package/src/core/post-diff-cycle-breaking.ts +317 -0
- package/src/core/postgres-config.test.ts +336 -0
- package/src/core/postgres-config.ts +458 -0
- package/src/core/sort/custom-constraints.ts +235 -0
- package/src/core/sort/debug-visualization.ts +239 -0
- package/src/core/sort/dependency-filter.ts +224 -0
- package/src/core/sort/graph-builder.ts +235 -0
- package/src/core/sort/graph-utils.ts +51 -0
- package/src/core/sort/logical-sort.test.ts +371 -0
- package/src/core/sort/logical-sort.ts +573 -0
- package/src/core/sort/sort-changes.ts +234 -0
- package/src/core/sort/topological-sort.test.ts +275 -0
- package/src/core/sort/topological-sort.ts +184 -0
- package/src/core/sort/types.ts +112 -0
- package/src/core/sort/utils.ts +69 -0
- package/src/core/test-utils/assert-valid-sql.ts +20 -0
- package/src/index.ts +41 -0
- package/src/typedoc.ts +253 -0
- package/dist/core/integrations/filter/extractors.d.ts +0 -12
- package/dist/core/integrations/filter/extractors.js +0 -136
|
@@ -1,14 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* PostgreSQL connection configuration with custom type handlers.
|
|
3
3
|
*/
|
|
4
|
-
import type { PoolClient, PoolConfig } from "pg";
|
|
4
|
+
import type { ClientBase, PoolClient, PoolConfig } from "pg";
|
|
5
5
|
import { Pool } from "pg";
|
|
6
|
+
/**
|
|
7
|
+
* Return true when `err` represents a transient connect failure that makes
|
|
8
|
+
* sense to retry with backoff (e.g. refused connections, DNS blips, our own
|
|
9
|
+
* eager-connect timeout wrapper). Returns false for permanent failures such
|
|
10
|
+
* as authentication errors, TLS negotiation errors, and `ENOTFOUND`.
|
|
11
|
+
*
|
|
12
|
+
* Unknown errors are treated as retryable on purpose: transient-by-default
|
|
13
|
+
* is safer here because a duplicated retry is strictly cheaper than a spurious
|
|
14
|
+
* hard failure during catalog extraction.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isRetryableConnectError(err: unknown): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Retry an async `connect` operation with bounded exponential backoff.
|
|
19
|
+
* Stops immediately on a non-retryable error. On exhausted attempts, throws
|
|
20
|
+
* the last observed error.
|
|
21
|
+
*
|
|
22
|
+
* Exposed for testing — production call sites always go through
|
|
23
|
+
* {@link createManagedPool}.
|
|
24
|
+
*/
|
|
25
|
+
export declare function connectWithRetry<T>(opts: {
|
|
26
|
+
connect: (attempt: number) => Promise<T>;
|
|
27
|
+
isRetryable?: (err: unknown) => boolean;
|
|
28
|
+
maxAttempts?: number;
|
|
29
|
+
baseBackoffMs?: number;
|
|
30
|
+
maxBackoffMs?: number;
|
|
31
|
+
sleep?: (ms: number) => Promise<void>;
|
|
32
|
+
}): Promise<T>;
|
|
6
33
|
/**
|
|
7
34
|
* Options for creating a Pool with event listeners.
|
|
8
35
|
*/
|
|
9
36
|
interface CreatePoolOptions extends Partial<PoolConfig> {
|
|
10
37
|
/** Called when a new client connects to the pool */
|
|
11
|
-
onConnect?: (client:
|
|
38
|
+
onConnect?: (client: ClientBase) => void | Promise<void>;
|
|
12
39
|
/** Called when an idle client emits an error */
|
|
13
40
|
onError?: (err: Error, client: PoolClient) => void;
|
|
14
41
|
/** Called when a client is acquired from the pool */
|
|
@@ -18,6 +45,65 @@ interface CreatePoolOptions extends Partial<PoolConfig> {
|
|
|
18
45
|
}
|
|
19
46
|
/**
|
|
20
47
|
* Create a Pool with custom type handlers and optional event listeners.
|
|
48
|
+
*
|
|
49
|
+
* `connectionString` may be `undefined` when the caller needs pg to rely on
|
|
50
|
+
* explicit `host`/`port`/`user`/... fields from `options` instead — notably
|
|
51
|
+
* the bracketed-IPv6 workaround in {@link poolConfigFromUrl}, where passing
|
|
52
|
+
* the connection string would cause `pg-connection-string` to re-inject the
|
|
53
|
+
* bracketed host that breaks `getaddrinfo`.
|
|
54
|
+
*/
|
|
55
|
+
export declare function createPool(connectionString: string | undefined, options?: CreatePoolOptions): Pool;
|
|
56
|
+
/**
|
|
57
|
+
* Build a pg {@link PoolConfig} from a cleaned connection URL.
|
|
58
|
+
*
|
|
59
|
+
* For most URLs this just returns `{ connectionString }` and pg does its
|
|
60
|
+
* normal parsing. But for URLs whose hostname is a bracketed IPv6 literal
|
|
61
|
+
* (e.g. `postgresql://user@[::1]:5432/db`, as produced by
|
|
62
|
+
* {@link normalizeConnectionUrl}), we expand the URL into explicit
|
|
63
|
+
* `host`/`port`/`user`/`password`/`database` fields with a **bare** IPv6
|
|
64
|
+
* host — no brackets.
|
|
65
|
+
*
|
|
66
|
+
* This works around a `pg-connection-string` quirk: its parser sets
|
|
67
|
+
* `config.host` to the WHATWG `URL.hostname`, which keeps the surrounding
|
|
68
|
+
* `[...]` for IPv6 literals. That bracketed value is then passed verbatim to
|
|
69
|
+
* `getaddrinfo`, which rejects it with `ENOTFOUND`. Since
|
|
70
|
+
* `pg`'s connection-parameters module does
|
|
71
|
+
* `Object.assign({}, config, parse(connectionString))`, any `host` we pass
|
|
72
|
+
* alongside `connectionString` gets clobbered — so we drop `connectionString`
|
|
73
|
+
* entirely on this path and hand pg the parsed fields directly.
|
|
74
|
+
*
|
|
75
|
+
* Remaining query parameters (e.g. `application_name`, `options`,
|
|
76
|
+
* `connect_timeout`) are forwarded as top-level config keys, mirroring how
|
|
77
|
+
* `pg-connection-string` would normally surface them.
|
|
78
|
+
*/
|
|
79
|
+
export declare function poolConfigFromUrl(cleanedUrl: string): PoolConfig;
|
|
80
|
+
/**
|
|
81
|
+
* End a pool and wait for all client sockets to fully close.
|
|
82
|
+
*
|
|
83
|
+
* pg-pool's `pool.end()` resolves once clients are removed from its
|
|
84
|
+
* internal bookkeeping, but the underlying `client.end()` calls (which
|
|
85
|
+
* close the TCP/TLS sockets) are fired asynchronously *after* that.
|
|
86
|
+
* If the server (e.g. a test container) is stopped right after
|
|
87
|
+
* `pool.end()` resolves, the still-open sockets receive an unexpected
|
|
88
|
+
* RST and emit unhandled "Connection terminated unexpectedly" errors.
|
|
89
|
+
*
|
|
90
|
+
* This helper waits for every `remove` event — which pg-pool emits
|
|
91
|
+
* inside each `client.end()` callback — ensuring all sockets are
|
|
92
|
+
* truly closed before it resolves.
|
|
93
|
+
*/
|
|
94
|
+
/**
|
|
95
|
+
* Create a pool from a connection URL with standard session setup:
|
|
96
|
+
* SSL parsing, search_path isolation, optional SET ROLE, and 57P01 suppression.
|
|
97
|
+
*
|
|
98
|
+
* Returns the pool and a `close` function that properly waits for all sockets
|
|
99
|
+
* to close (via {@link endPool}).
|
|
21
100
|
*/
|
|
22
|
-
export declare function
|
|
101
|
+
export declare function createManagedPool(url: string, options?: {
|
|
102
|
+
role?: string;
|
|
103
|
+
label?: "source" | "target";
|
|
104
|
+
}): Promise<{
|
|
105
|
+
pool: Pool;
|
|
106
|
+
close: () => Promise<void>;
|
|
107
|
+
}>;
|
|
108
|
+
export declare function endPool(pool: Pool): Promise<void>;
|
|
23
109
|
export {};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* PostgreSQL connection configuration with custom type handlers.
|
|
3
3
|
*/
|
|
4
|
-
import { Pool, types } from "pg";
|
|
4
|
+
import { escapeIdentifier, Pool, types } from "pg";
|
|
5
|
+
import { normalizeConnectionUrl } from "./connection-url.js";
|
|
6
|
+
import { parseSslConfig } from "./plan/ssl-config.js";
|
|
5
7
|
// ============================================================================
|
|
6
8
|
// Array Parser
|
|
7
9
|
// ============================================================================
|
|
@@ -92,14 +94,152 @@ types.setTypeParser(1005, (val) => parseArray(val, parseIntElement)); // int2[]
|
|
|
92
94
|
types.setTypeParser(1007, (val) => parseArray(val, parseIntElement)); // int4[]
|
|
93
95
|
// @ts-expect-error - pg types expects TypeId but raw OID numbers work fine
|
|
94
96
|
types.setTypeParser(1016, (val) => parseArray(val, parseIntElement)); // int8[]
|
|
97
|
+
const DEFAULT_POOL_MAX = Number(process.env.PGDELTA_POOL_MAX) || 5;
|
|
98
|
+
const DEFAULT_CONNECTION_TIMEOUT_MS = Number(process.env.PGDELTA_CONNECTION_TIMEOUT_MS) || 3_000;
|
|
99
|
+
const DEFAULT_CONNECT_TIMEOUT_MS = Number(process.env.PGDELTA_CONNECT_TIMEOUT_MS) || 2_500;
|
|
100
|
+
const DEFAULT_CONNECT_MAX_ATTEMPTS = Number(process.env.PGDELTA_CONNECT_MAX_ATTEMPTS) || 3;
|
|
101
|
+
const DEFAULT_CONNECT_BASE_BACKOFF_MS = Number(process.env.PGDELTA_CONNECT_BASE_BACKOFF_MS) || 250;
|
|
102
|
+
const DEFAULT_CONNECT_MAX_BACKOFF_MS = Number(process.env.PGDELTA_CONNECT_MAX_BACKOFF_MS) || 1_000;
|
|
103
|
+
// PostgreSQL auth-class SQLSTATE codes: not retryable.
|
|
104
|
+
const NON_RETRYABLE_PG_CODES = new Set([
|
|
105
|
+
"28000", // invalid_authorization_specification
|
|
106
|
+
"28P01", // invalid_password
|
|
107
|
+
"28P02", // pgdelta: alias reserved here to future-proof against new auth codes
|
|
108
|
+
]);
|
|
109
|
+
// Non-retryable TLS/SSL markers. The `pg` driver surfaces TLS failures as
|
|
110
|
+
// either plain Node `Error` instances with a code on `ERR_TLS_*` or error
|
|
111
|
+
// messages that include well-known cert/TLS terminology; we match both
|
|
112
|
+
// because node-pg normalises some of these.
|
|
113
|
+
const TLS_MESSAGE_MARKERS = [
|
|
114
|
+
"self-signed certificate",
|
|
115
|
+
"self signed certificate",
|
|
116
|
+
"unable to verify the first certificate",
|
|
117
|
+
"certificate has expired",
|
|
118
|
+
"tls",
|
|
119
|
+
"ssl",
|
|
120
|
+
];
|
|
121
|
+
/**
|
|
122
|
+
* Return true when `err` represents a transient connect failure that makes
|
|
123
|
+
* sense to retry with backoff (e.g. refused connections, DNS blips, our own
|
|
124
|
+
* eager-connect timeout wrapper). Returns false for permanent failures such
|
|
125
|
+
* as authentication errors, TLS negotiation errors, and `ENOTFOUND`.
|
|
126
|
+
*
|
|
127
|
+
* Unknown errors are treated as retryable on purpose: transient-by-default
|
|
128
|
+
* is safer here because a duplicated retry is strictly cheaper than a spurious
|
|
129
|
+
* hard failure during catalog extraction.
|
|
130
|
+
*/
|
|
131
|
+
export function isRetryableConnectError(err) {
|
|
132
|
+
if (!(err instanceof Error))
|
|
133
|
+
return true;
|
|
134
|
+
const code = err.code;
|
|
135
|
+
if (code && NON_RETRYABLE_PG_CODES.has(code))
|
|
136
|
+
return false;
|
|
137
|
+
if (code === "ENOTFOUND")
|
|
138
|
+
return false;
|
|
139
|
+
if (code && typeof code === "string" && code.startsWith("ERR_TLS")) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
const message = err.message?.toLowerCase() ?? "";
|
|
143
|
+
// Our own eager-connect timeout wrapper is retryable (flaky network).
|
|
144
|
+
if (message.includes("timed out after"))
|
|
145
|
+
return true;
|
|
146
|
+
for (const marker of TLS_MESSAGE_MARKERS) {
|
|
147
|
+
if (message.includes(marker))
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Retry an async `connect` operation with bounded exponential backoff.
|
|
154
|
+
* Stops immediately on a non-retryable error. On exhausted attempts, throws
|
|
155
|
+
* the last observed error.
|
|
156
|
+
*
|
|
157
|
+
* Exposed for testing — production call sites always go through
|
|
158
|
+
* {@link createManagedPool}.
|
|
159
|
+
*/
|
|
160
|
+
export async function connectWithRetry(opts) {
|
|
161
|
+
const maxAttempts = opts.maxAttempts ?? DEFAULT_CONNECT_MAX_ATTEMPTS;
|
|
162
|
+
const baseBackoffMs = opts.baseBackoffMs ?? DEFAULT_CONNECT_BASE_BACKOFF_MS;
|
|
163
|
+
const maxBackoffMs = opts.maxBackoffMs ?? DEFAULT_CONNECT_MAX_BACKOFF_MS;
|
|
164
|
+
const isRetryable = opts.isRetryable ?? isRetryableConnectError;
|
|
165
|
+
const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
166
|
+
let lastError;
|
|
167
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
168
|
+
try {
|
|
169
|
+
return await opts.connect(attempt);
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
lastError = err;
|
|
173
|
+
if (attempt >= maxAttempts || !isRetryable(err)) {
|
|
174
|
+
throw err;
|
|
175
|
+
}
|
|
176
|
+
const backoff = Math.min(baseBackoffMs * 2 ** (attempt - 1), maxBackoffMs);
|
|
177
|
+
await sleep(backoff);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Unreachable: loop either returns or throws.
|
|
181
|
+
throw lastError;
|
|
182
|
+
}
|
|
95
183
|
/**
|
|
96
184
|
* Create a Pool with custom type handlers and optional event listeners.
|
|
185
|
+
*
|
|
186
|
+
* `connectionString` may be `undefined` when the caller needs pg to rely on
|
|
187
|
+
* explicit `host`/`port`/`user`/... fields from `options` instead — notably
|
|
188
|
+
* the bracketed-IPv6 workaround in {@link poolConfigFromUrl}, where passing
|
|
189
|
+
* the connection string would cause `pg-connection-string` to re-inject the
|
|
190
|
+
* bracketed host that breaks `getaddrinfo`.
|
|
97
191
|
*/
|
|
98
192
|
export function createPool(connectionString, options) {
|
|
99
193
|
const { onConnect, onError, onAcquire, onRemove, ...config } = options ?? {};
|
|
100
|
-
const pool = new Pool({
|
|
101
|
-
|
|
102
|
-
|
|
194
|
+
const pool = new Pool({
|
|
195
|
+
...(connectionString ? { connectionString } : {}),
|
|
196
|
+
max: DEFAULT_POOL_MAX,
|
|
197
|
+
connectionTimeoutMillis: DEFAULT_CONNECTION_TIMEOUT_MS,
|
|
198
|
+
...config,
|
|
199
|
+
});
|
|
200
|
+
if (onConnect) {
|
|
201
|
+
const pendingClientSetup = new WeakMap();
|
|
202
|
+
const waitForClientSetup = async (client) => {
|
|
203
|
+
const setup = pendingClientSetup.get(client);
|
|
204
|
+
if (setup) {
|
|
205
|
+
await setup;
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
throw new Error("Internal error: pool client was acquired before async onConnect setup was registered. This indicates a bug in the pool wrapper logic; please report it with reproduction steps.");
|
|
209
|
+
};
|
|
210
|
+
const originalConnect = pool.connect.bind(pool);
|
|
211
|
+
pool.on("connect", (client) => {
|
|
212
|
+
pendingClientSetup.set(client, Promise.resolve().then(() => onConnect(client)));
|
|
213
|
+
});
|
|
214
|
+
pool.connect = ((callback) => {
|
|
215
|
+
if (!callback) {
|
|
216
|
+
return originalConnect().then(async (client) => {
|
|
217
|
+
try {
|
|
218
|
+
await waitForClientSetup(client);
|
|
219
|
+
return client;
|
|
220
|
+
}
|
|
221
|
+
catch (setupError) {
|
|
222
|
+
client.release?.(setupError);
|
|
223
|
+
throw setupError;
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return originalConnect(async (err, client, release) => {
|
|
228
|
+
if (err || !client) {
|
|
229
|
+
callback(err, client, release);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
await waitForClientSetup(client);
|
|
234
|
+
callback(err, client, release);
|
|
235
|
+
}
|
|
236
|
+
catch (setupError) {
|
|
237
|
+
release(setupError);
|
|
238
|
+
callback(setupError, undefined, () => { });
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
}
|
|
103
243
|
if (onError)
|
|
104
244
|
pool.on("error", onError);
|
|
105
245
|
if (onAcquire)
|
|
@@ -108,3 +248,132 @@ export function createPool(connectionString, options) {
|
|
|
108
248
|
pool.on("remove", onRemove);
|
|
109
249
|
return pool;
|
|
110
250
|
}
|
|
251
|
+
/**
|
|
252
|
+
* Build a pg {@link PoolConfig} from a cleaned connection URL.
|
|
253
|
+
*
|
|
254
|
+
* For most URLs this just returns `{ connectionString }` and pg does its
|
|
255
|
+
* normal parsing. But for URLs whose hostname is a bracketed IPv6 literal
|
|
256
|
+
* (e.g. `postgresql://user@[::1]:5432/db`, as produced by
|
|
257
|
+
* {@link normalizeConnectionUrl}), we expand the URL into explicit
|
|
258
|
+
* `host`/`port`/`user`/`password`/`database` fields with a **bare** IPv6
|
|
259
|
+
* host — no brackets.
|
|
260
|
+
*
|
|
261
|
+
* This works around a `pg-connection-string` quirk: its parser sets
|
|
262
|
+
* `config.host` to the WHATWG `URL.hostname`, which keeps the surrounding
|
|
263
|
+
* `[...]` for IPv6 literals. That bracketed value is then passed verbatim to
|
|
264
|
+
* `getaddrinfo`, which rejects it with `ENOTFOUND`. Since
|
|
265
|
+
* `pg`'s connection-parameters module does
|
|
266
|
+
* `Object.assign({}, config, parse(connectionString))`, any `host` we pass
|
|
267
|
+
* alongside `connectionString` gets clobbered — so we drop `connectionString`
|
|
268
|
+
* entirely on this path and hand pg the parsed fields directly.
|
|
269
|
+
*
|
|
270
|
+
* Remaining query parameters (e.g. `application_name`, `options`,
|
|
271
|
+
* `connect_timeout`) are forwarded as top-level config keys, mirroring how
|
|
272
|
+
* `pg-connection-string` would normally surface them.
|
|
273
|
+
*/
|
|
274
|
+
export function poolConfigFromUrl(cleanedUrl) {
|
|
275
|
+
const urlObj = new URL(cleanedUrl);
|
|
276
|
+
if (!urlObj.hostname.startsWith("[")) {
|
|
277
|
+
return { connectionString: cleanedUrl };
|
|
278
|
+
}
|
|
279
|
+
const config = {
|
|
280
|
+
host: urlObj.hostname.slice(1, -1),
|
|
281
|
+
};
|
|
282
|
+
if (urlObj.port)
|
|
283
|
+
config.port = Number(urlObj.port);
|
|
284
|
+
if (urlObj.username)
|
|
285
|
+
config.user = decodeURIComponent(urlObj.username);
|
|
286
|
+
if (urlObj.password)
|
|
287
|
+
config.password = decodeURIComponent(urlObj.password);
|
|
288
|
+
if (urlObj.pathname.length > 1) {
|
|
289
|
+
config.database = decodeURIComponent(urlObj.pathname.slice(1));
|
|
290
|
+
}
|
|
291
|
+
for (const [key, value] of urlObj.searchParams) {
|
|
292
|
+
config[key] = value;
|
|
293
|
+
}
|
|
294
|
+
return config;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* End a pool and wait for all client sockets to fully close.
|
|
298
|
+
*
|
|
299
|
+
* pg-pool's `pool.end()` resolves once clients are removed from its
|
|
300
|
+
* internal bookkeeping, but the underlying `client.end()` calls (which
|
|
301
|
+
* close the TCP/TLS sockets) are fired asynchronously *after* that.
|
|
302
|
+
* If the server (e.g. a test container) is stopped right after
|
|
303
|
+
* `pool.end()` resolves, the still-open sockets receive an unexpected
|
|
304
|
+
* RST and emit unhandled "Connection terminated unexpectedly" errors.
|
|
305
|
+
*
|
|
306
|
+
* This helper waits for every `remove` event — which pg-pool emits
|
|
307
|
+
* inside each `client.end()` callback — ensuring all sockets are
|
|
308
|
+
* truly closed before it resolves.
|
|
309
|
+
*/
|
|
310
|
+
/**
|
|
311
|
+
* Create a pool from a connection URL with standard session setup:
|
|
312
|
+
* SSL parsing, search_path isolation, optional SET ROLE, and 57P01 suppression.
|
|
313
|
+
*
|
|
314
|
+
* Returns the pool and a `close` function that properly waits for all sockets
|
|
315
|
+
* to close (via {@link endPool}).
|
|
316
|
+
*/
|
|
317
|
+
export async function createManagedPool(url, options) {
|
|
318
|
+
// Normalize percent-encoded IPv6 hosts (e.g. `2406%3A...%3Ab3c9`) into the
|
|
319
|
+
// canonical bracketed form before the URL reaches `parseSslConfig` or pg.
|
|
320
|
+
// Non-IPv6 hosts are returned unchanged.
|
|
321
|
+
const normalizedUrl = normalizeConnectionUrl(url);
|
|
322
|
+
const sslConfig = await parseSslConfig(normalizedUrl, options?.label ?? "target");
|
|
323
|
+
// Expand bracketed-IPv6 URLs into explicit pg fields so the brackets never
|
|
324
|
+
// reach `getaddrinfo` — see `poolConfigFromUrl` for the full rationale.
|
|
325
|
+
const connectionConfig = poolConfigFromUrl(sslConfig.cleanedUrl);
|
|
326
|
+
const pool = createPool(connectionConfig.connectionString, {
|
|
327
|
+
...connectionConfig,
|
|
328
|
+
...(sslConfig.ssl !== undefined ? { ssl: sslConfig.ssl } : {}),
|
|
329
|
+
onError: (err) => {
|
|
330
|
+
if (err.code !== "57P01") {
|
|
331
|
+
console.error("Pool error:", err);
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
onConnect: async (client) => {
|
|
335
|
+
await client.query("SET search_path = ''");
|
|
336
|
+
if (options?.role) {
|
|
337
|
+
await client.query(`SET ROLE ${escapeIdentifier(options.role)}`);
|
|
338
|
+
}
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
// Eagerly validate connectivity so SSL/auth failures surface immediately
|
|
342
|
+
// instead of hanging on the first real query. node-pg's connectionTimeoutMillis
|
|
343
|
+
// is not reliably enforced under Bun when SSL negotiation hangs. Transient
|
|
344
|
+
// failures (refused connections, flaky DNS, our own timeout wrapper) are
|
|
345
|
+
// retried with bounded exponential backoff; auth/TLS/ENOTFOUND fail fast.
|
|
346
|
+
const label = options?.label ?? "target";
|
|
347
|
+
const timeoutMs = DEFAULT_CONNECT_TIMEOUT_MS;
|
|
348
|
+
try {
|
|
349
|
+
const client = await connectWithRetry({
|
|
350
|
+
connect: () => Promise.race([
|
|
351
|
+
pool.connect(),
|
|
352
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`Connection to ${label} database timed out after ${timeoutMs}ms. ` +
|
|
353
|
+
`The server may require SSL, use an invalid certificate, or be unreachable.`)), timeoutMs)),
|
|
354
|
+
]),
|
|
355
|
+
});
|
|
356
|
+
client.release();
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
await pool.end().catch(() => { });
|
|
360
|
+
throw err;
|
|
361
|
+
}
|
|
362
|
+
return { pool, close: () => endPool(pool) };
|
|
363
|
+
}
|
|
364
|
+
export function endPool(pool) {
|
|
365
|
+
const clientCount = pool.totalCount;
|
|
366
|
+
if (clientCount === 0) {
|
|
367
|
+
return pool.end();
|
|
368
|
+
}
|
|
369
|
+
return new Promise((resolve, reject) => {
|
|
370
|
+
let removed = 0;
|
|
371
|
+
pool.on("remove", function onRemove() {
|
|
372
|
+
if (++removed >= clientCount) {
|
|
373
|
+
pool.removeListener("remove", onRemove);
|
|
374
|
+
resolve();
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
pool.end().catch(reject);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { getSchema } from "../
|
|
1
|
+
import { getSchema } from "../change-utils.js";
|
|
2
2
|
import { GrantRoleDefaultPrivileges, RevokeRoleDefaultPrivileges, } from "../objects/role/changes/role.privilege.js";
|
|
3
|
+
import { AlterTableAlterColumnAddIdentity, AlterTableAlterColumnDropDefault, AlterTableAlterColumnDropIdentity, AlterTableAlterColumnSetDefault, } from "../objects/table/changes/table.alter.js";
|
|
3
4
|
/**
|
|
4
5
|
* Maps object type names to PostgreSQL default privilege objtype codes.
|
|
5
6
|
* This mirrors the mapping in base.default-privileges.ts.
|
|
@@ -116,11 +117,74 @@ function generateDefaultPrivilegeConstraints(changes) {
|
|
|
116
117
|
}
|
|
117
118
|
return constraints;
|
|
118
119
|
}
|
|
120
|
+
function generateIdentityTransitionConstraints(changes) {
|
|
121
|
+
const constraints = [];
|
|
122
|
+
const dropDefaultByColumn = new Map();
|
|
123
|
+
const dropIdentityByColumn = new Map();
|
|
124
|
+
const addIdentityByColumn = new Map();
|
|
125
|
+
const setDefaultByColumn = new Map();
|
|
126
|
+
for (let i = 0; i < changes.length; i++) {
|
|
127
|
+
const change = changes[i];
|
|
128
|
+
const columnKey = "table" in change && "column" in change
|
|
129
|
+
? `${change.table.schema}.${change.table.name}.${change.column.name}`
|
|
130
|
+
: null;
|
|
131
|
+
if (!columnKey)
|
|
132
|
+
continue;
|
|
133
|
+
if (change instanceof AlterTableAlterColumnDropDefault) {
|
|
134
|
+
const entries = dropDefaultByColumn.get(columnKey) ?? [];
|
|
135
|
+
entries.push(i);
|
|
136
|
+
dropDefaultByColumn.set(columnKey, entries);
|
|
137
|
+
}
|
|
138
|
+
else if (change instanceof AlterTableAlterColumnAddIdentity) {
|
|
139
|
+
const entries = addIdentityByColumn.get(columnKey) ?? [];
|
|
140
|
+
entries.push(i);
|
|
141
|
+
addIdentityByColumn.set(columnKey, entries);
|
|
142
|
+
}
|
|
143
|
+
else if (change instanceof AlterTableAlterColumnDropIdentity) {
|
|
144
|
+
const entries = dropIdentityByColumn.get(columnKey) ?? [];
|
|
145
|
+
entries.push(i);
|
|
146
|
+
dropIdentityByColumn.set(columnKey, entries);
|
|
147
|
+
}
|
|
148
|
+
else if (change instanceof AlterTableAlterColumnSetDefault) {
|
|
149
|
+
const entries = setDefaultByColumn.get(columnKey) ?? [];
|
|
150
|
+
entries.push(i);
|
|
151
|
+
setDefaultByColumn.set(columnKey, entries);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// These rules only order same-column ALTERs inside the create/alter phase.
|
|
155
|
+
// Sequence drops are handled separately in the earlier drop phase.
|
|
156
|
+
for (const [columnKey, dropDefaultIndexes] of dropDefaultByColumn) {
|
|
157
|
+
const addIdentityIndexes = addIdentityByColumn.get(columnKey) ?? [];
|
|
158
|
+
for (const sourceIndex of dropDefaultIndexes) {
|
|
159
|
+
for (const targetIndex of addIdentityIndexes) {
|
|
160
|
+
constraints.push({
|
|
161
|
+
sourceChangeIndex: sourceIndex,
|
|
162
|
+
targetChangeIndex: targetIndex,
|
|
163
|
+
source: "custom",
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
for (const [columnKey, dropIdentityIndexes] of dropIdentityByColumn) {
|
|
169
|
+
const setDefaultIndexes = setDefaultByColumn.get(columnKey) ?? [];
|
|
170
|
+
for (const sourceIndex of dropIdentityIndexes) {
|
|
171
|
+
for (const targetIndex of setDefaultIndexes) {
|
|
172
|
+
constraints.push({
|
|
173
|
+
sourceChangeIndex: sourceIndex,
|
|
174
|
+
targetChangeIndex: targetIndex,
|
|
175
|
+
source: "custom",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return constraints;
|
|
181
|
+
}
|
|
119
182
|
/**
|
|
120
183
|
* All custom constraint generators.
|
|
121
184
|
*/
|
|
122
185
|
const customConstraintGenerators = [
|
|
123
186
|
generateDefaultPrivilegeConstraints,
|
|
187
|
+
generateIdentityTransitionConstraints,
|
|
124
188
|
];
|
|
125
189
|
/**
|
|
126
190
|
* Generate Constraints from custom constraint generators.
|
|
@@ -56,7 +56,17 @@ export function convertExplicitRequirementsToConstraints(phaseChanges, graphData
|
|
|
56
56
|
const requiredIds = graphData.explicitRequirementSets[consumerIndex];
|
|
57
57
|
if (requiredIds.size === 0)
|
|
58
58
|
continue;
|
|
59
|
+
// Collect dropped IDs for this change so we can skip requirements
|
|
60
|
+
// for stableIds that this change also drops. A change that drops a
|
|
61
|
+
// stableId should not depend on another change that creates the same
|
|
62
|
+
// stableId, because the entity already exists in the source database.
|
|
63
|
+
// This prevents false ordering constraints such as Grant → Revoke
|
|
64
|
+
// when both operate on the same ACL stableId.
|
|
65
|
+
const droppedIds = new Set(phaseChanges[consumerIndex].drops);
|
|
59
66
|
for (const requiredId of requiredIds) {
|
|
67
|
+
if (droppedIds.has(requiredId)) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
60
70
|
const producerIndexes = graphData.changeIndexesByCreatedId.get(requiredId);
|
|
61
71
|
if (!producerIndexes || producerIndexes.size === 0)
|
|
62
72
|
continue;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* It groups related changes together while preserving the ability for the dependency
|
|
9
9
|
* resolver to reorder within groups when necessary.
|
|
10
10
|
*/
|
|
11
|
-
import { getSchema } from "../
|
|
11
|
+
import { getSchema } from "../change-utils.js";
|
|
12
12
|
import { getExecutionPhase, isMetadataStableId } from "./utils.js";
|
|
13
13
|
/**
|
|
14
14
|
* Object type ordering for logical grouping.
|
|
@@ -145,6 +145,25 @@ function getMainStableId(change) {
|
|
|
145
145
|
}
|
|
146
146
|
return null;
|
|
147
147
|
}
|
|
148
|
+
// For default_privilege operations: group by role + schema combination (before CREATE so we group and use tiebreaker)
|
|
149
|
+
if (change.scope === "default_privilege") {
|
|
150
|
+
if (change.requires.length > 0) {
|
|
151
|
+
let grantingRole = null;
|
|
152
|
+
let schemaId = null;
|
|
153
|
+
for (const id of change.requires) {
|
|
154
|
+
if (id.startsWith("role:")) {
|
|
155
|
+
grantingRole = id;
|
|
156
|
+
}
|
|
157
|
+
else if (id.startsWith("schema:")) {
|
|
158
|
+
schemaId = id;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (schemaId && grantingRole) {
|
|
162
|
+
return `${grantingRole}:${schemaId}`;
|
|
163
|
+
}
|
|
164
|
+
return grantingRole ?? null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
148
167
|
// For CREATE operations: check if creating a constraint (sub-entity of table)
|
|
149
168
|
if (change.operation === "create" && change.creates.length > 0) {
|
|
150
169
|
// Iterate through creates to find the first non-metadata stable ID
|
|
@@ -182,29 +201,6 @@ function getMainStableId(change) {
|
|
|
182
201
|
// Fallback: if all drops are metadata, use first
|
|
183
202
|
return change.drops[0] ?? null;
|
|
184
203
|
}
|
|
185
|
-
// For default_privilege operations: group by role + schema combination
|
|
186
|
-
// This groups all "FOR ROLE X IN SCHEMA Y" statements together
|
|
187
|
-
if (change.scope === "default_privilege") {
|
|
188
|
-
if (change.requires.length > 0) {
|
|
189
|
-
// Iterate through requires to find role and schema
|
|
190
|
-
let grantingRole = null;
|
|
191
|
-
let schemaId = null;
|
|
192
|
-
for (const id of change.requires) {
|
|
193
|
-
if (id.startsWith("role:")) {
|
|
194
|
-
grantingRole = id;
|
|
195
|
-
}
|
|
196
|
-
else if (id.startsWith("schema:")) {
|
|
197
|
-
schemaId = id;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
if (schemaId && grantingRole) {
|
|
201
|
-
// Create composite key: "role:postgres:schema:public"
|
|
202
|
-
return `${grantingRole}:${schemaId}`;
|
|
203
|
-
}
|
|
204
|
-
// If no schema, just group by role
|
|
205
|
-
return grantingRole ?? null;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
204
|
// For ALTER operations: check if creating/dropping a constraint
|
|
209
205
|
// Skip this for privilege/comment/default_privilege scopes (handled above)
|
|
210
206
|
if (change.operation === "alter") {
|
|
@@ -291,27 +287,6 @@ function getParentStableId(change) {
|
|
|
291
287
|
// Fallback: return first requires if available
|
|
292
288
|
return requires.length > 0 ? requires[0] : null;
|
|
293
289
|
}
|
|
294
|
-
/**
|
|
295
|
-
* Extract schema name from a change.
|
|
296
|
-
* Returns the schema name if present, or null for non-schema objects.
|
|
297
|
-
*
|
|
298
|
-
* Uses the getSchema helper which directly accesses schema properties from change objects.
|
|
299
|
-
* For default_privilege changes, accesses the inSchema property directly.
|
|
300
|
-
* For event_trigger changes, groups by their function's schema.
|
|
301
|
-
*/
|
|
302
|
-
function extractSchemaFromChange(change) {
|
|
303
|
-
// Handle default_privilege changes specially (they have inSchema property)
|
|
304
|
-
if (change.scope === "default_privilege") {
|
|
305
|
-
// TypeScript doesn't know about inSchema, but we know it exists for default_privilege changes
|
|
306
|
-
return change.inSchema ?? null;
|
|
307
|
-
}
|
|
308
|
-
// Handle event_trigger changes specially - group by their function's schema
|
|
309
|
-
if (change.objectType === "event_trigger") {
|
|
310
|
-
return change.eventTrigger.function_schema;
|
|
311
|
-
}
|
|
312
|
-
// Use the getSchema helper for all other changes
|
|
313
|
-
return getSchema(change);
|
|
314
|
-
}
|
|
315
290
|
/**
|
|
316
291
|
* Get the effective object type for sorting purposes.
|
|
317
292
|
* For sub-entities, returns the parent's object type (table/view/materialized_view).
|
|
@@ -403,8 +378,8 @@ function sortPhase(changes, phase) {
|
|
|
403
378
|
const changeA = a.change;
|
|
404
379
|
const changeB = b.change;
|
|
405
380
|
// 1. Compare schemas (group objects by schema)
|
|
406
|
-
const schemaA =
|
|
407
|
-
const schemaB =
|
|
381
|
+
const schemaA = getSchema(changeA);
|
|
382
|
+
const schemaB = getSchema(changeB);
|
|
408
383
|
// Non-schema objects (roles, languages, extensions, etc.) sort first
|
|
409
384
|
// Use a special prefix to ensure they come before schema objects
|
|
410
385
|
const schemaKeyA = schemaA === null ? "::" : schemaA;
|
|
@@ -525,6 +500,18 @@ function sortPhase(changes, phase) {
|
|
|
525
500
|
if (operationOrderA !== operationOrderB) {
|
|
526
501
|
return operationOrderA - operationOrderB;
|
|
527
502
|
}
|
|
503
|
+
// 6b. For default_privilege: deterministic tiebreaker by objtype then grantee (canonical order for objtype)
|
|
504
|
+
if (scopeA === "default_privilege" && scopeB === "default_privilege") {
|
|
505
|
+
const defPrivA = changeA;
|
|
506
|
+
const defPrivB = changeB;
|
|
507
|
+
const objtypeOrder = (code) => ({ n: 0, r: 1, S: 2, f: 3, T: 4 })[code] ?? 99;
|
|
508
|
+
const objtypeCompare = objtypeOrder(defPrivA.objtype) - objtypeOrder(defPrivB.objtype);
|
|
509
|
+
if (objtypeCompare !== 0)
|
|
510
|
+
return objtypeCompare;
|
|
511
|
+
const granteeCompare = defPrivA.grantee.localeCompare(defPrivB.grantee);
|
|
512
|
+
if (granteeCompare !== 0)
|
|
513
|
+
return granteeCompare;
|
|
514
|
+
}
|
|
528
515
|
// 7. Preserve original order (stability)
|
|
529
516
|
return a.originalIndex - b.originalIndex;
|
|
530
517
|
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assert that the given SQL string is syntactically valid PostgreSQL.
|
|
3
|
+
*
|
|
4
|
+
* Uses the PostgreSQL parser from `@supabase/pg-topo` to ensure that
|
|
5
|
+
* serialized DDL statements are syntactically correct. This catches
|
|
6
|
+
* issues like malformed function signatures, missing keywords, etc.
|
|
7
|
+
*
|
|
8
|
+
* @param sql - The SQL string to validate (typically from `change.serialize()`).
|
|
9
|
+
*/
|
|
10
|
+
export declare function assertValidSql(sql: string): Promise<void>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { validateSqlSyntax } from "@supabase/pg-topo";
|
|
2
|
+
/**
|
|
3
|
+
* Assert that the given SQL string is syntactically valid PostgreSQL.
|
|
4
|
+
*
|
|
5
|
+
* Uses the PostgreSQL parser from `@supabase/pg-topo` to ensure that
|
|
6
|
+
* serialized DDL statements are syntactically correct. This catches
|
|
7
|
+
* issues like malformed function signatures, missing keywords, etc.
|
|
8
|
+
*
|
|
9
|
+
* @param sql - The SQL string to validate (typically from `change.serialize()`).
|
|
10
|
+
*/
|
|
11
|
+
export async function assertValidSql(sql) {
|
|
12
|
+
try {
|
|
13
|
+
await validateSqlSyntax(sql);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
const message = error instanceof Error ? error.message : "Unknown parser error";
|
|
17
|
+
throw new Error(`Invalid SQL syntax: ${message}\nSQL: ${sql}`);
|
|
18
|
+
}
|
|
19
|
+
}
|