zenstack 0.6.0-pre.9 → 1.0.0-alpha.19

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 (133) hide show
  1. package/cli/cli-error.d.ts +5 -0
  2. package/cli/cli-error.js +12 -0
  3. package/cli/cli-error.js.map +1 -0
  4. package/cli/cli-util.d.ts +18 -0
  5. package/cli/cli-util.js +122 -0
  6. package/cli/cli-util.js.map +1 -0
  7. package/cli/index.d.ts +14 -0
  8. package/cli/index.js +72 -6529
  9. package/cli/index.js.map +1 -0
  10. package/cli/plugin-runner.d.ts +14 -0
  11. package/cli/plugin-runner.js +133 -0
  12. package/cli/plugin-runner.js.map +1 -0
  13. package/global.d.js +1 -0
  14. package/global.d.js.map +1 -0
  15. package/language-server/constants.d.ts +12 -0
  16. package/language-server/constants.js +24 -0
  17. package/language-server/constants.js.map +1 -0
  18. package/language-server/main.d.ts +1 -0
  19. package/language-server/main.js +20 -6436
  20. package/language-server/main.js.map +1 -0
  21. package/language-server/types.d.ts +10 -0
  22. package/language-server/types.js +1 -0
  23. package/language-server/types.js.map +1 -0
  24. package/language-server/utils.d.ts +10 -0
  25. package/language-server/utils.js +28 -0
  26. package/language-server/utils.js.map +1 -0
  27. package/language-server/validator/attribute-validator.d.ts +9 -0
  28. package/language-server/validator/attribute-validator.js +15 -0
  29. package/language-server/validator/attribute-validator.js.map +1 -0
  30. package/language-server/validator/datamodel-validator.d.ts +16 -0
  31. package/language-server/validator/datamodel-validator.js +365 -0
  32. package/language-server/validator/datamodel-validator.js.map +1 -0
  33. package/language-server/validator/datasource-validator.d.ts +13 -0
  34. package/language-server/validator/datasource-validator.js +85 -0
  35. package/language-server/validator/datasource-validator.js.map +1 -0
  36. package/language-server/validator/enum-validator.d.ts +9 -0
  37. package/language-server/validator/enum-validator.js +18 -0
  38. package/language-server/validator/enum-validator.js.map +1 -0
  39. package/language-server/validator/expression-validator.d.ts +11 -0
  40. package/language-server/validator/expression-validator.js +40 -0
  41. package/language-server/validator/expression-validator.js.map +1 -0
  42. package/language-server/validator/schema-validator.d.ts +10 -0
  43. package/language-server/validator/schema-validator.js +35 -0
  44. package/language-server/validator/schema-validator.js.map +1 -0
  45. package/language-server/validator/utils.d.ts +24 -0
  46. package/language-server/validator/utils.js +116 -0
  47. package/language-server/validator/utils.js.map +1 -0
  48. package/language-server/validator/zmodel-validator.d.ts +21 -0
  49. package/language-server/validator/zmodel-validator.js +72 -0
  50. package/language-server/validator/zmodel-validator.js.map +1 -0
  51. package/language-server/zmodel-linker.d.ts +29 -0
  52. package/language-server/zmodel-linker.js +364 -0
  53. package/language-server/zmodel-linker.js.map +1 -0
  54. package/language-server/zmodel-module.d.ts +41 -0
  55. package/language-server/zmodel-module.js +83 -0
  56. package/language-server/zmodel-module.js.map +1 -0
  57. package/language-server/zmodel-scope.d.ts +10 -0
  58. package/language-server/zmodel-scope.js +34 -0
  59. package/language-server/zmodel-scope.js.map +1 -0
  60. package/language-server/zmodel-workspace-manager.d.ts +8 -0
  61. package/language-server/zmodel-workspace-manager.js +25 -0
  62. package/language-server/zmodel-workspace-manager.js.map +1 -0
  63. package/package.json +23 -18
  64. package/plugins/access-policy/expression-writer.d.ts +38 -0
  65. package/plugins/access-policy/expression-writer.js +323 -0
  66. package/plugins/access-policy/expression-writer.js.map +1 -0
  67. package/plugins/access-policy/index.d.ts +4 -0
  68. package/plugins/access-policy/index.js +15 -0
  69. package/plugins/access-policy/index.js.map +1 -0
  70. package/plugins/access-policy/policy-guard-generator.d.ts +15 -0
  71. package/plugins/access-policy/policy-guard-generator.js +345 -0
  72. package/plugins/access-policy/policy-guard-generator.js.map +1 -0
  73. package/plugins/access-policy/typescript-expression-transformer.d.ts +26 -0
  74. package/plugins/access-policy/typescript-expression-transformer.js +110 -0
  75. package/plugins/access-policy/typescript-expression-transformer.js.map +1 -0
  76. package/plugins/access-policy/utils.d.ts +5 -0
  77. package/plugins/access-policy/utils.js +16 -0
  78. package/plugins/access-policy/utils.js.map +1 -0
  79. package/plugins/access-policy/zod-schema-generator.d.ts +12 -0
  80. package/plugins/access-policy/zod-schema-generator.js +174 -0
  81. package/plugins/access-policy/zod-schema-generator.js.map +1 -0
  82. package/plugins/model-meta/index.d.ts +4 -0
  83. package/plugins/model-meta/index.js +130 -0
  84. package/plugins/model-meta/index.js.map +1 -0
  85. package/plugins/plugin-utils.d.ts +16 -0
  86. package/plugins/plugin-utils.js +58 -0
  87. package/plugins/plugin-utils.js.map +1 -0
  88. package/plugins/prisma/indent-string.d.ts +4 -0
  89. package/plugins/prisma/indent-string.js +16 -0
  90. package/plugins/prisma/indent-string.js.map +1 -0
  91. package/plugins/prisma/index.d.ts +4 -0
  92. package/plugins/prisma/index.js +15 -3740
  93. package/plugins/prisma/index.js.map +1 -0
  94. package/plugins/prisma/prisma-builder.d.ts +130 -0
  95. package/plugins/prisma/prisma-builder.js +271 -0
  96. package/plugins/prisma/prisma-builder.js.map +1 -0
  97. package/plugins/prisma/schema-generator.d.ts +24 -0
  98. package/plugins/prisma/schema-generator.js +212 -0
  99. package/plugins/prisma/schema-generator.js.map +1 -0
  100. package/plugins/prisma/zmodel-code-generator.d.ts +27 -0
  101. package/plugins/prisma/zmodel-code-generator.js +110 -0
  102. package/plugins/prisma/zmodel-code-generator.js.map +1 -0
  103. package/res/prism-zmodel.js +2 -4
  104. package/res/starter.zmodel +47 -0
  105. package/res/stdlib.zmodel +12 -1
  106. package/telemetry.d.ts +21 -0
  107. package/telemetry.js +102 -0
  108. package/telemetry.js.map +1 -0
  109. package/types.d.ts +11 -0
  110. package/types.js +1 -0
  111. package/types.js.map +1 -0
  112. package/utils/ast-utils.d.ts +15 -0
  113. package/utils/ast-utils.js +79 -0
  114. package/utils/ast-utils.js.map +1 -0
  115. package/utils/exec-utils.d.ts +6 -0
  116. package/utils/exec-utils.js +22 -0
  117. package/utils/exec-utils.js.map +1 -0
  118. package/utils/pkg-utils.d.ts +3 -0
  119. package/utils/pkg-utils.js +43 -0
  120. package/utils/pkg-utils.js.map +1 -0
  121. package/utils/version-utils.d.ts +1 -0
  122. package/utils/version-utils.js +15 -0
  123. package/utils/version-utils.js.map +1 -0
  124. package/asset/logo-256-bg.png +0 -0
  125. package/asset/logo-dark-256.png +0 -0
  126. package/asset/logo-light-256.png +0 -0
  127. package/extension.js +0 -39
  128. package/plugins/policy-guard/index.js +0 -4289
  129. package/plugins/react-hooks/index.js +0 -4318
  130. package/plugins/trpc/index.js +0 -5386
  131. package/plugins/zod/index.js +0 -4808
  132. package/res/package.template.json +0 -9
  133. package/res/tsconfig.template.json +0 -17
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _langium = require("langium");
8
+ var _path = _interopRequireDefault(require("path"));
9
+ var _vscodeUri = require("vscode-uri");
10
+ var _constants = require("./constants");
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ /**
13
+ * Custom Langium WorkspaceManager implementation which automatically loads stdlib.zmodel
14
+ */
15
+ class ZModelWorkspaceManager extends _langium.DefaultWorkspaceManager {
16
+ async loadAdditionalDocuments(_folders, _collector) {
17
+ await super.loadAdditionalDocuments(_folders, _collector);
18
+ const stdLibUri = _vscodeUri.URI.file(_path.default.join(__dirname, '../res', _constants.STD_LIB_MODULE_NAME));
19
+ console.log(`Adding stdlib document from ${stdLibUri}`);
20
+ const stdlib = this.langiumDocuments.getOrCreateDocument(stdLibUri);
21
+ _collector(stdlib);
22
+ }
23
+ }
24
+ exports.default = ZModelWorkspaceManager;
25
+ //# sourceMappingURL=zmodel-workspace-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zmodel-workspace-manager.js","names":["ZModelWorkspaceManager","DefaultWorkspaceManager","loadAdditionalDocuments","_folders","_collector","stdLibUri","URI","file","path","join","__dirname","STD_LIB_MODULE_NAME","console","log","stdlib","langiumDocuments","getOrCreateDocument"],"sources":["../../src/language-server/zmodel-workspace-manager.ts"],"sourcesContent":["import { DefaultWorkspaceManager, LangiumDocument } from 'langium';\nimport path from 'path';\nimport { WorkspaceFolder } from 'vscode-languageserver';\nimport { URI } from 'vscode-uri';\nimport { STD_LIB_MODULE_NAME } from './constants';\n\n/**\n * Custom Langium WorkspaceManager implementation which automatically loads stdlib.zmodel\n */\nexport default class ZModelWorkspaceManager extends DefaultWorkspaceManager {\n protected async loadAdditionalDocuments(\n _folders: WorkspaceFolder[],\n _collector: (document: LangiumDocument) => void\n ): Promise<void> {\n await super.loadAdditionalDocuments(_folders, _collector);\n const stdLibUri = URI.file(path.join(__dirname, '../res', STD_LIB_MODULE_NAME));\n console.log(`Adding stdlib document from ${stdLibUri}`);\n const stdlib = this.langiumDocuments.getOrCreateDocument(stdLibUri);\n _collector(stdlib);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AAEA;AACA;AAAkD;AAElD;AACA;AACA;AACe,MAAMA,sBAAsB,SAASC,gCAAuB,CAAC;EACxE,MAAgBC,uBAAuB,CACnCC,QAA2B,EAC3BC,UAA+C,EAClC;IACb,MAAM,KAAK,CAACF,uBAAuB,CAACC,QAAQ,EAAEC,UAAU,CAAC;IACzD,MAAMC,SAAS,GAAGC,cAAG,CAACC,IAAI,CAACC,aAAI,CAACC,IAAI,CAACC,SAAS,EAAE,QAAQ,EAAEC,8BAAmB,CAAC,CAAC;IAC/EC,OAAO,CAACC,GAAG,CAAE,+BAA8BR,SAAU,EAAC,CAAC;IACvD,MAAMS,MAAM,GAAG,IAAI,CAACC,gBAAgB,CAACC,mBAAmB,CAACX,SAAS,CAAC;IACnED,UAAU,CAACU,MAAM,CAAC;EACtB;AACJ;AAAC"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publisher": "zenstack",
4
4
  "displayName": "ZenStack Language Tools",
