@supabase/pg-delta 1.0.0-alpha.0 → 1.0.0-alpha.10
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 +41 -2
- package/dist/cli/app.js +26 -3
- package/dist/cli/bin/cli.js +5 -0
- package/dist/cli/commands/catalog-export.d.ts +5 -0
- package/dist/cli/commands/catalog-export.js +64 -0
- package/dist/cli/commands/declarative-apply.d.ts +6 -0
- package/dist/cli/commands/declarative-apply.js +288 -0
- package/dist/cli/commands/declarative-export.d.ts +5 -0
- package/dist/cli/commands/declarative-export.js +245 -0
- package/dist/cli/commands/plan.js +40 -6
- package/dist/cli/exit-code.d.ts +2 -0
- package/dist/cli/exit-code.js +7 -0
- package/dist/cli/formatters/tree/tree.js +3 -2
- package/dist/cli/utils/apply-display.d.ts +52 -0
- package/dist/cli/utils/apply-display.js +183 -0
- package/dist/cli/utils/export-display.d.ts +43 -0
- package/dist/cli/utils/export-display.js +202 -0
- package/dist/cli/utils/integrations.d.ts +4 -3
- package/dist/cli/utils/integrations.js +25 -16
- package/dist/cli/utils/resolve-input.d.ts +7 -0
- package/dist/cli/utils/resolve-input.js +13 -0
- package/dist/cli/utils.d.ts +2 -0
- package/dist/cli/utils.js +1 -1
- package/dist/core/catalog-export/index.d.ts +11 -0
- package/dist/core/catalog-export/index.js +10 -0
- package/dist/core/catalog.diff.d.ts +1 -0
- package/dist/core/catalog.diff.js +64 -48
- package/dist/core/catalog.model.d.ts +16 -3
- package/dist/core/catalog.model.js +132 -30
- package/dist/core/catalog.snapshot.d.ts +66 -0
- package/dist/core/catalog.snapshot.js +206 -0
- package/dist/core/context.d.ts +3 -3
- package/dist/core/context.js +7 -10
- package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
- package/dist/core/declarative-apply/discover-sql.js +86 -0
- package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
- package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
- package/dist/core/declarative-apply/index.d.ts +49 -0
- package/dist/core/declarative-apply/index.js +134 -0
- package/dist/core/declarative-apply/round-apply.d.ts +100 -0
- package/dist/core/declarative-apply/round-apply.js +378 -0
- package/dist/core/depend.d.ts +2 -2
- package/dist/core/depend.js +8 -7
- package/dist/core/export/file-mapper.d.ts +71 -0
- package/dist/core/export/file-mapper.js +474 -0
- package/dist/core/export/grouper.d.ts +13 -0
- package/dist/core/export/grouper.js +76 -0
- package/dist/core/export/index.d.ts +45 -0
- package/dist/core/export/index.js +63 -0
- package/dist/core/export/types.d.ts +84 -0
- package/dist/core/export/types.js +25 -0
- package/dist/core/fingerprint.d.ts +0 -8
- package/dist/core/fingerprint.js +2 -2
- package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/dist/core/integrations/filter/dsl.d.ts +39 -2
- package/dist/core/integrations/filter/dsl.js +20 -2
- package/dist/core/integrations/filter/extractors.js +42 -0
- package/dist/core/integrations/filter/filter.types.d.ts +2 -0
- package/dist/core/integrations/filter/filter.types.js +1 -0
- package/dist/core/integrations/integration-dsl.d.ts +10 -0
- package/dist/core/integrations/integration.types.d.ts +2 -1
- package/dist/core/integrations/serialize/dsl.d.ts +1 -1
- package/dist/core/integrations/serialize/serialize.types.d.ts +2 -0
- package/dist/core/integrations/serialize/serialize.types.js +1 -0
- package/dist/core/integrations/supabase.d.ts +18 -0
- package/dist/core/integrations/supabase.js +125 -0
- package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
- package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
- package/dist/core/objects/aggregate/aggregate.model.d.ts +2 -2
- package/dist/core/objects/aggregate/aggregate.model.js +8 -10
- package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
- package/dist/core/objects/base.privilege-diff.d.ts +38 -13
- package/dist/core/objects/base.privilege-diff.js +104 -22
- package/dist/core/objects/base.privilege.d.ts +1 -0
- package/dist/core/objects/base.privilege.js +9 -2
- package/dist/core/objects/collation/collation.diff.d.ts +2 -3
- package/dist/core/objects/collation/collation.model.d.ts +2 -2
- package/dist/core/objects/collation/collation.model.js +29 -28
- package/dist/core/objects/diff-context.d.ts +15 -0
- package/dist/core/objects/diff-context.js +1 -0
- package/dist/core/objects/domain/changes/domain.create.js +4 -2
- package/dist/core/objects/domain/domain.diff.d.ts +2 -8
- package/dist/core/objects/domain/domain.diff.js +16 -77
- package/dist/core/objects/domain/domain.model.d.ts +2 -2
- package/dist/core/objects/domain/domain.model.js +9 -11
- package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
- package/dist/core/objects/event-trigger/event-trigger.model.d.ts +2 -2
- package/dist/core/objects/event-trigger/event-trigger.model.js +7 -9
- package/dist/core/objects/extension/extension.model.d.ts +2 -2
- package/dist/core/objects/extension/extension.model.js +8 -10
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +22 -24
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +21 -23
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
- package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +2 -2
- package/dist/core/objects/foreign-data-wrapper/server/server.model.js +20 -22
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +2 -2
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +20 -22
- package/dist/core/objects/index/index.model.d.ts +4 -4
- package/dist/core/objects/index/index.model.js +9 -11
- package/dist/core/objects/language/language.diff.d.ts +2 -5
- package/dist/core/objects/language/language.diff.js +7 -39
- package/dist/core/objects/language/language.model.js +5 -7
- package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
- package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
- package/dist/core/objects/materialized-view/materialized-view.model.d.ts +2 -2
- package/dist/core/objects/materialized-view/materialized-view.model.js +9 -11
- package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
- package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
- package/dist/core/objects/procedure/procedure.diff.js +16 -77
- package/dist/core/objects/procedure/procedure.model.d.ts +2 -2
- package/dist/core/objects/procedure/procedure.model.js +9 -11
- package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
- package/dist/core/objects/publication/changes/publication.alter.js +0 -14
- package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
- package/dist/core/objects/publication/publication.diff.d.ts +2 -3
- package/dist/core/objects/publication/publication.diff.js +8 -13
- package/dist/core/objects/publication/publication.model.d.ts +2 -2
- package/dist/core/objects/publication/publication.model.js +7 -9
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
- package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
- package/dist/core/objects/rls-policy/rls-policy.model.js +8 -10
- package/dist/core/objects/role/role.diff.js +22 -1
- package/dist/core/objects/role/role.model.d.ts +3 -2
- package/dist/core/objects/role/role.model.js +146 -40
- package/dist/core/objects/rule/rule.model.d.ts +2 -2
- package/dist/core/objects/rule/rule.model.js +7 -9
- package/dist/core/objects/schema/schema.diff.d.ts +2 -8
- package/dist/core/objects/schema/schema.diff.js +16 -77
- package/dist/core/objects/schema/schema.model.d.ts +2 -2
- package/dist/core/objects/schema/schema.model.js +9 -11
- package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
- package/dist/core/objects/sequence/sequence.diff.js +16 -79
- package/dist/core/objects/sequence/sequence.model.d.ts +2 -2
- package/dist/core/objects/sequence/sequence.model.js +9 -11
- package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
- package/dist/core/objects/subscription/subscription.model.d.ts +2 -2
- package/dist/core/objects/subscription/subscription.model.js +25 -20
- package/dist/core/objects/table/changes/table.create.js +3 -0
- package/dist/core/objects/table/table.diff.d.ts +2 -8
- package/dist/core/objects/table/table.diff.js +26 -157
- package/dist/core/objects/table/table.model.d.ts +7 -4
- package/dist/core/objects/table/table.model.js +12 -11
- package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
- package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
- package/dist/core/objects/trigger/trigger.model.d.ts +11 -2
- package/dist/core/objects/trigger/trigger.model.js +22 -10
- package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
- package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
- package/dist/core/objects/type/composite-type/composite-type.model.d.ts +2 -2
- package/dist/core/objects/type/composite-type/composite-type.model.js +10 -11
- package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
- package/dist/core/objects/type/enum/enum.diff.js +25 -112
- package/dist/core/objects/type/enum/enum.model.d.ts +2 -2
- package/dist/core/objects/type/enum/enum.model.js +23 -25
- package/dist/core/objects/type/range/changes/range.create.js +6 -3
- package/dist/core/objects/type/range/range.diff.d.ts +2 -8
- package/dist/core/objects/type/range/range.diff.js +16 -77
- package/dist/core/objects/type/range/range.model.d.ts +2 -2
- package/dist/core/objects/type/range/range.model.js +8 -10
- package/dist/core/objects/view/view.diff.d.ts +2 -8
- package/dist/core/objects/view/view.diff.js +16 -158
- package/dist/core/objects/view/view.model.d.ts +17 -3
- package/dist/core/objects/view/view.model.js +11 -23
- package/dist/core/plan/apply.d.ts +2 -2
- package/dist/core/plan/apply.js +33 -16
- package/dist/core/plan/create.d.ts +20 -7
- package/dist/core/plan/create.js +153 -112
- package/dist/core/plan/index.d.ts +1 -2
- package/dist/core/plan/index.js +0 -1
- package/dist/core/plan/serialize.js +16 -4
- package/dist/core/plan/sql-format/constants.d.ts +2 -0
- package/dist/core/plan/sql-format/constants.js +11 -0
- package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
- package/dist/core/plan/sql-format/fixtures.js +2447 -0
- package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
- package/dist/core/plan/sql-format/format-utils.js +274 -0
- package/dist/core/plan/sql-format/formatters.d.ts +20 -0
- package/dist/core/plan/sql-format/formatters.js +737 -0
- package/dist/core/plan/sql-format/index.d.ts +2 -0
- package/dist/core/plan/sql-format/index.js +98 -0
- package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
- package/dist/core/plan/sql-format/keyword-case.js +893 -0
- package/dist/core/plan/sql-format/protect.d.ts +3 -0
- package/dist/core/plan/sql-format/protect.js +269 -0
- package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
- package/dist/core/plan/sql-format/sql-scanner.js +202 -0
- package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
- package/dist/core/plan/sql-format/tokenizer.js +118 -0
- package/dist/core/plan/sql-format/types.d.ts +28 -0
- package/dist/core/plan/sql-format/types.js +1 -0
- package/dist/core/plan/sql-format/wrap.d.ts +2 -0
- package/dist/core/plan/sql-format/wrap.js +165 -0
- package/dist/core/plan/sql-format.d.ts +2 -0
- package/dist/core/plan/sql-format.js +1 -0
- package/dist/core/plan/ssl-config.d.ts +32 -0
- package/dist/core/plan/ssl-config.js +115 -0
- package/dist/core/plan/statements.d.ts +2 -1
- package/dist/core/plan/statements.js +6 -2
- package/dist/core/plan/types.d.ts +10 -15
- package/dist/core/postgres-config.d.ts +47 -3
- package/dist/core/postgres-config.js +225 -39
- package/dist/core/sort/graph-builder.js +10 -0
- package/dist/core/sort/logical-sort.js +31 -23
- package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
- package/dist/core/test-utils/assert-valid-sql.js +19 -0
- package/dist/index.d.ts +18 -1
- package/dist/index.js +16 -1
- package/package.json +58 -21
- package/src/cli/app.ts +52 -0
- package/src/cli/bin/cli.ts +15 -0
- package/src/cli/commands/apply.ts +101 -0
- package/src/cli/commands/catalog-export.ts +78 -0
- package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
- package/src/cli/commands/declarative-apply.ts +380 -0
- package/src/cli/commands/declarative-export.ts +330 -0
- package/src/cli/commands/plan.ts +216 -0
- package/src/cli/commands/sync.ts +185 -0
- package/src/cli/exit-code.test.ts +19 -0
- package/src/cli/exit-code.ts +7 -0
- package/src/cli/formatters/index.ts +5 -0
- package/src/cli/formatters/tree/tree-builder.ts +380 -0
- package/src/cli/formatters/tree/tree-renderer.ts +372 -0
- package/src/cli/formatters/tree/tree.ts +238 -0
- package/src/cli/utils/apply-display.test.ts +348 -0
- package/src/cli/utils/apply-display.ts +238 -0
- package/src/cli/utils/export-display.test.ts +103 -0
- package/src/cli/utils/export-display.ts +275 -0
- package/src/cli/utils/integrations.test.ts +44 -0
- package/src/cli/utils/integrations.ts +42 -0
- package/src/cli/utils/resolve-input.test.ts +38 -0
- package/src/cli/utils/resolve-input.ts +17 -0
- package/src/cli/utils.ts +231 -0
- package/src/core/catalog-export/index.ts +20 -0
- package/src/core/catalog.diff.ts +247 -0
- package/src/core/catalog.model.test.ts +122 -0
- package/src/core/catalog.model.ts +510 -0
- package/src/core/catalog.snapshot.test.ts +477 -0
- package/src/core/catalog.snapshot.ts +289 -0
- package/src/core/change.types.ts +44 -0
- package/src/core/context.ts +26 -0
- package/src/core/declarative-apply/discover-sql.test.ts +103 -0
- package/src/core/declarative-apply/discover-sql.ts +107 -0
- package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
- package/src/core/declarative-apply/index.test.ts +67 -0
- package/src/core/declarative-apply/index.ts +205 -0
- package/src/core/declarative-apply/round-apply.test.ts +504 -0
- package/src/core/declarative-apply/round-apply.ts +562 -0
- package/src/core/depend.ts +1870 -0
- package/src/core/expand-replace-dependencies.test.ts +70 -0
- package/src/core/expand-replace-dependencies.ts +380 -0
- package/src/core/export/file-mapper.test.ts +816 -0
- package/src/core/export/file-mapper.ts +574 -0
- package/src/core/export/grouper.ts +108 -0
- package/src/core/export/index.ts +129 -0
- package/src/core/export/types.ts +104 -0
- package/src/core/fingerprint.ts +204 -0
- package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/src/core/integrations/filter/dsl.test.ts +211 -0
- package/src/core/integrations/filter/dsl.ts +266 -0
- package/src/core/integrations/filter/extractors.test.ts +244 -0
- package/src/core/integrations/filter/extractors.ts +187 -0
- package/src/core/integrations/filter/filter.types.ts +3 -0
- package/src/core/integrations/integration-dsl.ts +34 -0
- package/src/core/integrations/integration.types.ts +7 -0
- package/src/core/integrations/serialize/dsl.test.ts +91 -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 +130 -0
- package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
- package/src/core/objects/aggregate/aggregate.model.ts +317 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
- package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
- package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
- package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -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 +447 -0
- package/src/core/objects/base.privilege.ts +191 -0
- package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
- package/src/core/objects/collation/changes/collation.alter.ts +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 +56 -0
- package/src/core/objects/collation/changes/collation.create.ts +106 -0
- package/src/core/objects/collation/changes/collation.drop.test.ts +31 -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 +97 -0
- package/src/core/objects/collation/collation.diff.ts +127 -0
- package/src/core/objects/collation/collation.model.ts +224 -0
- package/src/core/objects/diff-context.ts +16 -0
- package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
- package/src/core/objects/domain/changes/domain.alter.ts +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 +95 -0
- package/src/core/objects/domain/changes/domain.create.ts +124 -0
- package/src/core/objects/domain/changes/domain.drop.test.ts +33 -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 +295 -0
- package/src/core/objects/domain/domain.model.ts +190 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +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 +27 -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 +25 -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 +131 -0
- package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
- package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
- package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
- package/src/core/objects/extension/changes/extension.alter.ts +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 +28 -0
- package/src/core/objects/extension/changes/extension.create.ts +63 -0
- package/src/core/objects/extension/changes/extension.drop.test.ts +26 -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.test.ts +98 -0
- package/src/core/objects/extension/extension.model.ts +280 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +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 +160 -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 +26 -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 +286 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +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 +210 -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 +46 -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 +343 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +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 +144 -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 +27 -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 +262 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
- package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +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 +96 -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 +60 -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 +209 -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 +69 -0
- package/src/core/objects/index/changes/index.create.ts +68 -0
- package/src/core/objects/index/changes/index.drop.test.ts +47 -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 +36 -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 +30 -0
- package/src/core/objects/language/changes/language.create.ts +104 -0
- package/src/core/objects/language/changes/language.drop.test.ts +28 -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 +135 -0
- package/src/core/objects/language/language.diff.ts +144 -0
- package/src/core/objects/language/language.model.ts +150 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +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 +69 -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 +37 -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 +264 -0
- package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
- package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
- package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
- package/src/core/objects/procedure/changes/procedure.alter.ts +290 -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 +51 -0
- package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
- package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -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 +341 -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 +217 -0
- package/src/core/objects/publication/changes/publication.alter.ts +225 -0
- package/src/core/objects/publication/changes/publication.base.ts +20 -0
- package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
- package/src/core/objects/publication/changes/publication.comment.ts +64 -0
- package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
- package/src/core/objects/publication/changes/publication.create.ts +82 -0
- package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
- package/src/core/objects/publication/changes/publication.drop.ts +29 -0
- package/src/core/objects/publication/changes/publication.types.ts +24 -0
- package/src/core/objects/publication/publication.diff.test.ts +297 -0
- package/src/core/objects/publication/publication.diff.ts +247 -0
- package/src/core/objects/publication/publication.model.ts +206 -0
- package/src/core/objects/publication/utils.ts +55 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -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 +81 -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 +31 -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 +362 -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 +56 -0
- package/src/core/objects/role/changes/role.create.ts +102 -0
- package/src/core/objects/role/changes/role.drop.test.ts +32 -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 +279 -0
- package/src/core/objects/role/role.diff.ts +499 -0
- package/src/core/objects/role/role.model.ts +452 -0
- package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
- package/src/core/objects/rule/changes/rule.alter.ts +72 -0
- package/src/core/objects/rule/changes/rule.base.ts +20 -0
- package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
- package/src/core/objects/rule/changes/rule.comment.ts +62 -0
- package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
- package/src/core/objects/rule/changes/rule.create.ts +42 -0
- package/src/core/objects/rule/changes/rule.drop.test.ts +40 -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 +31 -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 +25 -0
- package/src/core/objects/schema/changes/schema.create.ts +47 -0
- package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
- package/src/core/objects/schema/changes/schema.drop.ts +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 +146 -0
- package/src/core/objects/schema/schema.model.ts +107 -0
- package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
- package/src/core/objects/sequence/changes/sequence.alter.ts +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 +89 -0
- package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
- package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -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 +255 -0
- package/src/core/objects/sequence/sequence.diff.ts +294 -0
- package/src/core/objects/sequence/sequence.model.ts +185 -0
- package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
- package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
- package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
- package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
- package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
- package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
- package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -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 +237 -0
- package/src/core/objects/subscription/subscription.diff.ts +242 -0
- package/src/core/objects/subscription/subscription.model.ts +190 -0
- package/src/core/objects/subscription/utils.ts +156 -0
- package/src/core/objects/table/changes/table.alter.test.ts +846 -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 +188 -0
- package/src/core/objects/table/changes/table.create.ts +192 -0
- package/src/core/objects/table/changes/table.drop.test.ts +36 -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 +868 -0
- package/src/core/objects/table/table.diff.ts +817 -0
- package/src/core/objects/table/table.model.ts +460 -0
- package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -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 +47 -0
- package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
- package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -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 +84 -0
- package/src/core/objects/trigger/trigger.diff.ts +116 -0
- package/src/core/objects/trigger/trigger.model.ts +264 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +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 +106 -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 +36 -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 +269 -0
- package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
- package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
- package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
- package/src/core/objects/type/enum/changes/enum.alter.ts +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 +31 -0
- package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
- package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -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 +372 -0
- package/src/core/objects/type/enum/enum.diff.ts +308 -0
- package/src/core/objects/type/enum/enum.model.ts +194 -0
- package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
- package/src/core/objects/type/range/changes/range.alter.ts +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 +54 -0
- package/src/core/objects/type/range/changes/range.create.ts +155 -0
- package/src/core/objects/type/range/changes/range.drop.test.ts +28 -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 +147 -0
- package/src/core/objects/type/range/range.diff.ts +197 -0
- package/src/core/objects/type/range/range.model.ts +187 -0
- package/src/core/objects/type/type.types.ts +5 -0
- package/src/core/objects/utils.ts +171 -0
- package/src/core/objects/view/changes/view.alter.test.ts +115 -0
- package/src/core/objects/view/changes/view.alter.ts +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 +70 -0
- package/src/core/objects/view/changes/view.create.ts +73 -0
- package/src/core/objects/view/changes/view.drop.test.ts +37 -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 +173 -0
- package/src/core/objects/view/view.diff.ts +215 -0
- package/src/core/objects/view/view.model.ts +262 -0
- package/src/core/plan/apply.ts +172 -0
- package/src/core/plan/create.ts +384 -0
- package/src/core/plan/hierarchy.ts +574 -0
- package/src/core/plan/index.ts +29 -0
- package/src/core/plan/io.ts +20 -0
- package/src/core/plan/risk.ts +48 -0
- package/src/core/plan/serialize.test.ts +317 -0
- package/src/core/plan/serialize.ts +209 -0
- package/src/core/plan/sql-format/constants.ts +13 -0
- package/src/core/plan/sql-format/fixtures.ts +2803 -0
- package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
- package/src/core/plan/sql-format/format-functions.test.ts +127 -0
- package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
- package/src/core/plan/sql-format/format-off.test.ts +806 -0
- package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
- package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
- package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
- package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
- package/src/core/plan/sql-format/format-stress.test.ts +616 -0
- package/src/core/plan/sql-format/format-utils.test.ts +91 -0
- package/src/core/plan/sql-format/format-utils.ts +391 -0
- package/src/core/plan/sql-format/formatters.ts +921 -0
- package/src/core/plan/sql-format/index.ts +149 -0
- package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
- package/src/core/plan/sql-format/keyword-case.ts +1120 -0
- package/src/core/plan/sql-format/protect.test.ts +127 -0
- package/src/core/plan/sql-format/protect.ts +337 -0
- package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
- package/src/core/plan/sql-format/sql-scanner.ts +252 -0
- package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
- package/src/core/plan/sql-format/tokenizer.ts +152 -0
- package/src/core/plan/sql-format/types.ts +31 -0
- package/src/core/plan/sql-format/wrap.test.ts +119 -0
- package/src/core/plan/sql-format/wrap.ts +196 -0
- package/src/core/plan/sql-format.ts +2 -0
- package/src/core/plan/ssl-config.ts +172 -0
- package/src/core/plan/statements.ts +22 -0
- package/src/core/plan/types.ts +171 -0
- package/src/core/postgres-config.ts +293 -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 +235 -0
- package/src/core/sort/graph-utils.ts +51 -0
- package/src/core/sort/logical-sort.test.ts +371 -0
- package/src/core/sort/logical-sort.ts +597 -0
- package/src/core/sort/sort-changes.ts +234 -0
- package/src/core/sort/topological-sort.test.ts +275 -0
- package/src/core/sort/topological-sort.ts +184 -0
- package/src/core/sort/types.ts +112 -0
- package/src/core/sort/utils.ts +69 -0
- package/src/core/test-utils/assert-valid-sql.ts +20 -0
- package/src/index.ts +41 -0
- package/dist/core/index.d.ts +0 -15
- package/dist/core/index.js +0 -14
- package/dist/core/main.d.ts +0 -5
- package/dist/core/main.js +0 -44
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { diffObjects } from "../base.diff.js";
|
|
2
2
|
import { deepEqual } from "../utils.js";
|
|
3
|
-
import { AlterPublicationAddSchemas, AlterPublicationAddTables, AlterPublicationDropSchemas, AlterPublicationDropTables,
|
|
3
|
+
import { AlterPublicationAddSchemas, AlterPublicationAddTables, AlterPublicationDropSchemas, AlterPublicationDropTables, AlterPublicationSetOptions, AlterPublicationSetOwner, } from "./changes/publication.alter.js";
|
|
4
4
|
import { CreateCommentOnPublication, DropCommentOnPublication, } from "./changes/publication.comment.js";
|
|
5
5
|
import { CreatePublication } from "./changes/publication.create.js";
|
|
6
6
|
import { DropPublication } from "./changes/publication.drop.js";
|
|
@@ -52,21 +52,16 @@ export function diffPublications(ctx, main, branch) {
|
|
|
52
52
|
let handledObjectLists = false;
|
|
53
53
|
if (mainPublication.all_tables !== branchPublication.all_tables) {
|
|
54
54
|
handledObjectLists = true;
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
// Changing the all_tables mode requires DROP + CREATE because
|
|
56
|
+
// ALTER PUBLICATION does not support SET ALL TABLES.
|
|
57
|
+
changes.push(new DropPublication({ publication: mainPublication }));
|
|
58
|
+
changes.push(new CreatePublication({ publication: branchPublication }));
|
|
59
|
+
if (branchPublication.comment !== null) {
|
|
60
|
+
changes.push(new CreateCommentOnPublication({
|
|
57
61
|
publication: branchPublication,
|
|
58
62
|
}));
|
|
59
63
|
}
|
|
60
|
-
|
|
61
|
-
changes.push(new DropPublication({ publication: mainPublication }));
|
|
62
|
-
changes.push(new CreatePublication({ publication: branchPublication }));
|
|
63
|
-
if (branchPublication.comment !== null) {
|
|
64
|
-
changes.push(new CreateCommentOnPublication({
|
|
65
|
-
publication: branchPublication,
|
|
66
|
-
}));
|
|
67
|
-
}
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
64
|
+
continue;
|
|
70
65
|
}
|
|
71
66
|
if (!handledObjectLists && !branchPublication.all_tables) {
|
|
72
67
|
const tableDiff = diffPublicationTables(mainPublication.tables, branchPublication.tables);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Pool } from "pg";
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel } from "../base.model.ts";
|
|
4
4
|
declare const publicationTablePropsSchema: z.ZodObject<{
|
|
@@ -92,5 +92,5 @@ export declare class Publication extends BasePgModel {
|
|
|
92
92
|
/**
|
|
93
93
|
* Extract all logical replication publications from the database.
|
|
94
94
|
*/
|
|
95
|
-
export declare function extractPublications(
|
|
95
|
+
export declare function extractPublications(pool: Pool): Promise<Publication[]>;
|
|
96
96
|
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sql } from "@ts-safeql/sql-tag";
|
|
1
2
|
import z from "zod";
|
|
2
3
|
import { BasePgModel } from "../base.model.js";
|
|
3
4
|
const publicationTablePropsSchema = z.object({
|
|
@@ -104,10 +105,8 @@ export class Publication extends BasePgModel {
|
|
|
104
105
|
/**
|
|
105
106
|
* Extract all logical replication publications from the database.
|
|
106
107
|
*/
|
|
107
|
-
export async function extractPublications(
|
|
108
|
-
|
|
109
|
-
await tx `set search_path = ''`;
|
|
110
|
-
const rows = await tx `
|
|
108
|
+
export async function extractPublications(pool) {
|
|
109
|
+
const { rows } = await pool.query(sql `
|
|
111
110
|
with extension_oids as (
|
|
112
111
|
select objid
|
|
113
112
|
from pg_depend d
|
|
@@ -178,9 +177,8 @@ export async function extractPublications(sql) {
|
|
|
178
177
|
from pg_publication p
|
|
179
178
|
left join extension_oids e on e.objid = p.oid
|
|
180
179
|
where e.objid is null
|
|
181
|
-
order by 1
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
});
|
|
180
|
+
order by 1
|
|
181
|
+
`);
|
|
182
|
+
const validated = rows.map((row) => publicationPropsSchema.parse(row));
|
|
183
|
+
return validated.map((row) => new Publication(row));
|
|
186
184
|
}
|
|
@@ -21,7 +21,7 @@ export class AlterRlsPolicySetRoles extends AlterRlsPolicyChange {
|
|
|
21
21
|
const rolesSql = toPublic ? "PUBLIC" : targetRoles.join(", ");
|
|
22
22
|
return [
|
|
23
23
|
"ALTER POLICY",
|
|
24
|
-
|
|
24
|
+
this.policy.name,
|
|
25
25
|
"ON",
|
|
26
26
|
`${this.policy.schema}.${this.policy.table_name}`,
|
|
27
27
|
"TO",
|
|
@@ -48,7 +48,7 @@ export class AlterRlsPolicySetUsingExpression extends AlterRlsPolicyChange {
|
|
|
48
48
|
const expr = this.usingExpression ?? "true";
|
|
49
49
|
return [
|
|
50
50
|
"ALTER POLICY",
|
|
51
|
-
|
|
51
|
+
this.policy.name,
|
|
52
52
|
"ON",
|
|
53
53
|
`${this.policy.schema}.${this.policy.table_name}`,
|
|
54
54
|
"USING",
|
|
@@ -75,7 +75,7 @@ export class AlterRlsPolicySetWithCheckExpression extends AlterRlsPolicyChange {
|
|
|
75
75
|
const expr = this.withCheckExpression ?? "true";
|
|
76
76
|
return [
|
|
77
77
|
"ALTER POLICY",
|
|
78
|
-
|
|
78
|
+
this.policy.name,
|
|
79
79
|
"ON",
|
|
80
80
|
`${this.policy.schema}.${this.policy.table_name}`,
|
|
81
81
|
"WITH CHECK",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Pool } from "pg";
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel } from "../base.model.ts";
|
|
4
4
|
declare const rlsPolicyPropsSchema: z.ZodObject<{
|
|
@@ -48,5 +48,5 @@ export declare class RlsPolicy extends BasePgModel {
|
|
|
48
48
|
comment: string | null;
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
|
-
export declare function extractRlsPolicies(
|
|
51
|
+
export declare function extractRlsPolicies(pool: Pool): Promise<RlsPolicy[]>;
|
|
52
52
|
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sql } from "@ts-safeql/sql-tag";
|
|
1
2
|
import z from "zod";
|
|
2
3
|
import { BasePgModel } from "../base.model.js";
|
|
3
4
|
const RlsPolicyCommandSchema = z.enum([
|
|
@@ -67,10 +68,8 @@ export class RlsPolicy extends BasePgModel {
|
|
|
67
68
|
};
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
|
-
export async function extractRlsPolicies(
|
|
71
|
-
|
|
72
|
-
await sql `set search_path = ''`;
|
|
73
|
-
const policyRows = await sql `
|
|
71
|
+
export async function extractRlsPolicies(pool) {
|
|
72
|
+
const { rows: policyRows } = await pool.query(sql `
|
|
74
73
|
with extension_policy_oids as (
|
|
75
74
|
select
|
|
76
75
|
objid
|
|
@@ -118,10 +117,9 @@ from
|
|
|
118
117
|
and e_policy.objid is null
|
|
119
118
|
and e_table.objid is null
|
|
120
119
|
order by
|
|
121
|
-
1, 2
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
});
|
|
120
|
+
1, 2
|
|
121
|
+
`);
|
|
122
|
+
// Validate and parse each row using the Zod schema
|
|
123
|
+
const validatedRows = policyRows.map((row) => rlsPolicyPropsSchema.parse(row));
|
|
124
|
+
return validatedRows.map((row) => new RlsPolicy(row));
|
|
127
125
|
}
|
|
@@ -31,8 +31,15 @@ export function diffRoles(ctx, main, branch) {
|
|
|
31
31
|
if (role.comment !== null) {
|
|
32
32
|
changes.push(new CreateCommentOnRole({ role }));
|
|
33
33
|
}
|
|
34
|
-
// MEMBERSHIPS: Grant memberships immediately after role creation
|
|
34
|
+
// MEMBERSHIPS: Grant memberships immediately after role creation.
|
|
35
|
+
// Members are already deduplicated by the Role model constructor.
|
|
35
36
|
for (const membership of role.members) {
|
|
37
|
+
// Skip memberships where the member is the grantor (auto-created by
|
|
38
|
+
// CREATE ROLE — re-granting them, especially WITH ADMIN OPTION, fails
|
|
39
|
+
// with "ADMIN option cannot be granted back to your own grantor").
|
|
40
|
+
if (membership.grantor === membership.member) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
36
43
|
changes.push(new GrantRoleMembership({
|
|
37
44
|
role,
|
|
38
45
|
member: membership.member,
|
|
@@ -45,6 +52,8 @@ export function diffRoles(ctx, main, branch) {
|
|
|
45
52
|
}
|
|
46
53
|
// DEFAULT PRIVILEGES: Grant default privileges immediately after role creation
|
|
47
54
|
for (const defaultPriv of role.default_privileges) {
|
|
55
|
+
if (defaultPriv.is_implicit)
|
|
56
|
+
continue;
|
|
48
57
|
if (defaultPriv.privileges.length === 0)
|
|
49
58
|
continue;
|
|
50
59
|
const grantGroups = new Map();
|
|
@@ -163,11 +172,18 @@ export function diffRoles(ctx, main, branch) {
|
|
|
163
172
|
}
|
|
164
173
|
}
|
|
165
174
|
// MEMBERSHIPS
|
|
175
|
+
// Members are already deduplicated by the Role model constructor.
|
|
166
176
|
const mainMembers = new Map(mainRole.members.map((m) => [m.member, m]));
|
|
167
177
|
const branchMembers = new Map(branchRole.members.map((m) => [m.member, m]));
|
|
168
178
|
// Find new members to grant
|
|
169
179
|
for (const [member, membership] of branchMembers) {
|
|
170
180
|
if (!mainMembers.has(member)) {
|
|
181
|
+
// Skip memberships where the member is the grantor (auto-created by
|
|
182
|
+
// CREATE ROLE — re-granting them fails with "ADMIN option cannot be
|
|
183
|
+
// granted back to your own grantor").
|
|
184
|
+
if (membership.grantor === membership.member) {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
171
187
|
changes.push(new GrantRoleMembership({
|
|
172
188
|
role: branchRole,
|
|
173
189
|
member: membership.member,
|
|
@@ -224,6 +240,11 @@ export function diffRoles(ctx, main, branch) {
|
|
|
224
240
|
}));
|
|
225
241
|
}
|
|
226
242
|
if (toGrant.admin || toGrant.inherit || toGrant.set) {
|
|
243
|
+
// Skip granting options back to the grantor (same restriction as
|
|
244
|
+
// for newly created roles).
|
|
245
|
+
if (branchMembership.grantor === branchMembership.member) {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
227
248
|
changes.push(new GrantRoleMembership({
|
|
228
249
|
role: branchRole,
|
|
229
250
|
member: branchMembership.member,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Pool } from "pg";
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel } from "../base.model.ts";
|
|
4
4
|
declare const rolePropsSchema: z.ZodObject<{
|
|
@@ -34,6 +34,7 @@ declare const rolePropsSchema: z.ZodObject<{
|
|
|
34
34
|
privilege: z.ZodString;
|
|
35
35
|
grantable: z.ZodBoolean;
|
|
36
36
|
}, z.z.core.$strip>>;
|
|
37
|
+
is_implicit: z.ZodBoolean;
|
|
37
38
|
}, z.z.core.$strip>>;
|
|
38
39
|
}, z.z.core.$strip>;
|
|
39
40
|
export type RoleProps = z.infer<typeof rolePropsSchema>;
|
|
@@ -85,5 +86,5 @@ export declare class Role extends BasePgModel {
|
|
|
85
86
|
}[];
|
|
86
87
|
};
|
|
87
88
|
}
|
|
88
|
-
export declare function extractRoles(
|
|
89
|
+
export declare function extractRoles(pool: Pool): Promise<Role[]>;
|
|
89
90
|
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sql } from "@ts-safeql/sql-tag";
|
|
1
2
|
import z from "zod";
|
|
2
3
|
import { BasePgModel } from "../base.model.js";
|
|
3
4
|
const membershipInfoSchema = z.object({
|
|
@@ -12,6 +13,7 @@ const defaultPrivilegeSchema = z.object({
|
|
|
12
13
|
objtype: z.enum(["r", "S", "f", "T", "n"]),
|
|
13
14
|
grantee: z.string(),
|
|
14
15
|
privileges: z.array(z.object({ privilege: z.string(), grantable: z.boolean() })),
|
|
16
|
+
is_implicit: z.boolean(),
|
|
15
17
|
});
|
|
16
18
|
const rolePropsSchema = z.object({
|
|
17
19
|
name: z.string(),
|
|
@@ -57,7 +59,7 @@ export class Role extends BasePgModel {
|
|
|
57
59
|
this.can_bypass_rls = props.can_bypass_rls;
|
|
58
60
|
this.config = props.config;
|
|
59
61
|
this.comment = props.comment;
|
|
60
|
-
this.members = props.members;
|
|
62
|
+
this.members = deduplicateMembers(props.members);
|
|
61
63
|
this.default_privileges = props.default_privileges;
|
|
62
64
|
}
|
|
63
65
|
get stableId() {
|
|
@@ -76,13 +78,16 @@ export class Role extends BasePgModel {
|
|
|
76
78
|
Number(a.inherit_option ?? false) - Number(b.inherit_option ?? false) ||
|
|
77
79
|
Number(a.set_option ?? false) - Number(b.set_option ?? false));
|
|
78
80
|
});
|
|
79
|
-
const sortedDefaultPrivs = [...this.default_privileges].map((dp) =>
|
|
80
|
-
...dp
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
81
|
+
const sortedDefaultPrivs = [...this.default_privileges].map((dp) => {
|
|
82
|
+
const { is_implicit: _, ...rest } = dp;
|
|
83
|
+
return {
|
|
84
|
+
...rest,
|
|
85
|
+
privileges: [...dp.privileges].sort((a, b) => {
|
|
86
|
+
return (a.privilege.localeCompare(b.privilege) ||
|
|
87
|
+
Number(a.grantable) - Number(b.grantable));
|
|
88
|
+
}),
|
|
89
|
+
};
|
|
90
|
+
});
|
|
86
91
|
sortedDefaultPrivs.sort((a, b) => {
|
|
87
92
|
return ((a.in_schema ?? "").localeCompare(b.in_schema ?? "") ||
|
|
88
93
|
a.objtype.localeCompare(b.objtype) ||
|
|
@@ -104,11 +109,49 @@ export class Role extends BasePgModel {
|
|
|
104
109
|
};
|
|
105
110
|
}
|
|
106
111
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
+
/**
|
|
113
|
+
* Deduplicate members by member name.
|
|
114
|
+
*
|
|
115
|
+
* In PostgreSQL 16+, `pg_auth_members` can have multiple rows for the same
|
|
116
|
+
* (roleid, member) pair with different grantors. Merge them into a single
|
|
117
|
+
* entry per member, combining options with OR so the most permissive wins.
|
|
118
|
+
*
|
|
119
|
+
* When merging, prefer a non-self grantor (grantor !== member) so that
|
|
120
|
+
* downstream code can detect true self-grants (auto-created by CREATE ROLE)
|
|
121
|
+
* by checking `grantor === member`.
|
|
122
|
+
*/
|
|
123
|
+
function deduplicateMembers(members) {
|
|
124
|
+
const map = new Map();
|
|
125
|
+
for (const m of members) {
|
|
126
|
+
const existing = map.get(m.member);
|
|
127
|
+
if (existing) {
|
|
128
|
+
// admin_option is always boolean (non-nullable in schema)
|
|
129
|
+
existing.admin_option = existing.admin_option || m.admin_option;
|
|
130
|
+
// inherit_option and set_option are nullish (only available in PG 16+)
|
|
131
|
+
if (m.inherit_option != null) {
|
|
132
|
+
existing.inherit_option =
|
|
133
|
+
(existing.inherit_option ?? false) || m.inherit_option;
|
|
134
|
+
}
|
|
135
|
+
if (m.set_option != null) {
|
|
136
|
+
existing.set_option = (existing.set_option ?? false) || m.set_option;
|
|
137
|
+
}
|
|
138
|
+
// Prefer a non-self grantor so diff can detect true self-grants.
|
|
139
|
+
// Once a non-self grantor is chosen the value is kept (the specific
|
|
140
|
+
// non-self grantor doesn't matter — only the self vs non-self
|
|
141
|
+
// distinction is used downstream).
|
|
142
|
+
if (existing.grantor === existing.member && m.grantor !== m.member) {
|
|
143
|
+
existing.grantor = m.grantor;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
map.set(m.member, { ...m });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return [...map.values()];
|
|
151
|
+
}
|
|
152
|
+
export async function extractRoles(pool) {
|
|
153
|
+
// Check PostgreSQL version capabilities for membership options
|
|
154
|
+
const { rows: capabilitiesRows } = await pool.query(sql `
|
|
112
155
|
select
|
|
113
156
|
exists (
|
|
114
157
|
select 1
|
|
@@ -122,23 +165,25 @@ export async function extractRoles(sql) {
|
|
|
122
165
|
where attrelid = 'pg_auth_members'::regclass
|
|
123
166
|
and attname = 'set_option'
|
|
124
167
|
) as has_set
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
168
|
+
`);
|
|
169
|
+
const capabilities = capabilitiesRows[0];
|
|
170
|
+
let roleRows;
|
|
171
|
+
if (capabilities?.has_inherit && capabilities?.has_set) {
|
|
172
|
+
const result = await pool.query(sql `
|
|
128
173
|
WITH role_memberships AS (
|
|
129
|
-
SELECT
|
|
174
|
+
SELECT
|
|
130
175
|
r.rolname AS role_name,
|
|
131
176
|
json_agg(
|
|
132
177
|
json_build_object(
|
|
133
178
|
'member', m.rolname,
|
|
134
179
|
'grantor', g.rolname,
|
|
135
180
|
'admin_option', am.admin_option,
|
|
136
|
-
'inherit_option', am.inherit_option,
|
|
137
|
-
'set_option', am.set_option
|
|
181
|
+
'inherit_option', am.inherit_option,
|
|
182
|
+
'set_option', am.set_option
|
|
138
183
|
)
|
|
139
184
|
) FILTER (WHERE m.rolname IS NOT NULL) AS members
|
|
140
185
|
FROM pg_catalog.pg_roles r
|
|
141
|
-
LEFT JOIN pg_auth_members am ON am.roleid = r.oid
|
|
186
|
+
LEFT JOIN pg_auth_members am ON am.roleid = r.oid
|
|
142
187
|
LEFT JOIN pg_roles m ON m.oid = am.member
|
|
143
188
|
LEFT JOIN pg_roles g ON g.oid = am.grantor
|
|
144
189
|
GROUP BY r.rolname
|
|
@@ -171,13 +216,15 @@ export async function extractRoles(sql) {
|
|
|
171
216
|
THEN 'PUBLIC'
|
|
172
217
|
ELSE s.grantee::regrole::text
|
|
173
218
|
END,
|
|
174
|
-
'privileges', s.privileges
|
|
219
|
+
'privileges', s.privileges,
|
|
220
|
+
'is_implicit', s.is_implicit
|
|
175
221
|
)
|
|
176
222
|
ORDER BY s.defaclnamespace NULLS FIRST,
|
|
177
223
|
s.defaclobjtype,
|
|
178
224
|
s.grantee
|
|
179
225
|
)
|
|
180
226
|
FROM (
|
|
227
|
+
-- Explicit entries from pg_default_acl
|
|
181
228
|
SELECT
|
|
182
229
|
d.defaclnamespace,
|
|
183
230
|
d.defaclobjtype,
|
|
@@ -188,12 +235,41 @@ export async function extractRoles(sql) {
|
|
|
188
235
|
'grantable', x.is_grantable
|
|
189
236
|
)
|
|
190
237
|
ORDER BY x.privilege_type, x.is_grantable
|
|
191
|
-
) AS privileges
|
|
238
|
+
) AS privileges,
|
|
239
|
+
false AS is_implicit
|
|
192
240
|
FROM pg_default_acl d
|
|
193
241
|
CROSS JOIN LATERAL aclexplode(COALESCE(d.defaclacl, ARRAY[]::aclitem[]))
|
|
194
242
|
AS x(grantor, grantee, privilege_type, is_grantable)
|
|
195
243
|
WHERE d.defaclrole = r.oid
|
|
196
244
|
GROUP BY d.defaclnamespace, d.defaclobjtype, x.grantee
|
|
245
|
+
UNION ALL
|
|
246
|
+
-- Implicit defaults from acldefault() for objtypes without a
|
|
247
|
+
-- global pg_default_acl entry. PostgreSQL applies these implicit
|
|
248
|
+
-- defaults (e.g. PUBLIC gets EXECUTE on functions) when no
|
|
249
|
+
-- explicit ALTER DEFAULT PRIVILEGES has been issued. Including
|
|
250
|
+
-- them lets the diff detect REVOKEs of implicit grants.
|
|
251
|
+
SELECT
|
|
252
|
+
0 AS defaclnamespace,
|
|
253
|
+
v.t::"char" AS defaclobjtype,
|
|
254
|
+
x.grantee,
|
|
255
|
+
json_agg(
|
|
256
|
+
json_build_object(
|
|
257
|
+
'privilege', x.privilege_type,
|
|
258
|
+
'grantable', x.is_grantable
|
|
259
|
+
)
|
|
260
|
+
ORDER BY x.privilege_type, x.is_grantable
|
|
261
|
+
) AS privileges,
|
|
262
|
+
true AS is_implicit
|
|
263
|
+
FROM (VALUES ('r'), ('S'), ('f'), ('T'), ('n')) AS v(t)
|
|
264
|
+
CROSS JOIN LATERAL aclexplode(acldefault(v.t::"char", r.oid))
|
|
265
|
+
AS x(grantor, grantee, privilege_type, is_grantable)
|
|
266
|
+
WHERE NOT EXISTS (
|
|
267
|
+
SELECT 1 FROM pg_default_acl d2
|
|
268
|
+
WHERE d2.defaclrole = r.oid
|
|
269
|
+
AND d2.defaclobjtype = v.t::"char"
|
|
270
|
+
AND d2.defaclnamespace = 0
|
|
271
|
+
)
|
|
272
|
+
GROUP BY v.t, x.grantee
|
|
197
273
|
) AS s
|
|
198
274
|
),
|
|
199
275
|
'[]'
|
|
@@ -201,9 +277,7 @@ export async function extractRoles(sql) {
|
|
|
201
277
|
FROM pg_catalog.pg_roles r
|
|
202
278
|
LEFT JOIN role_memberships rm ON rm.role_name = r.rolname
|
|
203
279
|
WHERE
|
|
204
|
-
-- 1) drop built-in/internal roles (anything starting with pg_)
|
|
205
280
|
r.rolname !~ '^pg_'
|
|
206
|
-
-- 2) drop roles directly tracked as extension members in pg_shdepend (if any)
|
|
207
281
|
AND NOT EXISTS (
|
|
208
282
|
SELECT 1
|
|
209
283
|
FROM pg_catalog.pg_shdepend d
|
|
@@ -212,24 +286,26 @@ export async function extractRoles(sql) {
|
|
|
212
286
|
AND d.refclassid = 'pg_extension'::regclass
|
|
213
287
|
AND d.deptype IN ('e','x')
|
|
214
288
|
)
|
|
215
|
-
ORDER BY 1
|
|
216
|
-
|
|
217
|
-
|
|
289
|
+
ORDER BY 1
|
|
290
|
+
`);
|
|
291
|
+
roleRows = result.rows;
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
const result = await pool.query(sql `
|
|
218
295
|
WITH role_memberships AS (
|
|
219
|
-
SELECT
|
|
296
|
+
SELECT
|
|
220
297
|
r.rolname AS role_name,
|
|
221
298
|
json_agg(
|
|
222
299
|
json_build_object(
|
|
223
300
|
'member', m.rolname,
|
|
224
301
|
'grantor', g.rolname,
|
|
225
302
|
'admin_option', am.admin_option,
|
|
226
|
-
-- PG15: these columns don't exist; emit them as nulls
|
|
227
303
|
'inherit_option', NULL,
|
|
228
304
|
'set_option', NULL
|
|
229
305
|
)
|
|
230
306
|
) FILTER (WHERE m.rolname IS NOT NULL) AS members
|
|
231
307
|
FROM pg_catalog.pg_roles r
|
|
232
|
-
LEFT JOIN pg_auth_members am ON am.roleid = r.oid
|
|
308
|
+
LEFT JOIN pg_auth_members am ON am.roleid = r.oid
|
|
233
309
|
LEFT JOIN pg_roles m ON m.oid = am.member
|
|
234
310
|
LEFT JOIN pg_roles g ON g.oid = am.grantor
|
|
235
311
|
GROUP BY r.rolname
|
|
@@ -262,13 +338,15 @@ export async function extractRoles(sql) {
|
|
|
262
338
|
THEN 'PUBLIC'
|
|
263
339
|
ELSE s.grantee::regrole::text
|
|
264
340
|
END,
|
|
265
|
-
'privileges', s.privileges
|
|
341
|
+
'privileges', s.privileges,
|
|
342
|
+
'is_implicit', s.is_implicit
|
|
266
343
|
)
|
|
267
344
|
ORDER BY s.defaclnamespace NULLS FIRST,
|
|
268
345
|
s.defaclobjtype,
|
|
269
346
|
s.grantee
|
|
270
347
|
)
|
|
271
348
|
FROM (
|
|
349
|
+
-- Explicit entries from pg_default_acl
|
|
272
350
|
SELECT
|
|
273
351
|
d.defaclnamespace,
|
|
274
352
|
d.defaclobjtype,
|
|
@@ -279,12 +357,41 @@ export async function extractRoles(sql) {
|
|
|
279
357
|
'grantable', x.is_grantable
|
|
280
358
|
)
|
|
281
359
|
ORDER BY x.privilege_type, x.is_grantable
|
|
282
|
-
) AS privileges
|
|
360
|
+
) AS privileges,
|
|
361
|
+
false AS is_implicit
|
|
283
362
|
FROM pg_default_acl d
|
|
284
363
|
CROSS JOIN LATERAL aclexplode(COALESCE(d.defaclacl, ARRAY[]::aclitem[]))
|
|
285
364
|
AS x(grantor, grantee, privilege_type, is_grantable)
|
|
286
365
|
WHERE d.defaclrole = r.oid
|
|
287
366
|
GROUP BY d.defaclnamespace, d.defaclobjtype, x.grantee
|
|
367
|
+
UNION ALL
|
|
368
|
+
-- Implicit defaults from acldefault() for objtypes without a
|
|
369
|
+
-- global pg_default_acl entry. PostgreSQL applies these implicit
|
|
370
|
+
-- defaults (e.g. PUBLIC gets EXECUTE on functions) when no
|
|
371
|
+
-- explicit ALTER DEFAULT PRIVILEGES has been issued. Including
|
|
372
|
+
-- them lets the diff detect REVOKEs of implicit grants.
|
|
373
|
+
SELECT
|
|
374
|
+
0 AS defaclnamespace,
|
|
375
|
+
v.t::"char" AS defaclobjtype,
|
|
376
|
+
x.grantee,
|
|
377
|
+
json_agg(
|
|
378
|
+
json_build_object(
|
|
379
|
+
'privilege', x.privilege_type,
|
|
380
|
+
'grantable', x.is_grantable
|
|
381
|
+
)
|
|
382
|
+
ORDER BY x.privilege_type, x.is_grantable
|
|
383
|
+
) AS privileges,
|
|
384
|
+
true AS is_implicit
|
|
385
|
+
FROM (VALUES ('r'), ('S'), ('f'), ('T'), ('n')) AS v(t)
|
|
386
|
+
CROSS JOIN LATERAL aclexplode(acldefault(v.t::"char", r.oid))
|
|
387
|
+
AS x(grantor, grantee, privilege_type, is_grantable)
|
|
388
|
+
WHERE NOT EXISTS (
|
|
389
|
+
SELECT 1 FROM pg_default_acl d2
|
|
390
|
+
WHERE d2.defaclrole = r.oid
|
|
391
|
+
AND d2.defaclobjtype = v.t::"char"
|
|
392
|
+
AND d2.defaclnamespace = 0
|
|
393
|
+
)
|
|
394
|
+
GROUP BY v.t, x.grantee
|
|
288
395
|
) AS s
|
|
289
396
|
),
|
|
290
397
|
'[]'
|
|
@@ -292,9 +399,7 @@ export async function extractRoles(sql) {
|
|
|
292
399
|
FROM pg_catalog.pg_roles r
|
|
293
400
|
LEFT JOIN role_memberships rm ON rm.role_name = r.rolname
|
|
294
401
|
WHERE
|
|
295
|
-
-- drop built-in/internal roles
|
|
296
402
|
r.rolname !~ '^pg_'
|
|
297
|
-
-- drop roles directly tracked as extension members in pg_shdepend (if any)
|
|
298
403
|
AND NOT EXISTS (
|
|
299
404
|
SELECT 1
|
|
300
405
|
FROM pg_catalog.pg_shdepend d
|
|
@@ -303,10 +408,11 @@ export async function extractRoles(sql) {
|
|
|
303
408
|
AND d.refclassid = 'pg_extension'::regclass
|
|
304
409
|
AND d.deptype IN ('e','x')
|
|
305
410
|
)
|
|
306
|
-
ORDER BY 1
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
411
|
+
ORDER BY 1
|
|
412
|
+
`);
|
|
413
|
+
roleRows = result.rows;
|
|
414
|
+
}
|
|
415
|
+
// Validate and parse each row using the Zod schema
|
|
416
|
+
const validatedRows = roleRows.map((row) => rolePropsSchema.parse(row));
|
|
417
|
+
return validatedRows.map((row) => new Role(row));
|
|
312
418
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Pool } from "pg";
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel } from "../base.model.ts";
|
|
4
4
|
declare const RuleEnabledStateSchema: z.ZodEnum<{
|
|
@@ -68,5 +68,5 @@ export declare class Rule extends BasePgModel {
|
|
|
68
68
|
};
|
|
69
69
|
get relationStableId(): string;
|
|
70
70
|
}
|
|
71
|
-
export declare function extractRules(
|
|
71
|
+
export declare function extractRules(pool: Pool): Promise<Rule[]>;
|
|
72
72
|
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sql } from "@ts-safeql/sql-tag";
|
|
1
2
|
import z from "zod";
|
|
2
3
|
import { BasePgModel } from "../base.model.js";
|
|
3
4
|
import { stableId } from "../utils.js";
|
|
@@ -81,10 +82,8 @@ export class Rule extends BasePgModel {
|
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
|
-
export async function extractRules(
|
|
85
|
-
|
|
86
|
-
await sql `set search_path = ''`;
|
|
87
|
-
const ruleRows = await sql `
|
|
85
|
+
export async function extractRules(pool) {
|
|
86
|
+
const { rows: ruleRows } = await pool.query(sql `
|
|
88
87
|
WITH extension_rule_oids AS (
|
|
89
88
|
SELECT
|
|
90
89
|
objid
|
|
@@ -148,9 +147,8 @@ export async function extractRules(sql) {
|
|
|
148
147
|
AND e_rel.objid IS NULL
|
|
149
148
|
AND r.rulename <> '_RETURN'
|
|
150
149
|
ORDER BY
|
|
151
|
-
1, 3, 2
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
});
|
|
150
|
+
1, 3, 2
|
|
151
|
+
`);
|
|
152
|
+
const validatedRows = ruleRows.map((row) => rulePropsSchema.parse(row));
|
|
153
|
+
return validatedRows.map((row) => new Rule(row));
|
|
156
154
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { Role } from "../role/role.model.ts";
|
|
1
|
+
import type { ObjectDiffContext } from "../diff-context.ts";
|
|
3
2
|
import type { SchemaChange } from "./changes/schema.types.ts";
|
|
4
3
|
import type { Schema } from "./schema.model.ts";
|
|
5
4
|
/**
|
|
@@ -10,9 +9,4 @@ import type { Schema } from "./schema.model.ts";
|
|
|
10
9
|
* @param branch - The schemas in the branch catalog.
|
|
11
10
|
* @returns A list of changes to apply to main to make it match branch.
|
|
12
11
|
*/
|
|
13
|
-
export declare function diffSchemas(ctx:
|
|
14
|
-
version: number;
|
|
15
|
-
currentUser: string;
|
|
16
|
-
defaultPrivilegeState: DefaultPrivilegeState;
|
|
17
|
-
mainRoles: Record<string, Role>;
|
|
18
|
-
}, main: Record<string, Schema>, branch: Record<string, Schema>): SchemaChange[];
|
|
12
|
+
export declare function diffSchemas(ctx: Pick<ObjectDiffContext, "version" | "currentUser" | "defaultPrivilegeState">, main: Record<string, Schema>, branch: Record<string, Schema>): SchemaChange[];
|