@zenstackhq/runtime 1.0.0-beta.2 → 1.0.0-beta.20

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 (75) hide show
  1. package/browser/index.d.mts +13 -0
  2. package/browser/index.d.ts +13 -0
  3. package/browser/index.js +70 -0
  4. package/browser/index.js.map +1 -0
  5. package/browser/index.mjs +32 -0
  6. package/browser/index.mjs.map +1 -0
  7. package/constants.d.ts +59 -2
  8. package/constants.js +60 -2
  9. package/constants.js.map +1 -1
  10. package/enhancements/enhance.d.ts +18 -0
  11. package/enhancements/enhance.js +42 -0
  12. package/enhancements/enhance.js.map +1 -0
  13. package/enhancements/index.d.ts +5 -0
  14. package/enhancements/index.js +5 -0
  15. package/enhancements/index.js.map +1 -1
  16. package/enhancements/model-data-visitor.d.ts +16 -0
  17. package/enhancements/model-data-visitor.js +41 -0
  18. package/enhancements/model-data-visitor.js.map +1 -0
  19. package/enhancements/model-meta.d.ts +6 -1
  20. package/enhancements/model-meta.js +23 -2
  21. package/enhancements/model-meta.js.map +1 -1
  22. package/enhancements/nested-write-vistor.d.ts +21 -16
  23. package/enhancements/nested-write-vistor.js +73 -34
  24. package/enhancements/nested-write-vistor.js.map +1 -1
  25. package/enhancements/omit.d.ts +1 -1
  26. package/enhancements/policy/handler.d.ts +25 -15
  27. package/enhancements/policy/handler.js +771 -133
  28. package/enhancements/policy/handler.js.map +1 -1
  29. package/enhancements/policy/index.d.ts +5 -1
  30. package/enhancements/policy/index.js +53 -3
  31. package/enhancements/policy/index.js.map +1 -1
  32. package/enhancements/policy/logger.js +1 -1
  33. package/enhancements/policy/logger.js.map +1 -1
  34. package/enhancements/policy/policy-utils.d.ts +102 -46
  35. package/enhancements/policy/policy-utils.js +683 -550
  36. package/enhancements/policy/policy-utils.js.map +1 -1
  37. package/enhancements/preset.d.ts +3 -8
  38. package/enhancements/preset.js +2 -4
  39. package/enhancements/preset.js.map +1 -1
  40. package/enhancements/proxy.d.ts +3 -1
  41. package/enhancements/proxy.js +23 -12
  42. package/enhancements/proxy.js.map +1 -1
  43. package/enhancements/types.d.ts +25 -8
  44. package/enhancements/types.js +1 -0
  45. package/enhancements/types.js.map +1 -1
  46. package/enhancements/utils.d.ts +4 -0
  47. package/enhancements/utils.js +59 -8
  48. package/enhancements/utils.js.map +1 -1
  49. package/enhancements/where-visitor.d.ts +33 -0
  50. package/enhancements/where-visitor.js +87 -0
  51. package/enhancements/where-visitor.js.map +1 -0
  52. package/error.js +9 -3
  53. package/error.js.map +1 -1
  54. package/index.d.ts +3 -2
  55. package/index.js +3 -2
  56. package/index.js.map +1 -1
  57. package/package.json +33 -9
  58. package/types.d.ts +11 -2
  59. package/types.js +2 -0
  60. package/types.js.map +1 -1
  61. package/version.d.ts +5 -0
  62. package/version.js +34 -1
  63. package/version.js.map +1 -1
  64. package/zod/index.d.ts +2 -0
  65. package/zod/index.js +4 -0
  66. package/zod/input.d.ts +1 -0
  67. package/zod/input.js +8 -0
  68. package/zod/models.d.ts +1 -0
  69. package/zod/models.js +8 -0
  70. package/serialization-utils.d.ts +0 -1
  71. package/serialization-utils.js +0 -22
  72. package/serialization-utils.js.map +0 -1
  73. package/zod.d.ts +0 -10
  74. package/zod.js +0 -17
  75. package/zod.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Serialize the given value with superjson
