zenstack 0.1.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/bin/cli +3 -0
  3. package/out/cli/cli-util.js +64 -0
  4. package/out/cli/cli-util.js.map +1 -0
  5. package/out/cli/generator.js +1 -0
  6. package/out/cli/generator.js.map +1 -0
  7. package/out/cli/index.js +90 -0
  8. package/out/cli/index.js.map +1 -0
  9. package/out/extension.js +81 -0
  10. package/out/extension.js.map +1 -0
  11. package/out/generator/data-server/index.js +1 -0
  12. package/out/generator/data-server/index.js.map +1 -0
  13. package/out/generator/next-auth/index.js +196 -0
  14. package/out/generator/next-auth/index.js.map +1 -0
  15. package/out/generator/prisma/index.js +212 -0
  16. package/out/generator/prisma/index.js.map +1 -0
  17. package/out/generator/prisma/prisma-builder.js +307 -0
  18. package/out/generator/prisma/prisma-builder.js.map +1 -0
  19. package/out/generator/react-hooks/index.js +258 -0
  20. package/out/generator/react-hooks/index.js.map +1 -0
  21. package/out/generator/server/data/data-generator.js +376 -0
  22. package/out/generator/server/data/data-generator.js.map +1 -0
  23. package/out/generator/server/data/expression-writer.js +281 -0
  24. package/out/generator/server/data/expression-writer.js.map +1 -0
  25. package/out/generator/server/data/plain-expression-builder.js +53 -0
  26. package/out/generator/server/data/plain-expression-builder.js.map +1 -0
  27. package/out/generator/server/data-generator.js +82 -0
  28. package/out/generator/server/data-generator.js.map +1 -0
  29. package/out/generator/server/expression-writer.js +1 -0
  30. package/out/generator/server/expression-writer.js.map +1 -0
  31. package/out/generator/server/function/function-generator.js +50 -0
  32. package/out/generator/server/function/function-generator.js.map +1 -0
  33. package/out/generator/server/function-generator.js +13 -0
  34. package/out/generator/server/function-generator.js.map +1 -0
  35. package/out/generator/server/index.js +88 -0
  36. package/out/generator/server/index.js.map +1 -0
  37. package/out/generator/server/js-expression-builder.js +1 -0
  38. package/out/generator/server/js-expression-builder.js.map +1 -0
  39. package/out/generator/server/plain-expression-builder.js +1 -0
  40. package/out/generator/server/plain-expression-builder.js.map +1 -0
  41. package/out/generator/server/server-code-generator.js +3 -0
  42. package/out/generator/server/server-code-generator.js.map +1 -0
  43. package/out/generator/server/server-code-writer.js +1 -0
  44. package/out/generator/server/server-code-writer.js.map +1 -0
  45. package/out/generator/service/index.js +72 -0
  46. package/out/generator/service/index.js.map +1 -0
  47. package/out/generator/types.js +10 -0
  48. package/out/generator/types.js.map +1 -0
  49. package/out/generator/utils.js +10 -0
  50. package/out/generator/utils.js.map +1 -0
  51. package/out/language-server/generated/ast.js +386 -0
  52. package/out/language-server/generated/ast.js.map +1 -0
  53. package/out/language-server/generated/grammar.js +2193 -0
  54. package/out/language-server/generated/grammar.js.map +1 -0
  55. package/out/language-server/generated/module.js +23 -0
  56. package/out/language-server/generated/module.js.map +1 -0
  57. package/out/language-server/main.js +12 -0
  58. package/out/language-server/main.js.map +1 -0
  59. package/out/language-server/stdlib.zmodel +21 -0
  60. package/out/language-server/types.js +3 -0
  61. package/out/language-server/types.js.map +1 -0
  62. package/out/language-server/zmodel-index.js +38 -0
  63. package/out/language-server/zmodel-index.js.map +1 -0
  64. package/out/language-server/zmodel-linker.js +239 -0
  65. package/out/language-server/zmodel-linker.js.map +1 -0
  66. package/out/language-server/zmodel-module.js +51 -0
  67. package/out/language-server/zmodel-module.js.map +1 -0
  68. package/out/language-server/zmodel-scope.js +30 -0
  69. package/out/language-server/zmodel-scope.js.map +1 -0
  70. package/out/language-server/zmodel-validator.js +25 -0
  71. package/out/language-server/zmodel-validator.js.map +1 -0
  72. package/out/utils/indent-string.js +25 -0
  73. package/out/utils/indent-string.js.map +1 -0
  74. package/package.json +94 -0
  75. package/src/cli/cli-util.ts +80 -0
  76. package/src/cli/index.ts +80 -0
  77. package/src/extension.ts +76 -0
  78. package/src/generator/next-auth/index.ts +183 -0
  79. package/src/generator/prisma/index.ts +323 -0
  80. package/src/generator/prisma/prisma-builder.ts +366 -0
  81. package/src/generator/react-hooks/index.ts +267 -0
  82. package/src/generator/server/data/data-generator.ts +483 -0
  83. package/src/generator/server/data/expression-writer.ts +350 -0
  84. package/src/generator/server/data/plain-expression-builder.ts +72 -0
  85. package/src/generator/server/function/function-generator.ts +32 -0
  86. package/src/generator/server/index.ts +57 -0
  87. package/src/generator/server/server-code-generator.ts +6 -0
  88. package/src/generator/service/index.ts +43 -0
  89. package/src/generator/types.ts +16 -0
  90. package/src/generator/utils.ts +9 -0
  91. package/src/language-server/generated/ast.ts +603 -0
  92. package/src/language-server/generated/grammar.ts +2190 -0
  93. package/src/language-server/generated/module.ts +24 -0
  94. package/src/language-server/main.ts +12 -0
  95. package/src/language-server/stdlib.zmodel +21 -0
  96. package/src/language-server/types.ts +9 -0
  97. package/src/language-server/zmodel-index.ts +33 -0
  98. package/src/language-server/zmodel-linker.ts +407 -0
  99. package/src/language-server/zmodel-module.ts +90 -0
  100. package/src/language-server/zmodel-scope.ts +21 -0
  101. package/src/language-server/zmodel-validator.ts +35 -0
  102. package/src/language-server/zmodel.langium +186 -0
  103. package/src/utils/indent-string.ts +41 -0
