@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.
Files changed (118) hide show
  1. package/LICENSE +21 -0
  2. package/dist/decorators/policy.decorator.d.ts +18 -0
  3. package/dist/decorators/policy.decorator.js +257 -0
  4. package/dist/decorators/policy.decorator.js.map +1 -0
  5. package/dist/decorators/policy.decorator.spec.d.ts +1 -0
  6. package/dist/decorators/policy.decorator.spec.js +498 -0
  7. package/dist/decorators/policy.decorator.spec.js.map +1 -0
  8. package/dist/enums/policy-command.enum.d.ts +13 -0
  9. package/dist/enums/policy-command.enum.js +18 -0
  10. package/dist/enums/policy-command.enum.js.map +1 -0
  11. package/dist/enums/policy-mode.enum.d.ts +7 -0
  12. package/dist/enums/policy-mode.enum.js +12 -0
  13. package/dist/enums/policy-mode.enum.js.map +1 -0
  14. package/dist/index.d.ts +9 -0
  15. package/dist/index.js +26 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/index.spec.d.ts +1 -0
  18. package/dist/index.spec.js +70 -0
  19. package/dist/index.spec.js.map +1 -0
  20. package/dist/interfaces/index.d.ts +5 -0
  21. package/dist/interfaces/index.js +21 -0
  22. package/dist/interfaces/index.js.map +1 -0
  23. package/dist/interfaces/policy-metadata.interface.d.ts +62 -0
  24. package/dist/interfaces/policy-metadata.interface.js +3 -0
  25. package/dist/interfaces/policy-metadata.interface.js.map +1 -0
  26. package/dist/interfaces/policy-options.interface.d.ts +21 -0
  27. package/dist/interfaces/policy-options.interface.js +3 -0
  28. package/dist/interfaces/policy-options.interface.js.map +1 -0
  29. package/dist/interfaces/policy-sql-options.interface.d.ts +21 -0
  30. package/dist/interfaces/policy-sql-options.interface.js +3 -0
  31. package/dist/interfaces/policy-sql-options.interface.js.map +1 -0
  32. package/dist/interfaces/row-level-security-migration-generator.interface.d.ts +65 -0
  33. package/dist/interfaces/row-level-security-migration-generator.interface.js +3 -0
  34. package/dist/interfaces/row-level-security-migration-generator.interface.js.map +1 -0
  35. package/dist/interfaces/row-level-security-options.interface.d.ts +18 -0
  36. package/dist/interfaces/row-level-security-options.interface.js +3 -0
  37. package/dist/interfaces/row-level-security-options.interface.js.map +1 -0
  38. package/dist/row-level-security-context.d.ts +14 -0
  39. package/dist/row-level-security-context.js +38 -0
  40. package/dist/row-level-security-context.js.map +1 -0
  41. package/dist/row-level-security-context.spec.d.ts +1 -0
  42. package/dist/row-level-security-context.spec.js +29 -0
  43. package/dist/row-level-security-context.spec.js.map +1 -0
  44. package/dist/row-level-security-entity-manager.d.ts +22 -0
  45. package/dist/row-level-security-entity-manager.js +135 -0
  46. package/dist/row-level-security-entity-manager.js.map +1 -0
  47. package/dist/row-level-security-entity-manager.spec.d.ts +1 -0
  48. package/dist/row-level-security-entity-manager.spec.js +200 -0
  49. package/dist/row-level-security-entity-manager.spec.js.map +1 -0
  50. package/dist/row-level-security-migration-generator.d.ts +14 -0
  51. package/dist/row-level-security-migration-generator.js +294 -0
  52. package/dist/row-level-security-migration-generator.js.map +1 -0
  53. package/dist/row-level-security-migration-generator.spec.d.ts +1 -0
  54. package/dist/row-level-security-migration-generator.spec.js +468 -0
  55. package/dist/row-level-security-migration-generator.spec.js.map +1 -0
  56. package/dist/row-level-security-migration.d.ts +11 -0
  57. package/dist/row-level-security-migration.js +28 -0
  58. package/dist/row-level-security-migration.js.map +1 -0
  59. package/dist/row-level-security-migration.spec.d.ts +1 -0
  60. package/dist/row-level-security-migration.spec.js +40 -0
  61. package/dist/row-level-security-migration.spec.js.map +1 -0
  62. package/dist/tsconfig.build.tsbuildinfo +1 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -0
  64. package/dist/utils/assert-identifier.d.ts +2 -0
  65. package/dist/utils/assert-identifier.js +11 -0
  66. package/dist/utils/assert-identifier.js.map +1 -0
  67. package/dist/utils/assert-snake-case.d.ts +2 -0
  68. package/dist/utils/assert-snake-case.js +10 -0
  69. package/dist/utils/assert-snake-case.js.map +1 -0
  70. package/dist/utils/create-policy-bootstrap-sql-statements.d.ts +2 -0
  71. package/dist/utils/create-policy-bootstrap-sql-statements.js +17 -0
  72. package/dist/utils/create-policy-bootstrap-sql-statements.js.map +1 -0
  73. package/dist/utils/create-policy-down-sql.d.ts +3 -0
  74. package/dist/utils/create-policy-down-sql.js +30 -0
  75. package/dist/utils/create-policy-down-sql.js.map +1 -0
  76. package/dist/utils/create-policy-up-sql-statements.d.ts +3 -0
  77. package/dist/utils/create-policy-up-sql-statements.js +114 -0
  78. package/dist/utils/create-policy-up-sql-statements.js.map +1 -0
  79. package/dist/utils/default-row-level-security-options.d.ts +3 -0
  80. package/dist/utils/default-row-level-security-options.js +9 -0
  81. package/dist/utils/default-row-level-security-options.js.map +1 -0
  82. package/dist/utils/escape-sql-literal.d.ts +2 -0
  83. package/dist/utils/escape-sql-literal.js +8 -0
  84. package/dist/utils/escape-sql-literal.js.map +1 -0
  85. package/dist/utils/get-row-level-security-options.d.ts +8 -0
  86. package/dist/utils/get-row-level-security-options.js +9 -0
  87. package/dist/utils/get-row-level-security-options.js.map +1 -0
  88. package/dist/utils/index.d.ts +13 -0
  89. package/dist/utils/index.js +29 -0
  90. package/dist/utils/index.js.map +1 -0
  91. package/dist/utils/policy-migration-sql.spec.d.ts +1 -0
  92. package/dist/utils/policy-migration-sql.spec.js +168 -0
  93. package/dist/utils/policy-migration-sql.spec.js.map +1 -0
  94. package/dist/utils/policy-sql-options.d.ts +12 -0
  95. package/dist/utils/policy-sql-options.js +3 -0
  96. package/dist/utils/policy-sql-options.js.map +1 -0
  97. package/dist/utils/quote-identifier.d.ts +2 -0
  98. package/dist/utils/quote-identifier.js +10 -0
  99. package/dist/utils/quote-identifier.js.map +1 -0
  100. package/dist/utils/quote-qualified-identifier.d.ts +2 -0
  101. package/dist/utils/quote-qualified-identifier.js +9 -0
  102. package/dist/utils/quote-qualified-identifier.js.map +1 -0
  103. package/dist/utils/row-level-security-context-builder.d.ts +12 -0
  104. package/dist/utils/row-level-security-context-builder.js +40 -0
  105. package/dist/utils/row-level-security-context-builder.js.map +1 -0
  106. package/dist/utils/row-level-security-context-builder.spec.d.ts +1 -0
  107. package/dist/utils/row-level-security-context-builder.spec.js +40 -0
  108. package/dist/utils/row-level-security-context-builder.spec.js.map +1 -0
  109. package/dist/utils/row-level-security-context-builder.types.d.ts +10 -0
  110. package/dist/utils/row-level-security-context-builder.types.js +3 -0
  111. package/dist/utils/row-level-security-context-builder.types.js.map +1 -0
  112. package/dist/utils/row-level-security-options-state.d.ts +4 -0
  113. package/dist/utils/row-level-security-options-state.js +8 -0
  114. package/dist/utils/row-level-security-options-state.js.map +1 -0
  115. package/dist/utils/set-row-level-security-options.d.ts +3 -0
  116. package/dist/utils/set-row-level-security-options.js +13 -0
  117. package/dist/utils/set-row-level-security-options.js.map +1 -0
  118. package/package.json +77 -0
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const rowLevelSecurity = __importStar(require("."));
37
+ const rowLevelSecurityUtils = __importStar(require("./utils"));
38
+ describe("row level security package exports", () => {
39
+ afterEach(() => {
40
+ rowLevelSecurityUtils.setRowLevelSecurityOptions();
41
+ });
42
+ it("exports the public package API", () => {
43
+ expect(rowLevelSecurity.Policy).toBeDefined();
44
+ expect(rowLevelSecurity.PolicyCommand.SELECT).toBe("select");
45
+ expect(rowLevelSecurity.PolicyMode.PERMISSIVE).toBe("permissive");
46
+ expect(rowLevelSecurity.RowLevelSecurityContext).toBeDefined();
47
+ expect(rowLevelSecurity.RowLevelSecurityEntityManager).toBeDefined();
48
+ expect(rowLevelSecurity.RowLevelSecurityMigration).toBeDefined();
49
+ expect(rowLevelSecurity.RowLevelSecurityMigrationGenerator).toBeDefined();
50
+ expect(rowLevelSecurity.createPolicyUpSqlStatements).toBeDefined();
51
+ });
52
+ it("exports utility helpers", () => {
53
+ expect(rowLevelSecurityUtils.assertIdentifier("valid_identifier")).toBe("valid_identifier");
54
+ expect(rowLevelSecurityUtils.DEFAULT_ROW_LEVEL_SECURITY_OPTIONS).toEqual({
55
+ anonymousRole: "anonymous",
56
+ authenticatedRole: "authenticated",
57
+ });
58
+ expect(rowLevelSecurityUtils.createPolicyBootstrapSqlStatements()).toEqual(expect.arrayContaining(["create schema if not exists app;"]));
59
+ });
60
+ it("exports migration generator types", () => {
61
+ const diff = { down: [], up: [] };
62
+ expect(diff).toEqual({ down: [], up: [] });
63
+ });
64
+ it("returns a copy of process-level options", () => {
65
+ const options = rowLevelSecurityUtils.getRowLevelSecurityOptions();
66
+ options.authenticatedRole = "mutated";
67
+ expect(rowLevelSecurityUtils.getRowLevelSecurityOptions().authenticatedRole).toBe("authenticated");
68
+ });
69
+ });
70
+ //# sourceMappingURL=index.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../src/index.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,oDAAsC;AACtC,+DAAiD;AAEjD,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,SAAS,CAAC,GAAG,EAAE;QACb,qBAAqB,CAAC,0BAA0B,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClE,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/D,MAAM,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,WAAW,EAAE,CAAC;QACrE,MAAM,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,CAAC,WAAW,EAAE,CAAC;QACjE,MAAM,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1E,MAAM,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CAAC,WAAW,EAAE,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CACrE,kBAAkB,CACnB,CAAC;QACF,MAAM,CAAC,qBAAqB,CAAC,kCAAkC,CAAC,CAAC,OAAO,CAAC;YACvE,aAAa,EAAE,WAAW;YAC1B,iBAAiB,EAAE,eAAe;SACnC,CAAC,CAAC;QACH,MAAM,CAAC,qBAAqB,CAAC,kCAAkC,EAAE,CAAC,CAAC,OAAO,CACxE,MAAM,CAAC,eAAe,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAC7D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAEjD,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,qBAAqB,CAAC,0BAA0B,EAAE,CAAC;QAEnE,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;QAEtC,MAAM,CACJ,qBAAqB,CAAC,0BAA0B,EAAE,CAAC,iBAAiB,CACrE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./policy-metadata.interface";
2
+ export * from "./policy-options.interface";
3
+ export * from "./policy-sql-options.interface";
4
+ export type { MigrationDiff } from "./row-level-security-migration-generator.interface";
5
+ export * from "./row-level-security-options.interface";
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./policy-metadata.interface"), exports);
18
+ __exportStar(require("./policy-options.interface"), exports);
19
+ __exportStar(require("./policy-sql-options.interface"), exports);
20
+ __exportStar(require("./row-level-security-options.interface"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,6DAA2C;AAC3C,iEAA+C;AAE/C,yEAAuD"}
@@ -0,0 +1,62 @@
1
+ import { PolicyCommand } from "../enums/policy-command.enum";
2
+ import { PolicyMode } from "../enums/policy-mode.enum";
3
+ /** Normalized policy metadata stored by the {@link Policy} decorator. */
4
+ export interface PolicyMetadata {
5
+ /** PostgreSQL policy name. */
6
+ name: string;
7
+ /** PostgreSQL policy mode. */
8
+ mode: PolicyMode;
9
+ /** PostgreSQL command covered by the policy. */
10
+ command: PolicyCommand;
11
+ /** SQL expression used as the `USING` predicate. */
12
+ using?: string;
13
+ /** SQL expression used as the `WITH CHECK` predicate. */
14
+ withCheck?: string;
15
+ /** Database roles to which the policy applies. */
16
+ roles: string[];
17
+ /** Additional SQL emitted before creating this policy. */
18
+ bootstrapSql?: string[];
19
+ }
20
+ /** Entity metadata needed to derive policy names and predicates. */
21
+ export interface PolicyEntityMetadata {
22
+ /** Entity class name. */
23
+ entityName: string;
24
+ /** Database schema name. */
25
+ schemaName: string;
26
+ /** Database table name. */
27
+ tableName: string;
28
+ /** MikroORM property metadata keyed by entity property name. */
29
+ properties?: Record<string, PolicyEntityPropertyMetadata>;
30
+ }
31
+ /** Property metadata used to resolve policy column names and SQL context types. */
32
+ export interface PolicyEntityPropertyMetadata {
33
+ /** Entity property name. */
34
+ fieldName?: string;
35
+ /** Database column names mapped by this property. */
36
+ fieldNames?: string[];
37
+ /** MikroORM property type. */
38
+ type?: string;
39
+ /** Runtime TypeScript type name. */
40
+ runtimeType?: string;
41
+ /** Database column type names. */
42
+ columnTypes?: string[];
43
+ /** Whether the property is a primary key. */
44
+ primary?: boolean;
45
+ /** Metadata for the relation target, when the property is a relation. */
46
+ targetMeta?: PolicyEntityTargetMetadata;
47
+ }
48
+ /** Minimal target entity metadata used when a policy property points at a relation. */
49
+ export interface PolicyEntityTargetMetadata {
50
+ /** Target entity class name. */
51
+ className?: string;
52
+ /** Target entity name. */
53
+ name?: string;
54
+ /** Primary key property names on the target entity. */
55
+ primaryKeys?: string[];
56
+ /** Target entity properties keyed by property name. */
57
+ properties?: Record<string, PolicyEntityPropertyMetadata>;
58
+ }
59
+ /** Factory that derives policy metadata after MikroORM entity metadata is available. */
60
+ export type PolicyMetadataFactory = (entityMetadata: PolicyEntityMetadata) => PolicyMetadata;
61
+ /** Stored policy metadata entry, either static or entity-metadata aware. */
62
+ export type PolicyMetadataEntry = PolicyMetadata | PolicyMetadataFactory;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=policy-metadata.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-metadata.interface.js","sourceRoot":"","sources":["../../src/interfaces/policy-metadata.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { PolicyCommand } from "../enums/policy-command.enum";
2
+ import { PolicyMode } from "../enums/policy-mode.enum";
3
+ /** Options accepted by the {@link Policy} decorator. */
4
+ export interface PolicyOptions {
5
+ /** Explicit PostgreSQL policy name. If omitted, a stable name is generated from entity metadata. */
6
+ name?: string;
7
+ /** PostgreSQL policy mode. Defaults to {@link PolicyMode.PERMISSIVE}. */
8
+ mode?: PolicyMode;
9
+ /** PostgreSQL command covered by the policy. Defaults to {@link PolicyCommand.ALL}. */
10
+ command?: PolicyCommand;
11
+ /** Entity property used to generate the default policy predicate. */
12
+ property?: string;
13
+ /** Row-level security context key read through `app.get_context`. */
14
+ context?: string;
15
+ /** Explicit `USING` expression. Overrides the generated predicate when provided. */
16
+ using?: string;
17
+ /** Explicit `WITH CHECK` expression. Overrides the generated predicate when provided. */
18
+ withCheck?: string;
19
+ /** Database roles to which the policy applies. Empty or omitted means no role restriction. */
20
+ roles?: string[];
21
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=policy-options.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-options.interface.js","sourceRoot":"","sources":["../../src/interfaces/policy-options.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { PolicyCommand } from "../enums/policy-command.enum";
2
+ import { PolicyMode } from "../enums/policy-mode.enum";
3
+ /** Low-level inputs used to generate PostgreSQL policy SQL. */
4
+ export interface PolicySqlOptions {
5
+ /** Database schema containing the protected table. */
6
+ schemaName: string;
7
+ /** Table name on which row-level security is enabled. */
8
+ tableName: string;
9
+ /** PostgreSQL policy name. */
10
+ policyName: string;
11
+ /** PostgreSQL policy mode. Defaults to {@link PolicyMode.PERMISSIVE}. */
12
+ mode?: PolicyMode;
13
+ /** PostgreSQL command covered by the policy. Defaults to {@link PolicyCommand.ALL}. */
14
+ command?: PolicyCommand;
15
+ /** SQL expression emitted as the policy `USING` predicate. */
16
+ using?: string;
17
+ /** SQL expression emitted as the policy `WITH CHECK` predicate. */
18
+ withCheck?: string;
19
+ /** Database roles to which the generated policy applies. */
20
+ roles?: string[];
21
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=policy-sql-options.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-sql-options.interface.js","sourceRoot":"","sources":["../../src/interfaces/policy-sql-options.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import type { PolicySqlOptions } from "./policy-sql-options.interface";
2
+ /** SQL diff shape passed from MikroORM to migration generators. */
3
+ export interface MigrationDiff {
4
+ /** SQL statements applied by the generated migration. */
5
+ up: string[];
6
+ /** SQL statements applied when reverting the generated migration. */
7
+ down: string[];
8
+ }
9
+ export interface EntityMetadataLike {
10
+ class?: object & {
11
+ name?: string;
12
+ };
13
+ className?: string;
14
+ name?: string;
15
+ schema?: string;
16
+ tableName?: string;
17
+ collection?: string;
18
+ properties?: Record<string, EntityPropertyLike>;
19
+ }
20
+ export interface EntityPropertyLike {
21
+ fieldName?: string;
22
+ fieldNames?: string[];
23
+ type?: string;
24
+ runtimeType?: string;
25
+ columnTypes?: string[];
26
+ primary?: boolean;
27
+ targetMeta?: EntityTargetMetadataLike;
28
+ }
29
+ export interface EntityTargetMetadataLike {
30
+ className?: string;
31
+ name?: string;
32
+ primaryKeys?: string[];
33
+ properties?: Record<string, EntityPropertyLike>;
34
+ }
35
+ export interface MetadataStorageLike {
36
+ getAll(): EntityMetadataLike[] | Record<string, EntityMetadataLike>;
37
+ }
38
+ export interface DatabaseConnectionLike {
39
+ execute<T>(sql: string): Promise<T>;
40
+ }
41
+ export interface RowLevelSecurityMigrationGeneratorDriverLike {
42
+ config?: {
43
+ getMetadata?: () => MetadataStorageLike;
44
+ };
45
+ getConnection?: () => DatabaseConnectionLike;
46
+ getMetadata?: () => MetadataStorageLike;
47
+ }
48
+ export interface RowLevelSecurityDefinition extends PolicySqlOptions {
49
+ entityName: string;
50
+ bootstrapSql?: string[];
51
+ }
52
+ export interface TableReference {
53
+ schemaName: string;
54
+ tableName: string;
55
+ }
56
+ export interface PolicyRow {
57
+ policy_name: string;
58
+ schema_name: string;
59
+ table_name: string;
60
+ permissive?: boolean | null;
61
+ command?: string | null;
62
+ qual?: string | null;
63
+ roles?: string[] | string | null;
64
+ with_check?: string | null;
65
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=row-level-security-migration-generator.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-level-security-migration-generator.interface.js","sourceRoot":"","sources":["../../src/interfaces/row-level-security-migration-generator.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { RowLevelSecurityContextValue } from "../utils/row-level-security-context-builder.types";
2
+ /** Value or promise-like value accepted by row-level security option hooks. */
3
+ export type MaybePromise<T> = T | Promise<T>;
4
+ /** Context entries converted to transaction-local PostgreSQL settings. */
5
+ export type RowLevelSecurityContextEntries = Iterable<readonly [string, RowLevelSecurityContextValue]>;
6
+ /** Runtime options used by {@link RowLevelSecurityEntityManager}. */
7
+ export interface RowLevelSecurityOptions {
8
+ /** Database role used for authenticated requests. Defaults to `authenticated`. */
9
+ authenticatedRole?: string;
10
+ /** Database role used for anonymous requests. Defaults to `anonymous`. */
11
+ anonymousRole?: string;
12
+ /** Optional hook that can disable row-level security setup for a transaction. */
13
+ shouldApply?: () => MaybePromise<boolean>;
14
+ /** Optional hook used to infer the authenticated or anonymous role. */
15
+ isAuthenticated?: () => MaybePromise<boolean>;
16
+ /** Optional hook that contributes request context values to PostgreSQL settings. */
17
+ getContext?: () => MaybePromise<RowLevelSecurityContextEntries | undefined>;
18
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=row-level-security-options.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-level-security-options.interface.js","sourceRoot":"","sources":["../../src/interfaces/row-level-security-options.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { RowLevelSecurityContextValue, SnakeCase } from "./utils/row-level-security-context-builder.types";
2
+ /** Request-scoped row-level security role and context helpers. */
3
+ export declare class RowLevelSecurityContext {
4
+ /** Stores the database role that should be applied to the next RLS transaction. */
5
+ static setRole(role: string): void;
6
+ /** Reads the request-scoped database role, if one is active. */
7
+ static getRole(): string | undefined;
8
+ /** Stores a context value that will be converted to a PostgreSQL setting. */
9
+ static set<S extends string>(key: SnakeCase<S>, value: RowLevelSecurityContextValue): void;
10
+ /** Reads a request-scoped context value by key. */
11
+ static get<S extends string>(key: SnakeCase<S>): RowLevelSecurityContextValue;
12
+ /** Returns all request-scoped context entries for RLS transaction setup. */
13
+ static entries(): [string, RowLevelSecurityContextValue][];
14
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RowLevelSecurityContext = void 0;
4
+ const request_context_1 = require("@nest-boot/request-context");
5
+ const ROW_LEVEL_SECURITY_CONTEXT = Symbol("ROW_LEVEL_SECURITY_CONTEXT");
6
+ const ROW_LEVEL_SECURITY_ROLE = Symbol("ROW_LEVEL_SECURITY_ROLE");
7
+ /** Request-scoped row-level security role and context helpers. */
8
+ class RowLevelSecurityContext {
9
+ /** Stores the database role that should be applied to the next RLS transaction. */
10
+ static setRole(role) {
11
+ request_context_1.RequestContext.set(ROW_LEVEL_SECURITY_ROLE, role);
12
+ }
13
+ /** Reads the request-scoped database role, if one is active. */
14
+ static getRole() {
15
+ return request_context_1.RequestContext.isActive()
16
+ ? request_context_1.RequestContext.get(ROW_LEVEL_SECURITY_ROLE)
17
+ : undefined;
18
+ }
19
+ /** Stores a context value that will be converted to a PostgreSQL setting. */
20
+ static set(key, value) {
21
+ const context = request_context_1.RequestContext.getOrSet(ROW_LEVEL_SECURITY_CONTEXT, new Map());
22
+ context.set(key, value);
23
+ }
24
+ /** Reads a request-scoped context value by key. */
25
+ static get(key) {
26
+ return request_context_1.RequestContext.isActive()
27
+ ? request_context_1.RequestContext.get(ROW_LEVEL_SECURITY_CONTEXT)?.get(key)
28
+ : undefined;
29
+ }
30
+ /** Returns all request-scoped context entries for RLS transaction setup. */
31
+ static entries() {
32
+ return request_context_1.RequestContext.isActive()
33
+ ? Array.from(request_context_1.RequestContext.get(ROW_LEVEL_SECURITY_CONTEXT) ?? [])
34
+ : [];
35
+ }
36
+ }
37
+ exports.RowLevelSecurityContext = RowLevelSecurityContext;
38
+ //# sourceMappingURL=row-level-security-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-level-security-context.js","sourceRoot":"","sources":["../src/row-level-security-context.ts"],"names":[],"mappings":";;;AAAA,gEAA4D;AAS5D,MAAM,0BAA0B,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AACxE,MAAM,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAElE,kEAAkE;AAClE,MAAa,uBAAuB;IAClC,mFAAmF;IACnF,MAAM,CAAC,OAAO,CAAC,IAAY;QACzB,gCAAc,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,gEAAgE;IAChE,MAAM,CAAC,OAAO;QACZ,OAAO,gCAAc,CAAC,QAAQ,EAAE;YAC9B,CAAC,CAAC,gCAAc,CAAC,GAAG,CAAS,uBAAuB,CAAC;YACrD,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED,6EAA6E;IAC7E,MAAM,CAAC,GAAG,CACR,GAAiB,EACjB,KAAmC;QAEnC,MAAM,OAAO,GAAG,gCAAc,CAAC,QAAQ,CACrC,0BAA0B,EAC1B,IAAI,GAAG,EAAE,CACV,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,mDAAmD;IACnD,MAAM,CAAC,GAAG,CACR,GAAiB;QAEjB,OAAO,gCAAc,CAAC,QAAQ,EAAE;YAC9B,CAAC,CAAC,gCAAc,CAAC,GAAG,CAChB,0BAA0B,CAC3B,EAAE,GAAG,CAAC,GAAG,CAAC;YACb,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED,4EAA4E;IAC5E,MAAM,CAAC,OAAO;QACZ,OAAO,gCAAc,CAAC,QAAQ,EAAE;YAC9B,CAAC,CAAC,KAAK,CAAC,IAAI,CACR,gCAAc,CAAC,GAAG,CAChB,0BAA0B,CAC3B,IAAI,EAAE,CACR;YACH,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;CACF;AA/CD,0DA+CC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const request_context_1 = require("@nest-boot/request-context");
4
+ const row_level_security_context_1 = require("./row-level-security-context");
5
+ describe("RowLevelSecurityContext", () => {
6
+ it("stores the database role in RequestContext", async () => {
7
+ await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), () => {
8
+ row_level_security_context_1.RowLevelSecurityContext.setRole("authenticated");
9
+ expect(row_level_security_context_1.RowLevelSecurityContext.getRole()).toBe("authenticated");
10
+ });
11
+ });
12
+ it("stores policy context values in RequestContext", async () => {
13
+ await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), () => {
14
+ row_level_security_context_1.RowLevelSecurityContext.set("tenant_id", "42");
15
+ row_level_security_context_1.RowLevelSecurityContext.set("user_id", 7);
16
+ expect(row_level_security_context_1.RowLevelSecurityContext.get("tenant_id")).toBe("42");
17
+ expect(row_level_security_context_1.RowLevelSecurityContext.entries()).toEqual([
18
+ ["tenant_id", "42"],
19
+ ["user_id", 7],
20
+ ]);
21
+ });
22
+ });
23
+ it("returns empty values when RequestContext is inactive", () => {
24
+ expect(row_level_security_context_1.RowLevelSecurityContext.getRole()).toBeUndefined();
25
+ expect(row_level_security_context_1.RowLevelSecurityContext.get("tenant_id")).toBeUndefined();
26
+ expect(row_level_security_context_1.RowLevelSecurityContext.entries()).toEqual([]);
27
+ });
28
+ });
29
+ //# sourceMappingURL=row-level-security-context.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-level-security-context.spec.js","sourceRoot":"","sources":["../src/row-level-security-context.spec.ts"],"names":[],"mappings":";;AAAA,gEAA4D;AAE5D,6EAAuE;AAEvE,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,gCAAc,CAAC,GAAG,CAAC,IAAI,gCAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE;YAClE,oDAAuB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAEjD,MAAM,CAAC,oDAAuB,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,gCAAc,CAAC,GAAG,CAAC,IAAI,gCAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE;YAClE,oDAAuB,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC/C,oDAAuB,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAE1C,MAAM,CAAC,oDAAuB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,MAAM,CAAC,oDAAuB,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;gBAChD,CAAC,WAAW,EAAE,IAAI,CAAC;gBACnB,CAAC,SAAS,EAAE,CAAC,CAAC;aACf,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,oDAAuB,CAAC,OAAO,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,CAAC,oDAAuB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACjE,MAAM,CAAC,oDAAuB,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { CountOptions, Cursor, DeleteOptions, EntityData, EntityManager, EntityName, FilterQuery, FindAllOptions, FindByCursorOptions, FindOneOptions, FindOneOrFailOptions, FindOptions, Loaded, NativeInsertUpdateOptions, NoInfer, PopulatePath, Primary, RequiredEntityData, TransactionOptions, UpdateOptions, UpsertManyOptions, UpsertOptions } from "@mikro-orm/postgresql";
2
+ /**
3
+ * MikroORM entity manager that wraps database operations in transactions with
4
+ * transaction-local PostgreSQL role and context settings.
5
+ */
6
+ export declare class RowLevelSecurityEntityManager extends EntityManager {
7
+ transactional<T>(cb: (em: this) => T | Promise<T>, options?: TransactionOptions): Promise<T>;
8
+ find<Entity extends object, Hint extends string = never, Fields extends string = PopulatePath.ALL, Excludes extends string = never>(entityName: EntityName<Entity>, where: FilterQuery<NoInfer<Entity>>, options?: FindOptions<Entity, Hint, Fields, Excludes>): Promise<Loaded<Entity, Hint, Fields, Excludes>[]>;
9
+ findAll<Entity extends object, Hint extends string = never, Fields extends string = "*", Excludes extends string = never>(entityName: EntityName<Entity>, options?: FindAllOptions<NoInfer<Entity>, Hint, Fields, Excludes>): Promise<Loaded<Entity, Hint, Fields, Excludes>[]>;
10
+ findOne<Entity extends object, Hint extends string = never, Fields extends string = "*", Excludes extends string = never>(entityName: EntityName<Entity>, where: FilterQuery<NoInfer<Entity>>, options?: FindOneOptions<Entity, Hint, Fields, Excludes>): Promise<Loaded<Entity, Hint, Fields, Excludes> | null>;
11
+ findOneOrFail<Entity extends object, Hint extends string = never, Fields extends string = "*", Excludes extends string = never>(entityName: EntityName<Entity>, where: FilterQuery<NoInfer<Entity>>, options?: FindOneOrFailOptions<Entity, Hint, Fields, Excludes>): Promise<Loaded<Entity, Hint, Fields, Excludes>>;
12
+ findAndCount<Entity extends object, Hint extends string = never, Fields extends string = PopulatePath.ALL, Excludes extends string = never>(entityName: EntityName<Entity>, where: FilterQuery<NoInfer<Entity>>, options?: FindOptions<Entity, Hint, Fields, Excludes>): Promise<[Loaded<Entity, Hint, Fields, Excludes>[], number]>;
13
+ findByCursor<Entity extends object, Hint extends string = never, Fields extends string = "*", Excludes extends string = never, IncludeCount extends boolean = true>(entityName: EntityName<Entity>, where: FilterQuery<NoInfer<Entity>>, options: FindByCursorOptions<Entity, Hint, Fields, Excludes, IncludeCount>): Promise<Cursor<Entity, Hint, Fields, Excludes, IncludeCount>>;
14
+ count<Entity extends object, Hint extends string = never>(entityName: EntityName<Entity>, where?: FilterQuery<NoInfer<Entity>>, options?: CountOptions<Entity, Hint>): Promise<number>;
15
+ insert<Entity extends object>(entityNameOrEntity: EntityName<Entity> | Entity, data?: RequiredEntityData<Entity> | Entity, options?: NativeInsertUpdateOptions<Entity>): Promise<Primary<Entity>>;
16
+ insertMany<Entity extends object>(entityNameOrEntities: EntityName<Entity> | Entity[], data?: RequiredEntityData<Entity>[] | Entity[], options?: NativeInsertUpdateOptions<Entity>): Promise<Primary<Entity>[]>;
17
+ nativeUpdate<Entity extends object>(entityName: EntityName<Entity>, where: FilterQuery<NoInfer<Entity>>, data: EntityData<Entity>, options?: UpdateOptions<Entity>): Promise<number>;
18
+ nativeDelete<Entity extends object>(entityName: EntityName<Entity>, where: FilterQuery<NoInfer<Entity>>, options?: DeleteOptions<Entity>): Promise<number>;
19
+ upsert<Entity extends object, Fields extends string = any>(entityNameOrEntity: EntityName<Entity> | Entity, data?: EntityData<Entity> | NoInfer<Entity>, options?: UpsertOptions<Entity, Fields>): Promise<Entity>;
20
+ upsertMany<Entity extends object, Fields extends string = any>(entityNameOrEntity: EntityName<Entity> | Entity[], data?: (EntityData<Entity> | NoInfer<Entity>)[], options?: UpsertManyOptions<Entity, Fields>): Promise<Entity[]>;
21
+ flush(): Promise<void>;
22
+ }
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RowLevelSecurityEntityManager = void 0;
4
+ const postgresql_1 = require("@mikro-orm/postgresql");
5
+ const row_level_security_context_1 = require("./row-level-security-context");
6
+ const assert_snake_case_1 = require("./utils/assert-snake-case");
7
+ const get_row_level_security_options_1 = require("./utils/get-row-level-security-options");
8
+ const row_level_security_context_builder_1 = require("./utils/row-level-security-context-builder");
9
+ /**
10
+ * MikroORM entity manager that wraps database operations in transactions with
11
+ * transaction-local PostgreSQL role and context settings.
12
+ */
13
+ class RowLevelSecurityEntityManager extends postgresql_1.EntityManager {
14
+ async transactional(cb, options) {
15
+ const rowLevelSecurityOptions = (0, get_row_level_security_options_1.getRowLevelSecurityOptions)();
16
+ if (rowLevelSecurityOptions.shouldApply &&
17
+ !(await rowLevelSecurityOptions.shouldApply())) {
18
+ return await super.transactional(cb, options);
19
+ }
20
+ return await super.transactional(async (em) => {
21
+ const knex = em.getTransactionContext();
22
+ if (!knex) {
23
+ throw new Error("Transaction context is not available. Ensure you are calling this method within a transaction.");
24
+ }
25
+ const builder = new row_level_security_context_builder_1.RowLevelSecurityContextBuilder();
26
+ const role = row_level_security_context_1.RowLevelSecurityContext.getRole() ??
27
+ ((await rowLevelSecurityOptions.isAuthenticated?.())
28
+ ? (rowLevelSecurityOptions.authenticatedRole ?? "authenticated")
29
+ : (rowLevelSecurityOptions.anonymousRole ?? "anonymous"));
30
+ const context = await rowLevelSecurityOptions.getContext?.();
31
+ appendContext(builder, context);
32
+ appendContext(builder, row_level_security_context_1.RowLevelSecurityContext.entries());
33
+ (0, assert_snake_case_1.assertSnakeCase)(role, "Row level security database role");
34
+ await knex.raw([
35
+ /* SQL */ `SET LOCAL ROLE ${role};`,
36
+ builder.entries().length > 0 ? builder.toSQL() : "",
37
+ ]
38
+ .filter(Boolean)
39
+ .join("\n"));
40
+ return await cb(em);
41
+ }, options);
42
+ }
43
+ find(entityName, where, options) {
44
+ if (this.isInTransaction()) {
45
+ return super.find(entityName, where, options);
46
+ }
47
+ return this.transactional((em) => em.find(entityName, where, options));
48
+ }
49
+ findAll(entityName, options) {
50
+ if (this.isInTransaction()) {
51
+ return super.findAll(entityName, options);
52
+ }
53
+ return this.transactional((em) => em.findAll(entityName, options));
54
+ }
55
+ findOne(entityName, where, options) {
56
+ if (this.isInTransaction()) {
57
+ return super.findOne(entityName, where, options);
58
+ }
59
+ return this.transactional((em) => em.findOne(entityName, where, options));
60
+ }
61
+ findOneOrFail(entityName, where, options) {
62
+ if (this.isInTransaction()) {
63
+ return super.findOneOrFail(entityName, where, options);
64
+ }
65
+ return this.transactional((em) => em.findOneOrFail(entityName, where, options));
66
+ }
67
+ findAndCount(entityName, where, options) {
68
+ if (this.isInTransaction()) {
69
+ return super.findAndCount(entityName, where, options);
70
+ }
71
+ return this.transactional((em) => em.findAndCount(entityName, where, options));
72
+ }
73
+ findByCursor(entityName, where, options) {
74
+ if (this.isInTransaction()) {
75
+ return super.findByCursor(entityName, where, options);
76
+ }
77
+ return this.transactional((em) => em.findByCursor(entityName, where, options));
78
+ }
79
+ count(entityName, where, options) {
80
+ if (this.isInTransaction()) {
81
+ return super.count(entityName, where, options);
82
+ }
83
+ return this.transactional((em) => em.count(entityName, where, options));
84
+ }
85
+ insert(entityNameOrEntity, data, options) {
86
+ if (this.isInTransaction()) {
87
+ return super.insert(entityNameOrEntity, data, options);
88
+ }
89
+ return this.transactional((em) => em.insert(entityNameOrEntity, data, options));
90
+ }
91
+ // @ts-expect-error - MikroORM type duplication/deep mapped type collision
92
+ insertMany(entityNameOrEntities, data, options) {
93
+ if (this.isInTransaction()) {
94
+ return super.insertMany(entityNameOrEntities, data, options);
95
+ }
96
+ return this.transactional((em) => em.insertMany(entityNameOrEntities, data, options));
97
+ }
98
+ nativeUpdate(entityName, where, data, options) {
99
+ if (this.isInTransaction()) {
100
+ return super.nativeUpdate(entityName, where, data, options);
101
+ }
102
+ return this.transactional((em) => em.nativeUpdate(entityName, where, data, options));
103
+ }
104
+ nativeDelete(entityName, where, options) {
105
+ if (this.isInTransaction()) {
106
+ return super.nativeDelete(entityName, where, options);
107
+ }
108
+ return this.transactional((em) => em.nativeDelete(entityName, where, options));
109
+ }
110
+ upsert(entityNameOrEntity, data, options) {
111
+ if (this.isInTransaction()) {
112
+ return super.upsert(entityNameOrEntity, data, options);
113
+ }
114
+ return this.transactional((em) => em.upsert(entityNameOrEntity, data, options));
115
+ }
116
+ upsertMany(entityNameOrEntity, data, options) {
117
+ if (this.isInTransaction()) {
118
+ return super.upsertMany(entityNameOrEntity, data, options);
119
+ }
120
+ return this.transactional((em) => em.upsertMany(entityNameOrEntity, data, options));
121
+ }
122
+ flush() {
123
+ if (this.isInTransaction()) {
124
+ return super.flush();
125
+ }
126
+ return this.transactional((em) => em.flush());
127
+ }
128
+ }
129
+ exports.RowLevelSecurityEntityManager = RowLevelSecurityEntityManager;
130
+ function appendContext(builder, context) {
131
+ for (const [key, value] of context ?? []) {
132
+ builder.set(key, value);
133
+ }
134
+ }
135
+ //# sourceMappingURL=row-level-security-entity-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row-level-security-entity-manager.js","sourceRoot":"","sources":["../src/row-level-security-entity-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};