@supabase/pg-delta 1.0.0-alpha.10 → 1.0.0-alpha.12
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/dist/cli/commands/declarative-export.js +12 -17
- package/dist/cli/commands/plan.js +10 -13
- package/dist/cli/commands/sync.js +8 -12
- package/dist/cli/utils/integrations.d.ts +30 -6
- package/dist/cli/utils/integrations.js +98 -6
- 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/depend.js +25 -0
- package/dist/core/expand-replace-dependencies.js +23 -0
- package/dist/core/export/file-mapper.d.ts +2 -2
- package/dist/core/integrations/filter/dsl.d.ts +78 -74
- package/dist/core/integrations/filter/dsl.js +127 -79
- 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 +17 -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.js +42 -8
- 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 +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.drop.d.ts +2 -1
- package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
- 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/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/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 +8 -2
- 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/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/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.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/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/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/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/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/procedure/changes/procedure.alter.d.ts +8 -7
- package/dist/core/objects/procedure/changes/procedure.alter.js +7 -7
- 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/publication/changes/publication.alter.d.ts +9 -7
- package/dist/core/objects/publication/changes/publication.alter.js +12 -7
- 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 +1 -0
- 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 +3 -3
- 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 +1 -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/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/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/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/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 +4 -1
- package/dist/core/objects/sequence/sequence.diff.js +12 -0
- 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/table/changes/table.alter.d.ts +65 -22
- package/dist/core/objects/table/changes/table.alter.js +107 -22
- 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 +1 -1
- package/dist/core/objects/table/changes/table.drop.d.ts +4 -3
- package/dist/core/objects/table/changes/table.drop.js +7 -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.js +46 -1
- package/dist/core/objects/trigger/changes/trigger.alter.d.ts +2 -1
- package/dist/core/objects/trigger/changes/trigger.alter.js +1 -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 +1 -1
- 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/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/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/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 +1 -1
- 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/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.js +24 -13
- package/dist/core/postgres-config.d.ts +2 -2
- package/dist/core/sort/custom-constraints.js +65 -1
- package/dist/core/sort/logical-sort.js +3 -24
- package/package.json +5 -1
- package/src/cli/commands/declarative-export.ts +19 -27
- package/src/cli/commands/plan.ts +14 -20
- package/src/cli/commands/sync.ts +8 -15
- package/src/cli/utils/integrations.test.ts +210 -3
- package/src/cli/utils/integrations.ts +134 -6
- package/src/core/catalog.snapshot.test.ts +11 -2
- package/src/core/change-utils.test.ts +61 -0
- package/src/core/change-utils.ts +73 -0
- package/src/core/change.types.ts +50 -0
- package/src/core/depend.ts +25 -0
- package/src/core/expand-replace-dependencies.test.ts +126 -1
- package/src/core/expand-replace-dependencies.ts +50 -0
- package/src/core/export/file-mapper.ts +7 -2
- package/src/core/integrations/filter/dsl.test.ts +299 -60
- package/src/core/integrations/filter/dsl.ts +208 -169
- 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 +17 -1
- 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 +26 -7
- package/src/core/integrations/serialize/dsl.ts +8 -14
- package/src/core/integrations/serialize/serialize.types.ts +37 -0
- package/src/core/integrations/supabase.ts +42 -8
- package/src/core/objects/aggregate/changes/aggregate.alter.ts +2 -1
- package/src/core/objects/aggregate/changes/aggregate.comment.ts +3 -2
- package/src/core/objects/aggregate/changes/aggregate.create.ts +2 -1
- package/src/core/objects/aggregate/changes/aggregate.drop.ts +2 -1
- package/src/core/objects/aggregate/changes/aggregate.privilege.ts +4 -3
- package/src/core/objects/aggregate/changes/aggregate.types.ts +1 -0
- package/src/core/objects/base.change.ts +13 -1
- package/src/core/objects/base.model.test.ts +43 -0
- package/src/core/objects/base.model.ts +5 -2
- package/src/core/objects/collation/changes/collation.alter.ts +3 -2
- package/src/core/objects/collation/changes/collation.comment.ts +3 -2
- package/src/core/objects/collation/changes/collation.create.ts +2 -1
- package/src/core/objects/collation/changes/collation.drop.ts +2 -1
- package/src/core/objects/collation/changes/collation.types.ts +1 -0
- package/src/core/objects/domain/changes/domain.alter.ts +9 -8
- package/src/core/objects/domain/changes/domain.comment.ts +3 -2
- package/src/core/objects/domain/changes/domain.create.ts +19 -2
- package/src/core/objects/domain/changes/domain.drop.ts +2 -1
- package/src/core/objects/domain/changes/domain.privilege.ts +4 -3
- package/src/core/objects/domain/changes/domain.types.ts +1 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +3 -2
- package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +3 -2
- package/src/core/objects/event-trigger/changes/event-trigger.create.ts +2 -1
- package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +2 -1
- package/src/core/objects/event-trigger/changes/event-trigger.types.ts +1 -0
- package/src/core/objects/extension/changes/extension.alter.ts +3 -2
- package/src/core/objects/extension/changes/extension.comment.ts +3 -2
- package/src/core/objects/extension/changes/extension.create.test.ts +22 -0
- package/src/core/objects/extension/changes/extension.create.ts +5 -2
- package/src/core/objects/extension/changes/extension.drop.ts +2 -1
- package/src/core/objects/extension/changes/extension.types.ts +1 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +3 -2
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +3 -2
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +2 -1
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +2 -1
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +4 -3
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +1 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +1 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +10 -9
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +3 -2
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +2 -1
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +2 -1
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +4 -3
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +1 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +4 -3
- package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +3 -2
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +2 -1
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +2 -1
- package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +4 -3
- package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +1 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +2 -1
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +2 -1
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +2 -1
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +1 -0
- package/src/core/objects/index/changes/index.alter.ts +4 -3
- package/src/core/objects/index/changes/index.comment.ts +3 -2
- package/src/core/objects/index/changes/index.create.ts +2 -1
- package/src/core/objects/index/changes/index.drop.ts +2 -1
- package/src/core/objects/index/changes/index.types.ts +1 -0
- package/src/core/objects/language/changes/language.alter.ts +2 -1
- package/src/core/objects/language/changes/language.comment.ts +3 -2
- package/src/core/objects/language/changes/language.create.ts +2 -1
- package/src/core/objects/language/changes/language.drop.ts +2 -1
- package/src/core/objects/language/changes/language.privilege.ts +4 -3
- package/src/core/objects/language/changes/language.types.ts +1 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +3 -2
- package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +5 -4
- package/src/core/objects/materialized-view/changes/materialized-view.create.ts +2 -1
- package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +2 -1
- package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +4 -3
- package/src/core/objects/materialized-view/changes/materialized-view.types.ts +1 -0
- package/src/core/objects/procedure/changes/procedure.alter.ts +8 -7
- package/src/core/objects/procedure/changes/procedure.comment.ts +3 -2
- package/src/core/objects/procedure/changes/procedure.create.ts +2 -1
- package/src/core/objects/procedure/changes/procedure.drop.ts +2 -1
- package/src/core/objects/procedure/changes/procedure.privilege.ts +4 -3
- package/src/core/objects/procedure/changes/procedure.types.ts +1 -0
- package/src/core/objects/publication/changes/publication.alter.test.ts +4 -0
- package/src/core/objects/publication/changes/publication.alter.ts +14 -7
- package/src/core/objects/publication/changes/publication.comment.ts +3 -2
- package/src/core/objects/publication/changes/publication.create.ts +2 -1
- package/src/core/objects/publication/changes/publication.drop.ts +2 -1
- package/src/core/objects/publication/changes/publication.types.ts +1 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +4 -3
- package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +3 -2
- package/src/core/objects/rls-policy/changes/rls-policy.create.ts +2 -1
- package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +2 -1
- package/src/core/objects/rls-policy/changes/rls-policy.types.ts +1 -0
- package/src/core/objects/role/changes/role.alter.ts +3 -2
- package/src/core/objects/role/changes/role.comment.ts +3 -2
- package/src/core/objects/role/changes/role.create.ts +2 -1
- package/src/core/objects/role/changes/role.drop.ts +2 -1
- package/src/core/objects/role/changes/role.privilege.ts +6 -5
- package/src/core/objects/role/changes/role.types.ts +1 -0
- package/src/core/objects/rule/changes/rule.alter.ts +3 -2
- package/src/core/objects/rule/changes/rule.comment.ts +3 -2
- package/src/core/objects/rule/changes/rule.create.ts +2 -1
- package/src/core/objects/rule/changes/rule.drop.ts +2 -1
- package/src/core/objects/rule/changes/rule.types.ts +1 -0
- package/src/core/objects/schema/changes/schema.alter.ts +2 -1
- package/src/core/objects/schema/changes/schema.comment.ts +3 -2
- package/src/core/objects/schema/changes/schema.create.ts +3 -3
- package/src/core/objects/schema/changes/schema.drop.ts +2 -1
- package/src/core/objects/schema/changes/schema.privilege.ts +4 -3
- package/src/core/objects/schema/changes/schema.types.ts +1 -0
- package/src/core/objects/sequence/changes/sequence.alter.ts +3 -2
- package/src/core/objects/sequence/changes/sequence.comment.ts +3 -2
- package/src/core/objects/sequence/changes/sequence.create.ts +2 -1
- package/src/core/objects/sequence/changes/sequence.drop.ts +16 -3
- package/src/core/objects/sequence/changes/sequence.privilege.ts +4 -3
- package/src/core/objects/sequence/changes/sequence.types.ts +1 -0
- package/src/core/objects/sequence/sequence.diff.test.ts +73 -1
- package/src/core/objects/sequence/sequence.diff.ts +24 -2
- package/src/core/objects/subscription/changes/subscription.alter.ts +7 -6
- package/src/core/objects/subscription/changes/subscription.comment.ts +3 -2
- package/src/core/objects/subscription/changes/subscription.create.ts +2 -1
- package/src/core/objects/subscription/changes/subscription.drop.ts +2 -1
- package/src/core/objects/subscription/changes/subscription.types.ts +1 -0
- package/src/core/objects/table/changes/table.alter.test.ts +38 -0
- package/src/core/objects/table/changes/table.alter.ts +123 -22
- package/src/core/objects/table/changes/table.comment.ts +7 -6
- package/src/core/objects/table/changes/table.create.ts +2 -1
- package/src/core/objects/table/changes/table.drop.ts +20 -1
- package/src/core/objects/table/changes/table.privilege.ts +4 -3
- package/src/core/objects/table/changes/table.types.ts +1 -0
- package/src/core/objects/table/table.diff.test.ts +121 -0
- package/src/core/objects/table/table.diff.ts +64 -1
- package/src/core/objects/trigger/changes/trigger.alter.ts +2 -1
- package/src/core/objects/trigger/changes/trigger.comment.ts +3 -2
- package/src/core/objects/trigger/changes/trigger.create.ts +2 -1
- package/src/core/objects/trigger/changes/trigger.drop.ts +2 -1
- package/src/core/objects/trigger/changes/trigger.types.ts +1 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +5 -4
- package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +5 -4
- package/src/core/objects/type/composite-type/changes/composite-type.create.ts +2 -1
- package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +2 -1
- package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +4 -3
- package/src/core/objects/type/composite-type/changes/composite-type.types.ts +1 -0
- package/src/core/objects/type/enum/changes/enum.alter.ts +3 -2
- package/src/core/objects/type/enum/changes/enum.comment.ts +3 -2
- package/src/core/objects/type/enum/changes/enum.create.ts +2 -1
- package/src/core/objects/type/enum/changes/enum.drop.ts +2 -1
- package/src/core/objects/type/enum/changes/enum.privilege.ts +4 -3
- package/src/core/objects/type/enum/changes/enum.types.ts +1 -0
- package/src/core/objects/type/range/changes/range.alter.ts +2 -1
- package/src/core/objects/type/range/changes/range.comment.ts +3 -2
- package/src/core/objects/type/range/changes/range.create.ts +2 -1
- package/src/core/objects/type/range/changes/range.drop.ts +2 -1
- package/src/core/objects/type/range/changes/range.privilege.ts +4 -3
- package/src/core/objects/type/range/changes/range.types.ts +1 -0
- package/src/core/objects/type/type.types.ts +1 -0
- package/src/core/objects/view/changes/view.alter.ts +4 -3
- package/src/core/objects/view/changes/view.comment.ts +3 -2
- package/src/core/objects/view/changes/view.create.ts +2 -1
- package/src/core/objects/view/changes/view.drop.ts +2 -1
- package/src/core/objects/view/changes/view.privilege.ts +4 -3
- package/src/core/objects/view/changes/view.types.ts +1 -0
- package/src/core/objects/view/view.diff.test.ts +96 -0
- package/src/core/objects/view/view.diff.ts +30 -15
- package/src/core/plan/sql-format/format-off.test.ts +1 -1
- package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1 -1
- package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1 -1
- package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1 -1
- package/src/core/plan/sql-format/format-pretty-upper.test.ts +1 -1
- package/src/core/postgres-config.ts +2 -2
- package/src/core/sort/custom-constraints.ts +75 -1
- package/src/core/sort/logical-sort.ts +3 -27
- package/src/typedoc.ts +253 -0
- package/dist/core/integrations/filter/extractors.d.ts +0 -12
- package/dist/core/integrations/filter/extractors.js +0 -178
- package/src/core/integrations/filter/extractors.test.ts +0 -244
- package/src/core/integrations/filter/extractors.ts +0 -187
package/src/cli/commands/plan.ts
CHANGED
|
@@ -4,14 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
import { writeFile } from "node:fs/promises";
|
|
6
6
|
import { buildCommand, type CommandContext } from "@stricli/core";
|
|
7
|
+
import { deserializeCatalog } from "../../core/catalog.snapshot.ts";
|
|
7
8
|
import type { FilterDSL } from "../../core/integrations/filter/dsl.ts";
|
|
8
|
-
import type { ChangeFilter } from "../../core/integrations/filter/filter.types.ts";
|
|
9
9
|
import type { SerializeDSL } from "../../core/integrations/serialize/dsl.ts";
|
|
10
|
-
import type { ChangeSerializer } from "../../core/integrations/serialize/serialize.types.ts";
|
|
11
10
|
import { createPlan } from "../../core/plan/index.ts";
|
|
12
11
|
import type { SqlFormatOptions } from "../../core/plan/sql-format.ts";
|
|
13
12
|
import { setCommandExitCode } from "../exit-code.ts";
|
|
14
|
-
import {
|
|
13
|
+
import { resolveIntegrationOptions } from "../utils/integrations.ts";
|
|
15
14
|
import { isPostgresUrl, loadCatalogFromFile } from "../utils/resolve-input.ts";
|
|
16
15
|
import { formatPlanForDisplay } from "../utils.ts";
|
|
17
16
|
|
|
@@ -138,27 +137,22 @@ json/sql outputs are available for artifacts or piping.
|
|
|
138
137
|
"sql-format-options"?: SqlFormatOptions;
|
|
139
138
|
},
|
|
140
139
|
) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
serializeOption = serializeOption ?? integrationDSL.serialize;
|
|
151
|
-
integrationEmptyCatalog = integrationDSL.emptyCatalog;
|
|
152
|
-
}
|
|
140
|
+
const {
|
|
141
|
+
filter,
|
|
142
|
+
serialize,
|
|
143
|
+
emptyCatalog: integrationEmptyCatalog,
|
|
144
|
+
} = await resolveIntegrationOptions({
|
|
145
|
+
filter: flags.filter,
|
|
146
|
+
serialize: flags.serialize,
|
|
147
|
+
integration: flags.integration,
|
|
148
|
+
});
|
|
153
149
|
|
|
154
150
|
const resolvedSource = flags.source
|
|
155
151
|
? isPostgresUrl(flags.source)
|
|
156
152
|
? flags.source
|
|
157
153
|
: await loadCatalogFromFile(flags.source)
|
|
158
154
|
: integrationEmptyCatalog
|
|
159
|
-
? (
|
|
160
|
-
integrationEmptyCatalog,
|
|
161
|
-
)
|
|
155
|
+
? deserializeCatalog(integrationEmptyCatalog)
|
|
162
156
|
: null;
|
|
163
157
|
|
|
164
158
|
const resolvedTarget = isPostgresUrl(flags.target)
|
|
@@ -167,8 +161,8 @@ json/sql outputs are available for artifacts or piping.
|
|
|
167
161
|
|
|
168
162
|
const planResult = await createPlan(resolvedSource, resolvedTarget, {
|
|
169
163
|
role: flags.role,
|
|
170
|
-
filter
|
|
171
|
-
serialize
|
|
164
|
+
filter,
|
|
165
|
+
serialize,
|
|
172
166
|
});
|
|
173
167
|
if (!planResult) {
|
|
174
168
|
this.process.stdout.write("No changes detected.\n");
|
package/src/cli/commands/sync.ts
CHANGED
|
@@ -4,12 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
import { buildCommand, type CommandContext } from "@stricli/core";
|
|
6
6
|
import type { FilterDSL } from "../../core/integrations/filter/dsl.ts";
|
|
7
|
-
import type { ChangeFilter } from "../../core/integrations/filter/filter.types.ts";
|
|
8
7
|
import type { SerializeDSL } from "../../core/integrations/serialize/dsl.ts";
|
|
9
|
-
import type { ChangeSerializer } from "../../core/integrations/serialize/serialize.types.ts";
|
|
10
8
|
import { applyPlan } from "../../core/plan/apply.ts";
|
|
11
9
|
import { createPlan } from "../../core/plan/index.ts";
|
|
12
|
-
import {
|
|
10
|
+
import { resolveIntegrationOptions } from "../utils/integrations.ts";
|
|
13
11
|
import {
|
|
14
12
|
formatPlanForDisplay,
|
|
15
13
|
handleApplyResult,
|
|
@@ -120,22 +118,17 @@ Exit codes:
|
|
|
120
118
|
integration?: string;
|
|
121
119
|
},
|
|
122
120
|
) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
flags.
|
|
127
|
-
|
|
128
|
-
const integrationDSL = await loadIntegrationDSL(flags.integration);
|
|
129
|
-
// Use integration DSL if explicit flags not provided
|
|
130
|
-
filterOption = filterOption ?? integrationDSL.filter;
|
|
131
|
-
serializeOption = serializeOption ?? integrationDSL.serialize;
|
|
132
|
-
}
|
|
121
|
+
const { filter, serialize } = await resolveIntegrationOptions({
|
|
122
|
+
filter: flags.filter,
|
|
123
|
+
serialize: flags.serialize,
|
|
124
|
+
integration: flags.integration,
|
|
125
|
+
});
|
|
133
126
|
|
|
134
127
|
// 1. Create the plan
|
|
135
128
|
const planResult = await createPlan(flags.source, flags.target, {
|
|
136
129
|
role: flags.role,
|
|
137
|
-
filter
|
|
138
|
-
serialize
|
|
130
|
+
filter,
|
|
131
|
+
serialize,
|
|
139
132
|
});
|
|
140
133
|
if (!planResult) {
|
|
141
134
|
this.process.stdout.write("No changes detected.\n");
|
|
@@ -2,7 +2,12 @@ import { describe, expect, test } from "bun:test";
|
|
|
2
2
|
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
|
-
import {
|
|
5
|
+
import type { FilterDSL } from "../../core/integrations/filter/dsl.ts";
|
|
6
|
+
import type { SerializeDSL } from "../../core/integrations/serialize/dsl.ts";
|
|
7
|
+
import {
|
|
8
|
+
loadIntegrationDSL,
|
|
9
|
+
resolveIntegrationOptions,
|
|
10
|
+
} from "./integrations.ts";
|
|
6
11
|
|
|
7
12
|
describe("loadIntegrationDSL", () => {
|
|
8
13
|
test("loads from .json file path", async () => {
|
|
@@ -12,12 +17,12 @@ describe("loadIntegrationDSL", () => {
|
|
|
12
17
|
await writeFile(
|
|
13
18
|
jsonPath,
|
|
14
19
|
JSON.stringify({
|
|
15
|
-
filter: { schema: "app" },
|
|
20
|
+
filter: { "*/schema": "app" },
|
|
16
21
|
}),
|
|
17
22
|
);
|
|
18
23
|
const dsl = await loadIntegrationDSL(jsonPath);
|
|
19
24
|
expect(dsl).toBeDefined();
|
|
20
|
-
expect(dsl.filter).toEqual({ schema: "app" });
|
|
25
|
+
expect(dsl.filter).toEqual({ "*/schema": "app" });
|
|
21
26
|
} finally {
|
|
22
27
|
await rm(dir, { recursive: true, force: true });
|
|
23
28
|
}
|
|
@@ -42,3 +47,205 @@ describe("loadIntegrationDSL", () => {
|
|
|
42
47
|
}
|
|
43
48
|
});
|
|
44
49
|
});
|
|
50
|
+
|
|
51
|
+
describe("extends resolution", () => {
|
|
52
|
+
test('extends: "supabase" → resolves and merges successfully', async () => {
|
|
53
|
+
const dir = await mkdtemp(path.join(tmpdir(), "pgd-extends-"));
|
|
54
|
+
const jsonPath = path.join(dir, "custom.json");
|
|
55
|
+
try {
|
|
56
|
+
await writeFile(
|
|
57
|
+
jsonPath,
|
|
58
|
+
JSON.stringify({
|
|
59
|
+
extends: "supabase",
|
|
60
|
+
serialize: [
|
|
61
|
+
{
|
|
62
|
+
when: { objectType: "table" },
|
|
63
|
+
options: { skipAuthorization: true },
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
}),
|
|
67
|
+
);
|
|
68
|
+
const dsl = await loadIntegrationDSL(jsonPath);
|
|
69
|
+
expect(dsl).toBeDefined();
|
|
70
|
+
// Should have the supabase filter merged in
|
|
71
|
+
expect(dsl.filter).toBeDefined();
|
|
72
|
+
// Should have both supabase serialize rules and our custom one
|
|
73
|
+
expect(dsl.serialize).toBeDefined();
|
|
74
|
+
expect(dsl.serialize?.length).toBeGreaterThan(1);
|
|
75
|
+
} finally {
|
|
76
|
+
await rm(dir, { recursive: true, force: true });
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test('extends: "./some-file.json" → throws error about core integrations only', async () => {
|
|
81
|
+
const dir = await mkdtemp(path.join(tmpdir(), "pgd-extends-"));
|
|
82
|
+
const filePath = path.join(dir, "child.json");
|
|
83
|
+
const parentPath = path.join(dir, "parent.json");
|
|
84
|
+
try {
|
|
85
|
+
await writeFile(
|
|
86
|
+
parentPath,
|
|
87
|
+
JSON.stringify({ filter: { "*/schema": "app" } }),
|
|
88
|
+
);
|
|
89
|
+
await writeFile(
|
|
90
|
+
filePath,
|
|
91
|
+
JSON.stringify({
|
|
92
|
+
extends: parentPath,
|
|
93
|
+
filter: { "*/schema": "public" },
|
|
94
|
+
}),
|
|
95
|
+
);
|
|
96
|
+
expect(loadIntegrationDSL(filePath)).rejects.toThrow(
|
|
97
|
+
/extends only supports core integration names/,
|
|
98
|
+
);
|
|
99
|
+
} finally {
|
|
100
|
+
await rm(dir, { recursive: true, force: true });
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('extends: "nonexistent" → throws error about unknown core integration', async () => {
|
|
105
|
+
const dir = await mkdtemp(path.join(tmpdir(), "pgd-extends-"));
|
|
106
|
+
const jsonPath = path.join(dir, "custom.json");
|
|
107
|
+
try {
|
|
108
|
+
await writeFile(jsonPath, JSON.stringify({ extends: "nonexistent" }));
|
|
109
|
+
expect(loadIntegrationDSL(jsonPath)).rejects.toThrow(
|
|
110
|
+
/Unknown core integration: "nonexistent"/,
|
|
111
|
+
);
|
|
112
|
+
} finally {
|
|
113
|
+
await rm(dir, { recursive: true, force: true });
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
describe("resolveIntegrationOptions", () => {
|
|
119
|
+
test("no integration, no CLI flags → all undefined", async () => {
|
|
120
|
+
const result = await resolveIntegrationOptions({});
|
|
121
|
+
expect(result).toEqual({
|
|
122
|
+
filter: undefined,
|
|
123
|
+
serialize: undefined,
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test("CLI flags only → passed through unchanged", async () => {
|
|
128
|
+
const filter: FilterDSL = { "*/schema": "public" };
|
|
129
|
+
const serialize: SerializeDSL = [
|
|
130
|
+
{ when: { objectType: "schema" }, options: { skipAuthorization: true } },
|
|
131
|
+
];
|
|
132
|
+
const result = await resolveIntegrationOptions({ filter, serialize });
|
|
133
|
+
expect(result.filter).toEqual(filter);
|
|
134
|
+
expect(result.serialize).toEqual(serialize);
|
|
135
|
+
expect(result.emptyCatalog).toBeUndefined();
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test("integration only → integration values returned", async () => {
|
|
139
|
+
const dir = await mkdtemp(path.join(tmpdir(), "pgd-resolve-"));
|
|
140
|
+
const jsonPath = path.join(dir, "int.json");
|
|
141
|
+
try {
|
|
142
|
+
await writeFile(
|
|
143
|
+
jsonPath,
|
|
144
|
+
JSON.stringify({
|
|
145
|
+
filter: { "*/schema": "app" },
|
|
146
|
+
serialize: [{ when: { objectType: "table" }, options: {} }],
|
|
147
|
+
}),
|
|
148
|
+
);
|
|
149
|
+
const result = await resolveIntegrationOptions({
|
|
150
|
+
integration: jsonPath,
|
|
151
|
+
});
|
|
152
|
+
expect(result.filter).toEqual({ "*/schema": "app" });
|
|
153
|
+
expect(result.serialize).toEqual([
|
|
154
|
+
{ when: { objectType: "table" }, options: {} },
|
|
155
|
+
]);
|
|
156
|
+
} finally {
|
|
157
|
+
await rm(dir, { recursive: true, force: true });
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test("both filter + integration filter → AND-combined", async () => {
|
|
162
|
+
const dir = await mkdtemp(path.join(tmpdir(), "pgd-resolve-"));
|
|
163
|
+
const jsonPath = path.join(dir, "int.json");
|
|
164
|
+
try {
|
|
165
|
+
await writeFile(
|
|
166
|
+
jsonPath,
|
|
167
|
+
JSON.stringify({
|
|
168
|
+
filter: { "*/schema": "app" },
|
|
169
|
+
}),
|
|
170
|
+
);
|
|
171
|
+
const cliFilter: FilterDSL = { objectType: "table" };
|
|
172
|
+
const result = await resolveIntegrationOptions({
|
|
173
|
+
filter: cliFilter,
|
|
174
|
+
integration: jsonPath,
|
|
175
|
+
});
|
|
176
|
+
expect(result.filter).toEqual({
|
|
177
|
+
and: [{ "*/schema": "app" }, { objectType: "table" }],
|
|
178
|
+
});
|
|
179
|
+
} finally {
|
|
180
|
+
await rm(dir, { recursive: true, force: true });
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test("both serialize + integration serialize → concatenated (integration first)", async () => {
|
|
185
|
+
const dir = await mkdtemp(path.join(tmpdir(), "pgd-resolve-"));
|
|
186
|
+
const jsonPath = path.join(dir, "int.json");
|
|
187
|
+
try {
|
|
188
|
+
const intSerialize: SerializeDSL = [
|
|
189
|
+
{
|
|
190
|
+
when: { objectType: "schema" },
|
|
191
|
+
options: { skipAuthorization: true },
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
const cliSerialize: SerializeDSL = [
|
|
195
|
+
{ when: { objectType: "table" }, options: {} },
|
|
196
|
+
];
|
|
197
|
+
await writeFile(jsonPath, JSON.stringify({ serialize: intSerialize }));
|
|
198
|
+
const result = await resolveIntegrationOptions({
|
|
199
|
+
serialize: cliSerialize,
|
|
200
|
+
integration: jsonPath,
|
|
201
|
+
});
|
|
202
|
+
expect(result.serialize).toEqual([...intSerialize, ...cliSerialize]);
|
|
203
|
+
} finally {
|
|
204
|
+
await rm(dir, { recursive: true, force: true });
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
test("emptyCatalog returned from integration", async () => {
|
|
209
|
+
const dir = await mkdtemp(path.join(tmpdir(), "pgd-resolve-"));
|
|
210
|
+
const jsonPath = path.join(dir, "int.json");
|
|
211
|
+
try {
|
|
212
|
+
const emptyCatalog = {
|
|
213
|
+
version: 1,
|
|
214
|
+
currentUser: "postgres",
|
|
215
|
+
aggregates: {},
|
|
216
|
+
collations: {},
|
|
217
|
+
compositeTypes: {},
|
|
218
|
+
domains: {},
|
|
219
|
+
enums: {},
|
|
220
|
+
extensions: {},
|
|
221
|
+
procedures: {},
|
|
222
|
+
indexes: {},
|
|
223
|
+
materializedViews: {},
|
|
224
|
+
subscriptions: {},
|
|
225
|
+
publications: {},
|
|
226
|
+
rlsPolicies: {},
|
|
227
|
+
roles: {},
|
|
228
|
+
schemas: {},
|
|
229
|
+
sequences: {},
|
|
230
|
+
tables: {},
|
|
231
|
+
triggers: {},
|
|
232
|
+
eventTriggers: {},
|
|
233
|
+
rules: {},
|
|
234
|
+
ranges: {},
|
|
235
|
+
views: {},
|
|
236
|
+
foreignDataWrappers: {},
|
|
237
|
+
servers: {},
|
|
238
|
+
userMappings: {},
|
|
239
|
+
foreignTables: {},
|
|
240
|
+
depends: [],
|
|
241
|
+
};
|
|
242
|
+
await writeFile(jsonPath, JSON.stringify({ emptyCatalog }));
|
|
243
|
+
const result = await resolveIntegrationOptions({
|
|
244
|
+
integration: jsonPath,
|
|
245
|
+
});
|
|
246
|
+
expect(result.emptyCatalog).toEqual(emptyCatalog);
|
|
247
|
+
} finally {
|
|
248
|
+
await rm(dir, { recursive: true, force: true });
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
});
|
|
@@ -3,18 +3,19 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { readFile } from "node:fs/promises";
|
|
6
|
+
import type { CatalogSnapshot } from "../../core/catalog.snapshot.ts";
|
|
7
|
+
import type { FilterDSL } from "../../core/integrations/filter/dsl.ts";
|
|
6
8
|
import type { IntegrationDSL } from "../../core/integrations/integration-dsl.ts";
|
|
9
|
+
import { mergeIntegrations } from "../../core/integrations/merge.ts";
|
|
10
|
+
import type { SerializeDSL } from "../../core/integrations/serialize/dsl.ts";
|
|
7
11
|
|
|
8
12
|
/**
|
|
9
|
-
* Load
|
|
10
|
-
* If the path ends with .json, treats it as a JSON file path directly.
|
|
11
|
-
* Otherwise, tries to load from core integrations (TypeScript) first,
|
|
12
|
-
* then falls back to treating as a JSON file path.
|
|
13
|
+
* Load a raw integration DSL from a file or core integration (without resolving extends).
|
|
13
14
|
*
|
|
14
15
|
* @param nameOrPath - Integration name (e.g., "supabase") or file path (e.g., "./my-integration.json")
|
|
15
|
-
* @returns The loaded IntegrationDSL
|
|
16
|
+
* @returns The loaded IntegrationDSL (unresolved)
|
|
16
17
|
*/
|
|
17
|
-
|
|
18
|
+
async function loadRawIntegrationDSL(
|
|
18
19
|
nameOrPath: string,
|
|
19
20
|
): Promise<IntegrationDSL> {
|
|
20
21
|
// If path ends with .json, treat it as a JSON file path directly
|
|
@@ -40,3 +41,130 @@ export async function loadIntegrationDSL(
|
|
|
40
41
|
const content = await readFile(nameOrPath, "utf-8");
|
|
41
42
|
return JSON.parse(content) as IntegrationDSL;
|
|
42
43
|
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Load a core integration DSL by name only (no file path fallback).
|
|
47
|
+
*
|
|
48
|
+
* Used for resolving `extends` chains, which only support core integration names
|
|
49
|
+
* (e.g., "supabase"), not file paths.
|
|
50
|
+
*
|
|
51
|
+
* @param name - Core integration name (e.g., "supabase")
|
|
52
|
+
* @returns The loaded IntegrationDSL (unresolved)
|
|
53
|
+
*/
|
|
54
|
+
async function loadCoreIntegrationDSL(name: string): Promise<IntegrationDSL> {
|
|
55
|
+
try {
|
|
56
|
+
const module = await import(`../../core/integrations/${name}.ts`);
|
|
57
|
+
if (name in module) {
|
|
58
|
+
return module[name] as IntegrationDSL;
|
|
59
|
+
}
|
|
60
|
+
} catch {
|
|
61
|
+
// Module not found
|
|
62
|
+
}
|
|
63
|
+
throw new Error(
|
|
64
|
+
`Unknown core integration: "${name}". extends only supports core integration names (e.g., "supabase").`,
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Load an integration DSL, recursively resolving `extends` chains.
|
|
70
|
+
*
|
|
71
|
+
* When an integration has `extends`, the referenced integration(s) are loaded
|
|
72
|
+
* and merged: filters are AND-combined, serialize rules concatenated (base first),
|
|
73
|
+
* and emptyCatalog uses the most-specific value.
|
|
74
|
+
*
|
|
75
|
+
* Circular extends are detected and rejected with a descriptive error.
|
|
76
|
+
*
|
|
77
|
+
* @param nameOrPath - Integration name (e.g., "supabase") or file path
|
|
78
|
+
* @returns The fully resolved IntegrationDSL
|
|
79
|
+
*/
|
|
80
|
+
export async function loadIntegrationDSL(
|
|
81
|
+
nameOrPath: string,
|
|
82
|
+
): Promise<IntegrationDSL> {
|
|
83
|
+
return resolveIntegration(nameOrPath, new Set());
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function resolveIntegration(
|
|
87
|
+
nameOrPath: string,
|
|
88
|
+
visited: Set<string>,
|
|
89
|
+
preloadedRaw?: IntegrationDSL,
|
|
90
|
+
): Promise<IntegrationDSL> {
|
|
91
|
+
if (visited.has(nameOrPath)) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`Circular extends detected: ${[...visited, nameOrPath].join(" → ")}`,
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
visited.add(nameOrPath);
|
|
97
|
+
|
|
98
|
+
const raw = preloadedRaw ?? (await loadRawIntegrationDSL(nameOrPath));
|
|
99
|
+
|
|
100
|
+
if (!raw.extends) {
|
|
101
|
+
return raw;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Resolve base integrations (extends only supports core integration names)
|
|
105
|
+
const extendsArray = Array.isArray(raw.extends) ? raw.extends : [raw.extends];
|
|
106
|
+
|
|
107
|
+
const baseIntegrations: IntegrationDSL[] = [];
|
|
108
|
+
for (const baseName of extendsArray) {
|
|
109
|
+
const baseRaw = await loadCoreIntegrationDSL(baseName);
|
|
110
|
+
baseIntegrations.push(
|
|
111
|
+
await resolveIntegration(baseName, new Set(visited), baseRaw),
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Remove extends from the current integration before merging
|
|
116
|
+
const { extends: _, ...current } = raw;
|
|
117
|
+
|
|
118
|
+
// Merge: bases first (higher priority serialize), then current (most-specific)
|
|
119
|
+
return mergeIntegrations([...baseIntegrations, current]);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
interface ResolvedIntegrationOptions {
|
|
123
|
+
filter?: FilterDSL;
|
|
124
|
+
serialize?: SerializeDSL;
|
|
125
|
+
emptyCatalog?: CatalogSnapshot;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Load an integration (if provided) and merge its filter/serialize with CLI flags.
|
|
130
|
+
*
|
|
131
|
+
* - Filters are AND-combined (integration ∧ CLI flag)
|
|
132
|
+
* - Serialize rules are concatenated (integration first = higher priority)
|
|
133
|
+
* - emptyCatalog is extracted from the integration
|
|
134
|
+
*/
|
|
135
|
+
export async function resolveIntegrationOptions(options: {
|
|
136
|
+
filter?: FilterDSL;
|
|
137
|
+
serialize?: SerializeDSL;
|
|
138
|
+
integration?: string;
|
|
139
|
+
}): Promise<ResolvedIntegrationOptions> {
|
|
140
|
+
if (!options.integration) {
|
|
141
|
+
return {
|
|
142
|
+
filter: options.filter,
|
|
143
|
+
serialize: options.serialize,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const integrationDSL = await loadIntegrationDSL(options.integration);
|
|
148
|
+
|
|
149
|
+
// AND-combine integration filter with CLI --filter
|
|
150
|
+
let filter: FilterDSL | undefined;
|
|
151
|
+
if (integrationDSL.filter && options.filter) {
|
|
152
|
+
filter = { and: [integrationDSL.filter, options.filter] };
|
|
153
|
+
} else {
|
|
154
|
+
filter = options.filter ?? integrationDSL.filter;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Concatenate serialize rules (integration first = higher priority)
|
|
158
|
+
let serialize: SerializeDSL | undefined;
|
|
159
|
+
if (integrationDSL.serialize && options.serialize) {
|
|
160
|
+
serialize = [...integrationDSL.serialize, ...options.serialize];
|
|
161
|
+
} else {
|
|
162
|
+
serialize = options.serialize ?? integrationDSL.serialize;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
filter,
|
|
167
|
+
serialize,
|
|
168
|
+
emptyCatalog: integrationDSL.emptyCatalog,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
@@ -452,7 +452,11 @@ describe("catalog snapshot serde", () => {
|
|
|
452
452
|
|
|
453
453
|
// Filter out auth schema (no cascade): procedure is excluded but policy stays
|
|
454
454
|
const resultNoCascade = await createPlan(null, target, {
|
|
455
|
-
filter: {
|
|
455
|
+
filter: {
|
|
456
|
+
not: {
|
|
457
|
+
or: [{ "*/schema": ["auth"] }, { "schema/name": ["auth"] }],
|
|
458
|
+
},
|
|
459
|
+
},
|
|
456
460
|
});
|
|
457
461
|
expect(resultNoCascade).not.toBeNull();
|
|
458
462
|
if (resultNoCascade) {
|
|
@@ -464,7 +468,12 @@ describe("catalog snapshot serde", () => {
|
|
|
464
468
|
|
|
465
469
|
// Filter out auth schema with cascade: true: policy is also excluded (depends on auth.uid())
|
|
466
470
|
const resultCascade = await createPlan(null, target, {
|
|
467
|
-
filter: {
|
|
471
|
+
filter: {
|
|
472
|
+
not: {
|
|
473
|
+
or: [{ "*/schema": ["auth"] }, { "schema/name": ["auth"] }],
|
|
474
|
+
},
|
|
475
|
+
cascade: true,
|
|
476
|
+
},
|
|
468
477
|
});
|
|
469
478
|
expect(resultCascade).not.toBeNull();
|
|
470
479
|
if (resultCascade) {
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import type { Change } from "./change.types.ts";
|
|
3
|
+
import { getSchema } from "./change-utils.ts";
|
|
4
|
+
|
|
5
|
+
describe("getSchema", () => {
|
|
6
|
+
test("returns schema for table", () => {
|
|
7
|
+
const change = {
|
|
8
|
+
objectType: "table",
|
|
9
|
+
table: { schema: "public" },
|
|
10
|
+
} as unknown as Change;
|
|
11
|
+
expect(getSchema(change)).toBe("public");
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test("returns schema for view", () => {
|
|
15
|
+
const change = {
|
|
16
|
+
objectType: "view",
|
|
17
|
+
view: { schema: "app" },
|
|
18
|
+
} as unknown as Change;
|
|
19
|
+
expect(getSchema(change)).toBe("app");
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("returns schema for enum", () => {
|
|
23
|
+
const change = {
|
|
24
|
+
objectType: "enum",
|
|
25
|
+
enum: { schema: "types" },
|
|
26
|
+
} as unknown as Change;
|
|
27
|
+
expect(getSchema(change)).toBe("types");
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
test("returns schema.name for schema type", () => {
|
|
31
|
+
const change = {
|
|
32
|
+
objectType: "schema",
|
|
33
|
+
schema: { name: "auth" },
|
|
34
|
+
} as unknown as Change;
|
|
35
|
+
expect(getSchema(change)).toBe("auth");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("returns null for role", () => {
|
|
39
|
+
const change = {
|
|
40
|
+
objectType: "role",
|
|
41
|
+
role: { name: "admin" },
|
|
42
|
+
} as unknown as Change;
|
|
43
|
+
expect(getSchema(change)).toBeNull();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("returns null for publication", () => {
|
|
47
|
+
const change = {
|
|
48
|
+
objectType: "publication",
|
|
49
|
+
publication: { name: "pub1" },
|
|
50
|
+
} as unknown as Change;
|
|
51
|
+
expect(getSchema(change)).toBeNull();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("returns null for language", () => {
|
|
55
|
+
const change = {
|
|
56
|
+
objectType: "language",
|
|
57
|
+
language: { name: "plpgsql" },
|
|
58
|
+
} as unknown as Change;
|
|
59
|
+
expect(getSchema(change)).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { Change } from "./change.types.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Extract the schema name from a Change using the model sub-object.
|
|
5
|
+
*
|
|
6
|
+
* This is a convenience function used by the filter DSL (for schema
|
|
7
|
+
* normalization) and the sort module. It reads the `schema` (or `name`
|
|
8
|
+
* for schema objectType) from the model sub-object.
|
|
9
|
+
*/
|
|
10
|
+
export function getSchema(change: Change): string | null {
|
|
11
|
+
if (change.scope === "default_privilege") {
|
|
12
|
+
return change.inSchema;
|
|
13
|
+
}
|
|
14
|
+
switch (change.objectType) {
|
|
15
|
+
case "aggregate":
|
|
16
|
+
return change.aggregate.schema;
|
|
17
|
+
case "collation":
|
|
18
|
+
return change.collation.schema;
|
|
19
|
+
case "composite_type":
|
|
20
|
+
return change.compositeType.schema;
|
|
21
|
+
case "domain":
|
|
22
|
+
return change.domain.schema;
|
|
23
|
+
case "enum":
|
|
24
|
+
return change.enum.schema;
|
|
25
|
+
case "event_trigger":
|
|
26
|
+
return change.eventTrigger.function_schema;
|
|
27
|
+
case "extension":
|
|
28
|
+
return change.extension.schema;
|
|
29
|
+
case "index":
|
|
30
|
+
return change.index.schema;
|
|
31
|
+
case "language":
|
|
32
|
+
return null;
|
|
33
|
+
case "materialized_view":
|
|
34
|
+
return change.materializedView.schema;
|
|
35
|
+
case "procedure":
|
|
36
|
+
return change.procedure.schema;
|
|
37
|
+
case "publication":
|
|
38
|
+
return null;
|
|
39
|
+
case "range":
|
|
40
|
+
return change.range.schema;
|
|
41
|
+
case "rls_policy":
|
|
42
|
+
return change.policy.schema;
|
|
43
|
+
case "role":
|
|
44
|
+
return null;
|
|
45
|
+
case "rule":
|
|
46
|
+
return change.rule.schema;
|
|
47
|
+
case "schema":
|
|
48
|
+
return change.schema.name;
|
|
49
|
+
case "sequence":
|
|
50
|
+
return change.sequence.schema;
|
|
51
|
+
case "subscription":
|
|
52
|
+
return null;
|
|
53
|
+
case "table":
|
|
54
|
+
return change.table.schema;
|
|
55
|
+
case "trigger":
|
|
56
|
+
return change.trigger.schema;
|
|
57
|
+
case "view":
|
|
58
|
+
return change.view.schema;
|
|
59
|
+
case "foreign_data_wrapper":
|
|
60
|
+
return null;
|
|
61
|
+
case "server":
|
|
62
|
+
return null;
|
|
63
|
+
case "user_mapping":
|
|
64
|
+
return null;
|
|
65
|
+
case "foreign_table":
|
|
66
|
+
return change.foreignTable.schema;
|
|
67
|
+
default: {
|
|
68
|
+
// exhaustiveness check
|
|
69
|
+
const _exhaustive: never = change;
|
|
70
|
+
return _exhaustive;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|