@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,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative export command - export a declarative SQL schema from a database diff.
|
|
3
|
+
*/
|
|
4
|
+
import { mkdir, rm, writeFile } from "node:fs/promises";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { buildCommand } from "@stricli/core";
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { deserializeCatalog } from "../../core/catalog.snapshot.js";
|
|
9
|
+
import { exportDeclarativeSchema } from "../../core/export/index.js";
|
|
10
|
+
import { compileSerializeDSL, } from "../../core/integrations/serialize/dsl.js";
|
|
11
|
+
import { createPlan } from "../../core/plan/index.js";
|
|
12
|
+
import { assertSafePath, buildFileTree, computeFileDiff, formatExportSummary, } from "../utils/export-display.js";
|
|
13
|
+
import { resolveIntegrationOptions } from "../utils/integrations.js";
|
|
14
|
+
import { isPostgresUrl, loadCatalogFromFile } from "../utils/resolve-input.js";
|
|
15
|
+
function parseJsonFlag(label, value) {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(value);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
throw new Error(`Invalid ${label} JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export const declarativeExportCommand = buildCommand({
|
|
24
|
+
parameters: {
|
|
25
|
+
flags: {
|
|
26
|
+
source: {
|
|
27
|
+
kind: "parsed",
|
|
28
|
+
brief: "Source (current state): postgres URL or catalog snapshot file path. Omit to export all objects from target.",
|
|
29
|
+
parse: String,
|
|
30
|
+
optional: true,
|
|
31
|
+
},
|
|
32
|
+
target: {
|
|
33
|
+
kind: "parsed",
|
|
34
|
+
brief: "Target (desired state): postgres URL or catalog snapshot file path",
|
|
35
|
+
parse: String,
|
|
36
|
+
},
|
|
37
|
+
output: {
|
|
38
|
+
kind: "parsed",
|
|
39
|
+
brief: "Output directory path for declarative schema files",
|
|
40
|
+
parse: String,
|
|
41
|
+
},
|
|
42
|
+
integration: {
|
|
43
|
+
kind: "parsed",
|
|
44
|
+
brief: "Integration name (e.g., 'supabase') or path to integration JSON file",
|
|
45
|
+
parse: String,
|
|
46
|
+
optional: true,
|
|
47
|
+
},
|
|
48
|
+
filter: {
|
|
49
|
+
kind: "parsed",
|
|
50
|
+
brief: 'Filter DSL as inline JSON (e.g., \'{"schema":"public"}\')',
|
|
51
|
+
parse: (v) => parseJsonFlag("filter", v),
|
|
52
|
+
optional: true,
|
|
53
|
+
},
|
|
54
|
+
serialize: {
|
|
55
|
+
kind: "parsed",
|
|
56
|
+
brief: 'Serialize DSL as inline JSON array (e.g., \'[{"when":{"type":"schema"},"options":{"skipAuthorization":true}}]\')',
|
|
57
|
+
parse: (v) => parseJsonFlag("serialize", v),
|
|
58
|
+
optional: true,
|
|
59
|
+
},
|
|
60
|
+
"grouping-mode": {
|
|
61
|
+
kind: "enum",
|
|
62
|
+
brief: "How grouped entities are organized on disk",
|
|
63
|
+
values: ["single-file", "subdirectory"],
|
|
64
|
+
optional: true,
|
|
65
|
+
},
|
|
66
|
+
"group-patterns": {
|
|
67
|
+
kind: "parsed",
|
|
68
|
+
brief: 'JSON array of {pattern, name} objects (e.g., \'[{"pattern":"^auth","name":"auth"}]\')',
|
|
69
|
+
parse: (v) => {
|
|
70
|
+
const parsed = parseJsonFlag("group-patterns", v);
|
|
71
|
+
if (!Array.isArray(parsed)) {
|
|
72
|
+
throw new Error("group-patterns must be a JSON array");
|
|
73
|
+
}
|
|
74
|
+
return parsed;
|
|
75
|
+
},
|
|
76
|
+
optional: true,
|
|
77
|
+
},
|
|
78
|
+
"flat-schemas": {
|
|
79
|
+
kind: "parsed",
|
|
80
|
+
brief: "Comma-separated list of schemas to flatten (e.g., partman,pgboss,audit)",
|
|
81
|
+
parse: String,
|
|
82
|
+
optional: true,
|
|
83
|
+
},
|
|
84
|
+
"format-options": {
|
|
85
|
+
kind: "parsed",
|
|
86
|
+
brief: 'SQL format options as inline JSON (e.g., \'{"keywordCase":"lower","maxWidth":180}\')',
|
|
87
|
+
parse: (v) => parseJsonFlag("format-options", v),
|
|
88
|
+
optional: true,
|
|
89
|
+
},
|
|
90
|
+
force: {
|
|
91
|
+
kind: "boolean",
|
|
92
|
+
brief: "Remove entire output directory before writing",
|
|
93
|
+
optional: true,
|
|
94
|
+
},
|
|
95
|
+
"dry-run": {
|
|
96
|
+
kind: "boolean",
|
|
97
|
+
brief: "Show tree and summary without writing files",
|
|
98
|
+
optional: true,
|
|
99
|
+
},
|
|
100
|
+
"diff-focus": {
|
|
101
|
+
kind: "boolean",
|
|
102
|
+
brief: "Show only files that changed (created/updated/deleted) in the tree",
|
|
103
|
+
optional: true,
|
|
104
|
+
},
|
|
105
|
+
verbose: {
|
|
106
|
+
kind: "boolean",
|
|
107
|
+
brief: "Show detailed output",
|
|
108
|
+
optional: true,
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
aliases: {
|
|
112
|
+
s: "source",
|
|
113
|
+
t: "target",
|
|
114
|
+
o: "output",
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
docs: {
|
|
118
|
+
brief: "Export a declarative schema from a database diff",
|
|
119
|
+
fullDescription: `
|
|
120
|
+
Export a declarative SQL schema by comparing two databases (source → target).
|
|
121
|
+
Writes .sql files to the output directory, grouped by object type and optional
|
|
122
|
+
grouping rules.
|
|
123
|
+
|
|
124
|
+
When --source is omitted, all objects from the target database are exported
|
|
125
|
+
(equivalent to diffing from an empty database).
|
|
126
|
+
|
|
127
|
+
Flags:
|
|
128
|
+
source - Source database connection URL (optional; omit for full export)
|
|
129
|
+
target - Target database connection URL (desired state)
|
|
130
|
+
output - Directory path for generated .sql files
|
|
131
|
+
integration - Integration name or path (e.g., supabase) for filter/serialize
|
|
132
|
+
filter - Filter DSL as JSON to include/exclude changes
|
|
133
|
+
serialize - Serialize DSL as JSON array for custom SQL generation
|
|
134
|
+
grouping-mode - single-file or subdirectory for grouped entities
|
|
135
|
+
group-patterns - JSON array of {pattern, name} for name-based grouping
|
|
136
|
+
flat-schemas - Comma-separated schemas to merge into one file per category
|
|
137
|
+
format-options - SQL format options as JSON
|
|
138
|
+
force - Remove output directory before writing (full replace)
|
|
139
|
+
dry-run - Show tree and summary only, do not write files
|
|
140
|
+
diff-focus - Show only changed files (created/updated/deleted) in the tree
|
|
141
|
+
verbose - Show detailed output
|
|
142
|
+
|
|
143
|
+
After export, a tip is printed with the command to apply the schema to an empty database.
|
|
144
|
+
`.trim(),
|
|
145
|
+
},
|
|
146
|
+
async func(flags) {
|
|
147
|
+
const { filter, serialize, emptyCatalog: integrationEmptyCatalog, } = await resolveIntegrationOptions({
|
|
148
|
+
filter: flags.filter,
|
|
149
|
+
serialize: flags.serialize,
|
|
150
|
+
integration: flags.integration,
|
|
151
|
+
});
|
|
152
|
+
const resolvedSource = flags.source
|
|
153
|
+
? isPostgresUrl(flags.source)
|
|
154
|
+
? flags.source
|
|
155
|
+
: await loadCatalogFromFile(flags.source)
|
|
156
|
+
: integrationEmptyCatalog
|
|
157
|
+
? deserializeCatalog(integrationEmptyCatalog)
|
|
158
|
+
: null;
|
|
159
|
+
const resolvedTarget = isPostgresUrl(flags.target)
|
|
160
|
+
? flags.target
|
|
161
|
+
: await loadCatalogFromFile(flags.target);
|
|
162
|
+
// Pass raw DSL to createPlan (not pre-compiled functions).
|
|
163
|
+
// createPlan compiles them internally and uses the DSL type to correctly
|
|
164
|
+
// determine cascade behavior: DSL filters disable cascading by default
|
|
165
|
+
// (unless cascade:true is set), preventing unintended exclusion of
|
|
166
|
+
// changes that depend on filtered objects (e.g. RLS policies that
|
|
167
|
+
// reference auth.uid() when the auth schema is filtered out).
|
|
168
|
+
const planResult = await createPlan(resolvedSource, resolvedTarget, {
|
|
169
|
+
filter,
|
|
170
|
+
serialize,
|
|
171
|
+
skipDefaultPrivilegeSubtraction: true,
|
|
172
|
+
});
|
|
173
|
+
if (!planResult) {
|
|
174
|
+
this.process.stdout.write("No changes detected.\n");
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const hasGrouping = flags["grouping-mode"] !== undefined ||
|
|
178
|
+
(flags["group-patterns"] !== undefined &&
|
|
179
|
+
flags["group-patterns"].length > 0) ||
|
|
180
|
+
(flags["flat-schemas"] !== undefined && flags["flat-schemas"].length > 0);
|
|
181
|
+
let grouping;
|
|
182
|
+
if (hasGrouping) {
|
|
183
|
+
grouping = {
|
|
184
|
+
mode: flags["grouping-mode"] ?? "single-file",
|
|
185
|
+
groupPatterns: flags["group-patterns"],
|
|
186
|
+
autoGroupPartitions: true,
|
|
187
|
+
flatSchemas: flags["flat-schemas"] !== undefined
|
|
188
|
+
? flags["flat-schemas"]
|
|
189
|
+
.split(",")
|
|
190
|
+
.map((s) => s.trim())
|
|
191
|
+
.filter(Boolean)
|
|
192
|
+
: undefined,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const serializeFn = serialize !== undefined ? compileSerializeDSL(serialize) : undefined;
|
|
196
|
+
const output = exportDeclarativeSchema(planResult, {
|
|
197
|
+
integration: serializeFn !== undefined ? { serialize: serializeFn } : undefined,
|
|
198
|
+
formatOptions: flags["format-options"] ?? undefined,
|
|
199
|
+
grouping,
|
|
200
|
+
onWarning: (msg) => {
|
|
201
|
+
this.process.stderr.write(chalk.yellow(`Warning: ${msg}\n`));
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
const outputDir = path.resolve(flags.output);
|
|
205
|
+
const applyTip = (dir) => `\nTip: To apply this schema to an empty database, run:\n pgdelta declarative apply --path ${dir} --target <database_url>\n`;
|
|
206
|
+
const diff = await computeFileDiff(outputDir, output.files);
|
|
207
|
+
this.process.stdout.write("\n");
|
|
208
|
+
this.process.stdout.write(`${buildFileTree(output.files.map((f) => f.path), path.basename(outputDir) || outputDir, { diff, diffFocus: !!flags["diff-focus"] })}\n`);
|
|
209
|
+
this.process.stdout.write("\n");
|
|
210
|
+
this.process.stdout.write(`${chalk.green("+")} created ${chalk.yellow("~")} updated ${chalk.red("-")} deleted\n`);
|
|
211
|
+
this.process.stdout.write("\n");
|
|
212
|
+
const summary = formatExportSummary(diff, !!flags["dry-run"]);
|
|
213
|
+
if (summary) {
|
|
214
|
+
this.process.stdout.write(`${summary}\n`);
|
|
215
|
+
}
|
|
216
|
+
const totalChanges = planResult.sortedChanges.length;
|
|
217
|
+
const totalStatements = output.files.reduce((s, f) => s + f.statements, 0);
|
|
218
|
+
this.process.stdout.write(`Changes: ${totalChanges} | Files: ${output.files.length} | Statements: ${totalStatements}\n`);
|
|
219
|
+
if (flags["dry-run"]) {
|
|
220
|
+
this.process.stdout.write(chalk.dim("\n(dry-run: no files written)\n"));
|
|
221
|
+
this.process.stdout.write(chalk.cyan(applyTip(outputDir)));
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (flags.force) {
|
|
225
|
+
await rm(outputDir, { recursive: true, force: true });
|
|
226
|
+
await mkdir(outputDir, { recursive: true });
|
|
227
|
+
}
|
|
228
|
+
else if (diff.deleted.length > 0) {
|
|
229
|
+
this.process.stderr.write(chalk.yellow(`Warning: ${diff.deleted.length} existing file(s) will no longer be present. Use --force to replace the output directory.\n`));
|
|
230
|
+
}
|
|
231
|
+
for (const file of output.files) {
|
|
232
|
+
assertSafePath(file.path, outputDir);
|
|
233
|
+
const filePath = path.join(outputDir, file.path);
|
|
234
|
+
await mkdir(path.dirname(filePath), { recursive: true });
|
|
235
|
+
await writeFile(filePath, file.sql);
|
|
236
|
+
}
|
|
237
|
+
this.process.stdout.write(chalk.green(`Wrote ${output.files.length} file(s) to ${outputDir}\n`));
|
|
238
|
+
this.process.stdout.write(chalk.cyan(applyTip(outputDir)));
|
|
239
|
+
},
|
|
240
|
+
});
|
|
@@ -3,20 +3,24 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { writeFile } from "node:fs/promises";
|
|
5
5
|
import { buildCommand } from "@stricli/core";
|
|
6
|
+
import { deserializeCatalog } from "../../core/catalog.snapshot.js";
|
|
6
7
|
import { createPlan } from "../../core/plan/index.js";
|
|
7
|
-
import {
|
|
8
|
+
import { setCommandExitCode } from "../exit-code.js";
|
|
9
|
+
import { resolveIntegrationOptions } from "../utils/integrations.js";
|
|
10
|
+
import { isPostgresUrl, loadCatalogFromFile } from "../utils/resolve-input.js";
|
|
8
11
|
import { formatPlanForDisplay } from "../utils.js";
|
|
9
12
|
export const planCommand = buildCommand({
|
|
10
13
|
parameters: {
|
|
11
14
|
flags: {
|
|
12
15
|
source: {
|
|
13
16
|
kind: "parsed",
|
|
14
|
-
brief: "Source
|
|
17
|
+
brief: "Source (current state): postgres URL or catalog snapshot file path. Omit for empty baseline.",
|
|
15
18
|
parse: String,
|
|
19
|
+
optional: true,
|
|
16
20
|
},
|
|
17
21
|
target: {
|
|
18
22
|
kind: "parsed",
|
|
19
|
-
brief: "Target
|
|
23
|
+
brief: "Target (desired state): postgres URL or catalog snapshot file path",
|
|
20
24
|
parse: String,
|
|
21
25
|
},
|
|
22
26
|
format: {
|
|
@@ -69,6 +73,24 @@ export const planCommand = buildCommand({
|
|
|
69
73
|
parse: String,
|
|
70
74
|
optional: true,
|
|
71
75
|
},
|
|
76
|
+
"sql-format": {
|
|
77
|
+
kind: "boolean",
|
|
78
|
+
brief: "Format SQL output (opt-in for --format sql or .sql output).",
|
|
79
|
+
optional: true,
|
|
80
|
+
},
|
|
81
|
+
"sql-format-options": {
|
|
82
|
+
kind: "parsed",
|
|
83
|
+
brief: 'SQL format options as inline JSON (e.g., \'{"keywordCase":"upper","maxWidth":100}\').',
|
|
84
|
+
parse: (value) => {
|
|
85
|
+
try {
|
|
86
|
+
return JSON.parse(value);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
throw new Error(`Invalid SQL format JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
optional: true,
|
|
93
|
+
},
|
|
72
94
|
},
|
|
73
95
|
aliases: {
|
|
74
96
|
s: "source",
|
|
@@ -85,19 +107,25 @@ json/sql outputs are available for artifacts or piping.
|
|
|
85
107
|
`.trim(),
|
|
86
108
|
},
|
|
87
109
|
async func(flags) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
110
|
+
const { filter, serialize, emptyCatalog: integrationEmptyCatalog, } = await resolveIntegrationOptions({
|
|
111
|
+
filter: flags.filter,
|
|
112
|
+
serialize: flags.serialize,
|
|
113
|
+
integration: flags.integration,
|
|
114
|
+
});
|
|
115
|
+
const resolvedSource = flags.source
|
|
116
|
+
? isPostgresUrl(flags.source)
|
|
117
|
+
? flags.source
|
|
118
|
+
: await loadCatalogFromFile(flags.source)
|
|
119
|
+
: integrationEmptyCatalog
|
|
120
|
+
? deserializeCatalog(integrationEmptyCatalog)
|
|
121
|
+
: null;
|
|
122
|
+
const resolvedTarget = isPostgresUrl(flags.target)
|
|
123
|
+
? flags.target
|
|
124
|
+
: await loadCatalogFromFile(flags.target);
|
|
125
|
+
const planResult = await createPlan(resolvedSource, resolvedTarget, {
|
|
98
126
|
role: flags.role,
|
|
99
|
-
filter
|
|
100
|
-
serialize
|
|
127
|
+
filter,
|
|
128
|
+
serialize,
|
|
101
129
|
});
|
|
102
130
|
if (!planResult) {
|
|
103
131
|
this.process.stdout.write("No changes detected.\n");
|
|
@@ -120,6 +148,9 @@ json/sql outputs are available for artifacts or piping.
|
|
|
120
148
|
const { content, label } = formatPlanForDisplay(planResult, effectiveFormat, {
|
|
121
149
|
disableColors: !!outputPath,
|
|
122
150
|
showUnsafeFlagSuggestion: false,
|
|
151
|
+
sqlFormatOptions: flags["sql-format"] || flags["sql-format-options"]
|
|
152
|
+
? (flags["sql-format-options"] ?? {})
|
|
153
|
+
: undefined,
|
|
123
154
|
});
|
|
124
155
|
if (outputPath) {
|
|
125
156
|
await writeFile(outputPath, content, "utf-8");
|
|
@@ -132,6 +163,6 @@ json/sql outputs are available for artifacts or piping.
|
|
|
132
163
|
}
|
|
133
164
|
}
|
|
134
165
|
// Exit code 2 indicates changes were detected
|
|
135
|
-
|
|
166
|
+
setCommandExitCode(2);
|
|
136
167
|
},
|
|
137
168
|
});
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { buildCommand } from "@stricli/core";
|
|
5
5
|
import { applyPlan } from "../../core/plan/apply.js";
|
|
6
6
|
import { createPlan } from "../../core/plan/index.js";
|
|
7
|
-
import {
|
|
7
|
+
import { resolveIntegrationOptions } from "../utils/integrations.js";
|
|
8
8
|
import { formatPlanForDisplay, handleApplyResult, promptConfirmation, validatePlanRisk, } from "../utils.js";
|
|
9
9
|
export const syncCommand = buildCommand({
|
|
10
10
|
parameters: {
|
|
@@ -91,20 +91,16 @@ Exit codes:
|
|
|
91
91
|
`.trim(),
|
|
92
92
|
},
|
|
93
93
|
async func(flags) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
// Use integration DSL if explicit flags not provided
|
|
100
|
-
filterOption = filterOption ?? integrationDSL.filter;
|
|
101
|
-
serializeOption = serializeOption ?? integrationDSL.serialize;
|
|
102
|
-
}
|
|
94
|
+
const { filter, serialize } = await resolveIntegrationOptions({
|
|
95
|
+
filter: flags.filter,
|
|
96
|
+
serialize: flags.serialize,
|
|
97
|
+
integration: flags.integration,
|
|
98
|
+
});
|
|
103
99
|
// 1. Create the plan
|
|
104
100
|
const planResult = await createPlan(flags.source, flags.target, {
|
|
105
101
|
role: flags.role,
|
|
106
|
-
filter
|
|
107
|
-
serialize
|
|
102
|
+
filter,
|
|
103
|
+
serialize,
|
|
108
104
|
});
|
|
109
105
|
if (!planResult) {
|
|
110
106
|
this.process.stdout.write("No changes detected.\n");
|
|
@@ -12,7 +12,7 @@ export function formatTree(plan) {
|
|
|
12
12
|
// Summary
|
|
13
13
|
const total = countTotalChanges(plan);
|
|
14
14
|
lines.push(chalk.bold(`📋 Migration Plan: ${total} change${total !== 1 ? "s" : ""}`));
|
|
15
|
-
const summary =
|
|
15
|
+
const summary = buildPlanSummaryTable(plan);
|
|
16
16
|
if (summary) {
|
|
17
17
|
lines.push("");
|
|
18
18
|
lines.push(summary);
|
|
@@ -38,8 +38,9 @@ function countTotalChanges(plan) {
|
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
40
|
* Build summary as a table showing counts by entity type and operation.
|
|
41
|
+
* Exported for use by declarative-export to show the same summary style.
|
|
41
42
|
*/
|
|
42
|
-
function
|
|
43
|
+
function buildPlanSummaryTable(plan) {
|
|
43
44
|
// Count by object type
|
|
44
45
|
const byType = {};
|
|
45
46
|
countFromHierarchy(plan, byType);
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Display utilities for the declarative-apply command.
|
|
3
|
+
*
|
|
4
|
+
* Pure formatting and location-resolution functions — no CLI framework dependency.
|
|
5
|
+
* Used to:
|
|
6
|
+
* - Map pg-topo diagnostics into display items (optionally grouped by message/code).
|
|
7
|
+
* - Resolve statement IDs to file paths and line/column for error output.
|
|
8
|
+
* - Format StatementErrors in a pgAdmin-style multi-line block.
|
|
9
|
+
*/
|
|
10
|
+
import type { Diagnostic } from "@supabase/pg-topo";
|
|
11
|
+
import type { StatementError } from "../../core/declarative-apply/round-apply.ts";
|
|
12
|
+
/**
|
|
13
|
+
* Convert a 1-based character offset in a string to 1-based line and column.
|
|
14
|
+
* Used when mapping PostgreSQL error positions (in SQL) to file locations.
|
|
15
|
+
*/
|
|
16
|
+
export declare function positionToLineColumn(sql: string, position: number): {
|
|
17
|
+
line: number;
|
|
18
|
+
column: number;
|
|
19
|
+
};
|
|
20
|
+
/** Input to buildDiagnosticDisplayItems: a pg-topo diagnostic plus optional location and object key. */
|
|
21
|
+
export type DiagnosticDisplayEntry = {
|
|
22
|
+
diagnostic: Diagnostic;
|
|
23
|
+
location?: string;
|
|
24
|
+
requiredObjectKey?: string;
|
|
25
|
+
};
|
|
26
|
+
/** One display row for a diagnostic (or a group of same-code diagnostics with multiple locations). */
|
|
27
|
+
type DiagnosticDisplayItem = {
|
|
28
|
+
code: string;
|
|
29
|
+
message: string;
|
|
30
|
+
suggestedFix?: string;
|
|
31
|
+
requiredObjectKey?: string;
|
|
32
|
+
locations: string[];
|
|
33
|
+
};
|
|
34
|
+
/** Extract requiredObjectKey from a pg-topo diagnostic if present and non-empty. */
|
|
35
|
+
export declare const requiredObjectKeyFromDiagnostic: (diagnostic: Diagnostic) => string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Turn diagnostic entries into display items. If grouped is true, entries with
|
|
38
|
+
* the same code/message/suggestedFix are merged into one item with multiple locations.
|
|
39
|
+
*/
|
|
40
|
+
export declare const buildDiagnosticDisplayItems: (entries: DiagnosticDisplayEntry[], grouped: boolean) => DiagnosticDisplayItem[];
|
|
41
|
+
/**
|
|
42
|
+
* Resolve the full path to a .sql file from the schema path (directory or single file)
|
|
43
|
+
* and a relative file path (e.g. from a statement id). If schemaPath is a file, its
|
|
44
|
+
* directory is used as the base.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveSqlFilePath(schemaPath: string, relativeFilePath: string): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Format a StatementError in pgAdmin-style: ERROR, Detail, SQL state, optional
|
|
49
|
+
* Context, Hint, and Location (resolving the .sql file and line/column when possible).
|
|
50
|
+
*/
|
|
51
|
+
export declare function formatStatementError(err: StatementError, schemaPath: string): Promise<string>;
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Display utilities for the declarative-apply command.
|
|
3
|
+
*
|
|
4
|
+
* Pure formatting and location-resolution functions — no CLI framework dependency.
|
|
5
|
+
* Used to:
|
|
6
|
+
* - Map pg-topo diagnostics into display items (optionally grouped by message/code).
|
|
7
|
+
* - Resolve statement IDs to file paths and line/column for error output.
|
|
8
|
+
* - Format StatementErrors in a pgAdmin-style multi-line block.
|
|
9
|
+
*/
|
|
10
|
+
import { readFile, stat } from "node:fs/promises";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
/**
|
|
13
|
+
* Convert a 1-based character offset in a string to 1-based line and column.
|
|
14
|
+
* Used when mapping PostgreSQL error positions (in SQL) to file locations.
|
|
15
|
+
*/
|
|
16
|
+
export function positionToLineColumn(sql, position) {
|
|
17
|
+
const lines = sql.split("\n");
|
|
18
|
+
let offset = 0;
|
|
19
|
+
for (let i = 0; i < lines.length; i++) {
|
|
20
|
+
const lineLen = lines[i].length + (i < lines.length - 1 ? 1 : 0);
|
|
21
|
+
if (position <= offset + lineLen) {
|
|
22
|
+
return { line: i + 1, column: position - offset };
|
|
23
|
+
}
|
|
24
|
+
offset += lineLen;
|
|
25
|
+
}
|
|
26
|
+
const last = lines.length;
|
|
27
|
+
const lastLineLen = lines[last - 1]?.length ?? 0;
|
|
28
|
+
return { line: last, column: lastLineLen + 1 };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse a statement id in the form "filePath:statementIndex" into components.
|
|
32
|
+
* The last colon separates path from index (paths may contain colons).
|
|
33
|
+
* Returns null if the format is invalid.
|
|
34
|
+
*/
|
|
35
|
+
function parseStatementId(id) {
|
|
36
|
+
const lastColon = id.lastIndexOf(":");
|
|
37
|
+
if (lastColon === -1)
|
|
38
|
+
return null;
|
|
39
|
+
const filePath = id.slice(0, lastColon);
|
|
40
|
+
const n = Number.parseInt(id.slice(lastColon + 1), 10);
|
|
41
|
+
if (!Number.isInteger(n) || n < 0)
|
|
42
|
+
return null;
|
|
43
|
+
return { filePath, statementIndex: n };
|
|
44
|
+
}
|
|
45
|
+
/** Extract requiredObjectKey from a pg-topo diagnostic if present and non-empty. */
|
|
46
|
+
export const requiredObjectKeyFromDiagnostic = (diagnostic) => {
|
|
47
|
+
const value = diagnostic.details?.requiredObjectKey;
|
|
48
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
49
|
+
};
|
|
50
|
+
/** Build a stable key for grouping diagnostics with the same code, message, and suggested fix. */
|
|
51
|
+
const diagnosticDisplayGroupKey = (entry) => [
|
|
52
|
+
entry.diagnostic.code,
|
|
53
|
+
entry.diagnostic.message,
|
|
54
|
+
entry.diagnostic.suggestedFix ?? "",
|
|
55
|
+
entry.requiredObjectKey ?? "",
|
|
56
|
+
].join("\u0000");
|
|
57
|
+
/**
|
|
58
|
+
* Turn diagnostic entries into display items. If grouped is true, entries with
|
|
59
|
+
* the same code/message/suggestedFix are merged into one item with multiple locations.
|
|
60
|
+
*/
|
|
61
|
+
export const buildDiagnosticDisplayItems = (entries, grouped) => {
|
|
62
|
+
if (!grouped) {
|
|
63
|
+
return entries.map((entry) => ({
|
|
64
|
+
code: entry.diagnostic.code,
|
|
65
|
+
message: entry.diagnostic.message,
|
|
66
|
+
suggestedFix: entry.diagnostic.suggestedFix,
|
|
67
|
+
requiredObjectKey: entry.requiredObjectKey,
|
|
68
|
+
locations: entry.location ? [entry.location] : [],
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
const groupedItems = new Map();
|
|
72
|
+
for (const entry of entries) {
|
|
73
|
+
const key = diagnosticDisplayGroupKey(entry);
|
|
74
|
+
const existing = groupedItems.get(key);
|
|
75
|
+
if (!existing) {
|
|
76
|
+
groupedItems.set(key, {
|
|
77
|
+
code: entry.diagnostic.code,
|
|
78
|
+
message: entry.diagnostic.message,
|
|
79
|
+
suggestedFix: entry.diagnostic.suggestedFix,
|
|
80
|
+
requiredObjectKey: entry.requiredObjectKey,
|
|
81
|
+
locations: entry.location ? [entry.location] : [],
|
|
82
|
+
});
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (entry.location && !existing.locations.includes(entry.location)) {
|
|
86
|
+
existing.locations.push(entry.location);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return [...groupedItems.values()];
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Resolve the full path to a .sql file from the schema path (directory or single file)
|
|
93
|
+
* and a relative file path (e.g. from a statement id). If schemaPath is a file, its
|
|
94
|
+
* directory is used as the base.
|
|
95
|
+
*/
|
|
96
|
+
export async function resolveSqlFilePath(schemaPath, relativeFilePath) {
|
|
97
|
+
try {
|
|
98
|
+
const statResult = await stat(schemaPath);
|
|
99
|
+
const baseDir = statResult.isFile() ? path.dirname(schemaPath) : schemaPath;
|
|
100
|
+
return path.join(baseDir, relativeFilePath);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return path.join(schemaPath, relativeFilePath);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Find the 0-based start offset of statementSql in fileContent.
|
|
108
|
+
* Tries exact match first, then trimmed match. Returns -1 if not found.
|
|
109
|
+
*/
|
|
110
|
+
function findStatementStartInFile(fileContent, statementSql) {
|
|
111
|
+
const exact = fileContent.indexOf(statementSql);
|
|
112
|
+
if (exact !== -1)
|
|
113
|
+
return exact;
|
|
114
|
+
const trimmedStmt = statementSql.trim();
|
|
115
|
+
if (!trimmedStmt)
|
|
116
|
+
return -1;
|
|
117
|
+
const trimmed = fileContent.indexOf(trimmedStmt);
|
|
118
|
+
if (trimmed !== -1)
|
|
119
|
+
return trimmed;
|
|
120
|
+
return -1;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Format a StatementError in pgAdmin-style: ERROR, Detail, SQL state, optional
|
|
124
|
+
* Context, Hint, and Location (resolving the .sql file and line/column when possible).
|
|
125
|
+
*/
|
|
126
|
+
export async function formatStatementError(err, schemaPath) {
|
|
127
|
+
const lines = [];
|
|
128
|
+
lines.push(`ERROR: ${err.message}`);
|
|
129
|
+
if (err.detail) {
|
|
130
|
+
lines.push(`Detail: ${err.detail}`);
|
|
131
|
+
}
|
|
132
|
+
lines.push(`SQL state: ${err.code}`);
|
|
133
|
+
if (err.position !== undefined && err.statement.sql.length > 0) {
|
|
134
|
+
lines.push(`Character: ${err.position}`);
|
|
135
|
+
const pos = Math.max(0, Math.min(err.position - 1, err.statement.sql.length));
|
|
136
|
+
const contextStart = Math.max(0, pos - 40);
|
|
137
|
+
const contextEnd = Math.min(err.statement.sql.length, pos + 40);
|
|
138
|
+
const snippet = err.statement.sql.slice(contextStart, contextEnd);
|
|
139
|
+
const oneLine = snippet.replace(/\s+/g, " ").trim();
|
|
140
|
+
lines.push(`Context: ${oneLine || "(empty)"}`);
|
|
141
|
+
}
|
|
142
|
+
if (err.hint) {
|
|
143
|
+
lines.push(`Hint: ${err.hint}`);
|
|
144
|
+
}
|
|
145
|
+
const parsed = parseStatementId(err.statement.id);
|
|
146
|
+
if (parsed) {
|
|
147
|
+
let locationLine;
|
|
148
|
+
try {
|
|
149
|
+
const fullPath = await resolveSqlFilePath(schemaPath, parsed.filePath);
|
|
150
|
+
const fileContent = await readFile(fullPath, "utf-8");
|
|
151
|
+
const statementStart = findStatementStartInFile(fileContent, err.statement.sql);
|
|
152
|
+
if (statementStart !== -1) {
|
|
153
|
+
if (err.position !== undefined && err.statement.sql.length > 0) {
|
|
154
|
+
const fileErrorOffset = statementStart + (err.position - 1);
|
|
155
|
+
const fileErrorPosition = Math.min(fileErrorOffset + 1, fileContent.length);
|
|
156
|
+
const { line, column } = positionToLineColumn(fileContent, Math.max(1, fileErrorPosition));
|
|
157
|
+
locationLine = `Location: ${parsed.filePath}:${line}:${column}`;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
const { line } = positionToLineColumn(fileContent, statementStart + 1);
|
|
161
|
+
locationLine = `Location: ${parsed.filePath}:${line}`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
locationLine = `Location: ${parsed.filePath} (statement ${parsed.statementIndex})`;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
if (err.position !== undefined && err.statement.sql.length > 0) {
|
|
170
|
+
const { line, column } = positionToLineColumn(err.statement.sql, err.position);
|
|
171
|
+
locationLine = `Location: ${parsed.filePath} (statement ${parsed.statementIndex}, line ${line}, column ${column})`;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
locationLine = `Location: ${parsed.filePath} (statement ${parsed.statementIndex})`;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
lines.push(locationLine);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
lines.push(`Location: ${err.statement.id}`);
|
|
181
|
+
}
|
|
182
|
+
return lines.map((l) => ` ${l}`).join("\n");
|
|
183
|
+
}
|