3
+ */
4
+ declare function serialize(value: unknown): {
5
+ data: unknown;
6
+ meta: unknown;
7
+ };
8
+ /**
9
+ * Deserialize the given value with superjson using the given metadata
10
+ */
11
+ declare function deserialize(value: unknown, meta: any): unknown;
12
+
13
+ export { deserialize, serialize };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Serialize the given value with superjson
3
+ */
4
+ declare function serialize(value: unknown): {
5
+ data: unknown;
6
+ meta: unknown;
7
+ };
8
+ /**
9
+ * Deserialize the given value with superjson using the given metadata
10
+ */
11
+ declare function deserialize(value: unknown, meta: any): unknown;
12
+
13
+ export { deserialize, serialize };
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/browser/index.ts
31
+ var browser_exports = {};
32
+ __export(browser_exports, {
33
+ deserialize: () => deserialize,
34
+ serialize: () => serialize
35
+ });
36
+ module.exports = __toCommonJS(browser_exports);
37
+
38
+ // src/browser/serialization.ts
39
+ var import_buffer = require("buffer");
40
+ var import_decimal = __toESM(require("decimal.js"));
41
+ var import_superjson = __toESM(require("superjson"));
42
+ import_superjson.default.registerCustom(
43
+ {
44
+ isApplicable: (v) => import_decimal.default.isDecimal(v),
45
+ serialize: (v) => v.toJSON(),
46
+ deserialize: (v) => new import_decimal.default(v)
47
+ },
48
+ "Decimal"
49
+ );
50
+ import_superjson.default.registerCustom(
51
+ {
52
+ isApplicable: (v) => import_buffer.Buffer.isBuffer(v),
53
+ serialize: (v) => v.toString("base64"),
54
+ deserialize: (v) => import_buffer.Buffer.from(v, "base64")
55
+ },
56
+ "Bytes"
57
+ );
58
+ function serialize(value) {
59
+ const { json, meta } = import_superjson.default.serialize(value);
60
+ return { data: json, meta };
61
+ }
62
+ function deserialize(value, meta) {
63
+ return import_superjson.default.deserialize({ json: value, meta });
64
+ }
65
+ // Annotate the CommonJS export names for ESM import in node:
66
+ 0 && (module.exports = {
67
+ deserialize,
68
+ serialize
69
+ });
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/browser/index.ts","../../src/browser/serialization.ts"],"sourcesContent":["export * from './serialization';\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Buffer } from 'buffer';\nimport Decimal from 'decimal.js';\nimport SuperJSON from 'superjson';\n\nSuperJSON.registerCustom<Decimal, string>(\n {\n isApplicable: (v): v is Decimal => Decimal.isDecimal(v),\n serialize: (v) => v.toJSON(),\n deserialize: (v) => new Decimal(v),\n },\n 'Decimal'\n);\n\nSuperJSON.registerCustom<Buffer, string>(\n {\n isApplicable: (v): v is Buffer => Buffer.isBuffer(v),\n serialize: (v) => v.toString('base64'),\n deserialize: (v) => Buffer.from(v, 'base64'),\n },\n 'Bytes'\n);\n\n/**\n * Serialize the given value with superjson\n */\nexport function serialize(value: unknown): { data: unknown; meta: unknown } {\n const { json, meta } = SuperJSON.serialize(value);\n return { data: json, meta };\n}\n\n/**\n * Deserialize the given value with superjson using the given metadata\n */\nexport function deserialize(value: unknown, meta: any): unknown {\n return SuperJSON.deserialize({ json: value as any, meta });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,oBAAuB;AACvB,qBAAoB;AACpB,uBAAsB;AAEtB,iBAAAA,QAAU;AAAA,EACN;AAAA,IACI,cAAc,CAAC,MAAoB,eAAAC,QAAQ,UAAU,CAAC;AAAA,IACtD,WAAW,CAAC,MAAM,EAAE,OAAO;AAAA,IAC3B,aAAa,CAAC,MAAM,IAAI,eAAAA,QAAQ,CAAC;AAAA,EACrC;AAAA,EACA;AACJ;AAEA,iBAAAD,QAAU;AAAA,EACN;AAAA,IACI,cAAc,CAAC,MAAmB,qBAAO,SAAS,CAAC;AAAA,IACnD,WAAW,CAAC,MAAM,EAAE,SAAS,QAAQ;AAAA,IACrC,aAAa,CAAC,MAAM,qBAAO,KAAK,GAAG,QAAQ;AAAA,EAC/C;AAAA,EACA;AACJ;AAKO,SAAS,UAAU,OAAkD;AACxE,QAAM,EAAE,MAAM,KAAK,IAAI,iBAAAA,QAAU,UAAU,KAAK;AAChD,SAAO,EAAE,MAAM,MAAM,KAAK;AAC9B;AAKO,SAAS,YAAY,OAAgB,MAAoB;AAC5D,SAAO,iBAAAA,QAAU,YAAY,EAAE,MAAM,OAAc,KAAK,CAAC;AAC7D;","names":["SuperJSON","Decimal"]}
@@ -0,0 +1,32 @@
1
+ // src/browser/serialization.ts
2
+ import { Buffer } from "buffer";
3
+ import Decimal from "decimal.js";
4
+ import SuperJSON from "superjson";
5
+ SuperJSON.registerCustom(
6
+ {
7
+ isApplicable: (v) => Decimal.isDecimal(v),
8
+ serialize: (v) => v.toJSON(),
9
+ deserialize: (v) => new Decimal(v)
10
+ },
11
+ "Decimal"
12
+ );
13
+ SuperJSON.registerCustom(
14
+ {
15
+ isApplicable: (v) => Buffer.isBuffer(v),
16
+ serialize: (v) => v.toString("base64"),
17
+ deserialize: (v) => Buffer.from(v, "base64")
18
+ },
19
+ "Bytes"
20
+ );
21
+ function serialize(value) {
22
+ const { json, meta } = SuperJSON.serialize(value);
23
+ return { data: json, meta };
24
+ }
25
+ function deserialize(value, meta) {
26
+ return SuperJSON.deserialize({ json: value, meta });
27
+ }
28
+ export {
29
+ deserialize,
30
+ serialize
31
+ };
32
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/browser/serialization.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Buffer } from 'buffer';\nimport Decimal from 'decimal.js';\nimport SuperJSON from 'superjson';\n\nSuperJSON.registerCustom<Decimal, string>(\n {\n isApplicable: (v): v is Decimal => Decimal.isDecimal(v),\n serialize: (v) => v.toJSON(),\n deserialize: (v) => new Decimal(v),\n },\n 'Decimal'\n);\n\nSuperJSON.registerCustom<Buffer, string>(\n {\n isApplicable: (v): v is Buffer => Buffer.isBuffer(v),\n serialize: (v) => v.toString('base64'),\n deserialize: (v) => Buffer.from(v, 'base64'),\n },\n 'Bytes'\n);\n\n/**\n * Serialize the given value with superjson\n */\nexport function serialize(value: unknown): { data: unknown; meta: unknown } {\n const { json, meta } = SuperJSON.serialize(value);\n return { data: json, meta };\n}\n\n/**\n * Deserialize the given value with superjson using the given metadata\n */\nexport function deserialize(value: unknown, meta: any): unknown {\n return SuperJSON.deserialize({ json: value as any, meta });\n}\n"],"mappings":";AACA,SAAS,cAAc;AACvB,OAAO,aAAa;AACpB,OAAO,eAAe;AAEtB,UAAU;AAAA,EACN;AAAA,IACI,cAAc,CAAC,MAAoB,QAAQ,UAAU,CAAC;AAAA,IACtD,WAAW,CAAC,MAAM,EAAE,OAAO;AAAA,IAC3B,aAAa,CAAC,MAAM,IAAI,QAAQ,CAAC;AAAA,EACrC;AAAA,EACA;AACJ;AAEA,UAAU;AAAA,EACN;AAAA,IACI,cAAc,CAAC,MAAmB,OAAO,SAAS,CAAC;AAAA,IACnD,WAAW,CAAC,MAAM,EAAE,SAAS,QAAQ;AAAA,IACrC,aAAa,CAAC,MAAM,OAAO,KAAK,GAAG,QAAQ;AAAA,EAC/C;AAAA,EACA;AACJ;AAKO,SAAS,UAAU,OAAkD;AACxE,QAAM,EAAE,MAAM,KAAK,IAAI,UAAU,UAAU,KAAK;AAChD,SAAO,EAAE,MAAM,MAAM,KAAK;AAC9B;AAKO,SAAS,YAAY,OAAgB,MAAoB;AAC5D,SAAO,UAAU,YAAY,EAAE,MAAM,OAAc,KAAK,CAAC;AAC7D;","names":[]}
package/constants.d.ts CHANGED
@@ -15,11 +15,68 @@ export declare const GUARD_FIELD_NAME = "zenstack_guard";
15
15
  */
