@supabase/pg-delta 1.0.0-alpha.2 → 1.0.0-alpha.21
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 +70 -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 +10 -17
- 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 +55 -90
- 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 +69 -22
- package/dist/core/objects/table/changes/table.alter.js +130 -27
- 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 +101 -162
- package/dist/core/objects/table/table.model.d.ts +29 -22
- package/dist/core/objects/table/table.model.js +16 -8
- 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 +100 -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/cycle-breakers.d.ts +15 -0
- package/dist/core/sort/cycle-breakers.js +269 -0
- package/dist/core/sort/graph-builder.js +10 -0
- package/dist/core/sort/logical-sort.js +34 -47
- package/dist/core/sort/sort-changes.js +97 -43
- 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 +252 -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 +555 -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 +434 -0
- package/src/core/objects/sequence/sequence.diff.ts +334 -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 +910 -0
- package/src/core/objects/table/changes/table.alter.ts +939 -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 +1189 -0
- package/src/core/objects/table/table.diff.ts +913 -0
- package/src/core/objects/table/table.model.ts +465 -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 +303 -0
- package/src/core/post-diff-cycle-breaking.ts +138 -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/cycle-breakers.test.ts +476 -0
- package/src/core/sort/cycle-breakers.ts +311 -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 +319 -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
|
@@ -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
|
});
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import debug from "debug";
|
|
14
14
|
import { generateCustomConstraints } from "./custom-constraints.js";
|
|
15
|
+
import { tryBreakCycleByChangeInjection } from "./cycle-breakers.js";
|
|
15
16
|
import { printDebugGraph } from "./debug-visualization.js";
|
|
16
17
|
const debugGraph = debug("pg-delta:graph");
|
|
17
18
|
import { filterEdgesForCycleBreaking, getEdgesInCycle, } from "./dependency-filter.js";
|
|
@@ -20,6 +21,13 @@ import { dedupeEdges } from "./graph-utils.js";
|
|
|
20
21
|
import { logicalSort } from "./logical-sort.js";
|
|
21
22
|
import { findCycle, formatCycleError, performStableTopologicalSort, } from "./topological-sort.js";
|
|
22
23
|
import { getExecutionPhase } from "./utils.js";
|
|
24
|
+
// `sortPhaseChanges` caps the change-injection breaker at one round per
|
|
25
|
+
// node in the initial phase: there can never be more disjoint unbreakable
|
|
26
|
+
// cycles than there are change nodes (each cycle has ≥ 2 distinct nodes).
|
|
27
|
+
// The cap exists only to surface a buggy breaker as `CycleError` instead
|
|
28
|
+
// of an infinite loop — the actual loop-protection guarantee comes from
|
|
29
|
+
// `breakerRoundSignatures`, which throws the moment the same cycle
|
|
30
|
+
// reappears after a break.
|
|
23
31
|
/**
|
|
24
32
|
* Sort changes using dependency information from catalogs and custom constraints.
|
|
25
33
|
*
|
|
@@ -63,20 +71,38 @@ function sortChangesByPhasedGraph(catalogContext, changeList) {
|
|
|
63
71
|
return [...sortedDropPhase, ...sortedCreateAlterPhase];
|
|
64
72
|
}
|
|
65
73
|
/**
|
|
66
|
-
*
|
|
74
|
+
* Normalize a cycle by rotating it to start with the smallest node index, so
|
|
75
|
+
* cycles that loop through the same nodes in the same direction compare equal
|
|
76
|
+
* regardless of where DFS happened to enter them.
|
|
77
|
+
*/
|
|
78
|
+
function normalizeCycle(cycleNodeIndexes) {
|
|
79
|
+
if (cycleNodeIndexes.length === 0)
|
|
80
|
+
return "";
|
|
81
|
+
const minIndex = Math.min(...cycleNodeIndexes);
|
|
82
|
+
const minIndexPos = cycleNodeIndexes.indexOf(minIndex);
|
|
83
|
+
const rotated = [
|
|
84
|
+
...cycleNodeIndexes.slice(minIndexPos),
|
|
85
|
+
...cycleNodeIndexes.slice(0, minIndexPos),
|
|
86
|
+
];
|
|
87
|
+
return rotated.join(",");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* One attempt at sorting `phaseChanges`. Builds the graph from scratch,
|
|
91
|
+
* runs the iterative edge-removal cycle handler, and either returns a
|
|
92
|
+
* topologically sorted list or reports an unbreakable cycle so the caller
|
|
93
|
+
* can decide whether to dispatch a change-injection breaker.
|
|
67
94
|
*
|
|
68
95
|
* Algorithm:
|
|
69
|
-
* 1. Build graph data (change sets and reverse indexes)
|
|
70
|
-
* 2. Convert all sources to Constraints (catalog, explicit, custom
|
|
71
|
-
* 3. Convert Constraints to edges
|
|
72
|
-
* 4. Iteratively detect and break cycles
|
|
73
|
-
* 5. Perform stable topological sort on the acyclic graph
|
|
96
|
+
* 1. Build graph data (change sets and reverse indexes).
|
|
97
|
+
* 2. Convert all sources to Constraints (catalog, explicit, custom).
|
|
98
|
+
* 3. Convert Constraints to edges.
|
|
99
|
+
* 4. Iteratively detect and break cycles by removing weak edges.
|
|
100
|
+
* 5. Perform stable topological sort on the acyclic graph.
|
|
74
101
|
*
|
|
75
|
-
* In DROP phase, edges are inverted so drops run in reverse dependency
|
|
102
|
+
* In DROP phase, edges are inverted so drops run in reverse dependency
|
|
103
|
+
* order.
|
|
76
104
|
*/
|
|
77
|
-
function
|
|
78
|
-
if (phaseChanges.length <= 1)
|
|
79
|
-
return phaseChanges;
|
|
105
|
+
function attemptSortRound(phaseChanges, dependencyRows, options) {
|
|
80
106
|
// Step 1: Build graph data structures
|
|
81
107
|
const graphData = buildGraphData(phaseChanges, options);
|
|
82
108
|
// Step 2: Convert all sources to Constraints
|
|
@@ -90,50 +116,31 @@ function sortPhaseChanges(phaseChanges, dependencyRows, options = {}) {
|
|
|
90
116
|
];
|
|
91
117
|
// Step 3: Convert constraints to edges and deduplicate immediately
|
|
92
118
|
let edges = dedupeEdges(convertConstraintsToEdges(allConstraints, options));
|
|
93
|
-
// Step 4: Iteratively detect and break cycles
|
|
94
|
-
//
|
|
95
|
-
//
|
|
96
|
-
//
|
|
119
|
+
// Step 4: Iteratively detect and break cycles by edge filtering.
|
|
120
|
+
// We loop until no cycles remain OR we see the same cycle twice — the
|
|
121
|
+
// latter signals that edge filtering exhausted itself. At that point
|
|
122
|
+
// the caller may dispatch a change-injection breaker; if no breaker
|
|
123
|
+
// matches, the original throw path runs.
|
|
97
124
|
const seenCycles = new Set();
|
|
98
|
-
/**
|
|
99
|
-
* Normalize a cycle by rotating it to start with the smallest node index.
|
|
100
|
-
* This allows us to compare cycles regardless of where they start.
|
|
101
|
-
*/
|
|
102
|
-
function normalizeCycle(cycleNodeIndexes) {
|
|
103
|
-
if (cycleNodeIndexes.length === 0)
|
|
104
|
-
return "";
|
|
105
|
-
const minIndex = Math.min(...cycleNodeIndexes);
|
|
106
|
-
const minIndexPos = cycleNodeIndexes.indexOf(minIndex);
|
|
107
|
-
const rotated = [
|
|
108
|
-
...cycleNodeIndexes.slice(minIndexPos),
|
|
109
|
-
...cycleNodeIndexes.slice(0, minIndexPos),
|
|
110
|
-
];
|
|
111
|
-
return rotated.join(",");
|
|
112
|
-
}
|
|
113
125
|
while (true) {
|
|
114
|
-
// Edge deduplication moved outside loop
|
|
115
126
|
const edgePairs = edgesToPairs(edges);
|
|
116
|
-
// Detect cycles
|
|
117
127
|
const cycleNodeIndexes = findCycle(phaseChanges.length, edgePairs);
|
|
118
|
-
if (!cycleNodeIndexes)
|
|
119
|
-
// No cycles found, we're done
|
|
128
|
+
if (!cycleNodeIndexes)
|
|
120
129
|
break;
|
|
121
|
-
}
|
|
122
|
-
// Normalize cycle to check if we've seen it before
|
|
123
130
|
const cycleSignature = normalizeCycle(cycleNodeIndexes);
|
|
124
131
|
if (seenCycles.has(cycleSignature)) {
|
|
125
|
-
//
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
132
|
+
// Edge filtering can't break this cycle. Report it back to the
|
|
133
|
+
// caller so it can try change-injection before throwing.
|
|
134
|
+
return {
|
|
135
|
+
kind: "unbreakable",
|
|
136
|
+
cycleNodeIndexes,
|
|
137
|
+
cycleEdges: getEdgesInCycle(cycleNodeIndexes, edges),
|
|
138
|
+
};
|
|
129
139
|
}
|
|
130
|
-
// Track this cycle
|
|
131
140
|
seenCycles.add(cycleSignature);
|
|
132
|
-
// Filter only edges involved in the cycle to break it
|
|
133
141
|
edges = filterEdgesForCycleBreaking(edges, cycleNodeIndexes, phaseChanges, graphData);
|
|
134
142
|
}
|
|
135
143
|
const finalEdgePairs = edgesToPairs(edges);
|
|
136
|
-
// Debug visualization
|
|
137
144
|
if (debugGraph.enabled) {
|
|
138
145
|
printDebugGraph(phaseChanges, graphData, finalEdgePairs, dependencyRows, allConstraints);
|
|
139
146
|
}
|
|
@@ -143,5 +150,52 @@ function sortPhaseChanges(phaseChanges, dependencyRows, options = {}) {
|
|
|
143
150
|
// This should never happen if findCycle returned null, but guard anyway
|
|
144
151
|
throw new Error("CycleError: dependency graph contains a cycle");
|
|
145
152
|
}
|
|
146
|
-
return
|
|
153
|
+
return {
|
|
154
|
+
kind: "sorted",
|
|
155
|
+
sorted: topologicalOrder.map((changeIndex) => phaseChanges[changeIndex]),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Sort changes within a phase. Tries `attemptSortRound`; on an unbreakable
|
|
160
|
+
* cycle, dispatches to `tryBreakCycleByChangeInjection`, retries with the
|
|
161
|
+
* rewritten changes, and bails after `MAX_CYCLE_BREAKER_ROUNDS` to surface
|
|
162
|
+
* a buggy breaker as `CycleError` instead of an infinite loop.
|
|
163
|
+
*
|
|
164
|
+
* Best case (no cycles, the vast majority of plans): one round, no
|
|
165
|
+
* change-injection breaker code runs at all.
|
|
166
|
+
*/
|
|
167
|
+
function sortPhaseChanges(initialPhaseChanges, dependencyRows, options = {}) {
|
|
168
|
+
if (initialPhaseChanges.length <= 1)
|
|
169
|
+
return initialPhaseChanges;
|
|
170
|
+
let phaseChanges = initialPhaseChanges;
|
|
171
|
+
const breakerRoundSignatures = new Set();
|
|
172
|
+
// `attemptSortRound` returns at most one unbreakable cycle per call,
|
|
173
|
+
// so a phase with K independent unbreakable cycles needs K+1 rounds.
|
|
174
|
+
// Every cycle contains ≥ 2 distinct change nodes, so the maximum
|
|
175
|
+
// possible value of K is `floor(initialPhaseChanges.length / 2)` —
|
|
176
|
+
// using `initialPhaseChanges.length` itself is therefore a real upper
|
|
177
|
+
// bound with one round of slack (and matches the early-return guard
|
|
178
|
+
// above, which already excluded length-0 and length-1 phases).
|
|
179
|
+
const maxRounds = initialPhaseChanges.length;
|
|
180
|
+
for (let round = 0; round <= maxRounds; round++) {
|
|
181
|
+
const result = attemptSortRound(phaseChanges, dependencyRows, options);
|
|
182
|
+
if (result.kind === "sorted")
|
|
183
|
+
return result.sorted;
|
|
184
|
+
// Edge filtering hit an unbreakable cycle. Try the change-injection
|
|
185
|
+
// breakers (FK pattern, publication↔column pattern). If none matches,
|
|
186
|
+
// throw with the same diagnostic the original code emitted.
|
|
187
|
+
const broken = tryBreakCycleByChangeInjection(result.cycleNodeIndexes, phaseChanges);
|
|
188
|
+
if (broken === null) {
|
|
189
|
+
throw new Error(formatCycleError(result.cycleNodeIndexes, phaseChanges, result.cycleEdges));
|
|
190
|
+
}
|
|
191
|
+
// Loop guard: if the same cycle node-set re-appears after a break,
|
|
192
|
+
// the breaker isn't making progress. Throw with full context.
|
|
193
|
+
const signature = normalizeCycle(result.cycleNodeIndexes);
|
|
194
|
+
if (breakerRoundSignatures.has(signature)) {
|
|
195
|
+
throw new Error(formatCycleError(result.cycleNodeIndexes, phaseChanges, result.cycleEdges));
|
|
196
|
+
}
|
|
197
|
+
breakerRoundSignatures.add(signature);
|
|
198
|
+
phaseChanges = broken;
|
|
199
|
+
}
|
|
200
|
+
throw new Error(`CycleError: change-injection breaker exceeded ${maxRounds} rounds (one per node in the phase) — likely a buggy breaker rule`);
|
|
147
201
|
}
|
|
@@ -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
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,16 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This module exports the public API for the pg-delta library.
|
|
5
5
|
*/
|
|
6
|
+
export { Catalog, createEmptyCatalog, extractCatalog, } from "./core/catalog.model.ts";
|
|
7
|
+
export type { CatalogSnapshot } from "./core/catalog.snapshot.ts";
|
|
8
|
+
export { deserializeCatalog, serializeCatalog, stringifyCatalogSnapshot, } from "./core/catalog.snapshot.ts";
|
|
9
|
+
export { exportDeclarativeSchema } from "./core/export/index.ts";
|
|
10
|
+
export type { DeclarativeSchemaOutput, FileCategory, FileEntry, FileMetadata, } from "./core/export/types.ts";
|
|
6
11
|
export type { IntegrationDSL } from "./core/integrations/integration-dsl.ts";
|
|
7
12
|
export { applyPlan } from "./core/plan/apply.ts";
|
|
13
|
+
export type { CatalogInput } from "./core/plan/create.ts";
|
|
8
14
|
export { createPlan } from "./core/plan/create.ts";
|
|
15
|
+
export type { SqlFormatOptions } from "./core/plan/sql-format.ts";
|
|
16
|
+
export { formatSqlStatements } from "./core/plan/sql-format.ts";
|
|
9
17
|
export type { CreatePlanOptions, Plan } from "./core/plan/types.ts";
|
|
18
|
+
export { createManagedPool } from "./core/postgres-config.ts";
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This module exports the public API for the pg-delta library.
|
|
5
5
|
*/
|
|
6
|
+
// Catalog model and extraction
|
|
7
|
+
export { Catalog, createEmptyCatalog, extractCatalog, } from "./core/catalog.model.js";
|
|
8
|
+
export { deserializeCatalog, serializeCatalog, stringifyCatalogSnapshot, } from "./core/catalog.snapshot.js";
|
|
9
|
+
// Declarative schema export
|
|
10
|
+
export { exportDeclarativeSchema } from "./core/export/index.js";
|
|
11
|
+
// Plan operations
|
|
6
12
|
export { applyPlan } from "./core/plan/apply.js";
|
|
7
|
-
// Core operations
|
|
8
13
|
export { createPlan } from "./core/plan/create.js";
|
|
14
|
+
export { formatSqlStatements } from "./core/plan/sql-format.js";
|
|
15
|
+
// Postgres config
|
|
16
|
+
export { createManagedPool } from "./core/postgres-config.js";
|
package/package.json
CHANGED
|
@@ -1,18 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@supabase/pg-delta",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.21",
|
|
4
4
|
"description": "PostgreSQL migrations made easy",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
7
9
|
"exports": {
|
|
8
|
-
".":
|
|
9
|
-
|
|
10
|
+
".": {
|
|
11
|
+
"bun": "./src/index.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./integrations/supabase": {
|
|
18
|
+
"bun": "./src/core/integrations/supabase.ts",
|
|
19
|
+
"import": "./dist/core/integrations/supabase.js",
|
|
20
|
+
"require": "./dist/core/integrations/supabase.js",
|
|
21
|
+
"types": "./dist/core/integrations/supabase.d.ts",
|
|
22
|
+
"default": "./dist/core/integrations/supabase.js"
|
|
23
|
+
},
|
|
24
|
+
"./declarative": {
|
|
25
|
+
"bun": "./src/core/declarative-apply/index.ts",
|
|
26
|
+
"import": "./dist/core/declarative-apply/index.js",
|
|
27
|
+
"require": "./dist/core/declarative-apply/index.js",
|
|
28
|
+
"types": "./dist/core/declarative-apply/index.d.ts",
|
|
29
|
+
"default": "./dist/core/declarative-apply/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./catalog-export": {
|
|
32
|
+
"bun": "./src/core/catalog-export/index.ts",
|
|
33
|
+
"import": "./dist/core/catalog-export/index.js",
|
|
34
|
+
"require": "./dist/core/catalog-export/index.js",
|
|
35
|
+
"types": "./dist/core/catalog-export/index.d.ts",
|
|
36
|
+
"default": "./dist/core/catalog-export/index.js"
|
|
37
|
+
}
|
|
10
38
|
},
|
|
11
39
|
"bin": {
|
|
12
40
|
"pgdelta": "./dist/cli/bin/cli.js"
|
|
13
41
|
},
|
|
14
42
|
"files": [
|
|
15
43
|
"dist",
|
|
44
|
+
"src",
|
|
16
45
|
"README.md",
|
|
17
46
|
"LICENSE"
|
|
18
47
|
],
|
|
@@ -26,45 +55,53 @@
|
|
|
26
55
|
],
|
|
27
56
|
"author": "Supabase",
|
|
28
57
|
"license": "MIT",
|
|
29
|
-
"homepage": "https://github.com/supabase/pg-
|
|
58
|
+
"homepage": "https://github.com/supabase/pg-toolbelt",
|
|
30
59
|
"repository": {
|
|
31
60
|
"type": "git",
|
|
32
|
-
"url": "https://github.com/supabase/pg-
|
|
61
|
+
"url": "https://github.com/supabase/pg-toolbelt.git",
|
|
62
|
+
"directory": "packages/pg-delta"
|
|
33
63
|
},
|
|
34
|
-
"bugs": "https://github.com/supabase/pg-
|
|
64
|
+
"bugs": "https://github.com/supabase/pg-toolbelt/issues",
|
|
35
65
|
"engines": {
|
|
36
66
|
"node": ">=20.0.0"
|
|
37
67
|
},
|
|
68
|
+
"scripts": {
|
|
69
|
+
"build": "tsc --project tsconfig.build.json",
|
|
70
|
+
"check-types": "tsc --noEmit",
|
|
71
|
+
"docs": "typedoc",
|
|
72
|
+
"format-and-lint": "biome check . --error-on-warnings",
|
|
73
|
+
"knip": "knip",
|
|
74
|
+
"pgdelta": "bun src/cli/bin/cli.ts",
|
|
75
|
+
"sync-base-images": "bun scripts/sync-supabase-base-images.ts",
|
|
76
|
+
"test": "bun scripts/run-tests.ts",
|
|
77
|
+
"test:unit": "bun run test src/",
|
|
78
|
+
"test:integration": "bun run test tests/",
|
|
79
|
+
"update-empty-baseline": "bun scripts/update-empty-catalog-baseline.ts",
|
|
80
|
+
"version": "changeset version && bun install --no-frozen-lockfile && bun run format-and-lint --write"
|
|
81
|
+
},
|
|
38
82
|
"dependencies": {
|
|
39
83
|
"@stricli/core": "^1.2.4",
|
|
40
84
|
"@ts-safeql/sql-tag": "^0.2.0",
|
|
85
|
+
"@supabase/pg-topo": "^1.0.0-alpha.1",
|
|
41
86
|
"chalk": "^5.6.2",
|
|
42
87
|
"debug": "^4.3.7",
|
|
43
88
|
"pg": "^8.17.2",
|
|
89
|
+
"picomatch": "^4.0.3",
|
|
44
90
|
"zod": "^4.2.1"
|
|
45
91
|
},
|
|
46
92
|
"devDependencies": {
|
|
47
|
-
"@
|
|
48
|
-
"@types/pg": "^8.11.10",
|
|
49
|
-
"@changesets/cli": "^2.29.8",
|
|
93
|
+
"@supabase/bun-istanbul-coverage": "workspace:*",
|
|
50
94
|
"@tsconfig/node-ts": "^23.6.2",
|
|
51
95
|
"@tsconfig/node24": "^24.0.3",
|
|
96
|
+
"@types/bun": "^1.3.9",
|
|
52
97
|
"@types/debug": "^4.1.12",
|
|
53
98
|
"@types/node": "^24.10.4",
|
|
54
|
-
"@
|
|
99
|
+
"@types/pg": "^8.11.10",
|
|
100
|
+
"@types/picomatch": "^4.0.2",
|
|
55
101
|
"dedent": "^1.7.1",
|
|
56
102
|
"knip": "^5.75.2",
|
|
57
103
|
"testcontainers": "^11.10.0",
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
},
|
|
61
|
-
"scripts": {
|
|
62
|
-
"build": "tsc --project tsconfig.build.json",
|
|
63
|
-
"check-types": "tsc --noEmit",
|
|
64
|
-
"format-and-lint": "biome check . --error-on-warnings",
|
|
65
|
-
"knip": "knip",
|
|
66
|
-
"pgdelta": "node src/cli/bin/cli.ts",
|
|
67
|
-
"test": "vitest",
|
|
68
|
-
"version": "changeset version && pnpm install --no-frozen-lockfile && pnpm format-and-lint --write"
|
|
104
|
+
"typedoc": "^0.28.17",
|
|
105
|
+
"typescript": "^5.9.3"
|
|
69
106
|
}
|
|
70
|
-
}
|
|
107
|
+
}
|
package/src/cli/app.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { buildApplication, buildRouteMap } from "@stricli/core";
|
|
2
|
+
import { applyCommand } from "./commands/apply.ts";
|
|
3
|
+
import { catalogExportCommand } from "./commands/catalog-export.ts";
|
|
4
|
+
import { declarativeApplyCommand } from "./commands/declarative-apply.ts";
|
|
5
|
+
import { declarativeExportCommand } from "./commands/declarative-export.ts";
|
|
6
|
+
import { planCommand } from "./commands/plan.ts";
|
|
7
|
+
import { syncCommand } from "./commands/sync.ts";
|
|
8
|
+
|
|
9
|
+
const declarativeRouteMap = buildRouteMap({
|
|
10
|
+
routes: {
|
|
11
|
+
apply: declarativeApplyCommand,
|
|
12
|
+
export: declarativeExportCommand,
|
|
13
|
+
},
|
|
14
|
+
docs: {
|
|
15
|
+
brief: "Declarative schema management",
|
|
16
|
+
fullDescription: `
|
|
17
|
+
Manage declarative SQL schemas.
|
|
18
|
+
|
|
19
|
+
Commands:
|
|
20
|
+
apply - Apply a declarative SQL schema to a database
|
|
21
|
+
export - Export a declarative schema from a database diff
|
|
22
|
+
`.trim(),
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const root = buildRouteMap({
|
|
27
|
+
routes: {
|
|
28
|
+
plan: planCommand,
|
|
29
|
+
apply: applyCommand,
|
|
30
|
+
sync: syncCommand,
|
|
31
|
+
declarative: declarativeRouteMap,
|
|
32
|
+
"catalog-export": catalogExportCommand,
|
|
33
|
+
},
|
|
34
|
+
defaultCommand: "sync",
|
|
35
|
+
docs: {
|
|
36
|
+
brief: "PostgreSQL migrations made easy",
|
|
37
|
+
fullDescription: `
|
|
38
|
+
pgdelta generates migration scripts by comparing two PostgreSQL databases.
|
|
39
|
+
|
|
40
|
+
Commands:
|
|
41
|
+
plan - Compute schema diff and preview changes
|
|
42
|
+
apply - Apply a plan's migration script to a database
|
|
43
|
+
sync - Plan and apply changes in one go
|
|
44
|
+
declarative - Declarative schema (apply | export)
|
|
45
|
+
catalog-export - Export a database catalog as a snapshot JSON file
|
|
46
|
+
`.trim(),
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
export const app = buildApplication(root, {
|
|
51
|
+
name: "pgdelta",
|
|
52
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { run } from "@stricli/core";
|
|
4
|
+
import { app } from "../app.ts";
|
|
5
|
+
import { getCommandExitCode } from "../exit-code.ts";
|
|
6
|
+
|
|
7
|
+
await run(app, process.argv.slice(2), { process }).catch((error) => {
|
|
8
|
+
console.error(error);
|
|
9
|
+
process.exit(1);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const code = getCommandExitCode();
|
|
13
|
+
if (code !== undefined) {
|
|
14
|
+
process.exitCode = code;
|
|
15
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Apply command - apply a plan's migration script to a target database.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import { buildCommand, type CommandContext } from "@stricli/core";
|
|
7
|
+
import { applyPlan } from "../../core/plan/apply.ts";
|
|
8
|
+
import { deserializePlan, type Plan } from "../../core/plan/index.ts";
|
|
9
|
+
import { handleApplyResult, validatePlanRisk } from "../utils.ts";
|
|
10
|
+
|
|
11
|
+
export const applyCommand = buildCommand({
|
|
12
|
+
parameters: {
|
|
13
|
+
flags: {
|
|
14
|
+
plan: {
|
|
15
|
+
kind: "parsed",
|
|
16
|
+
brief: "Path to plan file (JSON format)",
|
|
17
|
+
parse: String,
|
|
18
|
+
},
|
|
19
|
+
source: {
|
|
20
|
+
kind: "parsed",
|
|
21
|
+
brief: "Source database connection URL (current state)",
|
|
22
|
+
parse: String,
|
|
23
|
+
},
|
|
24
|
+
target: {
|
|
25
|
+
kind: "parsed",
|
|
26
|
+
brief: "Target database connection URL (desired state)",
|
|
27
|
+
parse: String,
|
|
28
|
+
},
|
|
29
|
+
unsafe: {
|
|
30
|
+
kind: "boolean",
|
|
31
|
+
brief: "Allow data-loss operations (unsafe mode)",
|
|
32
|
+
optional: true,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
aliases: {
|
|
36
|
+
p: "plan",
|
|
37
|
+
s: "source",
|
|
38
|
+
t: "target",
|
|
39
|
+
u: "unsafe",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
docs: {
|
|
43
|
+
brief: "Apply a plan's migration script to a database",
|
|
44
|
+
fullDescription: `
|
|
45
|
+
Apply changes from a plan file to a target database.
|
|
46
|
+
|
|
47
|
+
The plan file should be a JSON file created with "pgdelta plan --output <file>.plan.json" (or any .plan/.json path).
|
|
48
|
+
|
|
49
|
+
Safe by default: will refuse plans containing data-loss unless --unsafe is set.
|
|
50
|
+
|
|
51
|
+
Exit codes:
|
|
52
|
+
0 - Success (changes applied)
|
|
53
|
+
1 - Error occurred
|
|
54
|
+
`.trim(),
|
|
55
|
+
},
|
|
56
|
+
async func(
|
|
57
|
+
this: CommandContext,
|
|
58
|
+
flags: {
|
|
59
|
+
plan: string;
|
|
60
|
+
source: string;
|
|
61
|
+
target: string;
|
|
62
|
+
unsafe?: boolean;
|
|
63
|
+
},
|
|
64
|
+
) {
|
|
65
|
+
// Read and parse plan file
|
|
66
|
+
let planJson: string;
|
|
67
|
+
try {
|
|
68
|
+
planJson = await readFile(flags.plan, "utf-8");
|
|
69
|
+
} catch (error) {
|
|
70
|
+
this.process.stderr.write(
|
|
71
|
+
`Error reading plan file: ${error instanceof Error ? error.message : String(error)}\n`,
|
|
72
|
+
);
|
|
73
|
+
process.exitCode = 1;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
let plan: Plan;
|
|
78
|
+
try {
|
|
79
|
+
plan = deserializePlan(planJson);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
this.process.stderr.write(
|
|
82
|
+
`Error parsing plan file: ${error instanceof Error ? error.message : String(error)}\n`,
|
|
83
|
+
);
|
|
84
|
+
process.exitCode = 1;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const validation = validatePlanRisk(plan, !!flags.unsafe, this);
|
|
89
|
+
if (!validation.valid) {
|
|
90
|
+
process.exitCode = validation.exitCode ?? 1;
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const result = await applyPlan(plan, flags.source, flags.target, {
|
|
95
|
+
verifyPostApply: true,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const { exitCode } = handleApplyResult(result, this);
|
|
99
|
+
process.exitCode = exitCode;
|
|
100
|
+
},
|
|
101
|
+
});
|