@supabase/pg-delta 1.0.0-alpha.3 → 1.0.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -0
- package/dist/cli/bin/cli.js +0 -0
- package/dist/cli/commands/plan.js +21 -0
- package/dist/cli/utils.d.ts +2 -0
- package/dist/cli/utils.js +1 -1
- package/dist/core/objects/table/table.model.d.ts +4 -2
- package/dist/core/objects/table/table.model.js +3 -0
- package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
- package/dist/core/objects/trigger/changes/trigger.create.js +2 -1
- package/dist/core/objects/trigger/trigger.model.d.ts +1 -0
- package/dist/core/objects/trigger/trigger.model.js +3 -0
- package/dist/core/plan/apply.js +3 -3
- package/dist/core/plan/create.js +34 -15
- package/dist/core/plan/sql-format/constants.d.ts +2 -0
- package/dist/core/plan/sql-format/constants.js +11 -0
- package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
- package/dist/core/plan/sql-format/fixtures.js +2449 -0
- package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
- package/dist/core/plan/sql-format/format-utils.js +274 -0
- package/dist/core/plan/sql-format/formatters.d.ts +20 -0
- package/dist/core/plan/sql-format/formatters.js +737 -0
- package/dist/core/plan/sql-format/index.d.ts +2 -0
- package/dist/core/plan/sql-format/index.js +98 -0
- package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
- package/dist/core/plan/sql-format/keyword-case.js +868 -0
- package/dist/core/plan/sql-format/protect.d.ts +3 -0
- package/dist/core/plan/sql-format/protect.js +269 -0
- package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
- package/dist/core/plan/sql-format/sql-scanner.js +202 -0
- package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
- package/dist/core/plan/sql-format/tokenizer.js +118 -0
- package/dist/core/plan/sql-format/types.d.ts +28 -0
- package/dist/core/plan/sql-format/types.js +1 -0
- package/dist/core/plan/sql-format/wrap.d.ts +2 -0
- package/dist/core/plan/sql-format/wrap.js +165 -0
- package/dist/core/plan/sql-format.d.ts +2 -0
- package/dist/core/plan/sql-format.js +1 -0
- package/dist/core/plan/statements.d.ts +2 -1
- package/dist/core/plan/statements.js +6 -2
- package/dist/core/postgres-config.d.ts +15 -0
- package/dist/core/postgres-config.js +30 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/package.json +37 -22
- package/src/cli/app.ts +28 -0
- package/src/cli/bin/cli.ts +9 -0
- package/src/cli/commands/apply.ts +101 -0
- package/src/cli/commands/plan.ts +195 -0
- package/src/cli/commands/sync.ts +185 -0
- package/src/cli/formatters/index.ts +5 -0
- package/src/cli/formatters/tree/tree-builder.ts +380 -0
- package/src/cli/formatters/tree/tree-renderer.ts +372 -0
- package/src/cli/formatters/tree/tree.ts +237 -0
- package/src/cli/utils/integrations.ts +42 -0
- package/src/cli/utils.ts +231 -0
- package/src/core/catalog.diff.ts +246 -0
- package/src/core/catalog.model.ts +384 -0
- package/src/core/change.types.ts +44 -0
- package/src/core/context.ts +26 -0
- package/src/core/depend.ts +1870 -0
- package/src/core/expand-replace-dependencies.ts +380 -0
- package/src/core/fingerprint.ts +204 -0
- package/src/core/integrations/filter/dsl.ts +204 -0
- package/src/core/integrations/filter/extractors.ts +145 -0
- package/src/core/integrations/filter/filter.types.ts +3 -0
- package/src/core/integrations/integration-dsl.ts +24 -0
- package/src/core/integrations/integration.types.ts +7 -0
- package/src/core/integrations/serialize/dsl.ts +77 -0
- package/src/core/integrations/serialize/serialize.types.ts +3 -0
- package/src/core/integrations/supabase.ts +121 -0
- package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +278 -0
- package/src/core/objects/aggregate/aggregate.model.ts +317 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +64 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
- package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +86 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
- package/src/core/objects/aggregate/changes/aggregate.create.test.ts +101 -0
- package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +78 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +130 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
- package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
- package/src/core/objects/base.change.ts +62 -0
- package/src/core/objects/base.default-privileges.ts +204 -0
- package/src/core/objects/base.diff.ts +20 -0
- package/src/core/objects/base.model.ts +82 -0
- package/src/core/objects/base.privilege-diff.ts +299 -0
- package/src/core/objects/base.privilege.ts +184 -0
- package/src/core/objects/collation/changes/collation.alter.test.ts +63 -0
- package/src/core/objects/collation/changes/collation.alter.ts +79 -0
- package/src/core/objects/collation/changes/collation.base.ts +20 -0
- package/src/core/objects/collation/changes/collation.comment.ts +68 -0
- package/src/core/objects/collation/changes/collation.create.test.ts +51 -0
- package/src/core/objects/collation/changes/collation.create.ts +106 -0
- package/src/core/objects/collation/changes/collation.drop.test.ts +28 -0
- package/src/core/objects/collation/changes/collation.drop.ts +37 -0
- package/src/core/objects/collation/changes/collation.types.ts +10 -0
- package/src/core/objects/collation/collation.diff.test.ts +100 -0
- package/src/core/objects/collation/collation.diff.ts +126 -0
- package/src/core/objects/collation/collation.model.ts +224 -0
- package/src/core/objects/domain/changes/domain.alter.test.ts +316 -0
- package/src/core/objects/domain/changes/domain.alter.ts +286 -0
- package/src/core/objects/domain/changes/domain.base.ts +20 -0
- package/src/core/objects/domain/changes/domain.comment.ts +59 -0
- package/src/core/objects/domain/changes/domain.create.test.ts +65 -0
- package/src/core/objects/domain/changes/domain.create.ts +118 -0
- package/src/core/objects/domain/changes/domain.drop.test.ts +30 -0
- package/src/core/objects/domain/changes/domain.drop.ts +34 -0
- package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
- package/src/core/objects/domain/changes/domain.types.ts +12 -0
- package/src/core/objects/domain/domain.diff.test.ts +284 -0
- package/src/core/objects/domain/domain.diff.ts +358 -0
- package/src/core/objects/domain/domain.model.ts +190 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +50 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
- package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
- package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +24 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +22 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
- package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
- package/src/core/objects/event-trigger/event-trigger.diff.test.ts +126 -0
- package/src/core/objects/event-trigger/event-trigger.diff.ts +126 -0
- package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
- package/src/core/objects/extension/changes/extension.alter.test.ts +58 -0
- package/src/core/objects/extension/changes/extension.alter.ts +78 -0
- package/src/core/objects/extension/changes/extension.base.ts +20 -0
- package/src/core/objects/extension/changes/extension.comment.ts +64 -0
- package/src/core/objects/extension/changes/extension.create.test.ts +25 -0
- package/src/core/objects/extension/changes/extension.create.ts +63 -0
- package/src/core/objects/extension/changes/extension.drop.test.ts +23 -0
- package/src/core/objects/extension/changes/extension.drop.ts +34 -0
- package/src/core/objects/extension/changes/extension.types.ts +10 -0
- package/src/core/objects/extension/extension.diff.test.ts +42 -0
- package/src/core/objects/extension/extension.diff.ts +90 -0
- package/src/core/objects/extension/extension.model.ts +280 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +125 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +125 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +23 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +179 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +341 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +309 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +201 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +43 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +406 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +168 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +131 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +24 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +167 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +317 -0
- package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +82 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +85 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +53 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
- package/src/core/objects/index/changes/index.alter.test.ts +200 -0
- package/src/core/objects/index/changes/index.alter.ts +144 -0
- package/src/core/objects/index/changes/index.base.ts +20 -0
- package/src/core/objects/index/changes/index.comment.ts +63 -0
- package/src/core/objects/index/changes/index.create.test.ts +66 -0
- package/src/core/objects/index/changes/index.create.ts +68 -0
- package/src/core/objects/index/changes/index.drop.test.ts +44 -0
- package/src/core/objects/index/changes/index.drop.ts +34 -0
- package/src/core/objects/index/changes/index.types.ts +6 -0
- package/src/core/objects/index/changes/utils.ts +16 -0
- package/src/core/objects/index/index.diff.test.ts +153 -0
- package/src/core/objects/index/index.diff.ts +243 -0
- package/src/core/objects/index/index.model.ts +370 -0
- package/src/core/objects/language/changes/language.alter.test.ts +33 -0
- package/src/core/objects/language/changes/language.alter.ts +53 -0
- package/src/core/objects/language/changes/language.base.ts +20 -0
- package/src/core/objects/language/changes/language.comment.ts +58 -0
- package/src/core/objects/language/changes/language.create.test.ts +27 -0
- package/src/core/objects/language/changes/language.create.ts +104 -0
- package/src/core/objects/language/changes/language.drop.test.ts +25 -0
- package/src/core/objects/language/changes/language.drop.ts +39 -0
- package/src/core/objects/language/changes/language.privilege.ts +172 -0
- package/src/core/objects/language/changes/language.types.ts +12 -0
- package/src/core/objects/language/language.diff.test.ts +53 -0
- package/src/core/objects/language/language.diff.ts +176 -0
- package/src/core/objects/language/language.model.ts +150 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +123 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
- package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
- package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +64 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +34 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
- package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
- package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
- package/src/core/objects/materialized-view/materialized-view.diff.test.ts +102 -0
- package/src/core/objects/materialized-view/materialized-view.diff.ts +451 -0
- package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
- package/src/core/objects/procedure/changes/procedure.alter.test.ts +1005 -0
- package/src/core/objects/procedure/changes/procedure.alter.ts +287 -0
- package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
- package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
- package/src/core/objects/procedure/changes/procedure.create.test.ts +48 -0
- package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
- package/src/core/objects/procedure/changes/procedure.drop.test.ts +85 -0
- package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
- package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
- package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
- package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
- package/src/core/objects/procedure/procedure.diff.ts +404 -0
- package/src/core/objects/procedure/procedure.model.ts +264 -0
- package/src/core/objects/procedure/utils.ts +58 -0
- package/src/core/objects/publication/changes/publication.alter.test.ts +223 -0
- package/src/core/objects/publication/changes/publication.alter.ts +243 -0
- package/src/core/objects/publication/changes/publication.base.ts +20 -0
- package/src/core/objects/publication/changes/publication.comment.test.ts +70 -0
- package/src/core/objects/publication/changes/publication.comment.ts +64 -0
- package/src/core/objects/publication/changes/publication.create.test.ts +87 -0
- package/src/core/objects/publication/changes/publication.create.ts +82 -0
- package/src/core/objects/publication/changes/publication.drop.test.ts +46 -0
- package/src/core/objects/publication/changes/publication.drop.ts +29 -0
- package/src/core/objects/publication/changes/publication.types.ts +26 -0
- package/src/core/objects/publication/publication.diff.test.ts +292 -0
- package/src/core/objects/publication/publication.diff.ts +253 -0
- package/src/core/objects/publication/publication.model.ts +206 -0
- package/src/core/objects/publication/utils.ts +55 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +250 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
- package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
- package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +74 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +28 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
- package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
- package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
- package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
- package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
- package/src/core/objects/role/changes/role.alter.test.ts +346 -0
- package/src/core/objects/role/changes/role.alter.ts +110 -0
- package/src/core/objects/role/changes/role.base.ts +24 -0
- package/src/core/objects/role/changes/role.comment.ts +55 -0
- package/src/core/objects/role/changes/role.create.test.ts +52 -0
- package/src/core/objects/role/changes/role.create.ts +102 -0
- package/src/core/objects/role/changes/role.drop.test.ts +29 -0
- package/src/core/objects/role/changes/role.drop.ts +34 -0
- package/src/core/objects/role/changes/role.privilege.ts +376 -0
- package/src/core/objects/role/changes/role.types.ts +12 -0
- package/src/core/objects/role/role.diff.test.ts +44 -0
- package/src/core/objects/role/role.diff.ts +479 -0
- package/src/core/objects/role/role.model.ts +344 -0
- package/src/core/objects/rule/changes/rule.alter.test.ts +78 -0
- package/src/core/objects/rule/changes/rule.alter.ts +72 -0
- package/src/core/objects/rule/changes/rule.base.ts +20 -0
- package/src/core/objects/rule/changes/rule.comment.test.ts +55 -0
- package/src/core/objects/rule/changes/rule.comment.ts +62 -0
- package/src/core/objects/rule/changes/rule.create.test.ts +59 -0
- package/src/core/objects/rule/changes/rule.create.ts +42 -0
- package/src/core/objects/rule/changes/rule.drop.test.ts +38 -0
- package/src/core/objects/rule/changes/rule.drop.ts +29 -0
- package/src/core/objects/rule/changes/rule.types.ts +12 -0
- package/src/core/objects/rule/rule.diff.test.ts +132 -0
- package/src/core/objects/rule/rule.diff.ts +79 -0
- package/src/core/objects/rule/rule.model.ts +173 -0
- package/src/core/objects/schema/changes/schema.alter.test.ts +28 -0
- package/src/core/objects/schema/changes/schema.alter.ts +45 -0
- package/src/core/objects/schema/changes/schema.base.ts +20 -0
- package/src/core/objects/schema/changes/schema.comment.ts +56 -0
- package/src/core/objects/schema/changes/schema.create.test.ts +22 -0
- package/src/core/objects/schema/changes/schema.create.ts +47 -0
- package/src/core/objects/schema/changes/schema.drop.test.ts +20 -0
- package/src/core/objects/schema/changes/schema.drop.ts +34 -0
- package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
- package/src/core/objects/schema/changes/schema.types.ts +12 -0
- package/src/core/objects/schema/schema.diff.test.ts +42 -0
- package/src/core/objects/schema/schema.diff.ts +209 -0
- package/src/core/objects/schema/schema.model.ts +107 -0
- package/src/core/objects/sequence/changes/sequence.alter.test.ts +151 -0
- package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
- package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
- package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
- package/src/core/objects/sequence/changes/sequence.create.test.ts +84 -0
- package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
- package/src/core/objects/sequence/changes/sequence.drop.test.ts +32 -0
- package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
- package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
- package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
- package/src/core/objects/sequence/sequence.diff.test.ts +141 -0
- package/src/core/objects/sequence/sequence.diff.ts +359 -0
- package/src/core/objects/sequence/sequence.model.ts +185 -0
- package/src/core/objects/subscription/changes/subscription.alter.test.ts +124 -0
- package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
- package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.comment.test.ts +67 -0
- package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
- package/src/core/objects/subscription/changes/subscription.create.test.ts +77 -0
- package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
- package/src/core/objects/subscription/changes/subscription.drop.test.ts +46 -0
- package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
- package/src/core/objects/subscription/subscription.diff.test.ts +232 -0
- package/src/core/objects/subscription/subscription.diff.ts +241 -0
- package/src/core/objects/subscription/subscription.model.ts +190 -0
- package/src/core/objects/subscription/utils.ts +156 -0
- package/src/core/objects/table/changes/table.alter.test.ts +823 -0
- package/src/core/objects/table/changes/table.alter.ts +806 -0
- package/src/core/objects/table/changes/table.base.ts +20 -0
- package/src/core/objects/table/changes/table.comment.ts +266 -0
- package/src/core/objects/table/changes/table.create.test.ts +150 -0
- package/src/core/objects/table/changes/table.create.ts +188 -0
- package/src/core/objects/table/changes/table.drop.test.ts +34 -0
- package/src/core/objects/table/changes/table.drop.ts +45 -0
- package/src/core/objects/table/changes/table.privilege.ts +200 -0
- package/src/core/objects/table/changes/table.types.ts +12 -0
- package/src/core/objects/table/table.diff.test.ts +711 -0
- package/src/core/objects/table/table.diff.ts +953 -0
- package/src/core/objects/table/table.model.ts +460 -0
- package/src/core/objects/trigger/changes/trigger.alter.test.ts +46 -0
- package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
- package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
- package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
- package/src/core/objects/trigger/changes/trigger.create.test.ts +43 -0
- package/src/core/objects/trigger/changes/trigger.create.ts +85 -0
- package/src/core/objects/trigger/changes/trigger.drop.test.ts +43 -0
- package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
- package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
- package/src/core/objects/trigger/trigger.diff.test.ts +83 -0
- package/src/core/objects/trigger/trigger.diff.ts +116 -0
- package/src/core/objects/trigger/trigger.model.ts +252 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +202 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
- package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
- package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +101 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +33 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
- package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
- package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
- package/src/core/objects/type/composite-type/composite-type.diff.test.ts +191 -0
- package/src/core/objects/type/composite-type/composite-type.diff.ts +372 -0
- package/src/core/objects/type/composite-type/composite-type.model.ts +252 -0
- package/src/core/objects/type/enum/changes/enum.alter.test.ts +104 -0
- package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
- package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
- package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
- package/src/core/objects/type/enum/changes/enum.create.test.ts +28 -0
- package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
- package/src/core/objects/type/enum/changes/enum.drop.test.ts +25 -0
- package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
- package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
- package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
- package/src/core/objects/type/enum/enum.diff.test.ts +191 -0
- package/src/core/objects/type/enum/enum.diff.ts +396 -0
- package/src/core/objects/type/enum/enum.model.ts +194 -0
- package/src/core/objects/type/range/changes/range.alter.test.ts +27 -0
- package/src/core/objects/type/range/changes/range.alter.ts +51 -0
- package/src/core/objects/type/range/changes/range.base.ts +20 -0
- package/src/core/objects/type/range/changes/range.comment.ts +64 -0
- package/src/core/objects/type/range/changes/range.create.test.ts +51 -0
- package/src/core/objects/type/range/changes/range.create.ts +151 -0
- package/src/core/objects/type/range/changes/range.drop.test.ts +26 -0
- package/src/core/objects/type/range/changes/range.drop.ts +34 -0
- package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
- package/src/core/objects/type/range/changes/range.types.ts +12 -0
- package/src/core/objects/type/range/range.diff.test.ts +70 -0
- package/src/core/objects/type/range/range.diff.ts +259 -0
- package/src/core/objects/type/range/range.model.ts +187 -0
- package/src/core/objects/type/type.types.ts +5 -0
- package/src/core/objects/utils.ts +171 -0
- package/src/core/objects/view/changes/view.alter.test.ts +110 -0
- package/src/core/objects/view/changes/view.alter.ts +112 -0
- package/src/core/objects/view/changes/view.base.ts +20 -0
- package/src/core/objects/view/changes/view.comment.ts +59 -0
- package/src/core/objects/view/changes/view.create.test.ts +65 -0
- package/src/core/objects/view/changes/view.create.ts +73 -0
- package/src/core/objects/view/changes/view.drop.test.ts +34 -0
- package/src/core/objects/view/changes/view.drop.ts +40 -0
- package/src/core/objects/view/changes/view.privilege.ts +200 -0
- package/src/core/objects/view/changes/view.types.ts +12 -0
- package/src/core/objects/view/view.diff.test.ts +91 -0
- package/src/core/objects/view/view.diff.ts +365 -0
- package/src/core/objects/view/view.model.ts +276 -0
- package/src/core/plan/apply.ts +190 -0
- package/src/core/plan/create.ts +432 -0
- package/src/core/plan/hierarchy.ts +574 -0
- package/src/core/plan/index.ts +29 -0
- package/src/core/plan/io.ts +20 -0
- package/src/core/plan/risk.ts +48 -0
- package/src/core/plan/serialize.ts +195 -0
- package/src/core/plan/sql-format/constants.ts +13 -0
- package/src/core/plan/sql-format/fixtures.ts +2806 -0
- package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
- package/src/core/plan/sql-format/format-functions.test.ts +127 -0
- package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +67 -0
- package/src/core/plan/sql-format/format-off.test.ts +809 -0
- package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1056 -0
- package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1283 -0
- package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1052 -0
- package/src/core/plan/sql-format/format-pretty-upper.test.ts +1045 -0
- package/src/core/plan/sql-format/format-stress.test.ts +616 -0
- package/src/core/plan/sql-format/format-utils.test.ts +91 -0
- package/src/core/plan/sql-format/format-utils.ts +391 -0
- package/src/core/plan/sql-format/formatters.ts +921 -0
- package/src/core/plan/sql-format/index.ts +149 -0
- package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
- package/src/core/plan/sql-format/keyword-case.ts +1085 -0
- package/src/core/plan/sql-format/protect.test.ts +127 -0
- package/src/core/plan/sql-format/protect.ts +337 -0
- package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
- package/src/core/plan/sql-format/sql-scanner.ts +252 -0
- package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
- package/src/core/plan/sql-format/tokenizer.ts +152 -0
- package/src/core/plan/sql-format/types.ts +31 -0
- package/src/core/plan/sql-format/wrap.test.ts +119 -0
- package/src/core/plan/sql-format/wrap.ts +196 -0
- package/src/core/plan/sql-format.ts +2 -0
- package/src/core/plan/statements.ts +22 -0
- package/src/core/plan/types.ts +165 -0
- package/src/core/postgres-config.ts +169 -0
- package/src/core/sort/custom-constraints.ts +161 -0
- package/src/core/sort/debug-visualization.ts +239 -0
- package/src/core/sort/dependency-filter.ts +224 -0
- package/src/core/sort/graph-builder.ts +223 -0
- package/src/core/sort/graph-utils.ts +51 -0
- package/src/core/sort/logical-sort.ts +590 -0
- package/src/core/sort/sort-changes.ts +234 -0
- package/src/core/sort/topological-sort.ts +184 -0
- package/src/core/sort/types.ts +112 -0
- package/src/core/sort/utils.ts +69 -0
- package/src/index.ts +14 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter DSL - A serializable domain-specific language for change filtering.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { Change } from "../../change.types.ts";
|
|
6
|
+
import { PROPERTY_EXTRACTORS } from "./extractors.ts";
|
|
7
|
+
import type { ChangeFilter } from "./filter.types.ts";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Core properties that all changes have.
|
|
11
|
+
*/
|
|
12
|
+
type CoreProperties = {
|
|
13
|
+
type?: Change["objectType"];
|
|
14
|
+
operation?: "create" | "alter" | "drop";
|
|
15
|
+
scope?: Change["scope"];
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Extracted properties that are extracted from changes via extractor functions.
|
|
20
|
+
* String value = exact match, Array value = value must be in array
|
|
21
|
+
*/
|
|
22
|
+
type ExtractedProperties = {
|
|
23
|
+
schema?: string | string[];
|
|
24
|
+
owner?: string | string[];
|
|
25
|
+
member?: string | string[];
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Property pattern - matches against change properties.
|
|
30
|
+
* Multiple properties are combined with AND (all must match).
|
|
31
|
+
*/
|
|
32
|
+
type PropertyPattern = CoreProperties &
|
|
33
|
+
ExtractedProperties & {
|
|
34
|
+
// Composition operators are NOT allowed in property patterns
|
|
35
|
+
and?: never;
|
|
36
|
+
or?: never;
|
|
37
|
+
not?: never;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Composition pattern - combines other patterns using logical operators.
|
|
42
|
+
* Composition operators are exclusive - cannot be mixed with properties.
|
|
43
|
+
*/
|
|
44
|
+
type CompositionPattern =
|
|
45
|
+
| ({
|
|
46
|
+
and: FilterPattern[];
|
|
47
|
+
or?: never;
|
|
48
|
+
not?: never;
|
|
49
|
+
} & {
|
|
50
|
+
[K in keyof CoreProperties]?: never;
|
|
51
|
+
} & {
|
|
52
|
+
[K in keyof ExtractedProperties]?: never;
|
|
53
|
+
})
|
|
54
|
+
| ({
|
|
55
|
+
or: FilterPattern[];
|
|
56
|
+
and?: never;
|
|
57
|
+
not?: never;
|
|
58
|
+
} & {
|
|
59
|
+
[K in keyof CoreProperties]?: never;
|
|
60
|
+
} & {
|
|
61
|
+
[K in keyof ExtractedProperties]?: never;
|
|
62
|
+
})
|
|
63
|
+
| ({
|
|
64
|
+
not: FilterPattern;
|
|
65
|
+
and?: never;
|
|
66
|
+
or?: never;
|
|
67
|
+
} & {
|
|
68
|
+
[K in keyof CoreProperties]?: never;
|
|
69
|
+
} & {
|
|
70
|
+
[K in keyof ExtractedProperties]?: never;
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Filter pattern DSL.
|
|
75
|
+
* Either a property pattern (matches against change properties) or
|
|
76
|
+
* a composition pattern (combines other patterns using logical operators).
|
|
77
|
+
* Composition operators are exclusive - cannot be mixed with properties.
|
|
78
|
+
*/
|
|
79
|
+
export type FilterPattern = PropertyPattern | CompositionPattern;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Filter DSL - a single pattern expression.
|
|
83
|
+
*/
|
|
84
|
+
export type FilterDSL = FilterPattern;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Evaluate a pattern against a change.
|
|
88
|
+
*
|
|
89
|
+
* @param pattern - The pattern to evaluate
|
|
90
|
+
* @param change - The change to match against
|
|
91
|
+
* @returns true if the pattern matches, false otherwise
|
|
92
|
+
*/
|
|
93
|
+
export function evaluatePattern(
|
|
94
|
+
pattern: FilterPattern,
|
|
95
|
+
change: Change,
|
|
96
|
+
): boolean {
|
|
97
|
+
// Handle composition operators first (they take precedence)
|
|
98
|
+
|
|
99
|
+
// NOT operator - negate the result
|
|
100
|
+
if (pattern.not) {
|
|
101
|
+
return !evaluatePattern(pattern.not, change);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// AND operator - all patterns must match
|
|
105
|
+
if (pattern.and) {
|
|
106
|
+
return pattern.and.every((p) => evaluatePattern(p, change));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// OR operator - any pattern must match
|
|
110
|
+
if (pattern.or) {
|
|
111
|
+
return pattern.or.some((p) => evaluatePattern(p, change));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Evaluate basic pattern matching
|
|
115
|
+
// Multiple properties in a pattern are combined with AND (all must match)
|
|
116
|
+
|
|
117
|
+
// Match objectType
|
|
118
|
+
if (pattern.type) {
|
|
119
|
+
if (change.objectType !== pattern.type) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Match operation
|
|
125
|
+
if (pattern.operation) {
|
|
126
|
+
if (change.operation !== pattern.operation) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Match scope
|
|
132
|
+
if (pattern.scope) {
|
|
133
|
+
if (change.scope !== pattern.scope) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Match extracted properties
|
|
139
|
+
for (const [key, value] of Object.entries(pattern)) {
|
|
140
|
+
// Skip composition operators and core properties
|
|
141
|
+
if (["and", "or", "not", "type", "operation", "scope"].includes(key)) {
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Check if this is a registered property extractor
|
|
146
|
+
const extractor = PROPERTY_EXTRACTORS[key];
|
|
147
|
+
if (!extractor) {
|
|
148
|
+
// Unknown property - ignore
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Extract the actual value from the change
|
|
153
|
+
const actualValue = extractor(change);
|
|
154
|
+
|
|
155
|
+
// Property matching rules:
|
|
156
|
+
// - String value: exact match
|
|
157
|
+
// - Array value: value must be in array
|
|
158
|
+
// - Missing properties (null) don't match
|
|
159
|
+
|
|
160
|
+
if (actualValue === null) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (typeof value === "string") {
|
|
165
|
+
// Exact match
|
|
166
|
+
if (actualValue !== value) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
} else if (Array.isArray(value)) {
|
|
170
|
+
// Value must be in array
|
|
171
|
+
if (!value.includes(actualValue)) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
// Invalid value type - don't match
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// All checks passed
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Compile a Filter DSL to a ChangeFilter function.
|
|
186
|
+
*
|
|
187
|
+
* @param dsl - The filter DSL pattern
|
|
188
|
+
* @returns A ChangeFilter function that evaluates the pattern
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```ts
|
|
192
|
+
* const filter = compileFilterDSL({
|
|
193
|
+
* or: [
|
|
194
|
+
* { type: "schema", operation: "create" },
|
|
195
|
+
* { schema: "public" }
|
|
196
|
+
* ]
|
|
197
|
+
* });
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
export function compileFilterDSL(dsl: FilterDSL): ChangeFilter {
|
|
201
|
+
return (change: Change): boolean => {
|
|
202
|
+
return evaluatePattern(dsl, change);
|
|
203
|
+
};
|
|
204
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import type { Change } from "../../change.types.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Property extractor function that extracts a value from a change.
|
|
5
|
+
*/
|
|
6
|
+
type PropertyExtractor = (change: Change) => string | null;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Registry of property extractors.
|
|
10
|
+
* Maps property names to extractor functions.
|
|
11
|
+
*/
|
|
12
|
+
export const PROPERTY_EXTRACTORS: Record<string, PropertyExtractor> = {
|
|
13
|
+
schema: getSchema,
|
|
14
|
+
owner: getOwner,
|
|
15
|
+
member: (change: Change) => {
|
|
16
|
+
if (change.scope === "membership") {
|
|
17
|
+
return change.member;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export function getSchema(change: Change) {
|
|
24
|
+
switch (change.objectType) {
|
|
25
|
+
case "aggregate":
|
|
26
|
+
return change.aggregate.schema;
|
|
27
|
+
case "collation":
|
|
28
|
+
return change.collation.schema;
|
|
29
|
+
case "composite_type":
|
|
30
|
+
return change.compositeType.schema;
|
|
31
|
+
case "domain":
|
|
32
|
+
return change.domain.schema;
|
|
33
|
+
case "enum":
|
|
34
|
+
return change.enum.schema;
|
|
35
|
+
case "event_trigger":
|
|
36
|
+
return null;
|
|
37
|
+
case "extension":
|
|
38
|
+
return change.extension.schema;
|
|
39
|
+
case "index":
|
|
40
|
+
return change.index.schema;
|
|
41
|
+
case "language":
|
|
42
|
+
return null;
|
|
43
|
+
case "materialized_view":
|
|
44
|
+
return change.materializedView.schema;
|
|
45
|
+
case "procedure":
|
|
46
|
+
return change.procedure.schema;
|
|
47
|
+
case "publication":
|
|
48
|
+
return null;
|
|
49
|
+
case "range":
|
|
50
|
+
return change.range.schema;
|
|
51
|
+
case "rls_policy":
|
|
52
|
+
return change.policy.schema;
|
|
53
|
+
case "role":
|
|
54
|
+
return null;
|
|
55
|
+
case "rule":
|
|
56
|
+
return change.rule.schema;
|
|
57
|
+
case "schema":
|
|
58
|
+
return change.schema.name;
|
|
59
|
+
case "sequence":
|
|
60
|
+
return change.sequence.schema;
|
|
61
|
+
case "subscription":
|
|
62
|
+
return null;
|
|
63
|
+
case "table":
|
|
64
|
+
return change.table.schema;
|
|
65
|
+
case "trigger":
|
|
66
|
+
return change.trigger.schema;
|
|
67
|
+
case "view":
|
|
68
|
+
return change.view.schema;
|
|
69
|
+
case "foreign_data_wrapper":
|
|
70
|
+
return null;
|
|
71
|
+
case "server":
|
|
72
|
+
return null;
|
|
73
|
+
case "user_mapping":
|
|
74
|
+
return null;
|
|
75
|
+
case "foreign_table":
|
|
76
|
+
return change.foreignTable.schema;
|
|
77
|
+
default: {
|
|
78
|
+
// exhaustiveness check
|
|
79
|
+
const _exhaustive: never = change;
|
|
80
|
+
return _exhaustive;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function getOwner(change: Change) {
|
|
86
|
+
switch (change.objectType) {
|
|
87
|
+
case "aggregate":
|
|
88
|
+
return change.aggregate.owner;
|
|
89
|
+
case "collation":
|
|
90
|
+
return change.collation.owner;
|
|
91
|
+
case "composite_type":
|
|
92
|
+
return change.compositeType.owner;
|
|
93
|
+
case "domain":
|
|
94
|
+
return change.domain.owner;
|
|
95
|
+
case "enum":
|
|
96
|
+
return change.enum.owner;
|
|
97
|
+
case "event_trigger":
|
|
98
|
+
return change.eventTrigger.owner;
|
|
99
|
+
case "extension":
|
|
100
|
+
return change.extension.owner;
|
|
101
|
+
case "index":
|
|
102
|
+
return change.index.owner;
|
|
103
|
+
case "language":
|
|
104
|
+
return change.language.owner;
|
|
105
|
+
case "materialized_view":
|
|
106
|
+
return change.materializedView.owner;
|
|
107
|
+
case "procedure":
|
|
108
|
+
return change.procedure.owner;
|
|
109
|
+
case "publication":
|
|
110
|
+
return change.publication.owner;
|
|
111
|
+
case "range":
|
|
112
|
+
return change.range.owner;
|
|
113
|
+
case "rls_policy":
|
|
114
|
+
return change.policy.owner;
|
|
115
|
+
case "role":
|
|
116
|
+
return change.role.name;
|
|
117
|
+
case "rule":
|
|
118
|
+
return change.rule.owner;
|
|
119
|
+
case "schema":
|
|
120
|
+
return change.schema.owner;
|
|
121
|
+
case "sequence":
|
|
122
|
+
return change.sequence.owner;
|
|
123
|
+
case "subscription":
|
|
124
|
+
return change.subscription.owner;
|
|
125
|
+
case "table":
|
|
126
|
+
return change.table.owner;
|
|
127
|
+
case "trigger":
|
|
128
|
+
return change.trigger.owner;
|
|
129
|
+
case "view":
|
|
130
|
+
return change.view.owner;
|
|
131
|
+
case "foreign_data_wrapper":
|
|
132
|
+
return change.foreignDataWrapper.owner;
|
|
133
|
+
case "server":
|
|
134
|
+
return change.server.owner;
|
|
135
|
+
case "user_mapping":
|
|
136
|
+
return null;
|
|
137
|
+
case "foreign_table":
|
|
138
|
+
return change.foreignTable.owner;
|
|
139
|
+
default: {
|
|
140
|
+
// exhaustiveness check
|
|
141
|
+
const _exhaustive: never = change;
|
|
142
|
+
return _exhaustive;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration DSL - A serializable domain-specific language for integrations.
|
|
3
|
+
*
|
|
4
|
+
* Combines filter and serialization DSLs into a single serializable structure.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { FilterDSL } from "./filter/dsl.ts";
|
|
8
|
+
import type { SerializeDSL } from "./serialize/dsl.ts";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Integration DSL - serializable representation of an integration.
|
|
12
|
+
*/
|
|
13
|
+
export type IntegrationDSL = {
|
|
14
|
+
/**
|
|
15
|
+
* Filter DSL - determines which changes to include/exclude.
|
|
16
|
+
* If not provided, all changes are included.
|
|
17
|
+
*/
|
|
18
|
+
filter?: FilterDSL;
|
|
19
|
+
/**
|
|
20
|
+
* Serialization DSL - customizes how changes are serialized.
|
|
21
|
+
* If not provided, changes are serialized with default options.
|
|
22
|
+
*/
|
|
23
|
+
serialize?: SerializeDSL;
|
|
24
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serialization DSL - A serializable domain-specific language for customizing change serialization.
|
|
3
|
+
*
|
|
4
|
+
* Reuses the filter pattern matching logic to determine when to apply serialization options.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Change } from "../../change.types.ts";
|
|
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
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* A serialization rule that applies options when a pattern matches.
|
|
22
|
+
*/
|
|
23
|
+
type SerializeRule = {
|
|
24
|
+
/**
|
|
25
|
+
* Pattern to match against changes.
|
|
26
|
+
* Uses the same pattern matching logic as filters.
|
|
27
|
+
*/
|
|
28
|
+
when: FilterPattern;
|
|
29
|
+
/**
|
|
30
|
+
* Serialization options to apply when the pattern matches.
|
|
31
|
+
*/
|
|
32
|
+
options: SerializeOptions;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Serialization DSL - array of rules evaluated in order.
|
|
37
|
+
* First matching rule's options are applied.
|
|
38
|
+
*/
|
|
39
|
+
export type SerializeDSL = SerializeRule[];
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Compile a Serialization DSL to a ChangeSerializer function.
|
|
43
|
+
*
|
|
44
|
+
* Rules are evaluated in order, and the first matching rule's options are applied.
|
|
45
|
+
* If no rule matches, the change is serialized with default options.
|
|
46
|
+
*
|
|
47
|
+
* @param dsl - The serialization DSL
|
|
48
|
+
* @returns A ChangeSerializer function that applies the rules
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* const serializer = compileSerializeDSL([
|
|
53
|
+
* {
|
|
54
|
+
* when: {
|
|
55
|
+
* type: "schema",
|
|
56
|
+
* operation: "create",
|
|
57
|
+
* owner: ["service_role"]
|
|
58
|
+
* },
|
|
59
|
+
* options: { skipAuthorization: true }
|
|
60
|
+
* }
|
|
61
|
+
* ]);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export function compileSerializeDSL(dsl: SerializeDSL): ChangeSerializer {
|
|
65
|
+
return (change: Change): string | undefined => {
|
|
66
|
+
// Find first matching rule
|
|
67
|
+
for (const rule of dsl) {
|
|
68
|
+
if (evaluatePattern(rule.when, change)) {
|
|
69
|
+
// Apply this rule's options
|
|
70
|
+
return change.serialize(rule.options);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// No rule matched - use default serialization
|
|
75
|
+
return change.serialize();
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase integration - filtering and serialization rules for Supabase databases.
|
|
3
|
+
*
|
|
4
|
+
* This integration:
|
|
5
|
+
* - Filters out Supabase system schemas and roles
|
|
6
|
+
* - Includes user schemas and extensions
|
|
7
|
+
* - Skips authorization for schema creates owned by Supabase system roles
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { IntegrationDSL } from "./integration-dsl.ts";
|
|
11
|
+
|
|
12
|
+
// Supabase system schemas that should be excluded
|
|
13
|
+
const SUPABASE_SYSTEM_SCHEMAS = [
|
|
14
|
+
"_analytics",
|
|
15
|
+
"_realtime",
|
|
16
|
+
"_supavisor",
|
|
17
|
+
"auth",
|
|
18
|
+
"cron",
|
|
19
|
+
"extensions",
|
|
20
|
+
"graphql",
|
|
21
|
+
"graphql_public",
|
|
22
|
+
"information_schema",
|
|
23
|
+
"net",
|
|
24
|
+
"pgbouncer",
|
|
25
|
+
"pgmq",
|
|
26
|
+
"pgmq_public",
|
|
27
|
+
"pgsodium",
|
|
28
|
+
"pgsodium_masks",
|
|
29
|
+
"pgtle",
|
|
30
|
+
"realtime",
|
|
31
|
+
"storage",
|
|
32
|
+
"supabase_functions",
|
|
33
|
+
"supabase_migrations",
|
|
34
|
+
"vault",
|
|
35
|
+
] as const;
|
|
36
|
+
|
|
37
|
+
// Supabase system roles that should be excluded
|
|
38
|
+
const SUPABASE_SYSTEM_ROLES = [
|
|
39
|
+
"anon",
|
|
40
|
+
"authenticated",
|
|
41
|
+
"authenticator",
|
|
42
|
+
"cli_login_postgres",
|
|
43
|
+
"dashboard_user",
|
|
44
|
+
"pgbouncer",
|
|
45
|
+
"pgsodium_keyholder",
|
|
46
|
+
"pgsodium_keyiduser",
|
|
47
|
+
"pgsodium_keymaker",
|
|
48
|
+
"pgtle_admin",
|
|
49
|
+
"service_role",
|
|
50
|
+
"supabase_admin",
|
|
51
|
+
"supabase_auth_admin",
|
|
52
|
+
"supabase_etl_admin",
|
|
53
|
+
"supabase_functions_admin",
|
|
54
|
+
"supabase_read_only_user",
|
|
55
|
+
"supabase_realtime_admin",
|
|
56
|
+
"supabase_replication_admin",
|
|
57
|
+
"supabase_storage_admin",
|
|
58
|
+
"supabase_superuser",
|
|
59
|
+
] as const;
|
|
60
|
+
|
|
61
|
+
export const supabase: IntegrationDSL = {
|
|
62
|
+
filter: {
|
|
63
|
+
or: [
|
|
64
|
+
{
|
|
65
|
+
and: [
|
|
66
|
+
{
|
|
67
|
+
type: "schema",
|
|
68
|
+
operation: "create",
|
|
69
|
+
scope: "object",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
not: {
|
|
73
|
+
schema: [...SUPABASE_SYSTEM_SCHEMAS],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
type: "extension",
|
|
80
|
+
operation: "create",
|
|
81
|
+
scope: "object",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
not: {
|
|
85
|
+
or: [
|
|
86
|
+
{
|
|
87
|
+
schema: [...SUPABASE_SYSTEM_SCHEMAS],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
owner: [...SUPABASE_SYSTEM_ROLES],
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
and: [
|
|
94
|
+
{
|
|
95
|
+
type: "role",
|
|
96
|
+
scope: "membership",
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
member: [...SUPABASE_SYSTEM_ROLES],
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
serialize: [
|
|
109
|
+
{
|
|
110
|
+
when: {
|
|
111
|
+
type: "schema",
|
|
112
|
+
operation: "create",
|
|
113
|
+
scope: "object",
|
|
114
|
+
owner: [...SUPABASE_SYSTEM_ROLES],
|
|
115
|
+
},
|
|
116
|
+
options: {
|
|
117
|
+
skipAuthorization: true,
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
};
|