16
16
  export declare const AUXILIARY_FIELDS: string[];
17
17
  /**
18
- * Reasons for a CRUD operation to fail.
18
+ * Reasons for a CRUD operation to fail
19
19
  */
20
20
  export declare enum CrudFailureReason {
21
21
  /**
22
22
  * CRUD suceeded but the result was not readable.
23
23
  */
24
- RESULT_NOT_READABLE = "RESULT_NOT_READABLE"
24
+ RESULT_NOT_READABLE = "RESULT_NOT_READABLE",
25
+ /**
26
+ * CRUD failed because of a data validation rule violation.
27
+ */
28
+ DATA_VALIDATION_VIOLATION = "DATA_VALIDATION_VIOLATION"
25
29
  }
30
+ /**
31
+ * Prisma error codes used
32
+ */
33
+ export declare enum PrismaErrorCode {
34
+ /**
35
+ * Unique constraint failed
36
+ */
37
+ UNIQUE_CONSTRAINT_FAILED = "P2002",
38
+ /**
39
+ * A constraint failed on the database
40
+ */
41
+ CONSTRAINED_FAILED = "P2004",
42
+ /**
43
+ * The required connected records were not found
44
+ */
45
+ REQUIRED_CONNECTED_RECORD_NOT_FOUND = "P2018",
46
+ /**
47
+ * An operation failed because it depends on one or more records that were required but not found
48
+ */
49
+ DEPEND_ON_RECORD_NOT_FOUND = "P2025"
50
+ }
51
+ /**
52
+ * Field name for storing in-transaction flag
53
+ */
54
+ export declare const PRISMA_TX_FLAG = "$__zenstack_tx";
55
+ /**
56
+ * Field name for getting current enhancer
57
+ */
58
+ export declare const PRISMA_PROXY_ENHANCER = "$__zenstack_enhancer";
59
+ /**
60
+ * Minimum Prisma version supported
61
+ */
62
+ export declare const PRISMA_MINIMUM_VERSION = "4.8.0";
63
+ /**
64
+ * Selector function name for fetching pre-update entity values.
65
+ */
66
+ export declare const PRE_UPDATE_VALUE_SELECTOR = "preValueSelect";
67
+ /**
68
+ * Prefix for field-level read checker function name
69
+ */
70
+ export declare const FIELD_LEVEL_READ_CHECKER_PREFIX = "readFieldCheck$";
71
+ /**
72
+ * Field-level access control evaluation selector function name
73
+ */
74
+ export declare const FIELD_LEVEL_READ_CHECKER_SELECTOR = "readFieldSelect";
75
+ /**
76
+ * Prefix for field-level update guard function name
77
+ */
78
+ export declare const FIELD_LEVEL_UPDATE_GUARD_PREFIX = "updateFieldCheck$";
79
+ /**
80
+ * Flag that indicates if the model has field-level access control
81
+ */
82
+ export declare const HAS_FIELD_LEVEL_POLICY_FLAG = "hasFieldLevelPolicy";
package/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CrudFailureReason = exports.AUXILIARY_FIELDS = exports.GUARD_FIELD_NAME = exports.TRANSACTION_FIELD_NAME = exports.DEFAULT_PASSWORD_SALT_LENGTH = void 0;
3
+ exports.HAS_FIELD_LEVEL_POLICY_FLAG = exports.FIELD_LEVEL_UPDATE_GUARD_PREFIX = exports.FIELD_LEVEL_READ_CHECKER_SELECTOR = exports.FIELD_LEVEL_READ_CHECKER_PREFIX = exports.PRE_UPDATE_VALUE_SELECTOR = exports.PRISMA_MINIMUM_VERSION = exports.PRISMA_PROXY_ENHANCER = exports.PRISMA_TX_FLAG = exports.PrismaErrorCode = exports.CrudFailureReason = exports.AUXILIARY_FIELDS = exports.GUARD_FIELD_NAME = exports.TRANSACTION_FIELD_NAME = exports.DEFAULT_PASSWORD_SALT_LENGTH = void 0;
4
4
  /**
5
5
  * Default length of password hash salt (used by bcryptjs to hash password)
6
6
  */
