zenstack 0.6.0-pre.8 → 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.
- package/cli/cli-error.d.ts +5 -0
- package/cli/cli-error.js +12 -0
- package/cli/cli-error.js.map +1 -0
- package/cli/cli-util.d.ts +18 -0
- package/cli/cli-util.js +122 -0
- package/cli/cli-util.js.map +1 -0
- package/cli/index.d.ts +14 -0
- package/cli/index.js +72 -6529
- package/cli/index.js.map +1 -0
- package/cli/plugin-runner.d.ts +14 -0
- package/cli/plugin-runner.js +133 -0
- package/cli/plugin-runner.js.map +1 -0
- package/global.d.js +1 -0
- package/global.d.js.map +1 -0
- package/language-server/constants.d.ts +12 -0
- package/language-server/constants.js +24 -0
- package/language-server/constants.js.map +1 -0
- package/language-server/main.d.ts +1 -0
- package/language-server/main.js +20 -6436
- package/language-server/main.js.map +1 -0
- package/language-server/types.d.ts +10 -0
- package/language-server/types.js +1 -0
- package/language-server/types.js.map +1 -0
- package/language-server/utils.d.ts +10 -0
- package/language-server/utils.js +28 -0
- package/language-server/utils.js.map +1 -0
- package/language-server/validator/attribute-validator.d.ts +9 -0
- package/language-server/validator/attribute-validator.js +15 -0
- package/language-server/validator/attribute-validator.js.map +1 -0
- package/language-server/validator/datamodel-validator.d.ts +16 -0
- package/language-server/validator/datamodel-validator.js +365 -0
- package/language-server/validator/datamodel-validator.js.map +1 -0
- package/language-server/validator/datasource-validator.d.ts +13 -0
- package/language-server/validator/datasource-validator.js +85 -0
- package/language-server/validator/datasource-validator.js.map +1 -0
- package/language-server/validator/enum-validator.d.ts +9 -0
- package/language-server/validator/enum-validator.js +18 -0
- package/language-server/validator/enum-validator.js.map +1 -0
- package/language-server/validator/expression-validator.d.ts +11 -0
- package/language-server/validator/expression-validator.js +40 -0
- package/language-server/validator/expression-validator.js.map +1 -0
- package/language-server/validator/schema-validator.d.ts +10 -0
- package/language-server/validator/schema-validator.js +35 -0
- package/language-server/validator/schema-validator.js.map +1 -0
- package/language-server/validator/utils.d.ts +24 -0
- package/language-server/validator/utils.js +116 -0
- package/language-server/validator/utils.js.map +1 -0
- package/language-server/validator/zmodel-validator.d.ts +21 -0
- package/language-server/validator/zmodel-validator.js +72 -0
- package/language-server/validator/zmodel-validator.js.map +1 -0
- package/language-server/zmodel-linker.d.ts +29 -0
- package/language-server/zmodel-linker.js +364 -0
- package/language-server/zmodel-linker.js.map +1 -0
- package/language-server/zmodel-module.d.ts +41 -0
- package/language-server/zmodel-module.js +83 -0
- package/language-server/zmodel-module.js.map +1 -0
- package/language-server/zmodel-scope.d.ts +10 -0
- package/language-server/zmodel-scope.js +34 -0
- package/language-server/zmodel-scope.js.map +1 -0
- package/language-server/zmodel-workspace-manager.d.ts +8 -0
- package/language-server/zmodel-workspace-manager.js +25 -0
- package/language-server/zmodel-workspace-manager.js.map +1 -0
- package/package.json +23 -18
- package/plugins/access-policy/expression-writer.d.ts +38 -0
- package/plugins/access-policy/expression-writer.js +323 -0
- package/plugins/access-policy/expression-writer.js.map +1 -0
- package/plugins/access-policy/index.d.ts +4 -0
- package/plugins/access-policy/index.js +15 -0
- package/plugins/access-policy/index.js.map +1 -0
- package/plugins/access-policy/policy-guard-generator.d.ts +15 -0
- package/plugins/access-policy/policy-guard-generator.js +345 -0
- package/plugins/access-policy/policy-guard-generator.js.map +1 -0
- package/plugins/access-policy/typescript-expression-transformer.d.ts +26 -0
- package/plugins/access-policy/typescript-expression-transformer.js +110 -0
- package/plugins/access-policy/typescript-expression-transformer.js.map +1 -0
- package/plugins/access-policy/utils.d.ts +5 -0
- package/plugins/access-policy/utils.js +16 -0
- package/plugins/access-policy/utils.js.map +1 -0
- package/plugins/access-policy/zod-schema-generator.d.ts +12 -0
- package/plugins/access-policy/zod-schema-generator.js +174 -0
- package/plugins/access-policy/zod-schema-generator.js.map +1 -0
- package/plugins/model-meta/index.d.ts +4 -0
- package/plugins/model-meta/index.js +130 -0
- package/plugins/model-meta/index.js.map +1 -0
- package/plugins/plugin-utils.d.ts +16 -0
- package/plugins/plugin-utils.js +58 -0
- package/plugins/plugin-utils.js.map +1 -0
- package/plugins/prisma/indent-string.d.ts +4 -0
- package/plugins/prisma/indent-string.js +16 -0
- package/plugins/prisma/indent-string.js.map +1 -0
- package/plugins/prisma/index.d.ts +4 -0
- package/plugins/prisma/index.js +15 -3740
- package/plugins/prisma/index.js.map +1 -0
- package/plugins/prisma/prisma-builder.d.ts +130 -0
- package/plugins/prisma/prisma-builder.js +271 -0
- package/plugins/prisma/prisma-builder.js.map +1 -0
- package/plugins/prisma/schema-generator.d.ts +24 -0
- package/plugins/prisma/schema-generator.js +212 -0
- package/plugins/prisma/schema-generator.js.map +1 -0
- package/plugins/prisma/zmodel-code-generator.d.ts +27 -0
- package/plugins/prisma/zmodel-code-generator.js +110 -0
- package/plugins/prisma/zmodel-code-generator.js.map +1 -0
- package/res/prism-zmodel.js +2 -4
- package/res/starter.zmodel +47 -0
- package/res/stdlib.zmodel +12 -1
- package/telemetry.d.ts +21 -0
- package/telemetry.js +102 -0
- package/telemetry.js.map +1 -0
- package/types.d.ts +11 -0
- package/types.js +1 -0
- package/types.js.map +1 -0
- package/utils/ast-utils.d.ts +15 -0
- package/utils/ast-utils.js +79 -0
- package/utils/ast-utils.js.map +1 -0
- package/utils/exec-utils.d.ts +6 -0
- package/utils/exec-utils.js +22 -0
- package/utils/exec-utils.js.map +1 -0
- package/utils/pkg-utils.d.ts +3 -0
- package/utils/pkg-utils.js +43 -0
- package/utils/pkg-utils.js.map +1 -0
- package/utils/version-utils.d.ts +1 -0
- package/utils/version-utils.js +15 -0
- package/utils/version-utils.js.map +1 -0
- package/asset/logo-256-bg.png +0 -0
- package/asset/logo-dark-256.png +0 -0
- package/asset/logo-light-256.png +0 -0
- package/extension.js +0 -39
- package/plugins/policy-guard/index.js +0 -4289
- package/plugins/react-hooks/index.js +0 -4318
- package/plugins/trpc/index.js +0 -5386
- package/plugins/zod/index.js +0 -4808
- package/res/package.template.json +0 -9
- 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
|
+
"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": "
|
|
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.
|
|
76
|
+
"langium": "^1.0.1",
|
|
77
77
|
"mixpanel": "^0.17.0",
|
|
78
78
|
"node-machine-id": "^1.1.12",
|
|
79
|
-
"ora": "^
|
|
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.
|
|
93
|
-
"@zenstackhq/runtime": "0.
|
|
94
|
-
"@zenstackhq/sdk": "0.
|
|
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.
|
|
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": "
|
|
130
|
+
"vscode:prepublish": "pnpm lint && pnpm bundle",
|
|
124
131
|
"vscode:package": "vsce package --no-dependencies",
|
|
125
|
-
"clean": "rimraf bundle",
|
|
126
|
-
"build": "pnpm
|
|
127
|
-
"bundle": "pnpm clean && node build/bundle.js --minify",
|
|
128
|
-
"watch": "
|
|
129
|
-
"
|
|
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,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
|
+
}
|