zenstack 0.1.41 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/.vscode/extensions.json +7 -0
  2. package/.vscode/launch.json +49 -0
  3. package/.vscode/settings.json +4 -0
  4. package/README.md +1 -0
  5. package/package.json +8 -90
  6. package/packages/internal/jest.config.ts +32 -0
  7. package/packages/internal/package.json +42 -0
  8. package/packages/internal/src/constants.ts +1 -0
  9. package/packages/internal/src/handler/data/guard-utils.ts +7 -0
  10. package/packages/internal/src/handler/data/handler.ts +415 -0
  11. package/packages/internal/src/handler/data/query-processor.ts +504 -0
  12. package/packages/internal/src/handler/index.ts +1 -0
  13. package/packages/internal/src/handler/types.ts +20 -0
  14. package/packages/internal/src/index.ts +3 -0
  15. package/packages/internal/src/request-handler.ts +27 -0
  16. package/packages/internal/src/request.ts +101 -0
  17. package/packages/internal/src/types.ts +40 -0
  18. package/packages/internal/tests/query-processor.test.ts +172 -0
  19. package/{out/cli/tsconfig.template.json → packages/internal/tsconfig.json} +7 -3
  20. package/packages/runtime/auth.d.ts +1 -0
  21. package/packages/runtime/auth.js +3 -0
  22. package/packages/runtime/hooks.d.ts +10 -0
  23. package/packages/runtime/hooks.js +3 -0
  24. package/packages/runtime/index.d.ts +3 -0
  25. package/packages/runtime/index.js +1 -0
  26. package/packages/runtime/package-lock.json +512 -0
  27. package/packages/runtime/package.json +16 -0
  28. package/packages/runtime/server.d.ts +1 -0
  29. package/packages/runtime/server.js +3 -0
  30. package/packages/runtime/types.d.ts +1 -0
  31. package/packages/runtime/types.js +3 -0
  32. package/packages/schema/.eslintrc.json +13 -0
  33. package/packages/schema/.vscodeignore +4 -0
  34. package/packages/schema/asset/logo-dark.png +0 -0
  35. package/packages/schema/asset/logo-light.png +0 -0
  36. package/{bin → packages/schema/bin}/cli +0 -0
  37. package/packages/schema/jest.config.ts +32 -0
  38. package/packages/schema/langium-config.json +14 -0
  39. package/packages/schema/langium-quickstart.md +41 -0
  40. package/packages/schema/language-configuration.json +30 -0
  41. package/packages/schema/package.json +96 -0
  42. package/packages/schema/src/cli/cli-util.ts +80 -0
  43. package/packages/schema/src/cli/index.ts +64 -0
  44. package/packages/schema/src/extension.ts +76 -0
  45. package/packages/schema/src/generator/constants.ts +5 -0
  46. package/packages/schema/src/generator/index.ts +92 -0
  47. package/{out/generator/next-auth/index.js → packages/schema/src/generator/next-auth/index.ts} +46 -58
  48. package/{out → packages/schema/src}/generator/package.template.json +0 -0
  49. package/packages/schema/src/generator/prisma/expression-writer.ts +352 -0
  50. package/packages/schema/src/generator/prisma/index.ts +32 -0
  51. package/packages/schema/src/generator/prisma/plain-expression-builder.ts +91 -0
  52. package/packages/schema/src/generator/prisma/prisma-builder.ts +366 -0
  53. package/packages/schema/src/generator/prisma/query-gard-generator.ts +208 -0
  54. package/packages/schema/src/generator/prisma/schema-generator.ts +300 -0
  55. package/packages/schema/src/generator/react-hooks/index.ts +181 -0
  56. package/packages/schema/src/generator/service/index.ts +107 -0
  57. package/{out → packages/schema/src}/generator/tsconfig.template.json +0 -0
  58. package/packages/schema/src/generator/types.ts +17 -0
  59. package/packages/schema/src/generator/utils.ts +9 -0
  60. package/packages/schema/src/language-server/generated/ast.ts +603 -0
  61. package/{out/language-server/generated/grammar.js → packages/schema/src/language-server/generated/grammar.ts} +5 -8
  62. package/packages/schema/src/language-server/generated/module.ts +24 -0
  63. package/packages/schema/src/language-server/main.ts +12 -0
  64. package/{out → packages/schema/src}/language-server/stdlib.zmodel +0 -0
  65. package/packages/schema/src/language-server/types.ts +9 -0
  66. package/packages/schema/src/language-server/zmodel-index.ts +33 -0
  67. package/packages/schema/src/language-server/zmodel-linker.ts +409 -0
  68. package/packages/schema/src/language-server/zmodel-module.ts +90 -0
  69. package/packages/schema/src/language-server/zmodel-scope.ts +21 -0
  70. package/packages/schema/src/language-server/zmodel-validator.ts +35 -0
  71. package/packages/schema/src/language-server/zmodel.langium +186 -0
  72. package/packages/schema/src/utils/exec-utils.ts +5 -0
  73. package/packages/schema/src/utils/indent-string.ts +6 -0
  74. package/packages/schema/syntaxes/zmodel.json +57 -0
  75. package/packages/schema/syntaxes/zmodel.tmLanguage.json +57 -0
  76. package/packages/schema/tests/generator/expression-writer.test.ts +676 -0
  77. package/packages/schema/tests/generator/prisma-builder.test.ts +138 -0
  78. package/packages/schema/tests/schema/parser.test.ts +423 -0
  79. package/packages/schema/tests/schema/sample-todo.test.ts +14 -0
  80. package/packages/schema/tests/utils.ts +38 -0
  81. package/packages/schema/tsconfig.json +23 -0
  82. package/pnpm-workspace.yaml +3 -0
  83. package/samples/todo/.env +2 -0
  84. package/samples/todo/.eslintrc.json +3 -0
  85. package/samples/todo/.vscode/launch.json +11 -0
  86. package/samples/todo/README.md +34 -0
  87. package/samples/todo/components/AuthGuard.tsx +17 -0
  88. package/samples/todo/components/Avatar.tsx +22 -0
  89. package/samples/todo/components/BreadCrumb.tsx +44 -0
  90. package/samples/todo/components/ManageMembers.tsx +134 -0
  91. package/samples/todo/components/NavBar.tsx +57 -0
  92. package/samples/todo/components/SpaceMembers.tsx +76 -0
  93. package/samples/todo/components/Spaces.tsx +28 -0
  94. package/samples/todo/components/TimeInfo.tsx +17 -0
  95. package/samples/todo/components/Todo.tsx +72 -0
  96. package/samples/todo/components/TodoList.tsx +77 -0
  97. package/samples/todo/lib/context.ts +31 -0
  98. package/samples/todo/next.config.js +10 -0
  99. package/samples/todo/package-lock.json +7527 -0
  100. package/samples/todo/package.json +45 -0
  101. package/samples/todo/pages/_app.tsx +50 -0
  102. package/samples/todo/pages/api/auth/[...nextauth].ts +83 -0
  103. package/samples/todo/pages/api/zenstack/[...path].ts +16 -0
  104. package/samples/todo/pages/create-space.tsx +114 -0
  105. package/samples/todo/pages/index.tsx +32 -0
  106. package/samples/todo/pages/space/[slug]/[listId]/index.tsx +88 -0
  107. package/samples/todo/pages/space/[slug]/index.tsx +169 -0
  108. package/samples/todo/postcss.config.js +6 -0
  109. package/samples/todo/public/avatar.jpg +0 -0
  110. package/samples/todo/public/favicon.ico +0 -0
  111. package/samples/todo/public/logo.png +0 -0
  112. package/samples/todo/public/vercel.svg +4 -0
  113. package/samples/todo/styles/globals.css +7 -0
  114. package/samples/todo/tailwind.config.js +11 -0
  115. package/samples/todo/tsconfig.json +28 -0
  116. package/samples/todo/types/next-auth.d.ts +14 -0
  117. package/samples/todo/types/next.d.ts +16 -0
  118. package/samples/todo/zenstack/migrations/20221014084317_init/migration.sql +153 -0
  119. package/samples/todo/zenstack/migrations/20221020094651_upate_cli/migration.sql +23 -0
  120. package/samples/todo/zenstack/migrations/migration_lock.toml +3 -0
  121. package/samples/todo/zenstack/schema.prisma +126 -0
  122. package/samples/todo/zenstack/schema.zmodel +161 -0
  123. package/tests/integration/jest.config.ts +16 -0
  124. package/tests/integration/package-lock.json +1081 -0
  125. package/tests/integration/package.json +27 -0
  126. package/tests/integration/tests/operation-coverate.test.ts +563 -0
  127. package/tests/integration/tests/operations.zmodel +69 -0
  128. package/tests/integration/tests/todo-e2e.test.ts +577 -0
  129. package/tests/integration/tests/todo.zmodel +123 -0
  130. package/tests/integration/tests/tsconfig.template.json +10 -0
  131. package/tests/integration/tests/utils.ts +133 -0
  132. package/tests/integration/tsconfig.json +10 -0
  133. package/out/cli/cli-util.js +0 -64
  134. package/out/cli/cli-util.js.map +0 -1
  135. package/out/cli/generator.js +0 -1
  136. package/out/cli/generator.js.map +0 -1
  137. package/out/cli/index.js +0 -46
  138. package/out/cli/index.js.map +0 -1
  139. package/out/cli/package.template.json +0 -10
  140. package/out/extension.js +0 -81
  141. package/out/extension.js.map +0 -1
  142. package/out/generator/constants.js +0 -9
  143. package/out/generator/constants.js.map +0 -1
  144. package/out/generator/data-server/index.js +0 -1
  145. package/out/generator/data-server/index.js.map +0 -1
  146. package/out/generator/index.js +0 -98
  147. package/out/generator/index.js.map +0 -1
  148. package/out/generator/next-auth/index.js.map +0 -1
  149. package/out/generator/prisma/expression-writer.js +0 -287
  150. package/out/generator/prisma/expression-writer.js.map +0 -1
  151. package/out/generator/prisma/index.js +0 -38
  152. package/out/generator/prisma/index.js.map +0 -1
  153. package/out/generator/prisma/plain-expression-builder.js +0 -69
  154. package/out/generator/prisma/plain-expression-builder.js.map +0 -1
  155. package/out/generator/prisma/prisma-builder.js +0 -307
  156. package/out/generator/prisma/prisma-builder.js.map +0 -1
  157. package/out/generator/prisma/query-gard-generator.js +0 -159
  158. package/out/generator/prisma/query-gard-generator.js.map +0 -1
  159. package/out/generator/prisma/schema-generator.js +0 -201
  160. package/out/generator/prisma/schema-generator.js.map +0 -1
  161. package/out/generator/query-guard/index.js +0 -2
  162. package/out/generator/query-guard/index.js.map +0 -1
  163. package/out/generator/react-hooks/index.js +0 -179
  164. package/out/generator/react-hooks/index.js.map +0 -1
  165. package/out/generator/server/data/data-generator.js +0 -376
  166. package/out/generator/server/data/data-generator.js.map +0 -1
  167. package/out/generator/server/data/expression-writer.js +0 -287
  168. package/out/generator/server/data/expression-writer.js.map +0 -1
  169. package/out/generator/server/data/plain-expression-builder.js +0 -69
  170. package/out/generator/server/data/plain-expression-builder.js.map +0 -1
  171. package/out/generator/server/data-generator.js +0 -82
  172. package/out/generator/server/data-generator.js.map +0 -1
  173. package/out/generator/server/expression-writer.js +0 -1
  174. package/out/generator/server/expression-writer.js.map +0 -1
  175. package/out/generator/server/function/function-generator.js +0 -50
  176. package/out/generator/server/function/function-generator.js.map +0 -1
  177. package/out/generator/server/function-generator.js +0 -13
  178. package/out/generator/server/function-generator.js.map +0 -1
  179. package/out/generator/server/index.js +0 -88
  180. package/out/generator/server/index.js.map +0 -1
  181. package/out/generator/server/js-expression-builder.js +0 -1
  182. package/out/generator/server/js-expression-builder.js.map +0 -1
  183. package/out/generator/server/plain-expression-builder.js +0 -1
  184. package/out/generator/server/plain-expression-builder.js.map +0 -1
  185. package/out/generator/server/server-code-generator.js +0 -3
  186. package/out/generator/server/server-code-generator.js.map +0 -1
  187. package/out/generator/server/server-code-writer.js +0 -1
  188. package/out/generator/server/server-code-writer.js.map +0 -1
  189. package/out/generator/service/index.js +0 -133
  190. package/out/generator/service/index.js.map +0 -1
  191. package/out/generator/types.js +0 -10
  192. package/out/generator/types.js.map +0 -1
  193. package/out/generator/utils.js +0 -10
  194. package/out/generator/utils.js.map +0 -1
  195. package/out/language-server/generated/ast.js +0 -386
  196. package/out/language-server/generated/ast.js.map +0 -1
  197. package/out/language-server/generated/grammar.js.map +0 -1
  198. package/out/language-server/generated/module.js +0 -23
  199. package/out/language-server/generated/module.js.map +0 -1
  200. package/out/language-server/main.js +0 -12
  201. package/out/language-server/main.js.map +0 -1
  202. package/out/language-server/types.js +0 -3
  203. package/out/language-server/types.js.map +0 -1
  204. package/out/language-server/zmodel-index.js +0 -38
  205. package/out/language-server/zmodel-index.js.map +0 -1
  206. package/out/language-server/zmodel-linker.js +0 -241
  207. package/out/language-server/zmodel-linker.js.map +0 -1
  208. package/out/language-server/zmodel-module.js +0 -51
  209. package/out/language-server/zmodel-module.js.map +0 -1
  210. package/out/language-server/zmodel-scope.js +0 -30
  211. package/out/language-server/zmodel-scope.js.map +0 -1
  212. package/out/language-server/zmodel-validator.js +0 -25
  213. package/out/language-server/zmodel-validator.js.map +0 -1
  214. package/out/utils/indent-string.js +0 -9
  215. package/out/utils/indent-string.js.map +0 -1
