@zenstackhq/runtime 2.4.0 → 2.5.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 (139) hide show
  1. package/browser/index.js +3 -2
  2. package/browser/index.js.map +1 -1
  3. package/browser/index.mjs +3 -2
  4. package/browser/index.mjs.map +1 -1
  5. package/constants.d.ts +1 -1
  6. package/constants.js +1 -1
  7. package/constants.js.map +1 -1
  8. package/edge.d.ts +1 -7
  9. package/edge.js +1 -7
  10. package/edge.js.map +1 -1
  11. package/enhance-edge.d.ts +1 -0
  12. package/enhance-edge.js +10 -0
  13. package/enhancements/edge/create-enhancement.d.ts +37 -0
  14. package/enhancements/{create-enhancement.js → edge/create-enhancement.js} +2 -2
  15. package/enhancements/edge/create-enhancement.js.map +1 -0
  16. package/enhancements/{default-auth.d.ts → edge/default-auth.d.ts} +2 -1
  17. package/enhancements/{default-auth.js → edge/default-auth.js} +1 -1
  18. package/enhancements/edge/default-auth.js.map +1 -0
  19. package/enhancements/{delegate.d.ts → edge/delegate.d.ts} +1 -1
  20. package/enhancements/{delegate.js → edge/delegate.js} +16 -3
  21. package/enhancements/edge/delegate.js.map +1 -0
  22. package/enhancements/{index.d.ts → edge/index.d.ts} +1 -1
  23. package/enhancements/{index.js → edge/index.js} +1 -1
  24. package/enhancements/edge/index.js.map +1 -0
  25. package/enhancements/edge/logger.js.map +1 -0
  26. package/enhancements/{omit.js → edge/omit.js} +33 -3
  27. package/enhancements/edge/omit.js.map +1 -0
  28. package/enhancements/{password.js → edge/password.js} +2 -2
  29. package/enhancements/edge/password.js.map +1 -0
  30. package/enhancements/edge/policy/check-utils.d.ts +5 -0
  31. package/enhancements/edge/policy/check-utils.js +20 -0
  32. package/enhancements/edge/policy/check-utils.js.map +1 -0
  33. package/enhancements/{policy → edge/policy}/handler.d.ts +24 -9
  34. package/enhancements/{policy → edge/policy}/handler.js +67 -91
  35. package/enhancements/edge/policy/handler.js.map +1 -0
  36. package/enhancements/{policy → edge/policy}/index.d.ts +2 -1
  37. package/enhancements/{policy → edge/policy}/index.js +2 -2
  38. package/enhancements/edge/policy/index.js.map +1 -0
  39. package/enhancements/{policy → edge/policy}/policy-utils.d.ts +5 -5
  40. package/enhancements/{policy → edge/policy}/policy-utils.js +27 -21
  41. package/enhancements/edge/policy/policy-utils.js.map +1 -0
  42. package/enhancements/{promise.d.ts → edge/promise.d.ts} +1 -1
  43. package/enhancements/{promise.js → edge/promise.js} +1 -1
  44. package/enhancements/edge/promise.js.map +1 -0
  45. package/enhancements/{proxy.d.ts → edge/proxy.d.ts} +26 -9
  46. package/enhancements/{proxy.js → edge/proxy.js} +31 -7
  47. package/enhancements/edge/proxy.js.map +1 -0
  48. package/enhancements/{query-utils.d.ts → edge/query-utils.d.ts} +2 -2
  49. package/enhancements/{query-utils.js → edge/query-utils.js} +3 -4
  50. package/enhancements/edge/query-utils.js.map +1 -0
  51. package/enhancements/{types.d.ts → edge/types.d.ts} +5 -12
  52. package/enhancements/{types.js.map → edge/types.js.map} +1 -1
  53. package/enhancements/{utils.d.ts → edge/utils.d.ts} +2 -2
  54. package/enhancements/{utils.js → edge/utils.js} +2 -2
  55. package/enhancements/edge/utils.js.map +1 -0
  56. package/enhancements/{where-visitor.d.ts → edge/where-visitor.d.ts} +1 -1
  57. package/enhancements/{where-visitor.js → edge/where-visitor.js} +1 -1
  58. package/enhancements/edge/where-visitor.js.map +1 -0
  59. package/enhancements/node/create-enhancement.d.ts +37 -0
  60. package/enhancements/node/create-enhancement.js +79 -0
  61. package/enhancements/node/create-enhancement.js.map +1 -0
  62. package/enhancements/node/default-auth.d.ts +8 -0
  63. package/enhancements/node/default-auth.js +129 -0
  64. package/enhancements/node/default-auth.js.map +1 -0
  65. package/enhancements/node/delegate.d.ts +69 -0
  66. package/enhancements/node/delegate.js +1006 -0
  67. package/enhancements/node/delegate.js.map +1 -0
  68. package/enhancements/node/index.d.ts +4 -0
  69. package/enhancements/node/index.js +21 -0
  70. package/enhancements/node/index.js.map +1 -0
  71. package/enhancements/node/logger.d.ts +29 -0
  72. package/enhancements/node/logger.js +65 -0
  73. package/enhancements/node/logger.js.map +1 -0
  74. package/enhancements/node/omit.d.ts +7 -0
  75. package/enhancements/node/omit.js +93 -0
  76. package/enhancements/node/omit.js.map +1 -0
  77. package/enhancements/node/password.d.ts +7 -0
  78. package/enhancements/node/password.js +65 -0
  79. package/enhancements/node/password.js.map +1 -0
  80. package/enhancements/node/policy/check-utils.d.ts +5 -0
  81. package/enhancements/node/policy/check-utils.js +87 -0
  82. package/enhancements/node/policy/check-utils.js.map +1 -0
  83. package/enhancements/node/policy/constraint-solver.js.map +1 -0
  84. package/enhancements/node/policy/handler.d.ts +94 -0
  85. package/enhancements/node/policy/handler.js +1357 -0
  86. package/enhancements/node/policy/handler.js.map +1 -0
  87. package/enhancements/node/policy/index.d.ts +13 -0
  88. package/enhancements/node/policy/index.js +42 -0
  89. package/enhancements/node/policy/index.js.map +1 -0
  90. package/enhancements/node/policy/policy-utils.d.ts +184 -0
  91. package/enhancements/node/policy/policy-utils.js +1296 -0
  92. package/enhancements/node/policy/policy-utils.js.map +1 -0
  93. package/enhancements/node/promise.d.ts +15 -0
  94. package/enhancements/node/promise.js +99 -0
  95. package/enhancements/node/promise.js.map +1 -0
  96. package/enhancements/node/proxy.d.ts +118 -0
  97. package/enhancements/node/proxy.js +267 -0
  98. package/enhancements/node/proxy.js.map +1 -0
  99. package/enhancements/node/query-utils.d.ts +38 -0
  100. package/enhancements/node/query-utils.js +185 -0
  101. package/enhancements/node/query-utils.js.map +1 -0
  102. package/enhancements/node/types.d.ts +224 -0
  103. package/enhancements/node/types.js +3 -0
  104. package/enhancements/node/types.js.map +1 -0
  105. package/enhancements/node/utils.d.ts +11 -0
  106. package/enhancements/node/utils.js +49 -0
  107. package/enhancements/node/utils.js.map +1 -0
  108. package/enhancements/node/where-visitor.d.ts +32 -0
  109. package/enhancements/node/where-visitor.js +86 -0
  110. package/enhancements/node/where-visitor.js.map +1 -0
  111. package/index.d.ts +2 -2
  112. package/index.js +2 -2
  113. package/index.js.map +1 -1
  114. package/package.json +14 -6
  115. package/types.d.ts +62 -0
  116. package/enhancements/create-enhancement.d.ts +0 -78
  117. package/enhancements/create-enhancement.js.map +0 -1
  118. package/enhancements/default-auth.js.map +0 -1
  119. package/enhancements/delegate.js.map +0 -1
  120. package/enhancements/index.js.map +0 -1
  121. package/enhancements/logger.js.map +0 -1
  122. package/enhancements/omit.js.map +0 -1
  123. package/enhancements/password.js.map +0 -1
  124. package/enhancements/policy/constraint-solver.js.map +0 -1
  125. package/enhancements/policy/handler.js.map +0 -1
  126. package/enhancements/policy/index.js.map +0 -1
  127. package/enhancements/policy/policy-utils.js.map +0 -1
  128. package/enhancements/promise.js.map +0 -1
  129. package/enhancements/proxy.js.map +0 -1
  130. package/enhancements/query-utils.js.map +0 -1
  131. package/enhancements/utils.js.map +0 -1
  132. package/enhancements/where-visitor.js.map +0 -1
  133. /package/enhancements/{logger.d.ts → edge/logger.d.ts} +0 -0
  134. /package/enhancements/{logger.js → edge/logger.js} +0 -0
  135. /package/enhancements/{omit.d.ts → edge/omit.d.ts} +0 -0
  136. /package/enhancements/{password.d.ts → edge/password.d.ts} +0 -0
  137. /package/enhancements/{types.js → edge/types.js} +0 -0
  138. /package/enhancements/{policy → node/policy}/constraint-solver.d.ts +0 -0
  139. /package/enhancements/{policy → node/policy}/constraint-solver.js +0 -0
