@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
|
@@ -1,57 +1,59 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Filter DSL - A serializable domain-specific language for change filtering.
|
|
3
|
+
*
|
|
4
|
+
* Uses wildcard-based path matching on flattened change properties.
|
|
5
|
+
* Path patterns as keys, values as matchers. Multiple keys in one object = AND.
|
|
6
|
+
*
|
|
7
|
+
* Path convention:
|
|
8
|
+
* - Top-level change properties are bare keys: `objectType`, `operation`, `scope`, `member`, `grantee`
|
|
9
|
+
* - Model sub-object properties use `<objectType>/<field>`: `table/schema`, `role/name`
|
|
10
|
+
* - Wildcard `*` matches any single path segment: `* /schema` → `table/schema`, `view/schema`, etc.
|
|
11
|
+
* - Separator is `/`
|
|
12
|
+
*
|
|
13
|
+
* Value matching:
|
|
14
|
+
* - string → exact equality
|
|
15
|
+
* - string[] → value must be in array (inclusion)
|
|
16
|
+
* - boolean → exact equality
|
|
17
|
+
* - number → exact equality
|
|
18
|
+
* - { op: "regex", value: string | string[] } → regex test
|
|
19
|
+
*
|
|
20
|
+
* When the flat value is an array (e.g. `requires`), match succeeds if any element satisfies.
|
|
3
21
|
*/
|
|
4
22
|
import type { Change } from "../../change.types.ts";
|
|
5
23
|
import type { ChangeFilter } from "./filter.types.ts";
|
|
6
24
|
/**
|
|
7
|
-
*
|
|
25
|
+
* Regex operator for advanced value matching.
|
|
8
26
|
*/
|
|
9
|
-
type
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
scope?: Change["scope"];
|
|
27
|
+
type RegexOperator = {
|
|
28
|
+
op: "regex";
|
|
29
|
+
value: string | string[];
|
|
13
30
|
};
|
|
14
31
|
/**
|
|
15
|
-
*
|
|
16
|
-
* String value = exact match, Array value = value must be in array
|
|
32
|
+
* A value matcher for a path pattern key.
|
|
17
33
|
*/
|
|
18
|
-
type
|
|
19
|
-
schema?: string | string[];
|
|
20
|
-
owner?: string | string[];
|
|
21
|
-
member?: string | string[];
|
|
22
|
-
grantee?: string | string[];
|
|
23
|
-
publication?: string | string[];
|
|
24
|
-
extension?: string | string[];
|
|
25
|
-
procedureLanguage?: string | string[];
|
|
26
|
-
eventTriggerName?: string | string[];
|
|
27
|
-
procedureBinaryPath?: string | string[];
|
|
28
|
-
triggerFunctionSchema?: string | string[];
|
|
29
|
-
};
|
|
34
|
+
type ValueMatcher = string | string[] | boolean | number | RegexOperator;
|
|
30
35
|
/**
|
|
31
|
-
*
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
*
|
|
48
|
-
* Multiple properties are combined with AND (all must match).
|
|
36
|
+
* Path pattern — matches against flattened change properties.
|
|
37
|
+
* Keys are path patterns (with optional wildcards), values are matchers.
|
|
38
|
+
* Multiple keys are combined with AND (all must match).
|
|
39
|
+
*
|
|
40
|
+
* Reserved keys: `and`, `or`, `not`, `cascade`.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```json
|
|
44
|
+
* { "objectType": "table", "operation": "create" }
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @example Wildcard path matching any object's schema
|
|
48
|
+
* ```json
|
|
49
|
+
* { "* /schema": "public" }
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @category Filter DSL
|
|
49
53
|
*/
|
|
50
|
-
type
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
* Default false for DSL filters (opt-in).
|
|
54
|
-
*/
|
|
54
|
+
export type PathPattern = {
|
|
55
|
+
[path: string]: ValueMatcher;
|
|
56
|
+
} & {
|
|
55
57
|
cascade?: boolean;
|
|
56
58
|
and?: never;
|
|
57
59
|
or?: never;
|
|
@@ -59,51 +61,53 @@ type PropertyPattern = CoreProperties & ExtractedProperties & SpecialProperties
|
|
|
59
61
|
};
|
|
60
62
|
/**
|
|
61
63
|
* Composition pattern - combines other patterns using logical operators.
|
|
62
|
-
* Composition operators are exclusive - cannot be mixed with
|
|
64
|
+
* Composition operators are exclusive - cannot be mixed with path keys.
|
|
63
65
|
*/
|
|
64
|
-
type CompositionPattern =
|
|
66
|
+
type CompositionPattern = {
|
|
65
67
|
and: FilterPattern[];
|
|
66
68
|
cascade?: boolean;
|
|
67
69
|
or?: never;
|
|
68
70
|
not?: never;
|
|
69
|
-
}
|
|
70
|
-
[K in keyof CoreProperties]?: never;
|
|
71
|
-
} & {
|
|
72
|
-
[K in keyof ExtractedProperties]?: never;
|
|
73
|
-
} & {
|
|
74
|
-
[K in keyof SpecialProperties]?: never;
|
|
75
|
-
}) | ({
|
|
71
|
+
} | {
|
|
76
72
|
or: FilterPattern[];
|
|
77
73
|
cascade?: boolean;
|
|
78
74
|
and?: never;
|
|
79
75
|
not?: never;
|
|
80
|
-
}
|
|
81
|
-
[K in keyof CoreProperties]?: never;
|
|
82
|
-
} & {
|
|
83
|
-
[K in keyof ExtractedProperties]?: never;
|
|
84
|
-
} & {
|
|
85
|
-
[K in keyof SpecialProperties]?: never;
|
|
86
|
-
}) | ({
|
|
76
|
+
} | {
|
|
87
77
|
not: FilterPattern;
|
|
88
78
|
cascade?: boolean;
|
|
89
79
|
and?: never;
|
|
90
80
|
or?: never;
|
|
91
|
-
}
|
|
92
|
-
[K in keyof CoreProperties]?: never;
|
|
93
|
-
} & {
|
|
94
|
-
[K in keyof ExtractedProperties]?: never;
|
|
95
|
-
} & {
|
|
96
|
-
[K in keyof SpecialProperties]?: never;
|
|
97
|
-
});
|
|
81
|
+
};
|
|
98
82
|
/**
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
83
|
+
* A single filter expression: either a {@link PathPattern} that matches against
|
|
84
|
+
* flattened change properties, or a composition pattern that combines other
|
|
85
|
+
* patterns using `and` / `or` / `not` logical operators.
|
|
86
|
+
*
|
|
87
|
+
* @example Exclude all changes in pg_catalog
|
|
88
|
+
* ```json
|
|
89
|
+
* { "not": { "* /schema": "pg_catalog" } }
|
|
90
|
+
* ```
|
|
91
|
+
*
|
|
92
|
+
* @category Filter DSL
|
|
103
93
|
*/
|
|
104
|
-
export type FilterPattern =
|
|
94
|
+
export type FilterPattern = PathPattern | CompositionPattern;
|
|
105
95
|
/**
|
|
106
|
-
* Filter DSL
|
|
96
|
+
* Top-level Filter DSL type — a single {@link FilterPattern} expression that
|
|
97
|
+
* determines which changes an integration includes or excludes.
|
|
98
|
+
*
|
|
99
|
+
* @example Include only table and view creates in public
|
|
100
|
+
* ```json
|
|
101
|
+
* {
|
|
102
|
+
* "and": [
|
|
103
|
+
* { "objectType": ["table", "view"] },
|
|
104
|
+
* { "operation": "create" },
|
|
105
|
+
* { "* /schema": "public" }
|
|
106
|
+
* ]
|
|
107
|
+
* }
|
|
108
|
+
* ```
|
|
109
|
+
*
|
|
110
|
+
* @category Filter DSL
|
|
107
111
|
*/
|
|
108
112
|
export type FilterDSL = FilterPattern;
|
|
109
113
|
/**
|
|
@@ -121,11 +125,11 @@ export declare function evaluatePattern(pattern: FilterPattern, change: Change):
|
|
|
121
125
|
* @returns A ChangeFilter function that evaluates the pattern
|
|
122
126
|
*
|
|
123
127
|
* @example
|
|
124
|
-
* ```
|
|
128
|
+
* ```
|
|
125
129
|
* const filter = compileFilterDSL({
|
|
126
130
|
* or: [
|
|
127
|
-
* {
|
|
128
|
-
* { schema: "public" }
|
|
131
|
+
* { objectType: "schema", operation: "create" },
|
|
132
|
+
* { "table/schema": "public" }
|
|
129
133
|
* ]
|
|
130
134
|
* });
|
|
131
135
|
* ```
|
|
@@ -1,7 +1,73 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Filter DSL - A serializable domain-specific language for change filtering.
|
|
3
|
+
*
|
|
4
|
+
* Uses wildcard-based path matching on flattened change properties.
|
|
5
|
+
* Path patterns as keys, values as matchers. Multiple keys in one object = AND.
|
|
6
|
+
*
|
|
7
|
+
* Path convention:
|
|
8
|
+
* - Top-level change properties are bare keys: `objectType`, `operation`, `scope`, `member`, `grantee`
|
|
9
|
+
* - Model sub-object properties use `<objectType>/<field>`: `table/schema`, `role/name`
|
|
10
|
+
* - Wildcard `*` matches any single path segment: `* /schema` → `table/schema`, `view/schema`, etc.
|
|
11
|
+
* - Separator is `/`
|
|
12
|
+
*
|
|
13
|
+
* Value matching:
|
|
14
|
+
* - string → exact equality
|
|
15
|
+
* - string[] → value must be in array (inclusion)
|
|
16
|
+
* - boolean → exact equality
|
|
17
|
+
* - number → exact equality
|
|
18
|
+
* - { op: "regex", value: string | string[] } → regex test
|
|
19
|
+
*
|
|
20
|
+
* When the flat value is an array (e.g. `requires`), match succeeds if any element satisfies.
|
|
3
21
|
*/
|
|
4
|
-
import {
|
|
22
|
+
import { compileWildcard, flattenChange } from "./flatten.js";
|
|
23
|
+
// Reserved keys that are not path patterns
|
|
24
|
+
const RESERVED_KEYS = new Set(["and", "or", "not", "cascade"]);
|
|
25
|
+
/**
|
|
26
|
+
* Match a flat value against a value matcher.
|
|
27
|
+
*
|
|
28
|
+
* When the flat value is an array, the match succeeds if any element satisfies.
|
|
29
|
+
*/
|
|
30
|
+
function matchValue(actual, expected) {
|
|
31
|
+
if (actual === null || actual === undefined) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
// String matcher → exact equality
|
|
35
|
+
if (typeof expected === "string") {
|
|
36
|
+
if (Array.isArray(actual)) {
|
|
37
|
+
return actual.some((v) => v === expected);
|
|
38
|
+
}
|
|
39
|
+
return actual === expected;
|
|
40
|
+
}
|
|
41
|
+
// Boolean matcher → exact equality
|
|
42
|
+
if (typeof expected === "boolean") {
|
|
43
|
+
return actual === expected;
|
|
44
|
+
}
|
|
45
|
+
// Number matcher → exact equality
|
|
46
|
+
if (typeof expected === "number") {
|
|
47
|
+
return actual === expected;
|
|
48
|
+
}
|
|
49
|
+
// Array matcher → inclusion (value must be in array)
|
|
50
|
+
if (Array.isArray(expected)) {
|
|
51
|
+
if (Array.isArray(actual)) {
|
|
52
|
+
return actual.some((v) => expected.includes(v));
|
|
53
|
+
}
|
|
54
|
+
return typeof actual === "string" && expected.includes(actual);
|
|
55
|
+
}
|
|
56
|
+
// Regex operator
|
|
57
|
+
if (typeof expected === "object" &&
|
|
58
|
+
expected !== null &&
|
|
59
|
+
"op" in expected &&
|
|
60
|
+
expected.op === "regex") {
|
|
61
|
+
const patterns = Array.isArray(expected.value)
|
|
62
|
+
? expected.value
|
|
63
|
+
: [expected.value];
|
|
64
|
+
if (Array.isArray(actual)) {
|
|
65
|
+
return actual.some((a) => patterns.some((p) => new RegExp(p).test(String(a))));
|
|
66
|
+
}
|
|
67
|
+
return patterns.some((p) => new RegExp(p).test(String(actual)));
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
5
71
|
/**
|
|
6
72
|
* Evaluate a pattern against a change.
|
|
7
73
|
*
|
|
@@ -12,94 +78,36 @@ import { PROPERTY_EXTRACTORS } from "./extractors.js";
|
|
|
12
78
|
export function evaluatePattern(pattern, change) {
|
|
13
79
|
// Handle composition operators first (they take precedence)
|
|
14
80
|
// NOT operator - negate the result
|
|
15
|
-
if (pattern.not) {
|
|
81
|
+
if ("not" in pattern && pattern.not) {
|
|
16
82
|
return !evaluatePattern(pattern.not, change);
|
|
17
83
|
}
|
|
18
84
|
// AND operator - all patterns must match
|
|
19
|
-
if (pattern.and) {
|
|
85
|
+
if ("and" in pattern && pattern.and) {
|
|
20
86
|
return pattern.and.every((p) => evaluatePattern(p, change));
|
|
21
87
|
}
|
|
22
88
|
// OR operator - any pattern must match
|
|
23
|
-
if (pattern.or) {
|
|
89
|
+
if ("or" in pattern && pattern.or) {
|
|
24
90
|
return pattern.or.some((p) => evaluatePattern(p, change));
|
|
25
91
|
}
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
// Match operation
|
|
35
|
-
if (pattern.operation) {
|
|
36
|
-
if (change.operation !== pattern.operation) {
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
// Match scope
|
|
41
|
-
if (pattern.scope) {
|
|
42
|
-
if (change.scope !== pattern.scope) {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
// Match requiresMatching (special property - prefix match on change.requires)
|
|
47
|
-
if (pattern.requiresMatching) {
|
|
48
|
-
const requires = change.requires ?? [];
|
|
49
|
-
const prefixes = pattern.requiresMatching;
|
|
50
|
-
const hasMatch = requires.some((r) => prefixes.some((p) => r.startsWith(p)));
|
|
51
|
-
if (!hasMatch) {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
// Match extracted properties
|
|
56
|
-
for (const [key, value] of Object.entries(pattern)) {
|
|
57
|
-
// Skip composition operators, core properties, special properties, and cascade
|
|
58
|
-
if ([
|
|
59
|
-
"and",
|
|
60
|
-
"or",
|
|
61
|
-
"not",
|
|
62
|
-
"type",
|
|
63
|
-
"operation",
|
|
64
|
-
"scope",
|
|
65
|
-
"requiresMatching",
|
|
66
|
-
"cascade",
|
|
67
|
-
].includes(key)) {
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
// Check if this is a registered property extractor
|
|
71
|
-
const extractor = PROPERTY_EXTRACTORS[key];
|
|
72
|
-
if (!extractor) {
|
|
73
|
-
// Unknown property - ignore
|
|
92
|
+
// Path pattern matching: flatten the change, then for each key in the pattern,
|
|
93
|
+
// wildcard-match against flat map paths and compare values.
|
|
94
|
+
const flat = flattenChange(change);
|
|
95
|
+
for (const [patternKey, matcher] of Object.entries(pattern)) {
|
|
96
|
+
if (RESERVED_KEYS.has(patternKey))
|
|
74
97
|
continue;
|
|
75
|
-
|
|
76
|
-
//
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// - Array value: value must be in array
|
|
81
|
-
// - Missing properties (null) don't match
|
|
82
|
-
if (actualValue === null) {
|
|
98
|
+
const wildcardMatcher = compileWildcard(patternKey);
|
|
99
|
+
// Find all flat keys that match this wildcard pattern
|
|
100
|
+
const matchingKeys = Object.keys(flat).filter((k) => wildcardMatcher(k));
|
|
101
|
+
if (matchingKeys.length === 0) {
|
|
102
|
+
// No flat keys match this wildcard → pattern key not satisfied
|
|
83
103
|
return false;
|
|
84
104
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
else if (Array.isArray(value)) {
|
|
92
|
-
// Value must be in array
|
|
93
|
-
if (!value.includes(actualValue)) {
|
|
94
|
-
return false;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
// Invalid value type - don't match
|
|
105
|
+
// At least one matching key must satisfy the value matcher
|
|
106
|
+
const anyMatch = matchingKeys.some((k) => matchValue(flat[k], matcher));
|
|
107
|
+
if (!anyMatch)
|
|
99
108
|
return false;
|
|
100
|
-
}
|
|
101
109
|
}
|
|
102
|
-
// All
|
|
110
|
+
// All pattern keys satisfied
|
|
103
111
|
return true;
|
|
104
112
|
}
|
|
105
113
|
/**
|
|
@@ -109,17 +117,57 @@ export function evaluatePattern(pattern, change) {
|
|
|
109
117
|
* @returns A ChangeFilter function that evaluates the pattern
|
|
110
118
|
*
|
|
111
119
|
* @example
|
|
112
|
-
* ```
|
|
120
|
+
* ```
|
|
113
121
|
* const filter = compileFilterDSL({
|
|
114
122
|
* or: [
|
|
115
|
-
* {
|
|
116
|
-
* { schema: "public" }
|
|
123
|
+
* { objectType: "schema", operation: "create" },
|
|
124
|
+
* { "table/schema": "public" }
|
|
117
125
|
* ]
|
|
118
126
|
* });
|
|
119
127
|
* ```
|
|
120
128
|
*/
|
|
121
129
|
export function compileFilterDSL(dsl) {
|
|
130
|
+
validateRegexPatterns(dsl);
|
|
122
131
|
return (change) => {
|
|
123
132
|
return evaluatePattern(dsl, change);
|
|
124
133
|
};
|
|
125
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* Walk the pattern tree and validate all regex patterns at compile time.
|
|
137
|
+
* Throws a descriptive error if any regex pattern is invalid.
|
|
138
|
+
*/
|
|
139
|
+
function validateRegexPatterns(pattern) {
|
|
140
|
+
if ("not" in pattern && pattern.not) {
|
|
141
|
+
validateRegexPatterns(pattern.not);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if ("and" in pattern && pattern.and) {
|
|
145
|
+
for (const p of pattern.and)
|
|
146
|
+
validateRegexPatterns(p);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if ("or" in pattern && pattern.or) {
|
|
150
|
+
for (const p of pattern.or)
|
|
151
|
+
validateRegexPatterns(p);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
for (const [key, value] of Object.entries(pattern)) {
|
|
155
|
+
if (RESERVED_KEYS.has(key))
|
|
156
|
+
continue;
|
|
157
|
+
if (typeof value === "object" &&
|
|
158
|
+
value !== null &&
|
|
159
|
+
!Array.isArray(value) &&
|
|
160
|
+
"op" in value &&
|
|
161
|
+
value.op === "regex") {
|
|
162
|
+
const patterns = Array.isArray(value.value) ? value.value : [value.value];
|
|
163
|
+
for (const p of patterns) {
|
|
164
|
+
try {
|
|
165
|
+
new RegExp(p);
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
throw new Error(`Invalid regex pattern "${p}" in filter DSL: ${e.message}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Change flattening and wildcard path matching for the filter DSL.
|
|
3
|
+
*
|
|
4
|
+
* Each Change is flattened into a Record<string, FlatValue> where top-level
|
|
5
|
+
* scalar properties become bare keys and model sub-object properties become
|
|
6
|
+
* `<objectType>/<field>` paths. Wildcard patterns (e.g. `* /schema`) match
|
|
7
|
+
* against these flat paths.
|
|
8
|
+
*/
|
|
9
|
+
import type { Change } from "../../change.types.ts";
|
|
10
|
+
/**
|
|
11
|
+
* A flat value extracted from a Change: scalar types or arrays of scalars.
|
|
12
|
+
*
|
|
13
|
+
* The filter DSL flattens every {@link Change} into a
|
|
14
|
+
* `Record<string, FlatValue>` before pattern matching. Only these primitive
|
|
15
|
+
* types survive the flattening step; nested objects are expanded into
|
|
16
|
+
* `<objectType>/<field>` paths.
|
|
17
|
+
*
|
|
18
|
+
* @category Filter DSL
|
|
19
|
+
*/
|
|
20
|
+
export type FlatValue = string | number | boolean | null | Array<string | number>;
|
|
21
|
+
/**
|
|
22
|
+
* Flatten a Change into a Record<string, FlatValue>.
|
|
23
|
+
*
|
|
24
|
+
* A Change object has two kinds of properties:
|
|
25
|
+
*
|
|
26
|
+
* 1. **Top-level properties** — scalars and arrays directly on the object.
|
|
27
|
+
* These become bare keys in the flat record.
|
|
28
|
+
*
|
|
29
|
+
* 2. **Model sub-object** — a single nested object whose JS property name is
|
|
30
|
+
* given by OBJECT_TYPE_TO_PROPERTY_KEY. Its scalar fields are flattened
|
|
31
|
+
* with an `<objectType>/` prefix.
|
|
32
|
+
*
|
|
33
|
+
* After the main loop, a schema normalization step ensures that
|
|
34
|
+
* `<objectType>/schema` exists for every change that logically belongs to
|
|
35
|
+
* a schema — even when the model stores the schema under a different name.
|
|
36
|
+
*
|
|
37
|
+
* Results are cached per Change instance (WeakMap) so repeated calls are free.
|
|
38
|
+
*/
|
|
39
|
+
export declare function flattenChange(change: Change): Record<string, FlatValue>;
|
|
40
|
+
/**
|
|
41
|
+
* Compile a glob pattern string into a matcher function.
|
|
42
|
+
*
|
|
43
|
+
* Uses picomatch for full glob support:
|
|
44
|
+
* - `objectType` matches only `objectType`
|
|
45
|
+
* - `table/schema` matches only `table/schema`
|
|
46
|
+
* - `* /schema` matches `table/schema`, `view/schema`, etc.
|
|
47
|
+
* - `{table,view}/schema` matches `table/schema` and `view/schema`
|
|
48
|
+
* - `table/is_*` matches `table/is_partition`, `table/is_typed`, etc.
|
|
49
|
+
* - `!(role)/schema` matches any objectType's schema except `role`
|
|
50
|
+
*/
|
|
51
|
+
export declare function compileWildcard(pattern: string): (path: string) => boolean;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Change flattening and wildcard path matching for the filter DSL.
|
|
3
|
+
*
|
|
4
|
+
* Each Change is flattened into a Record<string, FlatValue> where top-level
|
|
5
|
+
* scalar properties become bare keys and model sub-object properties become
|
|
6
|
+
* `<objectType>/<field>` paths. Wildcard patterns (e.g. `* /schema`) match
|
|
7
|
+
* against these flat paths.
|
|
8
|
+
*/
|
|
9
|
+
import picomatch from "picomatch";
|
|
10
|
+
import { OBJECT_TYPE_TO_PROPERTY_KEY } from "../../change.types.js";
|
|
11
|
+
import { getSchema } from "../../change-utils.js";
|
|
12
|
+
/**
|
|
13
|
+
* WeakMap cache to avoid re-flattening the same Change instance.
|
|
14
|
+
*/
|
|
15
|
+
const flattenCache = new WeakMap();
|
|
16
|
+
/**
|
|
17
|
+
* Convert an unknown value to a FlatValue if it's a supported type.
|
|
18
|
+
*
|
|
19
|
+
* Supported types (kept in the flat record):
|
|
20
|
+
* - null / undefined → null (missing or explicitly null)
|
|
21
|
+
* - string, number, boolean → as-is
|
|
22
|
+
* - Array where every element is string or number → as-is
|
|
23
|
+
*
|
|
24
|
+
* Anything else (nested objects, arrays of objects, functions, …) is NOT
|
|
25
|
+
* representable as a flat value, so we return `undefined` to signal
|
|
26
|
+
* "skip this entry".
|
|
27
|
+
*/
|
|
28
|
+
function toFlatValue(value) {
|
|
29
|
+
if (value === null || value === undefined)
|
|
30
|
+
return null;
|
|
31
|
+
if (typeof value === "string" ||
|
|
32
|
+
typeof value === "number" ||
|
|
33
|
+
typeof value === "boolean")
|
|
34
|
+
return value;
|
|
35
|
+
if (Array.isArray(value) &&
|
|
36
|
+
value.every((v) => typeof v === "string" || typeof v === "number")) {
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Flatten a Change into a Record<string, FlatValue>.
|
|
43
|
+
*
|
|
44
|
+
* A Change object has two kinds of properties:
|
|
45
|
+
*
|
|
46
|
+
* 1. **Top-level properties** — scalars and arrays directly on the object.
|
|
47
|
+
* These become bare keys in the flat record.
|
|
48
|
+
*
|
|
49
|
+
* 2. **Model sub-object** — a single nested object whose JS property name is
|
|
50
|
+
* given by OBJECT_TYPE_TO_PROPERTY_KEY. Its scalar fields are flattened
|
|
51
|
+
* with an `<objectType>/` prefix.
|
|
52
|
+
*
|
|
53
|
+
* After the main loop, a schema normalization step ensures that
|
|
54
|
+
* `<objectType>/schema` exists for every change that logically belongs to
|
|
55
|
+
* a schema — even when the model stores the schema under a different name.
|
|
56
|
+
*
|
|
57
|
+
* Results are cached per Change instance (WeakMap) so repeated calls are free.
|
|
58
|
+
*/
|
|
59
|
+
export function flattenChange(change) {
|
|
60
|
+
const cached = flattenCache.get(change);
|
|
61
|
+
if (cached)
|
|
62
|
+
return cached;
|
|
63
|
+
const flat = {};
|
|
64
|
+
const modelKey = OBJECT_TYPE_TO_PROPERTY_KEY[change.objectType];
|
|
65
|
+
const prefix = change.objectType;
|
|
66
|
+
for (const [key, value] of Object.entries(change)) {
|
|
67
|
+
if (key === modelKey &&
|
|
68
|
+
value &&
|
|
69
|
+
typeof value === "object" &&
|
|
70
|
+
!Array.isArray(value)) {
|
|
71
|
+
for (const [subKey, subValue] of Object.entries(value)) {
|
|
72
|
+
const flatVal = toFlatValue(subValue);
|
|
73
|
+
if (flatVal !== undefined) {
|
|
74
|
+
flat[`${prefix}/${subKey}`] = flatVal;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const flatVal = toFlatValue(value);
|
|
80
|
+
if (flatVal !== undefined) {
|
|
81
|
+
flat[key] = flatVal;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// requires/creates/drops are prototype getters (not own properties),
|
|
86
|
+
// so Object.entries() above won't see them. Access them explicitly.
|
|
87
|
+
flat.requires = change.requires ?? [];
|
|
88
|
+
flat.creates = change.creates ?? [];
|
|
89
|
+
flat.drops = change.drops ?? [];
|
|
90
|
+
// Schema normalization: ensure <objectType>/schema exists for all changes
|
|
91
|
+
// that have a schema. Handles: schema objects (name→schema), event triggers
|
|
92
|
+
// (function_schema→schema), default_privilege scope (inSchema→schema).
|
|
93
|
+
const schemaKey = `${prefix}/schema`;
|
|
94
|
+
if (!(schemaKey in flat)) {
|
|
95
|
+
const schemaValue = getSchema(change);
|
|
96
|
+
if (schemaValue !== null) {
|
|
97
|
+
flat[schemaKey] = schemaValue;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
flattenCache.set(change, flat);
|
|
101
|
+
return flat;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Compile a glob pattern string into a matcher function.
|
|
105
|
+
*
|
|
106
|
+
* Uses picomatch for full glob support:
|
|
107
|
+
* - `objectType` matches only `objectType`
|
|
108
|
+
* - `table/schema` matches only `table/schema`
|
|
109
|
+
* - `* /schema` matches `table/schema`, `view/schema`, etc.
|
|
110
|
+
* - `{table,view}/schema` matches `table/schema` and `view/schema`
|
|
111
|
+
* - `table/is_*` matches `table/is_partition`, `table/is_typed`, etc.
|
|
112
|
+
* - `!(role)/schema` matches any objectType's schema except `role`
|
|
113
|
+
*/
|
|
114
|
+
export function compileWildcard(pattern) {
|
|
115
|
+
return picomatch(pattern, { dot: true });
|
|
116
|
+
}
|
|
@@ -7,9 +7,25 @@ import type { CatalogSnapshot } from "../catalog.snapshot.ts";
|
|
|
7
7
|
import type { FilterDSL } from "./filter/dsl.ts";
|
|
8
8
|
import type { SerializeDSL } from "./serialize/dsl.ts";
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* Serializable representation of a pg-delta integration.
|
|
11
|
+
*
|
|
12
|
+
* An integration combines a {@link FilterDSL} (which changes to include) with a
|
|
13
|
+
* {@link SerializeDSL} (how to render them as SQL) and an optional baseline
|
|
14
|
+
* catalog snapshot.
|
|
15
|
+
*
|
|
16
|
+
* @category Integration
|
|
11
17
|
*/
|
|
12
18
|
export type IntegrationDSL = {
|
|
19
|
+
/**
|
|
20
|
+
* Base integration(s) to extend. Filters are AND-combined, serialize rules
|
|
21
|
+
* are concatenated (base rules first, higher priority in first-match-wins),
|
|
22
|
+
* and the most specific emptyCatalog wins.
|
|
23
|
+
*
|
|
24
|
+
* Only core integration names are accepted (e.g., "supabase").
|
|
25
|
+
* Can be a single name or an array of names.
|
|
26
|
+
* Circular extends are detected and rejected.
|
|
27
|
+
*/
|
|
28
|
+
extends?: string | string[];
|
|
13
29
|
/**
|
|
14
30
|
* Filter DSL - determines which changes to include/exclude.
|
|
15
31
|
* If not provided, all changes are included.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration merging — combines multiple IntegrationDSL objects.
|
|
3
|
+
*
|
|
4
|
+
* - Filters are AND-combined
|
|
5
|
+
* - Serialize rules are concatenated (earlier integrations first = higher priority)
|
|
6
|
+
* - emptyCatalog: most-specific (last) integration's value wins
|
|
7
|
+
*/
|
|
8
|
+
import type { IntegrationDSL } from "./integration-dsl.ts";
|
|
9
|
+
/**
|
|
10
|
+
* Merge an ordered list of integrations into a single IntegrationDSL.
|
|
11
|
+
*
|
|
12
|
+
* Integrations are ordered from base (first) to most-specific (last).
|
|
13
|
+
* - Filters: AND-combined (all must pass)
|
|
14
|
+
* - Serialize: concatenated (base rules first → higher priority, first-match-wins)
|
|
15
|
+
* - emptyCatalog: most-specific non-undefined value wins
|
|
16
|
+
*
|
|
17
|
+
* @param integrations - Ordered list of integrations (base first, most-specific last)
|
|
18
|
+
* @returns A single merged IntegrationDSL
|
|
19
|
+
*/
|
|
20
|
+
export declare function mergeIntegrations(integrations: IntegrationDSL[]): IntegrationDSL;
|