@@ -18,7 +18,7 @@ exports.GUARD_FIELD_NAME = 'zenstack_guard';
18
18
  */
19
19
  exports.AUXILIARY_FIELDS = [exports.TRANSACTION_FIELD_NAME, exports.GUARD_FIELD_NAME];
20
20
  /**
21
- * Reasons for a CRUD operation to fail.
21
+ * Reasons for a CRUD operation to fail
22
22
  */
23
23
  var CrudFailureReason;
24
24
  (function (CrudFailureReason) {
@@ -26,5 +26,63 @@ var CrudFailureReason;
26
26
  * CRUD suceeded but the result was not readable.
27
27
  */
28
28
  CrudFailureReason["RESULT_NOT_READABLE"] = "RESULT_NOT_READABLE";
29
+ /**
30
+ * CRUD failed because of a data validation rule violation.
31
+ */
32
+ CrudFailureReason["DATA_VALIDATION_VIOLATION"] = "DATA_VALIDATION_VIOLATION";
29
33
  })(CrudFailureReason = exports.CrudFailureReason || (exports.CrudFailureReason = {}));
34
+ /**
35
+ * Prisma error codes used
36
+ */
37
+ var PrismaErrorCode;
38
+ (function (PrismaErrorCode) {
39
+ /**
40
+ * Unique constraint failed
41
+ */
42
+ PrismaErrorCode["UNIQUE_CONSTRAINT_FAILED"] = "P2002";
43
+ /**
44
+ * A constraint failed on the database
45
+ */
46
+ PrismaErrorCode["CONSTRAINED_FAILED"] = "P2004";
47
+ /**
48
+ * The required connected records were not found
49
+ */
50
+ PrismaErrorCode["REQUIRED_CONNECTED_RECORD_NOT_FOUND"] = "P2018";
51
+ /**
52
+ * An operation failed because it depends on one or more records that were required but not found
53
+ */
54
+ PrismaErrorCode["DEPEND_ON_RECORD_NOT_FOUND"] = "P2025";
55
+ })(PrismaErrorCode = exports.PrismaErrorCode || (exports.PrismaErrorCode = {}));
56
+ /**
57
+ * Field name for storing in-transaction flag
58
+ */
59
+ exports.PRISMA_TX_FLAG = '$__zenstack_tx';
60
+ /**
61
+ * Field name for getting current enhancer
62
+ */
63
+ exports.PRISMA_PROXY_ENHANCER = '$__zenstack_enhancer';
64
+ /**
65
+ * Minimum Prisma version supported
66
+ */
67
+ exports.PRISMA_MINIMUM_VERSION = '4.8.0';
68
+ /**
69
+ * Selector function name for fetching pre-update entity values.
70
+ */
71
+ exports.PRE_UPDATE_VALUE_SELECTOR = 'preValueSelect';
72
+ /**
73
+ * Prefix for field-level read checker function name
74
+ */
75
+ exports.FIELD_LEVEL_READ_CHECKER_PREFIX = 'readFieldCheck$';
76
+ /**
77
+ * Field-level access control evaluation selector function name
78
+ */
79
+ exports.FIELD_LEVEL_READ_CHECKER_SELECTOR = 'readFieldSelect';
80
+ /**
81
+ * Prefix for field-level update guard function name
82
+ */
83
+ exports.FIELD_LEVEL_UPDATE_GUARD_PREFIX = 'updateFieldCheck$';
84
+ /**
85
+ * Flag that indicates if the model has field-level access control
86
+ */
87
+ exports.HAS_FIELD_LEVEL_POLICY_FLAG = 'hasFieldLevelPolicy';
30
88
  //# sourceMappingURL=constants.js.map