@@ -0,0 +1,38 @@
1
+ import { type FieldInfo, type NestedWriteVisitorContext } from '../../cross';
2
+ import type { CrudContract, DbClientContract } from '../../types';
3
+ import { InternalEnhancementOptions } from './create-enhancement';
4
+ export declare class QueryUtils {
5
+ private readonly prisma;
6
+ protected readonly options: InternalEnhancementOptions;
7
+ constructor(prisma: DbClientContract, options: InternalEnhancementOptions);
8
+ getIdFields(model: string): FieldInfo[];
9
+ makeIdSelection(model: string): any;
10
+ getEntityIds(model: string, entityData: any): Record<string, unknown>;
11
+ /**
12
+ * Initiates a transaction.
13
+ */
14
+ transaction<T>(db: CrudContract, action: (tx: CrudContract) => Promise<T>): Promise<T>;
15
+ /**
16
+ * Builds a reversed query for the given nested path.
17
+ */
18
+ buildReversedQuery(context: NestedWriteVisitorContext, forMutationPayload?: boolean, unsafeOperation?: boolean): any;
19
+ /**
20
+ * Composes a compound unique field from multiple fields. E.g.: { a: '1', b: '1' } => { a_b: { a: '1', b: '1' } }.
21
+ */
22
+ composeCompoundUniqueField(model: string, fieldData: any): any;
23
+ /**
24
+ * Flattens a generated unique field. E.g.: { a_b: { a: '1', b: '1' } } => { a: '1', b: '1' }.
25
+ */
26
+ flattenGeneratedUniqueField(model: string, args: any): void;
27
+ validationError(message: string): Error;
28
+ unknownError(message: string): Error;
29
+ getModelFields(model: string): Record<string, FieldInfo> | undefined;
30
+ /**
31
+ * Gets information for a specific model field.
32
+ */
33
+ getModelField(model: string, field: string): FieldInfo | undefined;
34
+ /**
35
+ * Clones an object and makes sure it's not empty.
36
+ */
37
+ safeClone(value: unknown): any;
38
+ }
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueryUtils = void 0;
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ const cross_1 = require("../../cross");
6
+ const version_1 = require("../../version");
7
+ const utils_1 = require("./utils");
8
+ class QueryUtils {
9
+ constructor(prisma, options) {
10
+ this.prisma = prisma;
11
+ this.options = options;
12
+ }
13
+ getIdFields(model) {
14
+ return (0, cross_1.getIdFields)(this.options.modelMeta, model, true);
15
+ }
16
+ makeIdSelection(model) {
17
+ const idFields = this.getIdFields(model);
18
+ return Object.assign({}, ...idFields.map((f) => ({ [f.name]: true })));
19
+ }
20
+ getEntityIds(model, entityData) {
21
+ const idFields = this.getIdFields(model);
22
+ const result = {};
23
+ for (const idField of idFields) {
24
+ result[idField.name] = entityData[idField.name];
25
+ }
26
+ return result;
27
+ }
28
+ /**
29
+ * Initiates a transaction.
30
+ */
31
+ transaction(db, action) {
32
+ const fullDb = db;
33
+ if (fullDb['$transaction']) {
34
+ return fullDb.$transaction((tx) => {
35
+ tx[Symbol.for('nodejs.util.inspect.custom')] = 'PrismaClient$tx';
36
+ return action(tx);
37
+ }, {
38
+ maxWait: this.options.transactionMaxWait,
39
+ timeout: this.options.transactionTimeout,
40
+ isolationLevel: this.options.transactionIsolationLevel,
41
+ });
42
+ }
43
+ else {
44
+ // already in transaction, don't nest
45
+ return action(db);
46
+ }
47
+ }
48
+ /**
49
+ * Builds a reversed query for the given nested path.
50
+ */
51
+ buildReversedQuery(context, forMutationPayload = false, unsafeOperation = false) {
52
+ let result, currQuery;
53
+ let currField;
54
+ for (let i = context.nestingPath.length - 1; i >= 0; i--) {
55
+ const { field, model, where } = context.nestingPath[i];
56
+ // never modify the original where because it's shared in the structure
57
+ const visitWhere = Object.assign({}, where);
58
+ if (model && where) {
59
+ // make sure composite unique condition is flattened
60
+ this.flattenGeneratedUniqueField(model, visitWhere);
61
+ }
62
+ if (!result) {
63
+ // first segment (bottom), just use its where clause
64
+ result = currQuery = Object.assign({}, visitWhere);
65
+ currField = field;
66
+ }
67
+ else {
68
+ if (!currField) {
69
+ throw this.unknownError(`missing field in nested path`);
70
+ }
71
+ if (!currField.backLink) {
72
+ throw this.unknownError(`field ${currField.type}.${currField.name} doesn't have a backLink`);
73
+ }
74
+ const backLinkField = this.getModelField(currField.type, currField.backLink);
75
+ if (!backLinkField) {
76
+ throw this.unknownError(`missing backLink field ${currField.backLink} in ${currField.type}`);
77
+ }
78
+ if (backLinkField.isArray && !forMutationPayload) {
79
+ // many-side of relationship, wrap with "some" query
80
+ currQuery[currField.backLink] = { some: Object.assign({}, visitWhere) };
81
+ currQuery = currQuery[currField.backLink].some;
82
+ }
83
+ else {
84
+ const fkMapping = where && backLinkField.isRelationOwner && backLinkField.foreignKeyMapping;
85
+ // calculate if we should preserve the relation condition (e.g., { user: { id: 1 } })
86
+ const shouldPreserveRelationCondition =
87
+ // doing a mutation
88
+ forMutationPayload &&
89
+ // and it's a safe mutate
90
+ !unsafeOperation &&
91
+ // and the current segment is the direct parent (the last one is the mutate itself),
92
+ // the relation condition should be preserved and will be converted to a "connect" later
93
+ i === context.nestingPath.length - 2;
94
+ if (fkMapping && !shouldPreserveRelationCondition) {
95
+ // turn relation condition into foreign key condition, e.g.:
96
+ // { user: { id: 1 } } => { userId: 1 }
97
+ for (const [r, fk] of Object.entries(fkMapping)) {
98
+ currQuery[fk] = visitWhere[r];
99
+ }
100
+ if (i > 0) {
101
+ // prepare for the next segment
102
+ currQuery[currField.backLink] = {};
103
+ }
104
+ }
105
+ else {
106
+ // preserve the original structure
107
+ currQuery[currField.backLink] = Object.assign({}, visitWhere);
108
+ }
109
+ if (forMutationPayload && currQuery[currField.backLink]) {
110
+ // reconstruct compound unique field
111
+ currQuery[currField.backLink] = this.composeCompoundUniqueField(backLinkField.type, currQuery[currField.backLink]);
112
+ }
113
+ currQuery = currQuery[currField.backLink];
114
+ }
115
+ currField = field;
116
+ }
117
+ }
118
+ return result;
119
+ }
120
+ /**
121
+ * Composes a compound unique field from multiple fields. E.g.: { a: '1', b: '1' } => { a_b: { a: '1', b: '1' } }.
122
+ */
123
+ composeCompoundUniqueField(model, fieldData) {
124
+ const uniqueConstraints = (0, cross_1.getUniqueConstraints)(this.options.modelMeta, model);
125
+ if (!uniqueConstraints) {
126
+ return fieldData;
127
+ }
128
+ const result = this.safeClone(fieldData);
129
+ for (const [name, constraint] of Object.entries(uniqueConstraints)) {
130
+ if (constraint.fields.length > 1 && constraint.fields.every((f) => fieldData[f] !== undefined)) {
131
+ // multi-field unique constraint, compose it
132
+ result[name] = constraint.fields.reduce((prev, field) => (Object.assign(Object.assign({}, prev), { [field]: fieldData[field] })), {});
133
+ constraint.fields.forEach((f) => delete result[f]);
134
+ }
135
+ }
136
+ return result;
137
+ }
138
+ /**
139
+ * Flattens a generated unique field. E.g.: { a_b: { a: '1', b: '1' } } => { a: '1', b: '1' }.
140
+ */
141
+ flattenGeneratedUniqueField(model, args) {
142
+ const uniqueConstraints = (0, cross_1.getUniqueConstraints)(this.options.modelMeta, model);
143
+ if (uniqueConstraints && Object.keys(uniqueConstraints).length > 0) {
144
+ for (const [field, value] of Object.entries(args)) {
145
+ if (uniqueConstraints[field] &&
146
+ uniqueConstraints[field].fields.length > 1 &&
147
+ typeof value === 'object') {
148
+ // multi-field unique constraint, flatten it
149
+ delete args[field];
150
+ if (value) {
151
+ for (const [f, v] of Object.entries(value)) {
152
+ args[f] = v;
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+ }
159
+ validationError(message) {
160
+ return (0, utils_1.prismaClientValidationError)(this.prisma, this.options.prismaModule, message);
161
+ }
162
+ unknownError(message) {
163
+ return (0, utils_1.prismaClientUnknownRequestError)(this.prisma, this.options.prismaModule, message, {
164
+ clientVersion: (0, version_1.getVersion)(),
165
+ });
166
+ }
167
+ getModelFields(model) {
168
+ var _a;
169
+ return (_a = (0, cross_1.getModelInfo)(this.options.modelMeta, model)) === null || _a === void 0 ? void 0 : _a.fields;
170
+ }
171
+ /**
172
+ * Gets information for a specific model field.
173
+ */
174
+ getModelField(model, field) {
175
+ return (0, cross_1.resolveField)(this.options.modelMeta, model, field);
176
+ }
177
+ /**
178
+ * Clones an object and makes sure it's not empty.
179
+ */
180
+ safeClone(value) {
181
+ return value ? (0, cross_1.clone)(value) : value === undefined || value === null ? {} : value;
182
+ }
183
+ }
184
+ exports.QueryUtils = QueryUtils;
185
+ //# sourceMappingURL=query-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-utils.js","sourceRoot":"","sources":["../../../src/enhancements/node/query-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,224 @@
1
+ import type { CrudContract, PermissionCheckerContext, PolicyCrudKind, QueryContext } from '../../types';
2
+ /**
3
+ * Common options for PrismaClient enhancements
4
+ */
5
+ export interface CommonEnhancementOptions {
6
+ /**
7
+ * Path for loading CLI-generated code
8
+ */
9
+ loadPath?: string;
10
+ /**
11
+ * The `Prisma` module generated together with `PrismaClient`. You only need to
12
+ * pass it when you specified a custom `PrismaClient` output path. The module can
13
+ * be loaded like: `import { Prisma } from '<your PrismaClient output path>';`.
14
+ */
15
+ prismaModule?: any;
16
+ }
17
+ /**
18
+ * Function for getting policy guard with a given context
19
+ */
20
+ export type PolicyFunc = (context: QueryContext, db: CrudContract) => object;
21
+ /**
22
+ * Function for checking an entity's data for permission
23
+ */
24
+ export type EntityCheckerFunc = (input: any, context: QueryContext) => boolean;
25
+ /**
26
+ * Function for checking if an operation is possibly allowed.
27
+ */
28
+ export type PermissionCheckerFunc = (context: PermissionCheckerContext) => PermissionCheckerConstraint;
29
+ /**
30
+ * Supported checker constraint checking value types.
31
+ */
32
+ export type ConstraintValueTypes = 'boolean' | 'number' | 'string';
33
+ /**
34
+ * Free variable constraint
35
+ */
36
+ export type VariableConstraint = {
37
+ kind: 'variable';
38
+ name: string;
39
+ type: ConstraintValueTypes;
40
+ };
41
+ /**
42
+ * Constant value constraint
43
+ */
44
+ export type ValueConstraint = {
45
+ kind: 'value';
46
+ value: number | boolean | string;
47
+ type: ConstraintValueTypes;
48
+ };
49
+ /**
50
+ * Terms for comparison constraints
51
+ */
52
+ export type ComparisonTerm = VariableConstraint | ValueConstraint;
53
+ /**
54
+ * Comparison constraint
55
+ */
56
+ export type ComparisonConstraint = {
57
+ kind: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte';
58
+ left: ComparisonTerm;
59
+ right: ComparisonTerm;
60
+ };
61
+ /**
62
+ * Logical constraint
63
+ */
64
+ export type LogicalConstraint = {
65
+ kind: 'and' | 'or' | 'not';
66
+ children: PermissionCheckerConstraint[];
67
+ };
68
+ /**
69
+ * Operation allowability checking constraint
70
+ */
71
+ export type PermissionCheckerConstraint = ValueConstraint | VariableConstraint | ComparisonConstraint | LogicalConstraint;
72
+ /**
73
+ * Policy definition
74
+ */
75
+ export type PolicyDef = {
76
+ policy: Record<ModelName, ModelPolicyDef>;
77
+ validation: Record<string, {
78
+ hasValidation: boolean;
79
+ }>;
80
+ authSelector?: object;
81
+ };
82
+ type ModelName = string;
83
+ type FieldName = string;
84
+ /**
85
+ * Policy definition for a model
86
+ */
87
+ export type ModelPolicyDef = {
88
+ /**
89
+ * Model-level CRUD policies
90
+ */
91
+ modelLevel: ModelCrudDef;
92
+ /**
93
+ * Field-level CRUD policies
94
+ */
95
+ fieldLevel?: FieldCrudDef;
96
+ };
97
+ /**
98
+ * CRUD policy definitions for a model
99
+ */
100
+ export type ModelCrudDef = {
101
+ read: ModelReadDef;
102
+ create: ModelCreateDef;
103
+ update: ModelUpdateDef;
104
+ delete: ModelDeleteDef;
105
+ postUpdate: ModelPostUpdateDef;
106
+ };
107
+ /**
108
+ * Information for checking entity data outside of Prisma
109
+ */
110
+ export type EntityChecker = {
111
+ /**
112
+ * Checker function
113
+ */
114
+ func: EntityCheckerFunc;
115
+ /**
116
+ * Selector for fetching entity data
117
+ */
118
+ selector?: object;
119
+ };
120
+ /**
121
+ * Common policy definition for a CRUD operation
122
+ */
123
+ type ModelCrudCommon = {
124
+ /**
125
+ * Prisma query guard or a constant condition
126
+ */
127
+ guard: PolicyFunc | boolean;
128
+ /**
129
+ * Additional checker function for checking policies outside of Prisma
130
+ */
131
+ /**
132
+ * Additional checker function for checking policies outside of Prisma
133
+ */
134
+ entityChecker?: EntityChecker;
135
+ /**
136
+ * Permission checker function or a constant condition
137
+ */
138
+ permissionChecker?: PermissionCheckerFunc | boolean;
139
+ };
140
+ /**
141
+ * Policy definition for reading a model
142
+ */
143
+ type ModelReadDef = ModelCrudCommon;
144
+ /**
145
+ * Policy definition for creating a model
146
+ */
147
+ type ModelCreateDef = ModelCrudCommon & {
148
+ /**
149
+ * Create input validation function. Only generated when a create
150
+ * can be approved or denied based on input values.
151
+ */
152
+ inputChecker?: EntityCheckerFunc | boolean;
153
+ };
154
+ /**
155
+ * Policy definition for updating a model
156
+ */
157
+ type ModelUpdateDef = ModelCrudCommon;
158
+ /**
159
+ * Policy definition for deleting a model
160
+ */
161
+ type ModelDeleteDef = ModelCrudCommon;
162
+ /**
163
+ * Policy definition for post-update checking a model
164
+ */
165
+ type ModelPostUpdateDef = Exclude<ModelCrudCommon, 'permissionChecker'> & {
166
+ preUpdateSelector?: object;
167
+ };
168
+ /**
169
+ * CRUD policy definitions for a field
170
+ */
171
+ type FieldCrudDef = {
172
+ /**
173
+ * Field-level read policy
174
+ */
175
+ read: Record<FieldName, FieldReadDef>;
176
+ /**
177
+ * Field-level update policy
178
+ */
179
+ update: Record<FieldName, FieldUpdateDef>;
180
+ };
181
+ type FieldReadDef = {
182
+ /**
183
+ * Field-level Prisma query guard
184
+ */
185
+ guard?: PolicyFunc;
186
+ /**
187
+ * Entity checker
188
+ */
189
+ entityChecker?: EntityChecker;
190
+ /**
191
+ * Field-level read override Prisma query guard
192
+ */
193
+ overrideGuard?: PolicyFunc;
194
+ /**
195
+ * Entity checker for override policies
196
+ */
197
+ overrideEntityChecker?: EntityChecker;
198
+ };
199
+ type FieldUpdateDef = {
200
+ /**
201
+ * Field-level update Prisma query guard
202
+ */
203
+ guard?: PolicyFunc;
204
+ /**
205
+ * Additional entity checker
206
+ */
207
+ entityChecker?: EntityChecker;
208
+ /**
209
+ * Field-level update override Prisma query guard
210
+ */
211
+ overrideGuard?: PolicyFunc;
212
+ /**
213
+ * Additional entity checker for override policies
214
+ */
215
+ overrideEntityChecker?: EntityChecker;
216
+ };
217
+ /**
218
+ * Permission check API (`check()`) arguments
219
+ */
220
+ export type PermissionCheckArgs = {
221
+ operation: PolicyCrudKind;
222
+ where?: Record<string, number | string | boolean>;
223
+ };
224
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/enhancements/node/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { type FieldInfo, type ModelMeta } from '../../cross';
2
+ import type { DbClientContract } from '../../types';
3
+ /**
4
+ * Formats an object for pretty printing.
5
+ */
6
+ export declare function formatObject(value: any, multiLine?: boolean): string;
7
+ export declare function prismaClientValidationError(prisma: DbClientContract, prismaModule: any, message: string): Error;
8
+ export declare function prismaClientKnownRequestError(prisma: DbClientContract, prismaModule: any, ...args: unknown[]): Error;
9
+ export declare function prismaClientUnknownRequestError(prismaModule: any, ...args: unknown[]): Error;
10
+ export declare function isUnsafeMutate(model: string, args: any, modelMeta: ModelMeta): boolean;
11
+ export declare function isAutoIncrementIdField(field: FieldInfo): boolean | undefined;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.formatObject = formatObject;
7
+ exports.prismaClientValidationError = prismaClientValidationError;
8
+ exports.prismaClientKnownRequestError = prismaClientKnownRequestError;
9
+ exports.prismaClientUnknownRequestError = prismaClientUnknownRequestError;
10
+ exports.isUnsafeMutate = isUnsafeMutate;
11
+ exports.isAutoIncrementIdField = isAutoIncrementIdField;
12
+ const safe_json_stringify_1 = __importDefault(require("safe-json-stringify"));
13
+ const cross_1 = require("../../cross");
14
+ /**
15
+ * Formats an object for pretty printing.
16
+ */
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ function formatObject(value, multiLine = true) {
19
+ return multiLine ? (0, safe_json_stringify_1.default)(value, undefined, 2) : (0, safe_json_stringify_1.default)(value);
20
+ }
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ function prismaClientValidationError(prisma, prismaModule, message) {
23
+ throw new prismaModule.PrismaClientValidationError(message, { clientVersion: prisma._clientVersion });
24
+ }
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
+ function prismaClientKnownRequestError(prisma, prismaModule, ...args) {
27
+ return new prismaModule.PrismaClientKnownRequestError(...args);
28
+ }
29
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
+ function prismaClientUnknownRequestError(prismaModule, ...args) {
31
+ throw new prismaModule.PrismaClientUnknownRequestError(...args);
32
+ }
33
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
+ function isUnsafeMutate(model, args, modelMeta) {
35
+ if (!args) {
36
+ return false;
37
+ }
38
+ for (const k of Object.keys(args)) {
39
+ const field = (0, cross_1.resolveField)(modelMeta, model, k);
40
+ if (field && (isAutoIncrementIdField(field) || field.isForeignKey)) {
41
+ return true;
42
+ }
43
+ }
44
+ return false;
45
+ }
46
+ function isAutoIncrementIdField(field) {
47
+ return field.isId && field.isAutoIncrement;
48
+ }
49
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/enhancements/node/utils.ts"],"names":[],"mappings":";;;;;AAQA,oCAEC;AAGD,kEAEC;AAGD,sEAEC;AAGD,0EAEC;AAGD,wCAWC;AAED,wDAEC;AA3CD,8EAAoD;AACpD,uCAA2E;AAG3E;;GAEG;AACH,8DAA8D;AAC9D,SAAgB,YAAY,CAAC,KAAU,EAAE,SAAS,GAAG,IAAI;IACrD,OAAO,SAAS,CAAC,CAAC,CAAC,IAAA,6BAAiB,EAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,6BAAiB,EAAC,KAAK,CAAC,CAAC;AACzF,CAAC;AAED,8DAA8D;AAC9D,SAAgB,2BAA2B,CAAC,MAAwB,EAAE,YAAiB,EAAE,OAAe;IACpG,MAAM,IAAI,YAAY,CAAC,2BAA2B,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;AAC1G,CAAC;AAED,8DAA8D;AAC9D,SAAgB,6BAA6B,CAAC,MAAwB,EAAE,YAAiB,EAAE,GAAG,IAAe;IACzG,OAAO,IAAI,YAAY,CAAC,6BAA6B,CAAC,GAAG,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,8DAA8D;AAC9D,SAAgB,+BAA+B,CAAC,YAAiB,EAAE,GAAG,IAAe;IACjF,MAAM,IAAI,YAAY,CAAC,+BAA+B,CAAC,GAAG,IAAI,CAAC,CAAC;AACpE,CAAC;AAED,8DAA8D;AAC9D,SAAgB,cAAc,CAAC,KAAa,EAAE,IAAS,EAAE,SAAoB;IACzE,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAA,oBAAY,EAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,KAAK,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAgB,sBAAsB,CAAC,KAAgB;IACnD,OAAO,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,eAAe,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type FieldInfo, type ModelMeta } from '../../cross';
2
+ /**
3
+ * Context for visiting
4
+ */
5
+ export type WhereVisitorContext = {
6
+ /**
7
+ * Parent data, can be used to replace fields
8
+ */
9
+ parent: any;
10
+ /**
11
+ * Current field, undefined if toplevel
12
+ */
13
+ field?: FieldInfo;
14
+ };
15
+ /**
16
+ * WhereVisitor's callback actions
17
+ */
18
+ export type WhereVisitorCallback = {
19
+ field?: (field: FieldInfo, data: any) => Promise<unknown>;
20
+ };
21
+ /**
22
+ * Recursive visitor for where payload
23
+ */
24
+ export declare class WhereVisitor {
25
+ private readonly modelMeta;
26
+ private readonly callback;
27
+ constructor(modelMeta: ModelMeta, callback: WhereVisitorCallback);
28
+ /**
29
+ * Start visiting
30
+ */
31
+ visit(model: string, where: any): Promise<void>;
32
+ }
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
3
+ /* eslint-disable @typescript-eslint/no-explicit-any */
4
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
6
+ return new (P || (P = Promise))(function (resolve, reject) {
7
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
8
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
9
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
10
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
11
+ });
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.WhereVisitor = void 0;
15
+ const cross_1 = require("../../cross");
16
+ const FILTER_OPERATORS = [
17
+ 'equals',
18
+ 'not',
19
+ 'in',
20
+ 'notIn',
21
+ 'lt',
22
+ 'lte',
23
+ 'gt',
24
+ 'gte',
25
+ 'contains',
26
+ 'search',
27
+ 'startsWith',
28
+ 'endsWith',
29
+ ];
30
+ const RELATION_FILTER_OPERATORS = ['is', 'isNot', 'some', 'every', 'none'];
31
+ /**
32
+ * Recursive visitor for where payload
33
+ */
34
+ class WhereVisitor {
35
+ constructor(modelMeta, callback) {
36
+ this.modelMeta = modelMeta;
37
+ this.callback = callback;
38
+ }
39
+ /**
40
+ * Start visiting
41
+ */
42
+ visit(model, where) {
43
+ return __awaiter(this, void 0, void 0, function* () {
44
+ var _a, _b, _c, _d;
45
+ if (!where) {
46
+ return;
47
+ }
48
+ for (const [k, v] of Object.entries(where)) {
49
+ if (['AND', 'OR', 'NOT'].includes(k)) {
50
+ for (const item of (0, cross_1.enumerate)(v)) {
51
+ yield this.visit(model, item);
52
+ }
53
+ continue;
54
+ }
55
+ if (RELATION_FILTER_OPERATORS.includes(k)) {
56
+ // visit into filter body
57
+ yield this.visit(model, v);
58
+ continue;
59
+ }
60
+ const field = (0, cross_1.resolveField)(this.modelMeta, model, k);
61
+ if (!field) {
62
+ continue;
63
+ }
64
+ if (typeof v === 'object') {
65
+ const filterOp = Object.keys(v).find((f) => FILTER_OPERATORS.includes(f));
66
+ if (filterOp) {
67
+ // reach into filter value
68
+ const newValue = yield ((_b = (_a = this.callback).field) === null || _b === void 0 ? void 0 : _b.call(_a, field, v[filterOp]));
69
+ v[filterOp] = newValue;
70
+ continue;
71
+ }
72
+ if (Object.keys(v).some((f) => RELATION_FILTER_OPERATORS.includes(f))) {
73
+ // filter payload
74
+ yield this.visit(field.type, v);
75
+ continue;
76
+ }
77
+ }
78
+ // scalar field
79
+ const newValue = yield ((_d = (_c = this.callback).field) === null || _d === void 0 ? void 0 : _d.call(_c, field, v));
80
+ where[k] = newValue;
81
+ }
82
+ });
83
+ }
84
+ }
85
+ exports.WhereVisitor = WhereVisitor;
86
+ //# sourceMappingURL=where-visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where-visitor.js","sourceRoot":"","sources":["../../../src/enhancements/node/where-visitor.ts"],"names":[],"mappings":";AAAA,sEAAsE;AACtE,uDAAuD;;;;;;;;;;;;AAEvD,uCAAsF;AAwBtF,MAAM,gBAAgB,GAAG;IACrB,QAAQ;IACR,KAAK;IACL,IAAI;IACJ,OAAO;IACP,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,UAAU;IACV,QAAQ;IACR,YAAY;IACZ,UAAU;CACb,CAAC;AAEF,MAAM,yBAAyB,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAE3E;;GAEG;AACH,MAAa,YAAY;IACrB,YAA6B,SAAoB,EAAmB,QAA8B;QAArE,cAAS,GAAT,SAAS,CAAW;QAAmB,aAAQ,GAAR,QAAQ,CAAsB;IAAG,CAAC;IAEtG;;OAEG;IACG,KAAK,CAAC,KAAa,EAAE,KAAU;;;YACjC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO;YACX,CAAC;YAED,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnC,KAAK,MAAM,IAAI,IAAI,IAAA,iBAAS,EAAC,CAAC,CAAC,EAAE,CAAC;wBAC9B,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBAClC,CAAC;oBACD,SAAS;gBACb,CAAC;gBAED,IAAI,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBACxC,yBAAyB;oBACzB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBAC3B,SAAS;gBACb,CAAC;gBAED,MAAM,KAAK,GAAG,IAAA,oBAAY,EAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACrD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACT,SAAS;gBACb,CAAC;gBAED,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACxB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1E,IAAI,QAAQ,EAAE,CAAC;wBACX,0BAA0B;wBAC1B,MAAM,QAAQ,GAAG,MAAM,CAAA,MAAA,MAAA,IAAI,CAAC,QAAQ,EAAC,KAAK,mDAAG,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA,CAAC;wBACjE,CAAC,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;wBACvB,SAAS;oBACb,CAAC;oBAED,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBACpE,iBAAiB;wBACjB,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;wBAChC,SAAS;oBACb,CAAC;gBACL,CAAC;gBAED,eAAe;gBACf,MAAM,QAAQ,GAAG,MAAM,CAAA,MAAA,MAAA,IAAI,CAAC,QAAQ,EAAC,KAAK,mDAAG,KAAK,EAAE,CAAC,CAAC,CAAA,CAAC;gBACvD,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;YACxB,CAAC;QACL,CAAC;KAAA;CACJ;AAnDD,oCAmDC"}
package/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export * from './constants';
2
- export * from './enhancements';
2
+ export * from './cross';
3
+ export * from './enhance';
3
4
  export * from './error';
4
5
  export * from './types';
5
6
  export * from './validation';
6
7
  export * from './version';
7
- export * from './enhance';