@supabase/pg-delta 1.0.0-alpha.11 → 1.0.0-alpha.13
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/core/expand-replace-dependencies.js +23 -0
- package/dist/core/export/index.d.ts +2 -2
- package/dist/core/export/index.js +4 -1
- package/dist/core/integrations/integration.types.d.ts +26 -1
- package/dist/core/integrations/integration.types.js +31 -1
- package/dist/core/integrations/serialize/dsl.d.ts +1 -8
- package/dist/core/integrations/serialize/serialize.types.d.ts +31 -0
- package/dist/core/integrations/supabase.js +19 -0
- 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/base.change.d.ts +2 -1
- 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/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 +2 -1
- package/dist/core/objects/domain/changes/domain.create.js +1 -1
- 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/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/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/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-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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/plan/create.js +5 -17
- package/dist/core/plan/types.d.ts +3 -6
- package/dist/core/sort/custom-constraints.js +64 -0
- package/package.json +1 -1
- package/src/core/expand-replace-dependencies.test.ts +126 -1
- package/src/core/expand-replace-dependencies.ts +50 -0
- package/src/core/export/index.ts +13 -4
- package/src/core/integrations/integration.types.ts +59 -1
- package/src/core/integrations/serialize/dsl.test.ts +20 -1
- package/src/core/integrations/serialize/dsl.ts +1 -10
- package/src/core/integrations/serialize/serialize.types.ts +37 -0
- package/src/core/integrations/supabase.ts +19 -0
- 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/base.change.ts +3 -1
- 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/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 +2 -1
- 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/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/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/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-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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/plan/create.ts +11 -27
- 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/plan/types.ts +3 -6
- package/src/core/sort/custom-constraints.ts +74 -0
- package/src/typedoc.ts +5 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { getSchema } from "../change-utils.js";
|
|
2
2
|
import { GrantRoleDefaultPrivileges, RevokeRoleDefaultPrivileges, } from "../objects/role/changes/role.privilege.js";
|
|
3
|
+
import { AlterTableAlterColumnAddIdentity, AlterTableAlterColumnDropDefault, AlterTableAlterColumnDropIdentity, AlterTableAlterColumnSetDefault, } from "../objects/table/changes/table.alter.js";
|
|
3
4
|
/**
|
|
4
5
|
* Maps object type names to PostgreSQL default privilege objtype codes.
|
|
5
6
|
* This mirrors the mapping in base.default-privileges.ts.
|
|
@@ -116,11 +117,74 @@ function generateDefaultPrivilegeConstraints(changes) {
|
|
|
116
117
|
}
|
|
117
118
|
return constraints;
|
|
118
119
|
}
|
|
120
|
+
function generateIdentityTransitionConstraints(changes) {
|
|
121
|
+
const constraints = [];
|
|
122
|
+
const dropDefaultByColumn = new Map();
|
|
123
|
+
const dropIdentityByColumn = new Map();
|
|
124
|
+
const addIdentityByColumn = new Map();
|
|
125
|
+
const setDefaultByColumn = new Map();
|
|
126
|
+
for (let i = 0; i < changes.length; i++) {
|
|
127
|
+
const change = changes[i];
|
|
128
|
+
const columnKey = "table" in change && "column" in change
|
|
129
|
+
? `${change.table.schema}.${change.table.name}.${change.column.name}`
|
|
130
|
+
: null;
|
|
131
|
+
if (!columnKey)
|
|
132
|
+
continue;
|
|
133
|
+
if (change instanceof AlterTableAlterColumnDropDefault) {
|
|
134
|
+
const entries = dropDefaultByColumn.get(columnKey) ?? [];
|
|
135
|
+
entries.push(i);
|
|
136
|
+
dropDefaultByColumn.set(columnKey, entries);
|
|
137
|
+
}
|
|
138
|
+
else if (change instanceof AlterTableAlterColumnAddIdentity) {
|
|
139
|
+
const entries = addIdentityByColumn.get(columnKey) ?? [];
|
|
140
|
+
entries.push(i);
|
|
141
|
+
addIdentityByColumn.set(columnKey, entries);
|
|
142
|
+
}
|
|
143
|
+
else if (change instanceof AlterTableAlterColumnDropIdentity) {
|
|
144
|
+
const entries = dropIdentityByColumn.get(columnKey) ?? [];
|
|
145
|
+
entries.push(i);
|
|
146
|
+
dropIdentityByColumn.set(columnKey, entries);
|
|
147
|
+
}
|
|
148
|
+
else if (change instanceof AlterTableAlterColumnSetDefault) {
|
|
149
|
+
const entries = setDefaultByColumn.get(columnKey) ?? [];
|
|
150
|
+
entries.push(i);
|
|
151
|
+
setDefaultByColumn.set(columnKey, entries);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// These rules only order same-column ALTERs inside the create/alter phase.
|
|
155
|
+
// Sequence drops are handled separately in the earlier drop phase.
|
|
156
|
+
for (const [columnKey, dropDefaultIndexes] of dropDefaultByColumn) {
|
|
157
|
+
const addIdentityIndexes = addIdentityByColumn.get(columnKey) ?? [];
|
|
158
|
+
for (const sourceIndex of dropDefaultIndexes) {
|
|
159
|
+
for (const targetIndex of addIdentityIndexes) {
|
|
160
|
+
constraints.push({
|
|
161
|
+
sourceChangeIndex: sourceIndex,
|
|
162
|
+
targetChangeIndex: targetIndex,
|
|
163
|
+
source: "custom",
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
for (const [columnKey, dropIdentityIndexes] of dropIdentityByColumn) {
|
|
169
|
+
const setDefaultIndexes = setDefaultByColumn.get(columnKey) ?? [];
|
|
170
|
+
for (const sourceIndex of dropIdentityIndexes) {
|
|
171
|
+
for (const targetIndex of setDefaultIndexes) {
|
|
172
|
+
constraints.push({
|
|
173
|
+
sourceChangeIndex: sourceIndex,
|
|
174
|
+
targetChangeIndex: targetIndex,
|
|
175
|
+
source: "custom",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return constraints;
|
|
181
|
+
}
|
|
119
182
|
/**
|
|
120
183
|
* All custom constraint generators.
|
|
121
184
|
*/
|
|
122
185
|
const customConstraintGenerators = [
|
|
123
186
|
generateDefaultPrivilegeConstraints,
|
|
187
|
+
generateIdentityTransitionConstraints,
|
|
124
188
|
];
|
|
125
189
|
/**
|
|
126
190
|
* Generate Constraints from custom constraint generators.
|
package/package.json
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { createEmptyCatalog } from "./catalog.model.ts";
|
|
2
|
+
import { Catalog, createEmptyCatalog } from "./catalog.model.ts";
|
|
3
3
|
import type { Change } from "./change.types.ts";
|
|
4
4
|
import { expandReplaceDependencies } from "./expand-replace-dependencies.ts";
|
|
5
|
+
import { DefaultPrivilegeState } from "./objects/base.default-privileges.ts";
|
|
6
|
+
import { CreateSequence } from "./objects/sequence/changes/sequence.create.ts";
|
|
7
|
+
import { DropSequence } from "./objects/sequence/changes/sequence.drop.ts";
|
|
8
|
+
import { diffSequences } from "./objects/sequence/sequence.diff.ts";
|
|
9
|
+
import { Sequence } from "./objects/sequence/sequence.model.ts";
|
|
10
|
+
import { AlterTableAlterColumnSetDefault } from "./objects/table/changes/table.alter.ts";
|
|
11
|
+
import { CreateTable } from "./objects/table/changes/table.create.ts";
|
|
12
|
+
import { DropTable } from "./objects/table/changes/table.drop.ts";
|
|
13
|
+
import { Table } from "./objects/table/table.model.ts";
|
|
5
14
|
|
|
6
15
|
function mockChange(overrides: {
|
|
7
16
|
creates?: string[];
|
|
@@ -67,4 +76,120 @@ describe("expandReplaceDependencies", () => {
|
|
|
67
76
|
});
|
|
68
77
|
expect(result).toBe(changes);
|
|
69
78
|
});
|
|
79
|
+
|
|
80
|
+
test("does not replace the owning table for an owned sequence recreation", async () => {
|
|
81
|
+
const baseline = await createEmptyCatalog(170000, "postgres");
|
|
82
|
+
const mainSequence = new Sequence({
|
|
83
|
+
schema: "public",
|
|
84
|
+
name: "user_id_seq",
|
|
85
|
+
data_type: "integer",
|
|
86
|
+
start_value: 1,
|
|
87
|
+
minimum_value: 1n,
|
|
88
|
+
maximum_value: 2147483647n,
|
|
89
|
+
increment: 1,
|
|
90
|
+
cycle_option: false,
|
|
91
|
+
cache_size: 1,
|
|
92
|
+
persistence: "p",
|
|
93
|
+
owned_by_schema: "public",
|
|
94
|
+
owned_by_table: "users",
|
|
95
|
+
owned_by_column: "id",
|
|
96
|
+
comment: null,
|
|
97
|
+
privileges: [],
|
|
98
|
+
owner: "postgres",
|
|
99
|
+
});
|
|
100
|
+
const branchSequence = new Sequence({
|
|
101
|
+
...mainSequence,
|
|
102
|
+
data_type: "bigint",
|
|
103
|
+
maximum_value: 9223372036854775807n,
|
|
104
|
+
});
|
|
105
|
+
const usersTable = new Table({
|
|
106
|
+
schema: "public",
|
|
107
|
+
name: "users",
|
|
108
|
+
persistence: "p",
|
|
109
|
+
row_security: false,
|
|
110
|
+
force_row_security: false,
|
|
111
|
+
has_indexes: false,
|
|
112
|
+
has_rules: false,
|
|
113
|
+
has_triggers: false,
|
|
114
|
+
has_subclasses: false,
|
|
115
|
+
is_populated: true,
|
|
116
|
+
replica_identity: "d",
|
|
117
|
+
is_partition: false,
|
|
118
|
+
options: null,
|
|
119
|
+
partition_bound: null,
|
|
120
|
+
partition_by: null,
|
|
121
|
+
owner: "postgres",
|
|
122
|
+
comment: null,
|
|
123
|
+
parent_schema: null,
|
|
124
|
+
parent_name: null,
|
|
125
|
+
columns: [
|
|
126
|
+
{
|
|
127
|
+
name: "id",
|
|
128
|
+
position: 1,
|
|
129
|
+
data_type: "bigint",
|
|
130
|
+
data_type_str: "bigint",
|
|
131
|
+
is_custom_type: false,
|
|
132
|
+
custom_type_type: null,
|
|
133
|
+
custom_type_category: null,
|
|
134
|
+
custom_type_schema: null,
|
|
135
|
+
custom_type_name: null,
|
|
136
|
+
not_null: true,
|
|
137
|
+
is_identity: false,
|
|
138
|
+
is_identity_always: false,
|
|
139
|
+
is_generated: false,
|
|
140
|
+
collation: null,
|
|
141
|
+
default: "nextval('public.user_id_seq'::regclass)",
|
|
142
|
+
comment: null,
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
privileges: [],
|
|
146
|
+
});
|
|
147
|
+
const changes = diffSequences(
|
|
148
|
+
{
|
|
149
|
+
version: 170000,
|
|
150
|
+
currentUser: "postgres",
|
|
151
|
+
defaultPrivilegeState: new DefaultPrivilegeState({}),
|
|
152
|
+
},
|
|
153
|
+
{ [mainSequence.stableId]: mainSequence },
|
|
154
|
+
{ [branchSequence.stableId]: branchSequence },
|
|
155
|
+
{ [usersTable.stableId]: usersTable },
|
|
156
|
+
);
|
|
157
|
+
const mainCatalog = new Catalog({
|
|
158
|
+
...baseline,
|
|
159
|
+
sequences: { [mainSequence.stableId]: mainSequence },
|
|
160
|
+
tables: { [usersTable.stableId]: usersTable },
|
|
161
|
+
depends: [
|
|
162
|
+
{
|
|
163
|
+
dependent_stable_id: mainSequence.stableId,
|
|
164
|
+
referenced_stable_id: "column:public.users.id",
|
|
165
|
+
deptype: "a",
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
dependent_stable_id: "column:public.users.id",
|
|
169
|
+
referenced_stable_id: mainSequence.stableId,
|
|
170
|
+
deptype: "n",
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
});
|
|
174
|
+
const branchCatalog = new Catalog({
|
|
175
|
+
...baseline,
|
|
176
|
+
sequences: { [branchSequence.stableId]: branchSequence },
|
|
177
|
+
tables: { [usersTable.stableId]: usersTable },
|
|
178
|
+
depends: [],
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
const expanded = expandReplaceDependencies({
|
|
182
|
+
changes,
|
|
183
|
+
mainCatalog,
|
|
184
|
+
branchCatalog,
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
expect(changes[0]).toBeInstanceOf(DropSequence);
|
|
188
|
+
expect(changes[1]).toBeInstanceOf(CreateSequence);
|
|
189
|
+
expect(changes[3]).toBeInstanceOf(AlterTableAlterColumnSetDefault);
|
|
190
|
+
expect(expanded.some((change) => change instanceof DropTable)).toBe(false);
|
|
191
|
+
expect(expanded.some((change) => change instanceof CreateTable)).toBe(
|
|
192
|
+
false,
|
|
193
|
+
);
|
|
194
|
+
});
|
|
70
195
|
});
|
|
@@ -19,6 +19,7 @@ import { CreateEnum } from "./objects/type/enum/changes/enum.create.ts";
|
|
|
19
19
|
import { DropEnum } from "./objects/type/enum/changes/enum.drop.ts";
|
|
20
20
|
import { CreateRange } from "./objects/type/range/changes/range.create.ts";
|
|
21
21
|
import { DropRange } from "./objects/type/range/changes/range.drop.ts";
|
|
22
|
+
import { stableId } from "./objects/utils.ts";
|
|
22
23
|
import { CreateView } from "./objects/view/changes/view.create.ts";
|
|
23
24
|
import { DropView } from "./objects/view/changes/view.drop.ts";
|
|
24
25
|
|
|
@@ -121,6 +122,17 @@ export function expandReplaceDependencies({
|
|
|
121
122
|
if (!dependents) continue;
|
|
122
123
|
|
|
123
124
|
for (const dependentRaw of dependents) {
|
|
125
|
+
if (
|
|
126
|
+
isOwnedSequenceColumnDependency(
|
|
127
|
+
refId,
|
|
128
|
+
dependentRaw,
|
|
129
|
+
mainCatalog,
|
|
130
|
+
branchCatalog,
|
|
131
|
+
)
|
|
132
|
+
) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
|
|
124
136
|
// Continue traversing the dependency graph from the raw dependent id.
|
|
125
137
|
if (!visitedRefs.has(dependentRaw)) {
|
|
126
138
|
visitedRefs.add(dependentRaw);
|
|
@@ -181,6 +193,44 @@ export function expandReplaceDependencies({
|
|
|
181
193
|
return [...changes, ...additions];
|
|
182
194
|
}
|
|
183
195
|
|
|
196
|
+
function isOwnedSequenceColumnDependency(
|
|
197
|
+
referencedId: string,
|
|
198
|
+
dependentId: string,
|
|
199
|
+
mainCatalog: Catalog,
|
|
200
|
+
branchCatalog: Catalog,
|
|
201
|
+
): boolean {
|
|
202
|
+
// When a sequence replace root is still OWNED BY the same column, the
|
|
203
|
+
// sequence->column pg_depend edge is bookkeeping for ownership, not a signal
|
|
204
|
+
// that the whole owning table needs to be replaced. Skipping that edge keeps
|
|
205
|
+
// expandReplaceDependencies focused on recreating the sequence itself.
|
|
206
|
+
if (
|
|
207
|
+
!referencedId.startsWith("sequence:") ||
|
|
208
|
+
!dependentId.startsWith("column:")
|
|
209
|
+
) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const sequence =
|
|
214
|
+
branchCatalog.sequences[referencedId] ??
|
|
215
|
+
mainCatalog.sequences[referencedId];
|
|
216
|
+
if (
|
|
217
|
+
!sequence?.owned_by_schema ||
|
|
218
|
+
!sequence.owned_by_table ||
|
|
219
|
+
!sequence.owned_by_column
|
|
220
|
+
) {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return (
|
|
225
|
+
dependentId ===
|
|
226
|
+
stableId.column(
|
|
227
|
+
sequence.owned_by_schema,
|
|
228
|
+
sequence.owned_by_table,
|
|
229
|
+
sequence.owned_by_column,
|
|
230
|
+
)
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
|
|
184
234
|
function normalizeDependentId(dependentId: string): string | null {
|
|
185
235
|
let id = dependentId;
|
|
186
236
|
|
package/src/core/export/index.ts
CHANGED
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
import type { Change } from "../change.types.ts";
|
|
6
6
|
import { buildPlanScopeFingerprint, hashStableIds } from "../fingerprint.ts";
|
|
7
|
-
import
|
|
7
|
+
import {
|
|
8
|
+
type Integration,
|
|
9
|
+
type ResolvedIntegration,
|
|
10
|
+
resolveIntegration,
|
|
11
|
+
} from "../integrations/integration.types.ts";
|
|
8
12
|
import type { createPlan } from "../plan/create.ts";
|
|
9
13
|
import { DEFAULT_OPTIONS } from "../plan/sql-format/constants.ts";
|
|
10
14
|
import type { SqlFormatOptions } from "../plan/sql-format/types.ts";
|
|
@@ -29,7 +33,7 @@ type PlanResult = NonNullable<Awaited<ReturnType<typeof createPlan>>>;
|
|
|
29
33
|
|
|
30
34
|
export interface ExportOptions {
|
|
31
35
|
/** Integration for custom serialization */
|
|
32
|
-
integration?: Integration
|
|
36
|
+
integration?: Pick<Integration, "serialize">;
|
|
33
37
|
/**
|
|
34
38
|
* SQL formatter options to control the output style.
|
|
35
39
|
* Merged on top of the default export options (maxWidth: 180, keywordCase: "upper").
|
|
@@ -64,7 +68,9 @@ export function exportDeclarativeSchema(
|
|
|
64
68
|
options?: ExportOptions,
|
|
65
69
|
): DeclarativeSchemaOutput {
|
|
66
70
|
const { ctx, sortedChanges } = planResult;
|
|
67
|
-
const integration = options?.integration
|
|
71
|
+
const integration = options?.integration
|
|
72
|
+
? resolveIntegration(options?.integration)
|
|
73
|
+
: {};
|
|
68
74
|
const formatOptions: SqlFormatOptions | undefined =
|
|
69
75
|
options?.formatOptions === null
|
|
70
76
|
? undefined
|
|
@@ -108,7 +114,10 @@ export function exportDeclarativeSchema(
|
|
|
108
114
|
};
|
|
109
115
|
}
|
|
110
116
|
|
|
111
|
-
function serializeChange(
|
|
117
|
+
function serializeChange(
|
|
118
|
+
change: Change,
|
|
119
|
+
integration?: ResolvedIntegration,
|
|
120
|
+
): string {
|
|
112
121
|
return integration?.serialize?.(change) ?? change.serialize();
|
|
113
122
|
}
|
|
114
123
|
|
|
@@ -1,7 +1,65 @@
|
|
|
1
|
+
import { compileFilterDSL, type FilterDSL } from "./filter/dsl.ts";
|
|
1
2
|
import type { ChangeFilter } from "./filter/filter.types.ts";
|
|
3
|
+
import { compileSerializeDSL, type SerializeDSL } from "./serialize/dsl.ts";
|
|
2
4
|
import type { ChangeSerializer } from "./serialize/serialize.types.ts";
|
|
3
5
|
|
|
4
|
-
|
|
6
|
+
/**
|
|
7
|
+
* A resolved integration is an integration that has been compiled to a function.
|
|
8
|
+
*/
|
|
9
|
+
export type ResolvedIntegration = {
|
|
5
10
|
filter?: ChangeFilter;
|
|
6
11
|
serialize?: ChangeSerializer;
|
|
7
12
|
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A raw integration is an integration that has not been compiled to a function.
|
|
16
|
+
*/
|
|
17
|
+
export type IntegrationDSL = {
|
|
18
|
+
filter?: FilterDSL;
|
|
19
|
+
serialize?: SerializeDSL;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* An integration is a raw integration that has not been compiled to a function.
|
|
24
|
+
*/
|
|
25
|
+
export type Integration = {
|
|
26
|
+
filter?: ResolvedIntegration["filter"] | IntegrationDSL["filter"];
|
|
27
|
+
serialize?: ResolvedIntegration["serialize"] | IntegrationDSL["serialize"];
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Resolve an integration either DSL or already resovled into a ResolvedIntegration.
|
|
32
|
+
* @param integration - The integration to resolve.
|
|
33
|
+
* @returns The resolved integration.
|
|
34
|
+
*/
|
|
35
|
+
export function resolveIntegration(
|
|
36
|
+
integration: Integration,
|
|
37
|
+
): ResolvedIntegration | undefined {
|
|
38
|
+
// Determine if filter/serialize are DSL or functions, and extract DSL for storage
|
|
39
|
+
const isFilterDSL =
|
|
40
|
+
integration.filter && typeof integration.filter !== "function";
|
|
41
|
+
const isSerializeDSL =
|
|
42
|
+
integration.serialize && typeof integration.serialize !== "function";
|
|
43
|
+
const filterDSL = isFilterDSL ? (integration.filter as FilterDSL) : undefined;
|
|
44
|
+
const serializeDSL = isSerializeDSL
|
|
45
|
+
? (integration.serialize as SerializeDSL)
|
|
46
|
+
: undefined;
|
|
47
|
+
|
|
48
|
+
// Build final integration: compile DSL if needed, use functions directly otherwise
|
|
49
|
+
if (integration.filter || integration.serialize) {
|
|
50
|
+
return {
|
|
51
|
+
filter:
|
|
52
|
+
typeof integration.filter === "function"
|
|
53
|
+
? integration.filter
|
|
54
|
+
: filterDSL
|
|
55
|
+
? compileFilterDSL(filterDSL)
|
|
56
|
+
: undefined,
|
|
57
|
+
serialize:
|
|
58
|
+
typeof integration.serialize === "function"
|
|
59
|
+
? integration.serialize
|
|
60
|
+
: serializeDSL
|
|
61
|
+
? compileSerializeDSL(serializeDSL)
|
|
62
|
+
: undefined,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -1,22 +1,41 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
import type { Change } from "../../change.types.ts";
|
|
3
3
|
import { compileSerializeDSL } from "./dsl.ts";
|
|
4
|
+
import type { SerializeOptions } from "./serialize.types.ts";
|
|
4
5
|
|
|
5
6
|
function makeChange(
|
|
6
7
|
type: string,
|
|
7
8
|
operation: string,
|
|
8
|
-
serializeFn: (opts?:
|
|
9
|
+
serializeFn: (opts?: SerializeOptions) => string,
|
|
9
10
|
): Change {
|
|
10
11
|
return {
|
|
11
12
|
objectType: type,
|
|
12
13
|
operation,
|
|
13
14
|
scope: "object",
|
|
14
15
|
schema: { name: "test" },
|
|
16
|
+
extension: { schema: "pgmq" },
|
|
15
17
|
serialize: serializeFn,
|
|
16
18
|
} as unknown as Change;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
describe("compileSerializeDSL", () => {
|
|
22
|
+
test("matching extension rule can skip schema serialization", () => {
|
|
23
|
+
const serializer = compileSerializeDSL([
|
|
24
|
+
{
|
|
25
|
+
when: { objectType: "extension", operation: "create" },
|
|
26
|
+
options: { skipSchema: true },
|
|
27
|
+
},
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
const change = makeChange("extension", "create", (opts) =>
|
|
31
|
+
opts?.skipSchema
|
|
32
|
+
? "CREATE EXTENSION pgmq"
|
|
33
|
+
: "CREATE EXTENSION pgmq WITH SCHEMA pgmq",
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
expect(serializer(change)).toBe("CREATE EXTENSION pgmq");
|
|
37
|
+
});
|
|
38
|
+
|
|
20
39
|
test("matching rule applies its options", () => {
|
|
21
40
|
const serializer = compileSerializeDSL([
|
|
22
41
|
{
|
|
@@ -6,16 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import type { Change } from "../../change.types.ts";
|
|
8
8
|
import { evaluatePattern, type FilterPattern } from "../filter/dsl.ts";
|
|
9
|
-
import type { ChangeSerializer } from "./serialize.types.ts";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Serialization options that can be passed to change.serialize().
|
|
13
|
-
*/
|
|
14
|
-
type SerializeOptions = {
|
|
15
|
-
skipAuthorization?: boolean;
|
|
16
|
-
// Can be extended with more options in the future
|
|
17
|
-
[key: string]: unknown;
|
|
18
|
-
};
|
|
9
|
+
import type { ChangeSerializer, SerializeOptions } from "./serialize.types.ts";
|
|
19
10
|
|
|
20
11
|
/**
|
|
21
12
|
* A serialization rule that applies options when a pattern matches.
|
|
@@ -1,3 +1,40 @@
|
|
|
1
1
|
import type { Change } from "../../change.types.ts";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Shared serialization options passed to `change.serialize(options)`.
|
|
5
|
+
*
|
|
6
|
+
* This is the global source of truth for serialize-option flags used by the
|
|
7
|
+
* integration serialization DSL and concrete change serializers.
|
|
8
|
+
*
|
|
9
|
+
* @category Integration
|
|
10
|
+
*/
|
|
11
|
+
export type SerializeOptions = {
|
|
12
|
+
/** Skip `AUTHORIZATION` when serializing schema creation. */
|
|
13
|
+
skipAuthorization?: boolean;
|
|
14
|
+
/** Skip `WITH SCHEMA ...` when serializing extension creation. */
|
|
15
|
+
skipSchema?: boolean;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Schema-specific view of {@link SerializeOptions}.
|
|
20
|
+
*
|
|
21
|
+
* @category Integration
|
|
22
|
+
*/
|
|
23
|
+
export type SchemaSerializeOptions = Pick<
|
|
24
|
+
SerializeOptions,
|
|
25
|
+
"skipAuthorization"
|
|
26
|
+
>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Extension-specific view of {@link SerializeOptions}.
|
|
30
|
+
*
|
|
31
|
+
* @category Integration
|
|
32
|
+
*/
|
|
33
|
+
export type ExtensionSerializeOptions = Pick<SerializeOptions, "skipSchema">;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Compiled serializer function used during plan/declarative export rendering.
|
|
37
|
+
*
|
|
38
|
+
* @category Integration
|
|
39
|
+
*/
|
|
3
40
|
export type ChangeSerializer = (change: Change) => string | undefined;
|
|
@@ -92,6 +92,12 @@ export const supabase: IntegrationDSL = {
|
|
|
92
92
|
operation: "create",
|
|
93
93
|
scope: "object",
|
|
94
94
|
},
|
|
95
|
+
// Include extension DROPs used to disable some extensions (eg: pg-net)
|
|
96
|
+
{
|
|
97
|
+
objectType: "extension",
|
|
98
|
+
operation: "drop",
|
|
99
|
+
scope: "object",
|
|
100
|
+
},
|
|
95
101
|
// Exclude system objects
|
|
96
102
|
{
|
|
97
103
|
not: {
|
|
@@ -141,5 +147,18 @@ export const supabase: IntegrationDSL = {
|
|
|
141
147
|
skipAuthorization: true,
|
|
142
148
|
},
|
|
143
149
|
},
|
|
150
|
+
// pgmq extensions creates it's own schema on install doing a `CREATE EXTENSION pgmq WITH SCHEMA pgmq;`
|
|
151
|
+
// will cause an error because the schema will create extension and extension refer to unexisting schema
|
|
152
|
+
{
|
|
153
|
+
when: {
|
|
154
|
+
objectType: "extension",
|
|
155
|
+
operation: "create",
|
|
156
|
+
scope: "object",
|
|
157
|
+
"extension/schema": ["pgmq"],
|
|
158
|
+
},
|
|
159
|
+
options: {
|
|
160
|
+
skipSchema: true,
|
|
161
|
+
},
|
|
162
|
+
},
|
|
144
163
|
],
|
|
145
164
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SerializeOptions } from "../../../integrations/serialize/serialize.types.ts";
|
|
1
2
|
import type { Aggregate } from "../aggregate.model.ts";
|
|
2
3
|
import { AlterAggregateChange } from "./aggregate.base.ts";
|
|
3
4
|
|
|
@@ -23,7 +24,7 @@ export class AlterAggregateChangeOwner extends AlterAggregateChange {
|
|
|
23
24
|
return [this.aggregate.stableId];
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
serialize(): string {
|
|
27
|
+
serialize(_options?: SerializeOptions): string {
|
|
27
28
|
const signature = this.aggregate.identityArguments;
|
|
28
29
|
const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
|
|
29
30
|
const withArgs = signature.length > 0 ? `(${signature})` : "()";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SerializeOptions } from "../../../integrations/serialize/serialize.types.ts";
|
|
1
2
|
import { quoteLiteral } from "../../base.change.ts";
|
|
2
3
|
import { stableId } from "../../utils.ts";
|
|
3
4
|
import type { Aggregate } from "../aggregate.model.ts";
|
|
@@ -27,7 +28,7 @@ export class CreateCommentOnAggregate extends CreateAggregateChange {
|
|
|
27
28
|
return [this.aggregate.stableId];
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
serialize(): string {
|
|
31
|
+
serialize(_options?: SerializeOptions): string {
|
|
31
32
|
const signature = this.aggregate.identityArguments;
|
|
32
33
|
const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
|
|
33
34
|
const withArgs = signature.length > 0 ? `(${signature})` : "()";
|
|
@@ -53,7 +54,7 @@ export class DropCommentOnAggregate extends DropAggregateChange {
|
|
|
53
54
|
return [stableId.comment(this.aggregate.stableId), this.aggregate.stableId];
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
serialize(): string {
|
|
57
|
+
serialize(_options?: SerializeOptions): string {
|
|
57
58
|
const signature = this.aggregate.identityArguments;
|
|
58
59
|
const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
|
|
59
60
|
const withArgs = signature.length > 0 ? `(${signature})` : "()";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SerializeOptions } from "../../../integrations/serialize/serialize.types.ts";
|
|
1
2
|
import { quoteLiteral } from "../../base.change.ts";
|
|
2
3
|
import {
|
|
3
4
|
parseProcedureReference,
|
|
@@ -166,7 +167,7 @@ export class CreateAggregate extends CreateAggregateChange {
|
|
|
166
167
|
return Array.from(dependencies);
|
|
167
168
|
}
|
|
168
169
|
|
|
169
|
-
serialize(): string {
|
|
170
|
+
serialize(_options?: SerializeOptions): string {
|
|
170
171
|
const signature = this.aggregate.identityArguments;
|
|
171
172
|
const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
|
|
172
173
|
const head = [
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SerializeOptions } from "../../../integrations/serialize/serialize.types.ts";
|
|
1
2
|
import type { Aggregate } from "../aggregate.model.ts";
|
|
2
3
|
import { DropAggregateChange } from "./aggregate.base.ts";
|
|
3
4
|
|
|
@@ -23,7 +24,7 @@ export class DropAggregate extends DropAggregateChange {
|
|
|
23
24
|
return [this.aggregate.stableId];
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
serialize(): string {
|
|
27
|
+
serialize(_options?: SerializeOptions): string {
|
|
27
28
|
const signature = this.aggregate.identityArguments;
|
|
28
29
|
const qualifiedName = `${this.aggregate.schema}.${this.aggregate.name}`;
|
|
29
30
|
const withArgs = signature.length > 0 ? `(${signature})` : "(*)";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SerializeOptions } from "../../../integrations/serialize/serialize.types.ts";
|
|
1
2
|
import {
|
|
2
3
|
formatObjectPrivilegeList,
|
|
3
4
|
getObjectKindPrefix,
|
|
@@ -39,7 +40,7 @@ export class GrantAggregatePrivileges extends AlterAggregateChange {
|
|
|
39
40
|
return [this.aggregate.stableId, stableId.role(this.grantee)];
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
serialize(): string {
|
|
43
|
+
serialize(_options?: SerializeOptions): string {
|
|
43
44
|
const hasGrantable = this.privileges.some((p) => p.grantable);
|
|
44
45
|
const hasBase = this.privileges.some((p) => !p.grantable);
|
|
45
46
|
if (hasGrantable && hasBase) {
|
|
@@ -92,7 +93,7 @@ export class RevokeAggregatePrivileges extends AlterAggregateChange {
|
|
|
92
93
|
];
|
|
93
94
|
}
|
|
94
95
|
|
|
95
|
-
serialize(): string {
|
|
96
|
+
serialize(_options?: SerializeOptions): string {
|
|
96
97
|
const kindPrefix = getObjectKindPrefix("FUNCTION");
|
|
97
98
|
const list = this.privileges.map((p) => p.privilege);
|
|
98
99
|
const privSql = formatObjectPrivilegeList("FUNCTION", list, this.version);
|
|
@@ -131,7 +132,7 @@ export class RevokeGrantOptionAggregatePrivileges extends AlterAggregateChange {
|
|
|
131
132
|
];
|
|
132
133
|
}
|
|
133
134
|
|
|
134
|
-
serialize(): string {
|
|
135
|
+
serialize(_options?: SerializeOptions): string {
|
|
135
136
|
const kindPrefix = getObjectKindPrefix("FUNCTION");
|
|
136
137
|
const privSql = formatObjectPrivilegeList(
|
|
137
138
|
"FUNCTION",
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { SerializeOptions } from "../integrations/serialize/serialize.types.ts";
|
|
2
|
+
|
|
1
3
|
type ChangeOperation = "create" | "alter" | "drop";
|
|
2
4
|
|
|
3
5
|
/**
|
|
@@ -61,7 +63,7 @@ export abstract class BaseChange {
|
|
|
61
63
|
/**
|
|
62
64
|
* Serialize the change into a single SQL statement.
|
|
63
65
|
*/
|
|
64
|
-
abstract serialize(options?:
|
|
66
|
+
abstract serialize(options?: SerializeOptions): string;
|
|
65
67
|
}
|
|
66
68
|
|
|
67
69
|
/**
|