@supabase/pg-delta 1.0.0-alpha.2 → 1.0.0-alpha.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -3
- package/dist/cli/app.js +26 -3
- package/dist/cli/bin/cli.js +5 -0
- package/dist/cli/commands/catalog-export.d.ts +5 -0
- package/dist/cli/commands/catalog-export.js +64 -0
- package/dist/cli/commands/declarative-apply.d.ts +6 -0
- package/dist/cli/commands/declarative-apply.js +288 -0
- package/dist/cli/commands/declarative-export.d.ts +5 -0
- package/dist/cli/commands/declarative-export.js +240 -0
- package/dist/cli/commands/plan.js +47 -16
- package/dist/cli/commands/sync.js +8 -12
- package/dist/cli/exit-code.d.ts +2 -0
- package/dist/cli/exit-code.js +7 -0
- package/dist/cli/formatters/tree/tree.js +3 -2
- package/dist/cli/utils/apply-display.d.ts +52 -0
- package/dist/cli/utils/apply-display.js +183 -0
- package/dist/cli/utils/export-display.d.ts +43 -0
- package/dist/cli/utils/export-display.js +202 -0
- package/dist/cli/utils/integrations.d.ts +30 -6
- package/dist/cli/utils/integrations.js +98 -6
- package/dist/cli/utils/resolve-input.d.ts +7 -0
- package/dist/cli/utils/resolve-input.js +13 -0
- package/dist/cli/utils.d.ts +2 -0
- package/dist/cli/utils.js +1 -1
- package/dist/core/catalog-export/index.d.ts +11 -0
- package/dist/core/catalog-export/index.js +10 -0
- package/dist/core/catalog.diff.d.ts +1 -0
- package/dist/core/catalog.diff.js +71 -49
- package/dist/core/catalog.model.d.ts +14 -1
- package/dist/core/catalog.model.js +103 -1
- package/dist/core/catalog.snapshot.d.ts +66 -0
- package/dist/core/catalog.snapshot.js +206 -0
- package/dist/core/change-utils.d.ts +9 -0
- package/dist/core/change-utils.js +71 -0
- package/dist/core/change.types.d.ts +22 -0
- package/dist/core/change.types.js +37 -1
- package/dist/core/connection-url.d.ts +32 -0
- package/dist/core/connection-url.js +77 -0
- package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
- package/dist/core/declarative-apply/discover-sql.js +86 -0
- package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
- package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
- package/dist/core/declarative-apply/index.d.ts +49 -0
- package/dist/core/declarative-apply/index.js +134 -0
- package/dist/core/declarative-apply/round-apply.d.ts +100 -0
- package/dist/core/declarative-apply/round-apply.js +378 -0
- package/dist/core/depend.js +25 -0
- package/dist/core/expand-replace-dependencies.d.ts +8 -2
- package/dist/core/expand-replace-dependencies.js +116 -10
- package/dist/core/export/file-mapper.d.ts +71 -0
- package/dist/core/export/file-mapper.js +474 -0
- package/dist/core/export/grouper.d.ts +13 -0
- package/dist/core/export/grouper.js +76 -0
- package/dist/core/export/index.d.ts +45 -0
- package/dist/core/export/index.js +66 -0
- package/dist/core/export/types.d.ts +84 -0
- package/dist/core/export/types.js +25 -0
- package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/dist/core/integrations/filter/dsl.d.ts +82 -41
- package/dist/core/integrations/filter/dsl.js +127 -61
- package/dist/core/integrations/filter/flatten.d.ts +51 -0
- package/dist/core/integrations/filter/flatten.js +116 -0
- package/dist/core/integrations/integration-dsl.d.ts +27 -1
- package/dist/core/integrations/integration.types.d.ts +26 -1
- package/dist/core/integrations/integration.types.js +31 -1
- package/dist/core/integrations/merge.d.ts +20 -0
- package/dist/core/integrations/merge.js +60 -0
- package/dist/core/integrations/serialize/dsl.d.ts +8 -12
- package/dist/core/integrations/serialize/dsl.js +2 -2
- package/dist/core/integrations/serialize/serialize.types.d.ts +31 -0
- package/dist/core/integrations/supabase.d.ts +8 -0
- package/dist/core/integrations/supabase.js +69 -8
- package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
- package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
- package/dist/core/objects/aggregate/aggregate.model.d.ts +8 -8
- package/dist/core/objects/aggregate/aggregate.model.js +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.alter.d.ts +2 -1
- package/dist/core/objects/aggregate/changes/aggregate.alter.js +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.comment.d.ts +3 -2
- package/dist/core/objects/aggregate/changes/aggregate.comment.js +2 -2
- package/dist/core/objects/aggregate/changes/aggregate.create.d.ts +2 -1
- package/dist/core/objects/aggregate/changes/aggregate.create.js +2 -2
- package/dist/core/objects/aggregate/changes/aggregate.drop.d.ts +2 -1
- package/dist/core/objects/aggregate/changes/aggregate.drop.js +2 -2
- package/dist/core/objects/aggregate/changes/aggregate.privilege.d.ts +4 -3
- package/dist/core/objects/aggregate/changes/aggregate.privilege.js +3 -3
- package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +1 -0
- package/dist/core/objects/base.change.d.ts +12 -1
- package/dist/core/objects/base.change.js +10 -0
- package/dist/core/objects/base.model.d.ts +4 -1
- package/dist/core/objects/base.model.js +5 -2
- package/dist/core/objects/base.privilege-diff.d.ts +38 -13
- package/dist/core/objects/base.privilege-diff.js +104 -22
- package/dist/core/objects/base.privilege.d.ts +1 -0
- package/dist/core/objects/base.privilege.js +9 -2
- package/dist/core/objects/collation/changes/collation.alter.d.ts +3 -2
- package/dist/core/objects/collation/changes/collation.alter.js +2 -2
- package/dist/core/objects/collation/changes/collation.comment.d.ts +3 -2
- package/dist/core/objects/collation/changes/collation.comment.js +2 -2
- package/dist/core/objects/collation/changes/collation.create.d.ts +2 -1
- package/dist/core/objects/collation/changes/collation.create.js +1 -1
- package/dist/core/objects/collation/changes/collation.drop.d.ts +2 -1
- package/dist/core/objects/collation/changes/collation.drop.js +1 -1
- package/dist/core/objects/collation/changes/collation.types.d.ts +1 -0
- package/dist/core/objects/collation/collation.diff.d.ts +2 -3
- package/dist/core/objects/diff-context.d.ts +15 -0
- package/dist/core/objects/diff-context.js +1 -0
- package/dist/core/objects/domain/changes/domain.alter.d.ts +9 -8
- package/dist/core/objects/domain/changes/domain.alter.js +8 -8
- package/dist/core/objects/domain/changes/domain.comment.d.ts +3 -2
- package/dist/core/objects/domain/changes/domain.comment.js +2 -2
- package/dist/core/objects/domain/changes/domain.create.d.ts +3 -2
- package/dist/core/objects/domain/changes/domain.create.js +12 -4
- package/dist/core/objects/domain/changes/domain.drop.d.ts +2 -1
- package/dist/core/objects/domain/changes/domain.drop.js +1 -1
- package/dist/core/objects/domain/changes/domain.privilege.d.ts +4 -3
- package/dist/core/objects/domain/changes/domain.privilege.js +3 -3
- package/dist/core/objects/domain/changes/domain.types.d.ts +1 -0
- package/dist/core/objects/domain/domain.diff.d.ts +2 -8
- package/dist/core/objects/domain/domain.diff.js +16 -77
- package/dist/core/objects/domain/domain.model.js +1 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.alter.d.ts +3 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.alter.js +2 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.comment.d.ts +3 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.comment.js +2 -2
- package/dist/core/objects/event-trigger/changes/event-trigger.create.d.ts +2 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.create.js +1 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.drop.d.ts +2 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.drop.js +1 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +1 -0
- package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
- package/dist/core/objects/extension/changes/extension.alter.d.ts +3 -2
- package/dist/core/objects/extension/changes/extension.alter.js +2 -2
- package/dist/core/objects/extension/changes/extension.comment.d.ts +3 -2
- package/dist/core/objects/extension/changes/extension.comment.js +2 -2
- package/dist/core/objects/extension/changes/extension.create.d.ts +2 -1
- package/dist/core/objects/extension/changes/extension.create.js +4 -2
- package/dist/core/objects/extension/changes/extension.drop.d.ts +2 -1
- package/dist/core/objects/extension/changes/extension.drop.js +1 -1
- package/dist/core/objects/extension/changes/extension.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.d.ts +10 -9
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.js +9 -9
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.d.ts +3 -2
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.js +2 -2
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.d.ts +4 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.js +3 -3
- package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.js +1 -1
- package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.d.ts +1 -0
- package/dist/core/objects/index/changes/index.alter.d.ts +4 -3
- package/dist/core/objects/index/changes/index.alter.js +3 -3
- package/dist/core/objects/index/changes/index.comment.d.ts +3 -2
- package/dist/core/objects/index/changes/index.comment.js +2 -2
- package/dist/core/objects/index/changes/index.create.d.ts +2 -1
- package/dist/core/objects/index/changes/index.create.js +1 -1
- package/dist/core/objects/index/changes/index.drop.d.ts +2 -1
- package/dist/core/objects/index/changes/index.drop.js +1 -1
- package/dist/core/objects/index/changes/index.types.d.ts +1 -0
- package/dist/core/objects/index/index.model.js +12 -2
- package/dist/core/objects/language/changes/language.alter.d.ts +2 -1
- package/dist/core/objects/language/changes/language.alter.js +1 -1
- package/dist/core/objects/language/changes/language.comment.d.ts +3 -2
- package/dist/core/objects/language/changes/language.comment.js +2 -2
- package/dist/core/objects/language/changes/language.create.d.ts +2 -1
- package/dist/core/objects/language/changes/language.create.js +1 -1
- package/dist/core/objects/language/changes/language.drop.d.ts +2 -1
- package/dist/core/objects/language/changes/language.drop.js +1 -1
- package/dist/core/objects/language/changes/language.privilege.d.ts +4 -3
- package/dist/core/objects/language/changes/language.privilege.js +3 -3
- package/dist/core/objects/language/changes/language.types.d.ts +1 -0
- package/dist/core/objects/language/language.diff.d.ts +2 -5
- package/dist/core/objects/language/language.diff.js +7 -39
- package/dist/core/objects/materialized-view/changes/materialized-view.alter.d.ts +3 -2
- package/dist/core/objects/materialized-view/changes/materialized-view.alter.js +2 -2
- package/dist/core/objects/materialized-view/changes/materialized-view.comment.d.ts +5 -4
- package/dist/core/objects/materialized-view/changes/materialized-view.comment.js +4 -4
- package/dist/core/objects/materialized-view/changes/materialized-view.create.d.ts +2 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.create.js +1 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.drop.d.ts +2 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.drop.js +1 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.privilege.d.ts +4 -3
- package/dist/core/objects/materialized-view/changes/materialized-view.privilege.js +3 -3
- package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +1 -0
- package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
- package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
- package/dist/core/objects/materialized-view/materialized-view.model.d.ts +3 -3
- package/dist/core/objects/materialized-view/materialized-view.model.js +1 -1
- package/dist/core/objects/procedure/changes/procedure.alter.d.ts +8 -7
- package/dist/core/objects/procedure/changes/procedure.alter.js +19 -19
- package/dist/core/objects/procedure/changes/procedure.comment.d.ts +3 -2
- package/dist/core/objects/procedure/changes/procedure.comment.js +2 -2
- package/dist/core/objects/procedure/changes/procedure.create.d.ts +2 -1
- package/dist/core/objects/procedure/changes/procedure.create.js +1 -1
- package/dist/core/objects/procedure/changes/procedure.drop.d.ts +2 -1
- package/dist/core/objects/procedure/changes/procedure.drop.js +1 -1
- package/dist/core/objects/procedure/changes/procedure.privilege.d.ts +4 -3
- package/dist/core/objects/procedure/changes/procedure.privilege.js +3 -3
- package/dist/core/objects/procedure/changes/procedure.types.d.ts +1 -0
- package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
- package/dist/core/objects/procedure/procedure.diff.js +57 -97
- package/dist/core/objects/procedure/procedure.model.d.ts +9 -9
- package/dist/core/objects/procedure/procedure.model.js +1 -1
- package/dist/core/objects/publication/changes/publication.alter.d.ts +9 -16
- package/dist/core/objects/publication/changes/publication.alter.js +12 -21
- package/dist/core/objects/publication/changes/publication.comment.d.ts +3 -2
- package/dist/core/objects/publication/changes/publication.comment.js +2 -2
- package/dist/core/objects/publication/changes/publication.create.d.ts +2 -1
- package/dist/core/objects/publication/changes/publication.create.js +1 -1
- package/dist/core/objects/publication/changes/publication.drop.d.ts +2 -1
- package/dist/core/objects/publication/changes/publication.drop.js +1 -1
- package/dist/core/objects/publication/changes/publication.types.d.ts +3 -2
- package/dist/core/objects/publication/publication.diff.d.ts +2 -3
- package/dist/core/objects/publication/publication.diff.js +8 -13
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.d.ts +4 -3
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +6 -6
- package/dist/core/objects/rls-policy/changes/rls-policy.comment.d.ts +3 -2
- package/dist/core/objects/rls-policy/changes/rls-policy.comment.js +2 -2
- package/dist/core/objects/rls-policy/changes/rls-policy.create.d.ts +2 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.create.js +24 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.drop.d.ts +2 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.drop.js +1 -1
- package/dist/core/objects/rls-policy/changes/rls-policy.types.d.ts +1 -0
- package/dist/core/objects/rls-policy/rls-policy.model.d.ts +51 -2
- package/dist/core/objects/rls-policy/rls-policy.model.js +122 -1
- package/dist/core/objects/role/changes/role.alter.d.ts +3 -2
- package/dist/core/objects/role/changes/role.alter.js +2 -2
- package/dist/core/objects/role/changes/role.comment.d.ts +3 -2
- package/dist/core/objects/role/changes/role.comment.js +2 -2
- package/dist/core/objects/role/changes/role.create.d.ts +2 -1
- package/dist/core/objects/role/changes/role.create.js +1 -1
- package/dist/core/objects/role/changes/role.drop.d.ts +2 -1
- package/dist/core/objects/role/changes/role.drop.js +1 -1
- package/dist/core/objects/role/changes/role.privilege.d.ts +6 -5
- package/dist/core/objects/role/changes/role.privilege.js +5 -5
- package/dist/core/objects/role/changes/role.types.d.ts +1 -0
- package/dist/core/objects/role/role.diff.js +22 -1
- package/dist/core/objects/role/role.model.d.ts +4 -3
- package/dist/core/objects/role/role.model.js +118 -12
- package/dist/core/objects/rule/changes/rule.alter.d.ts +3 -2
- package/dist/core/objects/rule/changes/rule.alter.js +2 -2
- package/dist/core/objects/rule/changes/rule.comment.d.ts +3 -2
- package/dist/core/objects/rule/changes/rule.comment.js +2 -2
- package/dist/core/objects/rule/changes/rule.create.d.ts +2 -1
- package/dist/core/objects/rule/changes/rule.create.js +1 -1
- package/dist/core/objects/rule/changes/rule.drop.d.ts +2 -1
- package/dist/core/objects/rule/changes/rule.drop.js +1 -1
- package/dist/core/objects/rule/changes/rule.types.d.ts +1 -0
- package/dist/core/objects/rule/rule.model.d.ts +1 -1
- package/dist/core/objects/schema/changes/schema.alter.d.ts +2 -1
- package/dist/core/objects/schema/changes/schema.alter.js +1 -1
- package/dist/core/objects/schema/changes/schema.comment.d.ts +3 -2
- package/dist/core/objects/schema/changes/schema.comment.js +2 -2
- package/dist/core/objects/schema/changes/schema.create.d.ts +3 -5
- package/dist/core/objects/schema/changes/schema.drop.d.ts +2 -1
- package/dist/core/objects/schema/changes/schema.drop.js +1 -1
- package/dist/core/objects/schema/changes/schema.privilege.d.ts +4 -3
- package/dist/core/objects/schema/changes/schema.privilege.js +3 -3
- package/dist/core/objects/schema/changes/schema.types.d.ts +1 -0
- package/dist/core/objects/schema/schema.diff.d.ts +2 -8
- package/dist/core/objects/schema/schema.diff.js +16 -77
- package/dist/core/objects/schema/schema.model.js +1 -1
- package/dist/core/objects/sequence/changes/sequence.alter.d.ts +3 -2
- package/dist/core/objects/sequence/changes/sequence.alter.js +2 -2
- package/dist/core/objects/sequence/changes/sequence.comment.d.ts +3 -2
- package/dist/core/objects/sequence/changes/sequence.comment.js +2 -2
- package/dist/core/objects/sequence/changes/sequence.create.d.ts +2 -1
- package/dist/core/objects/sequence/changes/sequence.create.js +1 -1
- package/dist/core/objects/sequence/changes/sequence.drop.d.ts +2 -1
- package/dist/core/objects/sequence/changes/sequence.drop.js +11 -3
- package/dist/core/objects/sequence/changes/sequence.privilege.d.ts +4 -3
- package/dist/core/objects/sequence/changes/sequence.privilege.js +3 -3
- package/dist/core/objects/sequence/changes/sequence.types.d.ts +1 -0
- package/dist/core/objects/sequence/sequence.diff.d.ts +5 -8
- package/dist/core/objects/sequence/sequence.diff.js +42 -85
- package/dist/core/objects/sequence/sequence.model.js +1 -1
- package/dist/core/objects/subscription/changes/subscription.alter.d.ts +7 -6
- package/dist/core/objects/subscription/changes/subscription.alter.js +6 -6
- package/dist/core/objects/subscription/changes/subscription.comment.d.ts +3 -2
- package/dist/core/objects/subscription/changes/subscription.comment.js +2 -2
- package/dist/core/objects/subscription/changes/subscription.create.d.ts +2 -1
- package/dist/core/objects/subscription/changes/subscription.create.js +1 -1
- package/dist/core/objects/subscription/changes/subscription.drop.d.ts +2 -1
- package/dist/core/objects/subscription/changes/subscription.drop.js +1 -1
- package/dist/core/objects/subscription/changes/subscription.types.d.ts +1 -0
- package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
- package/dist/core/objects/table/changes/table.alter.d.ts +65 -22
- package/dist/core/objects/table/changes/table.alter.js +111 -23
- package/dist/core/objects/table/changes/table.comment.d.ts +7 -6
- package/dist/core/objects/table/changes/table.comment.js +6 -6
- package/dist/core/objects/table/changes/table.create.d.ts +2 -1
- package/dist/core/objects/table/changes/table.create.js +4 -1
- package/dist/core/objects/table/changes/table.drop.d.ts +16 -3
- package/dist/core/objects/table/changes/table.drop.js +24 -1
- package/dist/core/objects/table/changes/table.privilege.d.ts +4 -3
- package/dist/core/objects/table/changes/table.privilege.js +3 -3
- package/dist/core/objects/table/changes/table.types.d.ts +1 -0
- package/dist/core/objects/table/table.diff.d.ts +2 -8
- package/dist/core/objects/table/table.diff.js +80 -160
- package/dist/core/objects/table/table.model.d.ts +29 -22
- package/dist/core/objects/table/table.model.js +6 -1
- package/dist/core/objects/trigger/changes/trigger.alter.d.ts +2 -1
- package/dist/core/objects/trigger/changes/trigger.alter.js +24 -1
- package/dist/core/objects/trigger/changes/trigger.comment.d.ts +3 -2
- package/dist/core/objects/trigger/changes/trigger.comment.js +2 -2
- package/dist/core/objects/trigger/changes/trigger.create.d.ts +2 -1
- package/dist/core/objects/trigger/changes/trigger.create.js +5 -6
- package/dist/core/objects/trigger/changes/trigger.drop.d.ts +2 -1
- package/dist/core/objects/trigger/changes/trigger.drop.js +1 -1
- package/dist/core/objects/trigger/changes/trigger.types.d.ts +1 -0
- package/dist/core/objects/trigger/trigger.diff.js +7 -2
- package/dist/core/objects/trigger/trigger.model.d.ts +10 -1
- package/dist/core/objects/trigger/trigger.model.js +19 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.alter.d.ts +5 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.alter.js +4 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.comment.d.ts +5 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.comment.js +4 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.create.d.ts +2 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.create.js +1 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.drop.d.ts +2 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.drop.js +1 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.privilege.d.ts +4 -3
- package/dist/core/objects/type/composite-type/changes/composite-type.privilege.js +3 -3
- package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +1 -0
- package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
- package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
- package/dist/core/objects/type/composite-type/composite-type.model.d.ts +3 -3
- package/dist/core/objects/type/composite-type/composite-type.model.js +2 -1
- package/dist/core/objects/type/enum/changes/enum.alter.d.ts +3 -2
- package/dist/core/objects/type/enum/changes/enum.alter.js +2 -2
- package/dist/core/objects/type/enum/changes/enum.comment.d.ts +3 -2
- package/dist/core/objects/type/enum/changes/enum.comment.js +2 -2
- package/dist/core/objects/type/enum/changes/enum.create.d.ts +2 -1
- package/dist/core/objects/type/enum/changes/enum.create.js +1 -1
- package/dist/core/objects/type/enum/changes/enum.drop.d.ts +2 -1
- package/dist/core/objects/type/enum/changes/enum.drop.js +1 -1
- package/dist/core/objects/type/enum/changes/enum.privilege.d.ts +4 -3
- package/dist/core/objects/type/enum/changes/enum.privilege.js +3 -3
- package/dist/core/objects/type/enum/changes/enum.types.d.ts +1 -0
- package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
- package/dist/core/objects/type/enum/enum.diff.js +25 -112
- package/dist/core/objects/type/enum/enum.model.js +1 -1
- package/dist/core/objects/type/range/changes/range.alter.d.ts +2 -1
- package/dist/core/objects/type/range/changes/range.alter.js +1 -1
- package/dist/core/objects/type/range/changes/range.comment.d.ts +3 -2
- package/dist/core/objects/type/range/changes/range.comment.js +2 -2
- package/dist/core/objects/type/range/changes/range.create.d.ts +2 -1
- package/dist/core/objects/type/range/changes/range.create.js +7 -4
- package/dist/core/objects/type/range/changes/range.drop.d.ts +2 -1
- package/dist/core/objects/type/range/changes/range.drop.js +1 -1
- package/dist/core/objects/type/range/changes/range.privilege.d.ts +4 -3
- package/dist/core/objects/type/range/changes/range.privilege.js +3 -3
- package/dist/core/objects/type/range/changes/range.types.d.ts +1 -0
- package/dist/core/objects/type/range/range.diff.d.ts +2 -8
- package/dist/core/objects/type/range/range.diff.js +16 -77
- package/dist/core/objects/type/range/range.model.js +1 -1
- package/dist/core/objects/type/type.types.d.ts +1 -0
- package/dist/core/objects/view/changes/view.alter.d.ts +4 -3
- package/dist/core/objects/view/changes/view.alter.js +3 -3
- package/dist/core/objects/view/changes/view.comment.d.ts +3 -2
- package/dist/core/objects/view/changes/view.comment.js +2 -2
- package/dist/core/objects/view/changes/view.create.d.ts +2 -1
- package/dist/core/objects/view/changes/view.create.js +1 -1
- package/dist/core/objects/view/changes/view.drop.d.ts +2 -1
- package/dist/core/objects/view/changes/view.drop.js +1 -1
- package/dist/core/objects/view/changes/view.privilege.d.ts +4 -3
- package/dist/core/objects/view/changes/view.privilege.js +3 -3
- package/dist/core/objects/view/changes/view.types.d.ts +1 -0
- package/dist/core/objects/view/view.diff.d.ts +2 -8
- package/dist/core/objects/view/view.diff.js +37 -168
- package/dist/core/objects/view/view.model.d.ts +18 -4
- package/dist/core/objects/view/view.model.js +3 -13
- package/dist/core/plan/apply.js +11 -28
- package/dist/core/plan/create.d.ts +19 -6
- package/dist/core/plan/create.js +154 -171
- package/dist/core/plan/serialize.js +16 -4
- package/dist/core/plan/sql-format/constants.d.ts +2 -0
- package/dist/core/plan/sql-format/constants.js +11 -0
- package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
- package/dist/core/plan/sql-format/fixtures.js +2455 -0
- package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
- package/dist/core/plan/sql-format/format-utils.js +274 -0
- package/dist/core/plan/sql-format/formatters.d.ts +20 -0
- package/dist/core/plan/sql-format/formatters.js +737 -0
- package/dist/core/plan/sql-format/index.d.ts +2 -0
- package/dist/core/plan/sql-format/index.js +98 -0
- package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
- package/dist/core/plan/sql-format/keyword-case.js +893 -0
- package/dist/core/plan/sql-format/protect.d.ts +3 -0
- package/dist/core/plan/sql-format/protect.js +269 -0
- package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
- package/dist/core/plan/sql-format/sql-scanner.js +202 -0
- package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
- package/dist/core/plan/sql-format/tokenizer.js +118 -0
- package/dist/core/plan/sql-format/types.d.ts +28 -0
- package/dist/core/plan/sql-format/types.js +1 -0
- package/dist/core/plan/sql-format/wrap.d.ts +2 -0
- package/dist/core/plan/sql-format/wrap.js +165 -0
- package/dist/core/plan/sql-format.d.ts +2 -0
- package/dist/core/plan/sql-format.js +1 -0
- package/dist/core/plan/ssl-config.d.ts +32 -0
- package/dist/core/plan/ssl-config.js +115 -0
- package/dist/core/plan/statements.d.ts +2 -1
- package/dist/core/plan/statements.js +6 -2
- package/dist/core/plan/types.d.ts +9 -6
- package/dist/core/post-diff-cycle-breaking.d.ts +29 -0
- package/dist/core/post-diff-cycle-breaking.js +209 -0
- package/dist/core/postgres-config.d.ts +89 -3
- package/dist/core/postgres-config.js +273 -4
- package/dist/core/sort/custom-constraints.js +65 -1
- package/dist/core/sort/graph-builder.js +10 -0
- package/dist/core/sort/logical-sort.js +34 -47
- package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
- package/dist/core/test-utils/assert-valid-sql.js +19 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -1
- package/package.json +59 -22
- package/src/cli/app.ts +52 -0
- package/src/cli/bin/cli.ts +15 -0
- package/src/cli/commands/apply.ts +101 -0
- package/src/cli/commands/catalog-export.ts +78 -0
- package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
- package/src/cli/commands/declarative-apply.ts +380 -0
- package/src/cli/commands/declarative-export.ts +322 -0
- package/src/cli/commands/plan.ts +210 -0
- package/src/cli/commands/sync.ts +178 -0
- package/src/cli/exit-code.test.ts +19 -0
- package/src/cli/exit-code.ts +7 -0
- package/src/cli/formatters/index.ts +5 -0
- package/src/cli/formatters/tree/tree-builder.ts +380 -0
- package/src/cli/formatters/tree/tree-renderer.ts +372 -0
- package/src/cli/formatters/tree/tree.ts +238 -0
- package/src/cli/utils/apply-display.test.ts +348 -0
- package/src/cli/utils/apply-display.ts +238 -0
- package/src/cli/utils/export-display.test.ts +103 -0
- package/src/cli/utils/export-display.ts +275 -0
- package/src/cli/utils/integrations.test.ts +251 -0
- package/src/cli/utils/integrations.ts +170 -0
- package/src/cli/utils/resolve-input.test.ts +38 -0
- package/src/cli/utils/resolve-input.ts +17 -0
- package/src/cli/utils.ts +231 -0
- package/src/core/catalog-export/index.ts +20 -0
- package/src/core/catalog.diff.ts +253 -0
- package/src/core/catalog.model.test.ts +122 -0
- package/src/core/catalog.model.ts +510 -0
- package/src/core/catalog.snapshot.test.ts +488 -0
- package/src/core/catalog.snapshot.ts +289 -0
- package/src/core/change-utils.test.ts +61 -0
- package/src/core/change-utils.ts +73 -0
- package/src/core/change.types.ts +94 -0
- package/src/core/connection-url.test.ts +142 -0
- package/src/core/connection-url.ts +82 -0
- package/src/core/context.ts +26 -0
- package/src/core/declarative-apply/discover-sql.test.ts +103 -0
- package/src/core/declarative-apply/discover-sql.ts +107 -0
- package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
- package/src/core/declarative-apply/index.test.ts +67 -0
- package/src/core/declarative-apply/index.ts +205 -0
- package/src/core/declarative-apply/round-apply.test.ts +504 -0
- package/src/core/declarative-apply/round-apply.ts +562 -0
- package/src/core/depend.ts +1895 -0
- package/src/core/expand-replace-dependencies.test.ts +552 -0
- package/src/core/expand-replace-dependencies.ts +536 -0
- package/src/core/export/file-mapper.test.ts +816 -0
- package/src/core/export/file-mapper.ts +579 -0
- package/src/core/export/grouper.ts +108 -0
- package/src/core/export/index.ts +138 -0
- package/src/core/export/types.ts +104 -0
- package/src/core/fingerprint.ts +204 -0
- package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/src/core/integrations/filter/dsl.test.ts +450 -0
- package/src/core/integrations/filter/dsl.ts +305 -0
- package/src/core/integrations/filter/filter.types.ts +3 -0
- package/src/core/integrations/filter/flatten.test.ts +282 -0
- package/src/core/integrations/filter/flatten.ts +150 -0
- package/src/core/integrations/integration-dsl.ts +50 -0
- package/src/core/integrations/integration.types.ts +65 -0
- package/src/core/integrations/merge.test.ts +128 -0
- package/src/core/integrations/merge.ts +72 -0
- package/src/core/integrations/serialize/dsl.test.ts +110 -0
- package/src/core/integrations/serialize/dsl.ts +71 -0
- package/src/core/integrations/serialize/serialize.types.ts +40 -0
- package/src/core/integrations/supabase.ts +180 -0
- package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
- package/src/core/objects/aggregate/aggregate.model.ts +317 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.ts +33 -0
- package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.ts +63 -0
- package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
- package/src/core/objects/aggregate/changes/aggregate.create.ts +330 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.ts +33 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.ts +147 -0
- package/src/core/objects/aggregate/changes/aggregate.types.ts +13 -0
- package/src/core/objects/base.change.ts +74 -0
- package/src/core/objects/base.default-privileges.ts +204 -0
- package/src/core/objects/base.diff.ts +20 -0
- package/src/core/objects/base.model.test.ts +43 -0
- package/src/core/objects/base.model.ts +85 -0
- package/src/core/objects/base.privilege-diff.ts +447 -0
- package/src/core/objects/base.privilege.ts +191 -0
- package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
- package/src/core/objects/collation/changes/collation.alter.ts +80 -0
- package/src/core/objects/collation/changes/collation.base.ts +20 -0
- package/src/core/objects/collation/changes/collation.comment.ts +69 -0
- package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
- package/src/core/objects/collation/changes/collation.create.ts +107 -0
- package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
- package/src/core/objects/collation/changes/collation.drop.ts +38 -0
- package/src/core/objects/collation/changes/collation.types.ts +11 -0
- package/src/core/objects/collation/collation.diff.test.ts +97 -0
- package/src/core/objects/collation/collation.diff.ts +127 -0
- package/src/core/objects/collation/collation.model.ts +224 -0
- package/src/core/objects/diff-context.ts +16 -0
- package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
- package/src/core/objects/domain/changes/domain.alter.ts +287 -0
- package/src/core/objects/domain/changes/domain.base.ts +20 -0
- package/src/core/objects/domain/changes/domain.comment.ts +60 -0
- package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
- package/src/core/objects/domain/changes/domain.create.ts +141 -0
- package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
- package/src/core/objects/domain/changes/domain.drop.ts +35 -0
- package/src/core/objects/domain/changes/domain.privilege.ts +172 -0
- package/src/core/objects/domain/changes/domain.types.ts +13 -0
- package/src/core/objects/domain/domain.diff.test.ts +284 -0
- package/src/core/objects/domain/domain.diff.ts +295 -0
- package/src/core/objects/domain/domain.model.ts +190 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +83 -0
- package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
- package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +67 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.ts +73 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +35 -0
- package/src/core/objects/event-trigger/changes/event-trigger.types.ts +11 -0
- package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
- package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
- package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
- package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
- package/src/core/objects/extension/changes/extension.alter.ts +79 -0
- package/src/core/objects/extension/changes/extension.base.ts +20 -0
- package/src/core/objects/extension/changes/extension.comment.ts +65 -0
- package/src/core/objects/extension/changes/extension.create.test.ts +50 -0
- package/src/core/objects/extension/changes/extension.create.ts +66 -0
- package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
- package/src/core/objects/extension/changes/extension.drop.ts +35 -0
- package/src/core/objects/extension/changes/extension.types.ts +11 -0
- package/src/core/objects/extension/extension.diff.test.ts +42 -0
- package/src/core/objects/extension/extension.diff.ts +90 -0
- package/src/core/objects/extension/extension.model.test.ts +98 -0
- package/src/core/objects/extension/extension.model.ts +280 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +102 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +73 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +96 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +37 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +173 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +13 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +11 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +342 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +73 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +82 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +38 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +182 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +13 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +127 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +61 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +82 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +35 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +165 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +13 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
- package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +70 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +67 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +41 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +9 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
- package/src/core/objects/index/changes/index.alter.test.ts +209 -0
- package/src/core/objects/index/changes/index.alter.ts +145 -0
- package/src/core/objects/index/changes/index.base.ts +20 -0
- package/src/core/objects/index/changes/index.comment.ts +64 -0
- package/src/core/objects/index/changes/index.create.test.ts +69 -0
- package/src/core/objects/index/changes/index.create.ts +69 -0
- package/src/core/objects/index/changes/index.drop.test.ts +47 -0
- package/src/core/objects/index/changes/index.drop.ts +35 -0
- package/src/core/objects/index/changes/index.types.ts +7 -0
- package/src/core/objects/index/changes/utils.ts +16 -0
- package/src/core/objects/index/index.diff.test.ts +153 -0
- package/src/core/objects/index/index.diff.ts +243 -0
- package/src/core/objects/index/index.model.test.ts +83 -0
- package/src/core/objects/index/index.model.ts +379 -0
- package/src/core/objects/language/changes/language.alter.test.ts +36 -0
- package/src/core/objects/language/changes/language.alter.ts +54 -0
- package/src/core/objects/language/changes/language.base.ts +20 -0
- package/src/core/objects/language/changes/language.comment.ts +59 -0
- package/src/core/objects/language/changes/language.create.test.ts +30 -0
- package/src/core/objects/language/changes/language.create.ts +105 -0
- package/src/core/objects/language/changes/language.drop.test.ts +28 -0
- package/src/core/objects/language/changes/language.drop.ts +40 -0
- package/src/core/objects/language/changes/language.privilege.ts +173 -0
- package/src/core/objects/language/changes/language.types.ts +13 -0
- package/src/core/objects/language/language.diff.test.ts +135 -0
- package/src/core/objects/language/language.diff.ts +144 -0
- package/src/core/objects/language/language.model.ts +150 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +114 -0
- package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
- package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +177 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.ts +94 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +61 -0
- package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +213 -0
- package/src/core/objects/materialized-view/changes/materialized-view.types.ts +13 -0
- package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
- package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
- package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
- package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
- package/src/core/objects/procedure/changes/procedure.alter.ts +291 -0
- package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
- package/src/core/objects/procedure/changes/procedure.comment.ts +71 -0
- package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
- package/src/core/objects/procedure/changes/procedure.create.ts +93 -0
- package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
- package/src/core/objects/procedure/changes/procedure.drop.ts +50 -0
- package/src/core/objects/procedure/changes/procedure.privilege.ts +189 -0
- package/src/core/objects/procedure/changes/procedure.types.ts +13 -0
- package/src/core/objects/procedure/procedure.diff.test.ts +284 -0
- package/src/core/objects/procedure/procedure.diff.ts +371 -0
- package/src/core/objects/procedure/procedure.model.ts +264 -0
- package/src/core/objects/procedure/utils.ts +58 -0
- package/src/core/objects/publication/changes/publication.alter.test.ts +221 -0
- package/src/core/objects/publication/changes/publication.alter.ts +232 -0
- package/src/core/objects/publication/changes/publication.base.ts +20 -0
- package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
- package/src/core/objects/publication/changes/publication.comment.ts +65 -0
- package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
- package/src/core/objects/publication/changes/publication.create.ts +83 -0
- package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
- package/src/core/objects/publication/changes/publication.drop.ts +30 -0
- package/src/core/objects/publication/changes/publication.types.ts +25 -0
- package/src/core/objects/publication/publication.diff.test.ts +297 -0
- package/src/core/objects/publication/publication.diff.ts +247 -0
- package/src/core/objects/publication/publication.model.ts +206 -0
- package/src/core/objects/publication/utils.ts +55 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +283 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +129 -0
- package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
- package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +70 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +209 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.ts +128 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +33 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +40 -0
- package/src/core/objects/rls-policy/changes/rls-policy.types.ts +11 -0
- package/src/core/objects/rls-policy/rls-policy.diff.test.ts +81 -0
- package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
- package/src/core/objects/rls-policy/rls-policy.model.ts +273 -0
- package/src/core/objects/role/changes/role.alter.test.ts +362 -0
- package/src/core/objects/role/changes/role.alter.ts +111 -0
- package/src/core/objects/role/changes/role.base.ts +24 -0
- package/src/core/objects/role/changes/role.comment.ts +56 -0
- package/src/core/objects/role/changes/role.create.test.ts +56 -0
- package/src/core/objects/role/changes/role.create.ts +103 -0
- package/src/core/objects/role/changes/role.drop.test.ts +32 -0
- package/src/core/objects/role/changes/role.drop.ts +35 -0
- package/src/core/objects/role/changes/role.privilege.ts +377 -0
- package/src/core/objects/role/changes/role.types.ts +13 -0
- package/src/core/objects/role/role.diff.test.ts +279 -0
- package/src/core/objects/role/role.diff.ts +499 -0
- package/src/core/objects/role/role.model.ts +452 -0
- package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
- package/src/core/objects/rule/changes/rule.alter.ts +73 -0
- package/src/core/objects/rule/changes/rule.base.ts +20 -0
- package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
- package/src/core/objects/rule/changes/rule.comment.ts +63 -0
- package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
- package/src/core/objects/rule/changes/rule.create.ts +43 -0
- package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
- package/src/core/objects/rule/changes/rule.drop.ts +30 -0
- package/src/core/objects/rule/changes/rule.types.ts +13 -0
- package/src/core/objects/rule/rule.diff.test.ts +132 -0
- package/src/core/objects/rule/rule.diff.ts +79 -0
- package/src/core/objects/rule/rule.model.ts +173 -0
- package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
- package/src/core/objects/schema/changes/schema.alter.ts +46 -0
- package/src/core/objects/schema/changes/schema.base.ts +20 -0
- package/src/core/objects/schema/changes/schema.comment.ts +57 -0
- package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
- package/src/core/objects/schema/changes/schema.create.ts +47 -0
- package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
- package/src/core/objects/schema/changes/schema.drop.ts +35 -0
- package/src/core/objects/schema/changes/schema.privilege.ts +176 -0
- package/src/core/objects/schema/changes/schema.types.ts +13 -0
- package/src/core/objects/schema/schema.diff.test.ts +42 -0
- package/src/core/objects/schema/schema.diff.ts +146 -0
- package/src/core/objects/schema/schema.model.ts +107 -0
- package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
- package/src/core/objects/sequence/changes/sequence.alter.ts +116 -0
- package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
- package/src/core/objects/sequence/changes/sequence.comment.ts +61 -0
- package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
- package/src/core/objects/sequence/changes/sequence.create.ts +112 -0
- package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
- package/src/core/objects/sequence/changes/sequence.drop.ts +50 -0
- package/src/core/objects/sequence/changes/sequence.privilege.ts +180 -0
- package/src/core/objects/sequence/changes/sequence.types.ts +13 -0
- package/src/core/objects/sequence/sequence.diff.test.ts +429 -0
- package/src/core/objects/sequence/sequence.diff.ts +326 -0
- package/src/core/objects/sequence/sequence.model.ts +185 -0
- package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
- package/src/core/objects/subscription/changes/subscription.alter.ts +111 -0
- package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
- package/src/core/objects/subscription/changes/subscription.comment.ts +65 -0
- package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
- package/src/core/objects/subscription/changes/subscription.create.ts +70 -0
- package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
- package/src/core/objects/subscription/changes/subscription.drop.ts +21 -0
- package/src/core/objects/subscription/changes/subscription.types.ts +23 -0
- package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
- package/src/core/objects/subscription/subscription.diff.ts +242 -0
- package/src/core/objects/subscription/subscription.model.ts +190 -0
- package/src/core/objects/subscription/utils.ts +156 -0
- package/src/core/objects/table/changes/table.alter.test.ts +899 -0
- package/src/core/objects/table/changes/table.alter.ts +910 -0
- package/src/core/objects/table/changes/table.base.ts +20 -0
- package/src/core/objects/table/changes/table.comment.ts +267 -0
- package/src/core/objects/table/changes/table.create.test.ts +188 -0
- package/src/core/objects/table/changes/table.create.ts +193 -0
- package/src/core/objects/table/changes/table.drop.test.ts +36 -0
- package/src/core/objects/table/changes/table.drop.ts +87 -0
- package/src/core/objects/table/changes/table.privilege.ts +201 -0
- package/src/core/objects/table/changes/table.types.ts +13 -0
- package/src/core/objects/table/table.diff.test.ts +1146 -0
- package/src/core/objects/table/table.diff.ts +889 -0
- package/src/core/objects/table/table.model.ts +462 -0
- package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
- package/src/core/objects/trigger/changes/trigger.alter.ts +77 -0
- package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
- package/src/core/objects/trigger/changes/trigger.comment.ts +65 -0
- package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
- package/src/core/objects/trigger/changes/trigger.create.ts +89 -0
- package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
- package/src/core/objects/trigger/changes/trigger.drop.ts +40 -0
- package/src/core/objects/trigger/changes/trigger.types.ts +11 -0
- package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
- package/src/core/objects/trigger/trigger.diff.ts +121 -0
- package/src/core/objects/trigger/trigger.model.ts +268 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +175 -0
- package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
- package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +146 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.ts +96 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +38 -0
- package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +176 -0
- package/src/core/objects/type/composite-type/changes/composite-type.types.ts +13 -0
- package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
- package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
- package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
- package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
- package/src/core/objects/type/enum/changes/enum.alter.ts +92 -0
- package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
- package/src/core/objects/type/enum/changes/enum.comment.ts +65 -0
- package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
- package/src/core/objects/type/enum/changes/enum.create.ts +57 -0
- package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
- package/src/core/objects/type/enum/changes/enum.drop.ts +35 -0
- package/src/core/objects/type/enum/changes/enum.privilege.ts +176 -0
- package/src/core/objects/type/enum/changes/enum.types.ts +13 -0
- package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
- package/src/core/objects/type/enum/enum.diff.ts +308 -0
- package/src/core/objects/type/enum/enum.model.ts +194 -0
- package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
- package/src/core/objects/type/range/changes/range.alter.ts +52 -0
- package/src/core/objects/type/range/changes/range.base.ts +20 -0
- package/src/core/objects/type/range/changes/range.comment.ts +65 -0
- package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
- package/src/core/objects/type/range/changes/range.create.ts +156 -0
- package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
- package/src/core/objects/type/range/changes/range.drop.ts +35 -0
- package/src/core/objects/type/range/changes/range.privilege.ts +176 -0
- package/src/core/objects/type/range/changes/range.types.ts +13 -0
- package/src/core/objects/type/range/range.diff.test.ts +147 -0
- package/src/core/objects/type/range/range.diff.ts +197 -0
- package/src/core/objects/type/range/range.model.ts +187 -0
- package/src/core/objects/type/type.types.ts +6 -0
- package/src/core/objects/utils.ts +171 -0
- package/src/core/objects/view/changes/view.alter.test.ts +115 -0
- package/src/core/objects/view/changes/view.alter.ts +113 -0
- package/src/core/objects/view/changes/view.base.ts +20 -0
- package/src/core/objects/view/changes/view.comment.ts +60 -0
- package/src/core/objects/view/changes/view.create.test.ts +70 -0
- package/src/core/objects/view/changes/view.create.ts +74 -0
- package/src/core/objects/view/changes/view.drop.test.ts +37 -0
- package/src/core/objects/view/changes/view.drop.ts +41 -0
- package/src/core/objects/view/changes/view.privilege.ts +201 -0
- package/src/core/objects/view/changes/view.types.ts +13 -0
- package/src/core/objects/view/view.diff.test.ts +269 -0
- package/src/core/objects/view/view.diff.ts +230 -0
- package/src/core/objects/view/view.model.ts +262 -0
- package/src/core/plan/apply.ts +172 -0
- package/src/core/plan/create.ts +368 -0
- package/src/core/plan/hierarchy.ts +574 -0
- package/src/core/plan/index.ts +29 -0
- package/src/core/plan/io.ts +20 -0
- package/src/core/plan/risk.ts +48 -0
- package/src/core/plan/serialize.test.ts +317 -0
- package/src/core/plan/serialize.ts +209 -0
- package/src/core/plan/sql-format/constants.ts +13 -0
- package/src/core/plan/sql-format/fixtures.ts +2811 -0
- package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
- package/src/core/plan/sql-format/format-functions.test.ts +127 -0
- package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
- package/src/core/plan/sql-format/format-off.test.ts +806 -0
- package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
- package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
- package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
- package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
- package/src/core/plan/sql-format/format-stress.test.ts +616 -0
- package/src/core/plan/sql-format/format-utils.test.ts +91 -0
- package/src/core/plan/sql-format/format-utils.ts +391 -0
- package/src/core/plan/sql-format/formatters.ts +921 -0
- package/src/core/plan/sql-format/index.ts +149 -0
- package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
- package/src/core/plan/sql-format/keyword-case.ts +1120 -0
- package/src/core/plan/sql-format/protect.test.ts +127 -0
- package/src/core/plan/sql-format/protect.ts +337 -0
- package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
- package/src/core/plan/sql-format/sql-scanner.ts +252 -0
- package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
- package/src/core/plan/sql-format/tokenizer.ts +152 -0
- package/src/core/plan/sql-format/types.ts +31 -0
- package/src/core/plan/sql-format/wrap.test.ts +119 -0
- package/src/core/plan/sql-format/wrap.ts +196 -0
- package/src/core/plan/sql-format.ts +2 -0
- package/src/core/plan/ssl-config.ts +172 -0
- package/src/core/plan/statements.ts +22 -0
- package/src/core/plan/types.ts +168 -0
- package/src/core/post-diff-cycle-breaking.test.ts +459 -0
- package/src/core/post-diff-cycle-breaking.ts +317 -0
- package/src/core/postgres-config.test.ts +336 -0
- package/src/core/postgres-config.ts +458 -0
- package/src/core/sort/custom-constraints.ts +235 -0
- package/src/core/sort/debug-visualization.ts +239 -0
- package/src/core/sort/dependency-filter.ts +224 -0
- package/src/core/sort/graph-builder.ts +235 -0
- package/src/core/sort/graph-utils.ts +51 -0
- package/src/core/sort/logical-sort.test.ts +371 -0
- package/src/core/sort/logical-sort.ts +573 -0
- package/src/core/sort/sort-changes.ts +234 -0
- package/src/core/sort/topological-sort.test.ts +275 -0
- package/src/core/sort/topological-sort.ts +184 -0
- package/src/core/sort/types.ts +112 -0
- package/src/core/sort/utils.ts +69 -0
- package/src/core/test-utils/assert-valid-sql.ts +20 -0
- package/src/index.ts +41 -0
- package/src/typedoc.ts +253 -0
- package/dist/core/integrations/filter/extractors.d.ts +0 -12
- package/dist/core/integrations/filter/extractors.js +0 -136
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import debug from "debug";
|
|
2
|
+
import type { Change } from "../change.types.ts";
|
|
3
|
+
import { findCycle } from "./topological-sort.ts";
|
|
4
|
+
import type { Constraint, GraphData, PgDependRow } from "./types.ts";
|
|
5
|
+
|
|
6
|
+
const debugGraph = debug("pg-delta:graph");
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Generate a Mermaid diagram representation of the dependency graph for debugging.
|
|
10
|
+
*/
|
|
11
|
+
function generateMermaidDiagram(
|
|
12
|
+
phaseChanges: Change[],
|
|
13
|
+
graphData: GraphData,
|
|
14
|
+
edges: Array<[number, number]>,
|
|
15
|
+
requirementSets: Array<Set<string>>,
|
|
16
|
+
dependenciesByReferencedId: Map<string, Set<string>>,
|
|
17
|
+
): string {
|
|
18
|
+
const cycleNodeIndexes = findCycle(phaseChanges.length, edges) ?? [];
|
|
19
|
+
const mermaidLines: string[] = [];
|
|
20
|
+
mermaidLines.push("flowchart TD");
|
|
21
|
+
|
|
22
|
+
// Add nodes
|
|
23
|
+
for (let changeIndex = 0; changeIndex < phaseChanges.length; changeIndex++) {
|
|
24
|
+
const changeInstance = phaseChanges[changeIndex];
|
|
25
|
+
const changeClassName = changeInstance?.constructor?.name ?? "Change";
|
|
26
|
+
const truncatedCreates = Array.isArray(changeInstance.creates)
|
|
27
|
+
? changeInstance.creates.slice(0, 3)
|
|
28
|
+
: [];
|
|
29
|
+
const nodeLabel = `${changeIndex}: ${changeClassName} ${
|
|
30
|
+
truncatedCreates.length > 0 ? `[${truncatedCreates.join(",")}]` : ""
|
|
31
|
+
}`.replaceAll('"', "'");
|
|
32
|
+
mermaidLines.push(` n${changeIndex}["${nodeLabel}"]`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Add edges with descriptions
|
|
36
|
+
for (const [sourceIndex, targetIndex] of edges) {
|
|
37
|
+
const edgeDescription = describeEdge(
|
|
38
|
+
sourceIndex,
|
|
39
|
+
targetIndex,
|
|
40
|
+
graphData,
|
|
41
|
+
requirementSets,
|
|
42
|
+
dependenciesByReferencedId,
|
|
43
|
+
).replaceAll('"', "'");
|
|
44
|
+
if (edgeDescription.length > 0) {
|
|
45
|
+
mermaidLines.push(
|
|
46
|
+
` n${sourceIndex} -- "${edgeDescription}" --> n${targetIndex}`,
|
|
47
|
+
);
|
|
48
|
+
} else {
|
|
49
|
+
mermaidLines.push(` n${sourceIndex} --> n${targetIndex}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Highlight cycles if any
|
|
54
|
+
if (cycleNodeIndexes.length > 0) {
|
|
55
|
+
mermaidLines.push(
|
|
56
|
+
" classDef cycleNode fill:#ffe6e6,stroke:#ff4d4f,stroke-width:2px;",
|
|
57
|
+
);
|
|
58
|
+
for (const nodeIndex of cycleNodeIndexes) {
|
|
59
|
+
mermaidLines.push(` class n${nodeIndex} cycleNode;`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const cycleEdges: Array<[number, number]> = [];
|
|
63
|
+
for (
|
|
64
|
+
let cycleIndex = 0;
|
|
65
|
+
cycleIndex < cycleNodeIndexes.length;
|
|
66
|
+
cycleIndex++
|
|
67
|
+
) {
|
|
68
|
+
const sourceIndex = cycleNodeIndexes[cycleIndex];
|
|
69
|
+
const targetIndex =
|
|
70
|
+
cycleNodeIndexes[(cycleIndex + 1) % cycleNodeIndexes.length];
|
|
71
|
+
cycleEdges.push([sourceIndex, targetIndex]);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let edgeIndex = 0;
|
|
75
|
+
for (const [sourceIndex, targetIndex] of edges) {
|
|
76
|
+
const edgeBelongsToCycle = cycleEdges.some(
|
|
77
|
+
([cycleSourceIndex, cycleTargetIndex]) =>
|
|
78
|
+
cycleSourceIndex === sourceIndex && cycleTargetIndex === targetIndex,
|
|
79
|
+
);
|
|
80
|
+
if (edgeBelongsToCycle) {
|
|
81
|
+
mermaidLines.push(
|
|
82
|
+
` linkStyle ${edgeIndex} stroke:#ff4d4f,stroke-width:2px;`,
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
edgeIndex++;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return mermaidLines.join("\n");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Build requirementSets from explicit requirements and constraints (for debug visualization).
|
|
94
|
+
*
|
|
95
|
+
* This reconstructs what requirements were inferred from constraints by looking at
|
|
96
|
+
* the constraints that were processed. Only processes catalog/explicit constraints,
|
|
97
|
+
* as custom constraints don't affect requirement sets.
|
|
98
|
+
*/
|
|
99
|
+
function buildRequirementSets(
|
|
100
|
+
explicitRequirementSets: Array<Set<string>>,
|
|
101
|
+
constraints: Constraint[],
|
|
102
|
+
changeIndexesByCreatedId: Map<string, Set<number>>,
|
|
103
|
+
_changeIndexesByExplicitRequirementId: Map<string, Set<number>>,
|
|
104
|
+
): Array<Set<string>> {
|
|
105
|
+
// Start with explicit requirements
|
|
106
|
+
const requirementSets: Array<Set<string>> = explicitRequirementSets.map(
|
|
107
|
+
(explicitRequirements) => new Set<string>(explicitRequirements),
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
// Add requirements inferred from catalog/explicit constraints
|
|
111
|
+
// For each constraint with a reason, if the referenced ID is created by some change,
|
|
112
|
+
// then the target change requires the referenced ID
|
|
113
|
+
for (const constraint of constraints) {
|
|
114
|
+
// Only process catalog/explicit constraints (custom constraints don't affect requirements)
|
|
115
|
+
if (constraint.source === "custom" || !constraint.reason) continue;
|
|
116
|
+
|
|
117
|
+
const referencedProducers = changeIndexesByCreatedId.get(
|
|
118
|
+
constraint.reason.referencedStableId,
|
|
119
|
+
);
|
|
120
|
+
if (!referencedProducers || referencedProducers.size === 0) continue;
|
|
121
|
+
|
|
122
|
+
// The target change requires the referenced stable ID
|
|
123
|
+
requirementSets[constraint.targetChangeIndex].add(
|
|
124
|
+
constraint.reason.referencedStableId,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return requirementSets;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Build dependenciesByReferencedId from dependency rows (for debug visualization).
|
|
133
|
+
*/
|
|
134
|
+
function buildDependenciesByReferencedId(
|
|
135
|
+
dependencyRows: PgDependRow[],
|
|
136
|
+
): Map<string, Set<string>> {
|
|
137
|
+
const dependenciesByReferencedId = new Map<string, Set<string>>();
|
|
138
|
+
for (const dependencyRow of dependencyRows) {
|
|
139
|
+
// Filter out unknown dependencies
|
|
140
|
+
if (
|
|
141
|
+
dependencyRow.referenced_stable_id.startsWith("unknown:") ||
|
|
142
|
+
dependencyRow.dependent_stable_id.startsWith("unknown:")
|
|
143
|
+
) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let dependentIds = dependenciesByReferencedId.get(
|
|
148
|
+
dependencyRow.referenced_stable_id,
|
|
149
|
+
);
|
|
150
|
+
if (!dependentIds) {
|
|
151
|
+
dependentIds = new Set<string>();
|
|
152
|
+
dependenciesByReferencedId.set(
|
|
153
|
+
dependencyRow.referenced_stable_id,
|
|
154
|
+
dependentIds,
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
dependentIds.add(dependencyRow.dependent_stable_id);
|
|
158
|
+
}
|
|
159
|
+
return dependenciesByReferencedId;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Describe an edge in the dependency graph for visualization.
|
|
164
|
+
*/
|
|
165
|
+
function describeEdge(
|
|
166
|
+
sourceIndex: number,
|
|
167
|
+
targetIndex: number,
|
|
168
|
+
graphData: GraphData,
|
|
169
|
+
requirementSets: Array<Set<string>>,
|
|
170
|
+
dependenciesByReferencedId: Map<string, Set<string>>,
|
|
171
|
+
): string {
|
|
172
|
+
// Check if target explicitly requires something created by source
|
|
173
|
+
for (const createdId of graphData.createdStableIdSets[sourceIndex]) {
|
|
174
|
+
if (requirementSets[targetIndex].has(createdId)) {
|
|
175
|
+
return `${createdId} -> (requires)`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Check pg_depend relationships
|
|
180
|
+
for (const createdId of graphData.createdStableIdSets[sourceIndex]) {
|
|
181
|
+
const outgoingDependencies = dependenciesByReferencedId.get(createdId);
|
|
182
|
+
if (!outgoingDependencies) continue;
|
|
183
|
+
|
|
184
|
+
// Check if target requires this ID
|
|
185
|
+
for (const requiredId of requirementSets[targetIndex]) {
|
|
186
|
+
if (outgoingDependencies.has(requiredId)) {
|
|
187
|
+
return `${createdId} -> ${requiredId}`;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Check if target creates something that depends on this ID
|
|
192
|
+
for (const targetCreatedId of graphData.createdStableIdSets[targetIndex]) {
|
|
193
|
+
if (outgoingDependencies.has(targetCreatedId)) {
|
|
194
|
+
return `${createdId} -> ${targetCreatedId}`;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return "";
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Print debug information about the dependency graph.
|
|
204
|
+
*
|
|
205
|
+
* Builds debug-only data structures (requirementSets, dependenciesByReferencedId) just-in-time.
|
|
206
|
+
*/
|
|
207
|
+
export function printDebugGraph(
|
|
208
|
+
phaseChanges: Change[],
|
|
209
|
+
graphData: GraphData,
|
|
210
|
+
edges: Array<[number, number]>,
|
|
211
|
+
dependencyRows: PgDependRow[],
|
|
212
|
+
constraints: Constraint[],
|
|
213
|
+
): void {
|
|
214
|
+
try {
|
|
215
|
+
// Build debug-only data structures just-in-time
|
|
216
|
+
const requirementSets = buildRequirementSets(
|
|
217
|
+
graphData.explicitRequirementSets,
|
|
218
|
+
constraints,
|
|
219
|
+
graphData.changeIndexesByCreatedId,
|
|
220
|
+
graphData.changeIndexesByExplicitRequirementId,
|
|
221
|
+
);
|
|
222
|
+
const dependenciesByReferencedId =
|
|
223
|
+
buildDependenciesByReferencedId(dependencyRows);
|
|
224
|
+
|
|
225
|
+
const mermaidDiagram = generateMermaidDiagram(
|
|
226
|
+
phaseChanges,
|
|
227
|
+
graphData,
|
|
228
|
+
edges,
|
|
229
|
+
requirementSets,
|
|
230
|
+
dependenciesByReferencedId,
|
|
231
|
+
);
|
|
232
|
+
debugGraph(
|
|
233
|
+
"\n==== Mermaid (cycle detected) ====\n%s\n==== end ====",
|
|
234
|
+
mermaidDiagram,
|
|
235
|
+
);
|
|
236
|
+
} catch (_error) {
|
|
237
|
+
// ignore debug printing errors
|
|
238
|
+
}
|
|
239
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import type { Change } from "../change.types.ts";
|
|
2
|
+
import { CreateSequence } from "../objects/sequence/changes/sequence.create.ts";
|
|
3
|
+
import { stableId } from "../objects/utils.ts";
|
|
4
|
+
import { findConsumerIndexes } from "./graph-utils.ts";
|
|
5
|
+
import type { Edge, GraphData } from "./types.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Check if a sequence is owned by a given column.
|
|
9
|
+
*
|
|
10
|
+
* @param sequence - The sequence object with ownership information
|
|
11
|
+
* @param referencedStableId - The column stable ID to check against
|
|
12
|
+
* @returns true if the sequence is owned by the referenced column
|
|
13
|
+
*/
|
|
14
|
+
function isSequenceOwnedBy(
|
|
15
|
+
sequence: {
|
|
16
|
+
owned_by_schema: string | null;
|
|
17
|
+
owned_by_table: string | null;
|
|
18
|
+
owned_by_column: string | null;
|
|
19
|
+
},
|
|
20
|
+
referencedStableId: string,
|
|
21
|
+
): boolean {
|
|
22
|
+
if (
|
|
23
|
+
!sequence.owned_by_schema ||
|
|
24
|
+
!sequence.owned_by_table ||
|
|
25
|
+
!sequence.owned_by_column
|
|
26
|
+
) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const ownedByColumnId = stableId.column(
|
|
31
|
+
sequence.owned_by_schema,
|
|
32
|
+
sequence.owned_by_table,
|
|
33
|
+
sequence.owned_by_column,
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
return referencedStableId === ownedByColumnId;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Check if a sequence ownership dependency should be filtered to prevent cycles.
|
|
41
|
+
*
|
|
42
|
+
* CYCLE SCENARIO:
|
|
43
|
+
* When a sequence is owned by a table column that also uses the sequence (via DEFAULT),
|
|
44
|
+
* PostgreSQL's pg_depend creates a bidirectional dependency cycle:
|
|
45
|
+
* 1. column → sequence (column default depends on sequence)
|
|
46
|
+
* 2. sequence → column (sequence ownership depends on column)
|
|
47
|
+
*
|
|
48
|
+
* This creates: sequence → column → sequence (cycle!)
|
|
49
|
+
*
|
|
50
|
+
* HOW WE BREAK THE CYCLE:
|
|
51
|
+
* We filter out the ownership dependency edge (sequence → column) because:
|
|
52
|
+
* - CREATE phase: Sequences should be created before tables. Ownership is set later
|
|
53
|
+
* via ALTER SEQUENCE OWNED BY after both the sequence and table exist.
|
|
54
|
+
* - DROP phase: Prevents cycles when dropping sequences owned by tables that
|
|
55
|
+
* aren't being dropped.
|
|
56
|
+
*
|
|
57
|
+
* PARAMETERS:
|
|
58
|
+
* @param dependentStableId - The sequence stable ID (e.g., "sequence:schema.seq_name")
|
|
59
|
+
* @param referencedStableId - The column stable ID (e.g., "column:schema.table.col")
|
|
60
|
+
* Note: PostgreSQL's pg_depend creates sequence ownership dependencies on columns (not tables)
|
|
61
|
+
* when refobjsubid > 0, so we only check for column dependencies
|
|
62
|
+
* @param phaseChanges - All changes in the current phase
|
|
63
|
+
* @param graphData - Graph data structures for looking up changes
|
|
64
|
+
* @returns true if this ownership dependency should be filtered (removed) to break the cycle
|
|
65
|
+
*/
|
|
66
|
+
function shouldFilterSequenceOwnershipDependency(
|
|
67
|
+
dependentStableId: string,
|
|
68
|
+
referencedStableId: string,
|
|
69
|
+
phaseChanges: Change[],
|
|
70
|
+
graphData: GraphData,
|
|
71
|
+
): boolean {
|
|
72
|
+
// Early exit: only filter edges FROM sequences TO columns
|
|
73
|
+
// Note: PostgreSQL's pg_depend creates sequence ownership dependencies on columns (not tables)
|
|
74
|
+
// when refobjsubid > 0, so we only need to check for column dependencies
|
|
75
|
+
if (
|
|
76
|
+
!dependentStableId.startsWith("sequence:") ||
|
|
77
|
+
!referencedStableId.startsWith("column:")
|
|
78
|
+
) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Find all changes that create or consume this sequence
|
|
83
|
+
// (includes the CreateSequence change that creates it)
|
|
84
|
+
const changesInvolvingSequence = findConsumerIndexes(
|
|
85
|
+
dependentStableId,
|
|
86
|
+
graphData.changeIndexesByCreatedId,
|
|
87
|
+
graphData.changeIndexesByExplicitRequirementId,
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
// Check if any CreateSequence change creates a sequence that is owned by
|
|
91
|
+
// the referenced table/column. If so, filter this ownership dependency edge.
|
|
92
|
+
for (const changeIndex of changesInvolvingSequence) {
|
|
93
|
+
const change = phaseChanges[changeIndex];
|
|
94
|
+
|
|
95
|
+
// Only filter edges from CreateSequence changes, not AlterSequenceSetOwnedBy.
|
|
96
|
+
// AlterSequenceSetOwnedBy is a separate change that sets ownership after
|
|
97
|
+
// both the sequence and table exist, so it doesn't create the cycle.
|
|
98
|
+
if (!(change instanceof CreateSequence)) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Check if this CreateSequence creates a sequence owned by the referenced table/column
|
|
103
|
+
if (isSequenceOwnedBy(change.sequence, referencedStableId)) {
|
|
104
|
+
return true; // Filter this edge to break the cycle
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return false; // Don't filter - this is not a cycle-causing ownership dependency
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Cycle-breaking filters for stable ID dependencies.
|
|
113
|
+
*
|
|
114
|
+
* Prevents cycles that would occur due to special PostgreSQL behaviors.
|
|
115
|
+
* Delegates to specific filter functions for each type of cycle.
|
|
116
|
+
*
|
|
117
|
+
* @param dependentStableId - The dependent object's stable ID
|
|
118
|
+
* @param referencedStableId - The referenced object's stable ID
|
|
119
|
+
* @param phaseChanges - All changes in the current phase
|
|
120
|
+
* @param graphData - Graph data structures for looking up changes
|
|
121
|
+
* @returns true if this dependency edge should be filtered (removed) to break a cycle
|
|
122
|
+
*/
|
|
123
|
+
function shouldFilterStableIdDependencyForCycleBreaking(
|
|
124
|
+
dependentStableId: string,
|
|
125
|
+
referencedStableId: string,
|
|
126
|
+
phaseChanges: Change[],
|
|
127
|
+
graphData: GraphData,
|
|
128
|
+
): boolean {
|
|
129
|
+
// Filter sequence ownership dependencies that create cycles with column defaults
|
|
130
|
+
if (
|
|
131
|
+
shouldFilterSequenceOwnershipDependency(
|
|
132
|
+
dependentStableId,
|
|
133
|
+
referencedStableId,
|
|
134
|
+
phaseChanges,
|
|
135
|
+
graphData,
|
|
136
|
+
)
|
|
137
|
+
) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Identify edges that are part of a cycle.
|
|
146
|
+
*
|
|
147
|
+
* Given cycle node indices, returns edges where both source and target are in the cycle
|
|
148
|
+
* and form consecutive nodes in the cycle path.
|
|
149
|
+
*/
|
|
150
|
+
export function getEdgesInCycle(
|
|
151
|
+
cycleNodeIndexes: number[],
|
|
152
|
+
edges: Edge[],
|
|
153
|
+
): Edge[] {
|
|
154
|
+
const cycleEdges: Edge[] = [];
|
|
155
|
+
|
|
156
|
+
// Create a map of edges for quick lookup
|
|
157
|
+
const edgeMap = new Map<string, Edge>();
|
|
158
|
+
for (const edge of edges) {
|
|
159
|
+
const key = `${edge.sourceIndex}->${edge.targetIndex}`;
|
|
160
|
+
edgeMap.set(key, edge);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Find edges that connect consecutive nodes in the cycle
|
|
164
|
+
for (let i = 0; i < cycleNodeIndexes.length; i++) {
|
|
165
|
+
const sourceIndex = cycleNodeIndexes[i];
|
|
166
|
+
const targetIndex = cycleNodeIndexes[(i + 1) % cycleNodeIndexes.length];
|
|
167
|
+
const key = `${sourceIndex}->${targetIndex}`;
|
|
168
|
+
const edge = edgeMap.get(key);
|
|
169
|
+
if (edge) {
|
|
170
|
+
cycleEdges.push(edge);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return cycleEdges;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Filter edges involved in cycles based on their constraint's cycle-breaking rules.
|
|
179
|
+
*
|
|
180
|
+
* This is applied when cycles are detected to break them by removing problematic edges.
|
|
181
|
+
* Only filters edges that:
|
|
182
|
+
* 1. Are part of the detected cycle(s)
|
|
183
|
+
* 2. Have a reason (stable ID dependency) - custom constraints are never filtered
|
|
184
|
+
* 3. Match the cycle-breaking filter criteria
|
|
185
|
+
*/
|
|
186
|
+
export function filterEdgesForCycleBreaking(
|
|
187
|
+
edges: Edge[],
|
|
188
|
+
cycleNodeIndexes: number[],
|
|
189
|
+
phaseChanges: Change[],
|
|
190
|
+
graphData: GraphData,
|
|
191
|
+
): Edge[] {
|
|
192
|
+
// Get edges that are part of the cycle
|
|
193
|
+
const cycleEdges = getEdgesInCycle(cycleNodeIndexes, edges);
|
|
194
|
+
// Use string keys for comparison since Set.has() uses reference equality
|
|
195
|
+
const cycleEdgeKeys = new Set(
|
|
196
|
+
cycleEdges.map((e) => `${e.sourceIndex}->${e.targetIndex}`),
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
return edges.filter((edge) => {
|
|
200
|
+
const edgeKey = `${edge.sourceIndex}->${edge.targetIndex}`;
|
|
201
|
+
// If edge is not in the cycle, keep it
|
|
202
|
+
if (!cycleEdgeKeys.has(edgeKey)) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Edge is in cycle - check if it should be filtered
|
|
207
|
+
const constraint = edge.constraint;
|
|
208
|
+
|
|
209
|
+
// Custom constraints are never filtered
|
|
210
|
+
if (constraint.source === "custom") return true;
|
|
211
|
+
|
|
212
|
+
const { dependentStableId, referencedStableId } = constraint.reason;
|
|
213
|
+
// Skip if dependentStableId is undefined (explicit requirement without created IDs)
|
|
214
|
+
if (!dependentStableId) return true;
|
|
215
|
+
|
|
216
|
+
// Apply cycle-breaking filters - return false to filter out this edge
|
|
217
|
+
return !shouldFilterStableIdDependencyForCycleBreaking(
|
|
218
|
+
dependentStableId,
|
|
219
|
+
referencedStableId,
|
|
220
|
+
phaseChanges,
|
|
221
|
+
graphData,
|
|
222
|
+
);
|
|
223
|
+
});
|
|
224
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import type { Change } from "../change.types.ts";
|
|
2
|
+
import { findConsumerIndexes } from "./graph-utils.ts";
|
|
3
|
+
import type {
|
|
4
|
+
Constraint,
|
|
5
|
+
Edge,
|
|
6
|
+
GraphData,
|
|
7
|
+
PgDependRow,
|
|
8
|
+
PhaseSortOptions,
|
|
9
|
+
} from "./types.ts";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Convert catalog dependencies to Constraints.
|
|
13
|
+
*
|
|
14
|
+
* For each catalog dependency (stable ID → stable ID), finds the changes that
|
|
15
|
+
* create/require those stable IDs and creates Constraints between them.
|
|
16
|
+
*
|
|
17
|
+
* Filters out unknown stable IDs (basic validation).
|
|
18
|
+
* Cycle-breaking filters are applied later when detecting cycles.
|
|
19
|
+
*/
|
|
20
|
+
export function convertCatalogDependenciesToConstraints(
|
|
21
|
+
dependencyRows: PgDependRow[],
|
|
22
|
+
graphData: GraphData,
|
|
23
|
+
): Constraint[] {
|
|
24
|
+
const constraints: Constraint[] = [];
|
|
25
|
+
|
|
26
|
+
for (const row of dependencyRows) {
|
|
27
|
+
// Filter out unknown stable IDs (basic validation)
|
|
28
|
+
if (
|
|
29
|
+
row.referenced_stable_id.startsWith("unknown:") ||
|
|
30
|
+
row.dependent_stable_id.startsWith("unknown:")
|
|
31
|
+
) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const producerIndexes = graphData.changeIndexesByCreatedId.get(
|
|
35
|
+
row.referenced_stable_id,
|
|
36
|
+
);
|
|
37
|
+
if (!producerIndexes || producerIndexes.size === 0) continue;
|
|
38
|
+
|
|
39
|
+
const consumerIndexes = findConsumerIndexes(
|
|
40
|
+
row.dependent_stable_id,
|
|
41
|
+
graphData.changeIndexesByCreatedId,
|
|
42
|
+
graphData.changeIndexesByExplicitRequirementId,
|
|
43
|
+
);
|
|
44
|
+
if (consumerIndexes.size === 0) continue;
|
|
45
|
+
|
|
46
|
+
for (const producerIndex of producerIndexes) {
|
|
47
|
+
for (const consumerIndex of consumerIndexes) {
|
|
48
|
+
if (producerIndex === consumerIndex) continue;
|
|
49
|
+
constraints.push({
|
|
50
|
+
sourceChangeIndex: producerIndex,
|
|
51
|
+
targetChangeIndex: consumerIndex,
|
|
52
|
+
source: "catalog",
|
|
53
|
+
reason: {
|
|
54
|
+
dependentStableId: row.dependent_stable_id,
|
|
55
|
+
referencedStableId: row.referenced_stable_id,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return constraints;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Convert explicit requirements to Constraints.
|
|
67
|
+
*
|
|
68
|
+
* For each change that explicitly requires something:
|
|
69
|
+
* - If the change creates stable IDs, creates Constraints from producers of required IDs to this change
|
|
70
|
+
* - If the change doesn't create anything but requires something, creates Constraints from producers to this change
|
|
71
|
+
*
|
|
72
|
+
* Cycle-breaking filters are applied later when detecting cycles.
|
|
73
|
+
*/
|
|
74
|
+
export function convertExplicitRequirementsToConstraints(
|
|
75
|
+
phaseChanges: Change[],
|
|
76
|
+
graphData: GraphData,
|
|
77
|
+
): Constraint[] {
|
|
78
|
+
const constraints: Constraint[] = [];
|
|
79
|
+
|
|
80
|
+
for (
|
|
81
|
+
let consumerIndex = 0;
|
|
82
|
+
consumerIndex < phaseChanges.length;
|
|
83
|
+
consumerIndex++
|
|
84
|
+
) {
|
|
85
|
+
const createdIds = graphData.createdStableIdSets[consumerIndex];
|
|
86
|
+
const requiredIds = graphData.explicitRequirementSets[consumerIndex];
|
|
87
|
+
|
|
88
|
+
if (requiredIds.size === 0) continue;
|
|
89
|
+
|
|
90
|
+
// Collect dropped IDs for this change so we can skip requirements
|
|
91
|
+
// for stableIds that this change also drops. A change that drops a
|
|
92
|
+
// stableId should not depend on another change that creates the same
|
|
93
|
+
// stableId, because the entity already exists in the source database.
|
|
94
|
+
// This prevents false ordering constraints such as Grant → Revoke
|
|
95
|
+
// when both operate on the same ACL stableId.
|
|
96
|
+
const droppedIds = new Set<string>(phaseChanges[consumerIndex].drops);
|
|
97
|
+
|
|
98
|
+
for (const requiredId of requiredIds) {
|
|
99
|
+
if (droppedIds.has(requiredId)) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const producerIndexes =
|
|
104
|
+
graphData.changeIndexesByCreatedId.get(requiredId);
|
|
105
|
+
if (!producerIndexes || producerIndexes.size === 0) continue;
|
|
106
|
+
|
|
107
|
+
if (createdIds.size > 0) {
|
|
108
|
+
for (const createdId of createdIds) {
|
|
109
|
+
for (const producerIndex of producerIndexes) {
|
|
110
|
+
if (producerIndex === consumerIndex) continue;
|
|
111
|
+
constraints.push({
|
|
112
|
+
sourceChangeIndex: producerIndex,
|
|
113
|
+
targetChangeIndex: consumerIndex,
|
|
114
|
+
source: "explicit",
|
|
115
|
+
reason: {
|
|
116
|
+
dependentStableId: createdId,
|
|
117
|
+
referencedStableId: requiredId,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
// Change doesn't create anything but requires something
|
|
124
|
+
for (const producerIndex of producerIndexes) {
|
|
125
|
+
if (producerIndex === consumerIndex) continue;
|
|
126
|
+
constraints.push({
|
|
127
|
+
sourceChangeIndex: producerIndex,
|
|
128
|
+
targetChangeIndex: consumerIndex,
|
|
129
|
+
source: "explicit",
|
|
130
|
+
reason: {
|
|
131
|
+
referencedStableId: requiredId,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return constraints;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Build graph data structures from phase changes.
|
|
144
|
+
*
|
|
145
|
+
* Creates change sets and reverse indexes needed for converting dependencies to Constraints.
|
|
146
|
+
* In DROP phase (invert=true), dropped IDs are included in createdStableIdSets.
|
|
147
|
+
*/
|
|
148
|
+
export function buildGraphData(
|
|
149
|
+
phaseChanges: Change[],
|
|
150
|
+
options: PhaseSortOptions,
|
|
151
|
+
): GraphData {
|
|
152
|
+
const createdStableIdSets: Array<Set<string>> = phaseChanges.map(
|
|
153
|
+
(changeItem) => {
|
|
154
|
+
const createdIds = new Set<string>(changeItem.creates);
|
|
155
|
+
if (options.invert) {
|
|
156
|
+
for (const droppedId of changeItem.drops ?? []) {
|
|
157
|
+
createdIds.add(droppedId);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return createdIds;
|
|
161
|
+
},
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
const explicitRequirementSets: Array<Set<string>> = phaseChanges.map(
|
|
165
|
+
(changeItem) => new Set<string>(changeItem.requires ?? []),
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
const changeIndexesByCreatedId = new Map<string, Set<number>>();
|
|
169
|
+
for (let changeIndex = 0; changeIndex < phaseChanges.length; changeIndex++) {
|
|
170
|
+
for (const createdId of createdStableIdSets[changeIndex]) {
|
|
171
|
+
let producerIndexes = changeIndexesByCreatedId.get(createdId);
|
|
172
|
+
if (!producerIndexes) {
|
|
173
|
+
producerIndexes = new Set<number>();
|
|
174
|
+
changeIndexesByCreatedId.set(createdId, producerIndexes);
|
|
175
|
+
}
|
|
176
|
+
producerIndexes.add(changeIndex);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const changeIndexesByExplicitRequirementId = new Map<string, Set<number>>();
|
|
181
|
+
for (
|
|
182
|
+
let changeIndex = 0;
|
|
183
|
+
changeIndex < explicitRequirementSets.length;
|
|
184
|
+
changeIndex++
|
|
185
|
+
) {
|
|
186
|
+
for (const requiredId of explicitRequirementSets[changeIndex]) {
|
|
187
|
+
let consumerIndexes =
|
|
188
|
+
changeIndexesByExplicitRequirementId.get(requiredId);
|
|
189
|
+
if (!consumerIndexes) {
|
|
190
|
+
consumerIndexes = new Set<number>();
|
|
191
|
+
changeIndexesByExplicitRequirementId.set(requiredId, consumerIndexes);
|
|
192
|
+
}
|
|
193
|
+
consumerIndexes.add(changeIndex);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
createdStableIdSets,
|
|
199
|
+
explicitRequirementSets,
|
|
200
|
+
changeIndexesByCreatedId,
|
|
201
|
+
changeIndexesByExplicitRequirementId,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Convert Constraints to edges.
|
|
207
|
+
*/
|
|
208
|
+
export function convertConstraintsToEdges(
|
|
209
|
+
constraints: Constraint[],
|
|
210
|
+
options: PhaseSortOptions,
|
|
211
|
+
): Edge[] {
|
|
212
|
+
const edges: Edge[] = [];
|
|
213
|
+
for (const constraint of constraints) {
|
|
214
|
+
if (constraint.sourceChangeIndex === constraint.targetChangeIndex) continue;
|
|
215
|
+
const sourceIndex = options.invert
|
|
216
|
+
? constraint.targetChangeIndex
|
|
217
|
+
: constraint.sourceChangeIndex;
|
|
218
|
+
const targetIndex = options.invert
|
|
219
|
+
? constraint.sourceChangeIndex
|
|
220
|
+
: constraint.targetChangeIndex;
|
|
221
|
+
edges.push({
|
|
222
|
+
sourceIndex,
|
|
223
|
+
targetIndex,
|
|
224
|
+
constraint,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return edges;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Convert edges to simple edge pairs for cycle detection and sorting.
|
|
232
|
+
*/
|
|
233
|
+
export function edgesToPairs(edges: Edge[]): Array<[number, number]> {
|
|
234
|
+
return edges.map((edge) => [edge.sourceIndex, edge.targetIndex]);
|
|
235
|
+
}
|