@supabase/pg-delta 1.0.0-alpha.21 → 1.0.0-alpha.23
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/dist/core/catalog.diff.js +4 -3
- package/dist/core/catalog.model.d.ts +8 -1
- package/dist/core/catalog.model.js +10 -8
- package/dist/core/expand-replace-dependencies.js +23 -0
- package/dist/core/integrations/filter/flatten.js +13 -0
- package/dist/core/objects/aggregate/aggregate.diff.js +16 -0
- package/dist/core/objects/aggregate/aggregate.model.d.ts +10 -0
- package/dist/core/objects/aggregate/aggregate.model.js +19 -1
- package/dist/core/objects/aggregate/changes/aggregate.base.d.ts +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.security-label.d.ts +28 -0
- package/dist/core/objects/aggregate/changes/aggregate.security-label.js +64 -0
- package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +2 -1
- package/dist/core/objects/base.model.d.ts +8 -0
- package/dist/core/objects/base.model.js +2 -0
- package/dist/core/objects/domain/changes/domain.base.d.ts +1 -1
- package/dist/core/objects/domain/changes/domain.security-label.d.ts +28 -0
- package/dist/core/objects/domain/changes/domain.security-label.js +61 -0
- package/dist/core/objects/domain/changes/domain.types.d.ts +2 -1
- package/dist/core/objects/domain/domain.diff.js +16 -0
- package/dist/core/objects/domain/domain.model.d.ts +10 -0
- package/dist/core/objects/domain/domain.model.js +19 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.base.d.ts +1 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.security-label.d.ts +28 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.security-label.js +61 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +2 -1
- package/dist/core/objects/event-trigger/event-trigger.diff.js +16 -0
- package/dist/core/objects/event-trigger/event-trigger.model.d.ts +10 -0
- package/dist/core/objects/event-trigger/event-trigger.model.js +19 -1
- package/dist/core/objects/extract-with-retry.d.ts +36 -0
- package/dist/core/objects/extract-with-retry.js +51 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.d.ts +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.security-label.d.ts +28 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.security-label.js +61 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +22 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +20 -1
- package/dist/core/objects/index/index.diff.js +0 -1
- package/dist/core/objects/index/index.model.d.ts +2 -3
- package/dist/core/objects/index/index.model.js +17 -6
- package/dist/core/objects/materialized-view/changes/materialized-view.base.d.ts +1 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.security-label.d.ts +28 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.security-label.js +61 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +2 -1
- package/dist/core/objects/materialized-view/materialized-view.diff.js +18 -0
- package/dist/core/objects/materialized-view/materialized-view.model.d.ts +24 -1
- package/dist/core/objects/materialized-view/materialized-view.model.js +40 -5
- package/dist/core/objects/procedure/changes/procedure.base.d.ts +1 -1
- package/dist/core/objects/procedure/changes/procedure.security-label.d.ts +28 -0
- package/dist/core/objects/procedure/changes/procedure.security-label.js +69 -0
- package/dist/core/objects/procedure/changes/procedure.types.d.ts +2 -1
- package/dist/core/objects/procedure/procedure.diff.js +16 -0
- package/dist/core/objects/procedure/procedure.model.d.ts +12 -1
- package/dist/core/objects/procedure/procedure.model.js +39 -5
- package/dist/core/objects/publication/changes/publication.base.d.ts +1 -1
- package/dist/core/objects/publication/changes/publication.security-label.d.ts +28 -0
- package/dist/core/objects/publication/changes/publication.security-label.js +61 -0
- package/dist/core/objects/publication/changes/publication.types.d.ts +2 -1
- package/dist/core/objects/publication/publication.diff.js +16 -0
- package/dist/core/objects/publication/publication.model.d.ts +14 -0
- package/dist/core/objects/publication/publication.model.js +20 -1
- package/dist/core/objects/rls-policy/rls-policy.diff.js +13 -1
- package/dist/core/objects/role/changes/role.base.d.ts +1 -1
- package/dist/core/objects/role/changes/role.security-label.d.ts +28 -0
- package/dist/core/objects/role/changes/role.security-label.js +61 -0
- package/dist/core/objects/role/changes/role.types.d.ts +2 -1
- package/dist/core/objects/role/role.diff.js +16 -0
- package/dist/core/objects/role/role.model.d.ts +10 -0
- package/dist/core/objects/role/role.model.js +29 -0
- package/dist/core/objects/rule/rule.model.d.ts +2 -1
- package/dist/core/objects/rule/rule.model.js +20 -3
- package/dist/core/objects/schema/changes/schema.base.d.ts +1 -1
- package/dist/core/objects/schema/changes/schema.security-label.d.ts +28 -0
- package/dist/core/objects/schema/changes/schema.security-label.js +61 -0
- package/dist/core/objects/schema/changes/schema.types.d.ts +2 -1
- package/dist/core/objects/schema/schema.diff.js +24 -1
- package/dist/core/objects/schema/schema.model.d.ts +10 -0
- package/dist/core/objects/schema/schema.model.js +18 -1
- package/dist/core/objects/security-label.types.d.ts +20 -0
- package/dist/core/objects/security-label.types.js +46 -0
- package/dist/core/objects/sequence/changes/sequence.base.d.ts +1 -1
- package/dist/core/objects/sequence/changes/sequence.security-label.d.ts +28 -0
- package/dist/core/objects/sequence/changes/sequence.security-label.js +61 -0
- package/dist/core/objects/sequence/changes/sequence.types.d.ts +2 -1
- package/dist/core/objects/sequence/sequence.diff.d.ts +2 -1
- package/dist/core/objects/sequence/sequence.diff.js +44 -4
- package/dist/core/objects/sequence/sequence.model.d.ts +10 -0
- package/dist/core/objects/sequence/sequence.model.js +19 -1
- package/dist/core/objects/subscription/changes/subscription.base.d.ts +1 -1
- package/dist/core/objects/subscription/changes/subscription.security-label.d.ts +28 -0
- package/dist/core/objects/subscription/changes/subscription.security-label.js +61 -0
- package/dist/core/objects/subscription/changes/subscription.types.d.ts +2 -1
- package/dist/core/objects/subscription/subscription.diff.js +16 -0
- package/dist/core/objects/subscription/subscription.model.d.ts +10 -0
- package/dist/core/objects/subscription/subscription.model.js +19 -1
- package/dist/core/objects/table/changes/table.alter.d.ts +12 -1
- package/dist/core/objects/table/changes/table.alter.js +20 -2
- package/dist/core/objects/table/changes/table.base.d.ts +1 -1
- package/dist/core/objects/table/changes/table.security-label.d.ts +63 -0
- package/dist/core/objects/table/changes/table.security-label.js +134 -0
- package/dist/core/objects/table/changes/table.types.d.ts +2 -1
- package/dist/core/objects/table/table.diff.js +68 -15
- package/dist/core/objects/table/table.model.d.ts +36 -1
- package/dist/core/objects/table/table.model.js +74 -7
- package/dist/core/objects/trigger/trigger.model.d.ts +2 -1
- package/dist/core/objects/trigger/trigger.model.js +20 -4
- package/dist/core/objects/type/composite-type/changes/composite-type.base.d.ts +1 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.security-label.d.ts +28 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.security-label.js +61 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +2 -1
- package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -0
- package/dist/core/objects/type/composite-type/composite-type.model.d.ts +22 -0
- package/dist/core/objects/type/composite-type/composite-type.model.js +22 -2
- package/dist/core/objects/type/enum/changes/enum.base.d.ts +1 -1
- package/dist/core/objects/type/enum/changes/enum.security-label.d.ts +28 -0
- package/dist/core/objects/type/enum/changes/enum.security-label.js +61 -0
- package/dist/core/objects/type/enum/changes/enum.types.d.ts +2 -1
- package/dist/core/objects/type/enum/enum.diff.js +16 -0
- package/dist/core/objects/type/enum/enum.model.d.ts +10 -0
- package/dist/core/objects/type/enum/enum.model.js +20 -1
- package/dist/core/objects/type/range/changes/range.base.d.ts +1 -1
- package/dist/core/objects/type/range/changes/range.security-label.d.ts +28 -0
- package/dist/core/objects/type/range/changes/range.security-label.js +61 -0
- package/dist/core/objects/type/range/changes/range.types.d.ts +2 -1
- package/dist/core/objects/type/range/range.diff.js +16 -0
- package/dist/core/objects/type/range/range.model.d.ts +10 -0
- package/dist/core/objects/type/range/range.model.js +19 -1
- package/dist/core/objects/utils.d.ts +2 -0
- package/dist/core/objects/utils.js +6 -0
- package/dist/core/objects/view/changes/view.base.d.ts +1 -1
- package/dist/core/objects/view/changes/view.security-label.d.ts +28 -0
- package/dist/core/objects/view/changes/view.security-label.js +61 -0
- package/dist/core/objects/view/changes/view.types.d.ts +2 -1
- package/dist/core/objects/view/view.diff.js +13 -0
- package/dist/core/objects/view/view.model.d.ts +28 -1
- package/dist/core/objects/view/view.model.js +40 -5
- package/dist/core/plan/create.js +3 -1
- package/dist/core/plan/sql-format/fixtures.js +1 -0
- package/dist/core/plan/types.d.ts +8 -0
- package/dist/core/{post-diff-cycle-breaking.d.ts → post-diff-normalization.d.ts} +8 -1
- package/dist/core/post-diff-normalization.js +202 -0
- package/dist/core/sort/cycle-breakers.js +1 -1
- package/dist/core/sort/utils.d.ts +10 -0
- package/dist/core/sort/utils.js +28 -0
- package/package.json +1 -1
- package/src/core/catalog.diff.ts +4 -2
- package/src/core/catalog.model.ts +21 -8
- package/src/core/expand-replace-dependencies.test.ts +131 -0
- package/src/core/expand-replace-dependencies.ts +24 -0
- package/src/core/integrations/filter/dsl.test.ts +27 -0
- package/src/core/integrations/filter/flatten.ts +16 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +33 -0
- package/src/core/objects/aggregate/aggregate.model.ts +22 -1
- package/src/core/objects/aggregate/changes/aggregate.base.ts +5 -1
- package/src/core/objects/aggregate/changes/aggregate.security-label.ts +99 -0
- package/src/core/objects/aggregate/changes/aggregate.types.ts +3 -1
- package/src/core/objects/base.model.ts +2 -0
- package/src/core/objects/domain/changes/domain.base.ts +5 -1
- package/src/core/objects/domain/changes/domain.security-label.test.ts +56 -0
- package/src/core/objects/domain/changes/domain.security-label.ts +77 -0
- package/src/core/objects/domain/changes/domain.types.ts +3 -1
- package/src/core/objects/domain/domain.diff.ts +33 -0
- package/src/core/objects/domain/domain.model.ts +22 -1
- package/src/core/objects/event-trigger/changes/event-trigger.base.ts +1 -1
- package/src/core/objects/event-trigger/changes/event-trigger.security-label.ts +95 -0
- package/src/core/objects/event-trigger/changes/event-trigger.types.ts +3 -1
- package/src/core/objects/event-trigger/event-trigger.diff.ts +33 -0
- package/src/core/objects/event-trigger/event-trigger.model.ts +22 -1
- package/src/core/objects/extract-with-retry.test.ts +143 -0
- package/src/core/objects/extract-with-retry.ts +87 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +5 -1
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.security-label.ts +95 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +3 -1
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +33 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +24 -1
- package/src/core/objects/index/index.diff.ts +0 -1
- package/src/core/objects/index/index.model.test.ts +37 -1
- package/src/core/objects/index/index.model.ts +25 -6
- package/src/core/objects/materialized-view/changes/materialized-view.base.ts +5 -1
- package/src/core/objects/materialized-view/changes/materialized-view.security-label.test.ts +63 -0
- package/src/core/objects/materialized-view/changes/materialized-view.security-label.ts +95 -0
- package/src/core/objects/materialized-view/changes/materialized-view.types.ts +3 -1
- package/src/core/objects/materialized-view/materialized-view.diff.ts +37 -0
- package/src/core/objects/materialized-view/materialized-view.model.test.ts +93 -0
- package/src/core/objects/materialized-view/materialized-view.model.ts +52 -8
- package/src/core/objects/procedure/changes/procedure.base.ts +5 -1
- package/src/core/objects/procedure/changes/procedure.security-label.ts +105 -0
- package/src/core/objects/procedure/changes/procedure.types.ts +3 -1
- package/src/core/objects/procedure/procedure.diff.ts +33 -0
- package/src/core/objects/procedure/procedure.model.test.ts +117 -0
- package/src/core/objects/procedure/procedure.model.ts +51 -7
- package/src/core/objects/publication/changes/publication.base.ts +1 -1
- package/src/core/objects/publication/changes/publication.security-label.ts +95 -0
- package/src/core/objects/publication/changes/publication.types.ts +3 -1
- package/src/core/objects/publication/publication.diff.ts +33 -0
- package/src/core/objects/publication/publication.model.ts +24 -1
- package/src/core/objects/rls-policy/rls-policy.diff.ts +19 -1
- package/src/core/objects/role/changes/role.base.ts +2 -1
- package/src/core/objects/role/changes/role.security-label.ts +77 -0
- package/src/core/objects/role/changes/role.types.ts +3 -1
- package/src/core/objects/role/role.diff.ts +33 -0
- package/src/core/objects/role/role.model.ts +32 -0
- package/src/core/objects/rule/rule.model.test.ts +99 -0
- package/src/core/objects/rule/rule.model.ts +28 -4
- package/src/core/objects/schema/changes/schema.alter.test.ts +1 -0
- package/src/core/objects/schema/changes/schema.base.ts +5 -1
- package/src/core/objects/schema/changes/schema.create.test.ts +1 -0
- package/src/core/objects/schema/changes/schema.drop.test.ts +1 -0
- package/src/core/objects/schema/changes/schema.security-label.test.ts +76 -0
- package/src/core/objects/schema/changes/schema.security-label.ts +77 -0
- package/src/core/objects/schema/changes/schema.types.ts +3 -1
- package/src/core/objects/schema/schema.diff.test.ts +1 -0
- package/src/core/objects/schema/schema.diff.ts +43 -1
- package/src/core/objects/schema/schema.model.ts +21 -1
- package/src/core/objects/security-label.types.test.ts +106 -0
- package/src/core/objects/security-label.types.ts +61 -0
- package/src/core/objects/sequence/changes/sequence.base.ts +5 -1
- package/src/core/objects/sequence/changes/sequence.security-label.test.ts +58 -0
- package/src/core/objects/sequence/changes/sequence.security-label.ts +92 -0
- package/src/core/objects/sequence/changes/sequence.types.ts +3 -1
- package/src/core/objects/sequence/sequence.diff.test.ts +87 -0
- package/src/core/objects/sequence/sequence.diff.ts +64 -6
- package/src/core/objects/sequence/sequence.model.ts +22 -1
- package/src/core/objects/subscription/changes/subscription.base.ts +1 -1
- package/src/core/objects/subscription/changes/subscription.security-label.ts +95 -0
- package/src/core/objects/subscription/changes/subscription.types.ts +3 -1
- package/src/core/objects/subscription/subscription.diff.ts +33 -0
- package/src/core/objects/subscription/subscription.model.ts +22 -1
- package/src/core/objects/table/changes/table.alter.test.ts +13 -21
- package/src/core/objects/table/changes/table.alter.ts +30 -3
- package/src/core/objects/table/changes/table.base.ts +5 -1
- package/src/core/objects/table/changes/table.security-label.test.ts +140 -0
- package/src/core/objects/table/changes/table.security-label.ts +183 -0
- package/src/core/objects/table/changes/table.types.ts +3 -1
- package/src/core/objects/table/table.diff.ts +111 -19
- package/src/core/objects/table/table.model.test.ts +209 -0
- package/src/core/objects/table/table.model.ts +94 -9
- package/src/core/objects/trigger/trigger.model.test.ts +113 -0
- package/src/core/objects/trigger/trigger.model.ts +28 -5
- package/src/core/objects/type/composite-type/changes/composite-type.base.ts +5 -1
- package/src/core/objects/type/composite-type/changes/composite-type.security-label.ts +95 -0
- package/src/core/objects/type/composite-type/changes/composite-type.types.ts +3 -1
- package/src/core/objects/type/composite-type/composite-type.diff.ts +33 -0
- package/src/core/objects/type/composite-type/composite-type.model.ts +26 -2
- package/src/core/objects/type/enum/changes/enum.base.ts +5 -1
- package/src/core/objects/type/enum/changes/enum.security-label.ts +77 -0
- package/src/core/objects/type/enum/changes/enum.types.ts +3 -1
- package/src/core/objects/type/enum/enum.diff.ts +33 -0
- package/src/core/objects/type/enum/enum.model.ts +25 -1
- package/src/core/objects/type/range/changes/range.base.ts +5 -1
- package/src/core/objects/type/range/changes/range.security-label.ts +77 -0
- package/src/core/objects/type/range/changes/range.types.ts +3 -1
- package/src/core/objects/type/range/range.diff.ts +33 -0
- package/src/core/objects/type/range/range.model.ts +22 -1
- package/src/core/objects/utils.ts +6 -0
- package/src/core/objects/view/changes/view.base.ts +5 -1
- package/src/core/objects/view/changes/view.security-label.test.ts +64 -0
- package/src/core/objects/view/changes/view.security-label.ts +77 -0
- package/src/core/objects/view/changes/view.types.ts +3 -1
- package/src/core/objects/view/view.diff.ts +31 -0
- package/src/core/objects/view/view.model.test.ts +90 -0
- package/src/core/objects/view/view.model.ts +53 -7
- package/src/core/plan/create.ts +3 -1
- package/src/core/plan/sql-format/fixtures.ts +1 -0
- package/src/core/plan/types.ts +8 -0
- package/src/core/{post-diff-cycle-breaking.test.ts → post-diff-normalization.test.ts} +168 -4
- package/src/core/post-diff-normalization.ts +260 -0
- package/src/core/sort/cycle-breakers.ts +1 -1
- package/src/core/sort/utils.ts +38 -0
- package/dist/core/post-diff-cycle-breaking.js +0 -100
- package/src/core/post-diff-cycle-breaking.ts +0 -138
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SecurityLabelProps } from "../../../security-label.types.ts";
|
|
2
|
+
import type { CompositeType } from "../composite-type.model.ts";
|
|
3
|
+
import { CreateCompositeTypeChange, DropCompositeTypeChange } from "./composite-type.base.ts";
|
|
4
|
+
export type SecurityLabelCompositeType = CreateSecurityLabelOnCompositeType | DropSecurityLabelOnCompositeType;
|
|
5
|
+
export declare class CreateSecurityLabelOnCompositeType extends CreateCompositeTypeChange {
|
|
6
|
+
readonly compositeType: CompositeType;
|
|
7
|
+
readonly securityLabel: SecurityLabelProps;
|
|
8
|
+
readonly scope: "security_label";
|
|
9
|
+
constructor(props: {
|
|
10
|
+
compositeType: CompositeType;
|
|
11
|
+
securityLabel: SecurityLabelProps;
|
|
12
|
+
});
|
|
13
|
+
get creates(): `securityLabel:${string}::provider:${string}`[];
|
|
14
|
+
get requires(): `type:${string}`[];
|
|
15
|
+
serialize(): string;
|
|
16
|
+
}
|
|
17
|
+
export declare class DropSecurityLabelOnCompositeType extends DropCompositeTypeChange {
|
|
18
|
+
readonly compositeType: CompositeType;
|
|
19
|
+
readonly securityLabel: SecurityLabelProps;
|
|
20
|
+
readonly scope: "security_label";
|
|
21
|
+
constructor(props: {
|
|
22
|
+
compositeType: CompositeType;
|
|
23
|
+
securityLabel: SecurityLabelProps;
|
|
24
|
+
});
|
|
25
|
+
get drops(): `securityLabel:${string}::provider:${string}`[];
|
|
26
|
+
get requires(): (`securityLabel:${string}::provider:${string}` | `type:${string}`)[];
|
|
27
|
+
serialize(): string;
|
|
28
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { quoteLiteral } from "../../../base.change.js";
|
|
2
|
+
import { stableId } from "../../../utils.js";
|
|
3
|
+
import { CreateCompositeTypeChange, DropCompositeTypeChange, } from "./composite-type.base.js";
|
|
4
|
+
export class CreateSecurityLabelOnCompositeType extends CreateCompositeTypeChange {
|
|
5
|
+
compositeType;
|
|
6
|
+
securityLabel;
|
|
7
|
+
scope = "security_label";
|
|
8
|
+
constructor(props) {
|
|
9
|
+
super();
|
|
10
|
+
this.compositeType = props.compositeType;
|
|
11
|
+
this.securityLabel = props.securityLabel;
|
|
12
|
+
}
|
|
13
|
+
get creates() {
|
|
14
|
+
return [
|
|
15
|
+
stableId.securityLabel(this.compositeType.stableId, this.securityLabel.provider),
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
get requires() {
|
|
19
|
+
return [this.compositeType.stableId];
|
|
20
|
+
}
|
|
21
|
+
serialize() {
|
|
22
|
+
return [
|
|
23
|
+
"SECURITY LABEL FOR",
|
|
24
|
+
this.securityLabel.provider,
|
|
25
|
+
"ON TYPE",
|
|
26
|
+
`${this.compositeType.schema}.${this.compositeType.name}`,
|
|
27
|
+
"IS",
|
|
28
|
+
quoteLiteral(this.securityLabel.label),
|
|
29
|
+
].join(" ");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class DropSecurityLabelOnCompositeType extends DropCompositeTypeChange {
|
|
33
|
+
compositeType;
|
|
34
|
+
securityLabel;
|
|
35
|
+
scope = "security_label";
|
|
36
|
+
constructor(props) {
|
|
37
|
+
super();
|
|
38
|
+
this.compositeType = props.compositeType;
|
|
39
|
+
this.securityLabel = props.securityLabel;
|
|
40
|
+
}
|
|
41
|
+
get drops() {
|
|
42
|
+
return [
|
|
43
|
+
stableId.securityLabel(this.compositeType.stableId, this.securityLabel.provider),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
get requires() {
|
|
47
|
+
return [
|
|
48
|
+
stableId.securityLabel(this.compositeType.stableId, this.securityLabel.provider),
|
|
49
|
+
this.compositeType.stableId,
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
serialize() {
|
|
53
|
+
return [
|
|
54
|
+
"SECURITY LABEL FOR",
|
|
55
|
+
this.securityLabel.provider,
|
|
56
|
+
"ON TYPE",
|
|
57
|
+
`${this.compositeType.schema}.${this.compositeType.name}`,
|
|
58
|
+
"IS NULL",
|
|
59
|
+
].join(" ");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -3,5 +3,6 @@ import type { CommentCompositeType } from "./composite-type.comment.ts";
|
|
|
3
3
|
import type { CreateCompositeType } from "./composite-type.create.ts";
|
|
4
4
|
import type { DropCompositeType } from "./composite-type.drop.ts";
|
|
5
5
|
import type { CompositeTypePrivilege } from "./composite-type.privilege.ts";
|
|
6
|
+
import type { SecurityLabelCompositeType } from "./composite-type.security-label.ts";
|
|
6
7
|
/** Union of all composite-type-related change variants (`objectType: "composite_type"`). @category Change Types */
|
|
7
|
-
export type CompositeTypeChange = AlterCompositeType | CommentCompositeType | CreateCompositeType | DropCompositeType | CompositeTypePrivilege;
|
|
8
|
+
export type CompositeTypeChange = AlterCompositeType | CommentCompositeType | CreateCompositeType | DropCompositeType | CompositeTypePrivilege | SecurityLabelCompositeType;
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { diffObjects } from "../../base.diff.js";
|
|
2
2
|
import { diffPrivileges, emitObjectPrivilegeChanges, filterPublicBuiltInDefaults, } from "../../base.privilege-diff.js";
|
|
3
|
+
import { diffSecurityLabels } from "../../security-label.types.js";
|
|
3
4
|
import { deepEqual, hasNonAlterableChanges } from "../../utils.js";
|
|
4
5
|
import { AlterCompositeTypeAddAttribute, AlterCompositeTypeAlterAttributeType, AlterCompositeTypeChangeOwner, AlterCompositeTypeDropAttribute, } from "./changes/composite-type.alter.js";
|
|
5
6
|
import { CreateCommentOnCompositeType, CreateCommentOnCompositeTypeAttribute, DropCommentOnCompositeType, DropCommentOnCompositeTypeAttribute, } from "./changes/composite-type.comment.js";
|
|
6
7
|
import { CreateCompositeType } from "./changes/composite-type.create.js";
|
|
7
8
|
import { DropCompositeType } from "./changes/composite-type.drop.js";
|
|
8
9
|
import { GrantCompositeTypePrivileges, RevokeCompositeTypePrivileges, RevokeGrantOptionCompositeTypePrivileges, } from "./changes/composite-type.privilege.js";
|
|
10
|
+
import { CreateSecurityLabelOnCompositeType, DropSecurityLabelOnCompositeType, } from "./changes/composite-type.security-label.js";
|
|
9
11
|
/**
|
|
10
12
|
* Diff two sets of composite types from main and branch catalogs.
|
|
11
13
|
*
|
|
@@ -32,6 +34,12 @@ export function diffCompositeTypes(ctx, main, branch) {
|
|
|
32
34
|
if (ct.comment !== null) {
|
|
33
35
|
changes.push(new CreateCommentOnCompositeType({ compositeType: ct }));
|
|
34
36
|
}
|
|
37
|
+
for (const label of ct.security_labels) {
|
|
38
|
+
changes.push(new CreateSecurityLabelOnCompositeType({
|
|
39
|
+
compositeType: ct,
|
|
40
|
+
securityLabel: label,
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
35
43
|
// Attribute comments on creation
|
|
36
44
|
for (const attr of ct.columns) {
|
|
37
45
|
if (attr.comment !== null) {
|
|
@@ -111,6 +119,14 @@ export function diffCompositeTypes(ctx, main, branch) {
|
|
|
111
119
|
}));
|
|
112
120
|
}
|
|
113
121
|
}
|
|
122
|
+
// SECURITY LABELS
|
|
123
|
+
changes.push(...diffSecurityLabels(mainCompositeType.security_labels, branchCompositeType.security_labels, (securityLabel) => new CreateSecurityLabelOnCompositeType({
|
|
124
|
+
compositeType: branchCompositeType,
|
|
125
|
+
securityLabel,
|
|
126
|
+
}), (securityLabel) => new DropSecurityLabelOnCompositeType({
|
|
127
|
+
compositeType: mainCompositeType,
|
|
128
|
+
securityLabel,
|
|
129
|
+
})));
|
|
114
130
|
// ATTRIBUTE diffs
|
|
115
131
|
const mainAttrs = new Map(mainCompositeType.columns.map((c) => [c.name, c]));
|
|
116
132
|
const branchAttrs = new Map(branchCompositeType.columns.map((c) => [c.name, c]));
|
|
@@ -2,6 +2,7 @@ import type { Pool } from "pg";
|
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel, type TableLikeObject } from "../../base.model.ts";
|
|
4
4
|
import { type PrivilegeProps } from "../../base.privilege-diff.ts";
|
|
5
|
+
import { type SecurityLabelProps } from "../../security-label.types.ts";
|
|
5
6
|
declare const compositeTypePropsSchema: z.ZodObject<{
|
|
6
7
|
schema: z.ZodString;
|
|
7
8
|
name: z.ZodString;
|
|
@@ -40,6 +41,10 @@ declare const compositeTypePropsSchema: z.ZodObject<{
|
|
|
40
41
|
collation: z.ZodNullable<z.ZodString>;
|
|
41
42
|
default: z.ZodNullable<z.ZodString>;
|
|
42
43
|
comment: z.ZodNullable<z.ZodString>;
|
|
44
|
+
security_labels: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
45
|
+
provider: z.ZodString;
|
|
46
|
+
label: z.ZodString;
|
|
47
|
+
}, z.z.core.$strip>>>;
|
|
43
48
|
}, z.z.core.$strip>>;
|
|
44
49
|
privileges: z.ZodArray<z.ZodObject<{
|
|
45
50
|
grantee: z.ZodString;
|
|
@@ -47,6 +52,10 @@ declare const compositeTypePropsSchema: z.ZodObject<{
|
|
|
47
52
|
grantable: z.ZodBoolean;
|
|
48
53
|
columns: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
|
|
49
54
|
}, z.z.core.$strip>>;
|
|
55
|
+
security_labels: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
56
|
+
provider: z.ZodString;
|
|
57
|
+
label: z.ZodString;
|
|
58
|
+
}, z.z.core.$strip>>>>;
|
|
50
59
|
}, z.z.core.$strip>;
|
|
51
60
|
type CompositeTypePrivilegeProps = PrivilegeProps;
|
|
52
61
|
export type CompositeTypeProps = z.infer<typeof compositeTypePropsSchema>;
|
|
@@ -68,6 +77,7 @@ export declare class CompositeType extends BasePgModel implements TableLikeObjec
|
|
|
68
77
|
readonly comment: CompositeTypeProps["comment"];
|
|
69
78
|
readonly columns: CompositeTypeProps["columns"];
|
|
70
79
|
readonly privileges: CompositeTypePrivilegeProps[];
|
|
80
|
+
readonly security_labels: SecurityLabelProps[];
|
|
71
81
|
constructor(props: CompositeTypeProps);
|
|
72
82
|
get stableId(): `type:${string}`;
|
|
73
83
|
get identityFields(): {
|
|
@@ -105,6 +115,10 @@ export declare class CompositeType extends BasePgModel implements TableLikeObjec
|
|
|
105
115
|
collation: string | null;
|
|
106
116
|
default: string | null;
|
|
107
117
|
comment: string | null;
|
|
118
|
+
security_labels?: {
|
|
119
|
+
provider: string;
|
|
120
|
+
label: string;
|
|
121
|
+
}[] | undefined;
|
|
108
122
|
}[];
|
|
109
123
|
privileges: {
|
|
110
124
|
grantee: string;
|
|
@@ -112,6 +126,10 @@ export declare class CompositeType extends BasePgModel implements TableLikeObjec
|
|
|
112
126
|
grantable: boolean;
|
|
113
127
|
columns?: string[] | null | undefined;
|
|
114
128
|
}[];
|
|
129
|
+
security_labels: {
|
|
130
|
+
provider: string;
|
|
131
|
+
label: string;
|
|
132
|
+
}[];
|
|
115
133
|
};
|
|
116
134
|
stableSnapshot(): {
|
|
117
135
|
identity: {
|
|
@@ -122,6 +140,10 @@ export declare class CompositeType extends BasePgModel implements TableLikeObjec
|
|
|
122
140
|
columns: {
|
|
123
141
|
[x: string]: unknown;
|
|
124
142
|
}[];
|
|
143
|
+
security_labels: {
|
|
144
|
+
provider: string;
|
|
145
|
+
label: string;
|
|
146
|
+
}[];
|
|
125
147
|
row_security: boolean;
|
|
126
148
|
force_row_security: boolean;
|
|
127
149
|
has_indexes: boolean;
|
|
@@ -2,6 +2,7 @@ import { sql } from "@ts-safeql/sql-tag";
|
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel, columnPropsSchema, } from "../../base.model.js";
|
|
4
4
|
import { privilegePropsSchema, } from "../../base.privilege-diff.js";
|
|
5
|
+
import { normalizeSecurityLabels, securityLabelPropsSchema, } from "../../security-label.types.js";
|
|
5
6
|
import { ReplicaIdentitySchema } from "../../table/table.model.js";
|
|
6
7
|
const compositeTypePropsSchema = z.object({
|
|
7
8
|
schema: z.string(),
|
|
@@ -21,6 +22,7 @@ const compositeTypePropsSchema = z.object({
|
|
|
21
22
|
comment: z.string().nullable(),
|
|
22
23
|
columns: z.array(columnPropsSchema),
|
|
23
24
|
privileges: z.array(privilegePropsSchema),
|
|
25
|
+
security_labels: z.array(securityLabelPropsSchema).default([]).optional(),
|
|
24
26
|
});
|
|
25
27
|
export class CompositeType extends BasePgModel {
|
|
26
28
|
schema;
|
|
@@ -40,6 +42,7 @@ export class CompositeType extends BasePgModel {
|
|
|
40
42
|
comment;
|
|
41
43
|
columns;
|
|
42
44
|
privileges;
|
|
45
|
+
security_labels;
|
|
43
46
|
constructor(props) {
|
|
44
47
|
super();
|
|
45
48
|
// Identity fields
|
|
@@ -61,6 +64,7 @@ export class CompositeType extends BasePgModel {
|
|
|
61
64
|
this.comment = props.comment;
|
|
62
65
|
this.columns = props.columns;
|
|
63
66
|
this.privileges = props.privileges;
|
|
67
|
+
this.security_labels = props.security_labels ?? [];
|
|
64
68
|
}
|
|
65
69
|
get stableId() {
|
|
66
70
|
return `type:${this.schema}.${this.name}`;
|
|
@@ -88,6 +92,7 @@ export class CompositeType extends BasePgModel {
|
|
|
88
92
|
comment: this.comment,
|
|
89
93
|
columns: this.columns,
|
|
90
94
|
privileges: this.privileges,
|
|
95
|
+
security_labels: this.security_labels,
|
|
91
96
|
};
|
|
92
97
|
}
|
|
93
98
|
stableSnapshot() {
|
|
@@ -106,6 +111,7 @@ export class CompositeType extends BasePgModel {
|
|
|
106
111
|
data: {
|
|
107
112
|
...this.dataFields,
|
|
108
113
|
columns: normalizeColumns(),
|
|
114
|
+
security_labels: normalizeSecurityLabels(this.security_labels),
|
|
109
115
|
},
|
|
110
116
|
};
|
|
111
117
|
}
|
|
@@ -137,7 +143,8 @@ export async function extractCompositeTypes(pool) {
|
|
|
137
143
|
obj_description(c.reltype, 'pg_type') AS comment,
|
|
138
144
|
c.relacl AS relacl, -- used by privileges LATERAL
|
|
139
145
|
c.relowner AS relowner,
|
|
140
|
-
c.oid AS oid
|
|
146
|
+
c.oid AS oid,
|
|
147
|
+
c.reltype AS reltype
|
|
141
148
|
FROM pg_catalog.pg_class c
|
|
142
149
|
LEFT JOIN extension_oids e ON c.reltype = e.objid
|
|
143
150
|
WHERE NOT c.relnamespace::regnamespace::text LIKE ANY (ARRAY['pg\\_%', 'information\\_schema'])
|
|
@@ -161,7 +168,20 @@ export async function extractCompositeTypes(pool) {
|
|
|
161
168
|
ct.owner,
|
|
162
169
|
ct.comment,
|
|
163
170
|
COALESCE(priv.privileges, '[]') AS privileges,
|
|
164
|
-
COALESCE(cols.columns, '[]') AS columns
|
|
171
|
+
COALESCE(cols.columns, '[]') AS columns,
|
|
172
|
+
COALESCE(
|
|
173
|
+
(
|
|
174
|
+
SELECT json_agg(
|
|
175
|
+
json_build_object('provider', sl.provider, 'label', sl.label)
|
|
176
|
+
ORDER BY sl.provider
|
|
177
|
+
)
|
|
178
|
+
FROM pg_catalog.pg_seclabel sl
|
|
179
|
+
WHERE sl.objoid = ct.reltype
|
|
180
|
+
AND sl.classoid = 'pg_type'::regclass
|
|
181
|
+
AND sl.objsubid = 0
|
|
182
|
+
),
|
|
183
|
+
'[]'::json
|
|
184
|
+
) AS security_labels
|
|
165
185
|
FROM composite_types ct
|
|
166
186
|
|
|
167
187
|
-- privileges as a per-row LATERAL subquery
|
|
@@ -2,7 +2,7 @@ import { BaseChange } from "../../../base.change.ts";
|
|
|
2
2
|
import type { Enum } from "../enum.model.ts";
|
|
3
3
|
declare abstract class BaseEnumChange extends BaseChange {
|
|
4
4
|
abstract readonly enum: Enum;
|
|
5
|
-
abstract readonly scope: "object" | "comment" | "privilege";
|
|
5
|
+
abstract readonly scope: "object" | "comment" | "privilege" | "security_label";
|
|
6
6
|
readonly objectType: "enum";
|
|
7
7
|
}
|
|
8
8
|
export declare abstract class CreateEnumChange extends BaseEnumChange {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SecurityLabelProps } from "../../../security-label.types.ts";
|
|
2
|
+
import type { Enum } from "../enum.model.ts";
|
|
3
|
+
import { CreateEnumChange, DropEnumChange } from "./enum.base.ts";
|
|
4
|
+
export type SecurityLabelEnum = CreateSecurityLabelOnEnum | DropSecurityLabelOnEnum;
|
|
5
|
+
export declare class CreateSecurityLabelOnEnum extends CreateEnumChange {
|
|
6
|
+
readonly enum: Enum;
|
|
7
|
+
readonly securityLabel: SecurityLabelProps;
|
|
8
|
+
readonly scope: "security_label";
|
|
9
|
+
constructor(props: {
|
|
10
|
+
enum: Enum;
|
|
11
|
+
securityLabel: SecurityLabelProps;
|
|
12
|
+
});
|
|
13
|
+
get creates(): `securityLabel:${string}::provider:${string}`[];
|
|
14
|
+
get requires(): `type:${string}`[];
|
|
15
|
+
serialize(): string;
|
|
16
|
+
}
|
|
17
|
+
export declare class DropSecurityLabelOnEnum extends DropEnumChange {
|
|
18
|
+
readonly enum: Enum;
|
|
19
|
+
readonly securityLabel: SecurityLabelProps;
|
|
20
|
+
readonly scope: "security_label";
|
|
21
|
+
constructor(props: {
|
|
22
|
+
enum: Enum;
|
|
23
|
+
securityLabel: SecurityLabelProps;
|
|
24
|
+
});
|
|
25
|
+
get drops(): `securityLabel:${string}::provider:${string}`[];
|
|
26
|
+
get requires(): (`securityLabel:${string}::provider:${string}` | `type:${string}`)[];
|
|
27
|
+
serialize(): string;
|
|
28
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { quoteLiteral } from "../../../base.change.js";
|
|
2
|
+
import { stableId } from "../../../utils.js";
|
|
3
|
+
import { CreateEnumChange, DropEnumChange } from "./enum.base.js";
|
|
4
|
+
export class CreateSecurityLabelOnEnum extends CreateEnumChange {
|
|
5
|
+
enum;
|
|
6
|
+
securityLabel;
|
|
7
|
+
scope = "security_label";
|
|
8
|
+
constructor(props) {
|
|
9
|
+
super();
|
|
10
|
+
this.enum = props.enum;
|
|
11
|
+
this.securityLabel = props.securityLabel;
|
|
12
|
+
}
|
|
13
|
+
get creates() {
|
|
14
|
+
return [
|
|
15
|
+
stableId.securityLabel(this.enum.stableId, this.securityLabel.provider),
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
get requires() {
|
|
19
|
+
return [this.enum.stableId];
|
|
20
|
+
}
|
|
21
|
+
serialize() {
|
|
22
|
+
return [
|
|
23
|
+
"SECURITY LABEL FOR",
|
|
24
|
+
this.securityLabel.provider,
|
|
25
|
+
"ON TYPE",
|
|
26
|
+
`${this.enum.schema}.${this.enum.name}`,
|
|
27
|
+
"IS",
|
|
28
|
+
quoteLiteral(this.securityLabel.label),
|
|
29
|
+
].join(" ");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class DropSecurityLabelOnEnum extends DropEnumChange {
|
|
33
|
+
enum;
|
|
34
|
+
securityLabel;
|
|
35
|
+
scope = "security_label";
|
|
36
|
+
constructor(props) {
|
|
37
|
+
super();
|
|
38
|
+
this.enum = props.enum;
|
|
39
|
+
this.securityLabel = props.securityLabel;
|
|
40
|
+
}
|
|
41
|
+
get drops() {
|
|
42
|
+
return [
|
|
43
|
+
stableId.securityLabel(this.enum.stableId, this.securityLabel.provider),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
get requires() {
|
|
47
|
+
return [
|
|
48
|
+
stableId.securityLabel(this.enum.stableId, this.securityLabel.provider),
|
|
49
|
+
this.enum.stableId,
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
serialize() {
|
|
53
|
+
return [
|
|
54
|
+
"SECURITY LABEL FOR",
|
|
55
|
+
this.securityLabel.provider,
|
|
56
|
+
"ON TYPE",
|
|
57
|
+
`${this.enum.schema}.${this.enum.name}`,
|
|
58
|
+
"IS NULL",
|
|
59
|
+
].join(" ");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -3,5 +3,6 @@ import type { CommentEnum } from "./enum.comment.ts";
|
|
|
3
3
|
import type { CreateEnum } from "./enum.create.ts";
|
|
4
4
|
import type { DropEnum } from "./enum.drop.ts";
|
|
5
5
|
import type { EnumPrivilege } from "./enum.privilege.ts";
|
|
6
|
+
import type { SecurityLabelEnum } from "./enum.security-label.ts";
|
|
6
7
|
/** Union of all enum-related change variants (`objectType: "enum"`). @category Change Types */
|
|
7
|
-
export type EnumChange = AlterEnum | CommentEnum | CreateEnum | DropEnum | EnumPrivilege;
|
|
8
|
+
export type EnumChange = AlterEnum | CommentEnum | CreateEnum | DropEnum | EnumPrivilege | SecurityLabelEnum;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { diffObjects } from "../../base.diff.js";
|
|
2
2
|
import { diffPrivileges, emitObjectPrivilegeChanges, filterPublicBuiltInDefaults, } from "../../base.privilege-diff.js";
|
|
3
|
+
import { diffSecurityLabels } from "../../security-label.types.js";
|
|
3
4
|
import { AlterEnumAddValue, AlterEnumChangeOwner, } from "./changes/enum.alter.js";
|
|
4
5
|
import { CreateCommentOnEnum, DropCommentOnEnum, } from "./changes/enum.comment.js";
|
|
5
6
|
import { CreateEnum } from "./changes/enum.create.js";
|
|
6
7
|
import { DropEnum } from "./changes/enum.drop.js";
|
|
7
8
|
import { GrantEnumPrivileges, RevokeEnumPrivileges, RevokeGrantOptionEnumPrivileges, } from "./changes/enum.privilege.js";
|
|
9
|
+
import { CreateSecurityLabelOnEnum, DropSecurityLabelOnEnum, } from "./changes/enum.security-label.js";
|
|
8
10
|
/**
|
|
9
11
|
* Diff two sets of enums from main and branch catalogs.
|
|
10
12
|
*
|
|
@@ -30,6 +32,12 @@ export function diffEnums(ctx, main, branch) {
|
|
|
30
32
|
if (createdEnum.comment !== null) {
|
|
31
33
|
changes.push(new CreateCommentOnEnum({ enum: createdEnum }));
|
|
32
34
|
}
|
|
35
|
+
for (const label of createdEnum.security_labels) {
|
|
36
|
+
changes.push(new CreateSecurityLabelOnEnum({
|
|
37
|
+
enum: createdEnum,
|
|
38
|
+
securityLabel: label,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
33
41
|
// PRIVILEGES: For created objects, compare against default privileges state
|
|
34
42
|
// The migration script will run ALTER DEFAULT PRIVILEGES before CREATE (via constraint spec),
|
|
35
43
|
// so objects are created with the default privileges state in effect.
|
|
@@ -106,6 +114,14 @@ export function diffEnums(ctx, main, branch) {
|
|
|
106
114
|
changes.push(new CreateCommentOnEnum({ enum: branchEnum }));
|
|
107
115
|
}
|
|
108
116
|
}
|
|
117
|
+
// SECURITY LABELS
|
|
118
|
+
changes.push(...diffSecurityLabels(mainEnum.security_labels, branchEnum.security_labels, (securityLabel) => new CreateSecurityLabelOnEnum({
|
|
119
|
+
enum: branchEnum,
|
|
120
|
+
securityLabel,
|
|
121
|
+
}), (securityLabel) => new DropSecurityLabelOnEnum({
|
|
122
|
+
enum: mainEnum,
|
|
123
|
+
securityLabel,
|
|
124
|
+
})));
|
|
109
125
|
// PRIVILEGES
|
|
110
126
|
// Filter out PUBLIC's built-in default USAGE privilege from main catalog
|
|
111
127
|
// (PostgreSQL grants it automatically, so we shouldn't compare it)
|
|
@@ -2,6 +2,7 @@ import type { Pool } from "pg";
|
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel } from "../../base.model.ts";
|
|
4
4
|
import { type PrivilegeProps } from "../../base.privilege-diff.ts";
|
|
5
|
+
import { type SecurityLabelProps } from "../../security-label.types.ts";
|
|
5
6
|
/**
|
|
6
7
|
* All properties exposed by CREATE TYPE AS ENUM statement are included in diff output.
|
|
7
8
|
* https://www.postgresql.org/docs/current/sql-createtype.html
|
|
@@ -31,6 +32,10 @@ declare const enumPropsSchema: z.ZodObject<{
|
|
|
31
32
|
grantable: z.ZodBoolean;
|
|
32
33
|
columns: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
|
|
33
34
|
}, z.z.core.$strip>>;
|
|
35
|
+
security_labels: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
36
|
+
provider: z.ZodString;
|
|
37
|
+
label: z.ZodString;
|
|
38
|
+
}, z.z.core.$strip>>>>;
|
|
34
39
|
}, z.z.core.$strip>;
|
|
35
40
|
type EnumPrivilegeProps = PrivilegeProps;
|
|
36
41
|
export type EnumProps = z.infer<typeof enumPropsSchema>;
|
|
@@ -41,6 +46,7 @@ export declare class Enum extends BasePgModel {
|
|
|
41
46
|
readonly labels: EnumProps["labels"];
|
|
42
47
|
readonly comment: EnumProps["comment"];
|
|
43
48
|
readonly privileges: EnumPrivilegeProps[];
|
|
49
|
+
readonly security_labels: SecurityLabelProps[];
|
|
44
50
|
constructor(props: EnumProps);
|
|
45
51
|
get stableId(): `type:${string}`;
|
|
46
52
|
get identityFields(): {
|
|
@@ -60,6 +66,10 @@ export declare class Enum extends BasePgModel {
|
|
|
60
66
|
privilege: string;
|
|
61
67
|
grantable: boolean;
|
|
62
68
|
}[];
|
|
69
|
+
security_labels: {
|
|
70
|
+
provider: string;
|
|
71
|
+
label: string;
|
|
72
|
+
}[];
|
|
63
73
|
};
|
|
64
74
|
}
|
|
65
75
|
export declare function extractEnums(pool: Pool): Promise<Enum[]>;
|
|
@@ -2,6 +2,7 @@ import { sql } from "@ts-safeql/sql-tag";
|
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel } from "../../base.model.js";
|
|
4
4
|
import { privilegePropsSchema, } from "../../base.privilege-diff.js";
|
|
5
|
+
import { securityLabelPropsSchema, } from "../../security-label.types.js";
|
|
5
6
|
const enumLabelSchema = z.object({
|
|
6
7
|
sort_order: z.number(),
|
|
7
8
|
label: z.string(),
|
|
@@ -27,6 +28,7 @@ const enumPropsSchema = z.object({
|
|
|
27
28
|
labels: z.array(enumLabelSchema),
|
|
28
29
|
comment: z.string().nullable(),
|
|
29
30
|
privileges: z.array(privilegePropsSchema),
|
|
31
|
+
security_labels: z.array(securityLabelPropsSchema).default([]).optional(),
|
|
30
32
|
});
|
|
31
33
|
export class Enum extends BasePgModel {
|
|
32
34
|
schema;
|
|
@@ -35,6 +37,7 @@ export class Enum extends BasePgModel {
|
|
|
35
37
|
labels;
|
|
36
38
|
comment;
|
|
37
39
|
privileges;
|
|
40
|
+
security_labels;
|
|
38
41
|
constructor(props) {
|
|
39
42
|
super();
|
|
40
43
|
// Identity fields
|
|
@@ -45,6 +48,7 @@ export class Enum extends BasePgModel {
|
|
|
45
48
|
this.labels = props.labels;
|
|
46
49
|
this.comment = props.comment;
|
|
47
50
|
this.privileges = props.privileges;
|
|
51
|
+
this.security_labels = props.security_labels ?? [];
|
|
48
52
|
}
|
|
49
53
|
get stableId() {
|
|
50
54
|
return `type:${this.schema}.${this.name}`;
|
|
@@ -88,6 +92,7 @@ export class Enum extends BasePgModel {
|
|
|
88
92
|
labels,
|
|
89
93
|
comment: this.comment,
|
|
90
94
|
privileges,
|
|
95
|
+
security_labels: this.security_labels,
|
|
91
96
|
};
|
|
92
97
|
}
|
|
93
98
|
}
|
|
@@ -121,7 +126,20 @@ select
|
|
|
121
126
|
)
|
|
122
127
|
from lateral aclexplode(COALESCE(t.typacl, acldefault('T', t.typowner))) as x(grantor, grantee, privilege_type, is_grantable)
|
|
123
128
|
), '[]'
|
|
124
|
-
) as privileges
|
|
129
|
+
) as privileges,
|
|
130
|
+
coalesce(
|
|
131
|
+
(
|
|
132
|
+
select json_agg(
|
|
133
|
+
json_build_object('provider', sl.provider, 'label', sl.label)
|
|
134
|
+
order by sl.provider
|
|
135
|
+
)
|
|
136
|
+
from pg_catalog.pg_seclabel sl
|
|
137
|
+
where sl.objoid = t.oid
|
|
138
|
+
and sl.classoid = 'pg_type'::regclass
|
|
139
|
+
and sl.objsubid = 0
|
|
140
|
+
),
|
|
141
|
+
'[]'::json
|
|
142
|
+
) as security_labels
|
|
125
143
|
from
|
|
126
144
|
pg_catalog.pg_enum e
|
|
127
145
|
inner join pg_catalog.pg_type t on t.oid = e.enumtypid
|
|
@@ -142,6 +160,7 @@ order by
|
|
|
142
160
|
labels: [],
|
|
143
161
|
comment: e.comment,
|
|
144
162
|
privileges: e.privileges,
|
|
163
|
+
security_labels: e.security_labels,
|
|
145
164
|
};
|
|
146
165
|
}
|
|
147
166
|
grouped[key].labels.push({ sort_order: e.sort_order, label: e.label });
|
|
@@ -2,7 +2,7 @@ import { BaseChange } from "../../../base.change.ts";
|
|
|
2
2
|
import type { Range } from "../range.model.ts";
|
|
3
3
|
declare abstract class BaseRangeChange extends BaseChange {
|
|
4
4
|
abstract readonly range: Range;
|
|
5
|
-
abstract readonly scope: "object" | "comment" | "privilege";
|
|
5
|
+
abstract readonly scope: "object" | "comment" | "privilege" | "security_label";
|
|
6
6
|
readonly objectType: "range";
|
|
7
7
|
}
|
|
8
8
|
export declare abstract class CreateRangeChange extends BaseRangeChange {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SecurityLabelProps } from "../../../security-label.types.ts";
|
|
2
|
+
import type { Range } from "../range.model.ts";
|
|
3
|
+
import { CreateRangeChange, DropRangeChange } from "./range.base.ts";
|
|
4
|
+
export type SecurityLabelRange = CreateSecurityLabelOnRange | DropSecurityLabelOnRange;
|
|
5
|
+
export declare class CreateSecurityLabelOnRange extends CreateRangeChange {
|
|
6
|
+
readonly range: Range;
|
|
7
|
+
readonly securityLabel: SecurityLabelProps;
|
|
8
|
+
readonly scope: "security_label";
|
|
9
|
+
constructor(props: {
|
|
10
|
+
range: Range;
|
|
11
|
+
securityLabel: SecurityLabelProps;
|
|
12
|
+
});
|
|
13
|
+
get creates(): `securityLabel:${string}::provider:${string}`[];
|
|
14
|
+
get requires(): `type:${string}`[];
|
|
15
|
+
serialize(): string;
|
|
16
|
+
}
|
|
17
|
+
export declare class DropSecurityLabelOnRange extends DropRangeChange {
|
|
18
|
+
readonly range: Range;
|
|
19
|
+
readonly securityLabel: SecurityLabelProps;
|
|
20
|
+
readonly scope: "security_label";
|
|
21
|
+
constructor(props: {
|
|
22
|
+
range: Range;
|
|
23
|
+
securityLabel: SecurityLabelProps;
|
|
24
|
+
});
|
|
25
|
+
get drops(): `securityLabel:${string}::provider:${string}`[];
|
|
26
|
+
get requires(): (`securityLabel:${string}::provider:${string}` | `type:${string}`)[];
|
|
27
|
+
serialize(): string;
|
|
28
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { quoteLiteral } from "../../../base.change.js";
|
|
2
|
+
import { stableId } from "../../../utils.js";
|
|
3
|
+
import { CreateRangeChange, DropRangeChange } from "./range.base.js";
|
|
4
|
+
export class CreateSecurityLabelOnRange extends CreateRangeChange {
|
|
5
|
+
range;
|
|
6
|
+
securityLabel;
|
|
7
|
+
scope = "security_label";
|
|
8
|
+
constructor(props) {
|
|
9
|
+
super();
|
|
10
|
+
this.range = props.range;
|
|
11
|
+
this.securityLabel = props.securityLabel;
|
|
12
|
+
}
|
|
13
|
+
get creates() {
|
|
14
|
+
return [
|
|
15
|
+
stableId.securityLabel(this.range.stableId, this.securityLabel.provider),
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
get requires() {
|
|
19
|
+
return [this.range.stableId];
|
|
20
|
+
}
|
|
21
|
+
serialize() {
|
|
22
|
+
return [
|
|
23
|
+
"SECURITY LABEL FOR",
|
|
24
|
+
this.securityLabel.provider,
|
|
25
|
+
"ON TYPE",
|
|
26
|
+
`${this.range.schema}.${this.range.name}`,
|
|
27
|
+
"IS",
|
|
28
|
+
quoteLiteral(this.securityLabel.label),
|
|
29
|
+
].join(" ");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class DropSecurityLabelOnRange extends DropRangeChange {
|
|
33
|
+
range;
|
|
34
|
+
securityLabel;
|
|
35
|
+
scope = "security_label";
|
|
36
|
+
constructor(props) {
|
|
37
|
+
super();
|
|
38
|
+
this.range = props.range;
|
|
39
|
+
this.securityLabel = props.securityLabel;
|
|
40
|
+
}
|
|
41
|
+
get drops() {
|
|
42
|
+
return [
|
|
43
|
+
stableId.securityLabel(this.range.stableId, this.securityLabel.provider),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
get requires() {
|
|
47
|
+
return [
|
|
48
|
+
stableId.securityLabel(this.range.stableId, this.securityLabel.provider),
|
|
49
|
+
this.range.stableId,
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
serialize() {
|
|
53
|
+
return [
|
|
54
|
+
"SECURITY LABEL FOR",
|
|
55
|
+
this.securityLabel.provider,
|
|
56
|
+
"ON TYPE",
|
|
57
|
+
`${this.range.schema}.${this.range.name}`,
|
|
58
|
+
"IS NULL",
|
|
59
|
+
].join(" ");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -3,5 +3,6 @@ import type { CommentRange } from "./range.comment.ts";
|
|
|
3
3
|
import type { CreateRange } from "./range.create.ts";
|
|
4
4
|
import type { DropRange } from "./range.drop.ts";
|
|
5
5
|
import type { RangePrivilege } from "./range.privilege.ts";
|
|
6
|
+
import type { SecurityLabelRange } from "./range.security-label.ts";
|
|
6
7
|
/** Union of all range-related change variants (`objectType: "range"`). @category Change Types */
|
|
7
|
-
export type RangeChange = AlterRange | CommentRange | CreateRange | DropRange | RangePrivilege;
|
|
8
|
+
export type RangeChange = AlterRange | CommentRange | CreateRange | DropRange | RangePrivilege | SecurityLabelRange;
|