@supabase/pg-delta 1.0.0-alpha.3 → 1.0.0-alpha.5
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 +14 -1
- package/dist/core/catalog.model.js +103 -1
- package/dist/core/catalog.snapshot.d.ts +66 -0
- package/dist/core/catalog.snapshot.js +206 -0
- 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/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 +9 -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 +8 -8
- package/dist/core/objects/aggregate/aggregate.model.js +1 -1
- 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/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.js +1 -1
- package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
- 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.js +2 -2
- 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.js +1 -1
- 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/language/language.diff.d.ts +2 -5
- package/dist/core/objects/language/language.diff.js +7 -39
- 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 +3 -3
- package/dist/core/objects/materialized-view/materialized-view.model.js +1 -1
- 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 +9 -9
- package/dist/core/objects/procedure/procedure.model.js +1 -1
- 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/rls-policy/changes/rls-policy.alter.js +3 -3
- package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
- package/dist/core/objects/role/role.diff.js +22 -1
- package/dist/core/objects/role/role.model.d.ts +4 -3
- package/dist/core/objects/role/role.model.js +118 -12
- package/dist/core/objects/rule/rule.model.d.ts +1 -1
- 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.js +1 -1
- 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.js +1 -1
- package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
- 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 +25 -22
- package/dist/core/objects/table/table.model.js +4 -1
- 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 +9 -0
- package/dist/core/objects/trigger/trigger.model.js +14 -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 +3 -3
- package/dist/core/objects/type/composite-type/composite-type.model.js +2 -1
- 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.js +1 -1
- 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.js +1 -1
- 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 +18 -4
- package/dist/core/objects/view/view.model.js +3 -13
- package/dist/core/plan/apply.js +11 -28
- package/dist/core/plan/create.d.ts +19 -6
- package/dist/core/plan/create.js +134 -155
- 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 +29 -0
- package/dist/core/postgres-config.js +83 -2
- 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 +8 -0
- package/dist/index.js +7 -1
- package/package.json +54 -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 +464 -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 +368 -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 +238 -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 +38 -0
package/README.md
CHANGED
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
PostgreSQL migrations made easy.
|
|
4
4
|
|
|
5
|
-
Generate migration scripts by comparing two PostgreSQL databases. Automatically detects schema differences and creates safe, ordered migration scripts.
|
|
5
|
+
Generate migration scripts by comparing two PostgreSQL databases. Automatically detects schema differences and creates safe, ordered migration scripts. Supports both imperative diff-based migrations and declarative file-based schema management.
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
9
9
|
- 🔍 Compare databases and generate migration scripts automatically
|
|
10
10
|
- 🔒 Safety-first: detects data-loss operations and requires explicit confirmation
|
|
11
11
|
- 📋 Plan-based workflow: preview changes before applying, store plans for version control
|
|
12
|
+
- 📁 Declarative schemas: export/apply schemas as version-controlled `.sql` files
|
|
12
13
|
- 🎯 Integration DSL: filter and customize serialization with JSON-based rules
|
|
13
14
|
- 🛠️ Developer-friendly: interactive CLI with tree-formatted change previews
|
|
14
15
|
|
|
@@ -28,7 +29,9 @@ npx @supabase/pg-delta --source <source> --target <target>
|
|
|
28
29
|
|
|
29
30
|
### CLI Usage
|
|
30
31
|
|
|
31
|
-
The CLI provides
|
|
32
|
+
The CLI provides two paradigms: **imperative** (diff-based migrations) and **declarative** (file-based schemas).
|
|
33
|
+
|
|
34
|
+
#### Imperative: diff-based migrations
|
|
32
35
|
|
|
33
36
|
**Sync (default)** - Plan and apply changes in one go:
|
|
34
37
|
|
|
@@ -56,6 +59,38 @@ pg-delta apply \
|
|
|
56
59
|
--target postgresql://user:pass@localhost:5432/target_db
|
|
57
60
|
```
|
|
58
61
|
|
|
62
|
+
#### Declarative: file-based schemas
|
|
63
|
+
|
|
64
|
+
**Declarative export** - Export a database schema as `.sql` files:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
pg-delta declarative export \
|
|
68
|
+
--target postgresql://user:pass@localhost:5432/mydb \
|
|
69
|
+
--output ./declarative-schemas/
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Declarative apply** - Apply `.sql` files to a database:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
pg-delta declarative apply \
|
|
76
|
+
--path ./declarative-schemas/ \
|
|
77
|
+
--target postgresql://user:pass@localhost:5432/fresh_db
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
#### Utilities
|
|
81
|
+
|
|
82
|
+
**Catalog export** - Snapshot a database catalog to JSON for offline diffing:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pg-delta catalog-export \
|
|
86
|
+
--target postgresql://user:pass@localhost:5432/mydb \
|
|
87
|
+
--output snapshot.json
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The snapshot can be used as `--source` or `--target` for `plan` and `declarative export`, enabling offline diffs without a live database connection.
|
|
91
|
+
|
|
92
|
+
See the [Workflow Guide](./docs/workflow.md) for end-to-end examples combining these commands.
|
|
93
|
+
|
|
59
94
|
### Using Integrations
|
|
60
95
|
|
|
61
96
|
Use built-in integrations or custom JSON files:
|
|
@@ -106,6 +141,7 @@ if (planResult) {
|
|
|
106
141
|
|
|
107
142
|
## Documentation
|
|
108
143
|
|
|
144
|
+
- [Workflow Guide](./docs/workflow.md) - Full flow documentation for all commands and end-to-end workflows
|
|
109
145
|
- [CLI Reference](./docs/cli.md) - Complete CLI documentation with all commands and options
|
|
110
146
|
- [API Reference](./docs/api.md) - Programmatic API documentation
|
|
111
147
|
- [Integrations](./docs/integrations.md) - Using and creating integrations with the DSL system
|
|
@@ -138,6 +174,9 @@ See [Integrations Documentation](./docs/integrations.md) for complete details.
|
|
|
138
174
|
- Compare database states and review differences
|
|
139
175
|
- Automate migration creation in CI/CD pipelines
|
|
140
176
|
- Maintain schema version control with plan files
|
|
177
|
+
- Export and version-control schemas as declarative `.sql` files
|
|
178
|
+
- Apply declarative schemas to fresh databases (provisioning, restore)
|
|
179
|
+
- Snapshot databases for offline, reproducible diffs
|
|
141
180
|
- Filter platform-specific changes (e.g., Supabase system schemas)
|
|
142
181
|
|
|
143
182
|
## Contributing
|
package/dist/cli/app.js
CHANGED
|
@@ -1,12 +1,33 @@
|
|
|
1
1
|
import { buildApplication, buildRouteMap } from "@stricli/core";
|
|
2
2
|
import { applyCommand } from "./commands/apply.js";
|
|
3
|
+
import { catalogExportCommand } from "./commands/catalog-export.js";
|
|
4
|
+
import { declarativeApplyCommand } from "./commands/declarative-apply.js";
|
|
5
|
+
import { declarativeExportCommand } from "./commands/declarative-export.js";
|
|
3
6
|
import { planCommand } from "./commands/plan.js";
|
|
4
7
|
import { syncCommand } from "./commands/sync.js";
|
|
8
|
+
const declarativeRouteMap = buildRouteMap({
|
|
9
|
+
routes: {
|
|
10
|
+
apply: declarativeApplyCommand,
|
|
11
|
+
export: declarativeExportCommand,
|
|
12
|
+
},
|
|
13
|
+
docs: {
|
|
14
|
+
brief: "Declarative schema management",
|
|
15
|
+
fullDescription: `
|
|
16
|
+
Manage declarative SQL schemas.
|
|
17
|
+
|
|
18
|
+
Commands:
|
|
19
|
+
apply - Apply a declarative SQL schema to a database
|
|
20
|
+
export - Export a declarative schema from a database diff
|
|
21
|
+
`.trim(),
|
|
22
|
+
},
|
|
23
|
+
});
|
|
5
24
|
const root = buildRouteMap({
|
|
6
25
|
routes: {
|
|
7
26
|
plan: planCommand,
|
|
8
27
|
apply: applyCommand,
|
|
9
28
|
sync: syncCommand,
|
|
29
|
+
declarative: declarativeRouteMap,
|
|
30
|
+
"catalog-export": catalogExportCommand,
|
|
10
31
|
},
|
|
11
32
|
defaultCommand: "sync",
|
|
12
33
|
docs: {
|
|
@@ -15,9 +36,11 @@ const root = buildRouteMap({
|
|
|
15
36
|
pgdelta generates migration scripts by comparing two PostgreSQL databases.
|
|
16
37
|
|
|
17
38
|
Commands:
|
|
18
|
-
plan
|
|
19
|
-
apply
|
|
20
|
-
sync
|
|
39
|
+
plan - Compute schema diff and preview changes
|
|
40
|
+
apply - Apply a plan's migration script to a database
|
|
41
|
+
sync - Plan and apply changes in one go
|
|
42
|
+
declarative - Declarative schema (apply | export)
|
|
43
|
+
catalog-export - Export a database catalog as a snapshot JSON file
|
|
21
44
|
`.trim(),
|
|
22
45
|
},
|
|
23
46
|
});
|
package/dist/cli/bin/cli.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { run } from "@stricli/core";
|
|
3
3
|
import { app } from "../app.js";
|
|
4
|
+
import { getCommandExitCode } from "../exit-code.js";
|
|
4
5
|
await run(app, process.argv.slice(2), { process }).catch((error) => {
|
|
5
6
|
console.error(error);
|
|
6
7
|
process.exit(1);
|
|
7
8
|
});
|
|
9
|
+
const code = getCommandExitCode();
|
|
10
|
+
if (code !== undefined) {
|
|
11
|
+
process.exitCode = code;
|
|
12
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog export command - extract a database catalog and save as a snapshot JSON file.
|
|
3
|
+
*/
|
|
4
|
+
import { writeFile } from "node:fs/promises";
|
|
5
|
+
import { buildCommand } from "@stricli/core";
|
|
6
|
+
import { extractCatalog } from "../../core/catalog.model.js";
|
|
7
|
+
import { serializeCatalog, stringifyCatalogSnapshot, } from "../../core/catalog.snapshot.js";
|
|
8
|
+
import { createManagedPool } from "../../core/postgres-config.js";
|
|
9
|
+
export const catalogExportCommand = buildCommand({
|
|
10
|
+
parameters: {
|
|
11
|
+
flags: {
|
|
12
|
+
target: {
|
|
13
|
+
kind: "parsed",
|
|
14
|
+
brief: "Target database connection URL to extract the catalog from",
|
|
15
|
+
parse: String,
|
|
16
|
+
},
|
|
17
|
+
output: {
|
|
18
|
+
kind: "parsed",
|
|
19
|
+
brief: "Output file path for the catalog snapshot JSON",
|
|
20
|
+
parse: String,
|
|
21
|
+
},
|
|
22
|
+
role: {
|
|
23
|
+
kind: "parsed",
|
|
24
|
+
brief: "Role to use when extracting the catalog (SET ROLE)",
|
|
25
|
+
parse: String,
|
|
26
|
+
optional: true,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
aliases: {
|
|
30
|
+
t: "target",
|
|
31
|
+
o: "output",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
docs: {
|
|
35
|
+
brief: "Export a database catalog as a snapshot JSON file",
|
|
36
|
+
fullDescription: `
|
|
37
|
+
Extract the full catalog from a live PostgreSQL database and save it
|
|
38
|
+
as a JSON snapshot file. The snapshot can later be used as --source or
|
|
39
|
+
--target for the plan and declarative export commands, enabling
|
|
40
|
+
offline diffing without a live database connection.
|
|
41
|
+
|
|
42
|
+
Use cases:
|
|
43
|
+
- Snapshot template1 for use as an empty-database baseline
|
|
44
|
+
- Snapshot a production database to generate revert migrations
|
|
45
|
+
- Snapshot any state for reproducible offline diffs
|
|
46
|
+
`.trim(),
|
|
47
|
+
},
|
|
48
|
+
async func(flags) {
|
|
49
|
+
const { pool, close } = await createManagedPool(flags.target, {
|
|
50
|
+
role: flags.role,
|
|
51
|
+
label: "target",
|
|
52
|
+
});
|
|
53
|
+
try {
|
|
54
|
+
const catalog = await extractCatalog(pool);
|
|
55
|
+
const snapshot = serializeCatalog(catalog);
|
|
56
|
+
const json = stringifyCatalogSnapshot(snapshot);
|
|
57
|
+
await writeFile(flags.output, json, "utf-8");
|
|
58
|
+
this.process.stdout.write(`Catalog snapshot written to ${flags.output}\n`);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
await close();
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative-apply command - apply a declarative SQL schema to a database
|
|
3
|
+
* using pg-topo static analysis + round-based execution.
|
|
4
|
+
*/
|
|
5
|
+
import { type CommandContext } from "@stricli/core";
|
|
6
|
+
export declare const declarativeApplyCommand: import("@stricli/core").Command<CommandContext>;
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declarative-apply command - apply a declarative SQL schema to a database
|
|
3
|
+
* using pg-topo static analysis + round-based execution.
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import { buildCommand } from "@stricli/core";
|
|
7
|
+
import chalk from "chalk";
|
|
8
|
+
import { loadDeclarativeSchema } from "../../core/declarative-apply/discover-sql.js";
|
|
9
|
+
import { applyDeclarativeSchema, } from "../../core/declarative-apply/index.js";
|
|
10
|
+
import { buildDiagnosticDisplayItems, formatStatementError, positionToLineColumn, requiredObjectKeyFromDiagnostic, resolveSqlFilePath, } from "../utils/apply-display.js";
|
|
11
|
+
export const declarativeApplyCommand = buildCommand({
|
|
12
|
+
parameters: {
|
|
13
|
+
flags: {
|
|
14
|
+
path: {
|
|
15
|
+
kind: "parsed",
|
|
16
|
+
brief: "Path to the declarative schema directory (containing .sql files) or a single .sql file",
|
|
17
|
+
parse: String,
|
|
18
|
+
},
|
|
19
|
+
target: {
|
|
20
|
+
kind: "parsed",
|
|
21
|
+
brief: "Target database connection URL to apply the schema to",
|
|
22
|
+
parse: String,
|
|
23
|
+
},
|
|
24
|
+
"max-rounds": {
|
|
25
|
+
kind: "parsed",
|
|
26
|
+
brief: "Maximum number of application rounds before giving up (default: 100)",
|
|
27
|
+
parse: Number,
|
|
28
|
+
optional: true,
|
|
29
|
+
},
|
|
30
|
+
"no-validate-functions": {
|
|
31
|
+
kind: "boolean",
|
|
32
|
+
brief: "Skip final function body validation pass",
|
|
33
|
+
optional: true,
|
|
34
|
+
},
|
|
35
|
+
verbose: {
|
|
36
|
+
kind: "boolean",
|
|
37
|
+
brief: "Show detailed per-round progress",
|
|
38
|
+
optional: true,
|
|
39
|
+
},
|
|
40
|
+
"ungroup-diagnostics": {
|
|
41
|
+
kind: "boolean",
|
|
42
|
+
brief: "Show full per-diagnostic detail instead of grouped summary output",
|
|
43
|
+
optional: true,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
aliases: {
|
|
47
|
+
p: "path",
|
|
48
|
+
t: "target",
|
|
49
|
+
v: "verbose",
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
docs: {
|
|
53
|
+
brief: "Apply a declarative SQL schema to a database",
|
|
54
|
+
fullDescription: `
|
|
55
|
+
Apply SQL files from a declarative schema directory to a target database.
|
|
56
|
+
|
|
57
|
+
Uses pg-topo for static dependency analysis and topological ordering,
|
|
58
|
+
then applies statements round-by-round to handle any remaining
|
|
59
|
+
dependency gaps. Statements that fail with dependency errors are
|
|
60
|
+
deferred to subsequent rounds until all succeed or no progress is made.
|
|
61
|
+
|
|
62
|
+
Function body checks are disabled during rounds to avoid false failures
|
|
63
|
+
from functions referencing not-yet-created objects. A final validation
|
|
64
|
+
pass re-runs all function/procedure definitions with body checks enabled.
|
|
65
|
+
|
|
66
|
+
Exit codes:
|
|
67
|
+
0 - Success (all statements applied)
|
|
68
|
+
1 - Error (hard failures or validation errors)
|
|
69
|
+
2 - Stuck (dependency cycle or unresolvable ordering)
|
|
70
|
+
|
|
71
|
+
Tip: Use DEBUG=pg-delta:declarative-apply for detailed defer/skip/fail logs (which statements are deferred and why).
|
|
72
|
+
`.trim(),
|
|
73
|
+
},
|
|
74
|
+
async func(flags) {
|
|
75
|
+
const verbose = !!flags.verbose;
|
|
76
|
+
const ungroupDiagnostics = !!flags["ungroup-diagnostics"];
|
|
77
|
+
const onRoundComplete = verbose
|
|
78
|
+
? (round) => {
|
|
79
|
+
const parts = [
|
|
80
|
+
`Round ${round.round}:`,
|
|
81
|
+
chalk.green(`${round.applied} applied`),
|
|
82
|
+
];
|
|
83
|
+
if (round.deferred > 0) {
|
|
84
|
+
parts.push(chalk.yellow(`${round.deferred} deferred`));
|
|
85
|
+
}
|
|
86
|
+
if (round.failed > 0) {
|
|
87
|
+
parts.push(chalk.red(`${round.failed} failed`));
|
|
88
|
+
}
|
|
89
|
+
this.process.stdout.write(`${parts.join(" ")}\n`);
|
|
90
|
+
}
|
|
91
|
+
: undefined;
|
|
92
|
+
this.process.stdout.write(`Analyzing SQL files in ${flags.path}...\n`);
|
|
93
|
+
let content;
|
|
94
|
+
try {
|
|
95
|
+
content = await loadDeclarativeSchema(flags.path);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
this.process.stderr.write(`Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
99
|
+
process.exitCode = 1;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (content.length === 0) {
|
|
103
|
+
this.process.stderr.write(`No .sql files found in '${flags.path}'. Pass a directory containing .sql files or a single .sql file.\n`);
|
|
104
|
+
process.exitCode = 1;
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
let result;
|
|
108
|
+
try {
|
|
109
|
+
result = await applyDeclarativeSchema({
|
|
110
|
+
content,
|
|
111
|
+
targetUrl: flags.target,
|
|
112
|
+
maxRounds: flags["max-rounds"],
|
|
113
|
+
validateFunctionBodies: !flags["no-validate-functions"],
|
|
114
|
+
onRoundComplete,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
this.process.stderr.write(`Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
119
|
+
process.exitCode = 1;
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// Report pg-topo diagnostics grouped by severity (least noisy first).
|
|
123
|
+
// UNKNOWN_STATEMENT_CLASS is always hidden; DUPLICATE_PRODUCER,
|
|
124
|
+
// CYCLE_EDGE_SKIPPED, and UNRESOLVED_DEPENDENCY are verbose-only.
|
|
125
|
+
const diagnosticDisplayOrder = {
|
|
126
|
+
UNKNOWN_STATEMENT_CLASS: 0,
|
|
127
|
+
DUPLICATE_PRODUCER: 1,
|
|
128
|
+
CYCLE_EDGE_SKIPPED: 2,
|
|
129
|
+
UNRESOLVED_DEPENDENCY: 3,
|
|
130
|
+
};
|
|
131
|
+
const diagnosticColor = {
|
|
132
|
+
DUPLICATE_PRODUCER: chalk.yellow,
|
|
133
|
+
CYCLE_EDGE_SKIPPED: chalk.red,
|
|
134
|
+
UNRESOLVED_DEPENDENCY: chalk.dim,
|
|
135
|
+
};
|
|
136
|
+
const verboseOnlyCodes = new Set([
|
|
137
|
+
"UNRESOLVED_DEPENDENCY",
|
|
138
|
+
"DUPLICATE_PRODUCER",
|
|
139
|
+
"CYCLE_EDGE_SKIPPED",
|
|
140
|
+
]);
|
|
141
|
+
const warnings = result.diagnostics
|
|
142
|
+
.filter((d) => d.code !== "UNKNOWN_STATEMENT_CLASS" &&
|
|
143
|
+
(verbose || !verboseOnlyCodes.has(d.code)))
|
|
144
|
+
.sort((a, b) => (diagnosticDisplayOrder[a.code] ?? 99) -
|
|
145
|
+
(diagnosticDisplayOrder[b.code] ?? 99));
|
|
146
|
+
if (warnings.length > 0 && verbose) {
|
|
147
|
+
const fileContentCache = new Map();
|
|
148
|
+
for (const diag of warnings) {
|
|
149
|
+
const id = diag.statementId;
|
|
150
|
+
if (id &&
|
|
151
|
+
id.sourceOffset != null &&
|
|
152
|
+
id.filePath &&
|
|
153
|
+
!fileContentCache.has(id.filePath)) {
|
|
154
|
+
// Try to resolve the exact file path of the statement to get the exact location of the error
|
|
155
|
+
try {
|
|
156
|
+
const fullPath = await resolveSqlFilePath(flags.path, id.filePath);
|
|
157
|
+
const content = await readFile(fullPath, "utf-8");
|
|
158
|
+
fileContentCache.set(id.filePath, content);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Fall back to statementIndex display
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
this.process.stderr.write(chalk.yellow(`\n${warnings.length} diagnostic(s) from static analysis:\n`));
|
|
166
|
+
const entries = warnings.map((diag) => {
|
|
167
|
+
let location;
|
|
168
|
+
if (diag.statementId) {
|
|
169
|
+
const id = diag.statementId;
|
|
170
|
+
const offset = id.sourceOffset;
|
|
171
|
+
const content = offset != null ? fileContentCache.get(id.filePath) : undefined;
|
|
172
|
+
if (content != null && offset != null) {
|
|
173
|
+
const { line, column } = positionToLineColumn(content, offset + 1);
|
|
174
|
+
location = `${id.filePath}:${line}:${column}`;
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
location = `${id.filePath}:${id.statementIndex}`;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
diagnostic: diag,
|
|
182
|
+
location,
|
|
183
|
+
requiredObjectKey: requiredObjectKeyFromDiagnostic(diag),
|
|
184
|
+
};
|
|
185
|
+
});
|
|
186
|
+
const displayItems = buildDiagnosticDisplayItems(entries, !ungroupDiagnostics);
|
|
187
|
+
let lastCode = "";
|
|
188
|
+
const previewLimit = 5;
|
|
189
|
+
for (const item of displayItems) {
|
|
190
|
+
if (item.code !== lastCode) {
|
|
191
|
+
if (lastCode !== "") {
|
|
192
|
+
this.process.stderr.write("\n");
|
|
193
|
+
}
|
|
194
|
+
lastCode = item.code;
|
|
195
|
+
}
|
|
196
|
+
const colorFn = diagnosticColor[item.code] ?? chalk.yellow;
|
|
197
|
+
const location = item.locations.length > 0 ? ` (${item.locations[0]})` : "";
|
|
198
|
+
const occurrences = !ungroupDiagnostics && item.locations.length > 1
|
|
199
|
+
? ` x${item.locations.length}`
|
|
200
|
+
: "";
|
|
201
|
+
this.process.stderr.write(colorFn(` [${item.code}]${location}${occurrences} ${item.message}\n`));
|
|
202
|
+
if (!ungroupDiagnostics && item.requiredObjectKey) {
|
|
203
|
+
this.process.stderr.write(colorFn(` -> Object: ${item.requiredObjectKey}\n`));
|
|
204
|
+
}
|
|
205
|
+
if (!ungroupDiagnostics && item.locations.length > 1) {
|
|
206
|
+
for (const locationEntry of item.locations.slice(0, previewLimit)) {
|
|
207
|
+
this.process.stderr.write(colorFn(` at ${locationEntry}\n`));
|
|
208
|
+
}
|
|
209
|
+
const remaining = item.locations.length - previewLimit;
|
|
210
|
+
if (remaining > 0) {
|
|
211
|
+
this.process.stderr.write(colorFn(` ... and ${remaining} more location(s)\n`));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (item.suggestedFix) {
|
|
215
|
+
this.process.stderr.write(colorFn(` -> Fix: ${item.suggestedFix}\n`));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
this.process.stderr.write("\n");
|
|
219
|
+
}
|
|
220
|
+
const { apply } = result;
|
|
221
|
+
// Summary
|
|
222
|
+
this.process.stdout.write("\n");
|
|
223
|
+
this.process.stdout.write(`Statements: ${result.totalStatements} total, ${apply.totalApplied} applied`);
|
|
224
|
+
if (apply.totalSkipped > 0) {
|
|
225
|
+
this.process.stdout.write(`, ${apply.totalSkipped} skipped`);
|
|
226
|
+
}
|
|
227
|
+
this.process.stdout.write("\n");
|
|
228
|
+
this.process.stdout.write(`Rounds: ${apply.totalRounds}\n`);
|
|
229
|
+
switch (apply.status) {
|
|
230
|
+
case "success": {
|
|
231
|
+
this.process.stdout.write(chalk.green("All statements applied successfully.\n"));
|
|
232
|
+
if (apply.validationErrors && apply.validationErrors.length > 0) {
|
|
233
|
+
this.process.stderr.write(chalk.yellow(`\n${apply.validationErrors.length} function body validation error(s):\n`));
|
|
234
|
+
for (const err of apply.validationErrors) {
|
|
235
|
+
const formatted = await formatStatementError(err, flags.path);
|
|
236
|
+
this.process.stderr.write(chalk.yellow(formatted));
|
|
237
|
+
this.process.stderr.write("\n\n");
|
|
238
|
+
}
|
|
239
|
+
process.exitCode = 1;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
process.exitCode = 0;
|
|
243
|
+
}
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
case "stuck": {
|
|
247
|
+
this.process.stderr.write(chalk.red(`\nStuck after ${apply.totalRounds} round(s). ${apply.stuckStatements?.length ?? 0} statement(s) could not be applied:\n`));
|
|
248
|
+
if (apply.stuckStatements) {
|
|
249
|
+
for (const stuck of apply.stuckStatements) {
|
|
250
|
+
const formatted = await formatStatementError(stuck, flags.path);
|
|
251
|
+
this.process.stderr.write(chalk.red(formatted));
|
|
252
|
+
this.process.stderr.write("\n\n");
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (apply.errors && apply.errors.length > 0) {
|
|
256
|
+
this.process.stderr.write(chalk.red(`\nAdditionally, ${apply.errors.length} statement(s) had non-dependency errors:\n`));
|
|
257
|
+
for (const err of apply.errors) {
|
|
258
|
+
const formatted = await formatStatementError(err, flags.path);
|
|
259
|
+
this.process.stderr.write(chalk.red(formatted));
|
|
260
|
+
this.process.stderr.write("\n\n");
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
process.exitCode = 2;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
case "error": {
|
|
267
|
+
this.process.stderr.write(chalk.red(`\nCompleted with errors. ${apply.errors?.length ?? 0} statement(s) failed:\n`));
|
|
268
|
+
if (apply.errors) {
|
|
269
|
+
for (const err of apply.errors) {
|
|
270
|
+
const formatted = await formatStatementError(err, flags.path);
|
|
271
|
+
this.process.stderr.write(chalk.red(formatted));
|
|
272
|
+
this.process.stderr.write("\n\n");
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (apply.validationErrors && apply.validationErrors.length > 0) {
|
|
276
|
+
this.process.stderr.write(chalk.yellow(`\n${apply.validationErrors.length} function body validation error(s):\n`));
|
|
277
|
+
for (const err of apply.validationErrors) {
|
|
278
|
+
const formatted = await formatStatementError(err, flags.path);
|
|
279
|
+
this.process.stderr.write(chalk.yellow(formatted));
|
|
280
|
+
this.process.stderr.write("\n\n");
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
process.exitCode = 1;
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
},
|
|
288
|
+
});
|