@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,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL connection configuration with custom type handlers.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { ClientBase, PoolClient, PoolConfig } from "pg";
|
|
6
|
+
import { escapeIdentifier, Pool, types } from "pg";
|
|
7
|
+
import { parseSslConfig } from "./plan/ssl-config.ts";
|
|
8
|
+
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Array Parser
|
|
11
|
+
// ============================================================================
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Parse PostgreSQL array string into JavaScript array.
|
|
15
|
+
* Handles: {val1,val2}, {NULL,val}, {"quoted,val"}, nested arrays.
|
|
16
|
+
*/
|
|
17
|
+
function parseArray(
|
|
18
|
+
value: string,
|
|
19
|
+
parseElement: (val: string) => unknown = (v) => v,
|
|
20
|
+
): unknown[] {
|
|
21
|
+
if (!value || value === "{}") return [];
|
|
22
|
+
|
|
23
|
+
// Remove outer braces
|
|
24
|
+
const inner = value.slice(1, -1);
|
|
25
|
+
if (inner === "") return [];
|
|
26
|
+
|
|
27
|
+
const result: unknown[] = [];
|
|
28
|
+
let current = "";
|
|
29
|
+
let inQuotes = false;
|
|
30
|
+
let depth = 0;
|
|
31
|
+
|
|
32
|
+
for (let i = 0; i < inner.length; i++) {
|
|
33
|
+
const char = inner[i];
|
|
34
|
+
|
|
35
|
+
if (char === '"' && inner[i - 1] !== "\\") {
|
|
36
|
+
inQuotes = !inQuotes;
|
|
37
|
+
current += char;
|
|
38
|
+
} else if (char === "{" && !inQuotes) {
|
|
39
|
+
depth++;
|
|
40
|
+
current += char;
|
|
41
|
+
} else if (char === "}" && !inQuotes) {
|
|
42
|
+
depth--;
|
|
43
|
+
current += char;
|
|
44
|
+
} else if (char === "," && !inQuotes && depth === 0) {
|
|
45
|
+
result.push(parseElement(current));
|
|
46
|
+
current = "";
|
|
47
|
+
} else {
|
|
48
|
+
current += char;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (current !== "") {
|
|
53
|
+
result.push(parseElement(current));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Parse element, handling NULL, quoted strings, and unquoted values.
|
|
61
|
+
*/
|
|
62
|
+
function parseStringElement(val: string): string | null {
|
|
63
|
+
if (val === "NULL") return null;
|
|
64
|
+
if (val.startsWith('"') && val.endsWith('"')) {
|
|
65
|
+
// Unescape quoted string
|
|
66
|
+
return val.slice(1, -1).replace(/\\(.)/g, "$1");
|
|
67
|
+
}
|
|
68
|
+
return val;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function parseIntElement(val: string): number | null {
|
|
72
|
+
if (val === "NULL") return null;
|
|
73
|
+
return Number.parseInt(val, 10);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ============================================================================
|
|
77
|
+
// Type Parsers
|
|
78
|
+
// ============================================================================
|
|
79
|
+
|
|
80
|
+
// int2vector: "1 2 3" -> [1, 2, 3]
|
|
81
|
+
// @ts-expect-error - pg types expects TypeId but raw OID numbers work fine
|
|
82
|
+
types.setTypeParser(22, (val: string) => {
|
|
83
|
+
if (!val || val === "") return [];
|
|
84
|
+
return val
|
|
85
|
+
.split(" ")
|
|
86
|
+
.map(Number)
|
|
87
|
+
.filter((n: number) => !Number.isNaN(n));
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// bigint: string -> BigInt
|
|
91
|
+
types.setTypeParser(20, (val: string) => BigInt(val));
|
|
92
|
+
|
|
93
|
+
// PostgreSQL array types
|
|
94
|
+
// @ts-expect-error - pg types expects TypeId but raw OID numbers work fine
|
|
95
|
+
types.setTypeParser(1002, (val: string) => parseArray(val, parseStringElement)); // "char"[]
|
|
96
|
+
// @ts-expect-error - pg types expects TypeId but raw OID numbers work fine
|
|
97
|
+
types.setTypeParser(1009, (val: string) => parseArray(val, parseStringElement)); // text[]
|
|
98
|
+
// @ts-expect-error - pg types expects TypeId but raw OID numbers work fine
|
|
99
|
+
types.setTypeParser(1015, (val: string) => parseArray(val, parseStringElement)); // varchar[]
|
|
100
|
+
// @ts-expect-error - pg types expects TypeId but raw OID numbers work fine
|
|
101
|
+
types.setTypeParser(1005, (val: string) => parseArray(val, parseIntElement)); // int2[]
|
|
102
|
+
// @ts-expect-error - pg types expects TypeId but raw OID numbers work fine
|
|
103
|
+
types.setTypeParser(1007, (val: string) => parseArray(val, parseIntElement)); // int4[]
|
|
104
|
+
// @ts-expect-error - pg types expects TypeId but raw OID numbers work fine
|
|
105
|
+
types.setTypeParser(1016, (val: string) => parseArray(val, parseIntElement)); // int8[]
|
|
106
|
+
|
|
107
|
+
const DEFAULT_POOL_MAX = Number(process.env.PGDELTA_POOL_MAX) || 5;
|
|
108
|
+
const DEFAULT_CONNECTION_TIMEOUT_MS =
|
|
109
|
+
Number(process.env.PGDELTA_CONNECTION_TIMEOUT_MS) || 3_000;
|
|
110
|
+
const DEFAULT_CONNECT_TIMEOUT_MS =
|
|
111
|
+
Number(process.env.PGDELTA_CONNECT_TIMEOUT_MS) || 2_500;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Options for creating a Pool with event listeners.
|
|
115
|
+
*/
|
|
116
|
+
interface CreatePoolOptions extends Partial<PoolConfig> {
|
|
117
|
+
/** Called when a new client connects to the pool */
|
|
118
|
+
onConnect?: (client: ClientBase) => void | Promise<void>;
|
|
119
|
+
/** Called when an idle client emits an error */
|
|
120
|
+
onError?: (err: Error, client: PoolClient) => void;
|
|
121
|
+
/** Called when a client is acquired from the pool */
|
|
122
|
+
onAcquire?: (client: PoolClient) => void;
|
|
123
|
+
/** Called when a client is removed from the pool */
|
|
124
|
+
onRemove?: (client: PoolClient) => void;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Create a Pool with custom type handlers and optional event listeners.
|
|
129
|
+
*/
|
|
130
|
+
export function createPool(
|
|
131
|
+
connectionString: string,
|
|
132
|
+
options?: CreatePoolOptions,
|
|
133
|
+
): Pool {
|
|
134
|
+
const { onConnect, onError, onAcquire, onRemove, ...config } = options ?? {};
|
|
135
|
+
const pool = new Pool({
|
|
136
|
+
connectionString,
|
|
137
|
+
max: DEFAULT_POOL_MAX,
|
|
138
|
+
connectionTimeoutMillis: DEFAULT_CONNECTION_TIMEOUT_MS,
|
|
139
|
+
...config,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
if (onConnect) {
|
|
143
|
+
const pendingClientSetup = new WeakMap<PoolClient, Promise<void>>();
|
|
144
|
+
const waitForClientSetup = async (client: PoolClient) => {
|
|
145
|
+
const setup = pendingClientSetup.get(client);
|
|
146
|
+
if (setup) {
|
|
147
|
+
await setup;
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
throw new Error(
|
|
151
|
+
"Internal error: pool client was acquired before async onConnect setup was registered. This indicates a bug in the pool wrapper logic; please report it with reproduction steps.",
|
|
152
|
+
);
|
|
153
|
+
};
|
|
154
|
+
const originalConnect = pool.connect.bind(pool);
|
|
155
|
+
|
|
156
|
+
pool.on("connect", (client) => {
|
|
157
|
+
pendingClientSetup.set(
|
|
158
|
+
client,
|
|
159
|
+
Promise.resolve().then(() => onConnect(client)),
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
pool.connect = ((
|
|
164
|
+
callback?: (
|
|
165
|
+
err: Error | undefined,
|
|
166
|
+
client: PoolClient | undefined,
|
|
167
|
+
release: (err?: Error | boolean) => void,
|
|
168
|
+
) => void,
|
|
169
|
+
) => {
|
|
170
|
+
if (!callback) {
|
|
171
|
+
return originalConnect().then(async (client) => {
|
|
172
|
+
try {
|
|
173
|
+
await waitForClientSetup(client);
|
|
174
|
+
return client;
|
|
175
|
+
} catch (setupError) {
|
|
176
|
+
(client as PoolClient).release?.(setupError as Error);
|
|
177
|
+
throw setupError;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return originalConnect(async (err, client, release) => {
|
|
183
|
+
if (err || !client) {
|
|
184
|
+
callback(err, client, release);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
try {
|
|
189
|
+
await waitForClientSetup(client);
|
|
190
|
+
callback(err, client, release);
|
|
191
|
+
} catch (setupError) {
|
|
192
|
+
release(setupError as Error);
|
|
193
|
+
callback(setupError as Error, undefined, () => {});
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}) as Pool["connect"];
|
|
197
|
+
}
|
|
198
|
+
if (onError) pool.on("error", onError);
|
|
199
|
+
if (onAcquire) pool.on("acquire", onAcquire);
|
|
200
|
+
if (onRemove) pool.on("remove", onRemove);
|
|
201
|
+
|
|
202
|
+
return pool;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* End a pool and wait for all client sockets to fully close.
|
|
207
|
+
*
|
|
208
|
+
* pg-pool's `pool.end()` resolves once clients are removed from its
|
|
209
|
+
* internal bookkeeping, but the underlying `client.end()` calls (which
|
|
210
|
+
* close the TCP/TLS sockets) are fired asynchronously *after* that.
|
|
211
|
+
* If the server (e.g. a test container) is stopped right after
|
|
212
|
+
* `pool.end()` resolves, the still-open sockets receive an unexpected
|
|
213
|
+
* RST and emit unhandled "Connection terminated unexpectedly" errors.
|
|
214
|
+
*
|
|
215
|
+
* This helper waits for every `remove` event — which pg-pool emits
|
|
216
|
+
* inside each `client.end()` callback — ensuring all sockets are
|
|
217
|
+
* truly closed before it resolves.
|
|
218
|
+
*/
|
|
219
|
+
/**
|
|
220
|
+
* Create a pool from a connection URL with standard session setup:
|
|
221
|
+
* SSL parsing, search_path isolation, optional SET ROLE, and 57P01 suppression.
|
|
222
|
+
*
|
|
223
|
+
* Returns the pool and a `close` function that properly waits for all sockets
|
|
224
|
+
* to close (via {@link endPool}).
|
|
225
|
+
*/
|
|
226
|
+
export async function createManagedPool(
|
|
227
|
+
url: string,
|
|
228
|
+
options?: { role?: string; label?: "source" | "target" },
|
|
229
|
+
): Promise<{ pool: Pool; close: () => Promise<void> }> {
|
|
230
|
+
const sslConfig = await parseSslConfig(url, options?.label ?? "target");
|
|
231
|
+
const pool = createPool(sslConfig.cleanedUrl, {
|
|
232
|
+
...(sslConfig.ssl !== undefined ? { ssl: sslConfig.ssl } : {}),
|
|
233
|
+
onError: (err: Error & { code?: string }) => {
|
|
234
|
+
if (err.code !== "57P01") {
|
|
235
|
+
console.error("Pool error:", err);
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
onConnect: async (client) => {
|
|
239
|
+
await client.query("SET search_path = ''");
|
|
240
|
+
if (options?.role) {
|
|
241
|
+
await client.query(`SET ROLE ${escapeIdentifier(options.role)}`);
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
// Eagerly validate connectivity so SSL/auth failures surface immediately
|
|
247
|
+
// instead of hanging on the first real query. node-pg's connectionTimeoutMillis
|
|
248
|
+
// is not reliably enforced under Bun when SSL negotiation hangs.
|
|
249
|
+
const label = options?.label ?? "target";
|
|
250
|
+
const timeoutMs = DEFAULT_CONNECT_TIMEOUT_MS;
|
|
251
|
+
try {
|
|
252
|
+
const client = await Promise.race([
|
|
253
|
+
pool.connect(),
|
|
254
|
+
new Promise<never>((_, reject) =>
|
|
255
|
+
setTimeout(
|
|
256
|
+
() =>
|
|
257
|
+
reject(
|
|
258
|
+
new Error(
|
|
259
|
+
`Connection to ${label} database timed out after ${timeoutMs}ms. ` +
|
|
260
|
+
`The server may require SSL, use an invalid certificate, or be unreachable.`,
|
|
261
|
+
),
|
|
262
|
+
),
|
|
263
|
+
timeoutMs,
|
|
264
|
+
),
|
|
265
|
+
),
|
|
266
|
+
]);
|
|
267
|
+
client.release();
|
|
268
|
+
} catch (err) {
|
|
269
|
+
await pool.end().catch(() => {});
|
|
270
|
+
throw err;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return { pool, close: () => endPool(pool) };
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export function endPool(pool: Pool): Promise<void> {
|
|
277
|
+
const clientCount = pool.totalCount;
|
|
278
|
+
|
|
279
|
+
if (clientCount === 0) {
|
|
280
|
+
return pool.end();
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
return new Promise<void>((resolve, reject) => {
|
|
284
|
+
let removed = 0;
|
|
285
|
+
pool.on("remove", function onRemove() {
|
|
286
|
+
if (++removed >= clientCount) {
|
|
287
|
+
pool.removeListener("remove", onRemove);
|
|
288
|
+
resolve();
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
pool.end().catch(reject);
|
|
292
|
+
});
|
|
293
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import type { Change } from "../change.types.ts";
|
|
2
|
+
import { getSchema } from "../change-utils.ts";
|
|
3
|
+
import {
|
|
4
|
+
GrantRoleDefaultPrivileges,
|
|
5
|
+
RevokeRoleDefaultPrivileges,
|
|
6
|
+
} from "../objects/role/changes/role.privilege.ts";
|
|
7
|
+
import type { Constraint } from "./types.ts";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Maps object type names to PostgreSQL default privilege objtype codes.
|
|
11
|
+
* This mirrors the mapping in base.default-privileges.ts.
|
|
12
|
+
*/
|
|
13
|
+
function objectTypeToObjtype(objectType: string): string | null {
|
|
14
|
+
switch (objectType) {
|
|
15
|
+
case "table":
|
|
16
|
+
case "view":
|
|
17
|
+
case "materialized_view":
|
|
18
|
+
return "r"; // Relations
|
|
19
|
+
case "sequence":
|
|
20
|
+
return "S"; // Sequences
|
|
21
|
+
case "procedure":
|
|
22
|
+
case "function":
|
|
23
|
+
case "aggregate":
|
|
24
|
+
return "f"; // Functions/routines
|
|
25
|
+
case "type":
|
|
26
|
+
case "domain":
|
|
27
|
+
case "enum":
|
|
28
|
+
case "range":
|
|
29
|
+
case "composite_type":
|
|
30
|
+
return "T"; // Types
|
|
31
|
+
case "schema":
|
|
32
|
+
return "n"; // Schemas
|
|
33
|
+
default:
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A function that generates constraints for a list of changes.
|
|
40
|
+
* Should be optimized to avoid O(N²) complexity by using lookups/indexing.
|
|
41
|
+
*/
|
|
42
|
+
type ConstraintGenerator = (changes: Change[]) => Constraint[];
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Generate constraints to ensure ALTER DEFAULT PRIVILEGES comes before CREATE statements.
|
|
46
|
+
*
|
|
47
|
+
* Rules:
|
|
48
|
+
* - Only applies when the default privilege's schema matches the CREATE statement's schema
|
|
49
|
+
* (or if the default privilege is global, applies to all schemas)
|
|
50
|
+
* - Only applies when the default privilege's objtype matches the CREATE statement's object type
|
|
51
|
+
* - Excludes CREATE ROLE and CREATE SCHEMA since they are dependencies
|
|
52
|
+
* of ALTER DEFAULT PRIVILEGES and must come before it
|
|
53
|
+
*
|
|
54
|
+
* implementation: O(N) using schema/objtype indexing.
|
|
55
|
+
*/
|
|
56
|
+
function generateDefaultPrivilegeConstraints(changes: Change[]): Constraint[] {
|
|
57
|
+
const constraints: Constraint[] = [];
|
|
58
|
+
const defaultPrivilegeIndices: number[] = [];
|
|
59
|
+
// Map<objtype_code, Map<schema_name, index[]>>
|
|
60
|
+
const createsByObjTypeAndSchema = new Map<string, Map<string, number[]>>();
|
|
61
|
+
|
|
62
|
+
// Pass 1: Index changes
|
|
63
|
+
for (let i = 0; i < changes.length; i++) {
|
|
64
|
+
const change = changes[i];
|
|
65
|
+
|
|
66
|
+
// Identify default privilege changes
|
|
67
|
+
if (
|
|
68
|
+
change instanceof GrantRoleDefaultPrivileges ||
|
|
69
|
+
change instanceof RevokeRoleDefaultPrivileges
|
|
70
|
+
) {
|
|
71
|
+
defaultPrivilegeIndices.push(i);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Identify CREATE object changes (excluding role/schema)
|
|
76
|
+
if (
|
|
77
|
+
change.operation === "create" &&
|
|
78
|
+
change.scope === "object" &&
|
|
79
|
+
change.objectType !== "role" &&
|
|
80
|
+
change.objectType !== "schema"
|
|
81
|
+
) {
|
|
82
|
+
const objTypeCode = objectTypeToObjtype(change.objectType);
|
|
83
|
+
if (!objTypeCode) continue;
|
|
84
|
+
|
|
85
|
+
const schema = getSchema(change);
|
|
86
|
+
// Default privileges only apply to schema-contained objects.
|
|
87
|
+
if (schema) {
|
|
88
|
+
let schemaMap = createsByObjTypeAndSchema.get(objTypeCode);
|
|
89
|
+
if (!schemaMap) {
|
|
90
|
+
schemaMap = new Map();
|
|
91
|
+
createsByObjTypeAndSchema.set(objTypeCode, schemaMap);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
let indices = schemaMap.get(schema);
|
|
95
|
+
if (!indices) {
|
|
96
|
+
indices = [];
|
|
97
|
+
schemaMap.set(schema, indices);
|
|
98
|
+
}
|
|
99
|
+
indices.push(i);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Pass 2: Generate constraints
|
|
105
|
+
for (const privIndex of defaultPrivilegeIndices) {
|
|
106
|
+
const privChange = changes[privIndex] as {
|
|
107
|
+
inSchema: string | null;
|
|
108
|
+
objtype: string;
|
|
109
|
+
};
|
|
110
|
+
const privSchema = privChange.inSchema;
|
|
111
|
+
const privObjType = privChange.objtype;
|
|
112
|
+
|
|
113
|
+
const schemaMap = createsByObjTypeAndSchema.get(privObjType);
|
|
114
|
+
if (!schemaMap) continue;
|
|
115
|
+
|
|
116
|
+
if (privSchema === null) {
|
|
117
|
+
// Global default privilege: applies to ALL schemas
|
|
118
|
+
for (const indices of schemaMap.values()) {
|
|
119
|
+
for (const createIndex of indices) {
|
|
120
|
+
// (No self-check needed as types differ)
|
|
121
|
+
constraints.push({
|
|
122
|
+
sourceChangeIndex: privIndex,
|
|
123
|
+
targetChangeIndex: createIndex,
|
|
124
|
+
source: "custom",
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
} else {
|
|
129
|
+
// Specific schema: applies only to that schema
|
|
130
|
+
const indices = schemaMap.get(privSchema);
|
|
131
|
+
if (indices) {
|
|
132
|
+
for (const createIndex of indices) {
|
|
133
|
+
constraints.push({
|
|
134
|
+
sourceChangeIndex: privIndex,
|
|
135
|
+
targetChangeIndex: createIndex,
|
|
136
|
+
source: "custom",
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return constraints;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* All custom constraint generators.
|
|
148
|
+
*/
|
|
149
|
+
const customConstraintGenerators: ConstraintGenerator[] = [
|
|
150
|
+
generateDefaultPrivilegeConstraints,
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Generate Constraints from custom constraint generators.
|
|
155
|
+
*
|
|
156
|
+
* Iterates through registered generators to produce constraints.
|
|
157
|
+
* Generators should be optimized (e.g. using indexing) to avoid O(N²) complexity.
|
|
158
|
+
*/
|
|
159
|
+
export function generateCustomConstraints(changes: Change[]): Constraint[] {
|
|
160
|
+
return customConstraintGenerators.flatMap((generate) => generate(changes));
|
|
161
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import debug from "debug";
|
|
2
|
+
import type { Change } from "../change.types.ts";
|
|
3
|
+
import { findCycle } from "./topological-sort.ts";
|
|
4
|
+
import type { Constraint, GraphData, PgDependRow } from "./types.ts";
|
|
5
|
+
|
|
6
|
+
const debugGraph = debug("pg-delta:graph");
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Generate a Mermaid diagram representation of the dependency graph for debugging.
|
|
10
|
+
*/
|
|
11
|
+
function generateMermaidDiagram(
|
|
12
|
+
phaseChanges: Change[],
|
|
13
|
+
graphData: GraphData,
|
|
14
|
+
edges: Array<[number, number]>,
|
|
15
|
+
requirementSets: Array<Set<string>>,
|
|
16
|
+
dependenciesByReferencedId: Map<string, Set<string>>,
|
|
17
|
+
): string {
|
|
18
|
+
const cycleNodeIndexes = findCycle(phaseChanges.length, edges) ?? [];
|
|
19
|
+
const mermaidLines: string[] = [];
|
|
20
|
+
mermaidLines.push("flowchart TD");
|
|
21
|
+
|
|
22
|
+
// Add nodes
|
|
23
|
+
for (let changeIndex = 0; changeIndex < phaseChanges.length; changeIndex++) {
|
|
24
|
+
const changeInstance = phaseChanges[changeIndex];
|
|
25
|
+
const changeClassName = changeInstance?.constructor?.name ?? "Change";
|
|
26
|
+
const truncatedCreates = Array.isArray(changeInstance.creates)
|
|
27
|
+
? changeInstance.creates.slice(0, 3)
|
|
28
|
+
: [];
|
|
29
|
+
const nodeLabel = `${changeIndex}: ${changeClassName} ${
|
|
30
|
+
truncatedCreates.length > 0 ? `[${truncatedCreates.join(",")}]` : ""
|
|
31
|
+
}`.replaceAll('"', "'");
|
|
32
|
+
mermaidLines.push(` n${changeIndex}["${nodeLabel}"]`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Add edges with descriptions
|
|
36
|
+
for (const [sourceIndex, targetIndex] of edges) {
|
|
37
|
+
const edgeDescription = describeEdge(
|
|
38
|
+
sourceIndex,
|
|
39
|
+
targetIndex,
|
|
40
|
+
graphData,
|
|
41
|
+
requirementSets,
|
|
42
|
+
dependenciesByReferencedId,
|
|
43
|
+
).replaceAll('"', "'");
|
|
44
|
+
if (edgeDescription.length > 0) {
|
|
45
|
+
mermaidLines.push(
|
|
46
|
+
` n${sourceIndex} -- "${edgeDescription}" --> n${targetIndex}`,
|
|
47
|
+
);
|
|
48
|
+
} else {
|
|
49
|
+
mermaidLines.push(` n${sourceIndex} --> n${targetIndex}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Highlight cycles if any
|
|
54
|
+
if (cycleNodeIndexes.length > 0) {
|
|
55
|
+
mermaidLines.push(
|
|
56
|
+
" classDef cycleNode fill:#ffe6e6,stroke:#ff4d4f,stroke-width:2px;",
|
|
57
|
+
);
|
|
58
|
+
for (const nodeIndex of cycleNodeIndexes) {
|
|
59
|
+
mermaidLines.push(` class n${nodeIndex} cycleNode;`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const cycleEdges: Array<[number, number]> = [];
|
|
63
|
+
for (
|
|
64
|
+
let cycleIndex = 0;
|
|
65
|
+
cycleIndex < cycleNodeIndexes.length;
|
|
66
|
+
cycleIndex++
|
|
67
|
+
) {
|
|
68
|
+
const sourceIndex = cycleNodeIndexes[cycleIndex];
|
|
69
|
+
const targetIndex =
|
|
70
|
+
cycleNodeIndexes[(cycleIndex + 1) % cycleNodeIndexes.length];
|
|
71
|
+
cycleEdges.push([sourceIndex, targetIndex]);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let edgeIndex = 0;
|
|
75
|
+
for (const [sourceIndex, targetIndex] of edges) {
|
|
76
|
+
const edgeBelongsToCycle = cycleEdges.some(
|
|
77
|
+
([cycleSourceIndex, cycleTargetIndex]) =>
|
|
78
|
+
cycleSourceIndex === sourceIndex && cycleTargetIndex === targetIndex,
|
|
79
|
+
);
|
|
80
|
+
if (edgeBelongsToCycle) {
|
|
81
|
+
mermaidLines.push(
|
|
82
|
+
` linkStyle ${edgeIndex} stroke:#ff4d4f,stroke-width:2px;`,
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
edgeIndex++;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return mermaidLines.join("\n");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Build requirementSets from explicit requirements and constraints (for debug visualization).
|
|
94
|
+
*
|
|
95
|
+
* This reconstructs what requirements were inferred from constraints by looking at
|
|
96
|
+
* the constraints that were processed. Only processes catalog/explicit constraints,
|
|
97
|
+
* as custom constraints don't affect requirement sets.
|
|
98
|
+
*/
|
|
99
|
+
function buildRequirementSets(
|
|
100
|
+
explicitRequirementSets: Array<Set<string>>,
|
|
101
|
+
constraints: Constraint[],
|
|
102
|
+
changeIndexesByCreatedId: Map<string, Set<number>>,
|
|
103
|
+
_changeIndexesByExplicitRequirementId: Map<string, Set<number>>,
|
|
104
|
+
): Array<Set<string>> {
|
|
105
|
+
// Start with explicit requirements
|
|
106
|
+
const requirementSets: Array<Set<string>> = explicitRequirementSets.map(
|
|
107
|
+
(explicitRequirements) => new Set<string>(explicitRequirements),
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
// Add requirements inferred from catalog/explicit constraints
|
|
111
|
+
// For each constraint with a reason, if the referenced ID is created by some change,
|
|
112
|
+
// then the target change requires the referenced ID
|
|
113
|
+
for (const constraint of constraints) {
|
|
114
|
+
// Only process catalog/explicit constraints (custom constraints don't affect requirements)
|
|
115
|
+
if (constraint.source === "custom" || !constraint.reason) continue;
|
|
116
|
+
|
|
117
|
+
const referencedProducers = changeIndexesByCreatedId.get(
|
|
118
|
+
constraint.reason.referencedStableId,
|
|
119
|
+
);
|
|
120
|
+
if (!referencedProducers || referencedProducers.size === 0) continue;
|
|
121
|
+
|
|
122
|
+
// The target change requires the referenced stable ID
|
|
123
|
+
requirementSets[constraint.targetChangeIndex].add(
|
|
124
|
+
constraint.reason.referencedStableId,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return requirementSets;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Build dependenciesByReferencedId from dependency rows (for debug visualization).
|
|
133
|
+
*/
|
|
134
|
+
function buildDependenciesByReferencedId(
|
|
135
|
+
dependencyRows: PgDependRow[],
|
|
136
|
+
): Map<string, Set<string>> {
|
|
137
|
+
const dependenciesByReferencedId = new Map<string, Set<string>>();
|
|
138
|
+
for (const dependencyRow of dependencyRows) {
|
|
139
|
+
// Filter out unknown dependencies
|
|
140
|
+
if (
|
|
141
|
+
dependencyRow.referenced_stable_id.startsWith("unknown:") ||
|
|
142
|
+
dependencyRow.dependent_stable_id.startsWith("unknown:")
|
|
143
|
+
) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let dependentIds = dependenciesByReferencedId.get(
|
|
148
|
+
dependencyRow.referenced_stable_id,
|
|
149
|
+
);
|
|
150
|
+
if (!dependentIds) {
|
|
151
|
+
dependentIds = new Set<string>();
|
|
152
|
+
dependenciesByReferencedId.set(
|
|
153
|
+
dependencyRow.referenced_stable_id,
|
|
154
|
+
dependentIds,
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
dependentIds.add(dependencyRow.dependent_stable_id);
|
|
158
|
+
}
|
|
159
|
+
return dependenciesByReferencedId;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Describe an edge in the dependency graph for visualization.
|
|
164
|
+
*/
|
|
165
|
+
function describeEdge(
|
|
166
|
+
sourceIndex: number,
|
|
167
|
+
targetIndex: number,
|
|
168
|
+
graphData: GraphData,
|
|
169
|
+
requirementSets: Array<Set<string>>,
|
|
170
|
+
dependenciesByReferencedId: Map<string, Set<string>>,
|
|
171
|
+
): string {
|
|
172
|
+
// Check if target explicitly requires something created by source
|
|
173
|
+
for (const createdId of graphData.createdStableIdSets[sourceIndex]) {
|
|
174
|
+
if (requirementSets[targetIndex].has(createdId)) {
|
|
175
|
+
return `${createdId} -> (requires)`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Check pg_depend relationships
|
|
180
|
+
for (const createdId of graphData.createdStableIdSets[sourceIndex]) {
|
|
181
|
+
const outgoingDependencies = dependenciesByReferencedId.get(createdId);
|
|
182
|
+
if (!outgoingDependencies) continue;
|
|
183
|
+
|
|
184
|
+
// Check if target requires this ID
|
|
185
|
+
for (const requiredId of requirementSets[targetIndex]) {
|
|
186
|
+
if (outgoingDependencies.has(requiredId)) {
|
|
187
|
+
return `${createdId} -> ${requiredId}`;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Check if target creates something that depends on this ID
|
|
192
|
+
for (const targetCreatedId of graphData.createdStableIdSets[targetIndex]) {
|
|
193
|
+
if (outgoingDependencies.has(targetCreatedId)) {
|
|
194
|
+
return `${createdId} -> ${targetCreatedId}`;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return "";
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Print debug information about the dependency graph.
|
|
204
|
+
*
|
|
205
|
+
* Builds debug-only data structures (requirementSets, dependenciesByReferencedId) just-in-time.
|
|
206
|
+
*/
|
|
207
|
+
export function printDebugGraph(
|
|
208
|
+
phaseChanges: Change[],
|
|
209
|
+
graphData: GraphData,
|
|
210
|
+
edges: Array<[number, number]>,
|
|
211
|
+
dependencyRows: PgDependRow[],
|
|
212
|
+
constraints: Constraint[],
|
|
213
|
+
): void {
|
|
214
|
+
try {
|
|
215
|
+
// Build debug-only data structures just-in-time
|
|
216
|
+
const requirementSets = buildRequirementSets(
|
|
217
|
+
graphData.explicitRequirementSets,
|
|
218
|
+
constraints,
|
|
219
|
+
graphData.changeIndexesByCreatedId,
|
|
220
|
+
graphData.changeIndexesByExplicitRequirementId,
|
|
221
|
+
);
|
|
222
|
+
const dependenciesByReferencedId =
|
|
223
|
+
buildDependenciesByReferencedId(dependencyRows);
|
|
224
|
+
|
|
225
|
+
const mermaidDiagram = generateMermaidDiagram(
|
|
226
|
+
phaseChanges,
|
|
227
|
+
graphData,
|
|
228
|
+
edges,
|
|
229
|
+
requirementSets,
|
|
230
|
+
dependenciesByReferencedId,
|
|
231
|
+
);
|
|
232
|
+
debugGraph(
|
|
233
|
+
"\n==== Mermaid (cycle detected) ====\n%s\n==== end ====",
|
|
234
|
+
mermaidDiagram,
|
|
235
|
+
);
|
|
236
|
+
} catch (_error) {
|
|
237
|
+
// ignore debug printing errors
|
|
238
|
+
}
|
|
239
|
+
}
|