@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,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discover and read .sql files under a schema path (file or directory).
|
|
3
|
+
* Matches pg-topo's discovery order for deterministic statement ordering.
|
|
4
|
+
*/
|
|
5
|
+
export interface SqlFileEntry {
|
|
6
|
+
/** Relative path from base (forward slashes, e.g. schemas/public/views/billing.sql) */
|
|
7
|
+
filePath: string;
|
|
8
|
+
/** File content */
|
|
9
|
+
sql: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Load all .sql files under schemaPath (a single .sql file or a directory).
|
|
13
|
+
* Returns entries in the same order as pg-topo's discover (sorted by full path).
|
|
14
|
+
*
|
|
15
|
+
* @throws If schemaPath does not exist, is not a file/directory, or any file cannot be read.
|
|
16
|
+
* Error message includes path and code (e.g. ENOENT, EACCES) for CLI to display.
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadDeclarativeSchema(schemaPath: string): Promise<SqlFileEntry[]>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discover and read .sql files under a schema path (file or directory).
|
|
3
|
+
* Matches pg-topo's discovery order for deterministic statement ordering.
|
|
4
|
+
*/
|
|
5
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
/**
|
|
8
|
+
* Recursively collect .sql files in a directory. Entries sorted by name,
|
|
9
|
+
* then full paths sorted for deterministic order (matches pg-topo discover).
|
|
10
|
+
*/
|
|
11
|
+
async function readSqlFilesInDirectory(directoryPath, outFiles) {
|
|
12
|
+
const entries = await readdir(directoryPath, { withFileTypes: true });
|
|
13
|
+
entries.sort((left, right) => left.name.localeCompare(right.name));
|
|
14
|
+
for (const entry of entries) {
|
|
15
|
+
const fullPath = path.join(directoryPath, entry.name);
|
|
16
|
+
if (entry.isDirectory()) {
|
|
17
|
+
await readSqlFilesInDirectory(fullPath, outFiles);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (entry.isFile() && fullPath.toLowerCase().endsWith(".sql")) {
|
|
21
|
+
outFiles.add(path.resolve(fullPath));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Stable relative path: path.relative(basePath, absolutePath) with forward slashes.
|
|
27
|
+
*/
|
|
28
|
+
function toStablePath(absolutePath, basePath) {
|
|
29
|
+
return path.relative(basePath, absolutePath).split(path.sep).join("/");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load all .sql files under schemaPath (a single .sql file or a directory).
|
|
33
|
+
* Returns entries in the same order as pg-topo's discover (sorted by full path).
|
|
34
|
+
*
|
|
35
|
+
* @throws If schemaPath does not exist, is not a file/directory, or any file cannot be read.
|
|
36
|
+
* Error message includes path and code (e.g. ENOENT, EACCES) for CLI to display.
|
|
37
|
+
*/
|
|
38
|
+
export async function loadDeclarativeSchema(schemaPath) {
|
|
39
|
+
const resolvedRoot = path.resolve(schemaPath);
|
|
40
|
+
let rootStats;
|
|
41
|
+
try {
|
|
42
|
+
rootStats = await stat(resolvedRoot);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
const code = err && typeof err === "object" && "code" in err
|
|
46
|
+
? String(err.code)
|
|
47
|
+
: "UNKNOWN";
|
|
48
|
+
throw new Error(`Cannot access '${schemaPath}': ${code}`);
|
|
49
|
+
}
|
|
50
|
+
let files;
|
|
51
|
+
let basePath;
|
|
52
|
+
if (rootStats.isFile()) {
|
|
53
|
+
if (!resolvedRoot.toLowerCase().endsWith(".sql")) {
|
|
54
|
+
throw new Error(`Path is not a .sql file: '${schemaPath}'`);
|
|
55
|
+
}
|
|
56
|
+
files = [resolvedRoot];
|
|
57
|
+
basePath = path.dirname(resolvedRoot);
|
|
58
|
+
}
|
|
59
|
+
else if (rootStats.isDirectory()) {
|
|
60
|
+
const fileSet = new Set();
|
|
61
|
+
await readSqlFilesInDirectory(resolvedRoot, fileSet);
|
|
62
|
+
files = [...fileSet].sort((a, b) => a.localeCompare(b));
|
|
63
|
+
basePath = resolvedRoot;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw new Error(`Path is not a file or directory: '${schemaPath}'`);
|
|
67
|
+
}
|
|
68
|
+
const entries = [];
|
|
69
|
+
for (const filePath of files) {
|
|
70
|
+
try {
|
|
71
|
+
const sql = await readFile(filePath, "utf-8");
|
|
72
|
+
entries.push({
|
|
73
|
+
filePath: toStablePath(filePath, basePath),
|
|
74
|
+
sql,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
const code = err && typeof err === "object" && "code" in err
|
|
79
|
+
? String(err.code)
|
|
80
|
+
: "UNKNOWN";
|
|
81
|
+
const relative = toStablePath(filePath, basePath);
|
|
82
|
+
throw new Error(`Cannot read file '${relative}': ${code}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return entries;
|
|
86
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract functions, types, and other catalog objects from the target database
|
|
3
|
+
* so pg-topo can treat them as external providers and suppress false
|
|
4
|
+
* UNRESOLVED_DEPENDENCY diagnostics (e.g. now(), gen_random_uuid(), nextval(),
|
|
5
|
+
* auth.users, extensions.uuid_generate_v4, etc.).
|
|
6
|
+
*/
|
|
7
|
+
import type { ObjectRef } from "@supabase/pg-topo";
|
|
8
|
+
import type { Pool } from "pg";
|
|
9
|
+
/**
|
|
10
|
+
* Query the target database for all catalog objects that can be dependencies.
|
|
11
|
+
* Returns ObjectRefs that pg-topo can use as external providers so it does
|
|
12
|
+
* not flag false UNRESOLVED_DEPENDENCY diagnostics (e.g. now(), text, public).
|
|
13
|
+
*
|
|
14
|
+
* This is intentionally separate from {@link extractCatalog} in catalog.model.ts:
|
|
15
|
+
* - extractCatalog is for schema diffing and excludes system objects (filters
|
|
16
|
+
* out pg_catalog, information_schema, extension-owned). It also does not
|
|
17
|
+
* extract languages. We need the opposite here: all objects that might be
|
|
18
|
+
* referenced by SQL, including built-in functions, types, and schemas.
|
|
19
|
+
* - Objects in pg_catalog/information_schema are registered under both their
|
|
20
|
+
* real schema and "public" (via addProvider's alsoUnderPublic) so
|
|
21
|
+
* unqualified references in SQL resolve the same way the parser does.
|
|
22
|
+
*/
|
|
23
|
+
export declare function extractCatalogProviders(pool: Pool): Promise<ObjectRef[]>;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract functions, types, and other catalog objects from the target database
|
|
3
|
+
* so pg-topo can treat them as external providers and suppress false
|
|
4
|
+
* UNRESOLVED_DEPENDENCY diagnostics (e.g. now(), gen_random_uuid(), nextval(),
|
|
5
|
+
* auth.users, extensions.uuid_generate_v4, etc.).
|
|
6
|
+
*/
|
|
7
|
+
function addProvider(providers, ref, alsoUnderPublic = false) {
|
|
8
|
+
providers.push(ref);
|
|
9
|
+
if (alsoUnderPublic &&
|
|
10
|
+
(ref.schema === "pg_catalog" || ref.schema === "information_schema")) {
|
|
11
|
+
providers.push({ ...ref, schema: "public" });
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Query the target database for all catalog objects that can be dependencies.
|
|
16
|
+
* Returns ObjectRefs that pg-topo can use as external providers so it does
|
|
17
|
+
* not flag false UNRESOLVED_DEPENDENCY diagnostics (e.g. now(), text, public).
|
|
18
|
+
*
|
|
19
|
+
* This is intentionally separate from {@link extractCatalog} in catalog.model.ts:
|
|
20
|
+
* - extractCatalog is for schema diffing and excludes system objects (filters
|
|
21
|
+
* out pg_catalog, information_schema, extension-owned). It also does not
|
|
22
|
+
* extract languages. We need the opposite here: all objects that might be
|
|
23
|
+
* referenced by SQL, including built-in functions, types, and schemas.
|
|
24
|
+
* - Objects in pg_catalog/information_schema are registered under both their
|
|
25
|
+
* real schema and "public" (via addProvider's alsoUnderPublic) so
|
|
26
|
+
* unqualified references in SQL resolve the same way the parser does.
|
|
27
|
+
*/
|
|
28
|
+
export async function extractCatalogProviders(pool) {
|
|
29
|
+
const providers = [];
|
|
30
|
+
const [functionsResult, typesResult, schemasResult, relationsResult, extensionsResult, rolesResult, languagesResult, collationsResult, fdwsResult, serversResult, eventTriggersResult, publicationsResult, subscriptionsResult,] = await Promise.all([
|
|
31
|
+
pool.query(`
|
|
32
|
+
SELECT
|
|
33
|
+
p.proname AS name,
|
|
34
|
+
n.nspname AS schema,
|
|
35
|
+
p.prokind AS kind,
|
|
36
|
+
COALESCE((
|
|
37
|
+
SELECT string_agg(
|
|
38
|
+
CASE WHEN p.proargmodes IS NOT NULL AND p.proargmodes[ord] = 'v'
|
|
39
|
+
THEN 'VARIADIC ' || format_type(t.oid, NULL)
|
|
40
|
+
ELSE format_type(t.oid, NULL)
|
|
41
|
+
END, ',' ORDER BY ord)
|
|
42
|
+
FROM unnest(p.proargtypes) WITH ORDINALITY AS t(oid, ord)
|
|
43
|
+
), '') AS signature
|
|
44
|
+
FROM pg_proc p
|
|
45
|
+
JOIN pg_namespace n ON n.oid = p.pronamespace
|
|
46
|
+
`),
|
|
47
|
+
pool.query(`
|
|
48
|
+
SELECT t.typname AS name, n.nspname AS schema, t.typtype AS typetype
|
|
49
|
+
FROM pg_type t
|
|
50
|
+
JOIN pg_namespace n ON n.oid = t.typnamespace
|
|
51
|
+
WHERE n.nspname NOT LIKE 'pg_toast%'
|
|
52
|
+
AND t.typtype IN ('b', 'c', 'd', 'e', 'r')
|
|
53
|
+
`),
|
|
54
|
+
pool.query(`
|
|
55
|
+
SELECT nspname AS name FROM pg_namespace
|
|
56
|
+
WHERE nspname NOT LIKE 'pg_toast%'
|
|
57
|
+
`),
|
|
58
|
+
pool.query(`
|
|
59
|
+
SELECT c.relname AS name, n.nspname AS schema, c.relkind AS relkind
|
|
60
|
+
FROM pg_class c
|
|
61
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
62
|
+
WHERE c.relkind IN ('r', 'p', 'v', 'm', 'S', 'i')
|
|
63
|
+
AND n.nspname NOT LIKE 'pg_toast%'
|
|
64
|
+
`),
|
|
65
|
+
pool.query(`
|
|
66
|
+
SELECT e.extname AS name, n.nspname AS schema
|
|
67
|
+
FROM pg_extension e
|
|
68
|
+
LEFT JOIN pg_namespace n ON n.oid = e.extnamespace
|
|
69
|
+
`),
|
|
70
|
+
pool.query(`SELECT rolname AS name FROM pg_roles`),
|
|
71
|
+
pool.query(`SELECT lanname AS name FROM pg_language`),
|
|
72
|
+
pool.query(`
|
|
73
|
+
SELECT c.collname AS name, n.nspname AS schema
|
|
74
|
+
FROM pg_collation c
|
|
75
|
+
JOIN pg_namespace n ON n.oid = c.collnamespace
|
|
76
|
+
WHERE n.nspname NOT LIKE 'pg_toast%'
|
|
77
|
+
`),
|
|
78
|
+
pool.query(`SELECT fdwname AS name FROM pg_foreign_data_wrapper`),
|
|
79
|
+
pool.query(`SELECT srvname AS name FROM pg_foreign_server`),
|
|
80
|
+
pool.query(`SELECT evtname AS name FROM pg_event_trigger`),
|
|
81
|
+
pool.query(`SELECT pubname AS name FROM pg_publication`),
|
|
82
|
+
pool.query(`SELECT subname AS name FROM pg_subscription`),
|
|
83
|
+
]);
|
|
84
|
+
for (const fn of functionsResult.rows) {
|
|
85
|
+
const kind = fn.kind === "a"
|
|
86
|
+
? "aggregate"
|
|
87
|
+
: fn.kind === "p"
|
|
88
|
+
? "procedure"
|
|
89
|
+
: "function";
|
|
90
|
+
const sig = fn.signature.trim() ? `(${fn.signature})` : "()";
|
|
91
|
+
const ref = {
|
|
92
|
+
kind,
|
|
93
|
+
name: fn.name,
|
|
94
|
+
schema: fn.schema,
|
|
95
|
+
signature: sig,
|
|
96
|
+
};
|
|
97
|
+
addProvider(providers, ref, true);
|
|
98
|
+
}
|
|
99
|
+
for (const t of typesResult.rows) {
|
|
100
|
+
const kind = t.typetype === "d" ? "domain" : "type";
|
|
101
|
+
const ref = { kind, name: t.name, schema: t.schema };
|
|
102
|
+
addProvider(providers, ref, true);
|
|
103
|
+
}
|
|
104
|
+
for (const row of schemasResult.rows) {
|
|
105
|
+
providers.push({ kind: "schema", name: row.name });
|
|
106
|
+
}
|
|
107
|
+
const relkindToKind = {
|
|
108
|
+
r: "table",
|
|
109
|
+
p: "table",
|
|
110
|
+
v: "view",
|
|
111
|
+
m: "materialized_view",
|
|
112
|
+
S: "sequence",
|
|
113
|
+
i: "index",
|
|
114
|
+
};
|
|
115
|
+
for (const row of relationsResult.rows) {
|
|
116
|
+
const kind = relkindToKind[row.relkind];
|
|
117
|
+
if (!kind)
|
|
118
|
+
continue;
|
|
119
|
+
const ref = { kind, name: row.name, schema: row.schema };
|
|
120
|
+
addProvider(providers, ref, true);
|
|
121
|
+
}
|
|
122
|
+
for (const row of extensionsResult.rows) {
|
|
123
|
+
providers.push({
|
|
124
|
+
kind: "extension",
|
|
125
|
+
name: row.name,
|
|
126
|
+
schema: row.schema ?? undefined,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
for (const row of rolesResult.rows) {
|
|
130
|
+
providers.push({ kind: "role", name: row.name });
|
|
131
|
+
}
|
|
132
|
+
for (const row of languagesResult.rows) {
|
|
133
|
+
providers.push({ kind: "language", name: row.name });
|
|
134
|
+
}
|
|
135
|
+
for (const row of collationsResult.rows) {
|
|
136
|
+
const ref = {
|
|
137
|
+
kind: "collation",
|
|
138
|
+
name: row.name,
|
|
139
|
+
schema: row.schema,
|
|
140
|
+
};
|
|
141
|
+
addProvider(providers, ref, true);
|
|
142
|
+
}
|
|
143
|
+
for (const row of fdwsResult.rows) {
|
|
144
|
+
providers.push({ kind: "foreign_data_wrapper", name: row.name });
|
|
145
|
+
}
|
|
146
|
+
for (const row of serversResult.rows) {
|
|
147
|
+
providers.push({ kind: "foreign_server", name: row.name });
|
|
148
|
+
}
|
|
149
|
+
for (const row of eventTriggersResult.rows) {
|
|
150
|
+
providers.push({ kind: "event_trigger", name: row.name });
|
|
151
|
+
}
|
|
152
|
+
for (const row of publicationsResult.rows) {
|
|
153
|
+
providers.push({ kind: "publication", name: row.name });
|
|
154
|
+
}
|
|
155
|
+
for (const row of subscriptionsResult.rows) {
|
|
156
|
+
providers.push({ kind: "subscription", name: row.name });
|
|
157
|
+
}
|
|
158
|
+
return providers;
|
|
159
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative schema apply – orchestrator.
|
|
3
|
+
*
|
|
4
|
+
* Accepts pre-read SQL content (file path + sql string per file), uses pg-topo
|
|
5
|
+
* for static dependency analysis and topological ordering, then applies
|
|
6
|
+
* statements to a target database using iterative rounds to handle any
|
|
7
|
+
* remaining dependency gaps. File discovery and reading are done by the caller
|
|
8
|
+
* (e.g. CLI) so I/O errors can be handled there.
|
|
9
|
+
*/
|
|
10
|
+
import type { Diagnostic } from "@supabase/pg-topo";
|
|
11
|
+
import type { Pool } from "pg";
|
|
12
|
+
import { type ApplyResult, type RoundResult } from "./round-apply.ts";
|
|
13
|
+
import type { SqlFileEntry } from "./discover-sql.ts";
|
|
14
|
+
interface DeclarativeApplyOptions {
|
|
15
|
+
/** Pre-read SQL files: filePath (relative) and sql content. Caller does discovery and read. */
|
|
16
|
+
content: SqlFileEntry[];
|
|
17
|
+
/** Target database connection URL (required if pool is not provided) */
|
|
18
|
+
targetUrl?: string;
|
|
19
|
+
/** Existing pool to use (caller owns it; not closed). If provided, targetUrl is ignored. */
|
|
20
|
+
pool?: Pool;
|
|
21
|
+
/** Max rounds before giving up (default: 100) */
|
|
22
|
+
maxRounds?: number;
|
|
23
|
+
/** Run final function body validation (default: true) */
|
|
24
|
+
validateFunctionBodies?: boolean;
|
|
25
|
+
/** Disable function body checks during rounds (default: true) */
|
|
26
|
+
disableCheckFunctionBodies?: boolean;
|
|
27
|
+
/** Progress callback fired after each round */
|
|
28
|
+
onRoundComplete?: (round: RoundResult) => void;
|
|
29
|
+
}
|
|
30
|
+
export interface DeclarativeApplyResult {
|
|
31
|
+
/** Result from the round-based apply engine */
|
|
32
|
+
apply: ApplyResult;
|
|
33
|
+
/** Diagnostics from pg-topo's static analysis (warnings, not fatal) */
|
|
34
|
+
diagnostics: Diagnostic[];
|
|
35
|
+
/** Total number of statements discovered */
|
|
36
|
+
totalStatements: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Apply a declarative SQL schema to a target database.
|
|
40
|
+
*
|
|
41
|
+
* 1. Call pg-topo analyzeAndSort on the provided SQL strings
|
|
42
|
+
* 2. Remap synthetic statement IDs to caller-provided file paths
|
|
43
|
+
* 3. Apply statements round-by-round to the target database
|
|
44
|
+
* 4. Optionally validate function bodies in a final pass
|
|
45
|
+
*/
|
|
46
|
+
export declare function applyDeclarativeSchema(options: DeclarativeApplyOptions): Promise<DeclarativeApplyResult>;
|
|
47
|
+
export type { SqlFileEntry } from "./discover-sql.ts";
|
|
48
|
+
export { loadDeclarativeSchema } from "./discover-sql.ts";
|
|
49
|
+
export type { ApplyResult, RoundResult } from "./round-apply.ts";
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative schema apply – orchestrator.
|
|
3
|
+
*
|
|
4
|
+
* Accepts pre-read SQL content (file path + sql string per file), uses pg-topo
|
|
5
|
+
* for static dependency analysis and topological ordering, then applies
|
|
6
|
+
* statements to a target database using iterative rounds to handle any
|
|
7
|
+
* remaining dependency gaps. File discovery and reading are done by the caller
|
|
8
|
+
* (e.g. CLI) so I/O errors can be handled there.
|
|
9
|
+
*/
|
|
10
|
+
import { analyzeAndSort } from "@supabase/pg-topo";
|
|
11
|
+
import { createManagedPool } from "../postgres-config.js";
|
|
12
|
+
import { extractCatalogProviders } from "./extract-catalog-providers.js";
|
|
13
|
+
import { roundApply, } from "./round-apply.js";
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Helpers
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* Convert pg-topo StatementNodes into StatementEntries for the apply engine.
|
|
19
|
+
*/
|
|
20
|
+
function toStatementEntries(nodes) {
|
|
21
|
+
return nodes.map((node) => ({
|
|
22
|
+
id: `${node.id.filePath}:${node.id.statementIndex}`,
|
|
23
|
+
sql: node.sql,
|
|
24
|
+
statementClass: node.statementClass,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
function remapStatementId(statementId, filePathMap) {
|
|
28
|
+
if (!statementId)
|
|
29
|
+
return undefined;
|
|
30
|
+
return {
|
|
31
|
+
...statementId,
|
|
32
|
+
filePath: filePathMap.get(statementId.filePath) ?? statementId.filePath,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Main entry point
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
/**
|
|
39
|
+
* Apply a declarative SQL schema to a target database.
|
|
40
|
+
*
|
|
41
|
+
* 1. Call pg-topo analyzeAndSort on the provided SQL strings
|
|
42
|
+
* 2. Remap synthetic statement IDs to caller-provided file paths
|
|
43
|
+
* 3. Apply statements round-by-round to the target database
|
|
44
|
+
* 4. Optionally validate function bodies in a final pass
|
|
45
|
+
*/
|
|
46
|
+
export async function applyDeclarativeSchema(options) {
|
|
47
|
+
const { content, targetUrl, pool: providedPool, maxRounds = 100, validateFunctionBodies = true, disableCheckFunctionBodies = true, onRoundComplete, } = options;
|
|
48
|
+
if (content.length === 0) {
|
|
49
|
+
return {
|
|
50
|
+
apply: {
|
|
51
|
+
status: "success",
|
|
52
|
+
totalRounds: 0,
|
|
53
|
+
totalApplied: 0,
|
|
54
|
+
totalSkipped: 0,
|
|
55
|
+
rounds: [],
|
|
56
|
+
},
|
|
57
|
+
diagnostics: [],
|
|
58
|
+
totalStatements: 0,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
let pool;
|
|
62
|
+
let closePool;
|
|
63
|
+
if (providedPool != null) {
|
|
64
|
+
pool = providedPool;
|
|
65
|
+
}
|
|
66
|
+
else if (targetUrl != null) {
|
|
67
|
+
const managed = await createManagedPool(targetUrl, { label: "target" });
|
|
68
|
+
pool = managed.pool;
|
|
69
|
+
closePool = managed.close;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
throw new Error("Either targetUrl or pool must be provided");
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const externalProviders = await extractCatalogProviders(pool);
|
|
76
|
+
// Step 1: pg-topo analyze and sort (no file I/O; uses synthetic <input:i> paths)
|
|
77
|
+
const sqlContents = content.map((entry) => entry.sql);
|
|
78
|
+
const analyzeResult = await analyzeAndSort(sqlContents, {
|
|
79
|
+
externalProviders,
|
|
80
|
+
});
|
|
81
|
+
const { ordered, diagnostics } = analyzeResult;
|
|
82
|
+
// Step 2: Remap <input:i> to real file paths
|
|
83
|
+
const filePathMap = new Map();
|
|
84
|
+
for (let i = 0; i < content.length; i += 1) {
|
|
85
|
+
filePathMap.set(`<input:${i}>`, content[i].filePath);
|
|
86
|
+
}
|
|
87
|
+
const remappedOrdered = ordered.map((node) => ({
|
|
88
|
+
...node,
|
|
89
|
+
id: {
|
|
90
|
+
...node.id,
|
|
91
|
+
filePath: filePathMap.get(node.id.filePath) ?? node.id.filePath,
|
|
92
|
+
},
|
|
93
|
+
}));
|
|
94
|
+
const remappedDiagnostics = diagnostics.map((d) => ({
|
|
95
|
+
...d,
|
|
96
|
+
statementId: remapStatementId(d.statementId, filePathMap),
|
|
97
|
+
}));
|
|
98
|
+
if (ordered.length === 0) {
|
|
99
|
+
return {
|
|
100
|
+
apply: {
|
|
101
|
+
status: "success",
|
|
102
|
+
totalRounds: 0,
|
|
103
|
+
totalApplied: 0,
|
|
104
|
+
totalSkipped: 0,
|
|
105
|
+
rounds: [],
|
|
106
|
+
},
|
|
107
|
+
diagnostics: remappedDiagnostics,
|
|
108
|
+
totalStatements: 0,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Step 3: Convert to statement entries and apply
|
|
112
|
+
const statements = toStatementEntries(remappedOrdered);
|
|
113
|
+
const applyResult = await roundApply({
|
|
114
|
+
pool,
|
|
115
|
+
statements,
|
|
116
|
+
maxRounds,
|
|
117
|
+
disableCheckFunctionBodies,
|
|
118
|
+
finalValidation: validateFunctionBodies,
|
|
119
|
+
onRoundComplete,
|
|
120
|
+
});
|
|
121
|
+
return {
|
|
122
|
+
apply: applyResult,
|
|
123
|
+
diagnostics: remappedDiagnostics,
|
|
124
|
+
totalStatements: remappedOrdered.length,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
if (closePool) {
|
|
129
|
+
await closePool();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Re-export file discovery for programmatic callers (e.g. Supabase CLI edge-runtime templates)
|
|
134
|
+
export { loadDeclarativeSchema } from "./discover-sql.js";
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Round-based declarative schema apply engine.
|
|
3
|
+
*
|
|
4
|
+
* Applies SQL statements to a database using iterative rounds:
|
|
5
|
+
* 1. Try each pending statement
|
|
6
|
+
* 2. On dependency errors, defer to next round
|
|
7
|
+
* 3. Repeat until all applied or no progress (stuck)
|
|
8
|
+
* 4. Optional final validation pass for function bodies
|
|
9
|
+
*/
|
|
10
|
+
import type { Pool } from "pg";
|
|
11
|
+
export interface StatementEntry {
|
|
12
|
+
/** Unique identifier for the statement (e.g. "file:index") */
|
|
13
|
+
id: string;
|
|
14
|
+
/** The SQL to execute */
|
|
15
|
+
sql: string;
|
|
16
|
+
/** Optional statement classification (e.g. CREATE_FUNCTION) */
|
|
17
|
+
statementClass?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface StatementError {
|
|
20
|
+
/** Statement that failed */
|
|
21
|
+
statement: StatementEntry;
|
|
22
|
+
/** PostgreSQL error code (SQLSTATE) */
|
|
23
|
+
code: string;
|
|
24
|
+
/** Human-readable error message */
|
|
25
|
+
message: string;
|
|
26
|
+
/** Whether this was classified as a dependency error */
|
|
27
|
+
isDependencyError: boolean;
|
|
28
|
+
/** 1-based character offset in the statement SQL where the error occurred */
|
|
29
|
+
position?: number;
|
|
30
|
+
/** PostgreSQL error detail (e.g. token invalid) */
|
|
31
|
+
detail?: string;
|
|
32
|
+
/** PostgreSQL hint */
|
|
33
|
+
hint?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface RoundResult {
|
|
36
|
+
/** Round number (1-based) */
|
|
37
|
+
round: number;
|
|
38
|
+
/** Number of statements successfully applied this round */
|
|
39
|
+
applied: number;
|
|
40
|
+
/** Number of statements deferred to next round */
|
|
41
|
+
deferred: number;
|
|
42
|
+
/** Number of statements that failed with non-dependency errors */
|
|
43
|
+
failed: number;
|
|
44
|
+
/** Errors encountered this round */
|
|
45
|
+
errors: StatementError[];
|
|
46
|
+
}
|
|
47
|
+
export interface ApplyResult {
|
|
48
|
+
/** Overall status */
|
|
49
|
+
status: "success" | "stuck" | "error";
|
|
50
|
+
/** Total number of rounds executed */
|
|
51
|
+
totalRounds: number;
|
|
52
|
+
/** Total number of statements successfully applied */
|
|
53
|
+
totalApplied: number;
|
|
54
|
+
/** Total number of statements skipped (environment/capability errors) */
|
|
55
|
+
totalSkipped: number;
|
|
56
|
+
/** Statements that could not be applied (stuck) */
|
|
57
|
+
stuckStatements?: StatementError[];
|
|
58
|
+
/** Non-dependency errors that caused hard failures */
|
|
59
|
+
errors?: StatementError[];
|
|
60
|
+
/** Errors from the final function body validation pass */
|
|
61
|
+
validationErrors?: StatementError[];
|
|
62
|
+
/** Per-round results */
|
|
63
|
+
rounds: RoundResult[];
|
|
64
|
+
}
|
|
65
|
+
interface RoundApplyOptions {
|
|
66
|
+
/** Target database pool */
|
|
67
|
+
pool: Pool;
|
|
68
|
+
/** Ordered SQL statements to apply */
|
|
69
|
+
statements: StatementEntry[];
|
|
70
|
+
/** Max rounds before giving up (default: 100) */
|
|
71
|
+
maxRounds?: number;
|
|
72
|
+
/** Disable function body checks during application (default: true) */
|
|
73
|
+
disableCheckFunctionBodies?: boolean;
|
|
74
|
+
/** Run final validation with check_function_bodies=on (default: true) */
|
|
75
|
+
finalValidation?: boolean;
|
|
76
|
+
/** Progress callback fired after each round */
|
|
77
|
+
onRoundComplete?: (round: RoundResult) => void;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Apply SQL statements to a database using iterative rounds.
|
|
81
|
+
*
|
|
82
|
+
* Algorithm:
|
|
83
|
+
* 1. Optionally set check_function_bodies = off
|
|
84
|
+
* 2. For each round, iterate over pending statements:
|
|
85
|
+
* - On success: mark as applied
|
|
86
|
+
* - On dependency error: defer to next round
|
|
87
|
+
* - On environment error: skip permanently with warning
|
|
88
|
+
* - On other error: mark as failed
|
|
89
|
+
* 3. If a round makes no progress (0 applied), stop (stuck)
|
|
90
|
+
* 4. If finalValidation is true, re-run CREATE FUNCTION/PROCEDURE
|
|
91
|
+
* with check_function_bodies = on
|
|
92
|
+
*/
|
|
93
|
+
export declare function roundApply(options: RoundApplyOptions): Promise<ApplyResult>;
|
|
94
|
+
/**
|
|
95
|
+
* Rewrite a CREATE FUNCTION/PROCEDURE statement to use OR REPLACE for
|
|
96
|
+
* idempotent re-execution during validation. Handles leading line-comments,
|
|
97
|
+
* block comments (pg-topo annotations), and avoids double-adding OR REPLACE.
|
|
98
|
+
*/
|
|
99
|
+
export declare function rewriteAsOrReplace(sql: string): string;
|
|
100
|
+
export {};
|