package/constants.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;GAEG;AACU,QAAA,sBAAsB,GAAG,sBAAsB,CAAC;AAE7D;;GAEG;AACU,QAAA,gBAAgB,GAAG,gBAAgB,CAAC;AAEjD;;GAEG;AACU,QAAA,gBAAgB,GAAG,CAAC,8BAAsB,EAAE,wBAAgB,CAAC,CAAC;AAE3E;;GAEG;AACH,IAAY,iBAKX;AALD,WAAY,iBAAiB;IACzB;;OAEG;IACH,gEAA2C,CAAA;AAC/C,CAAC,EALW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAK5B"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;GAEG;AACU,QAAA,sBAAsB,GAAG,sBAAsB,CAAC;AAE7D;;GAEG;AACU,QAAA,gBAAgB,GAAG,gBAAgB,CAAC;AAEjD;;GAEG;AACU,QAAA,gBAAgB,GAAG,CAAC,8BAAsB,EAAE,wBAAgB,CAAC,CAAC;AAE3E;;GAEG;AACH,IAAY,iBAUX;AAVD,WAAY,iBAAiB;IACzB;;OAEG;IACH,gEAA2C,CAAA;IAE3C;;OAEG;IACH,4EAAuD,CAAA;AAC3D,CAAC,EAVW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAU5B;AAED;;GAEG;AACH,IAAY,eAoBX;AApBD,WAAY,eAAe;IACvB;;OAEG;IACH,qDAAkC,CAAA;IAElC;;OAEG;IACH,+CAA4B,CAAA;IAE5B;;OAEG;IACH,gEAA6C,CAAA;IAE7C;;OAEG;IACH,uDAAoC,CAAA;AACxC,CAAC,EApBW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAoB1B;AAED;;GAEG;AACU,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAE/C;;GAEG;AACU,QAAA,qBAAqB,GAAG,sBAAsB,CAAC;AAE5D;;GAEG;AACU,QAAA,sBAAsB,GAAG,OAAO,CAAC;AAE9C;;GAEG;AACU,QAAA,yBAAyB,GAAG,gBAAgB,CAAC;AAE1D;;GAEG;AACU,QAAA,+BAA+B,GAAG,iBAAiB,CAAC;AAEjE;;GAEG;AACU,QAAA,iCAAiC,GAAG,iBAAiB,CAAC;AAEnE;;GAEG;AACU,QAAA,+BAA+B,GAAG,mBAAmB,CAAC;AAEnE;;GAEG;AACU,QAAA,2BAA2B,GAAG,qBAAqB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { WithOmitOptions } from './omit';
2
+ import { WithPasswordOptions } from './password';
3
+ import { WithPolicyContext, WithPolicyOptions } from './policy';
4
+ /**
5
+ * Options @see enhance
6
+ */
7
+ export type EnhancementOptions = WithPolicyOptions & WithPasswordOptions & WithOmitOptions;
8
+ /**
9
+ * Gets a Prisma client enhanced with all essential behaviors, including access
10
+ * policy, field validation, field omission and password hashing.
11
+ *
12
+ * It's a shortcut for calling withOmit(withPassword(withPolicy(prisma, options))).
13
+ *
14
+ * @param prisma The Prisma client to enhance.
15
+ * @param context The context to for evaluating access policies.
16
+ * @param options Options.
17
+ */
18
+ export declare function enhance<DbClient extends object>(prisma: DbClient, context?: WithPolicyContext, options?: EnhancementOptions): DbClient;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.enhance = void 0;
4
+ const model_meta_1 = require("./model-meta");
5
+ const omit_1 = require("./omit");
6
+ const password_1 = require("./password");
7
+ const policy_1 = require("./policy");
8
+ let hasPassword = undefined;
9
+ let hasOmit = undefined;
10
+ /**
11
+ * Gets a Prisma client enhanced with all essential behaviors, including access
12
+ * policy, field validation, field omission and password hashing.
13
+ *
14
+ * It's a shortcut for calling withOmit(withPassword(withPolicy(prisma, options))).
15
+ *
16
+ * @param prisma The Prisma client to enhance.
17
+ * @param context The context to for evaluating access policies.
18
+ * @param options Options.
19
+ */
20
+ function enhance(prisma, context, options) {
21
+ var _a;
22
+ let result = prisma;
23
+ if (hasPassword === undefined || hasOmit === undefined) {
24
+ const modelMeta = (_a = options === null || options === void 0 ? void 0 : options.modelMeta) !== null && _a !== void 0 ? _a : (0, model_meta_1.getDefaultModelMeta)();
25
+ const allFields = Object.values(modelMeta.fields).flatMap((modelInfo) => Object.values(modelInfo));
26
+ hasPassword = allFields.some((field) => { var _a; return (_a = field.attributes) === null || _a === void 0 ? void 0 : _a.some((attr) => attr.name === '@password'); });
27
+ hasOmit = allFields.some((field) => { var _a; return (_a = field.attributes) === null || _a === void 0 ? void 0 : _a.some((attr) => attr.name === '@omit'); });
28
+ }
29
+ if (hasPassword) {
30
+ // @password proxy
31
+ result = (0, password_1.withPassword)(result, options);
32
+ }
33
+ if (hasOmit) {
34
+ // @omit proxy
35
+ result = (0, omit_1.withOmit)(result, options);
36
+ }
37
+ // policy proxy
38
+ result = (0, policy_1.withPolicy)(result, context, options);
39
+ return result;
40
+ }
41
+ exports.enhance = enhance;
42
+ //# sourceMappingURL=enhance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enhance.js","sourceRoot":"","sources":["../../src/enhancements/enhance.ts"],"names":[],"mappings":";;;AAAA,6CAAmD;AACnD,iCAAmD;AACnD,yCAA+D;AAC/D,qCAA4E;AAO5E,IAAI,WAAW,GAAwB,SAAS,CAAC;AACjD,IAAI,OAAO,GAAwB,SAAS,CAAC;AAE7C;;;;;;;;;GASG;AACH,SAAgB,OAAO,CACnB,MAAgB,EAChB,OAA2B,EAC3B,OAA4B;;IAE5B,IAAI,MAAM,GAAG,MAAM,CAAC;IAEpB,IAAI,WAAW,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE;QACpD,MAAM,SAAS,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,mCAAI,IAAA,gCAAmB,GAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACnG,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,WAAC,OAAA,MAAA,KAAK,CAAC,UAAU,0CAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAA,EAAA,CAAC,CAAC;QACrG,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,WAAC,OAAA,MAAA,KAAK,CAAC,UAAU,0CAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAA,EAAA,CAAC,CAAC;KAChG;IAED,IAAI,WAAW,EAAE;QACb,kBAAkB;QAClB,MAAM,GAAG,IAAA,uBAAY,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC1C;IAED,IAAI,OAAO,EAAE;QACT,cAAc;QACd,MAAM,GAAG,IAAA,eAAQ,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACtC;IAED,eAAe;IACf,MAAM,GAAG,IAAA,mBAAU,EAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE9C,OAAO,MAAM,CAAC;AAClB,CAAC;AA5BD,0BA4BC"}
@@ -1,5 +1,10 @@
1
+ export * from './model-meta';
2
+ export * from './nested-write-vistor';
1
3
  export * from './omit';
