@supabase/pg-delta 1.0.0-alpha.1 → 1.0.0-alpha.11
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 +240 -0
- package/dist/cli/commands/plan.js +47 -16
- package/dist/cli/commands/sync.js +8 -12
- 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 +30 -6
- package/dist/cli/utils/integrations.js +98 -6
- 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/change-utils.d.ts +9 -0
- package/dist/core/change-utils.js +71 -0
- package/dist/core/change.types.d.ts +22 -0
- package/dist/core/change.types.js +37 -1
- package/dist/core/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 +33 -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/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/dist/core/integrations/filter/dsl.d.ts +82 -41
- package/dist/core/integrations/filter/dsl.js +127 -61
- package/dist/core/integrations/filter/flatten.d.ts +51 -0
- package/dist/core/integrations/filter/flatten.js +116 -0
- package/dist/core/integrations/integration-dsl.d.ts +27 -1
- package/dist/core/integrations/merge.d.ts +20 -0
- package/dist/core/integrations/merge.js +60 -0
- package/dist/core/integrations/serialize/dsl.d.ts +7 -4
- package/dist/core/integrations/serialize/dsl.js +2 -2
- package/dist/core/integrations/supabase.d.ts +8 -0
- package/dist/core/integrations/supabase.js +34 -8
- 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 +10 -10
- 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/aggregate/changes/aggregate.types.d.ts +1 -0
- package/dist/core/objects/base.change.d.ts +10 -0
- package/dist/core/objects/base.change.js +10 -0
- package/dist/core/objects/base.model.d.ts +4 -1
- package/dist/core/objects/base.model.js +5 -2
- package/dist/core/objects/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/changes/collation.types.d.ts +1 -0
- 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.d.ts +1 -1
- package/dist/core/objects/domain/changes/domain.create.js +11 -3
- package/dist/core/objects/domain/changes/domain.types.d.ts +1 -0
- 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/changes/event-trigger.types.d.ts +1 -0
- 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/changes/extension.types.d.ts +1 -0
- 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/changes/foreign-data-wrapper.types.d.ts +1 -0
- 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-data-wrapper.types.d.ts +1 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +1 -0
- 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/changes/server.types.d.ts +1 -0
- 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/changes/user-mapping.types.d.ts +1 -0
- 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/changes/index.types.d.ts +1 -0
- 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/changes/language.types.d.ts +1 -0
- 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/changes/materialized-view.types.d.ts +1 -0
- 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 +5 -5
- 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/changes/procedure.types.d.ts +1 -0
- 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 +11 -11
- 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 +3 -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/changes/rls-policy.types.d.ts +1 -0
- package/dist/core/objects/rls-policy/rls-policy.model.d.ts +4 -4
- package/dist/core/objects/rls-policy/rls-policy.model.js +8 -10
- package/dist/core/objects/role/changes/role.types.d.ts +1 -0
- package/dist/core/objects/role/role.diff.js +22 -1
- package/dist/core/objects/role/role.model.d.ts +6 -5
- package/dist/core/objects/role/role.model.js +146 -40
- package/dist/core/objects/rule/changes/rule.types.d.ts +1 -0
- package/dist/core/objects/rule/rule.model.d.ts +3 -3
- package/dist/core/objects/rule/rule.model.js +7 -9
- package/dist/core/objects/schema/changes/schema.types.d.ts +1 -0
- 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/changes/sequence.types.d.ts +1 -0
- 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/changes/subscription.types.d.ts +1 -0
- 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/changes/table.types.d.ts +1 -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 +27 -24
- 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/changes/trigger.types.d.ts +1 -0
- 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/changes/composite-type.types.d.ts +1 -0
- 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 +5 -5
- package/dist/core/objects/type/composite-type/composite-type.model.js +10 -11
- package/dist/core/objects/type/enum/changes/enum.types.d.ts +1 -0
- 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/changes/range.types.d.ts +1 -0
- 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/type/type.types.d.ts +1 -0
- package/dist/core/objects/view/changes/view.types.d.ts +1 -0
- package/dist/core/objects/view/view.diff.d.ts +2 -8
- package/dist/core/objects/view/view.diff.js +37 -168
- package/dist/core/objects/view/view.model.d.ts +20 -6
- 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/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 +6 -0
- package/dist/core/postgres-config.d.ts +47 -3
- package/dist/core/postgres-config.js +225 -39
- package/dist/core/sort/custom-constraints.js +1 -1
- package/dist/core/sort/graph-builder.js +10 -0
- package/dist/core/sort/logical-sort.js +34 -47
- 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 +9 -0
- package/dist/index.js +9 -1
- package/package.json +60 -22
- 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 +322 -0
- package/src/cli/commands/plan.ts +210 -0
- package/src/cli/commands/sync.ts +178 -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 +251 -0
- package/src/cli/utils/integrations.ts +170 -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 +486 -0
- package/src/core/catalog.snapshot.ts +289 -0
- package/src/core/change-utils.test.ts +61 -0
- package/src/core/change-utils.ts +73 -0
- package/src/core/change.types.ts +94 -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 +1895 -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 +579 -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 +450 -0
- package/src/core/integrations/filter/dsl.ts +305 -0
- package/src/core/integrations/filter/filter.types.ts +3 -0
- package/src/core/integrations/filter/flatten.test.ts +282 -0
- package/src/core/integrations/filter/flatten.ts +150 -0
- package/src/core/integrations/integration-dsl.ts +50 -0
- package/src/core/integrations/integration.types.ts +7 -0
- package/src/core/integrations/merge.test.ts +128 -0
- package/src/core/integrations/merge.ts +72 -0
- package/src/core/integrations/serialize/dsl.test.ts +91 -0
- package/src/core/integrations/serialize/dsl.ts +80 -0
- package/src/core/integrations/serialize/serialize.types.ts +3 -0
- package/src/core/integrations/supabase.ts +145 -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 +13 -0
- package/src/core/objects/base.change.ts +72 -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.test.ts +43 -0
- package/src/core/objects/base.model.ts +85 -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 +11 -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 +140 -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 +13 -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 +11 -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 +11 -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 +13 -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 +11 -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 +13 -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 +13 -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 +9 -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 +7 -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 +13 -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 +13 -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 +13 -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 +25 -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 +11 -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 +13 -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 +13 -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 +13 -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 +13 -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 +23 -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 +13 -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 +11 -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 +13 -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 +13 -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 +13 -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 +6 -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 +13 -0
- package/src/core/objects/view/view.diff.test.ts +269 -0
- package/src/core/objects/view/view.diff.ts +230 -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 +573 -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/src/typedoc.ts +248 -0
- package/dist/core/integrations/filter/extractors.d.ts +0 -12
- package/dist/core/integrations/filter/extractors.js +0 -136
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
import z from "zod";
|
|
2
|
+
import type { Change } from "../change.types.ts";
|
|
3
|
+
import type { BaseChange } from "./base.change.ts";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Privilege properties that all privilege objects share.
|
|
7
|
+
*/
|
|
8
|
+
export const privilegePropsSchema = z.object({
|
|
9
|
+
grantee: z.string(),
|
|
10
|
+
privilege: z.string(),
|
|
11
|
+
grantable: z.boolean(),
|
|
12
|
+
columns: z.array(z.string()).nullable().optional(),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export type PrivilegeProps = z.infer<typeof privilegePropsSchema>;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Result of privilege diffing for a single grantee
|
|
19
|
+
*/
|
|
20
|
+
interface PrivilegeDiffResult<T extends PrivilegeProps> {
|
|
21
|
+
grants: T[];
|
|
22
|
+
revokes: T[];
|
|
23
|
+
revokeGrantOption: string[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Groups privileges by grantee for efficient diffing
|
|
28
|
+
*/
|
|
29
|
+
function groupPrivilegesByGrantee<T extends PrivilegeProps>(
|
|
30
|
+
privileges: T[],
|
|
31
|
+
): Map<string, T[]> {
|
|
32
|
+
const byGrantee = new Map<string, T[]>();
|
|
33
|
+
|
|
34
|
+
for (const privilege of privileges) {
|
|
35
|
+
const existing = byGrantee.get(privilege.grantee) || [];
|
|
36
|
+
existing.push(privilege);
|
|
37
|
+
byGrantee.set(privilege.grantee, existing);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return byGrantee;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Diffs privileges for a single grantee between main and branch
|
|
45
|
+
*/
|
|
46
|
+
function diffPrivilegesForGrantee<T extends PrivilegeProps>(
|
|
47
|
+
mainPrivs: T[],
|
|
48
|
+
branchPrivs: T[],
|
|
49
|
+
): PrivilegeDiffResult<T> {
|
|
50
|
+
// Create comparison key - always include columns (null for object-level privileges)
|
|
51
|
+
const toKey = (p: T) => {
|
|
52
|
+
const cols = p.columns || [];
|
|
53
|
+
return `${p.privilege}:${p.grantable}:${cols.sort().join(",")}`;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// Create key-to-object mappings to retain original data structures
|
|
57
|
+
const mainKeyToObj = new Map(mainPrivs.map((p) => [toKey(p), p]));
|
|
58
|
+
const branchKeyToObj = new Map(branchPrivs.map((p) => [toKey(p), p]));
|
|
59
|
+
|
|
60
|
+
const aSet = new Set(mainPrivs.map(toKey));
|
|
61
|
+
const bSet = new Set(branchPrivs.map(toKey));
|
|
62
|
+
|
|
63
|
+
const grants: T[] = [];
|
|
64
|
+
const revokes: T[] = [];
|
|
65
|
+
const revokeGrantOption: string[] = [];
|
|
66
|
+
|
|
67
|
+
// Find privileges to grant
|
|
68
|
+
for (const key of bSet) {
|
|
69
|
+
if (!aSet.has(key)) {
|
|
70
|
+
const obj = branchKeyToObj.get(key);
|
|
71
|
+
if (obj) grants.push(obj);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Find privileges to revoke
|
|
76
|
+
for (const key of aSet) {
|
|
77
|
+
if (!bSet.has(key)) {
|
|
78
|
+
const obj = mainKeyToObj.get(key);
|
|
79
|
+
if (!obj) continue;
|
|
80
|
+
|
|
81
|
+
const wasGrantable = obj.grantable;
|
|
82
|
+
|
|
83
|
+
// Upgrade: base -> with grant option (no base revoke)
|
|
84
|
+
const upgradedKey = key.replace(":false", ":true");
|
|
85
|
+
const upgraded = !wasGrantable && bSet.has(upgradedKey);
|
|
86
|
+
if (upgraded) continue;
|
|
87
|
+
|
|
88
|
+
// If only grantable flipped from true to false, emit REVOKE GRANT OPTION FOR
|
|
89
|
+
const stillHasBase = checkStillHasBase(branchPrivs, obj.privilege, key);
|
|
90
|
+
if (wasGrantable && stillHasBase) {
|
|
91
|
+
revokeGrantOption.push(obj.privilege);
|
|
92
|
+
} else {
|
|
93
|
+
revokes.push(obj);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return { grants, revokes, revokeGrantOption };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Check if a privilege still exists in the target set
|
|
103
|
+
*/
|
|
104
|
+
function checkStillHasBase<T extends PrivilegeProps>(
|
|
105
|
+
targetPrivs: T[],
|
|
106
|
+
privilege: string,
|
|
107
|
+
key: string,
|
|
108
|
+
): boolean {
|
|
109
|
+
const [, , columnsStr] = key.split(":");
|
|
110
|
+
return targetPrivs.some(
|
|
111
|
+
(p) =>
|
|
112
|
+
p.privilege === privilege &&
|
|
113
|
+
(p.columns || []).sort().join(",") === columnsStr,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Groups privileges by grantable flag for efficient SQL generation
|
|
119
|
+
*/
|
|
120
|
+
function groupPrivilegesByGrantable<T extends PrivilegeProps>(
|
|
121
|
+
privileges: T[],
|
|
122
|
+
): Map<boolean, T[]> {
|
|
123
|
+
const groups = new Map<boolean, T[]>();
|
|
124
|
+
|
|
125
|
+
for (const privilege of privileges) {
|
|
126
|
+
const arr = groups.get(privilege.grantable) ?? [];
|
|
127
|
+
arr.push(privilege);
|
|
128
|
+
groups.set(privilege.grantable, arr);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return groups;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Groups privileges by columns and grantable flag
|
|
136
|
+
*/
|
|
137
|
+
function groupPrivilegesByColumns<T extends PrivilegeProps>(
|
|
138
|
+
privileges: T[],
|
|
139
|
+
): Map<string, { columns?: string[]; byGrant: Map<boolean, Set<string>> }> {
|
|
140
|
+
const groups = new Map<
|
|
141
|
+
string,
|
|
142
|
+
{ columns?: string[]; byGrant: Map<boolean, Set<string>> }
|
|
143
|
+
>();
|
|
144
|
+
|
|
145
|
+
for (const privilege of privileges) {
|
|
146
|
+
const key = privilege.columns ? privilege.columns.sort().join(",") : "";
|
|
147
|
+
|
|
148
|
+
if (!groups.has(key)) {
|
|
149
|
+
groups.set(key, {
|
|
150
|
+
columns: privilege.columns ? [...privilege.columns] : undefined,
|
|
151
|
+
byGrant: new Map(),
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const group = groups.get(key);
|
|
156
|
+
if (!group) continue;
|
|
157
|
+
|
|
158
|
+
if (!group.byGrant.has(privilege.grantable)) {
|
|
159
|
+
group.byGrant.set(privilege.grantable, new Set());
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const privSet = group.byGrant.get(privilege.grantable);
|
|
163
|
+
if (!privSet) continue;
|
|
164
|
+
|
|
165
|
+
privSet.add(privilege.privilege);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return groups;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Filters out PUBLIC's built-in default privileges that PostgreSQL automatically grants
|
|
173
|
+
* when creating certain object types. This prevents generating unnecessary GRANT statements
|
|
174
|
+
* for privileges that PostgreSQL grants automatically.
|
|
175
|
+
*
|
|
176
|
+
* Reference: PostgreSQL 17 Documentation, Table 5.2 "Summary of Access Privileges"
|
|
177
|
+
* https://www.postgresql.org/docs/17/ddl-priv.html
|
|
178
|
+
*
|
|
179
|
+
* Objects with default PUBLIC privileges:
|
|
180
|
+
* - Functions/Procedures/Aggregates: EXECUTE
|
|
181
|
+
* - Types/Domains/Enums/Ranges/Composite Types: USAGE
|
|
182
|
+
* - Languages: USAGE
|
|
183
|
+
*
|
|
184
|
+
* Objects WITHOUT default PUBLIC privileges (so we should generate GRANT statements):
|
|
185
|
+
* - Tables, Views, Materialized Views, Sequences, Schemas, etc.
|
|
186
|
+
*/
|
|
187
|
+
export function filterPublicBuiltInDefaults<T extends PrivilegeProps>(
|
|
188
|
+
objectType: Change["objectType"],
|
|
189
|
+
privileges: T[],
|
|
190
|
+
): T[] {
|
|
191
|
+
// Only filter PUBLIC privileges
|
|
192
|
+
return privileges.filter((priv) => {
|
|
193
|
+
if (priv.grantee !== "PUBLIC") {
|
|
194
|
+
return true; // Keep all non-PUBLIC privileges
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Check if this is a built-in default privilege for this object type
|
|
198
|
+
switch (objectType) {
|
|
199
|
+
case "procedure":
|
|
200
|
+
case "aggregate":
|
|
201
|
+
// Functions/Procedures/Aggregates: EXECUTE is granted to PUBLIC by default
|
|
202
|
+
// Filter it out so we don't generate unnecessary GRANT EXECUTE TO PUBLIC
|
|
203
|
+
return priv.privilege !== "EXECUTE";
|
|
204
|
+
|
|
205
|
+
case "domain":
|
|
206
|
+
case "enum":
|
|
207
|
+
case "range":
|
|
208
|
+
case "composite_type":
|
|
209
|
+
// Types/Domains/Enums/Ranges/Composite Types: USAGE is granted to PUBLIC by default
|
|
210
|
+
// Filter it out so we don't generate unnecessary GRANT USAGE TO PUBLIC
|
|
211
|
+
return priv.privilege !== "USAGE";
|
|
212
|
+
|
|
213
|
+
case "language":
|
|
214
|
+
// Languages: USAGE is granted to PUBLIC by default
|
|
215
|
+
// Filter it out so we don't generate unnecessary GRANT USAGE TO PUBLIC
|
|
216
|
+
return priv.privilege !== "USAGE";
|
|
217
|
+
|
|
218
|
+
default:
|
|
219
|
+
// For other object types (tables, views, sequences, schemas, etc.),
|
|
220
|
+
// PUBLIC has NO default privileges, so we should keep all PUBLIC privileges
|
|
221
|
+
// and generate GRANT statements for them
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Filter out owner privileges from a privilege list.
|
|
229
|
+
* Owner privileges are implicit (owner always has ALL) and shouldn't be compared.
|
|
230
|
+
*/
|
|
231
|
+
function filterOwnerPrivileges<T extends PrivilegeProps>(
|
|
232
|
+
privileges: T[],
|
|
233
|
+
owner: string,
|
|
234
|
+
): T[] {
|
|
235
|
+
return privileges.filter((p) => p.grantee !== owner);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Generic privilege diffing function that works for any object type
|
|
240
|
+
*/
|
|
241
|
+
export function diffPrivileges<T extends PrivilegeProps>(
|
|
242
|
+
mainPrivileges: T[],
|
|
243
|
+
branchPrivileges: T[],
|
|
244
|
+
owner?: string,
|
|
245
|
+
): Map<string, PrivilegeDiffResult<T>> {
|
|
246
|
+
// Filter out owner privileges if owner is provided
|
|
247
|
+
const mainFiltered = owner
|
|
248
|
+
? filterOwnerPrivileges(mainPrivileges, owner)
|
|
249
|
+
: mainPrivileges;
|
|
250
|
+
const branchFiltered = owner
|
|
251
|
+
? filterOwnerPrivileges(branchPrivileges, owner)
|
|
252
|
+
: branchPrivileges;
|
|
253
|
+
|
|
254
|
+
const mainByGrantee = groupPrivilegesByGrantee(mainFiltered);
|
|
255
|
+
const branchByGrantee = groupPrivilegesByGrantee(branchFiltered);
|
|
256
|
+
|
|
257
|
+
// Get all grantees
|
|
258
|
+
const allGrantees = new Set([
|
|
259
|
+
...mainByGrantee.keys(),
|
|
260
|
+
...branchByGrantee.keys(),
|
|
261
|
+
]);
|
|
262
|
+
|
|
263
|
+
const results = new Map<string, PrivilegeDiffResult<T>>();
|
|
264
|
+
|
|
265
|
+
for (const grantee of allGrantees) {
|
|
266
|
+
const mainPrivs = mainByGrantee.get(grantee) || [];
|
|
267
|
+
const branchPrivs = branchByGrantee.get(grantee) || [];
|
|
268
|
+
|
|
269
|
+
const result = diffPrivilegesForGrantee(mainPrivs, branchPrivs);
|
|
270
|
+
results.set(grantee, result);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return results;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// ==== Privilege Change Emission Helpers ====
|
|
277
|
+
//
|
|
278
|
+
// These helpers convert the output of `diffPrivileges` (per-grantee grant /
|
|
279
|
+
// revoke / revoke-grant-option lists) into concrete Change instances so that
|
|
280
|
+
// individual object diffs don't have to repeat the same iteration and grouping
|
|
281
|
+
// logic.
|
|
282
|
+
//
|
|
283
|
+
// Callers pass a `PrivilegeChangeFactories` bag containing the three class
|
|
284
|
+
// constructors (Grant, Revoke, RevokeGrantOption) for their object type. The
|
|
285
|
+
// helpers instantiate them with a common props shape: an object reference keyed
|
|
286
|
+
// by `objectKey`, a `grantee`, `privileges` or `privilegeNames`, an optional
|
|
287
|
+
// `version`, and (for column-level privileges) optional `columns`.
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Factory constructors for Grant / Revoke / RevokeGrantOption change classes.
|
|
291
|
+
* Every object type provides its own concrete classes. The `any` props type
|
|
292
|
+
* is intentional: the helpers build props with a computed `[objectKey]` key
|
|
293
|
+
* whose name varies per object type, so no single concrete type can unify
|
|
294
|
+
* all call sites without an unsafe cast elsewhere.
|
|
295
|
+
*/
|
|
296
|
+
interface PrivilegeChangeFactories {
|
|
297
|
+
Grant: new (
|
|
298
|
+
// biome-ignore lint/suspicious/noExplicitAny: factory accepts heterogeneous prop bags keyed by object type
|
|
299
|
+
props: any,
|
|
300
|
+
) => BaseChange;
|
|
301
|
+
Revoke: new (
|
|
302
|
+
// biome-ignore lint/suspicious/noExplicitAny: factory accepts heterogeneous prop bags keyed by object type
|
|
303
|
+
props: any,
|
|
304
|
+
) => BaseChange;
|
|
305
|
+
RevokeGrantOption: new (
|
|
306
|
+
// biome-ignore lint/suspicious/noExplicitAny: factory accepts heterogeneous prop bags keyed by object type
|
|
307
|
+
props: any,
|
|
308
|
+
) => BaseChange;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Emit privilege changes for object-level privileges (schema, sequence,
|
|
313
|
+
* procedure, etc.).
|
|
314
|
+
*
|
|
315
|
+
* For each grantee in `privilegeResults` the function groups grants and revokes
|
|
316
|
+
* by the `grantable` flag and pushes one change per group. Revoke-grant-option
|
|
317
|
+
* entries produce a single change carrying `privilegeNames`.
|
|
318
|
+
*
|
|
319
|
+
* `grantTarget` is the *branch* object (the desired state) while `revokeTarget`
|
|
320
|
+
* is the *main* object (the current state), so that GRANTs reference the
|
|
321
|
+
* newly-created/altered object and REVOKEs reference the existing one.
|
|
322
|
+
*/
|
|
323
|
+
export function emitObjectPrivilegeChanges(
|
|
324
|
+
privilegeResults: Map<string, PrivilegeDiffResult<PrivilegeProps>>,
|
|
325
|
+
grantTarget: unknown,
|
|
326
|
+
revokeTarget: unknown,
|
|
327
|
+
objectKey: string,
|
|
328
|
+
factories: PrivilegeChangeFactories,
|
|
329
|
+
version?: number,
|
|
330
|
+
): BaseChange[] {
|
|
331
|
+
const changes: BaseChange[] = [];
|
|
332
|
+
|
|
333
|
+
for (const [grantee, result] of privilegeResults) {
|
|
334
|
+
for (const [, revokes] of groupPrivilegesByGrantable(result.revokes)) {
|
|
335
|
+
changes.push(
|
|
336
|
+
new factories.Revoke({
|
|
337
|
+
[objectKey]: revokeTarget,
|
|
338
|
+
privileges: revokes,
|
|
339
|
+
grantee,
|
|
340
|
+
version,
|
|
341
|
+
}),
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
if (result.revokeGrantOption.length > 0) {
|
|
345
|
+
changes.push(
|
|
346
|
+
new factories.RevokeGrantOption({
|
|
347
|
+
[objectKey]: revokeTarget,
|
|
348
|
+
privilegeNames: result.revokeGrantOption,
|
|
349
|
+
grantee,
|
|
350
|
+
version,
|
|
351
|
+
}),
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
for (const [, grants] of groupPrivilegesByGrantable(result.grants)) {
|
|
355
|
+
changes.push(
|
|
356
|
+
new factories.Grant({
|
|
357
|
+
[objectKey]: grantTarget,
|
|
358
|
+
privileges: grants,
|
|
359
|
+
grantee,
|
|
360
|
+
version,
|
|
361
|
+
}),
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
return changes;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* Emit privilege changes for column-level privileges (table, view,
|
|
371
|
+
* materialized view).
|
|
372
|
+
*
|
|
373
|
+
* Like {@link emitObjectPrivilegeChanges} but groups by column set (via
|
|
374
|
+
* `groupPrivilegesByColumns`) instead of only by grantable. For
|
|
375
|
+
* revoke-grant-option the column sets come from `sourcePrivileges` so that
|
|
376
|
+
* `REVOKE GRANT OPTION FOR` is emitted per column set that originally carried
|
|
377
|
+
* the privilege.
|
|
378
|
+
*/
|
|
379
|
+
export function emitColumnPrivilegeChanges(
|
|
380
|
+
privilegeResults: Map<string, PrivilegeDiffResult<PrivilegeProps>>,
|
|
381
|
+
grantTarget: unknown,
|
|
382
|
+
revokeTarget: unknown,
|
|
383
|
+
objectKey: string,
|
|
384
|
+
factories: PrivilegeChangeFactories,
|
|
385
|
+
sourcePrivileges: PrivilegeProps[],
|
|
386
|
+
version?: number,
|
|
387
|
+
): BaseChange[] {
|
|
388
|
+
const changes: BaseChange[] = [];
|
|
389
|
+
|
|
390
|
+
for (const [grantee, result] of privilegeResults) {
|
|
391
|
+
for (const [, group] of groupPrivilegesByColumns(result.revokes)) {
|
|
392
|
+
const allPrivileges = new Set<string>();
|
|
393
|
+
for (const [, privSet] of group.byGrant) {
|
|
394
|
+
for (const priv of privSet) {
|
|
395
|
+
allPrivileges.add(priv);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
changes.push(
|
|
399
|
+
new factories.Revoke({
|
|
400
|
+
[objectKey]: revokeTarget,
|
|
401
|
+
privileges: [...allPrivileges].map((p) => ({
|
|
402
|
+
privilege: p,
|
|
403
|
+
grantable: false,
|
|
404
|
+
})),
|
|
405
|
+
grantee,
|
|
406
|
+
columns: group.columns,
|
|
407
|
+
version,
|
|
408
|
+
}),
|
|
409
|
+
);
|
|
410
|
+
}
|
|
411
|
+
if (result.revokeGrantOption.length > 0) {
|
|
412
|
+
const sourcePrivsForGrantee = sourcePrivileges.filter(
|
|
413
|
+
(p) => p.grantee === grantee,
|
|
414
|
+
);
|
|
415
|
+
for (const [, group] of groupPrivilegesByColumns(
|
|
416
|
+
sourcePrivsForGrantee.filter((p) =>
|
|
417
|
+
result.revokeGrantOption.includes(p.privilege),
|
|
418
|
+
),
|
|
419
|
+
)) {
|
|
420
|
+
changes.push(
|
|
421
|
+
new factories.RevokeGrantOption({
|
|
422
|
+
[objectKey]: revokeTarget,
|
|
423
|
+
privilegeNames: result.revokeGrantOption,
|
|
424
|
+
grantee,
|
|
425
|
+
columns: group.columns,
|
|
426
|
+
version,
|
|
427
|
+
}),
|
|
428
|
+
);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
for (const [, group] of groupPrivilegesByColumns(result.grants)) {
|
|
432
|
+
for (const [grantable, privSet] of group.byGrant) {
|
|
433
|
+
changes.push(
|
|
434
|
+
new factories.Grant({
|
|
435
|
+
[objectKey]: grantTarget,
|
|
436
|
+
privileges: [...privSet].map((p) => ({ privilege: p, grantable })),
|
|
437
|
+
grantee,
|
|
438
|
+
columns: group.columns,
|
|
439
|
+
version,
|
|
440
|
+
}),
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
return changes;
|
|
447
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base utilities and helpers for object privilege changes.
|
|
3
|
+
* These functions support GRANT/REVOKE operations across different database objects.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { PrivilegeProps } from "./base.privilege-diff.ts";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Returns the complete set of available privileges for a given object kind.
|
|
10
|
+
* This is used to determine whether a privilege list represents "ALL PRIVILEGES".
|
|
11
|
+
*
|
|
12
|
+
* @param kind - The PostgreSQL object kind (TABLE, VIEW, SEQUENCE, etc.)
|
|
13
|
+
* @param version - The PostgreSQL version number (e.g., 170000 for 17.0.0)
|
|
14
|
+
* @returns An array of privilege names available for this object kind
|
|
15
|
+
*/
|
|
16
|
+
function objectPrivilegeUniverse(
|
|
17
|
+
kind: string,
|
|
18
|
+
version: number | undefined,
|
|
19
|
+
): string[] {
|
|
20
|
+
switch (kind) {
|
|
21
|
+
case "TABLE": {
|
|
22
|
+
const includesMaintain = (version ?? 170000) >= 170000;
|
|
23
|
+
return [
|
|
24
|
+
"DELETE",
|
|
25
|
+
"INSERT",
|
|
26
|
+
...(includesMaintain ? (["MAINTAIN"] as const) : []),
|
|
27
|
+
"REFERENCES",
|
|
28
|
+
"SELECT",
|
|
29
|
+
"TRIGGER",
|
|
30
|
+
"TRUNCATE",
|
|
31
|
+
"UPDATE",
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
case "VIEW": {
|
|
35
|
+
// Per PostgreSQL docs, views are table-like and share the table privilege set
|
|
36
|
+
// for GRANT/REVOKE purposes. MAINTAIN exists on PostgreSQL >= 17
|
|
37
|
+
const includesMaintain = (version ?? 170000) >= 170000;
|
|
38
|
+
return [
|
|
39
|
+
"DELETE",
|
|
40
|
+
"INSERT",
|
|
41
|
+
...(includesMaintain ? (["MAINTAIN"] as const) : []),
|
|
42
|
+
"REFERENCES",
|
|
43
|
+
"SELECT",
|
|
44
|
+
"TRIGGER",
|
|
45
|
+
"TRUNCATE",
|
|
46
|
+
"UPDATE",
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
case "MATERIALIZED VIEW": {
|
|
50
|
+
// Materialized views support the same table-like privileges as tables/views
|
|
51
|
+
// Per PostgreSQL docs, materialized views are table-like for GRANT/REVOKE purposes
|
|
52
|
+
const includesMaintain = (version ?? 170000) >= 170000;
|
|
53
|
+
return [
|
|
54
|
+
"DELETE",
|
|
55
|
+
"INSERT",
|
|
56
|
+
...(includesMaintain ? (["MAINTAIN"] as const) : []),
|
|
57
|
+
"REFERENCES",
|
|
58
|
+
"SELECT",
|
|
59
|
+
"TRIGGER",
|
|
60
|
+
"TRUNCATE",
|
|
61
|
+
"UPDATE",
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
case "SEQUENCE":
|
|
65
|
+
return ["SELECT", "UPDATE", "USAGE"].sort();
|
|
66
|
+
case "SCHEMA":
|
|
67
|
+
return ["CREATE", "USAGE"].sort();
|
|
68
|
+
case "LANGUAGE":
|
|
69
|
+
return ["USAGE"];
|
|
70
|
+
case "FUNCTION":
|
|
71
|
+
case "PROCEDURE":
|
|
72
|
+
case "ROUTINE":
|
|
73
|
+
return ["EXECUTE"];
|
|
74
|
+
case "TYPE":
|
|
75
|
+
case "DOMAIN":
|
|
76
|
+
return ["USAGE"];
|
|
77
|
+
case "FOREIGN DATA WRAPPER":
|
|
78
|
+
return ["USAGE"];
|
|
79
|
+
case "SERVER":
|
|
80
|
+
return ["USAGE"];
|
|
81
|
+
case "FOREIGN TABLE": {
|
|
82
|
+
const includesMaintain = (version ?? 170000) >= 170000;
|
|
83
|
+
return [
|
|
84
|
+
"DELETE",
|
|
85
|
+
"INSERT",
|
|
86
|
+
...(includesMaintain ? (["MAINTAIN"] as const) : []),
|
|
87
|
+
"REFERENCES",
|
|
88
|
+
"SELECT",
|
|
89
|
+
"TRIGGER",
|
|
90
|
+
"TRUNCATE",
|
|
91
|
+
"UPDATE",
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
default:
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Checks if a privilege list represents the full set of privileges for an object kind.
|
|
101
|
+
* This determines whether we can use "ALL PRIVILEGES" shorthand in SQL.
|
|
102
|
+
*
|
|
103
|
+
* @param kind - The PostgreSQL object kind
|
|
104
|
+
* @param list - Array of privilege names to check
|
|
105
|
+
* @param version - The PostgreSQL version number
|
|
106
|
+
* @returns true if the list contains all available privileges for this object kind
|
|
107
|
+
*/
|
|
108
|
+
function isFullObjectPrivilegeSet(
|
|
109
|
+
kind: string,
|
|
110
|
+
list: string[],
|
|
111
|
+
version: number | undefined,
|
|
112
|
+
): boolean {
|
|
113
|
+
const uniqSorted = [...new Set(list)].sort();
|
|
114
|
+
const fullSorted = [...objectPrivilegeUniverse(kind, version)].sort();
|
|
115
|
+
if (uniqSorted.length !== fullSorted.length) return false;
|
|
116
|
+
for (let i = 0; i < uniqSorted.length; i++) {
|
|
117
|
+
if (uniqSorted[i] !== fullSorted[i]) return false;
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Formats a list of privileges for use in GRANT/REVOKE statements.
|
|
124
|
+
* If the list represents all privileges, returns "ALL", otherwise returns a comma-separated list.
|
|
125
|
+
*
|
|
126
|
+
* @param kind - The PostgreSQL object kind
|
|
127
|
+
* @param list - Array of privilege names to format
|
|
128
|
+
* @param version - The PostgreSQL version number
|
|
129
|
+
* @returns A SQL-formatted privilege list (either "ALL" or "PRIV1, PRIV2, ...")
|
|
130
|
+
*/
|
|
131
|
+
export function formatObjectPrivilegeList(
|
|
132
|
+
kind: string,
|
|
133
|
+
list: string[],
|
|
134
|
+
version: number | undefined,
|
|
135
|
+
): string {
|
|
136
|
+
const uniqSorted = [...new Set(list)].sort();
|
|
137
|
+
return isFullObjectPrivilegeSet(kind, uniqSorted, version)
|
|
138
|
+
? "ALL"
|
|
139
|
+
: uniqSorted.join(", ");
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Gets the SQL keyword prefix for a given object kind in GRANT/REVOKE statements.
|
|
144
|
+
*
|
|
145
|
+
* @param objectKind - The PostgreSQL object kind
|
|
146
|
+
* @returns The SQL prefix (e.g., "ON SCHEMA", "ON DOMAIN", "ON")
|
|
147
|
+
*/
|
|
148
|
+
export function getObjectKindPrefix(objectKind: string): string {
|
|
149
|
+
switch (objectKind) {
|
|
150
|
+
case "FUNCTION":
|
|
151
|
+
return "ON FUNCTION";
|
|
152
|
+
case "PROCEDURE":
|
|
153
|
+
return "ON PROCEDURE";
|
|
154
|
+
case "ROUTINE":
|
|
155
|
+
return "ON ROUTINE";
|
|
156
|
+
case "LANGUAGE":
|
|
157
|
+
return "ON LANGUAGE";
|
|
158
|
+
case "SCHEMA":
|
|
159
|
+
return "ON SCHEMA";
|
|
160
|
+
case "SEQUENCE":
|
|
161
|
+
return "ON SEQUENCE";
|
|
162
|
+
case "DOMAIN":
|
|
163
|
+
return "ON DOMAIN";
|
|
164
|
+
case "TYPE":
|
|
165
|
+
return "ON TYPE";
|
|
166
|
+
case "FOREIGN TABLE":
|
|
167
|
+
return "ON TABLE";
|
|
168
|
+
default:
|
|
169
|
+
return "ON";
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function normalizePrivileges(privileges: PrivilegeProps[]) {
|
|
174
|
+
return privileges
|
|
175
|
+
.map((privilege) => ({
|
|
176
|
+
grantee: privilege.grantee,
|
|
177
|
+
privilege: privilege.privilege,
|
|
178
|
+
grantable: privilege.grantable,
|
|
179
|
+
columns: privilege.columns
|
|
180
|
+
? [...privilege.columns].sort()
|
|
181
|
+
: privilege.columns,
|
|
182
|
+
}))
|
|
183
|
+
.sort((a, b) => {
|
|
184
|
+
if (a.grantee !== b.grantee) return a.grantee.localeCompare(b.grantee);
|
|
185
|
+
if (a.privilege !== b.privilege)
|
|
186
|
+
return a.privilege.localeCompare(b.privilege);
|
|
187
|
+
const colA = a.columns?.join(",") ?? "";
|
|
188
|
+
const colB = b.columns?.join(",") ?? "";
|
|
189
|
+
return colA.localeCompare(colB);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { assertValidSql } from "../../../test-utils/assert-valid-sql.ts";
|
|
3
|
+
import { Collation } from "../collation.model.ts";
|
|
4
|
+
import {
|
|
5
|
+
AlterCollationChangeOwner,
|
|
6
|
+
AlterCollationRefreshVersion,
|
|
7
|
+
} from "./collation.alter.ts";
|
|
8
|
+
|
|
9
|
+
describe.concurrent("collation", () => {
|
|
10
|
+
describe("alter", () => {
|
|
11
|
+
test("change owner", async () => {
|
|
12
|
+
const collation = new Collation({
|
|
13
|
+
schema: "public",
|
|
14
|
+
name: "test",
|
|
15
|
+
provider: "c",
|
|
16
|
+
is_deterministic: true,
|
|
17
|
+
encoding: 1,
|
|
18
|
+
collate: "en_US",
|
|
19
|
+
locale: "en_US",
|
|
20
|
+
version: "1.0",
|
|
21
|
+
ctype: "test",
|
|
22
|
+
icu_rules: "test",
|
|
23
|
+
comment: null,
|
|
24
|
+
owner: "old_owner",
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const change = new AlterCollationChangeOwner({
|
|
28
|
+
collation,
|
|
29
|
+
owner: "new_owner",
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
await assertValidSql(change.serialize());
|
|
33
|
+
|
|
34
|
+
expect(change.serialize()).toBe(
|
|
35
|
+
"ALTER COLLATION public.test OWNER TO new_owner",
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("refresh version", async () => {
|
|
40
|
+
const collation = new Collation({
|
|
41
|
+
schema: "public",
|
|
42
|
+
name: "test",
|
|
43
|
+
provider: "c",
|
|
44
|
+
is_deterministic: true,
|
|
45
|
+
encoding: 1,
|
|
46
|
+
collate: "en_US",
|
|
47
|
+
locale: "en_US",
|
|
48
|
+
ctype: "test",
|
|
49
|
+
icu_rules: "test",
|
|
50
|
+
comment: null,
|
|
51
|
+
owner: "test",
|
|
52
|
+
version: "1.0",
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const change = new AlterCollationRefreshVersion({
|
|
56
|
+
collation,
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
await assertValidSql(change.serialize());
|
|
60
|
+
|
|
61
|
+
expect(change.serialize()).toBe(
|
|
62
|
+
"ALTER COLLATION public.test REFRESH VERSION",
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// replace behavior moved into collation.diff.ts as separate Drop + Create
|
|
67
|
+
});
|
|
68
|
+
});
|