5
5
  "description": "A toolkit for building secure CRUD apps with Next.js + Typescript",
6
- "version": "0.6.0-pre.9",
6
+ "version": "1.0.0-alpha.19",
7
7
  "author": {
8
8
  "name": "ZenStack Team"
9
9
  },
@@ -22,7 +22,7 @@
22
22
  "url": "https://github.com/zenstackhq/zenstack"
23
23
  },
24
24
  "publishConfig": {
25
- "directory": "bundle",
25
+ "directory": "dist",
26
26
  "linkDirectory": true
27
27
  },
28
28
  "engines": {
@@ -63,7 +63,7 @@
63
63
  "bin": {
64
64
  "zenstack": "bin/cli"
65
65
  },
66
- "main": "./extension.js",
66
+ "main": "./bundle/extension.js",
67
67
  "dependencies": {
68
68
  "@prisma/generator-helper": "^4.7.1",
69
69
  "@prisma/internals": "^4.7.1",
@@ -73,13 +73,14 @@
73
73
  "colors": "1.4.0",
74
74
  "commander": "^8.3.0",
75
75
  "cuid": "^2.1.8",
76
- "langium": "^0.5.0",
76
+ "langium": "^1.0.1",
77
77
  "mixpanel": "^0.17.0",
78
78
  "node-machine-id": "^1.1.12",
79
- "ora": "^6.1.2",
79
+ "ora": "^5.4.1",
80
80
  "pluralize": "^8.0.0",
81
81
  "prisma": "~4.7.0",
82
82
  "promisify": "^0.0.3",
83
+ "semver": "^7.3.8",
83
84
  "sleep-promise": "^9.1.0",
84
85
  "ts-morph": "^16.0.0",
85
86
  "uuid": "^9.0.0",
@@ -89,46 +90,50 @@
89
90
  "vscode-languageserver-textdocument": "^1.0.7",
90
91
  "vscode-uri": "^3.0.6",
91
92
  "zod": "^3.19.1",
92
- "@zenstackhq/language": "0.6.0-pre.2",
93
- "@zenstackhq/runtime": "0.6.0-pre.2",
94
- "@zenstackhq/sdk": "0.6.0-pre.2"
93
+ "@zenstackhq/language": "1.0.0-alpha.19",
94
+ "@zenstackhq/runtime": "1.0.0-alpha.19",
95
+ "@zenstackhq/sdk": "1.0.0-alpha.19"
95
96
  },
96
97
  "devDependencies": {
98
+ "@babel/cli": "^7.19.3",
99
+ "@babel/core": "^7.20.5",
100
+ "@babel/preset-env": "^7.20.2",
101
+ "@babel/preset-typescript": "^7.18.6",
97
102
  "@types/async-exit-hook": "^2.0.0",
98
103
  "@types/jest": "^29.2.0",
99
104
  "@types/node": "^14.18.32",
100
105
  "@types/pluralize": "^0.0.29",
106
+ "@types/semver": "^7.3.13",
101
107
  "@types/tmp": "^0.2.3",
102
108
  "@types/uuid": "^8.3.4",
103
109
  "@types/vscode": "^1.56.0",
104
110
  "@typescript-eslint/eslint-plugin": "^5.42.0",
105
111
  "@typescript-eslint/parser": "^5.42.0",
112
+ "babel-plugin-inline-dotenv": "^1.7.0",
106
113
  "concurrently": "^7.4.0",
107
114
  "dotenv": "^16.0.3",
108
115
  "esbuild": "^0.15.12",
109
116
  "eslint": "^8.27.0",
117
+ "eslint-plugin-jest": "^27.1.7",
110
118
  "jest": "^29.2.1",
111
- "langium-cli": "^0.5.0",
119
+ "langium-cli": "^1.0.0",
112
120
  "rimraf": "^3.0.2",
113
121
  "tmp": "^0.2.1",
114
122
  "ts-jest": "^29.0.3",
115
123
  "ts-node": "^10.9.1",
116
124
  "tsc-alias": "^1.7.0",
117
- "tsconfig-paths-jest": "^0.0.1",
118
125
  "typescript": "^4.8.4",
119
126
  "vsce": "^2.13.0"
120
127
  },
121
128
  "scripts": {
122
129
  "vscode:publish": "vsce publish --no-dependencies",
123
- "vscode:prepublish": "cp ../../README.md ./ && pnpm lint && pnpm build",
130
+ "vscode:prepublish": "pnpm lint && pnpm bundle",
124
131
  "vscode:package": "vsce package --no-dependencies",
125
- "clean": "rimraf bundle",
126
- "build": "pnpm lint && pnpm bundle && tsc --emitDeclarationOnly --declaration ",
127
- "bundle": "pnpm clean && node build/bundle.js --minify",
128
- "watch": "node build/bundle.js --watch",
129
- "ts:watch": "tsc --watch --noEmit",
130
- "tsc-alias:watch": "tsc-alias --watch",
131
- "lint": "eslint src --ext ts",
132
+ "clean": "rimraf bundle dist",
133
+ "build": "pnpm clean && pnpm lint && tsc && babel src -d dist --extensions '.ts' && cp -r bin src/res ./README.md ./LICENSE ./package.json dist/ && node build/post-build.js",
134
+ "bundle": "pnpm clean && pnpm lint && node build/bundle.js --minify",
135
+ "watch": "babel src -d dist --extensions '.ts' -w",
136
+ "lint": "eslint src tests --ext ts",
132
137
  "test": "jest",
133
138
  "publish-dev": "pnpm publish --tag dev",
134
139
  "postinstall": "node bin/post-install.js"
@@ -0,0 +1,38 @@
1
+ import { Expression } from '@zenstackhq/language/ast';
2
+ import { CodeBlockWriter } from 'ts-morph';
3
+ /**
4
+ * Utility for writing ZModel expression as Prisma query argument objects into a ts-morph writer
5
+ */
6
+ export declare class ExpressionWriter {
7
+ private readonly writer;
8
+ private readonly isPostGuard;
9
+ private readonly plainExprBuilder;
10
+ /**
11
+ * Constructs a new ExpressionWriter
12
+ *
13
+ * @param isPostGuard indicates if we're writing for post-update conditions
14
+ */
15
+ constructor(writer: CodeBlockWriter, isPostGuard?: boolean);
16
+ /**
17
+ * Writes the given ZModel expression.
18
+ */
19
+ write(expr: Expression): void;
20
+ private writeReference;
21
+ private writeMemberAccess;
22
+ private writeExprList;
23
+ private writeBinary;
24
+ private writeCollectionPredicate;
25
+ private isFieldAccess;
26
+ private guard;
27
+ private plain;
28
+ private writeComparison;
29
+ private writeOperator;
30
+ private writeFieldCondition;
31
+ private block;
32
+ private isModelTyped;
33
+ private mapOperator;
34
+ private negateOperator;
35
+ private writeLogical;
36
+ private writeUnary;
37
+ private writeLiteral;
38
+ }
@@ -0,0 +1,323 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ExpressionWriter = void 0;
7
+ var _ast = require("@zenstackhq/language/ast");
8
+ var _sdk = require("@zenstackhq/sdk");
9
+ var _astUtils = require("../../utils/ast-utils");
10
+ var _typescriptExpressionTransformer = _interopRequireDefault(require("./typescript-expression-transformer"));
11
+ var _utils = require("./utils");
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+ /**
14
+ * Utility for writing ZModel expression as Prisma query argument objects into a ts-morph writer
15
+ */
16
+ class ExpressionWriter {
17
+ /**
18
+ * Constructs a new ExpressionWriter
19
+ *
20
+ * @param isPostGuard indicates if we're writing for post-update conditions
21
+ */
22
+ constructor(writer, isPostGuard = false) {
23
+ this.writer = writer;
24
+ this.isPostGuard = isPostGuard;
25
+ this.plainExprBuilder = new _typescriptExpressionTransformer.default(this.isPostGuard);
26
+ }
27
+
28
+ /**
29
+ * Writes the given ZModel expression.
30
+ */
31
+ write(expr) {
32
+ const _write = () => {
33
+ switch (expr.$type) {
34
+ case _ast.LiteralExpr:
35
+ this.writeLiteral(expr);
36
+ break;
37
+ case _ast.UnaryExpr:
38
+ this.writeUnary(expr);
39
+ break;
40
+ case _ast.BinaryExpr:
41
+ this.writeBinary(expr);
42
+ break;
43
+ case _ast.ReferenceExpr:
44
+ this.writeReference(expr);
45
+ break;
46
+ case _ast.MemberAccessExpr:
47
+ this.writeMemberAccess(expr);
48
+ break;
49
+ default:
50
+ throw new Error(`Not implemented: ${expr.$type}`);
51
+ }
52
+ };
53
+ this.block(_write);
54
+ }
55
+ writeReference(expr) {
56
+ if ((0, _ast.isEnumField)(expr.target.ref)) {
57
+ throw new Error('We should never get here');
58
+ } else {
59
+ var _expr$target$ref;
60
+ this.writer.write(`${(_expr$target$ref = expr.target.ref) === null || _expr$target$ref === void 0 ? void 0 : _expr$target$ref.name}: true`);
61
+ }
62
+ }
63
+ writeMemberAccess(expr) {
64
+ this.writeFieldCondition(expr.operand, () => {
65
+ this.block(() => {
66
+ var _expr$member$ref;
67
+ this.writer.write(`${(_expr$member$ref = expr.member.ref) === null || _expr$member$ref === void 0 ? void 0 : _expr$member$ref.name}: true`);
68
+ });
69
+ }, 'is');
70
+ }
71
+ writeExprList(exprs) {
72
+ this.writer.write('[');
73
+ for (let i = 0; i < exprs.length; i++) {
74
+ this.write(exprs[i]);
75
+ if (i !== exprs.length - 1) {
76
+ this.writer.write(',');
77
+ }
78
+ }
79
+ this.writer.write(']');
80
+ }
81
+ writeBinary(expr) {
82
+ switch (expr.operator) {
83
+ case '&&':
84
+ case '||':
85
+ this.writeLogical(expr, expr.operator);
86
+ break;
87
+ case '==':
88
+ case '!=':
89
+ case '>':
90
+ case '>=':
91
+ case '<':
92
+ case '<=':
93
+ this.writeComparison(expr, expr.operator);
94
+ break;
95
+ case '?':
96
+ case '!':
97
+ case '^':
98
+ this.writeCollectionPredicate(expr, expr.operator);
99
+ break;
100
+ }
101
+ }
102
+ writeCollectionPredicate(expr, operator) {
103
+ this.writeFieldCondition(expr.left, () => {
104
+ this.write(expr.right);
105
+ }, operator === '?' ? 'some' : operator === '!' ? 'every' : 'none');
106
+ }
107
+ isFieldAccess(expr) {
108
+ if ((0, _ast.isThisExpr)(expr)) {
109
+ return true;
110
+ }
111
+ if ((0, _ast.isMemberAccessExpr)(expr)) {
112
+ if ((0, _utils.isFutureExpr)(expr.operand) && this.isPostGuard) {
113
+ // when writing for post-update, future().field.x is a field access
114
+ return true;
115
+ } else {
116
+ return this.isFieldAccess(expr.operand);
117
+ }
118
+ }
119
+ if ((0, _ast.isReferenceExpr)(expr) && (0, _ast.isDataModelField)(expr.target.ref) && !this.isPostGuard) {
120
+ return true;
121
+ }
122
+ return false;
123
+ }
124
+ guard(write) {
125
+ this.writer.write(`${_sdk.GUARD_FIELD_NAME}: `);
126
+ write();
127
+ }
128
+ plain(expr) {
129
+ this.writer.write(this.plainExprBuilder.transform(expr));
130
+ }
131
+ writeComparison(expr, operator) {
132
+ const leftIsFieldAccess = this.isFieldAccess(expr.left);
133
+ const rightIsFieldAccess = this.isFieldAccess(expr.right);
134
+ if (leftIsFieldAccess && rightIsFieldAccess) {
135
+ throw new _sdk.PluginError(`Comparison between fields are not supported yet`);
136
+ }
137
+ if (!leftIsFieldAccess && !rightIsFieldAccess) {
138
+ // compile down to a plain expression
139
+ this.guard(() => {
140
+ this.plain(expr.left);
141
+ this.writer.write(' ' + operator + ' ');
142
+ this.plain(expr.right);
143
+ });
144
+ return;
145
+ }
146
+ let fieldAccess;
147
+ let operand;
148
+ if (leftIsFieldAccess) {
149
+ fieldAccess = expr.left;
150
+ operand = expr.right;
151
+ } else {
152
+ fieldAccess = expr.right;
153
+ operand = expr.left;
154
+ operator = this.negateOperator(operator);
155
+ }
156
+ if ((0, _ast.isMemberAccessExpr)(fieldAccess) && (0, _utils.isFutureExpr)(fieldAccess.operand)) {
157
+ // future().field should be treated as the "field" directly, so we
158
+ // strip 'future().' and synthesize a reference expr
159
+ fieldAccess = {
160
+ $type: _ast.ReferenceExpr,
161
+ $container: fieldAccess.$container,
162
+ target: fieldAccess.member,
163
+ $resolvedType: fieldAccess.$resolvedType
164
+ };
165
+ }
166
+ this.writeFieldCondition(fieldAccess, () => {
167
+ this.block(() => {
168
+ const dataModel = this.isModelTyped(fieldAccess);
169
+ if (dataModel) {
170
+ const idField = (0, _astUtils.getIdField)(dataModel);
171
+ if (!idField) {
172
+ throw new _sdk.PluginError(`Data model ${dataModel.name} does not have an id field`);
173
+ }
174
+ // comparing with an object, conver to "id" comparison instead
175
+ this.writer.write(`${idField.name}: `);
176
+ this.block(() => {
177
+ this.writeOperator(operator, () => {
178
+ this.plain(operand);
179
+ this.writer.write(`?.${idField.name}`);
180
+ });
181
+ });
182
+ } else {
183
+ this.writeOperator(operator, () => {
184
+ this.plain(operand);
185
+ });
186
+ }
187
+ },
188
+ // "this" expression is compiled away (to .id access), so we should
189
+ // avoid generating a new layer
190
+ !(0, _ast.isThisExpr)(fieldAccess));
191
+ }, 'is');
192
+ }
193
+ writeOperator(operator, writeOperand) {
194
+ if (operator === '!=') {
195
+ // wrap a 'not'
196
+ this.writer.write('not: ');
197
+ this.block(() => {
198
+ this.writeOperator('==', writeOperand);
199
+ });
200
+ } else {
201
+ this.writer.write(`${this.mapOperator(operator)}: `);
202
+ writeOperand();
203
+ }
204
+ }
205
+ writeFieldCondition(fieldAccess, writeCondition, relationOp) {
206
+ let selector;
207
+ let operand;
208
+ if ((0, _ast.isThisExpr)(fieldAccess)) {
209
+ // pass on
210
+ writeCondition();
211
+ return;
212
+ } else if ((0, _ast.isReferenceExpr)(fieldAccess)) {
213
+ var _fieldAccess$target$r;
214
+ selector = (_fieldAccess$target$r = fieldAccess.target.ref) === null || _fieldAccess$target$r === void 0 ? void 0 : _fieldAccess$target$r.name;
215
+ } else if ((0, _ast.isMemberAccessExpr)(fieldAccess)) {
216
+ if ((0, _utils.isFutureExpr)(fieldAccess.operand)) {
217
+ var _fieldAccess$member$r;
218
+ // future().field should be treated as the "field"
219
+ selector = (_fieldAccess$member$r = fieldAccess.member.ref) === null || _fieldAccess$member$r === void 0 ? void 0 : _fieldAccess$member$r.name;
220
+ } else {
221
+ var _fieldAccess$member$r2;
222
+ selector = (_fieldAccess$member$r2 = fieldAccess.member.ref) === null || _fieldAccess$member$r2 === void 0 ? void 0 : _fieldAccess$member$r2.name;
223
+ operand = fieldAccess.operand;
224
+ }
225
+ } else {
226
+ throw new _sdk.PluginError(`Unsupported expression type: ${fieldAccess.$type}`);
227
+ }
228
+ if (!selector) {
229
+ throw new _sdk.PluginError(`Failed to write FieldAccess expression`);
230
+ }
231
+ if (operand) {
232
+ // member access expression
233
+ this.writeFieldCondition(operand, () => {
234
+ this.block(() => {
235
+ this.writer.write(selector + ': ');
236
+ if (this.isModelTyped(fieldAccess)) {
237
+ // expression is resolved to a model, generate relation query
238
+ this.block(() => {
239
+ this.writer.write(`${relationOp}: `);
240
+ writeCondition();
241
+ });
242
+ } else {
243
+ // generate plain query
244
+ writeCondition();
245
+ }
246
+ },
247
+ // if operand is "this", it doesn't really generate a new layer of query,
248
+ // so we should avoid generating a new block
249
+ !(0, _ast.isThisExpr)(operand));
250
+ }, 'is');
251
+ } else if (this.isModelTyped(fieldAccess)) {
252
+ // reference resolved to a model, generate relation query
253
+ this.writer.write(selector + ': ');
254
+ this.block(() => {
255
+ this.writer.write(`${relationOp}: `);
256
+ writeCondition();
257
+ });
258
+ } else {
259
+ // generate a plain query
260
+ this.writer.write(selector + ': ');
261
+ writeCondition();
262
+ }
263
+ }
264
+ block(write, condition = true) {
265
+ if (condition) {
266
+ this.writer.inlineBlock(write);
267
+ } else {
268
+ write();
269
+ }
270
+ }
271
+ isModelTyped(expr) {
272
+ var _expr$$resolvedType, _expr$$resolvedType2;
273
+ return (0, _ast.isDataModel)((_expr$$resolvedType = expr.$resolvedType) === null || _expr$$resolvedType === void 0 ? void 0 : _expr$$resolvedType.decl) ? (_expr$$resolvedType2 = expr.$resolvedType) === null || _expr$$resolvedType2 === void 0 ? void 0 : _expr$$resolvedType2.decl : undefined;
274
+ }
275
+ mapOperator(operator) {
276
+ switch (operator) {
277
+ case '==':
278
+ return 'equals';
279
+ case '!=':
280
+ throw new Error('Operation != should have been compiled away');
281
+ case '>':
282
+ return 'gt';
283
+ case '>=':
284
+ return 'gte';
285
+ case '<':
286
+ return 'lt';
287
+ case '<=':
288
+ return 'lte';
289
+ }
290
+ }
291
+ negateOperator(operator) {
292
+ switch (operator) {
293
+ case '>':
294
+ return '<=';
295
+ case '<':
296
+ return '>=';
297
+ case '>=':
298
+ return '<';
299
+ case '<=':
300
+ return '>';
301
+ default:
302
+ return operator;
303
+ }
304
+ }
305
+ writeLogical(expr, operator) {
306
+ this.writer.write(`${operator === '&&' ? 'AND' : 'OR'}: `);
307
+ this.writeExprList([expr.left, expr.right]);
308
+ }
309
+ writeUnary(expr) {
310
+ if (expr.operator !== '!') {
311
+ throw new _sdk.PluginError(`Unary operator "${expr.operator}" is not supported`);
312
+ }
313
+ this.writer.write('NOT: ');
314
+ this.write(expr.operand);
315
+ }
316
+ writeLiteral(expr) {
317
+ this.guard(() => {
318
+ this.plain(expr);
319
+ });
320
+ }
321
+ }
322
+ exports.ExpressionWriter = ExpressionWriter;
323
+ //# sourceMappingURL=expression-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression-writer.js","names":["ExpressionWriter","constructor","writer","isPostGuard","plainExprBuilder","TypeScriptExpressionTransformer","write","expr","_write","$type","LiteralExpr","writeLiteral","UnaryExpr","writeUnary","BinaryExpr","writeBinary","ReferenceExpr","writeReference","MemberAccessExpr","writeMemberAccess","Error","block","isEnumField","target","ref","name","writeFieldCondition","operand","member","writeExprList","exprs","i","length","operator","writeLogical","writeComparison","writeCollectionPredicate","left","right","isFieldAccess","isThisExpr","isMemberAccessExpr","isFutureExpr","isReferenceExpr","isDataModelField","guard","GUARD_FIELD_NAME","plain","transform","leftIsFieldAccess","rightIsFieldAccess","PluginError","fieldAccess","negateOperator","$container","$resolvedType","dataModel","isModelTyped","idField","getIdField","writeOperator","writeOperand","mapOperator","writeCondition","relationOp","selector","condition","inlineBlock","isDataModel","decl","undefined"],"sources":["../../../src/plugins/access-policy/expression-writer.ts"],"sourcesContent":["import {\n BinaryExpr,\n DataModel,\n Expression,\n LiteralExpr,\n MemberAccessExpr,\n ReferenceExpr,\n UnaryExpr,\n isDataModel,\n isDataModelField,\n isEnumField,\n isMemberAccessExpr,\n isReferenceExpr,\n isThisExpr,\n} from '@zenstackhq/language/ast';\nimport { GUARD_FIELD_NAME, PluginError } from '@zenstackhq/sdk';\nimport { CodeBlockWriter } from 'ts-morph';\nimport { getIdField } from '../../utils/ast-utils';\nimport TypeScriptExpressionTransformer from './typescript-expression-transformer';\nimport { isFutureExpr } from './utils';\n\ntype ComparisonOperator = '==' | '!=' | '>' | '>=' | '<' | '<=';\n\n/**\n * Utility for writing ZModel expression as Prisma query argument objects into a ts-morph writer\n */\nexport class ExpressionWriter {\n private readonly plainExprBuilder: TypeScriptExpressionTransformer;\n\n /**\n * Constructs a new ExpressionWriter\n *\n * @param isPostGuard indicates if we're writing for post-update conditions\n */\n constructor(private readonly writer: CodeBlockWriter, private readonly isPostGuard = false) {\n this.plainExprBuilder = new TypeScriptExpressionTransformer(this.isPostGuard);\n }\n\n /**\n * Writes the given ZModel expression.\n */\n write(expr: Expression): void {\n const _write = () => {\n switch (expr.$type) {\n case LiteralExpr:\n this.writeLiteral(expr as LiteralExpr);\n break;\n\n case UnaryExpr:\n this.writeUnary(expr as UnaryExpr);\n break;\n\n case BinaryExpr:\n this.writeBinary(expr as BinaryExpr);\n break;\n\n case ReferenceExpr:\n this.writeReference(expr as ReferenceExpr);\n break;\n\n case MemberAccessExpr:\n this.writeMemberAccess(expr as MemberAccessExpr);\n break;\n\n default:\n throw new Error(`Not implemented: ${expr.$type}`);\n }\n };\n\n this.block(_write);\n }\n\n private writeReference(expr: ReferenceExpr) {\n if (isEnumField(expr.target.ref)) {\n throw new Error('We should never get here');\n } else {\n this.writer.write(`${expr.target.ref?.name}: true`);\n }\n }\n\n private writeMemberAccess(expr: MemberAccessExpr) {\n this.writeFieldCondition(\n expr.operand,\n () => {\n this.block(() => {\n this.writer.write(`${expr.member.ref?.name}: true`);\n });\n },\n 'is'\n );\n }\n\n private writeExprList(exprs: Expression[]) {\n this.writer.write('[');\n for (let i = 0; i < exprs.length; i++) {\n this.write(exprs[i]);\n if (i !== exprs.length - 1) {\n this.writer.write(',');\n }\n }\n this.writer.write(']');\n }\n\n private writeBinary(expr: BinaryExpr) {\n switch (expr.operator) {\n case '&&':\n case '||':\n this.writeLogical(expr, expr.operator);\n break;\n\n case '==':\n case '!=':\n case '>':\n case '>=':\n case '<':\n case '<=':\n this.writeComparison(expr, expr.operator);\n break;\n\n case '?':\n case '!':\n case '^':\n this.writeCollectionPredicate(expr, expr.operator);\n break;\n }\n }\n\n private writeCollectionPredicate(expr: BinaryExpr, operator: string) {\n this.writeFieldCondition(\n expr.left,\n () => {\n this.write(expr.right);\n },\n operator === '?' ? 'some' : operator === '!' ? 'every' : 'none'\n );\n }\n\n private isFieldAccess(expr: Expression): boolean {\n if (isThisExpr(expr)) {\n return true;\n }\n\n if (isMemberAccessExpr(expr)) {\n if (isFutureExpr(expr.operand) && this.isPostGuard) {\n // when writing for post-update, future().field.x is a field access\n return true;\n } else {\n return this.isFieldAccess(expr.operand);\n }\n }\n if (isReferenceExpr(expr) && isDataModelField(expr.target.ref) && !this.isPostGuard) {\n return true;\n }\n return false;\n }\n\n private guard(write: () => void) {\n this.writer.write(`${GUARD_FIELD_NAME}: `);\n write();\n }\n\n private plain(expr: Expression) {\n this.writer.write(this.plainExprBuilder.transform(expr));\n }\n\n private writeComparison(expr: BinaryExpr, operator: ComparisonOperator) {\n const leftIsFieldAccess = this.isFieldAccess(expr.left);\n const rightIsFieldAccess = this.isFieldAccess(expr.right);\n\n if (leftIsFieldAccess && rightIsFieldAccess) {\n throw new PluginError(`Comparison between fields are not supported yet`);\n }\n\n if (!leftIsFieldAccess && !rightIsFieldAccess) {\n // compile down to a plain expression\n this.guard(() => {\n this.plain(expr.left);\n this.writer.write(' ' + operator + ' ');\n this.plain(expr.right);\n });\n\n return;\n }\n\n let fieldAccess: Expression;\n let operand: Expression;\n if (leftIsFieldAccess) {\n fieldAccess = expr.left;\n operand = expr.right;\n } else {\n fieldAccess = expr.right;\n operand = expr.left;\n operator = this.negateOperator(operator);\n }\n\n if (isMemberAccessExpr(fieldAccess) && isFutureExpr(fieldAccess.operand)) {\n // future().field should be treated as the \"field\" directly, so we\n // strip 'future().' and synthesize a reference expr\n fieldAccess = {\n $type: ReferenceExpr,\n $container: fieldAccess.$container,\n target: fieldAccess.member,\n $resolvedType: fieldAccess.$resolvedType,\n } as ReferenceExpr;\n }\n\n this.writeFieldCondition(\n fieldAccess,\n () => {\n this.block(\n () => {\n const dataModel = this.isModelTyped(fieldAccess);\n if (dataModel) {\n const idField = getIdField(dataModel);\n if (!idField) {\n throw new PluginError(`Data model ${dataModel.name} does not have an id field`);\n }\n // comparing with an object, conver to \"id\" comparison instead\n this.writer.write(`${idField.name}: `);\n this.block(() => {\n this.writeOperator(operator, () => {\n this.plain(operand);\n this.writer.write(`?.${idField.name}`);\n });\n });\n } else {\n this.writeOperator(operator, () => {\n this.plain(operand);\n });\n }\n },\n // \"this\" expression is compiled away (to .id access), so we should\n // avoid generating a new layer\n !isThisExpr(fieldAccess)\n );\n },\n 'is'\n );\n }\n\n private writeOperator(operator: ComparisonOperator, writeOperand: () => void) {\n if (operator === '!=') {\n // wrap a 'not'\n this.writer.write('not: ');\n this.block(() => {\n this.writeOperator('==', writeOperand);\n });\n } else {\n this.writer.write(`${this.mapOperator(operator)}: `);\n writeOperand();\n }\n }\n\n private writeFieldCondition(\n fieldAccess: Expression,\n writeCondition: () => void,\n relationOp: 'is' | 'some' | 'every' | 'none'\n ) {\n let selector: string | undefined;\n let operand: Expression | undefined;\n\n if (isThisExpr(fieldAccess)) {\n // pass on\n writeCondition();\n return;\n } else if (isReferenceExpr(fieldAccess)) {\n selector = fieldAccess.target.ref?.name;\n } else if (isMemberAccessExpr(fieldAccess)) {\n if (isFutureExpr(fieldAccess.operand)) {\n // future().field should be treated as the \"field\"\n selector = fieldAccess.member.ref?.name;\n } else {\n selector = fieldAccess.member.ref?.name;\n operand = fieldAccess.operand;\n }\n } else {\n throw new PluginError(`Unsupported expression type: ${fieldAccess.$type}`);\n }\n\n if (!selector) {\n throw new PluginError(`Failed to write FieldAccess expression`);\n }\n\n if (operand) {\n // member access expression\n this.writeFieldCondition(\n operand,\n () => {\n this.block(\n () => {\n this.writer.write(selector + ': ');\n if (this.isModelTyped(fieldAccess)) {\n // expression is resolved to a model, generate relation query\n this.block(() => {\n this.writer.write(`${relationOp}: `);\n writeCondition();\n });\n } else {\n // generate plain query\n writeCondition();\n }\n },\n // if operand is \"this\", it doesn't really generate a new layer of query,\n // so we should avoid generating a new block\n !isThisExpr(operand)\n );\n },\n 'is'\n );\n } else if (this.isModelTyped(fieldAccess)) {\n // reference resolved to a model, generate relation query\n this.writer.write(selector + ': ');\n this.block(() => {\n this.writer.write(`${relationOp}: `);\n writeCondition();\n });\n } else {\n // generate a plain query\n this.writer.write(selector + ': ');\n writeCondition();\n }\n }\n\n private block(write: () => void, condition = true) {\n if (condition) {\n this.writer.inlineBlock(write);\n } else {\n write();\n }\n }\n\n private isModelTyped(expr: Expression) {\n return isDataModel(expr.$resolvedType?.decl) ? (expr.$resolvedType?.decl as DataModel) : undefined;\n }\n\n private mapOperator(operator: '==' | '!=' | '>' | '>=' | '<' | '<=') {\n switch (operator) {\n case '==':\n return 'equals';\n case '!=':\n throw new Error('Operation != should have been compiled away');\n case '>':\n return 'gt';\n case '>=':\n return 'gte';\n case '<':\n return 'lt';\n case '<=':\n return 'lte';\n }\n }\n\n private negateOperator(operator: '==' | '!=' | '>' | '>=' | '<' | '<=') {\n switch (operator) {\n case '>':\n return '<=';\n case '<':\n return '>=';\n case '>=':\n return '<';\n case '<=':\n return '>';\n default:\n return operator;\n }\n }\n\n private writeLogical(expr: BinaryExpr, operator: '&&' | '||') {\n this.writer.write(`${operator === '&&' ? 'AND' : 'OR'}: `);\n this.writeExprList([expr.left, expr.right]);\n }\n\n private writeUnary(expr: UnaryExpr) {\n if (expr.operator !== '!') {\n throw new PluginError(`Unary operator \"${expr.operator}\" is not supported`);\n }\n\n this.writer.write('NOT: ');\n this.write(expr.operand);\n }\n\n private writeLiteral(expr: LiteralExpr) {\n this.guard(() => {\n this.plain(expr);\n });\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Model } from '@zenstackhq/language/ast';
2
+ import { PluginOptions } from '@zenstackhq/sdk';
3
+ export declare const name = "Access Policy";
4
+ export default function run(model: Model, options: PluginOptions): Promise<void>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = run;
7
+ exports.name = void 0;
8
+ var _policyGuardGenerator = _interopRequireDefault(require("./policy-guard-generator"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ const name = 'Access Policy';
11
+ exports.name = name;
12
+ async function run(model, options) {
13
+ return new _policyGuardGenerator.default().generate(model, options);
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["name","run","model","options","PolicyGenerator","generate"],"sources":["../../../src/plugins/access-policy/index.ts"],"sourcesContent":["import { Model } from '@zenstackhq/language/ast';\nimport { PluginOptions } from '@zenstackhq/sdk';\nimport PolicyGenerator from './policy-guard-generator';\n\nexport const name = 'Access Policy';\n\nexport default async function run(model: Model, options: PluginOptions) {\n return new PolicyGenerator().generate(model, options);\n}\n"],"mappings":";;;;;;;AAEA;AAAuD;AAEhD,MAAMA,IAAI,GAAG,eAAe;AAAC;AAErB,eAAeC,GAAG,CAACC,KAAY,EAAEC,OAAsB,EAAE;EACpE,OAAO,IAAIC,6BAAe,EAAE,CAACC,QAAQ,CAACH,KAAK,EAAEC,OAAO,CAAC;AACzD"}
@@ -0,0 +1,15 @@
1
+ import { Model } from '@zenstackhq/language/ast';
2
+ import { PluginOptions } from '@zenstackhq/sdk';
3
+ /**
4
+ * Generates source file that contains Prisma query guard objects used for injecting database queries
5
+ */
6
+ export default class PolicyGenerator {
7
+ generate(model: Model, options: PluginOptions): Promise<void>;
8
+ private getPolicyExpressions;
9
+ private processUpdatePolicies;
10
+ private visitPolicyExpression;
11
+ private hasFutureReference;
12
+ private generateQueryGuardForModel;
13
+ private generatePreValueSelect;
14
+ private generateQueryGuardFunction;
15
+ }