@@ -0,0 +1,186 @@
1
+ grammar ZModel
2
+
3
+ entry Model:
4
+ (
5
+ declarations+=AbstractDeclaration
6
+ )*;
7
+
8
+ AbstractDeclaration:
9
+ DataSource | DataModel | Enum | Function | Attribute;
10
+
11
+ // datasource
12
+ DataSource:
13
+ 'datasource' name=ID '{' (fields+=DataSourceField)+ '}';
14
+
15
+ DataSourceField:
16
+ (name=ID '=' value=(LiteralExpr|InvocationExpr));
17
+
18
+ // expression
19
+ Expression:
20
+ LogicalExpr;
21
+
22
+ LiteralExpr:
23
+ value=(BOOLEAN | INT | STRING);
24
+
25
+ ArrayExpr:
26
+ '[' (items+=Expression (',' items+=Expression)*)? ']';
27
+
28
+ type ReferenceTarget = FunctionParam | DataModelField | EnumField;
29
+
30
+ ThisExpr:
31
+ value=THIS;
32
+
33
+ NullExpr:
34
+ value=NULL;
35
+
36
+ ReferenceExpr:
37
+ target=[ReferenceTarget:ID] ('(' ReferenceArgList ')')?;
38
+
39
+ fragment ReferenceArgList:
40
+ args+=ReferenceArg (',' args+=ReferenceArg)*;
41
+
42
+ ReferenceArg:
43
+ name=('sort') ':' value=('Asc'| 'Desc');
44
+
45
+ InvocationExpr:
46
+ function=[Function] '(' ArgumentList? ')';
47
+
48
+ UnaryExpr:
49
+ operator=('!') operand=Expression;
50
+
51
+ // binary operator precedence follow Javascript's rules:
52
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#table
53
+
54
+ MemberAccessExpr infers Expression:
55
+ PrimaryExpr (
56
+ {infer MemberAccessExpr.operand=current}
57
+ ('.' member=[DataModelField])
58
+ )*;
59
+
60
+ CollectionPredicateExpr infers Expression:
61
+ MemberAccessExpr (
62
+ {infer BinaryExpr.left=current}
63
+ operator=('?'|'!'|'^')
64
+ '[' right=Expression ']'
65
+ )*;
66
+
67
+ // TODO: support arithmetics?
68
+ //
69
+ // MultDivExpr infers Expression:
70
+ // CollectionPredicateExpr (
71
+ // {infer BinaryExpr.left=current}
72
+ // operator=('*'|'/')
73
+ // right=CollectionPredicateExpr
74
+ // )*;
75
+
76
+ // AddSubExpr infers Expression:
77
+ // MultDivExpr (
78
+ // {infer BinaryExpr.left=current}
79
+ // operator=('+'|'-')
80
+ // right=MultDivExpr
81
+ // )*;
82
+
83
+ ComparisonExpr infers Expression:
84
+ CollectionPredicateExpr (
85
+ {infer BinaryExpr.left=current}
86
+ operator=('>'|'<'|'>='|'<=')
87
+ right=CollectionPredicateExpr
88
+ )*;
89
+
90
+ EqualityExpr infers Expression:
91
+ ComparisonExpr (
92
+ {infer BinaryExpr.left=current}
93
+ operator=('=='|'!=')
94
+ right=ComparisonExpr
95
+ )*;
96
+
97
+ LogicalExpr infers Expression:
98
+ EqualityExpr (
99
+ {infer BinaryExpr.left=current}
100
+ operator=('&&'|'||')
101
+ right=EqualityExpr
102
+ )*;
103
+
104
+ PrimaryExpr infers Expression:
105
+ '(' Expression ')' |
106
+ ThisExpr |
107
+ NullExpr |
108
+ LiteralExpr |
109
+ InvocationExpr |
110
+ ArrayExpr|
111
+ ReferenceExpr |
112
+ UnaryExpr;
113
+
114
+ fragment ArgumentList:
115
+ args+=Argument (',' args+=Argument)*;
116
+
117
+ Argument:
118
+ (name=ID ':')? value=Expression;
119
+
120
+ // model
121
+ DataModel:
122
+ 'model' name=ID '{' (
123
+ fields+=DataModelField
124
+ | attributes+=DataModelAttribute
125
+ )+
126
+ '}';
127
+
128
+ DataModelField:
129
+ name=ID type=DataModelFieldType (attributes+=DataModelFieldAttribute)*;
130
+
131
+ DataModelFieldType:
132
+ (BuiltinType | reference=[TypeDeclaration:ID]) (array?='[]')? (optional?='?')?;
133
+
134
+ // enum
135
+ Enum:
136
+ 'enum' name=ID '{' (fields+=EnumField)+ '}';
137
+
138
+ EnumField:
139
+ name=ID;
140
+
141
+ // function
142
+ Function:
143
+ 'function' name=ID '(' (params+=FunctionParam (',' params+=FunctionParam)*)? ')' returnType=FunctionParamType '{' (expression=Expression)? '}';
144
+
145
+ FunctionParam:
146
+ name=ID type=FunctionParamType;
147
+
148
+ FunctionParamType:
149
+ (BuiltinType | reference=[TypeDeclaration]) (array?='[]')?;
150
+
151
+ // attribute
152
+ Attribute:
153
+ 'attribute' name=ID '(' (params+=AttributeParam (',' params+=AttributeParam)*)? ')';
154
+
155
+ AttributeParam:
156
+ positional?='_' name=ID type=AttributeParamType;
157
+
158
+ AttributeParamType:
159
+ (BuiltinType | type='FieldReference') array?='[]' optional?='?';
160
+
161
+ type TypeDeclaration = DataModel | Enum;
162
+
163
+ DataModelFieldAttribute:
164
+ '@' decl=[Attribute] ('(' AttributeArgList? ')')?;
165
+
166
+ DataModelAttribute:
167
+ '@@' decl=[Attribute] ('(' AttributeArgList? ')')?;
168
+
169
+ fragment AttributeArgList:
170
+ args+=AttributeArg (',' args+=AttributeArg)*;
171
+
172
+ AttributeArg:
173
+ (name=ID ':')? value=Expression;
174
+
175
+ fragment BuiltinType:
176
+ type=('String'|'Boolean'|'Int'|'DateTime'|'JSON');
177
+
178
+ hidden terminal WS: /\s+/;
179
+ terminal BOOLEAN returns boolean: /true|false/;
180
+ terminal NULL: 'null';
181
+ terminal THIS: 'this';
182
+ terminal ID: /[_a-zA-Z][\w_]*/;
183
+ terminal STRING: /"[^"]*"|'[^']*'/;
184
+ terminal INT returns number: /[+-]?[0-9]+/;
185
+ hidden terminal ML_COMMENT: /\/\*[\s\S]*?\*\//;
186
+ hidden terminal SL_COMMENT: /\/\/[^\n\r]*/;
@@ -0,0 +1,5 @@
1
+ import { execSync as _exec } from 'child_process';
2
+
3
+ export function execSync(cmd: string) {
4
+ _exec(cmd, { encoding: 'utf-8', stdio: 'inherit' });
5
+ }
@@ -0,0 +1,6 @@
1
+ // https://github.com/sindresorhus/indent-string
2
+
3
+ export default function indentString(string: string, count = 4) {
4
+ const indent = ' ';
5
+ return string.replace(/^(?!\s*$)/gm, indent.repeat(count));
6
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "zmodel",
3
+ "scopeName": "source.zmodel",
4
+ "fileTypes": [
5
+ ".zmodel"
6
+ ],
7
+ "patterns": [
8
+ {
9
+ "include": "#comments"
10
+ },
11
+ {
12
+ "name": "keyword.control.zmodel",
13
+ "match": "\\b(Boolean|datasource|enum|model|String)\\b"
14
+ },
15
+ {
16
+ "name": "string.quoted.double.zmodel",
17
+ "begin": "\"",
18
+ "end": "\""
19
+ },
20
+ {
21
+ "name": "string.quoted.single.zmodel",
22
+ "begin": "'",
23
+ "end": "'"
24
+ }
25
+ ],
26
+ "repository": {
27
+ "comments": {
28
+ "patterns": [
29
+ {
30
+ "name": "comment.block.zmodel",
31
+ "begin": "/\\*",
32
+ "beginCaptures": {
33
+ "0": {
34
+ "name": "punctuation.definition.comment.zmodel"
35
+ }
36
+ },
37
+ "end": "\\*/",
38
+ "endCaptures": {
39
+ "0": {
40
+ "name": "punctuation.definition.comment.zmodel"
41
+ }
42
+ }
43
+ },
44
+ {
45
+ "begin": "//",
46
+ "beginCaptures": {
47
+ "1": {
48
+ "name": "punctuation.whitespace.comment.leading.zmodel"
49
+ }
50
+ },
51
+ "end": "(?=$)",
52
+ "name": "comment.line.zmodel"
53
+ }
54
+ ]
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "zmodel",
3
+ "scopeName": "source.zmodel",
4
+ "fileTypes": [
5
+ ".zmodel"
6
+ ],
7
+ "patterns": [
8
+ {
9
+ "include": "#comments"
10
+ },
11
+ {
12
+ "name": "keyword.control.zmodel",
13
+ "match": "\\b(Asc|attribute|Boolean|datasource|DateTime|Desc|enum|FieldReference|function|Int|JSON|model|sort|String)\\b"
14
+ },
15
+ {
16
+ "name": "string.quoted.double.zmodel",
17
+ "begin": "\"",
18
+ "end": "\""
19
+ },
20
+ {
21
+ "name": "string.quoted.single.zmodel",
22
+ "begin": "'",
23
+ "end": "'"
24
+ }
25
+ ],
26
+ "repository": {
27
+ "comments": {
28
+ "patterns": [
29
+ {
30
+ "name": "comment.block.zmodel",
31
+ "begin": "/\\*",
32
+ "beginCaptures": {
33
+ "0": {
34
+ "name": "punctuation.definition.comment.zmodel"
35
+ }
36
+ },
37
+ "end": "\\*/",
38
+ "endCaptures": {
39
+ "0": {
40
+ "name": "punctuation.definition.comment.zmodel"
41
+ }
42
+ }
43
+ },
44
+ {
45
+ "begin": "//",
46
+ "beginCaptures": {
47
+ "1": {
48
+ "name": "punctuation.whitespace.comment.leading.zmodel"
49
+ }
50
+ },
51
+ "end": "(?=$)",
52
+ "name": "comment.line.zmodel"
53
+ }
54
+ ]
55
+ }
56
+ }
57
+ }