@supabase/pg-delta 1.0.0-alpha.1 → 1.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -2
- package/dist/cli/app.js +26 -3
- package/dist/cli/bin/cli.js +5 -0
- package/dist/cli/commands/catalog-export.d.ts +5 -0
- package/dist/cli/commands/catalog-export.js +64 -0
- package/dist/cli/commands/declarative-apply.d.ts +6 -0
- package/dist/cli/commands/declarative-apply.js +288 -0
- package/dist/cli/commands/declarative-export.d.ts +5 -0
- package/dist/cli/commands/declarative-export.js +245 -0
- package/dist/cli/commands/plan.js +40 -6
- package/dist/cli/exit-code.d.ts +2 -0
- package/dist/cli/exit-code.js +7 -0
- package/dist/cli/formatters/tree/tree.js +3 -2
- package/dist/cli/utils/apply-display.d.ts +52 -0
- package/dist/cli/utils/apply-display.js +183 -0
- package/dist/cli/utils/export-display.d.ts +43 -0
- package/dist/cli/utils/export-display.js +202 -0
- package/dist/cli/utils/resolve-input.d.ts +7 -0
- package/dist/cli/utils/resolve-input.js +13 -0
- package/dist/cli/utils.d.ts +2 -0
- package/dist/cli/utils.js +1 -1
- package/dist/core/catalog-export/index.d.ts +11 -0
- package/dist/core/catalog-export/index.js +10 -0
- package/dist/core/catalog.diff.d.ts +1 -0
- package/dist/core/catalog.diff.js +64 -48
- package/dist/core/catalog.model.d.ts +16 -3
- package/dist/core/catalog.model.js +132 -30
- package/dist/core/catalog.snapshot.d.ts +66 -0
- package/dist/core/catalog.snapshot.js +206 -0
- package/dist/core/context.d.ts +3 -3
- package/dist/core/context.js +7 -10
- package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
- package/dist/core/declarative-apply/discover-sql.js +86 -0
- package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
- package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
- package/dist/core/declarative-apply/index.d.ts +49 -0
- package/dist/core/declarative-apply/index.js +134 -0
- package/dist/core/declarative-apply/round-apply.d.ts +100 -0
- package/dist/core/declarative-apply/round-apply.js +378 -0
- package/dist/core/depend.d.ts +2 -2
- package/dist/core/depend.js +8 -7
- package/dist/core/export/file-mapper.d.ts +71 -0
- package/dist/core/export/file-mapper.js +474 -0
- package/dist/core/export/grouper.d.ts +13 -0
- package/dist/core/export/grouper.js +76 -0
- package/dist/core/export/index.d.ts +45 -0
- package/dist/core/export/index.js +63 -0
- package/dist/core/export/types.d.ts +84 -0
- package/dist/core/export/types.js +25 -0
- package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/dist/core/integrations/filter/dsl.d.ts +38 -1
- package/dist/core/integrations/filter/dsl.js +20 -2
- package/dist/core/integrations/filter/extractors.js +42 -0
- package/dist/core/integrations/integration-dsl.d.ts +10 -0
- package/dist/core/integrations/supabase.d.ts +8 -0
- package/dist/core/integrations/supabase.js +11 -0
- package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
- package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
- package/dist/core/objects/aggregate/aggregate.model.d.ts +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/base.privilege-diff.d.ts +38 -13
- package/dist/core/objects/base.privilege-diff.js +104 -22
- package/dist/core/objects/base.privilege.d.ts +1 -0
- package/dist/core/objects/base.privilege.js +9 -2
- package/dist/core/objects/collation/collation.diff.d.ts +2 -3
- package/dist/core/objects/collation/collation.model.d.ts +2 -2
- package/dist/core/objects/collation/collation.model.js +29 -28
- package/dist/core/objects/diff-context.d.ts +15 -0
- package/dist/core/objects/diff-context.js +1 -0
- package/dist/core/objects/domain/changes/domain.create.js +4 -2
- package/dist/core/objects/domain/domain.diff.d.ts +2 -8
- package/dist/core/objects/domain/domain.diff.js +16 -77
- package/dist/core/objects/domain/domain.model.d.ts +2 -2
- package/dist/core/objects/domain/domain.model.js +9 -11
- package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
- package/dist/core/objects/event-trigger/event-trigger.model.d.ts +2 -2
- package/dist/core/objects/event-trigger/event-trigger.model.js +7 -9
- package/dist/core/objects/extension/extension.model.d.ts +2 -2
- package/dist/core/objects/extension/extension.model.js +8 -10
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +22 -24
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +2 -2
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +21 -23
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
- package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
- package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +2 -2
- package/dist/core/objects/foreign-data-wrapper/server/server.model.js +20 -22
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +2 -2
- package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +20 -22
- package/dist/core/objects/index/index.model.d.ts +4 -4
- package/dist/core/objects/index/index.model.js +9 -11
- package/dist/core/objects/language/language.diff.d.ts +2 -5
- package/dist/core/objects/language/language.diff.js +7 -39
- package/dist/core/objects/language/language.model.js +5 -7
- package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
- package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
- package/dist/core/objects/materialized-view/materialized-view.model.d.ts +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/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 +2 -2
- package/dist/core/objects/publication/publication.diff.d.ts +2 -3
- package/dist/core/objects/publication/publication.diff.js +8 -13
- package/dist/core/objects/publication/publication.model.d.ts +2 -2
- package/dist/core/objects/publication/publication.model.js +7 -9
- package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
- package/dist/core/objects/rls-policy/rls-policy.model.d.ts +4 -4
- package/dist/core/objects/rls-policy/rls-policy.model.js +8 -10
- package/dist/core/objects/role/role.diff.js +22 -1
- package/dist/core/objects/role/role.model.d.ts +6 -5
- package/dist/core/objects/role/role.model.js +146 -40
- 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/schema.diff.d.ts +2 -8
- package/dist/core/objects/schema/schema.diff.js +16 -77
- package/dist/core/objects/schema/schema.model.d.ts +2 -2
- package/dist/core/objects/schema/schema.model.js +9 -11
- package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
- package/dist/core/objects/sequence/sequence.diff.js +16 -79
- package/dist/core/objects/sequence/sequence.model.d.ts +2 -2
- package/dist/core/objects/sequence/sequence.model.js +9 -11
- package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
- package/dist/core/objects/subscription/subscription.model.d.ts +2 -2
- package/dist/core/objects/subscription/subscription.model.js +25 -20
- package/dist/core/objects/table/changes/table.create.js +3 -0
- package/dist/core/objects/table/table.diff.d.ts +2 -8
- package/dist/core/objects/table/table.diff.js +26 -157
- package/dist/core/objects/table/table.model.d.ts +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/trigger.model.d.ts +11 -2
- package/dist/core/objects/trigger/trigger.model.js +22 -10
- package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
- package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
- package/dist/core/objects/type/composite-type/composite-type.model.d.ts +5 -5
- package/dist/core/objects/type/composite-type/composite-type.model.js +10 -11
- package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
- package/dist/core/objects/type/enum/enum.diff.js +25 -112
- package/dist/core/objects/type/enum/enum.model.d.ts +2 -2
- package/dist/core/objects/type/enum/enum.model.js +23 -25
- package/dist/core/objects/type/range/changes/range.create.js +6 -3
- package/dist/core/objects/type/range/range.diff.d.ts +2 -8
- package/dist/core/objects/type/range/range.diff.js +16 -77
- package/dist/core/objects/type/range/range.model.d.ts +2 -2
- package/dist/core/objects/type/range/range.model.js +8 -10
- package/dist/core/objects/view/view.diff.d.ts +2 -8
- package/dist/core/objects/view/view.diff.js +16 -158
- package/dist/core/objects/view/view.model.d.ts +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/graph-builder.js +10 -0
- package/dist/core/sort/logical-sort.js +31 -23
- package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
- package/dist/core/test-utils/assert-valid-sql.js +19 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -1
- package/package.json +56 -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 +330 -0
- package/src/cli/commands/plan.ts +216 -0
- package/src/cli/commands/sync.ts +185 -0
- package/src/cli/exit-code.test.ts +19 -0
- package/src/cli/exit-code.ts +7 -0
- package/src/cli/formatters/index.ts +5 -0
- package/src/cli/formatters/tree/tree-builder.ts +380 -0
- package/src/cli/formatters/tree/tree-renderer.ts +372 -0
- package/src/cli/formatters/tree/tree.ts +238 -0
- package/src/cli/utils/apply-display.test.ts +348 -0
- package/src/cli/utils/apply-display.ts +238 -0
- package/src/cli/utils/export-display.test.ts +103 -0
- package/src/cli/utils/export-display.ts +275 -0
- package/src/cli/utils/integrations.test.ts +44 -0
- package/src/cli/utils/integrations.ts +42 -0
- package/src/cli/utils/resolve-input.test.ts +38 -0
- package/src/cli/utils/resolve-input.ts +17 -0
- package/src/cli/utils.ts +231 -0
- package/src/core/catalog-export/index.ts +20 -0
- package/src/core/catalog.diff.ts +247 -0
- package/src/core/catalog.model.test.ts +122 -0
- package/src/core/catalog.model.ts +510 -0
- package/src/core/catalog.snapshot.test.ts +477 -0
- package/src/core/catalog.snapshot.ts +289 -0
- package/src/core/change.types.ts +44 -0
- package/src/core/context.ts +26 -0
- package/src/core/declarative-apply/discover-sql.test.ts +103 -0
- package/src/core/declarative-apply/discover-sql.ts +107 -0
- package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
- package/src/core/declarative-apply/index.test.ts +67 -0
- package/src/core/declarative-apply/index.ts +205 -0
- package/src/core/declarative-apply/round-apply.test.ts +504 -0
- package/src/core/declarative-apply/round-apply.ts +562 -0
- package/src/core/depend.ts +1870 -0
- package/src/core/expand-replace-dependencies.test.ts +70 -0
- package/src/core/expand-replace-dependencies.ts +380 -0
- package/src/core/export/file-mapper.test.ts +816 -0
- package/src/core/export/file-mapper.ts +574 -0
- package/src/core/export/grouper.ts +108 -0
- package/src/core/export/index.ts +129 -0
- package/src/core/export/types.ts +104 -0
- package/src/core/fingerprint.ts +204 -0
- package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
- package/src/core/integrations/filter/dsl.test.ts +211 -0
- package/src/core/integrations/filter/dsl.ts +266 -0
- package/src/core/integrations/filter/extractors.test.ts +244 -0
- package/src/core/integrations/filter/extractors.ts +187 -0
- package/src/core/integrations/filter/filter.types.ts +3 -0
- package/src/core/integrations/integration-dsl.ts +34 -0
- package/src/core/integrations/integration.types.ts +7 -0
- package/src/core/integrations/serialize/dsl.test.ts +91 -0
- package/src/core/integrations/serialize/dsl.ts +77 -0
- package/src/core/integrations/serialize/serialize.types.ts +3 -0
- package/src/core/integrations/supabase.ts +130 -0
- package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
- package/src/core/objects/aggregate/aggregate.model.ts +317 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
- package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
- package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
- package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
- package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
- package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
- package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
- package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
- package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
- package/src/core/objects/base.change.ts +62 -0
- package/src/core/objects/base.default-privileges.ts +204 -0
- package/src/core/objects/base.diff.ts +20 -0
- package/src/core/objects/base.model.ts +82 -0
- package/src/core/objects/base.privilege-diff.ts +447 -0
- package/src/core/objects/base.privilege.ts +191 -0
- package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
- package/src/core/objects/collation/changes/collation.alter.ts +79 -0
- package/src/core/objects/collation/changes/collation.base.ts +20 -0
- package/src/core/objects/collation/changes/collation.comment.ts +68 -0
- package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
- package/src/core/objects/collation/changes/collation.create.ts +106 -0
- package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
- package/src/core/objects/collation/changes/collation.drop.ts +37 -0
- package/src/core/objects/collation/changes/collation.types.ts +10 -0
- package/src/core/objects/collation/collation.diff.test.ts +97 -0
- package/src/core/objects/collation/collation.diff.ts +127 -0
- package/src/core/objects/collation/collation.model.ts +224 -0
- package/src/core/objects/diff-context.ts +16 -0
- package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
- package/src/core/objects/domain/changes/domain.alter.ts +286 -0
- package/src/core/objects/domain/changes/domain.base.ts +20 -0
- package/src/core/objects/domain/changes/domain.comment.ts +59 -0
- package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
- package/src/core/objects/domain/changes/domain.create.ts +124 -0
- package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
- package/src/core/objects/domain/changes/domain.drop.ts +34 -0
- package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
- package/src/core/objects/domain/changes/domain.types.ts +12 -0
- package/src/core/objects/domain/domain.diff.test.ts +284 -0
- package/src/core/objects/domain/domain.diff.ts +295 -0
- package/src/core/objects/domain/domain.model.ts +190 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
- package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
- package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
- package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
- package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
- package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
- package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
- package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
- package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
- package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
- package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
- package/src/core/objects/extension/changes/extension.alter.ts +78 -0
- package/src/core/objects/extension/changes/extension.base.ts +20 -0
- package/src/core/objects/extension/changes/extension.comment.ts +64 -0
- package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
- package/src/core/objects/extension/changes/extension.create.ts +63 -0
- package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
- package/src/core/objects/extension/changes/extension.drop.ts +34 -0
- package/src/core/objects/extension/changes/extension.types.ts +10 -0
- package/src/core/objects/extension/extension.diff.test.ts +42 -0
- package/src/core/objects/extension/extension.diff.ts +90 -0
- package/src/core/objects/extension/extension.model.test.ts +98 -0
- package/src/core/objects/extension/extension.model.ts +280 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
- package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
- package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
- package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
- package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
- package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
- package/src/core/objects/index/changes/index.alter.test.ts +209 -0
- package/src/core/objects/index/changes/index.alter.ts +144 -0
- package/src/core/objects/index/changes/index.base.ts +20 -0
- package/src/core/objects/index/changes/index.comment.ts +63 -0
- package/src/core/objects/index/changes/index.create.test.ts +69 -0
- package/src/core/objects/index/changes/index.create.ts +68 -0
- package/src/core/objects/index/changes/index.drop.test.ts +47 -0
- package/src/core/objects/index/changes/index.drop.ts +34 -0
- package/src/core/objects/index/changes/index.types.ts +6 -0
- package/src/core/objects/index/changes/utils.ts +16 -0
- package/src/core/objects/index/index.diff.test.ts +153 -0
- package/src/core/objects/index/index.diff.ts +243 -0
- package/src/core/objects/index/index.model.ts +370 -0
- package/src/core/objects/language/changes/language.alter.test.ts +36 -0
- package/src/core/objects/language/changes/language.alter.ts +53 -0
- package/src/core/objects/language/changes/language.base.ts +20 -0
- package/src/core/objects/language/changes/language.comment.ts +58 -0
- package/src/core/objects/language/changes/language.create.test.ts +30 -0
- package/src/core/objects/language/changes/language.create.ts +104 -0
- package/src/core/objects/language/changes/language.drop.test.ts +28 -0
- package/src/core/objects/language/changes/language.drop.ts +39 -0
- package/src/core/objects/language/changes/language.privilege.ts +172 -0
- package/src/core/objects/language/changes/language.types.ts +12 -0
- package/src/core/objects/language/language.diff.test.ts +135 -0
- package/src/core/objects/language/language.diff.ts +144 -0
- package/src/core/objects/language/language.model.ts +150 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
- package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
- package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
- package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
- package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
- package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
- package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
- package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
- package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
- package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
- package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
- package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
- package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
- package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
- package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
- package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
- package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
- package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
- package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
- package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
- package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
- package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
- package/src/core/objects/procedure/procedure.diff.ts +341 -0
- package/src/core/objects/procedure/procedure.model.ts +264 -0
- package/src/core/objects/procedure/utils.ts +58 -0
- package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
- package/src/core/objects/publication/changes/publication.alter.ts +225 -0
- package/src/core/objects/publication/changes/publication.base.ts +20 -0
- package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
- package/src/core/objects/publication/changes/publication.comment.ts +64 -0
- package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
- package/src/core/objects/publication/changes/publication.create.ts +82 -0
- package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
- package/src/core/objects/publication/changes/publication.drop.ts +29 -0
- package/src/core/objects/publication/changes/publication.types.ts +24 -0
- package/src/core/objects/publication/publication.diff.test.ts +297 -0
- package/src/core/objects/publication/publication.diff.ts +247 -0
- package/src/core/objects/publication/publication.model.ts +206 -0
- package/src/core/objects/publication/utils.ts +55 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
- package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
- package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
- package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
- package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
- package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
- package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
- package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
- package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
- package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
- package/src/core/objects/role/changes/role.alter.test.ts +362 -0
- package/src/core/objects/role/changes/role.alter.ts +110 -0
- package/src/core/objects/role/changes/role.base.ts +24 -0
- package/src/core/objects/role/changes/role.comment.ts +55 -0
- package/src/core/objects/role/changes/role.create.test.ts +56 -0
- package/src/core/objects/role/changes/role.create.ts +102 -0
- package/src/core/objects/role/changes/role.drop.test.ts +32 -0
- package/src/core/objects/role/changes/role.drop.ts +34 -0
- package/src/core/objects/role/changes/role.privilege.ts +376 -0
- package/src/core/objects/role/changes/role.types.ts +12 -0
- package/src/core/objects/role/role.diff.test.ts +279 -0
- package/src/core/objects/role/role.diff.ts +499 -0
- package/src/core/objects/role/role.model.ts +452 -0
- package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
- package/src/core/objects/rule/changes/rule.alter.ts +72 -0
- package/src/core/objects/rule/changes/rule.base.ts +20 -0
- package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
- package/src/core/objects/rule/changes/rule.comment.ts +62 -0
- package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
- package/src/core/objects/rule/changes/rule.create.ts +42 -0
- package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
- package/src/core/objects/rule/changes/rule.drop.ts +29 -0
- package/src/core/objects/rule/changes/rule.types.ts +12 -0
- package/src/core/objects/rule/rule.diff.test.ts +132 -0
- package/src/core/objects/rule/rule.diff.ts +79 -0
- package/src/core/objects/rule/rule.model.ts +173 -0
- package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
- package/src/core/objects/schema/changes/schema.alter.ts +45 -0
- package/src/core/objects/schema/changes/schema.base.ts +20 -0
- package/src/core/objects/schema/changes/schema.comment.ts +56 -0
- package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
- package/src/core/objects/schema/changes/schema.create.ts +47 -0
- package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
- package/src/core/objects/schema/changes/schema.drop.ts +34 -0
- package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
- package/src/core/objects/schema/changes/schema.types.ts +12 -0
- package/src/core/objects/schema/schema.diff.test.ts +42 -0
- package/src/core/objects/schema/schema.diff.ts +146 -0
- package/src/core/objects/schema/schema.model.ts +107 -0
- package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
- package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
- package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
- package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
- package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
- package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
- package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
- package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
- package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
- package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
- package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
- package/src/core/objects/sequence/sequence.diff.ts +294 -0
- package/src/core/objects/sequence/sequence.model.ts +185 -0
- package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
- package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
- package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
- package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
- package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
- package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
- package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
- package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
- package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
- package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
- package/src/core/objects/subscription/subscription.diff.ts +242 -0
- package/src/core/objects/subscription/subscription.model.ts +190 -0
- package/src/core/objects/subscription/utils.ts +156 -0
- package/src/core/objects/table/changes/table.alter.test.ts +846 -0
- package/src/core/objects/table/changes/table.alter.ts +806 -0
- package/src/core/objects/table/changes/table.base.ts +20 -0
- package/src/core/objects/table/changes/table.comment.ts +266 -0
- package/src/core/objects/table/changes/table.create.test.ts +188 -0
- package/src/core/objects/table/changes/table.create.ts +192 -0
- package/src/core/objects/table/changes/table.drop.test.ts +36 -0
- package/src/core/objects/table/changes/table.drop.ts +45 -0
- package/src/core/objects/table/changes/table.privilege.ts +200 -0
- package/src/core/objects/table/changes/table.types.ts +12 -0
- package/src/core/objects/table/table.diff.test.ts +868 -0
- package/src/core/objects/table/table.diff.ts +817 -0
- package/src/core/objects/table/table.model.ts +460 -0
- package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
- package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
- package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
- package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
- package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
- package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
- package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
- package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
- package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
- package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
- package/src/core/objects/trigger/trigger.diff.ts +116 -0
- package/src/core/objects/trigger/trigger.model.ts +264 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
- package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
- package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
- package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
- package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
- package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
- package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
- package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
- package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
- package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
- package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
- package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
- package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
- package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
- package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
- package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
- package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
- package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
- package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
- package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
- package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
- package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
- package/src/core/objects/type/enum/enum.diff.ts +308 -0
- package/src/core/objects/type/enum/enum.model.ts +194 -0
- package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
- package/src/core/objects/type/range/changes/range.alter.ts +51 -0
- package/src/core/objects/type/range/changes/range.base.ts +20 -0
- package/src/core/objects/type/range/changes/range.comment.ts +64 -0
- package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
- package/src/core/objects/type/range/changes/range.create.ts +155 -0
- package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
- package/src/core/objects/type/range/changes/range.drop.ts +34 -0
- package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
- package/src/core/objects/type/range/changes/range.types.ts +12 -0
- package/src/core/objects/type/range/range.diff.test.ts +147 -0
- package/src/core/objects/type/range/range.diff.ts +197 -0
- package/src/core/objects/type/range/range.model.ts +187 -0
- package/src/core/objects/type/type.types.ts +5 -0
- package/src/core/objects/utils.ts +171 -0
- package/src/core/objects/view/changes/view.alter.test.ts +115 -0
- package/src/core/objects/view/changes/view.alter.ts +112 -0
- package/src/core/objects/view/changes/view.base.ts +20 -0
- package/src/core/objects/view/changes/view.comment.ts +59 -0
- package/src/core/objects/view/changes/view.create.test.ts +70 -0
- package/src/core/objects/view/changes/view.create.ts +73 -0
- package/src/core/objects/view/changes/view.drop.test.ts +37 -0
- package/src/core/objects/view/changes/view.drop.ts +40 -0
- package/src/core/objects/view/changes/view.privilege.ts +200 -0
- package/src/core/objects/view/changes/view.types.ts +12 -0
- package/src/core/objects/view/view.diff.test.ts +173 -0
- package/src/core/objects/view/view.diff.ts +215 -0
- package/src/core/objects/view/view.model.ts +262 -0
- package/src/core/plan/apply.ts +172 -0
- package/src/core/plan/create.ts +384 -0
- package/src/core/plan/hierarchy.ts +574 -0
- package/src/core/plan/index.ts +29 -0
- package/src/core/plan/io.ts +20 -0
- package/src/core/plan/risk.ts +48 -0
- package/src/core/plan/serialize.test.ts +317 -0
- package/src/core/plan/serialize.ts +209 -0
- package/src/core/plan/sql-format/constants.ts +13 -0
- package/src/core/plan/sql-format/fixtures.ts +2803 -0
- package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
- package/src/core/plan/sql-format/format-functions.test.ts +127 -0
- package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
- package/src/core/plan/sql-format/format-off.test.ts +806 -0
- package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
- package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
- package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
- package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
- package/src/core/plan/sql-format/format-stress.test.ts +616 -0
- package/src/core/plan/sql-format/format-utils.test.ts +91 -0
- package/src/core/plan/sql-format/format-utils.ts +391 -0
- package/src/core/plan/sql-format/formatters.ts +921 -0
- package/src/core/plan/sql-format/index.ts +149 -0
- package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
- package/src/core/plan/sql-format/keyword-case.ts +1120 -0
- package/src/core/plan/sql-format/protect.test.ts +127 -0
- package/src/core/plan/sql-format/protect.ts +337 -0
- package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
- package/src/core/plan/sql-format/sql-scanner.ts +252 -0
- package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
- package/src/core/plan/sql-format/tokenizer.ts +152 -0
- package/src/core/plan/sql-format/types.ts +31 -0
- package/src/core/plan/sql-format/wrap.test.ts +119 -0
- package/src/core/plan/sql-format/wrap.ts +196 -0
- package/src/core/plan/sql-format.ts +2 -0
- package/src/core/plan/ssl-config.ts +172 -0
- package/src/core/plan/statements.ts +22 -0
- package/src/core/plan/types.ts +171 -0
- package/src/core/postgres-config.ts +293 -0
- package/src/core/sort/custom-constraints.ts +161 -0
- package/src/core/sort/debug-visualization.ts +239 -0
- package/src/core/sort/dependency-filter.ts +224 -0
- package/src/core/sort/graph-builder.ts +235 -0
- package/src/core/sort/graph-utils.ts +51 -0
- package/src/core/sort/logical-sort.test.ts +371 -0
- package/src/core/sort/logical-sort.ts +597 -0
- package/src/core/sort/sort-changes.ts +234 -0
- package/src/core/sort/topological-sort.test.ts +275 -0
- package/src/core/sort/topological-sort.ts +184 -0
- package/src/core/sort/types.ts +112 -0
- package/src/core/sort/utils.ts +69 -0
- package/src/core/test-utils/assert-valid-sql.ts +20 -0
- package/src/index.ts +41 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog snapshot - full JSON-serializable representation of a Catalog.
|
|
3
|
+
*
|
|
4
|
+
* Enables catalog-export (snapshot a live DB) and catalog-import
|
|
5
|
+
* (use a snapshot as source/target for createPlan).
|
|
6
|
+
*/
|
|
7
|
+
import { Catalog } from "./catalog.model.ts";
|
|
8
|
+
import type { PgDepend } from "./depend.ts";
|
|
9
|
+
/**
|
|
10
|
+
* Full JSON-serializable representation of a Catalog.
|
|
11
|
+
*
|
|
12
|
+
* Every object record uses plain props objects (not class instances).
|
|
13
|
+
* `indexableObjects` is omitted -- it is reconstructed on deserialization.
|
|
14
|
+
*/
|
|
15
|
+
export interface CatalogSnapshot {
|
|
16
|
+
version: number;
|
|
17
|
+
currentUser: string;
|
|
18
|
+
aggregates: Record<string, Record<string, unknown>>;
|
|
19
|
+
collations: Record<string, Record<string, unknown>>;
|
|
20
|
+
compositeTypes: Record<string, Record<string, unknown>>;
|
|
21
|
+
domains: Record<string, Record<string, unknown>>;
|
|
22
|
+
enums: Record<string, Record<string, unknown>>;
|
|
23
|
+
extensions: Record<string, Record<string, unknown>>;
|
|
24
|
+
procedures: Record<string, Record<string, unknown>>;
|
|
25
|
+
indexes: Record<string, Record<string, unknown>>;
|
|
26
|
+
materializedViews: Record<string, Record<string, unknown>>;
|
|
27
|
+
subscriptions: Record<string, Record<string, unknown>>;
|
|
28
|
+
publications: Record<string, Record<string, unknown>>;
|
|
29
|
+
rlsPolicies: Record<string, Record<string, unknown>>;
|
|
30
|
+
roles: Record<string, Record<string, unknown>>;
|
|
31
|
+
schemas: Record<string, Record<string, unknown>>;
|
|
32
|
+
sequences: Record<string, Record<string, unknown>>;
|
|
33
|
+
tables: Record<string, Record<string, unknown>>;
|
|
34
|
+
triggers: Record<string, Record<string, unknown>>;
|
|
35
|
+
eventTriggers: Record<string, Record<string, unknown>>;
|
|
36
|
+
rules: Record<string, Record<string, unknown>>;
|
|
37
|
+
ranges: Record<string, Record<string, unknown>>;
|
|
38
|
+
views: Record<string, Record<string, unknown>>;
|
|
39
|
+
foreignDataWrappers: Record<string, Record<string, unknown>>;
|
|
40
|
+
servers: Record<string, Record<string, unknown>>;
|
|
41
|
+
userMappings: Record<string, Record<string, unknown>>;
|
|
42
|
+
foreignTables: Record<string, Record<string, unknown>>;
|
|
43
|
+
depends: PgDepend[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Serialize a Catalog to a JSON-serializable CatalogSnapshot.
|
|
47
|
+
*
|
|
48
|
+
* Expects a normalized catalog (as returned by `extractCatalog`).
|
|
49
|
+
* BigInt values (Sequence min/max) are converted to strings by the
|
|
50
|
+
* custom JSON replacer -- call `stringifyCatalogSnapshot` for JSON output.
|
|
51
|
+
*/
|
|
52
|
+
export declare function serializeCatalog(catalog: Catalog): CatalogSnapshot;
|
|
53
|
+
/**
|
|
54
|
+
* Serialize a CatalogSnapshot to a JSON string.
|
|
55
|
+
*
|
|
56
|
+
* Handles BigInt values (Sequence min/max) by converting them to strings.
|
|
57
|
+
*/
|
|
58
|
+
export declare function stringifyCatalogSnapshot(snapshot: CatalogSnapshot): string;
|
|
59
|
+
/**
|
|
60
|
+
* Deserialize a CatalogSnapshot (plain JSON data) back into a Catalog.
|
|
61
|
+
*
|
|
62
|
+
* Validates the top-level structure with Zod, then constructs model
|
|
63
|
+
* class instances via their constructors. Rebuilds `indexableObjects`
|
|
64
|
+
* from tables + materializedViews.
|
|
65
|
+
*/
|
|
66
|
+
export declare function deserializeCatalog(data: unknown): Catalog;
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog snapshot - full JSON-serializable representation of a Catalog.
|
|
3
|
+
*
|
|
4
|
+
* Enables catalog-export (snapshot a live DB) and catalog-import
|
|
5
|
+
* (use a snapshot as source/target for createPlan).
|
|
6
|
+
*/
|
|
7
|
+
import z from "zod";
|
|
8
|
+
import { Catalog } from "./catalog.model.js";
|
|
9
|
+
import { Aggregate } from "./objects/aggregate/aggregate.model.js";
|
|
10
|
+
import { Collation } from "./objects/collation/collation.model.js";
|
|
11
|
+
import { Domain } from "./objects/domain/domain.model.js";
|
|
12
|
+
import { EventTrigger } from "./objects/event-trigger/event-trigger.model.js";
|
|
13
|
+
import { Extension } from "./objects/extension/extension.model.js";
|
|
14
|
+
import { ForeignDataWrapper } from "./objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js";
|
|
15
|
+
import { ForeignTable } from "./objects/foreign-data-wrapper/foreign-table/foreign-table.model.js";
|
|
16
|
+
import { Server } from "./objects/foreign-data-wrapper/server/server.model.js";
|
|
17
|
+
import { UserMapping } from "./objects/foreign-data-wrapper/user-mapping/user-mapping.model.js";
|
|
18
|
+
import { Index } from "./objects/index/index.model.js";
|
|
19
|
+
import { MaterializedView } from "./objects/materialized-view/materialized-view.model.js";
|
|
20
|
+
import { Procedure } from "./objects/procedure/procedure.model.js";
|
|
21
|
+
import { Publication } from "./objects/publication/publication.model.js";
|
|
22
|
+
import { RlsPolicy } from "./objects/rls-policy/rls-policy.model.js";
|
|
23
|
+
import { Role } from "./objects/role/role.model.js";
|
|
24
|
+
import { Rule } from "./objects/rule/rule.model.js";
|
|
25
|
+
import { Schema } from "./objects/schema/schema.model.js";
|
|
26
|
+
import { Sequence } from "./objects/sequence/sequence.model.js";
|
|
27
|
+
import { Subscription } from "./objects/subscription/subscription.model.js";
|
|
28
|
+
import { Table } from "./objects/table/table.model.js";
|
|
29
|
+
import { Trigger } from "./objects/trigger/trigger.model.js";
|
|
30
|
+
import { CompositeType } from "./objects/type/composite-type/composite-type.model.js";
|
|
31
|
+
import { Enum } from "./objects/type/enum/enum.model.js";
|
|
32
|
+
import { Range } from "./objects/type/range/range.model.js";
|
|
33
|
+
import { View } from "./objects/view/view.model.js";
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Zod schema for validation on deserialization
|
|
36
|
+
// ============================================================================
|
|
37
|
+
const objectRecord = z.record(z.string(), z.any());
|
|
38
|
+
const CatalogSnapshotSchema = z.object({
|
|
39
|
+
version: z.number(),
|
|
40
|
+
currentUser: z.string(),
|
|
41
|
+
aggregates: objectRecord,
|
|
42
|
+
collations: objectRecord,
|
|
43
|
+
compositeTypes: objectRecord,
|
|
44
|
+
domains: objectRecord,
|
|
45
|
+
enums: objectRecord,
|
|
46
|
+
extensions: objectRecord,
|
|
47
|
+
procedures: objectRecord,
|
|
48
|
+
indexes: objectRecord,
|
|
49
|
+
materializedViews: objectRecord,
|
|
50
|
+
subscriptions: objectRecord,
|
|
51
|
+
publications: objectRecord,
|
|
52
|
+
rlsPolicies: objectRecord,
|
|
53
|
+
roles: objectRecord,
|
|
54
|
+
schemas: objectRecord,
|
|
55
|
+
sequences: objectRecord,
|
|
56
|
+
tables: objectRecord,
|
|
57
|
+
triggers: objectRecord,
|
|
58
|
+
eventTriggers: objectRecord,
|
|
59
|
+
rules: objectRecord,
|
|
60
|
+
ranges: objectRecord,
|
|
61
|
+
views: objectRecord,
|
|
62
|
+
foreignDataWrappers: objectRecord,
|
|
63
|
+
servers: objectRecord,
|
|
64
|
+
userMappings: objectRecord,
|
|
65
|
+
foreignTables: objectRecord,
|
|
66
|
+
depends: z.array(z.object({
|
|
67
|
+
dependent_stable_id: z.string(),
|
|
68
|
+
referenced_stable_id: z.string(),
|
|
69
|
+
deptype: z.enum(["n", "a", "i"]),
|
|
70
|
+
})),
|
|
71
|
+
});
|
|
72
|
+
// ============================================================================
|
|
73
|
+
// Serialization
|
|
74
|
+
// ============================================================================
|
|
75
|
+
function spreadRecord(record) {
|
|
76
|
+
return Object.fromEntries(Object.entries(record).map(([key, instance]) => [
|
|
77
|
+
key,
|
|
78
|
+
{ ...instance },
|
|
79
|
+
]));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Serialize Aggregate instances back to their Props shape.
|
|
83
|
+
*
|
|
84
|
+
* Aggregate renames `identity_arguments` -> `identityArguments` and trims it
|
|
85
|
+
* on construction. We must map it back to `identity_arguments` so
|
|
86
|
+
* deserialization through the constructor works.
|
|
87
|
+
*/
|
|
88
|
+
function serializeAggregates(record) {
|
|
89
|
+
return Object.fromEntries(Object.entries(record).map(([key, agg]) => {
|
|
90
|
+
const { identityArguments: _, ...rest } = agg;
|
|
91
|
+
return [key, { ...rest, identity_arguments: agg.identityArguments }];
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Serialize a Catalog to a JSON-serializable CatalogSnapshot.
|
|
96
|
+
*
|
|
97
|
+
* Expects a normalized catalog (as returned by `extractCatalog`).
|
|
98
|
+
* BigInt values (Sequence min/max) are converted to strings by the
|
|
99
|
+
* custom JSON replacer -- call `stringifyCatalogSnapshot` for JSON output.
|
|
100
|
+
*/
|
|
101
|
+
export function serializeCatalog(catalog) {
|
|
102
|
+
return {
|
|
103
|
+
version: catalog.version,
|
|
104
|
+
currentUser: catalog.currentUser,
|
|
105
|
+
aggregates: serializeAggregates(catalog.aggregates),
|
|
106
|
+
collations: spreadRecord(catalog.collations),
|
|
107
|
+
compositeTypes: spreadRecord(catalog.compositeTypes),
|
|
108
|
+
domains: spreadRecord(catalog.domains),
|
|
109
|
+
enums: spreadRecord(catalog.enums),
|
|
110
|
+
extensions: spreadRecord(catalog.extensions),
|
|
111
|
+
procedures: spreadRecord(catalog.procedures),
|
|
112
|
+
indexes: spreadRecord(catalog.indexes),
|
|
113
|
+
materializedViews: spreadRecord(catalog.materializedViews),
|
|
114
|
+
subscriptions: spreadRecord(catalog.subscriptions),
|
|
115
|
+
publications: spreadRecord(catalog.publications),
|
|
116
|
+
rlsPolicies: spreadRecord(catalog.rlsPolicies),
|
|
117
|
+
roles: spreadRecord(catalog.roles),
|
|
118
|
+
schemas: spreadRecord(catalog.schemas),
|
|
119
|
+
sequences: spreadRecord(catalog.sequences),
|
|
120
|
+
tables: spreadRecord(catalog.tables),
|
|
121
|
+
triggers: spreadRecord(catalog.triggers),
|
|
122
|
+
eventTriggers: spreadRecord(catalog.eventTriggers),
|
|
123
|
+
rules: spreadRecord(catalog.rules),
|
|
124
|
+
ranges: spreadRecord(catalog.ranges),
|
|
125
|
+
views: spreadRecord(catalog.views),
|
|
126
|
+
foreignDataWrappers: spreadRecord(catalog.foreignDataWrappers),
|
|
127
|
+
servers: spreadRecord(catalog.servers),
|
|
128
|
+
userMappings: spreadRecord(catalog.userMappings),
|
|
129
|
+
foreignTables: spreadRecord(catalog.foreignTables),
|
|
130
|
+
depends: catalog.depends,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Serialize a CatalogSnapshot to a JSON string.
|
|
135
|
+
*
|
|
136
|
+
* Handles BigInt values (Sequence min/max) by converting them to strings.
|
|
137
|
+
*/
|
|
138
|
+
export function stringifyCatalogSnapshot(snapshot) {
|
|
139
|
+
return JSON.stringify(snapshot, (_key, value) => (typeof value === "bigint" ? value.toString() : value), 2);
|
|
140
|
+
}
|
|
141
|
+
// ============================================================================
|
|
142
|
+
// Deserialization
|
|
143
|
+
// ============================================================================
|
|
144
|
+
function buildRecord(record, ctor) {
|
|
145
|
+
return Object.fromEntries(Object.entries(record).map(([key, props]) => [
|
|
146
|
+
key,
|
|
147
|
+
new ctor(props),
|
|
148
|
+
]));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Coerce BigInt fields in Sequence props from string back to BigInt.
|
|
152
|
+
* JSON has no BigInt type, so these are stored as strings.
|
|
153
|
+
*/
|
|
154
|
+
function coerceSequenceBigInts(record) {
|
|
155
|
+
return Object.fromEntries(Object.entries(record).map(([key, props]) => [
|
|
156
|
+
key,
|
|
157
|
+
{
|
|
158
|
+
...props,
|
|
159
|
+
minimum_value: BigInt(props.minimum_value),
|
|
160
|
+
maximum_value: BigInt(props.maximum_value),
|
|
161
|
+
},
|
|
162
|
+
]));
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Deserialize a CatalogSnapshot (plain JSON data) back into a Catalog.
|
|
166
|
+
*
|
|
167
|
+
* Validates the top-level structure with Zod, then constructs model
|
|
168
|
+
* class instances via their constructors. Rebuilds `indexableObjects`
|
|
169
|
+
* from tables + materializedViews.
|
|
170
|
+
*/
|
|
171
|
+
export function deserializeCatalog(data) {
|
|
172
|
+
const s = CatalogSnapshotSchema.parse(data);
|
|
173
|
+
const tables = buildRecord(s.tables, Table);
|
|
174
|
+
const materializedViews = buildRecord(s.materializedViews, MaterializedView);
|
|
175
|
+
return new Catalog({
|
|
176
|
+
version: s.version,
|
|
177
|
+
currentUser: s.currentUser,
|
|
178
|
+
aggregates: buildRecord(s.aggregates, Aggregate),
|
|
179
|
+
collations: buildRecord(s.collations, Collation),
|
|
180
|
+
compositeTypes: buildRecord(s.compositeTypes, CompositeType),
|
|
181
|
+
domains: buildRecord(s.domains, Domain),
|
|
182
|
+
enums: buildRecord(s.enums, Enum),
|
|
183
|
+
extensions: buildRecord(s.extensions, Extension),
|
|
184
|
+
procedures: buildRecord(s.procedures, Procedure),
|
|
185
|
+
indexes: buildRecord(s.indexes, Index),
|
|
186
|
+
materializedViews,
|
|
187
|
+
subscriptions: buildRecord(s.subscriptions, Subscription),
|
|
188
|
+
publications: buildRecord(s.publications, Publication),
|
|
189
|
+
rlsPolicies: buildRecord(s.rlsPolicies, RlsPolicy),
|
|
190
|
+
roles: buildRecord(s.roles, Role),
|
|
191
|
+
schemas: buildRecord(s.schemas, Schema),
|
|
192
|
+
sequences: buildRecord(coerceSequenceBigInts(s.sequences), Sequence),
|
|
193
|
+
tables,
|
|
194
|
+
triggers: buildRecord(s.triggers, Trigger),
|
|
195
|
+
eventTriggers: buildRecord(s.eventTriggers, EventTrigger),
|
|
196
|
+
rules: buildRecord(s.rules, Rule),
|
|
197
|
+
ranges: buildRecord(s.ranges, Range),
|
|
198
|
+
views: buildRecord(s.views, View),
|
|
199
|
+
foreignDataWrappers: buildRecord(s.foreignDataWrappers, ForeignDataWrapper),
|
|
200
|
+
servers: buildRecord(s.servers, Server),
|
|
201
|
+
userMappings: buildRecord(s.userMappings, UserMapping),
|
|
202
|
+
foreignTables: buildRecord(s.foreignTables, ForeignTable),
|
|
203
|
+
depends: s.depends,
|
|
204
|
+
indexableObjects: { ...tables, ...materializedViews },
|
|
205
|
+
});
|
|
206
|
+
}
|
package/dist/core/context.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Pool } from "pg";
|
|
2
2
|
import type { Catalog } from "./catalog.model.ts";
|
|
3
3
|
/**
|
|
4
4
|
* Context for diff operations, containing both source and target catalogs.
|
|
@@ -7,5 +7,5 @@ export interface DiffContext {
|
|
|
7
7
|
mainCatalog: Catalog;
|
|
8
8
|
branchCatalog: Catalog;
|
|
9
9
|
}
|
|
10
|
-
export declare function extractVersion(
|
|
11
|
-
export declare function extractCurrentUser(
|
|
10
|
+
export declare function extractVersion(pool: Pool): Promise<number>;
|
|
11
|
+
export declare function extractCurrentUser(pool: Pool): Promise<string>;
|
package/dist/core/context.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
select current_setting('server_version_num')::int as version;
|
|
4
|
-
|
|
5
|
-
return version;
|
|
1
|
+
import { sql } from "@ts-safeql/sql-tag";
|
|
2
|
+
export async function extractVersion(pool) {
|
|
3
|
+
const { rows } = await pool.query(sql `select current_setting('server_version_num')::int as version`);
|
|
4
|
+
return rows[0].version;
|
|
6
5
|
}
|
|
7
|
-
export async function extractCurrentUser(
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
`;
|
|
11
|
-
return current_user;
|
|
6
|
+
export async function extractCurrentUser(pool) {
|
|
7
|
+
const { rows } = await pool.query(sql `select quote_ident(current_user) as current_user`);
|
|
8
|
+
return rows[0].current_user;
|
|
12
9
|
}
|
|
@@ -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";
|