zenstack 1.0.0 → 1.0.16
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/LICENSE +1 -1
- package/README.md +126 -1
- package/bin/cli +3 -0
- package/bin/post-install.js +24 -0
- package/cli/cli-error.d.ts +5 -0
- package/cli/cli-error.js +10 -0
- package/cli/cli-error.js.map +1 -0
- package/cli/cli-util.d.ts +18 -0
- package/cli/cli-util.js +143 -0
- package/cli/cli-util.js.map +1 -0
- package/cli/index.d.ts +15 -0
- package/cli/index.js +121 -0
- package/cli/index.js.map +1 -0
- package/cli/plugin-runner.d.ts +14 -0
- package/cli/plugin-runner.js +145 -0
- package/cli/plugin-runner.js.map +1 -0
- package/constants.d.ts +1 -0
- package/constants.js +6 -0
- package/constants.js.map +1 -0
- package/language-server/constants.d.ts +15 -0
- package/language-server/constants.js +20 -0
- package/language-server/constants.js.map +1 -0
- package/language-server/main.d.ts +1 -0
- package/language-server/main.js +13 -0
- package/language-server/main.js.map +1 -0
- package/language-server/types.d.ts +10 -0
- package/language-server/types.js +3 -0
- package/language-server/types.js.map +1 -0
- package/language-server/utils.d.ts +18 -0
- package/language-server/utils.js +58 -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 +11 -0
- package/language-server/validator/attribute-validator.js.map +1 -0
- package/language-server/validator/datamodel-validator.d.ts +15 -0
- package/language-server/validator/datamodel-validator.js +278 -0
- package/language-server/validator/datamodel-validator.js.map +1 -0
- package/language-server/validator/datasource-validator.d.ts +12 -0
- package/language-server/validator/datasource-validator.js +66 -0
- package/language-server/validator/datasource-validator.js.map +1 -0
- package/language-server/validator/enum-validator.d.ts +11 -0
- package/language-server/validator/enum-validator.js +28 -0
- package/language-server/validator/enum-validator.js.map +1 -0
- package/language-server/validator/expression-validator.d.ts +10 -0
- package/language-server/validator/expression-validator.js +30 -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 +28 -0
- package/language-server/validator/schema-validator.js.map +1 -0
- package/language-server/validator/utils.d.ts +25 -0
- package/language-server/validator/utils.js +257 -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 +69 -0
- package/language-server/validator/zmodel-validator.js.map +1 -0
- package/language-server/zmodel-code-action.d.ts +14 -0
- package/language-server/zmodel-code-action.js +93 -0
- package/language-server/zmodel-code-action.js.map +1 -0
- package/language-server/zmodel-formatter.d.ts +9 -0
- package/language-server/zmodel-formatter.js +76 -0
- package/language-server/zmodel-formatter.js.map +1 -0
- package/language-server/zmodel-linker.d.ts +29 -0
- package/language-server/zmodel-linker.js +366 -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 +80 -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 +44 -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 +37 -0
- package/language-server/zmodel-workspace-manager.js.map +1 -0
- package/package.json +133 -8
- package/plugins/access-policy/expression-writer.d.ts +39 -0
- package/plugins/access-policy/expression-writer.js +361 -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 +24 -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 +349 -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 +111 -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 +14 -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 +158 -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 +168 -0
- package/plugins/model-meta/index.js.map +1 -0
- package/plugins/plugin-utils.d.ts +16 -0
- package/plugins/plugin-utils.js +54 -0
- package/plugins/plugin-utils.js.map +1 -0
- package/plugins/prisma/indent-string.d.ts +4 -0
- package/plugins/prisma/indent-string.js +12 -0
- package/plugins/prisma/indent-string.js.map +1 -0
- package/plugins/prisma/index.d.ts +4 -0
- package/plugins/prisma/index.js +24 -0
- package/plugins/prisma/index.js.map +1 -0
- package/plugins/prisma/prisma-builder.d.ts +152 -0
- package/plugins/prisma/prisma-builder.js +363 -0
- package/plugins/prisma/prisma-builder.js.map +1 -0
- package/plugins/prisma/schema-generator.d.ts +25 -0
- package/plugins/prisma/schema-generator.js +292 -0
- package/plugins/prisma/schema-generator.js.map +1 -0
- package/plugins/prisma/zmodel-code-generator.d.ts +28 -0
- package/plugins/prisma/zmodel-code-generator.js +114 -0
- package/plugins/prisma/zmodel-code-generator.js.map +1 -0
- package/res/prism-zmodel.js +20 -0
- package/res/starter.zmodel +51 -0
- package/res/stdlib.zmodel +346 -0
- package/telemetry.d.ts +20 -0
- package/telemetry.js +119 -0
- package/telemetry.js.map +1 -0
- package/types.d.ts +12 -0
- package/types.js +3 -0
- package/types.js.map +1 -0
- package/utils/ast-utils.d.ts +16 -0
- package/utils/ast-utils.js +85 -0
- package/utils/ast-utils.js.map +1 -0
- package/utils/exec-utils.d.ts +6 -0
- package/utils/exec-utils.js +13 -0
- package/utils/exec-utils.js.map +1 -0
- package/utils/pkg-utils.d.ts +3 -0
- package/utils/pkg-utils.js +46 -0
- package/utils/pkg-utils.js.map +1 -0
- package/utils/version-utils.d.ts +1 -0
- package/utils/version-utils.js +14 -0
- package/utils/version-utils.js.map +1 -0
- package/.vscode/extensions.json +0 -7
- package/.vscode/launch.json +0 -49
- package/.vscode/settings.json +0 -4
- package/packages/internal/jest.config.ts +0 -32
- package/packages/internal/package.json +0 -42
- package/packages/internal/src/constants.ts +0 -1
- package/packages/internal/src/handler/data/guard-utils.ts +0 -7
- package/packages/internal/src/handler/data/handler.ts +0 -415
- package/packages/internal/src/handler/data/query-processor.ts +0 -504
- package/packages/internal/src/handler/index.ts +0 -1
- package/packages/internal/src/handler/types.ts +0 -20
- package/packages/internal/src/index.ts +0 -3
- package/packages/internal/src/request-handler.ts +0 -27
- package/packages/internal/src/request.ts +0 -101
- package/packages/internal/src/types.ts +0 -40
- package/packages/internal/tests/query-processor.test.ts +0 -172
- package/packages/internal/tsconfig.json +0 -21
- package/packages/runtime/auth.d.ts +0 -1
- package/packages/runtime/auth.js +0 -3
- package/packages/runtime/hooks.d.ts +0 -10
- package/packages/runtime/hooks.js +0 -3
- package/packages/runtime/index.d.ts +0 -3
- package/packages/runtime/index.js +0 -1
- package/packages/runtime/package-lock.json +0 -512
- package/packages/runtime/package.json +0 -16
- package/packages/runtime/server.d.ts +0 -1
- package/packages/runtime/server.js +0 -3
- package/packages/runtime/types.d.ts +0 -1
- package/packages/runtime/types.js +0 -3
- package/packages/schema/.eslintrc.json +0 -13
- package/packages/schema/.vscodeignore +0 -4
- package/packages/schema/asset/logo-dark.png +0 -0
- package/packages/schema/asset/logo-light.png +0 -0
- package/packages/schema/bin/cli +0 -3
- package/packages/schema/jest.config.ts +0 -32
- package/packages/schema/langium-config.json +0 -14
- package/packages/schema/langium-quickstart.md +0 -41
- package/packages/schema/language-configuration.json +0 -30
- package/packages/schema/package.json +0 -96
- package/packages/schema/src/cli/cli-util.ts +0 -80
- package/packages/schema/src/cli/index.ts +0 -64
- package/packages/schema/src/extension.ts +0 -76
- package/packages/schema/src/generator/constants.ts +0 -5
- package/packages/schema/src/generator/index.ts +0 -92
- package/packages/schema/src/generator/next-auth/index.ts +0 -197
- package/packages/schema/src/generator/package.template.json +0 -9
- package/packages/schema/src/generator/prisma/expression-writer.ts +0 -352
- package/packages/schema/src/generator/prisma/index.ts +0 -32
- package/packages/schema/src/generator/prisma/plain-expression-builder.ts +0 -91
- package/packages/schema/src/generator/prisma/prisma-builder.ts +0 -366
- package/packages/schema/src/generator/prisma/query-gard-generator.ts +0 -208
- package/packages/schema/src/generator/prisma/schema-generator.ts +0 -300
- package/packages/schema/src/generator/react-hooks/index.ts +0 -181
- package/packages/schema/src/generator/service/index.ts +0 -107
- package/packages/schema/src/generator/tsconfig.template.json +0 -17
- package/packages/schema/src/generator/types.ts +0 -17
- package/packages/schema/src/generator/utils.ts +0 -9
- package/packages/schema/src/language-server/generated/ast.ts +0 -603
- package/packages/schema/src/language-server/generated/grammar.ts +0 -2190
- package/packages/schema/src/language-server/generated/module.ts +0 -24
- package/packages/schema/src/language-server/main.ts +0 -12
- package/packages/schema/src/language-server/stdlib.zmodel +0 -22
- package/packages/schema/src/language-server/types.ts +0 -9
- package/packages/schema/src/language-server/zmodel-index.ts +0 -33
- package/packages/schema/src/language-server/zmodel-linker.ts +0 -409
- package/packages/schema/src/language-server/zmodel-module.ts +0 -90
- package/packages/schema/src/language-server/zmodel-scope.ts +0 -21
- package/packages/schema/src/language-server/zmodel-validator.ts +0 -35
- package/packages/schema/src/language-server/zmodel.langium +0 -186
- package/packages/schema/src/utils/exec-utils.ts +0 -5
- package/packages/schema/src/utils/indent-string.ts +0 -6
- package/packages/schema/syntaxes/zmodel.json +0 -57
- package/packages/schema/syntaxes/zmodel.tmLanguage.json +0 -57
- package/packages/schema/tests/generator/expression-writer.test.ts +0 -676
- package/packages/schema/tests/generator/prisma-builder.test.ts +0 -138
- package/packages/schema/tests/schema/parser.test.ts +0 -423
- package/packages/schema/tests/schema/sample-todo.test.ts +0 -14
- package/packages/schema/tests/utils.ts +0 -38
- package/packages/schema/tsconfig.json +0 -23
- package/pnpm-workspace.yaml +0 -3
- package/samples/todo/.env +0 -2
- package/samples/todo/.eslintrc.json +0 -3
- package/samples/todo/.vscode/launch.json +0 -11
- package/samples/todo/README.md +0 -34
- package/samples/todo/components/AuthGuard.tsx +0 -17
- package/samples/todo/components/Avatar.tsx +0 -22
- package/samples/todo/components/BreadCrumb.tsx +0 -44
- package/samples/todo/components/ManageMembers.tsx +0 -134
- package/samples/todo/components/NavBar.tsx +0 -57
- package/samples/todo/components/SpaceMembers.tsx +0 -76
- package/samples/todo/components/Spaces.tsx +0 -28
- package/samples/todo/components/TimeInfo.tsx +0 -17
- package/samples/todo/components/Todo.tsx +0 -72
- package/samples/todo/components/TodoList.tsx +0 -77
- package/samples/todo/lib/context.ts +0 -31
- package/samples/todo/next.config.js +0 -10
- package/samples/todo/package-lock.json +0 -7527
- package/samples/todo/package.json +0 -45
- package/samples/todo/pages/_app.tsx +0 -50
- package/samples/todo/pages/api/auth/[...nextauth].ts +0 -83
- package/samples/todo/pages/api/zenstack/[...path].ts +0 -16
- package/samples/todo/pages/create-space.tsx +0 -114
- package/samples/todo/pages/index.tsx +0 -32
- package/samples/todo/pages/space/[slug]/[listId]/index.tsx +0 -88
- package/samples/todo/pages/space/[slug]/index.tsx +0 -169
- package/samples/todo/postcss.config.js +0 -6
- package/samples/todo/public/avatar.jpg +0 -0
- package/samples/todo/public/favicon.ico +0 -0
- package/samples/todo/public/logo.png +0 -0
- package/samples/todo/public/vercel.svg +0 -4
- package/samples/todo/styles/globals.css +0 -7
- package/samples/todo/tailwind.config.js +0 -11
- package/samples/todo/tsconfig.json +0 -28
- package/samples/todo/types/next-auth.d.ts +0 -14
- package/samples/todo/types/next.d.ts +0 -16
- package/samples/todo/zenstack/migrations/20221014084317_init/migration.sql +0 -153
- package/samples/todo/zenstack/migrations/20221020094651_upate_cli/migration.sql +0 -23
- package/samples/todo/zenstack/migrations/migration_lock.toml +0 -3
- package/samples/todo/zenstack/schema.prisma +0 -126
- package/samples/todo/zenstack/schema.zmodel +0 -161
- package/tests/integration/jest.config.ts +0 -16
- package/tests/integration/package-lock.json +0 -1081
- package/tests/integration/package.json +0 -27
- package/tests/integration/tests/operation-coverate.test.ts +0 -563
- package/tests/integration/tests/operations.zmodel +0 -69
- package/tests/integration/tests/todo-e2e.test.ts +0 -577
- package/tests/integration/tests/todo.zmodel +0 -123
- package/tests/integration/tests/tsconfig.template.json +0 -10
- package/tests/integration/tests/utils.ts +0 -133
- package/tests/integration/tsconfig.json +0 -10
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.validateAttributeApplication = exports.assignableToAttributeParam = exports.mapBuiltinTypeToExpressionType = exports.typeAssignable = exports.getStringLiteral = exports.validateDuplicatedDeclarations = void 0;
|
|
7
|
+
const ast_1 = require("@zenstackhq/language/ast");
|
|
8
|
+
const sdk_1 = require("@zenstackhq/sdk");
|
|
9
|
+
const pluralize_1 = __importDefault(require("pluralize"));
|
|
10
|
+
/**
|
|
11
|
+
* Checks if the given declarations have duplicated names
|
|
12
|
+
*/
|
|
13
|
+
function validateDuplicatedDeclarations(decls, accept) {
|
|
14
|
+
const groupByName = decls.reduce((group, decl) => {
|
|
15
|
+
var _a;
|
|
16
|
+
group[decl.name] = (_a = group[decl.name]) !== null && _a !== void 0 ? _a : [];
|
|
17
|
+
group[decl.name].push(decl);
|
|
18
|
+
return group;
|
|
19
|
+
}, {});
|
|
20
|
+
for (const [name, decls] of Object.entries(groupByName)) {
|
|
21
|
+
if (decls.length > 1) {
|
|
22
|
+
accept('error', `Duplicated declaration name "${name}"`, {
|
|
23
|
+
node: decls[1],
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.validateDuplicatedDeclarations = validateDuplicatedDeclarations;
|
|
29
|
+
/**
|
|
30
|
+
* Try getting string value from a potential string literal expression
|
|
31
|
+
*/
|
|
32
|
+
function getStringLiteral(node) {
|
|
33
|
+
if ((0, ast_1.isLiteralExpr)(node) && typeof node.value === 'string') {
|
|
34
|
+
return node.value;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.getStringLiteral = getStringLiteral;
|
|
41
|
+
const isoDateTimeRegex = /^\d{4}(-\d\d(-\d\d(T\d\d:\d\d(:\d\d)?(\.\d+)?(([+-]\d\d:\d\d)|Z)?)?)?)?$/i;
|
|
42
|
+
/**
|
|
43
|
+
* Determines if the given sourceType is assignable to a destination of destType
|
|
44
|
+
*/
|
|
45
|
+
function typeAssignable(destType, sourceType, sourceExpr) {
|
|
46
|
+
// implicit conversion from ISO datetime string to datetime
|
|
47
|
+
if (destType === 'DateTime' && sourceType === 'String' && sourceExpr && (0, ast_1.isLiteralExpr)(sourceExpr)) {
|
|
48
|
+
const literal = getStringLiteral(sourceExpr);
|
|
49
|
+
if (literal && isoDateTimeRegex.test(literal)) {
|
|
50
|
+
// implicitly convert to DateTime
|
|
51
|
+
sourceType = 'DateTime';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
switch (destType) {
|
|
55
|
+
case 'Any':
|
|
56
|
+
return true;
|
|
57
|
+
case 'Float':
|
|
58
|
+
return sourceType === 'Any' || sourceType === 'Int' || sourceType === 'Float';
|
|
59
|
+
default:
|
|
60
|
+
return sourceType === 'Any' || sourceType === destType;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.typeAssignable = typeAssignable;
|
|
64
|
+
/**
|
|
65
|
+
* Maps a ZModel builtin type to expression type
|
|
66
|
+
*/
|
|
67
|
+
function mapBuiltinTypeToExpressionType(type) {
|
|
68
|
+
switch (type) {
|
|
69
|
+
case 'Any':
|
|
70
|
+
case 'Boolean':
|
|
71
|
+
case 'String':
|
|
72
|
+
case 'DateTime':
|
|
73
|
+
case 'Int':
|
|
74
|
+
case 'Float':
|
|
75
|
+
case 'Null':
|
|
76
|
+
return type;
|
|
77
|
+
case 'BigInt':
|
|
78
|
+
return 'Int';
|
|
79
|
+
case 'Decimal':
|
|
80
|
+
return 'Float';
|
|
81
|
+
case 'Json':
|
|
82
|
+
case 'Bytes':
|
|
83
|
+
return 'Any';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.mapBuiltinTypeToExpressionType = mapBuiltinTypeToExpressionType;
|
|
87
|
+
/**
|
|
88
|
+
* Determines if the given attribute argument is assignable to the given attribute parameter
|
|
89
|
+
*/
|
|
90
|
+
function assignableToAttributeParam(arg, param, attr) {
|
|
91
|
+
var _a, _b, _c, _d;
|
|
92
|
+
const argResolvedType = arg.$resolvedType;
|
|
93
|
+
if (!argResolvedType) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
let dstType = param.type.type;
|
|
97
|
+
let dstIsArray = param.type.array;
|
|
98
|
+
const dstRef = param.type.reference;
|
|
99
|
+
// destination is field reference or transitive field reference, check if
|
|
100
|
+
// argument is reference or array or reference
|
|
101
|
+
if (dstType === 'FieldReference' || dstType === 'TransitiveFieldReference') {
|
|
102
|
+
if (dstIsArray) {
|
|
103
|
+
return ((0, ast_1.isArrayExpr)(arg.value) &&
|
|
104
|
+
!arg.value.items.find((item) => !(0, ast_1.isReferenceExpr)(item) || !(0, ast_1.isDataModelField)(item.target.ref)));
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
return (0, ast_1.isReferenceExpr)(arg.value) && (0, ast_1.isDataModelField)(arg.value.target.ref);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if ((0, ast_1.isEnum)(argResolvedType.decl)) {
|
|
111
|
+
// enum type
|
|
112
|
+
let attrArgDeclType = dstRef === null || dstRef === void 0 ? void 0 : dstRef.ref;
|
|
113
|
+
if (dstType === 'ContextType' && (0, ast_1.isDataModelField)(attr.$container) && ((_b = (_a = attr.$container) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.reference)) {
|
|
114
|
+
// attribute parameter type is ContextType, need to infer type from
|
|
115
|
+
// the attribute's container
|
|
116
|
+
attrArgDeclType = (0, sdk_1.resolved)(attr.$container.type.reference);
|
|
117
|
+
dstIsArray = attr.$container.type.array;
|
|
118
|
+
}
|
|
119
|
+
return attrArgDeclType === argResolvedType.decl && dstIsArray === argResolvedType.array;
|
|
120
|
+
}
|
|
121
|
+
else if (dstType) {
|
|
122
|
+
// scalar type
|
|
123
|
+
if (typeof (argResolvedType === null || argResolvedType === void 0 ? void 0 : argResolvedType.decl) !== 'string') {
|
|
124
|
+
// destination type is not a reference, so argument type must be a plain expression
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
if (dstType === 'ContextType') {
|
|
128
|
+
// attribute parameter type is ContextType, need to infer type from
|
|
129
|
+
// the attribute's container
|
|
130
|
+
if ((0, ast_1.isDataModelField)(attr.$container)) {
|
|
131
|
+
if (!((_d = (_c = attr.$container) === null || _c === void 0 ? void 0 : _c.type) === null || _d === void 0 ? void 0 : _d.type)) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
dstType = mapBuiltinTypeToExpressionType(attr.$container.type.type);
|
|
135
|
+
dstIsArray = attr.$container.type.array;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
dstType = 'Any';
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return (typeAssignable(dstType, argResolvedType.decl, arg.value) &&
|
|
142
|
+
(dstType === 'Any' || dstIsArray === argResolvedType.array));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// reference type
|
|
146
|
+
return (dstRef === null || dstRef === void 0 ? void 0 : dstRef.ref) === argResolvedType.decl && dstIsArray === argResolvedType.array;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.assignableToAttributeParam = assignableToAttributeParam;
|
|
150
|
+
function validateAttributeApplication(attr, accept) {
|
|
151
|
+
const decl = attr.decl.ref;
|
|
152
|
+
if (!decl) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const targetDecl = attr.$container;
|
|
156
|
+
if (decl.name === '@@@targetField' && !(0, ast_1.isAttribute)(targetDecl)) {
|
|
157
|
+
accept('error', `attribute "${decl.name}" can only be used on attribute declarations`, { node: attr });
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if ((0, ast_1.isDataModelField)(targetDecl) && !isValidAttributeTarget(decl, targetDecl)) {
|
|
161
|
+
accept('error', `attribute "${decl.name}" cannot be used on this type of field`, { node: attr });
|
|
162
|
+
}
|
|
163
|
+
const filledParams = new Set();
|
|
164
|
+
for (const arg of attr.args) {
|
|
165
|
+
let paramDecl;
|
|
166
|
+
if (!arg.name) {
|
|
167
|
+
paramDecl = decl.params.find((p) => p.default && !filledParams.has(p));
|
|
168
|
+
if (!paramDecl) {
|
|
169
|
+
accept('error', `Unexpected unnamed argument`, {
|
|
170
|
+
node: arg,
|
|
171
|
+
});
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
paramDecl = decl.params.find((p) => p.name === arg.name);
|
|
177
|
+
if (!paramDecl) {
|
|
178
|
+
accept('error', `Attribute "${decl.name}" doesn't have a parameter named "${arg.name}"`, {
|
|
179
|
+
node: arg,
|
|
180
|
+
});
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (!assignableToAttributeParam(arg, paramDecl, attr)) {
|
|
185
|
+
accept('error', `Value is not assignable to parameter`, {
|
|
186
|
+
node: arg,
|
|
187
|
+
});
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
if (filledParams.has(paramDecl)) {
|
|
191
|
+
accept('error', `Parameter "${paramDecl.name}" is already provided`, { node: arg });
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
filledParams.add(paramDecl);
|
|
195
|
+
arg.$resolvedParam = paramDecl;
|
|
196
|
+
}
|
|
197
|
+
const missingParams = decl.params.filter((p) => !p.type.optional && !filledParams.has(p));
|
|
198
|
+
if (missingParams.length > 0) {
|
|
199
|
+
accept('error', `Required ${(0, pluralize_1.default)('parameter', missingParams.length)} not provided: ${missingParams
|
|
200
|
+
.map((p) => p.name)
|
|
201
|
+
.join(', ')}`, { node: attr });
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
exports.validateAttributeApplication = validateAttributeApplication;
|
|
207
|
+
function isValidAttributeTarget(attrDecl, targetDecl) {
|
|
208
|
+
var _a;
|
|
209
|
+
const targetField = attrDecl.attributes.find((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@@targetField'; });
|
|
210
|
+
if (!targetField) {
|
|
211
|
+
// no field type constraint
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
const fieldTypes = targetField.args[0].value.items.map((item) => { var _a; return (_a = item.target.ref) === null || _a === void 0 ? void 0 : _a.name; });
|
|
215
|
+
let allowed = false;
|
|
216
|
+
for (const allowedType of fieldTypes) {
|
|
217
|
+
switch (allowedType) {
|
|
218
|
+
case 'StringField':
|
|
219
|
+
allowed = allowed || targetDecl.type.type === 'String';
|
|
220
|
+
break;
|
|
221
|
+
case 'IntField':
|
|
222
|
+
allowed = allowed || targetDecl.type.type === 'Int';
|
|
223
|
+
break;
|
|
224
|
+
case 'BigIntField':
|
|
225
|
+
allowed = allowed || targetDecl.type.type === 'BigInt';
|
|
226
|
+
break;
|
|
227
|
+
case 'FloatField':
|
|
228
|
+
allowed = allowed || targetDecl.type.type === 'Float';
|
|
229
|
+
break;
|
|
230
|
+
case 'DecimalField':
|
|
231
|
+
allowed = allowed || targetDecl.type.type === 'Decimal';
|
|
232
|
+
break;
|
|
233
|
+
case 'BooleanField':
|
|
234
|
+
allowed = allowed || targetDecl.type.type === 'Boolean';
|
|
235
|
+
break;
|
|
236
|
+
case 'DateTimeField':
|
|
237
|
+
allowed = allowed || targetDecl.type.type === 'DateTime';
|
|
238
|
+
break;
|
|
239
|
+
case 'JsonField':
|
|
240
|
+
allowed = allowed || targetDecl.type.type === 'Json';
|
|
241
|
+
break;
|
|
242
|
+
case 'BytesField':
|
|
243
|
+
allowed = allowed || targetDecl.type.type === 'Bytes';
|
|
244
|
+
break;
|
|
245
|
+
case 'ModelField':
|
|
246
|
+
allowed = allowed || (0, ast_1.isDataModel)((_a = targetDecl.type.reference) === null || _a === void 0 ? void 0 : _a.ref);
|
|
247
|
+
break;
|
|
248
|
+
default:
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
if (allowed) {
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return allowed;
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/language-server/validator/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ValidationAcceptor, ValidationRegistry } from 'langium';
|
|
2
|
+
import { Attribute, DataModel, DataSource, Enum, Expression, Model } from '@zenstackhq/language/ast';
|
|
3
|
+
import type { ZModelServices } from '../zmodel-module';
|
|
4
|
+
/**
|
|
5
|
+
* Registry for validation checks.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ZModelValidationRegistry extends ValidationRegistry {
|
|
8
|
+
constructor(services: ZModelServices);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Implementation of custom validations.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ZModelValidator {
|
|
14
|
+
private shouldCheck;
|
|
15
|
+
checkModel(node: Model, accept: ValidationAcceptor): void;
|
|
16
|
+
checkDataSource(node: DataSource, accept: ValidationAcceptor): void;
|
|
17
|
+
checkDataModel(node: DataModel, accept: ValidationAcceptor): void;
|
|
18
|
+
checkEnum(node: Enum, accept: ValidationAcceptor): void;
|
|
19
|
+
checkAttribute(node: Attribute, accept: ValidationAcceptor): void;
|
|
20
|
+
checkExpression(node: Expression, accept: ValidationAcceptor): void;
|
|
21
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ZModelValidator = exports.ZModelValidationRegistry = void 0;
|
|
7
|
+
const langium_1 = require("langium");
|
|
8
|
+
const schema_validator_1 = __importDefault(require("./schema-validator"));
|
|
9
|
+
const datasource_validator_1 = __importDefault(require("./datasource-validator"));
|
|
10
|
+
const datamodel_validator_1 = __importDefault(require("./datamodel-validator"));
|
|
11
|
+
const attribute_validator_1 = __importDefault(require("./attribute-validator"));
|
|
12
|
+
const enum_validator_1 = __importDefault(require("./enum-validator"));
|
|
13
|
+
const expression_validator_1 = __importDefault(require("./expression-validator"));
|
|
14
|
+
/**
|
|
15
|
+
* Registry for validation checks.
|
|
16
|
+
*/
|
|
17
|
+
class ZModelValidationRegistry extends langium_1.ValidationRegistry {
|
|
18
|
+
constructor(services) {
|
|
19
|
+
super(services);
|
|
20
|
+
const validator = services.validation.ZModelValidator;
|
|
21
|
+
const checks = {
|
|
22
|
+
Model: validator.checkModel,
|
|
23
|
+
DataSource: validator.checkDataSource,
|
|
24
|
+
DataModel: validator.checkDataModel,
|
|
25
|
+
Enum: validator.checkEnum,
|
|
26
|
+
Attribute: validator.checkAttribute,
|
|
27
|
+
Expression: validator.checkExpression,
|
|
28
|
+
};
|
|
29
|
+
this.register(checks, validator);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.ZModelValidationRegistry = ZModelValidationRegistry;
|
|
33
|
+
/**
|
|
34
|
+
* Implementation of custom validations.
|
|
35
|
+
*/
|
|
36
|
+
class ZModelValidator {
|
|
37
|
+
shouldCheck(node) {
|
|
38
|
+
let doc;
|
|
39
|
+
let currNode = node;
|
|
40
|
+
while (currNode) {
|
|
41
|
+
if (currNode.$document) {
|
|
42
|
+
doc = currNode.$document;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
currNode = currNode.$container;
|
|
46
|
+
}
|
|
47
|
+
return (doc === null || doc === void 0 ? void 0 : doc.parseResult.lexerErrors.length) === 0 && (doc === null || doc === void 0 ? void 0 : doc.parseResult.parserErrors.length) === 0;
|
|
48
|
+
}
|
|
49
|
+
checkModel(node, accept) {
|
|
50
|
+
this.shouldCheck(node) && new schema_validator_1.default().validate(node, accept);
|
|
51
|
+
}
|
|
52
|
+
checkDataSource(node, accept) {
|
|
53
|
+
this.shouldCheck(node) && new datasource_validator_1.default().validate(node, accept);
|
|
54
|
+
}
|
|
55
|
+
checkDataModel(node, accept) {
|
|
56
|
+
this.shouldCheck(node) && new datamodel_validator_1.default().validate(node, accept);
|
|
57
|
+
}
|
|
58
|
+
checkEnum(node, accept) {
|
|
59
|
+
this.shouldCheck(node) && new enum_validator_1.default().validate(node, accept);
|
|
60
|
+
}
|
|
61
|
+
checkAttribute(node, accept) {
|
|
62
|
+
this.shouldCheck(node) && new attribute_validator_1.default().validate(node, accept);
|
|
63
|
+
}
|
|
64
|
+
checkExpression(node, accept) {
|
|
65
|
+
this.shouldCheck(node) && new expression_validator_1.default().validate(node, accept);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.ZModelValidator = ZModelValidator;
|
|
69
|
+
//# sourceMappingURL=zmodel-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zmodel-validator.js","sourceRoot":"","sources":["../../../src/language-server/validator/zmodel-validator.ts"],"names":[],"mappings":";;;;;;AAAA,qCAA6G;AAG7G,0EAAiD;AACjD,kFAAyD;AACzD,gFAAuD;AACvD,gFAAuD;AACvD,sEAA6C;AAC7C,kFAAyD;AAEzD;;GAEG;AACH,MAAa,wBAAyB,SAAQ,4BAAkB;IAC5D,YAAY,QAAwB;QAChC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChB,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC;QACtD,MAAM,MAAM,GAAoC;YAC5C,KAAK,EAAE,SAAS,CAAC,UAAU;YAC3B,UAAU,EAAE,SAAS,CAAC,eAAe;YACrC,SAAS,EAAE,SAAS,CAAC,cAAc;YACnC,IAAI,EAAE,SAAS,CAAC,SAAS;YACzB,SAAS,EAAE,SAAS,CAAC,cAAc;YACnC,UAAU,EAAE,SAAS,CAAC,eAAe;SACxC,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;CACJ;AAdD,4DAcC;AAED;;GAEG;AACH,MAAa,eAAe;IAChB,WAAW,CAAC,IAAa;QAC7B,IAAI,GAAgC,CAAC;QACrC,IAAI,QAAQ,GAAwB,IAAI,CAAC;QACzC,OAAO,QAAQ,EAAE;YACb,IAAI,QAAQ,CAAC,SAAS,EAAE;gBACpB,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC;gBACzB,MAAM;aACT;YACD,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC;SAClC;QAED,OAAO,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,CAAC,WAAW,CAAC,MAAM,MAAK,CAAC,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,CAAC,YAAY,CAAC,MAAM,MAAK,CAAC,CAAC;IACnG,CAAC;IAED,UAAU,CAAC,IAAW,EAAE,MAA0B;QAC9C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,0BAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,eAAe,CAAC,IAAgB,EAAE,MAA0B;QACxD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,8BAAmB,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,cAAc,CAAC,IAAe,EAAE,MAA0B;QACtD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,6BAAkB,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED,SAAS,CAAC,IAAU,EAAE,MAA0B;QAC5C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,wBAAa,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,cAAc,CAAC,IAAe,EAAE,MAA0B;QACtD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,6BAAkB,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED,eAAe,CAAC,IAAgB,EAAE,MAA0B;QACxD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,8BAAmB,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC/E,CAAC;CACJ;AAtCD,0CAsCC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AstReflection, CodeActionProvider, IndexManager, LangiumDocument, LangiumServices, MaybePromise } from 'langium';
|
|
2
|
+
import { CodeAction, CodeActionParams, Command } from 'vscode-languageserver';
|
|
3
|
+
import { ZModelFormatter } from './zmodel-formatter';
|
|
4
|
+
export declare class ZModelCodeActionProvider implements CodeActionProvider {
|
|
5
|
+
protected readonly reflection: AstReflection;
|
|
6
|
+
protected readonly indexManager: IndexManager;
|
|
7
|
+
protected readonly formatter: ZModelFormatter;
|
|
8
|
+
constructor(services: LangiumServices);
|
|
9
|
+
getCodeActions(document: LangiumDocument, params: CodeActionParams): MaybePromise<Array<Command | CodeAction> | undefined>;
|
|
10
|
+
private createCodeActions;
|
|
11
|
+
private fixMissingOppositeRelation;
|
|
12
|
+
private lowerCaseFirstLetter;
|
|
13
|
+
private upperCaseFirstLetter;
|
|
14
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ZModelCodeActionProvider = void 0;
|
|
4
|
+
const ast_1 = require("@zenstackhq/language/ast");
|
|
5
|
+
const langium_1 = require("langium");
|
|
6
|
+
const vscode_languageserver_1 = require("vscode-languageserver");
|
|
7
|
+
const constants_1 = require("./constants");
|
|
8
|
+
class ZModelCodeActionProvider {
|
|
9
|
+
constructor(services) {
|
|
10
|
+
this.reflection = services.shared.AstReflection;
|
|
11
|
+
this.indexManager = services.shared.workspace.IndexManager;
|
|
12
|
+
this.formatter = services.lsp.Formatter;
|
|
13
|
+
}
|
|
14
|
+
getCodeActions(document, params) {
|
|
15
|
+
const result = [];
|
|
16
|
+
const acceptor = (ca) => ca && result.push(ca);
|
|
17
|
+
for (const diagnostic of params.context.diagnostics) {
|
|
18
|
+
this.createCodeActions(diagnostic, document, acceptor);
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
createCodeActions(diagnostic, document, accept) {
|
|
23
|
+
switch (diagnostic.code) {
|
|
24
|
+
case constants_1.IssueCodes.MissingOppositeRelation:
|
|
25
|
+
accept(this.fixMissingOppositeRelation(diagnostic, document));
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
fixMissingOppositeRelation(diagnostic, document) {
|
|
30
|
+
const offset = document.textDocument.offsetAt(diagnostic.range.start);
|
|
31
|
+
const rootCst = document.parseResult.value.$cstNode;
|
|
32
|
+
if (rootCst) {
|
|
33
|
+
const cstNode = (0, langium_1.findDeclarationNodeAtOffset)(rootCst, offset);
|
|
34
|
+
const astNode = cstNode === null || cstNode === void 0 ? void 0 : cstNode.element;
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
36
|
+
const oppositeModel = astNode.type.reference.ref;
|
|
37
|
+
const lastField = oppositeModel.fields[oppositeModel.fields.length - 1];
|
|
38
|
+
const container = (0, langium_1.getContainerOfType)(cstNode === null || cstNode === void 0 ? void 0 : cstNode.element, ast_1.isDataModel);
|
|
39
|
+
const idField = container.fields.find((f) => f.attributes.find((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@id'; }));
|
|
40
|
+
if (container && container.$cstNode && idField) {
|
|
41
|
+
// indent
|
|
42
|
+
let indent = '\t';
|
|
43
|
+
const formatOptions = this.formatter.getFormatOptions();
|
|
44
|
+
if (formatOptions === null || formatOptions === void 0 ? void 0 : formatOptions.insertSpaces) {
|
|
45
|
+
indent = ' '.repeat(formatOptions.tabSize);
|
|
46
|
+
}
|
|
47
|
+
indent = indent.repeat(this.formatter.getIndent());
|
|
48
|
+
const typeName = container.name;
|
|
49
|
+
const fieldName = this.lowerCaseFirstLetter(typeName);
|
|
50
|
+
// might already exist
|
|
51
|
+
let referenceField = '';
|
|
52
|
+
const idFieldName = idField.name;
|
|
53
|
+
const referenceIdFieldName = fieldName + this.upperCaseFirstLetter(idFieldName);
|
|
54
|
+
if (!oppositeModel.fields.find((f) => f.name === referenceIdFieldName)) {
|
|
55
|
+
referenceField = '\n' + indent + `${referenceIdFieldName} ${idField.type.type}`;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
title: `Add opposite relation fields on ${oppositeModel.name}`,
|
|
59
|
+
kind: vscode_languageserver_1.CodeActionKind.QuickFix,
|
|
60
|
+
diagnostics: [diagnostic],
|
|
61
|
+
isPreferred: false,
|
|
62
|
+
edit: {
|
|
63
|
+
changes: {
|
|
64
|
+
[document.textDocument.uri]: [
|
|
65
|
+
{
|
|
66
|
+
range: {
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
68
|
+
start: lastField.$cstNode.range.end,
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
70
|
+
end: lastField.$cstNode.range.end,
|
|
71
|
+
},
|
|
72
|
+
newText: '\n' +
|
|
73
|
+
indent +
|
|
74
|
+
`${fieldName} ${typeName} @relation(fields: [${referenceIdFieldName}], references: [${idFieldName}])` +
|
|
75
|
+
referenceField,
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
lowerCaseFirstLetter(str) {
|
|
86
|
+
return str.charAt(0).toLowerCase() + str.slice(1);
|
|
87
|
+
}
|
|
88
|
+
upperCaseFirstLetter(str) {
|
|
89
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.ZModelCodeActionProvider = ZModelCodeActionProvider;
|
|
93
|
+
//# sourceMappingURL=zmodel-code-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zmodel-code-action.js","sourceRoot":"","sources":["../../src/language-server/zmodel-code-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AbstractFormatter, AstNode, LangiumDocument } from 'langium';
|
|
2
|
+
import { FormattingOptions, Range, TextEdit } from 'vscode-languageserver';
|
|
3
|
+
export declare class ZModelFormatter extends AbstractFormatter {
|
|
4
|
+
private formatOptions?;
|
|
5
|
+
protected format(node: AstNode): void;
|
|
6
|
+
protected doDocumentFormat(document: LangiumDocument<AstNode>, options: FormattingOptions, range?: Range | undefined): TextEdit[];
|
|
7
|
+
getFormatOptions(): FormattingOptions | undefined;
|
|
8
|
+
getIndent(): number;
|
|
9
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.ZModelFormatter = void 0;
|
|
27
|
+
const langium_1 = require("langium");
|
|
28
|
+
const ast = __importStar(require("@zenstackhq/language/ast"));
|
|
29
|
+
class ZModelFormatter extends langium_1.AbstractFormatter {
|
|
30
|
+
format(node) {
|
|
31
|
+
const formatter = this.getNodeFormatter(node);
|
|
32
|
+
if (ast.isDataModelField(node)) {
|
|
33
|
+
formatter.property('type').prepend(langium_1.Formatting.oneSpace());
|
|
34
|
+
if (node.attributes.length > 0) {
|
|
35
|
+
formatter.properties('attributes').prepend(langium_1.Formatting.oneSpace());
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (ast.isDataModelFieldAttribute(node)) {
|
|
39
|
+
formatter.keyword('(').surround(langium_1.Formatting.noSpace());
|
|
40
|
+
formatter.keyword(')').prepend(langium_1.Formatting.noSpace());
|
|
41
|
+
formatter.keyword(',').append(langium_1.Formatting.oneSpace());
|
|
42
|
+
if (node.args.length > 1) {
|
|
43
|
+
formatter.nodes(...node.args.slice(1)).prepend(langium_1.Formatting.oneSpace());
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else if (ast.isAttributeArg(node)) {
|
|
47
|
+
formatter.keyword(':').prepend(langium_1.Formatting.noSpace());
|
|
48
|
+
formatter.keyword(':').append(langium_1.Formatting.oneSpace());
|
|
49
|
+
}
|
|
50
|
+
else if (ast.isAbstractDeclaration(node)) {
|
|
51
|
+
const bracesOpen = formatter.keyword('{');
|
|
52
|
+
const bracesClose = formatter.keyword('}');
|
|
53
|
+
// this line decide the indent count return by this.getIndent()
|
|
54
|
+
formatter.interior(bracesOpen, bracesClose).prepend(langium_1.Formatting.indent());
|
|
55
|
+
bracesOpen.prepend(langium_1.Formatting.oneSpace());
|
|
56
|
+
bracesClose.prepend(langium_1.Formatting.newLine());
|
|
57
|
+
}
|
|
58
|
+
else if (ast.isModel(node)) {
|
|
59
|
+
const model = node;
|
|
60
|
+
const nodes = formatter.nodes(...model.declarations);
|
|
61
|
+
nodes.prepend(langium_1.Formatting.noIndent());
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
doDocumentFormat(document, options, range) {
|
|
65
|
+
this.formatOptions = options;
|
|
66
|
+
return super.doDocumentFormat(document, options, range);
|
|
67
|
+
}
|
|
68
|
+
getFormatOptions() {
|
|
69
|
+
return this.formatOptions;
|
|
70
|
+
}
|
|
71
|
+
getIndent() {
|
|
72
|
+
return 1;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.ZModelFormatter = ZModelFormatter;
|
|
76
|
+
//# sourceMappingURL=zmodel-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zmodel-formatter.js","sourceRoot":"","sources":["../../src/language-server/zmodel-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DefaultLinker, LangiumDocument, LangiumServices } from 'langium';
|
|
2
|
+
import { CancellationToken } from 'vscode-jsonrpc';
|
|
3
|
+
/**
|
|
4
|
+
* Langium linker implementation which links references and resolves expression types
|
|
5
|
+
*/
|
|
6
|
+
export declare class ZModelLinker extends DefaultLinker {
|
|
7
|
+
private readonly descriptions;
|
|
8
|
+
constructor(services: LangiumServices);
|
|
9
|
+
link(document: LangiumDocument, cancelToken?: CancellationToken): Promise<void>;
|
|
10
|
+
private linkReference;
|
|
11
|
+
private resolveFromScopeProviders;
|
|
12
|
+
private resolve;
|
|
13
|
+
private resolveBinary;
|
|
14
|
+
private resolveUnary;
|
|
15
|
+
private resolveReference;
|
|
16
|
+
private resolveArray;
|
|
17
|
+
private resolveInvocation;
|
|
18
|
+
private getContainingDataModel;
|
|
19
|
+
private resolveLiteral;
|
|
20
|
+
private resolveMemberAccess;
|
|
21
|
+
private resolveCollectionPredicate;
|
|
22
|
+
private resolveThis;
|
|
23
|
+
private resolveNull;
|
|
24
|
+
private resolveAttributeArg;
|
|
25
|
+
private findAttrParamForArg;
|
|
26
|
+
private resolveDefault;
|
|
27
|
+
private resolveToDeclaredType;
|
|
28
|
+
private resolveToBuiltinTypeOrDecl;
|
|
29
|
+
}
|