2
4
  export * from './password';
3
5
  export * from './policy';
4
6
  export * from './preset';
7
+ export * from './enhance';
8
+ export * from './types';
5
9
  export * from './utils';
10
+ export * from './where-visitor';
@@ -14,9 +14,14 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./model-meta"), exports);
18
+ __exportStar(require("./nested-write-vistor"), exports);
17
19
  __exportStar(require("./omit"), exports);
18
20
  __exportStar(require("./password"), exports);
19
21
  __exportStar(require("./policy"), exports);
20
22
  __exportStar(require("./preset"), exports);
23
+ __exportStar(require("./enhance"), exports);
24
+ __exportStar(require("./types"), exports);
21
25
  __exportStar(require("./utils"), exports);
26
+ __exportStar(require("./where-visitor"), exports);
22
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enhancements/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,6CAA2B;AAC3B,2CAAyB;AACzB,2CAAyB;AACzB,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/enhancements/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,wDAAsC;AACtC,yCAAuB;AACvB,6CAA2B;AAC3B,2CAAyB;AACzB,2CAAyB;AACzB,4CAA0B;AAC1B,0CAAwB;AACxB,0CAAwB;AACxB,kDAAgC"}
@@ -0,0 +1,16 @@
1
+ import { ModelMeta } from './types';
2
+ /**
3
+ * Callback for @see ModelDataVisitor.
4
+ */
5
+ export type ModelDataVisitorCallback = (model: string, data: any, scalarData: any) => void;
6
+ /**
7
+ * Visitor that traverses data returned by a Prisma query.
8
+ */
9
+ export declare class ModelDataVisitor {
10
+ private modelMeta;
11
+ constructor(modelMeta: ModelMeta);
12
+ /**
13
+ * Visits the given model data.
14
+ */
15
+ visit(model: string, data: any, callback: ModelDataVisitorCallback): void;
16
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModelDataVisitor = void 0;
4
+ /* eslint-disable @typescript-eslint/no-explicit-any */
5
+ const model_meta_1 = require("./model-meta");
6
+ /**
7
+ * Visitor that traverses data returned by a Prisma query.
8
+ */
9
+ class ModelDataVisitor {
10
+ constructor(modelMeta) {
11
+ this.modelMeta = modelMeta;
12
+ }
13
+ /**
14
+ * Visits the given model data.
15
+ */
16
+ visit(model, data, callback) {
17
+ if (!data || typeof data !== 'object') {
18
+ return;
19
+ }
20
+ const scalarData = {};
21
+ const subTasks = [];
22
+ for (const [k, v] of Object.entries(data)) {
23
+ const field = (0, model_meta_1.resolveField)(this.modelMeta, model, k);
24
+ if (field && field.isDataModel) {
25
+ if (field.isArray && Array.isArray(v)) {
26
+ subTasks.push(...v.map((item) => ({ model: field.type, data: item })));
27
+ }
28
+ else {
29
+ subTasks.push({ model: field.type, data: v });
30
+ }
31
+ }
32
+ else {
33
+ scalarData[k] = v;
34
+ }
35
+ }
36
+ callback(model, data, scalarData);
37
+ subTasks.forEach(({ model, data }) => this.visit(model, data, callback));
38
+ }
39
+ }
40
+ exports.ModelDataVisitor = ModelDataVisitor;
41
+ //# sourceMappingURL=model-data-visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-data-visitor.js","sourceRoot":"","sources":["../../src/enhancements/model-data-visitor.ts"],"names":[],"mappings":";;;AAAA,uDAAuD;AACvD,6CAA4C;AAQ5C;;GAEG;AACH,MAAa,gBAAgB;IACzB,YAAoB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAE5C;;OAEG;IACH,KAAK,CAAC,KAAa,EAAE,IAAS,EAAE,QAAkC;QAC9D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YACnC,OAAO;SACV;QAED,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAwC,EAAE,CAAC;QAEzD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACvC,MAAM,KAAK,GAAG,IAAA,yBAAY,EAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE;gBAC5B,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACnC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;iBAC1E;qBAAM;oBACH,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;iBACjD;aACJ;iBAAM;gBACH,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aACrB;SACJ;QAED,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAClC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7E,CAAC;CACJ;AA9BD,4CA8BC"}
@@ -1,3 +1,4 @@
1
+ import { FieldInfo } from '../types';
1
2
  import { ModelMeta } from './types';
2
3
  /**
3
4
  * Load model meta from standard location.
@@ -6,4 +7,8 @@ export declare function getDefaultModelMeta(): ModelMeta;
6
7
  /**
7
8
  * Resolves a model field to its metadata. Returns undefined if not found.
8
9
  */
9
- export declare function resolveField(modelMeta: ModelMeta, model: string, field: string): import("..").FieldInfo;
10
+ export declare function resolveField(modelMeta: ModelMeta, model: string, field: string): FieldInfo | undefined;
11
+ /**
12
+ * Gets all fields of a model.
13
+ */
14
+ export declare function getFields(modelMeta: ModelMeta, model: string): Record<string, FieldInfo>;
@@ -1,16 +1,30 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolveField = exports.getDefaultModelMeta = void 0;
6
+ exports.getFields = exports.resolveField = exports.getDefaultModelMeta = void 0;
7
+ /* eslint-disable @typescript-eslint/no-var-requires */
4
8
  const lower_case_first_1 = require("lower-case-first");
9
+ const path_1 = __importDefault(require("path"));
5
10
  /**
6
11
  * Load model meta from standard location.
7
12
  */
8
13
  function getDefaultModelMeta() {
9
14
  try {
10
- // eslint-disable-next-line @typescript-eslint/no-var-requires
15
+ // normal load
11
16
  return require('.zenstack/model-meta').default;
12
17
  }
13
18
  catch (_a) {
19
+ if (process.env.ZENSTACK_TEST === '1') {
20
+ try {
21
+ // special handling for running as tests, try resolving relative to CWD
22
+ return require(path_1.default.join(process.cwd(), 'node_modules', '.zenstack', 'model-meta')).default;
23
+ }
24
+ catch (_b) {
25
+ throw new Error('Model meta cannot be loaded. Please make sure "zenstack generate" has been run.');
26
+ }
27
+ }
14
28
  throw new Error('Model meta cannot be loaded. Please make sure "zenstack generate" has been run.');
15
29
  }
16
30
  }
@@ -22,4 +36,11 @@ function resolveField(modelMeta, model, field) {
22
36
  return modelMeta.fields[(0, lower_case_first_1.lowerCaseFirst)(model)][field];
23
37
  }
24
38
  exports.resolveField = resolveField;
39
+ /**
40
+ * Gets all fields of a model.
41
+ */
42
+ function getFields(modelMeta, model) {
43
+ return modelMeta.fields[(0, lower_case_first_1.lowerCaseFirst)(model)];
44
+ }
45
+ exports.getFields = getFields;
25
46
  //# sourceMappingURL=model-meta.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-meta.js","sourceRoot":"","sources":["../../src/enhancements/model-meta.ts"],"names":[],"mappings":";;;AAAA,uDAAkD;AAGlD;;GAEG;AACH,SAAgB,mBAAmB;IAC/B,IAAI;QACA,8DAA8D;QAC9D,OAAO,OAAO,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC;KAClD;IAAC,WAAM;QACJ,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;KACtG;AACL,CAAC;AAPD,kDAOC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,SAAoB,EAAE,KAAa,EAAE,KAAa;IAC3E,OAAO,SAAS,CAAC,MAAM,CAAC,IAAA,iCAAc,EAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAFD,oCAEC"}
1
+ {"version":3,"file":"model-meta.js","sourceRoot":"","sources":["../../src/enhancements/model-meta.ts"],"names":[],"mappings":";;;;;;AAAA,uDAAuD;AACvD,uDAAkD;AAClD,gDAAwB;AAIxB;;GAEG;AACH,SAAgB,mBAAmB;IAC/B,IAAI;QACA,cAAc;QACd,OAAO,OAAO,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC;KAClD;IAAC,WAAM;QACJ,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,EAAE;YACnC,IAAI;gBACA,uEAAuE;gBACvE,OAAO,OAAO,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;aAC/F;YAAC,WAAM;gBACJ,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;aACtG;SACJ;QACD,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;KACtG;AACL,CAAC;AAfD,kDAeC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,SAAoB,EAAE,KAAa,EAAE,KAAa;IAC3E,OAAO,SAAS,CAAC,MAAM,CAAC,IAAA,iCAAc,EAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAFD,oCAEC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,SAAoB,EAAE,KAAa;IACzD,OAAO,SAAS,CAAC,MAAM,CAAC,IAAA,iCAAc,EAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC;AAFD,8BAEC"}
@@ -2,13 +2,14 @@ import { FieldInfo, PrismaWriteActionType } from '../types';
2
2
  import { ModelMeta } from './types';
3
3
  type NestingPathItem = {
4
4
  field?: FieldInfo;
5
+ model: string;
5
6
  where: any;
6
7
  unique: boolean;
7
8
  };
8
9
  /**
9
10
  * Context for visiting
10
11
  */
11
- export type VisitorContext = {
12
+ export type NestedWriteVisitorContext = {
12
13
  /**
13
14
  * Parent data, can be used to replace fields
14
15
  */
@@ -23,35 +24,39 @@ export type VisitorContext = {
23
24
  nestingPath: NestingPathItem[];
24
25
  };
25
26
  /**
26
- * NestedWriteVisitor's callback actions
27
+ * NestedWriteVisitor's callback actions. A call back function should return true or void to indicate
28
+ * that the visitor should continue traversing its children, or false to stop. It can also return an object
29
+ * to let the visitor traverse it instead of its original children.
27
30
  */
28
31
  export type NestedWriterVisitorCallback = {
29
- create?: (model: string, args: any[], context: VisitorContext) => Promise<void>;
32
+ create?: (model: string, args: any[], context: NestedWriteVisitorContext) => Promise<boolean | void>;
33
+ createMany?: (model: string, args: {
34
+ data: any;
35
+ skipDuplicates?: boolean;
36
+ }, context: NestedWriteVisitorContext) => Promise<boolean | object | void>;
30
37
  connectOrCreate?: (model: string, args: {
31
38
  where: object;
32
39
  create: any;
33
- }, context: VisitorContext) => Promise<void>;
34
- connect?: (model: string, args: object, context: VisitorContext) => Promise<void>;
35
- disconnect?: (model: string, args: object, context: VisitorContext) => Promise<void>;
36
- update?: (model: string, args: {
37
- where: object;
38
- data: any;
39
- }, context: VisitorContext) => Promise<void>;
40
+ }, context: NestedWriteVisitorContext) => Promise<boolean | object | void>;
41
+ connect?: (model: string, args: object, context: NestedWriteVisitorContext) => Promise<boolean | object | void>;
42
+ disconnect?: (model: string, args: object, context: NestedWriteVisitorContext) => Promise<boolean | object | void>;
43
+ set?: (model: string, args: object, context: NestedWriteVisitorContext) => Promise<boolean | object | void>;
44
+ update?: (model: string, args: object, context: NestedWriteVisitorContext) => Promise<boolean | object | void>;
40
45
  updateMany?: (model: string, args: {
41
46
  where?: object;
42
47
  data: any;
43
- }, context: VisitorContext) => Promise<void>;
48
+ }, context: NestedWriteVisitorContext) => Promise<boolean | object | void>;
44
49
  upsert?: (model: string, args: {
45
50
  where: object;
46
51
  create: any;
47
52
  update: any;
48
- }, context: VisitorContext) => Promise<void>;
49
- delete?: (model: string, args: object | boolean, context: VisitorContext) => Promise<void>;
50
- deleteMany?: (model: string, args: any | object, context: VisitorContext) => Promise<void>;
51
- field?: (field: FieldInfo, action: PrismaWriteActionType, data: any, context: VisitorContext) => Promise<void>;
53
+ }, context: NestedWriteVisitorContext) => Promise<boolean | object | void>;
54
+ delete?: (model: string, args: object | boolean, context: NestedWriteVisitorContext) => Promise<boolean | object | void>;
55
+ deleteMany?: (model: string, args: any | object, context: NestedWriteVisitorContext) => Promise<boolean | object | void>;
56
+ field?: (field: FieldInfo, action: PrismaWriteActionType, data: any, context: NestedWriteVisitorContext) => Promise<void>;
52
57
  };
53
58
  /**
54
- * Recursive visitor for nested write (create/update) payload
59
+ * Recursive visitor for nested write (create/update) payload.
55
60
  */
56
61
  export declare class NestedWriteVisitor {
57
62
  private readonly modelMeta;