@nest-boot/row-level-security 7.0.0
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/LICENSE +21 -0
- package/dist/decorators/policy.decorator.d.ts +18 -0
- package/dist/decorators/policy.decorator.js +257 -0
- package/dist/decorators/policy.decorator.js.map +1 -0
- package/dist/decorators/policy.decorator.spec.d.ts +1 -0
- package/dist/decorators/policy.decorator.spec.js +498 -0
- package/dist/decorators/policy.decorator.spec.js.map +1 -0
- package/dist/enums/policy-command.enum.d.ts +13 -0
- package/dist/enums/policy-command.enum.js +18 -0
- package/dist/enums/policy-command.enum.js.map +1 -0
- package/dist/enums/policy-mode.enum.d.ts +7 -0
- package/dist/enums/policy-mode.enum.js +12 -0
- package/dist/enums/policy-mode.enum.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/index.spec.d.ts +1 -0
- package/dist/index.spec.js +70 -0
- package/dist/index.spec.js.map +1 -0
- package/dist/interfaces/index.d.ts +5 -0
- package/dist/interfaces/index.js +21 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/policy-metadata.interface.d.ts +62 -0
- package/dist/interfaces/policy-metadata.interface.js +3 -0
- package/dist/interfaces/policy-metadata.interface.js.map +1 -0
- package/dist/interfaces/policy-options.interface.d.ts +21 -0
- package/dist/interfaces/policy-options.interface.js +3 -0
- package/dist/interfaces/policy-options.interface.js.map +1 -0
- package/dist/interfaces/policy-sql-options.interface.d.ts +21 -0
- package/dist/interfaces/policy-sql-options.interface.js +3 -0
- package/dist/interfaces/policy-sql-options.interface.js.map +1 -0
- package/dist/interfaces/row-level-security-migration-generator.interface.d.ts +65 -0
- package/dist/interfaces/row-level-security-migration-generator.interface.js +3 -0
- package/dist/interfaces/row-level-security-migration-generator.interface.js.map +1 -0
- package/dist/interfaces/row-level-security-options.interface.d.ts +18 -0
- package/dist/interfaces/row-level-security-options.interface.js +3 -0
- package/dist/interfaces/row-level-security-options.interface.js.map +1 -0
- package/dist/row-level-security-context.d.ts +14 -0
- package/dist/row-level-security-context.js +38 -0
- package/dist/row-level-security-context.js.map +1 -0
- package/dist/row-level-security-context.spec.d.ts +1 -0
- package/dist/row-level-security-context.spec.js +29 -0
- package/dist/row-level-security-context.spec.js.map +1 -0
- package/dist/row-level-security-entity-manager.d.ts +22 -0
- package/dist/row-level-security-entity-manager.js +135 -0
- package/dist/row-level-security-entity-manager.js.map +1 -0
- package/dist/row-level-security-entity-manager.spec.d.ts +1 -0
- package/dist/row-level-security-entity-manager.spec.js +200 -0
- package/dist/row-level-security-entity-manager.spec.js.map +1 -0
- package/dist/row-level-security-migration-generator.d.ts +14 -0
- package/dist/row-level-security-migration-generator.js +294 -0
- package/dist/row-level-security-migration-generator.js.map +1 -0
- package/dist/row-level-security-migration-generator.spec.d.ts +1 -0
- package/dist/row-level-security-migration-generator.spec.js +468 -0
- package/dist/row-level-security-migration-generator.spec.js.map +1 -0
- package/dist/row-level-security-migration.d.ts +11 -0
- package/dist/row-level-security-migration.js +28 -0
- package/dist/row-level-security-migration.js.map +1 -0
- package/dist/row-level-security-migration.spec.d.ts +1 -0
- package/dist/row-level-security-migration.spec.js +40 -0
- package/dist/row-level-security-migration.spec.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/utils/assert-identifier.d.ts +2 -0
- package/dist/utils/assert-identifier.js +11 -0
- package/dist/utils/assert-identifier.js.map +1 -0
- package/dist/utils/assert-snake-case.d.ts +2 -0
- package/dist/utils/assert-snake-case.js +10 -0
- package/dist/utils/assert-snake-case.js.map +1 -0
- package/dist/utils/create-policy-bootstrap-sql-statements.d.ts +2 -0
- package/dist/utils/create-policy-bootstrap-sql-statements.js +17 -0
- package/dist/utils/create-policy-bootstrap-sql-statements.js.map +1 -0
- package/dist/utils/create-policy-down-sql.d.ts +3 -0
- package/dist/utils/create-policy-down-sql.js +30 -0
- package/dist/utils/create-policy-down-sql.js.map +1 -0
- package/dist/utils/create-policy-up-sql-statements.d.ts +3 -0
- package/dist/utils/create-policy-up-sql-statements.js +114 -0
- package/dist/utils/create-policy-up-sql-statements.js.map +1 -0
- package/dist/utils/default-row-level-security-options.d.ts +3 -0
- package/dist/utils/default-row-level-security-options.js +9 -0
- package/dist/utils/default-row-level-security-options.js.map +1 -0
- package/dist/utils/escape-sql-literal.d.ts +2 -0
- package/dist/utils/escape-sql-literal.js +8 -0
- package/dist/utils/escape-sql-literal.js.map +1 -0
- package/dist/utils/get-row-level-security-options.d.ts +8 -0
- package/dist/utils/get-row-level-security-options.js +9 -0
- package/dist/utils/get-row-level-security-options.js.map +1 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.js +29 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/policy-migration-sql.spec.d.ts +1 -0
- package/dist/utils/policy-migration-sql.spec.js +168 -0
- package/dist/utils/policy-migration-sql.spec.js.map +1 -0
- package/dist/utils/policy-sql-options.d.ts +12 -0
- package/dist/utils/policy-sql-options.js +3 -0
- package/dist/utils/policy-sql-options.js.map +1 -0
- package/dist/utils/quote-identifier.d.ts +2 -0
- package/dist/utils/quote-identifier.js +10 -0
- package/dist/utils/quote-identifier.js.map +1 -0
- package/dist/utils/quote-qualified-identifier.d.ts +2 -0
- package/dist/utils/quote-qualified-identifier.js +9 -0
- package/dist/utils/quote-qualified-identifier.js.map +1 -0
- package/dist/utils/row-level-security-context-builder.d.ts +12 -0
- package/dist/utils/row-level-security-context-builder.js +40 -0
- package/dist/utils/row-level-security-context-builder.js.map +1 -0
- package/dist/utils/row-level-security-context-builder.spec.d.ts +1 -0
- package/dist/utils/row-level-security-context-builder.spec.js +40 -0
- package/dist/utils/row-level-security-context-builder.spec.js.map +1 -0
- package/dist/utils/row-level-security-context-builder.types.d.ts +10 -0
- package/dist/utils/row-level-security-context-builder.types.js +3 -0
- package/dist/utils/row-level-security-context-builder.types.js.map +1 -0
- package/dist/utils/row-level-security-options-state.d.ts +4 -0
- package/dist/utils/row-level-security-options-state.js +8 -0
- package/dist/utils/row-level-security-options-state.js.map +1 -0
- package/dist/utils/set-row-level-security-options.d.ts +3 -0
- package/dist/utils/set-row-level-security-options.js +13 -0
- package/dist/utils/set-row-level-security-options.js.map +1 -0
- package/package.json +77 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 nest-boot
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { PolicyEntityMetadata, PolicyMetadata, PolicyMetadataEntry } from "../interfaces/policy-metadata.interface";
|
|
2
|
+
import type { PolicyOptions } from "../interfaces/policy-options.interface";
|
|
3
|
+
export type { PolicyEntityMetadata, PolicyEntityPropertyMetadata, PolicyEntityTargetMetadata, PolicyMetadata, PolicyMetadataEntry, PolicyMetadataFactory, } from "../interfaces/policy-metadata.interface";
|
|
4
|
+
export type { PolicyOptions } from "../interfaces/policy-options.interface";
|
|
5
|
+
/**
|
|
6
|
+
* Attaches PostgreSQL row-level security policy metadata to an entity class.
|
|
7
|
+
*
|
|
8
|
+
* When `property` and `context` are provided, the decorator derives default
|
|
9
|
+
* `USING` and `WITH CHECK` expressions that compare the mapped database column
|
|
10
|
+
* against `app.get_context(context, null::<column type>)`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function Policy(options: PolicyOptions): ClassDecorator;
|
|
13
|
+
/** Returns static policy metadata entries already attached to a class. */
|
|
14
|
+
export declare function getPolicyMetadata(target: object): PolicyMetadata[];
|
|
15
|
+
/** Resolves all policy metadata entries for a class using concrete entity metadata. */
|
|
16
|
+
export declare function getPolicyDefinitions(target: object, entityMetadata: PolicyEntityMetadata): PolicyMetadata[];
|
|
17
|
+
/** Adds a raw policy metadata entry to a class. */
|
|
18
|
+
export declare function addPolicyMetadata(target: object, metadata: PolicyMetadataEntry): void;
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Policy = Policy;
|
|
4
|
+
exports.getPolicyMetadata = getPolicyMetadata;
|
|
5
|
+
exports.getPolicyDefinitions = getPolicyDefinitions;
|
|
6
|
+
exports.addPolicyMetadata = addPolicyMetadata;
|
|
7
|
+
const policy_command_enum_1 = require("../enums/policy-command.enum");
|
|
8
|
+
const policy_mode_enum_1 = require("../enums/policy-mode.enum");
|
|
9
|
+
const escape_sql_literal_1 = require("../utils/escape-sql-literal");
|
|
10
|
+
const quote_identifier_1 = require("../utils/quote-identifier");
|
|
11
|
+
const policyMetadata = new WeakMap();
|
|
12
|
+
/**
|
|
13
|
+
* Attaches PostgreSQL row-level security policy metadata to an entity class.
|
|
14
|
+
*
|
|
15
|
+
* When `property` and `context` are provided, the decorator derives default
|
|
16
|
+
* `USING` and `WITH CHECK` expressions that compare the mapped database column
|
|
17
|
+
* against `app.get_context(context, null::<column type>)`.
|
|
18
|
+
*/
|
|
19
|
+
function Policy(options) {
|
|
20
|
+
const name = normalizeOption(options.name, "Policy name is required");
|
|
21
|
+
const command = options.command ?? policy_command_enum_1.PolicyCommand.ALL;
|
|
22
|
+
const property = normalizeOption(options.property, "Policy property is required");
|
|
23
|
+
const context = normalizeOption(options.context, "Policy context is required");
|
|
24
|
+
const using = normalizeExpression(options.using);
|
|
25
|
+
const withCheck = normalizeExpression(options.withCheck);
|
|
26
|
+
const generatedExpressionContext = property && context ? { property, context } : undefined;
|
|
27
|
+
const hasGeneratedExpression = Boolean(generatedExpressionContext);
|
|
28
|
+
assertPolicyContextOptions(property, context);
|
|
29
|
+
assertPolicyPredicates(command, using, withCheck, hasGeneratedExpression);
|
|
30
|
+
return (target) => {
|
|
31
|
+
const roles = options.roles ?? [];
|
|
32
|
+
const metadata = {
|
|
33
|
+
mode: options.mode ?? policy_mode_enum_1.PolicyMode.PERMISSIVE,
|
|
34
|
+
command,
|
|
35
|
+
roles,
|
|
36
|
+
};
|
|
37
|
+
const createPolicyDefinition = (entityMetadata) => ({
|
|
38
|
+
name: name ??
|
|
39
|
+
createDefaultPolicyName(entityMetadata, command, property, roles),
|
|
40
|
+
...metadata,
|
|
41
|
+
...(generatedExpressionContext
|
|
42
|
+
? getGeneratedPolicyPredicates(command, createPolicyContextExpression(entityMetadata, generatedExpressionContext.property, generatedExpressionContext.context))
|
|
43
|
+
: {}),
|
|
44
|
+
...(using ? { using } : {}),
|
|
45
|
+
...(withCheck ? { withCheck } : {}),
|
|
46
|
+
});
|
|
47
|
+
addPolicyMetadata(target, !name || hasGeneratedExpression
|
|
48
|
+
? createPolicyDefinition
|
|
49
|
+
: {
|
|
50
|
+
name,
|
|
51
|
+
...metadata,
|
|
52
|
+
...(using ? { using } : {}),
|
|
53
|
+
...(withCheck ? { withCheck } : {}),
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** Returns static policy metadata entries already attached to a class. */
|
|
58
|
+
function getPolicyMetadata(target) {
|
|
59
|
+
return getPolicyMetadataEntries(target).filter(isPolicyMetadata);
|
|
60
|
+
}
|
|
61
|
+
/** Resolves all policy metadata entries for a class using concrete entity metadata. */
|
|
62
|
+
function getPolicyDefinitions(target, entityMetadata) {
|
|
63
|
+
return getPolicyMetadataEntries(target).map((metadata) => typeof metadata === "function" ? metadata(entityMetadata) : metadata);
|
|
64
|
+
}
|
|
65
|
+
/** Adds a raw policy metadata entry to a class. */
|
|
66
|
+
function addPolicyMetadata(target, metadata) {
|
|
67
|
+
policyMetadata.set(target, [...getPolicyMetadataEntries(target), metadata]);
|
|
68
|
+
}
|
|
69
|
+
function normalizeExpression(expression) {
|
|
70
|
+
const normalized = expression?.trim();
|
|
71
|
+
if (!normalized) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
return normalized;
|
|
75
|
+
}
|
|
76
|
+
function normalizeOption(value, emptyMessage) {
|
|
77
|
+
if (value === undefined) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
const normalized = value.trim();
|
|
81
|
+
if (!normalized) {
|
|
82
|
+
throw new Error(emptyMessage);
|
|
83
|
+
}
|
|
84
|
+
return normalized;
|
|
85
|
+
}
|
|
86
|
+
function assertPolicyContextOptions(property, context) {
|
|
87
|
+
if (Boolean(property) !== Boolean(context)) {
|
|
88
|
+
throw new Error("Policy property and context must be provided together");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function assertPolicyPredicates(command, using, withCheck, hasGeneratedExpression) {
|
|
92
|
+
const hasUsing = Boolean(using) ||
|
|
93
|
+
(hasGeneratedExpression && command !== policy_command_enum_1.PolicyCommand.INSERT);
|
|
94
|
+
const hasWithCheck = Boolean(withCheck) ||
|
|
95
|
+
(hasGeneratedExpression &&
|
|
96
|
+
command !== policy_command_enum_1.PolicyCommand.SELECT &&
|
|
97
|
+
command !== policy_command_enum_1.PolicyCommand.DELETE);
|
|
98
|
+
if (command === policy_command_enum_1.PolicyCommand.SELECT || command === policy_command_enum_1.PolicyCommand.DELETE) {
|
|
99
|
+
if (!hasUsing) {
|
|
100
|
+
throw new Error("Policy using expression is required");
|
|
101
|
+
}
|
|
102
|
+
if (withCheck) {
|
|
103
|
+
throw new Error(`Policy withCheck is not allowed for ${command}`);
|
|
104
|
+
}
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (command === policy_command_enum_1.PolicyCommand.INSERT) {
|
|
108
|
+
if (using) {
|
|
109
|
+
throw new Error("Policy using is not allowed for insert");
|
|
110
|
+
}
|
|
111
|
+
if (!hasWithCheck) {
|
|
112
|
+
throw new Error("Policy withCheck expression is required");
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!hasUsing && !hasWithCheck) {
|
|
117
|
+
throw new Error("Policy using or withCheck expression is required");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function getGeneratedPolicyPredicates(command, expression) {
|
|
121
|
+
if (command === policy_command_enum_1.PolicyCommand.SELECT || command === policy_command_enum_1.PolicyCommand.DELETE) {
|
|
122
|
+
return { using: expression };
|
|
123
|
+
}
|
|
124
|
+
if (command === policy_command_enum_1.PolicyCommand.INSERT) {
|
|
125
|
+
return { withCheck: expression };
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
using: expression,
|
|
129
|
+
withCheck: expression,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function createDefaultPolicyName(entityMetadata, command, propertyName, roles) {
|
|
133
|
+
return [
|
|
134
|
+
entityMetadata.tableName,
|
|
135
|
+
propertyName,
|
|
136
|
+
command,
|
|
137
|
+
...[...roles].sort(),
|
|
138
|
+
"policy",
|
|
139
|
+
]
|
|
140
|
+
.filter(Boolean)
|
|
141
|
+
.map((part) => toSnakeCaseIdentifier(String(part)))
|
|
142
|
+
.join("_");
|
|
143
|
+
}
|
|
144
|
+
function toSnakeCaseIdentifier(value) {
|
|
145
|
+
return value
|
|
146
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1_$2")
|
|
147
|
+
.replace(/[^A-Za-z0-9_]+/g, "_")
|
|
148
|
+
.replace(/_+/g, "_")
|
|
149
|
+
.replace(/^_+|_+$/g, "")
|
|
150
|
+
.toLowerCase();
|
|
151
|
+
}
|
|
152
|
+
function createPolicyContextExpression(entityMetadata, propertyName, contextName) {
|
|
153
|
+
const property = getPropertyMetadata(entityMetadata, propertyName);
|
|
154
|
+
const columnName = getPropertyColumnName(entityMetadata, propertyName, property);
|
|
155
|
+
const contextType = getPropertyContextType(entityMetadata, propertyName, property);
|
|
156
|
+
return `((select app.get_context('${(0, escape_sql_literal_1.escapeSqlLiteral)(contextName)}', null::${contextType})) = ${(0, quote_identifier_1.quoteIdentifier)(columnName)})`;
|
|
157
|
+
}
|
|
158
|
+
function getPropertyMetadata(entityMetadata, propertyName) {
|
|
159
|
+
const property = entityMetadata.properties?.[propertyName];
|
|
160
|
+
if (!property) {
|
|
161
|
+
throw new Error(`Policy property "${propertyName}" was not found on entity ${entityMetadata.entityName}`);
|
|
162
|
+
}
|
|
163
|
+
return property;
|
|
164
|
+
}
|
|
165
|
+
function getPropertyColumnName(entityMetadata, propertyName, property) {
|
|
166
|
+
const fieldNames = property.fieldNames ?? [];
|
|
167
|
+
const columnName = property.fieldName ?? fieldNames[0];
|
|
168
|
+
if (!columnName || fieldNames.length > 1) {
|
|
169
|
+
throw new Error(`Policy property "${propertyName}" on entity ${entityMetadata.entityName} must resolve to exactly one database column`);
|
|
170
|
+
}
|
|
171
|
+
return columnName;
|
|
172
|
+
}
|
|
173
|
+
function getPropertyContextType(entityMetadata, propertyName, property) {
|
|
174
|
+
const targetPrimaryKeyProperty = getTargetPrimaryKeyProperty(entityMetadata, propertyName, property);
|
|
175
|
+
if (targetPrimaryKeyProperty) {
|
|
176
|
+
return getSinglePropertyContextType(entityMetadata, propertyName, targetPrimaryKeyProperty);
|
|
177
|
+
}
|
|
178
|
+
return getSinglePropertyContextType(entityMetadata, propertyName, property);
|
|
179
|
+
}
|
|
180
|
+
function getTargetPrimaryKeyProperty(entityMetadata, propertyName, property) {
|
|
181
|
+
const targetMeta = property.targetMeta;
|
|
182
|
+
if (!targetMeta) {
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
const primaryKeys = targetMeta.primaryKeys ??
|
|
186
|
+
Object.entries(targetMeta.properties ?? {})
|
|
187
|
+
.filter(([, targetProperty]) => targetProperty.primary)
|
|
188
|
+
.map(([targetPropertyName]) => targetPropertyName);
|
|
189
|
+
if (primaryKeys.length !== 1) {
|
|
190
|
+
throw new Error(`Policy property "${propertyName}" on entity ${entityMetadata.entityName} must target an entity with exactly one primary key`);
|
|
191
|
+
}
|
|
192
|
+
const primaryKeyProperty = targetMeta.properties?.[primaryKeys[0]];
|
|
193
|
+
if (!primaryKeyProperty) {
|
|
194
|
+
throw new Error(`Policy property "${propertyName}" on entity ${entityMetadata.entityName} must expose target primary key metadata`);
|
|
195
|
+
}
|
|
196
|
+
return primaryKeyProperty;
|
|
197
|
+
}
|
|
198
|
+
function getSinglePropertyContextType(entityMetadata, propertyName, property) {
|
|
199
|
+
const columnTypes = property.columnTypes ?? [];
|
|
200
|
+
const columnType = columnTypes[0]?.trim();
|
|
201
|
+
if (columnTypes.length > 1) {
|
|
202
|
+
throw new Error(`Policy property "${propertyName}" on entity ${entityMetadata.entityName} must resolve to exactly one database column type`);
|
|
203
|
+
}
|
|
204
|
+
if (columnType) {
|
|
205
|
+
return normalizePostgresType(entityMetadata, propertyName, columnType);
|
|
206
|
+
}
|
|
207
|
+
const inferredType = mapPropertyTypeToPostgresType(property.type) ??
|
|
208
|
+
mapPropertyTypeToPostgresType(property.runtimeType);
|
|
209
|
+
if (inferredType) {
|
|
210
|
+
return inferredType;
|
|
211
|
+
}
|
|
212
|
+
throw new Error(`Policy property "${propertyName}" on entity ${entityMetadata.entityName} must expose a database column type`);
|
|
213
|
+
}
|
|
214
|
+
function normalizePostgresType(entityMetadata, propertyName, postgresType) {
|
|
215
|
+
const normalized = postgresType.trim().replace(/\s+/g, " ");
|
|
216
|
+
if (!/^[A-Za-z0-9_."()[\],\s[\]]+$/.test(normalized)) {
|
|
217
|
+
throw new Error(`Policy property "${propertyName}" on entity ${entityMetadata.entityName} has an unsupported database column type: ${postgresType}`);
|
|
218
|
+
}
|
|
219
|
+
return normalized;
|
|
220
|
+
}
|
|
221
|
+
function mapPropertyTypeToPostgresType(propertyType) {
|
|
222
|
+
const normalized = propertyType?.trim().toLowerCase();
|
|
223
|
+
switch (normalized) {
|
|
224
|
+
case "bigint":
|
|
225
|
+
case "biginttype":
|
|
226
|
+
return "bigint";
|
|
227
|
+
case "boolean":
|
|
228
|
+
case "booleantype":
|
|
229
|
+
return "boolean";
|
|
230
|
+
case "date":
|
|
231
|
+
case "datetime":
|
|
232
|
+
case "datetimetype":
|
|
233
|
+
return "timestamp with time zone";
|
|
234
|
+
case "int":
|
|
235
|
+
case "integer":
|
|
236
|
+
case "number":
|
|
237
|
+
case "numbertype":
|
|
238
|
+
return "integer";
|
|
239
|
+
case "string":
|
|
240
|
+
case "stringtype":
|
|
241
|
+
case "text":
|
|
242
|
+
case "texttype":
|
|
243
|
+
return "text";
|
|
244
|
+
case "uuid":
|
|
245
|
+
case "uuidtype":
|
|
246
|
+
return "uuid";
|
|
247
|
+
default:
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function getPolicyMetadataEntries(target) {
|
|
252
|
+
return policyMetadata.get(target) ?? [];
|
|
253
|
+
}
|
|
254
|
+
function isPolicyMetadata(metadata) {
|
|
255
|
+
return typeof metadata !== "function";
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=policy.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.decorator.js","sourceRoot":"","sources":["../../src/decorators/policy.decorator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|