@@ -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,41 @@
1
+ // https://github.com/sindresorhus/indent-string
2
+
3
+ export default function indentString(
4
+ string: string,
5
+ count = 4,
6
+ options: { indent?: string; includeEmptyLines?: boolean } = {}
7
+ ) {
8
+ const { indent = ' ', includeEmptyLines = false } = options;
9
+
10
+ if (typeof string !== 'string') {
11
+ throw new TypeError(
12
+ `Expected \`input\` to be a \`string\`, got \`${typeof string}\``
13
+ );
14
+ }
15
+
16
+ if (typeof count !== 'number') {
17
+ throw new TypeError(
18
+ `Expected \`count\` to be a \`number\`, got \`${typeof count}\``
19
+ );
20
+ }
21
+
22
+ if (count < 0) {
23
+ throw new RangeError(
24
+ `Expected \`count\` to be at least 0, got \`${count}\``
25
+ );
26
+ }
27
+
28
+ if (typeof indent !== 'string') {
29
+ throw new TypeError(
30
+ `Expected \`options.indent\` to be a \`string\`, got \`${typeof indent}\``
31
+ );
32
+ }
33
+
34
+ if (count === 0) {
35
+ return string;
36
+ }
37
+
38
+ const regex = includeEmptyLines ? /^/gm : /^(?!\s*$)/gm;
39
+
40
+ return string.replace(regex, indent.repeat(count));
41
+ }