zenstack 1.0.0-alpha.21 → 1.0.0-alpha.23

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.
@@ -1,6 +1,6 @@
1
1
  import { DataModel } from '@zenstackhq/language/ast';
2
- import { AstValidator } from '../types';
3
2
  import { ValidationAcceptor } from 'langium';
3
+ import { AstValidator } from '../types';
4
4
  /**
5
5
  * Validates data model declarations.
6
6
  */
@@ -4,10 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _constants = require("../constants");
8
7
  var _ast = require("@zenstackhq/language/ast");
9
- var _utils = require("./utils");
10
8
  var _pluralize = _interopRequireDefault(require("pluralize"));
9
+ var _astUtils = require("../../utils/ast-utils");
10
+ var _constants = require("../constants");
11
+ var _utils = require("./utils");
11
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
13
  /**
13
14
  * Validates data model declarations.
@@ -24,9 +25,18 @@ class DataModelValidator {
24
25
  return ((_attr$decl$ref = attr.decl.ref) === null || _attr$decl$ref === void 0 ? void 0 : _attr$decl$ref.name) === '@id';
25
26
  }));
26
27
  if (idFields.length === 0) {
27
- accept('error', 'Model must include a field with @id attribute', {
28
- node: dm
29
- });
28
+ const {
29
+ allows,
30
+ denies,
31
+ hasFieldValidation
32
+ } = (0, _astUtils.analyzePolicies)(dm);
33
+ if (allows.length > 0 || denies.length > 0 || hasFieldValidation) {
34
+ // TODO: relax this requirement to require only @unique fields
35
+ // when access policies or field valdaition is used, require an @id field
36
+ accept('error', 'Model must include a field with @id attribute', {
37
+ node: dm
38
+ });
39
+ }
30
40
  } else if (idFields.length > 1) {
31
41
  accept('error', 'Model can include at most one field with @id attribute', {
32
42
  node: dm
@@ -1 +1 @@
1
- {"version":3,"file":"datamodel-validator.js","names":["DataModelValidator","validate","dm","accept","validateDuplicatedDeclarations","fields","validateFields","validateAttributes","idFields","filter","f","attributes","find","attr","decl","ref","name","length","node","type","optional","array","SCALAR_TYPES","includes","forEach","field","validateField","validateAttributeApplication","isDataModel","reference","validateRelationField","targetDecl","$container","isAttribute","isDataModelField","isValidAttributeTarget","filledParams","Set","arg","args","paramDecl","params","p","default","has","assignableToAttributeParam","add","$resolvedParam","missingParams","pluralize","map","join","attrDecl","targetField","fieldTypes","value","items","item","target","allowed","allowedType","parseRelation","relAttr","references","valid","isLiteralExpr","i","$resolvedType","thisRelation","oppositeModel","oppositeFields","fieldRel","oppositeField","oppositeRelation","relationOwner","refField","a"],"sources":["../../../src/language-server/validator/datamodel-validator.ts"],"sourcesContent":["import { SCALAR_TYPES } from '../constants';\nimport {\n ArrayExpr,\n Attribute,\n AttributeParam,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n isAttribute,\n isDataModel,\n isDataModelField,\n isLiteralExpr,\n ReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport { AstValidator } from '../types';\nimport { ValidationAcceptor } from 'langium';\nimport { assignableToAttributeParam, validateDuplicatedDeclarations } from './utils';\nimport pluralize from 'pluralize';\n\n/**\n * Validates data model declarations.\n */\nexport default class DataModelValidator implements AstValidator<DataModel> {\n validate(dm: DataModel, accept: ValidationAcceptor): void {\n validateDuplicatedDeclarations(dm.fields, accept);\n this.validateFields(dm, accept);\n this.validateAttributes(dm, accept);\n }\n\n private validateFields(dm: DataModel, accept: ValidationAcceptor) {\n const idFields = dm.fields.filter((f) => f.attributes.find((attr) => attr.decl.ref?.name === '@id'));\n if (idFields.length === 0) {\n accept('error', 'Model must include a field with @id attribute', {\n node: dm,\n });\n } else if (idFields.length > 1) {\n accept('error', 'Model can include at most one field with @id attribute', {\n node: dm,\n });\n } else {\n if (idFields[0].type.optional) {\n accept('error', 'Field with @id attribute must not be optional', { node: idFields[0] });\n }\n\n if (idFields[0].type.array || !idFields[0].type.type || !SCALAR_TYPES.includes(idFields[0].type.type)) {\n accept('error', 'Field with @id attribute must be of scalar type', { node: idFields[0] });\n }\n }\n\n dm.fields.forEach((field) => this.validateField(field, accept));\n }\n\n private validateField(field: DataModelField, accept: ValidationAcceptor): void {\n if (field.type.array && field.type.optional) {\n accept('error', 'Optional lists are not supported. Use either `Type[]` or `Type?`', { node: field.type });\n }\n\n field.attributes.forEach((attr) => this.validateAttributeApplication(attr, accept));\n\n if (isDataModel(field.type.reference?.ref)) {\n this.validateRelationField(field, accept);\n }\n }\n\n private validateAttributes(dm: DataModel, accept: ValidationAcceptor) {\n dm.attributes.forEach((attr) => {\n this.validateAttributeApplication(attr, accept);\n });\n }\n\n private validateAttributeApplication(\n attr: DataModelAttribute | DataModelFieldAttribute,\n accept: ValidationAcceptor\n ) {\n const decl = attr.decl.ref;\n if (!decl) {\n return;\n }\n\n const targetDecl = attr.$container;\n if (decl.name === '@@@targetField' && !isAttribute(targetDecl)) {\n accept('error', `attribute \"${decl.name}\" can only be used on attribute declarations`, { node: attr });\n return;\n }\n\n if (isDataModelField(targetDecl) && !this.isValidAttributeTarget(decl, targetDecl)) {\n accept('error', `attribute \"${decl.name}\" cannot be used on this type of field`, { node: attr });\n }\n\n const filledParams = new Set<AttributeParam>();\n\n for (const arg of attr.args) {\n let paramDecl: AttributeParam | undefined;\n if (!arg.name) {\n paramDecl = decl.params.find((p) => p.default && !filledParams.has(p));\n if (!paramDecl) {\n accept('error', `Unexpected unnamed argument`, {\n node: arg,\n });\n return false;\n }\n } else {\n paramDecl = decl.params.find((p) => p.name === arg.name);\n if (!paramDecl) {\n accept('error', `Attribute \"${decl.name}\" doesn't have a parameter named \"${arg.name}\"`, {\n node: arg,\n });\n return false;\n }\n }\n\n if (!assignableToAttributeParam(arg, paramDecl, attr)) {\n accept('error', `Value is not assignable to parameter`, {\n node: arg,\n });\n return false;\n }\n\n if (filledParams.has(paramDecl)) {\n accept('error', `Parameter \"${paramDecl.name}\" is already provided`, { node: arg });\n return false;\n }\n filledParams.add(paramDecl);\n arg.$resolvedParam = paramDecl;\n }\n\n const missingParams = decl.params.filter((p) => !p.type.optional && !filledParams.has(p));\n if (missingParams.length > 0) {\n accept(\n 'error',\n `Required ${pluralize('parameter', missingParams.length)} not provided: ${missingParams\n .map((p) => p.name)\n .join(', ')}`,\n { node: attr }\n );\n return false;\n }\n\n return true;\n }\n\n private isValidAttributeTarget(attrDecl: Attribute, targetDecl: DataModelField) {\n const targetField = attrDecl.attributes.find((attr) => attr.decl.ref?.name === '@@@targetField');\n if (!targetField) {\n // no field type constraint\n return true;\n }\n\n const fieldTypes = (targetField.args[0].value as ArrayExpr).items.map(\n (item) => (item as ReferenceExpr).target.ref?.name\n );\n\n let allowed = false;\n for (const allowedType of fieldTypes) {\n switch (allowedType) {\n case 'StringField':\n allowed = allowed || targetDecl.type.type === 'String';\n break;\n case 'IntField':\n allowed = allowed || targetDecl.type.type === 'Int';\n break;\n case 'FloatField':\n allowed = allowed || targetDecl.type.type === 'Float';\n break;\n case 'DecimalField':\n allowed = allowed || targetDecl.type.type === 'Decimal';\n break;\n case 'BooleanField':\n allowed = allowed || targetDecl.type.type === 'Boolean';\n break;\n case 'DateTimeField':\n allowed = allowed || targetDecl.type.type === 'DateTime';\n break;\n case 'JsonField':\n allowed = allowed || targetDecl.type.type === 'Json';\n break;\n case 'BytesField':\n allowed = allowed || targetDecl.type.type === 'Bytes';\n break;\n case 'ModelField':\n allowed = allowed || isDataModel(targetDecl.type.reference?.ref);\n break;\n default:\n break;\n }\n if (allowed) {\n break;\n }\n }\n\n return allowed;\n }\n\n private parseRelation(field: DataModelField, accept?: ValidationAcceptor) {\n const relAttr = field.attributes.find((attr) => attr.decl.ref?.name === '@relation');\n\n let name: string | undefined;\n let fields: ReferenceExpr[] | undefined;\n let references: ReferenceExpr[] | undefined;\n let valid = true;\n\n if (!relAttr) {\n return { attr: relAttr, name, fields, references, valid: true };\n }\n\n for (const arg of relAttr.args) {\n if (!arg.name || arg.name === 'name') {\n if (isLiteralExpr(arg.value)) {\n name = arg.value.value as string;\n }\n } else if (arg.name === 'fields') {\n fields = (arg.value as ArrayExpr).items as ReferenceExpr[];\n if (fields.length === 0) {\n if (accept) {\n accept('error', `\"fields\" value cannot be emtpy`, {\n node: arg,\n });\n }\n valid = false;\n }\n } else if (arg.name === 'references') {\n references = (arg.value as ArrayExpr).items as ReferenceExpr[];\n if (references.length === 0) {\n if (accept) {\n accept('error', `\"references\" value cannot be emtpy`, {\n node: arg,\n });\n }\n valid = false;\n }\n }\n }\n\n if (!fields || !references) {\n if (accept) {\n accept('error', `Both \"fields\" and \"references\" must be provided`, { node: relAttr });\n }\n } else {\n // validate \"fields\" and \"references\" typing consistency\n if (fields.length !== references.length) {\n if (accept) {\n accept('error', `\"references\" and \"fields\" must have the same length`, { node: relAttr });\n }\n } else {\n for (let i = 0; i < fields.length; i++) {\n if (!fields[i].$resolvedType) {\n if (accept) {\n accept('error', `field reference is unresolved`, { node: fields[i] });\n }\n }\n if (!references[i].$resolvedType) {\n if (accept) {\n accept('error', `field reference is unresolved`, { node: references[i] });\n }\n }\n\n if (\n fields[i].$resolvedType?.decl !== references[i].$resolvedType?.decl ||\n fields[i].$resolvedType?.array !== references[i].$resolvedType?.array\n ) {\n if (accept) {\n accept('error', `values of \"references\" and \"fields\" must have the same type`, {\n node: relAttr,\n });\n }\n }\n }\n }\n }\n\n return { attr: relAttr, name, fields, references, valid };\n }\n\n private validateRelationField(field: DataModelField, accept: ValidationAcceptor) {\n const thisRelation = this.parseRelation(field, accept);\n if (!thisRelation.valid) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const oppositeModel = field.type.reference!.ref! as DataModel;\n\n let oppositeFields = oppositeModel.fields.filter((f) => f.type.reference?.ref === field.$container);\n oppositeFields = oppositeFields.filter((f) => {\n const fieldRel = this.parseRelation(f);\n return fieldRel.valid && fieldRel.name === thisRelation.name;\n });\n\n if (oppositeFields.length === 0) {\n accept(\n 'error',\n `The relation field \"${field.name}\" on model \"${field.$container.name}\" is missing an opposite relation field on model \"${oppositeModel.name}\"`,\n { node: field }\n );\n return;\n } else if (oppositeFields.length > 1) {\n oppositeFields.forEach((f) =>\n accept(\n 'error',\n `Fields ${oppositeFields.map((f) => '\"' + f.name + '\"').join(', ')} on model \"${\n oppositeModel.name\n }\" refer to the same relation to model \"${field.$container.name}\"`,\n { node: f }\n )\n );\n return;\n }\n\n const oppositeField = oppositeFields[0];\n const oppositeRelation = this.parseRelation(oppositeField);\n\n let relationOwner: DataModelField;\n\n if (thisRelation?.references?.length && thisRelation.fields?.length) {\n if (oppositeRelation?.references || oppositeRelation?.fields) {\n accept('error', '\"fields\" and \"references\" must be provided only on one side of relation field', {\n node: oppositeField,\n });\n return;\n } else {\n relationOwner = oppositeField;\n }\n } else if (oppositeRelation?.references?.length && oppositeRelation.fields?.length) {\n if (thisRelation?.references || thisRelation?.fields) {\n accept('error', '\"fields\" and \"references\" must be provided only on one side of relation field', {\n node: field,\n });\n return;\n } else {\n relationOwner = field;\n }\n } else {\n [field, oppositeField].forEach((f) =>\n accept(\n 'error',\n 'Field for one side of relation must carry @relation attribute with both \"fields\" and \"references\" fields',\n { node: f }\n )\n );\n return;\n }\n\n if (!relationOwner.type.array && !relationOwner.type.optional) {\n accept('error', 'Relation field needs to be list or optional', {\n node: relationOwner,\n });\n return;\n }\n\n if (relationOwner !== field && !relationOwner.type.array) {\n // one-to-one relation requires defining side's reference field to be @unique\n // e.g.:\n // model User {\n // id String @id @default(cuid())\n // data UserData?\n // }\n // model UserData {\n // id String @id @default(cuid())\n // user User @relation(fields: [userId], references: [id])\n // userId String\n // }\n //\n // UserData.userId field needs to be @unique\n\n thisRelation.fields?.forEach((ref) => {\n const refField = ref.target.ref as DataModelField;\n if (refField && !refField.attributes.find((a) => a.decl.ref?.name === '@unique')) {\n accept(\n 'error',\n `Field \"${refField.name}\" is part of a one-to-one relation and must be marked as @unique`,\n { node: refField }\n );\n }\n });\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"datamodel-validator.js","names":["DataModelValidator","validate","dm","accept","validateDuplicatedDeclarations","fields","validateFields","validateAttributes","idFields","filter","f","attributes","find","attr","decl","ref","name","length","allows","denies","hasFieldValidation","analyzePolicies","node","type","optional","array","SCALAR_TYPES","includes","forEach","field","validateField","validateAttributeApplication","isDataModel","reference","validateRelationField","targetDecl","$container","isAttribute","isDataModelField","isValidAttributeTarget","filledParams","Set","arg","args","paramDecl","params","p","default","has","assignableToAttributeParam","add","$resolvedParam","missingParams","pluralize","map","join","attrDecl","targetField","fieldTypes","value","items","item","target","allowed","allowedType","parseRelation","relAttr","references","valid","isLiteralExpr","i","$resolvedType","thisRelation","oppositeModel","oppositeFields","fieldRel","oppositeField","oppositeRelation","relationOwner","refField","a"],"sources":["../../../src/language-server/validator/datamodel-validator.ts"],"sourcesContent":["import {\n ArrayExpr,\n Attribute,\n AttributeParam,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n isAttribute,\n isDataModel,\n isDataModelField,\n isLiteralExpr,\n ReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport { ValidationAcceptor } from 'langium';\nimport pluralize from 'pluralize';\nimport { analyzePolicies } from '../../utils/ast-utils';\nimport { SCALAR_TYPES } from '../constants';\nimport { AstValidator } from '../types';\nimport { assignableToAttributeParam, validateDuplicatedDeclarations } from './utils';\n\n/**\n * Validates data model declarations.\n */\nexport default class DataModelValidator implements AstValidator<DataModel> {\n validate(dm: DataModel, accept: ValidationAcceptor): void {\n validateDuplicatedDeclarations(dm.fields, accept);\n this.validateFields(dm, accept);\n this.validateAttributes(dm, accept);\n }\n\n private validateFields(dm: DataModel, accept: ValidationAcceptor) {\n const idFields = dm.fields.filter((f) => f.attributes.find((attr) => attr.decl.ref?.name === '@id'));\n if (idFields.length === 0) {\n const { allows, denies, hasFieldValidation } = analyzePolicies(dm);\n if (allows.length > 0 || denies.length > 0 || hasFieldValidation) {\n // TODO: relax this requirement to require only @unique fields\n // when access policies or field valdaition is used, require an @id field\n accept('error', 'Model must include a field with @id attribute', {\n node: dm,\n });\n }\n } else if (idFields.length > 1) {\n accept('error', 'Model can include at most one field with @id attribute', {\n node: dm,\n });\n } else {\n if (idFields[0].type.optional) {\n accept('error', 'Field with @id attribute must not be optional', { node: idFields[0] });\n }\n\n if (idFields[0].type.array || !idFields[0].type.type || !SCALAR_TYPES.includes(idFields[0].type.type)) {\n accept('error', 'Field with @id attribute must be of scalar type', { node: idFields[0] });\n }\n }\n\n dm.fields.forEach((field) => this.validateField(field, accept));\n }\n\n private validateField(field: DataModelField, accept: ValidationAcceptor): void {\n if (field.type.array && field.type.optional) {\n accept('error', 'Optional lists are not supported. Use either `Type[]` or `Type?`', { node: field.type });\n }\n\n field.attributes.forEach((attr) => this.validateAttributeApplication(attr, accept));\n\n if (isDataModel(field.type.reference?.ref)) {\n this.validateRelationField(field, accept);\n }\n }\n\n private validateAttributes(dm: DataModel, accept: ValidationAcceptor) {\n dm.attributes.forEach((attr) => {\n this.validateAttributeApplication(attr, accept);\n });\n }\n\n private validateAttributeApplication(\n attr: DataModelAttribute | DataModelFieldAttribute,\n accept: ValidationAcceptor\n ) {\n const decl = attr.decl.ref;\n if (!decl) {\n return;\n }\n\n const targetDecl = attr.$container;\n if (decl.name === '@@@targetField' && !isAttribute(targetDecl)) {\n accept('error', `attribute \"${decl.name}\" can only be used on attribute declarations`, { node: attr });\n return;\n }\n\n if (isDataModelField(targetDecl) && !this.isValidAttributeTarget(decl, targetDecl)) {\n accept('error', `attribute \"${decl.name}\" cannot be used on this type of field`, { node: attr });\n }\n\n const filledParams = new Set<AttributeParam>();\n\n for (const arg of attr.args) {\n let paramDecl: AttributeParam | undefined;\n if (!arg.name) {\n paramDecl = decl.params.find((p) => p.default && !filledParams.has(p));\n if (!paramDecl) {\n accept('error', `Unexpected unnamed argument`, {\n node: arg,\n });\n return false;\n }\n } else {\n paramDecl = decl.params.find((p) => p.name === arg.name);\n if (!paramDecl) {\n accept('error', `Attribute \"${decl.name}\" doesn't have a parameter named \"${arg.name}\"`, {\n node: arg,\n });\n return false;\n }\n }\n\n if (!assignableToAttributeParam(arg, paramDecl, attr)) {\n accept('error', `Value is not assignable to parameter`, {\n node: arg,\n });\n return false;\n }\n\n if (filledParams.has(paramDecl)) {\n accept('error', `Parameter \"${paramDecl.name}\" is already provided`, { node: arg });\n return false;\n }\n filledParams.add(paramDecl);\n arg.$resolvedParam = paramDecl;\n }\n\n const missingParams = decl.params.filter((p) => !p.type.optional && !filledParams.has(p));\n if (missingParams.length > 0) {\n accept(\n 'error',\n `Required ${pluralize('parameter', missingParams.length)} not provided: ${missingParams\n .map((p) => p.name)\n .join(', ')}`,\n { node: attr }\n );\n return false;\n }\n\n return true;\n }\n\n private isValidAttributeTarget(attrDecl: Attribute, targetDecl: DataModelField) {\n const targetField = attrDecl.attributes.find((attr) => attr.decl.ref?.name === '@@@targetField');\n if (!targetField) {\n // no field type constraint\n return true;\n }\n\n const fieldTypes = (targetField.args[0].value as ArrayExpr).items.map(\n (item) => (item as ReferenceExpr).target.ref?.name\n );\n\n let allowed = false;\n for (const allowedType of fieldTypes) {\n switch (allowedType) {\n case 'StringField':\n allowed = allowed || targetDecl.type.type === 'String';\n break;\n case 'IntField':\n allowed = allowed || targetDecl.type.type === 'Int';\n break;\n case 'FloatField':\n allowed = allowed || targetDecl.type.type === 'Float';\n break;\n case 'DecimalField':\n allowed = allowed || targetDecl.type.type === 'Decimal';\n break;\n case 'BooleanField':\n allowed = allowed || targetDecl.type.type === 'Boolean';\n break;\n case 'DateTimeField':\n allowed = allowed || targetDecl.type.type === 'DateTime';\n break;\n case 'JsonField':\n allowed = allowed || targetDecl.type.type === 'Json';\n break;\n case 'BytesField':\n allowed = allowed || targetDecl.type.type === 'Bytes';\n break;\n case 'ModelField':\n allowed = allowed || isDataModel(targetDecl.type.reference?.ref);\n break;\n default:\n break;\n }\n if (allowed) {\n break;\n }\n }\n\n return allowed;\n }\n\n private parseRelation(field: DataModelField, accept?: ValidationAcceptor) {\n const relAttr = field.attributes.find((attr) => attr.decl.ref?.name === '@relation');\n\n let name: string | undefined;\n let fields: ReferenceExpr[] | undefined;\n let references: ReferenceExpr[] | undefined;\n let valid = true;\n\n if (!relAttr) {\n return { attr: relAttr, name, fields, references, valid: true };\n }\n\n for (const arg of relAttr.args) {\n if (!arg.name || arg.name === 'name') {\n if (isLiteralExpr(arg.value)) {\n name = arg.value.value as string;\n }\n } else if (arg.name === 'fields') {\n fields = (arg.value as ArrayExpr).items as ReferenceExpr[];\n if (fields.length === 0) {\n if (accept) {\n accept('error', `\"fields\" value cannot be emtpy`, {\n node: arg,\n });\n }\n valid = false;\n }\n } else if (arg.name === 'references') {\n references = (arg.value as ArrayExpr).items as ReferenceExpr[];\n if (references.length === 0) {\n if (accept) {\n accept('error', `\"references\" value cannot be emtpy`, {\n node: arg,\n });\n }\n valid = false;\n }\n }\n }\n\n if (!fields || !references) {\n if (accept) {\n accept('error', `Both \"fields\" and \"references\" must be provided`, { node: relAttr });\n }\n } else {\n // validate \"fields\" and \"references\" typing consistency\n if (fields.length !== references.length) {\n if (accept) {\n accept('error', `\"references\" and \"fields\" must have the same length`, { node: relAttr });\n }\n } else {\n for (let i = 0; i < fields.length; i++) {\n if (!fields[i].$resolvedType) {\n if (accept) {\n accept('error', `field reference is unresolved`, { node: fields[i] });\n }\n }\n if (!references[i].$resolvedType) {\n if (accept) {\n accept('error', `field reference is unresolved`, { node: references[i] });\n }\n }\n\n if (\n fields[i].$resolvedType?.decl !== references[i].$resolvedType?.decl ||\n fields[i].$resolvedType?.array !== references[i].$resolvedType?.array\n ) {\n if (accept) {\n accept('error', `values of \"references\" and \"fields\" must have the same type`, {\n node: relAttr,\n });\n }\n }\n }\n }\n }\n\n return { attr: relAttr, name, fields, references, valid };\n }\n\n private validateRelationField(field: DataModelField, accept: ValidationAcceptor) {\n const thisRelation = this.parseRelation(field, accept);\n if (!thisRelation.valid) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const oppositeModel = field.type.reference!.ref! as DataModel;\n\n let oppositeFields = oppositeModel.fields.filter((f) => f.type.reference?.ref === field.$container);\n oppositeFields = oppositeFields.filter((f) => {\n const fieldRel = this.parseRelation(f);\n return fieldRel.valid && fieldRel.name === thisRelation.name;\n });\n\n if (oppositeFields.length === 0) {\n accept(\n 'error',\n `The relation field \"${field.name}\" on model \"${field.$container.name}\" is missing an opposite relation field on model \"${oppositeModel.name}\"`,\n { node: field }\n );\n return;\n } else if (oppositeFields.length > 1) {\n oppositeFields.forEach((f) =>\n accept(\n 'error',\n `Fields ${oppositeFields.map((f) => '\"' + f.name + '\"').join(', ')} on model \"${\n oppositeModel.name\n }\" refer to the same relation to model \"${field.$container.name}\"`,\n { node: f }\n )\n );\n return;\n }\n\n const oppositeField = oppositeFields[0];\n const oppositeRelation = this.parseRelation(oppositeField);\n\n let relationOwner: DataModelField;\n\n if (thisRelation?.references?.length && thisRelation.fields?.length) {\n if (oppositeRelation?.references || oppositeRelation?.fields) {\n accept('error', '\"fields\" and \"references\" must be provided only on one side of relation field', {\n node: oppositeField,\n });\n return;\n } else {\n relationOwner = oppositeField;\n }\n } else if (oppositeRelation?.references?.length && oppositeRelation.fields?.length) {\n if (thisRelation?.references || thisRelation?.fields) {\n accept('error', '\"fields\" and \"references\" must be provided only on one side of relation field', {\n node: field,\n });\n return;\n } else {\n relationOwner = field;\n }\n } else {\n [field, oppositeField].forEach((f) =>\n accept(\n 'error',\n 'Field for one side of relation must carry @relation attribute with both \"fields\" and \"references\" fields',\n { node: f }\n )\n );\n return;\n }\n\n if (!relationOwner.type.array && !relationOwner.type.optional) {\n accept('error', 'Relation field needs to be list or optional', {\n node: relationOwner,\n });\n return;\n }\n\n if (relationOwner !== field && !relationOwner.type.array) {\n // one-to-one relation requires defining side's reference field to be @unique\n // e.g.:\n // model User {\n // id String @id @default(cuid())\n // data UserData?\n // }\n // model UserData {\n // id String @id @default(cuid())\n // user User @relation(fields: [userId], references: [id])\n // userId String\n // }\n //\n // UserData.userId field needs to be @unique\n\n thisRelation.fields?.forEach((ref) => {\n const refField = ref.target.ref as DataModelField;\n if (refField && !refField.attributes.find((a) => a.decl.ref?.name === '@unique')) {\n accept(\n 'error',\n `Field \"${refField.name}\" is part of a one-to-one relation and must be marked as @unique`,\n { node: refField }\n );\n }\n });\n }\n }\n}\n"],"mappings":"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"}
@@ -108,7 +108,7 @@ function assignableToAttributeParam(arg, param, attr) {
108
108
  dstType = 'Any';
109
109
  }
110
110
  }
111
- return typeAssignable(dstType, argResolvedType.decl) && dstIsArray === argResolvedType.array;
111
+ return typeAssignable(dstType, argResolvedType.decl) && (dstType === 'Any' || dstIsArray === argResolvedType.array);
112
112
  } else {
113
113
  return (dstRef === null || dstRef === void 0 ? void 0 : dstRef.ref) === argResolvedType.decl && dstIsArray === argResolvedType.array;
114
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["validateDuplicatedDeclarations","decls","accept","groupByName","reduce","group","decl","name","push","Object","entries","length","node","getStringLiteral","isLiteralExpr","value","undefined","typeAssignable","destType","sourceType","mapBuiltinTypeToExpressionType","type","assignableToAttributeParam","arg","param","attr","argResolvedType","$resolvedType","dstType","dstIsArray","array","dstRef","reference","isArrayExpr","items","find","item","isReferenceExpr","isDataModelField","target","ref","$container"],"sources":["../../../src/language-server/validator/utils.ts"],"sourcesContent":["import {\n AttributeArg,\n AttributeParam,\n BuiltinType,\n DataModelAttribute,\n DataModelFieldAttribute,\n ExpressionType,\n isArrayExpr,\n isDataModelField,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport { AstNode, ValidationAcceptor } from 'langium';\n\n/**\n * Checks if the given declarations have duplicated names\n */\nexport function validateDuplicatedDeclarations(\n decls: Array<AstNode & { name: string }>,\n accept: ValidationAcceptor\n): void {\n const groupByName = decls.reduce<Record<string, Array<AstNode & { name: string }>>>((group, decl) => {\n group[decl.name] = group[decl.name] ?? [];\n group[decl.name].push(decl);\n return group;\n }, {});\n\n for (const [name, decls] of Object.entries<AstNode[]>(groupByName)) {\n if (decls.length > 1) {\n accept('error', `Duplicated declaration name \"${name}\"`, {\n node: decls[1],\n });\n }\n }\n}\n\n/**\n * Try getting string value from a potential string literal expression\n */\nexport function getStringLiteral(node: AstNode | undefined): string | undefined {\n if (isLiteralExpr(node) && typeof node.value === 'string') {\n return node.value;\n } else {\n return undefined;\n }\n}\n\n/**\n * Determines if the given sourceType is assignable to a destination of destType\n */\nexport function typeAssignable(destType: ExpressionType, sourceType: ExpressionType): boolean {\n switch (destType) {\n case 'Any':\n return true;\n case 'Float':\n return sourceType === 'Any' || sourceType === 'Int' || sourceType === 'Float';\n default:\n return sourceType === 'Any' || sourceType === destType;\n }\n}\n\n/**\n * Maps a ZModel builtin type to expression type\n */\nexport function mapBuiltinTypeToExpressionType(type: BuiltinType | 'Any' | 'Null'): ExpressionType | 'Any' {\n switch (type) {\n case 'Any':\n case 'Boolean':\n case 'String':\n case 'DateTime':\n case 'Int':\n case 'Float':\n case 'Null':\n return type;\n case 'BigInt':\n return 'Int';\n case 'Decimal':\n return 'Float';\n case 'Json':\n case 'Bytes':\n return 'Any';\n }\n}\n\n/**\n * Determines if the given attribute argument is assignable to the given attribute parameter\n */\nexport function assignableToAttributeParam(\n arg: AttributeArg,\n param: AttributeParam,\n attr: DataModelAttribute | DataModelFieldAttribute\n): boolean {\n const argResolvedType = arg.$resolvedType;\n if (!argResolvedType) {\n return false;\n }\n\n let dstType = param.type.type;\n const dstIsArray = param.type.array;\n const dstRef = param.type.reference;\n\n if (dstType) {\n if (typeof argResolvedType?.decl !== 'string') {\n // destination type is not a reference, so argument type must be a plain expression\n return false;\n }\n\n if (dstType === 'FieldReference' || dstType === 'TransitiveFieldReference') {\n if (dstIsArray) {\n return (\n isArrayExpr(arg.value) &&\n !arg.value.items.find((item) => !isReferenceExpr(item) || !isDataModelField(item.target.ref))\n );\n } else {\n return isReferenceExpr(arg.value) && isDataModelField(arg.value.target.ref);\n }\n } else if (dstType === 'ContextType') {\n if (isDataModelField(attr.$container)) {\n if (!attr.$container?.type?.type) {\n return false;\n }\n dstType = mapBuiltinTypeToExpressionType(attr.$container.type.type);\n } else {\n dstType = 'Any';\n }\n }\n\n return typeAssignable(dstType, argResolvedType.decl) && dstIsArray === argResolvedType.array;\n } else {\n return dstRef?.ref === argResolvedType.decl && dstIsArray === argResolvedType.array;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":["validateDuplicatedDeclarations","decls","accept","groupByName","reduce","group","decl","name","push","Object","entries","length","node","getStringLiteral","isLiteralExpr","value","undefined","typeAssignable","destType","sourceType","mapBuiltinTypeToExpressionType","type","assignableToAttributeParam","arg","param","attr","argResolvedType","$resolvedType","dstType","dstIsArray","array","dstRef","reference","isArrayExpr","items","find","item","isReferenceExpr","isDataModelField","target","ref","$container"],"sources":["../../../src/language-server/validator/utils.ts"],"sourcesContent":["import {\n AttributeArg,\n AttributeParam,\n BuiltinType,\n DataModelAttribute,\n DataModelFieldAttribute,\n ExpressionType,\n isArrayExpr,\n isDataModelField,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport { AstNode, ValidationAcceptor } from 'langium';\n\n/**\n * Checks if the given declarations have duplicated names\n */\nexport function validateDuplicatedDeclarations(\n decls: Array<AstNode & { name: string }>,\n accept: ValidationAcceptor\n): void {\n const groupByName = decls.reduce<Record<string, Array<AstNode & { name: string }>>>((group, decl) => {\n group[decl.name] = group[decl.name] ?? [];\n group[decl.name].push(decl);\n return group;\n }, {});\n\n for (const [name, decls] of Object.entries<AstNode[]>(groupByName)) {\n if (decls.length > 1) {\n accept('error', `Duplicated declaration name \"${name}\"`, {\n node: decls[1],\n });\n }\n }\n}\n\n/**\n * Try getting string value from a potential string literal expression\n */\nexport function getStringLiteral(node: AstNode | undefined): string | undefined {\n if (isLiteralExpr(node) && typeof node.value === 'string') {\n return node.value;\n } else {\n return undefined;\n }\n}\n\n/**\n * Determines if the given sourceType is assignable to a destination of destType\n */\nexport function typeAssignable(destType: ExpressionType, sourceType: ExpressionType): boolean {\n switch (destType) {\n case 'Any':\n return true;\n case 'Float':\n return sourceType === 'Any' || sourceType === 'Int' || sourceType === 'Float';\n default:\n return sourceType === 'Any' || sourceType === destType;\n }\n}\n\n/**\n * Maps a ZModel builtin type to expression type\n */\nexport function mapBuiltinTypeToExpressionType(type: BuiltinType | 'Any' | 'Null'): ExpressionType | 'Any' {\n switch (type) {\n case 'Any':\n case 'Boolean':\n case 'String':\n case 'DateTime':\n case 'Int':\n case 'Float':\n case 'Null':\n return type;\n case 'BigInt':\n return 'Int';\n case 'Decimal':\n return 'Float';\n case 'Json':\n case 'Bytes':\n return 'Any';\n }\n}\n\n/**\n * Determines if the given attribute argument is assignable to the given attribute parameter\n */\nexport function assignableToAttributeParam(\n arg: AttributeArg,\n param: AttributeParam,\n attr: DataModelAttribute | DataModelFieldAttribute\n): boolean {\n const argResolvedType = arg.$resolvedType;\n if (!argResolvedType) {\n return false;\n }\n\n let dstType = param.type.type;\n const dstIsArray = param.type.array;\n const dstRef = param.type.reference;\n\n if (dstType) {\n if (typeof argResolvedType?.decl !== 'string') {\n // destination type is not a reference, so argument type must be a plain expression\n return false;\n }\n\n if (dstType === 'FieldReference' || dstType === 'TransitiveFieldReference') {\n if (dstIsArray) {\n return (\n isArrayExpr(arg.value) &&\n !arg.value.items.find((item) => !isReferenceExpr(item) || !isDataModelField(item.target.ref))\n );\n } else {\n return isReferenceExpr(arg.value) && isDataModelField(arg.value.target.ref);\n }\n } else if (dstType === 'ContextType') {\n if (isDataModelField(attr.$container)) {\n if (!attr.$container?.type?.type) {\n return false;\n }\n dstType = mapBuiltinTypeToExpressionType(attr.$container.type.type);\n } else {\n dstType = 'Any';\n }\n }\n\n return (\n typeAssignable(dstType, argResolvedType.decl) && (dstType === 'Any' || dstIsArray === argResolvedType.array)\n );\n } else {\n return dstRef?.ref === argResolvedType.decl && dstIsArray === argResolvedType.array;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { AbstractFormatter, AstNode } from 'langium';
2
+ export declare class ZModelFormatter extends AbstractFormatter {
3
+ protected format(node: AstNode): void;
4
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ZModelFormatter = void 0;
7
+ var _langium = require("langium");
8
+ var ast = _interopRequireWildcard(require("@zenstackhq/language/ast"));
9
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
10
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
11
+ class ZModelFormatter extends _langium.AbstractFormatter {
12
+ format(node) {
13
+ const formatter = this.getNodeFormatter(node);
14
+ if (ast.isAbstractDeclaration(node)) {
15
+ const bracesOpen = formatter.keyword('{');
16
+ const bracesClose = formatter.keyword('}');
17
+ formatter.interior(bracesOpen, bracesClose).prepend(_langium.Formatting.indent());
18
+ bracesOpen.prepend(_langium.Formatting.oneSpace());
19
+ bracesClose.prepend(_langium.Formatting.newLine());
20
+ } else if (ast.isModel(node)) {
21
+ const model = node;
22
+ const nodes = formatter.nodes(...model.declarations);
23
+ nodes.prepend(_langium.Formatting.noIndent());
24
+ }
25
+ }
26
+ }
27
+ exports.ZModelFormatter = ZModelFormatter;
28
+ //# sourceMappingURL=zmodel-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zmodel-formatter.js","names":["ZModelFormatter","AbstractFormatter","format","node","formatter","getNodeFormatter","ast","isAbstractDeclaration","bracesOpen","keyword","bracesClose","interior","prepend","Formatting","indent","oneSpace","newLine","isModel","model","nodes","declarations","noIndent"],"sources":["../../src/language-server/zmodel-formatter.ts"],"sourcesContent":["import { AbstractFormatter, AstNode, Formatting } from 'langium';\n\nimport * as ast from '@zenstackhq/language/ast';\n\nexport class ZModelFormatter extends AbstractFormatter {\n protected format(node: AstNode): void {\n const formatter = this.getNodeFormatter(node);\n if (ast.isAbstractDeclaration(node)) {\n const bracesOpen = formatter.keyword('{');\n const bracesClose = formatter.keyword('}');\n formatter.interior(bracesOpen, bracesClose).prepend(Formatting.indent());\n bracesOpen.prepend(Formatting.oneSpace());\n bracesClose.prepend(Formatting.newLine());\n } else if (ast.isModel(node)) {\n const model = node as ast.Model;\n const nodes = formatter.nodes(...model.declarations);\n nodes.prepend(Formatting.noIndent());\n }\n }\n}\n"],"mappings":";;;;;;AAAA;AAEA;AAAgD;AAAA;AAEzC,MAAMA,eAAe,SAASC,0BAAiB,CAAC;EACzCC,MAAM,CAACC,IAAa,EAAQ;IAClC,MAAMC,SAAS,GAAG,IAAI,CAACC,gBAAgB,CAACF,IAAI,CAAC;IAC7C,IAAIG,GAAG,CAACC,qBAAqB,CAACJ,IAAI,CAAC,EAAE;MACjC,MAAMK,UAAU,GAAGJ,SAAS,CAACK,OAAO,CAAC,GAAG,CAAC;MACzC,MAAMC,WAAW,GAAGN,SAAS,CAACK,OAAO,CAAC,GAAG,CAAC;MAC1CL,SAAS,CAACO,QAAQ,CAACH,UAAU,EAAEE,WAAW,CAAC,CAACE,OAAO,CAACC,mBAAU,CAACC,MAAM,EAAE,CAAC;MACxEN,UAAU,CAACI,OAAO,CAACC,mBAAU,CAACE,QAAQ,EAAE,CAAC;MACzCL,WAAW,CAACE,OAAO,CAACC,mBAAU,CAACG,OAAO,EAAE,CAAC;IAC7C,CAAC,MAAM,IAAIV,GAAG,CAACW,OAAO,CAACd,IAAI,CAAC,EAAE;MAC1B,MAAMe,KAAK,GAAGf,IAAiB;MAC/B,MAAMgB,KAAK,GAAGf,SAAS,CAACe,KAAK,CAAC,GAAGD,KAAK,CAACE,YAAY,CAAC;MACpDD,KAAK,CAACP,OAAO,CAACC,mBAAU,CAACQ,QAAQ,EAAE,CAAC;IACxC;EACJ;AACJ;AAAC"}
@@ -11,6 +11,7 @@ var _langium = require("langium");
11
11
  var _vscodeLanguageserver = require("vscode-languageserver");
12
12
  var _vscodeLanguageserverTextdocument = require("vscode-languageserver-textdocument");
13
13
  var _zmodelValidator = require("./validator/zmodel-validator");
14
+ var _zmodelFormatter = require("./zmodel-formatter");
14
15
  var _zmodelLinker = require("./zmodel-linker");
15
16
  var _zmodelScope = require("./zmodel-scope");
16
17
  var _zmodelWorkspaceManager = _interopRequireDefault(require("./zmodel-workspace-manager"));
@@ -28,6 +29,9 @@ const ZModelModule = {
28
29
  validation: {
29
30
  ValidationRegistry: services => new _zmodelValidator.ZModelValidationRegistry(services),
30
31
  ZModelValidator: () => new _zmodelValidator.ZModelValidator()
32
+ },
33
+ lsp: {
34
+ Formatter: () => new _zmodelFormatter.ZModelFormatter()
31
35
  }
32
36
  };
33
37
 
@@ -1 +1 @@
1
- {"version":3,"file":"zmodel-module.js","names":["ZModelModule","references","ScopeComputation","services","ZModelScopeComputation","Linker","ZModelLinker","validation","ValidationRegistry","ZModelValidationRegistry","ZModelValidator","createSharedModule","context","ServiceRegistry","DefaultServiceRegistry","lsp","Connection","connection","LanguageServer","DefaultLanguageServer","workspace","LangiumDocuments","DefaultLangiumDocuments","LangiumDocumentFactory","DefaultLangiumDocumentFactory","DocumentBuilder","DefaultDocumentBuilder","TextDocuments","TextDocument","IndexManager","DefaultIndexManager","WorkspaceManager","ZModelWorkspaceManager","FileSystemProvider","fileSystemProvider","MutexLock","ConfigurationProvider","DefaultConfigurationProvider","createZModelServices","shared","inject","ZModelGeneratedSharedModule","ZModel","createDefaultModule","ZModelGeneratedModule","register"],"sources":["../../src/language-server/zmodel-module.ts"],"sourcesContent":["import { ZModelGeneratedModule, ZModelGeneratedSharedModule } from '@zenstackhq/language/module';\nimport {\n createDefaultModule,\n DefaultConfigurationProvider,\n DefaultDocumentBuilder,\n DefaultIndexManager,\n DefaultLangiumDocumentFactory,\n DefaultLangiumDocuments,\n DefaultLanguageServer,\n DefaultServiceRegistry,\n DefaultSharedModuleContext,\n inject,\n LangiumDefaultSharedServices,\n LangiumServices,\n LangiumSharedServices,\n Module,\n MutexLock,\n PartialLangiumServices,\n} from 'langium';\nimport { TextDocuments } from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { ZModelValidationRegistry, ZModelValidator } from './validator/zmodel-validator';\nimport { ZModelLinker } from './zmodel-linker';\nimport { ZModelScopeComputation } from './zmodel-scope';\nimport ZModelWorkspaceManager from './zmodel-workspace-manager';\n\n/**\n * Declaration of custom services - add your own service classes here.\n */\nexport type ZModelAddedServices = {\n validation: {\n ZModelValidator: ZModelValidator;\n };\n};\n\n/**\n * Union of Langium default services and your custom services - use this as constructor parameter\n * of custom service classes.\n */\nexport type ZModelServices = LangiumServices & ZModelAddedServices;\n\n/**\n * Dependency injection module that overrides Langium default services and contributes the\n * declared custom services. The Langium defaults can be partially specified to override only\n * selected services, while the custom services must be fully specified.\n */\nexport const ZModelModule: Module<ZModelServices, PartialLangiumServices & ZModelAddedServices> = {\n references: {\n ScopeComputation: (services) => new ZModelScopeComputation(services),\n Linker: (services) => new ZModelLinker(services),\n },\n validation: {\n ValidationRegistry: (services) => new ZModelValidationRegistry(services),\n ZModelValidator: () => new ZModelValidator(),\n },\n};\n\n// this duplicates createDefaultSharedModule except that a custom WorkspaceManager is used\nexport function createSharedModule(\n context: DefaultSharedModuleContext\n): Module<LangiumSharedServices, LangiumDefaultSharedServices> {\n return {\n ServiceRegistry: () => new DefaultServiceRegistry(),\n lsp: {\n Connection: () => context.connection,\n LanguageServer: (services) => new DefaultLanguageServer(services),\n },\n workspace: {\n LangiumDocuments: (services) => new DefaultLangiumDocuments(services),\n LangiumDocumentFactory: (services) => new DefaultLangiumDocumentFactory(services),\n DocumentBuilder: (services) => new DefaultDocumentBuilder(services),\n TextDocuments: () => new TextDocuments(TextDocument),\n IndexManager: (services) => new DefaultIndexManager(services),\n WorkspaceManager: (services) => new ZModelWorkspaceManager(services),\n FileSystemProvider: (services) => context.fileSystemProvider(services),\n MutexLock: () => new MutexLock(),\n ConfigurationProvider: (services) => new DefaultConfigurationProvider(services),\n },\n };\n}\n\n/**\n * Create the full set of services required by Langium.\n *\n * First inject the shared services by merging two modules:\n * - Langium default shared services\n * - Services generated by langium-cli\n *\n * Then inject the language-specific services by merging three modules:\n * - Langium default language-specific services\n * - Services generated by langium-cli\n * - Services specified in this file\n *\n * @param context Optional module context with the LSP connection\n * @returns An object wrapping the shared services and the language-specific services\n */\nexport function createZModelServices(context: DefaultSharedModuleContext): {\n shared: LangiumSharedServices;\n ZModel: ZModelServices;\n} {\n const shared = inject(createSharedModule(context), ZModelGeneratedSharedModule);\n\n const ZModel = inject(createDefaultModule({ shared }), ZModelGeneratedModule, ZModelModule);\n shared.ServiceRegistry.register(ZModel);\n return { shared, ZModel };\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AAkBA;AACA;AACA;AACA;AACA;AACA;AAAgE;AAiBhE;AACA;AACA;AACA;AACA;AACO,MAAMA,YAAkF,GAAG;EAC9FC,UAAU,EAAE;IACRC,gBAAgB,EAAGC,QAAQ,IAAK,IAAIC,mCAAsB,CAACD,QAAQ,CAAC;IACpEE,MAAM,EAAGF,QAAQ,IAAK,IAAIG,0BAAY,CAACH,QAAQ;EACnD,CAAC;EACDI,UAAU,EAAE;IACRC,kBAAkB,EAAGL,QAAQ,IAAK,IAAIM,yCAAwB,CAACN,QAAQ,CAAC;IACxEO,eAAe,EAAE,MAAM,IAAIA,gCAAe;EAC9C;AACJ,CAAC;;AAED;AAAA;AACO,SAASC,kBAAkB,CAC9BC,OAAmC,EACwB;EAC3D,OAAO;IACHC,eAAe,EAAE,MAAM,IAAIC,+BAAsB,EAAE;IACnDC,GAAG,EAAE;MACDC,UAAU,EAAE,MAAMJ,OAAO,CAACK,UAAU;MACpCC,cAAc,EAAGf,QAAQ,IAAK,IAAIgB,8BAAqB,CAAChB,QAAQ;IACpE,CAAC;IACDiB,SAAS,EAAE;MACPC,gBAAgB,EAAGlB,QAAQ,IAAK,IAAImB,gCAAuB,CAACnB,QAAQ,CAAC;MACrEoB,sBAAsB,EAAGpB,QAAQ,IAAK,IAAIqB,sCAA6B,CAACrB,QAAQ,CAAC;MACjFsB,eAAe,EAAGtB,QAAQ,IAAK,IAAIuB,+BAAsB,CAACvB,QAAQ,CAAC;MACnEwB,aAAa,EAAE,MAAM,IAAIA,mCAAa,CAACC,8CAAY,CAAC;MACpDC,YAAY,EAAG1B,QAAQ,IAAK,IAAI2B,4BAAmB,CAAC3B,QAAQ,CAAC;MAC7D4B,gBAAgB,EAAG5B,QAAQ,IAAK,IAAI6B,+BAAsB,CAAC7B,QAAQ,CAAC;MACpE8B,kBAAkB,EAAG9B,QAAQ,IAAKS,OAAO,CAACsB,kBAAkB,CAAC/B,QAAQ,CAAC;MACtEgC,SAAS,EAAE,MAAM,IAAIA,kBAAS,EAAE;MAChCC,qBAAqB,EAAGjC,QAAQ,IAAK,IAAIkC,qCAA4B,CAAClC,QAAQ;IAClF;EACJ,CAAC;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASmC,oBAAoB,CAAC1B,OAAmC,EAGtE;EACE,MAAM2B,MAAM,GAAG,IAAAC,eAAM,EAAC7B,kBAAkB,CAACC,OAAO,CAAC,EAAE6B,mCAA2B,CAAC;EAE/E,MAAMC,MAAM,GAAG,IAAAF,eAAM,EAAC,IAAAG,4BAAmB,EAAC;IAAEJ;EAAO,CAAC,CAAC,EAAEK,6BAAqB,EAAE5C,YAAY,CAAC;EAC3FuC,MAAM,CAAC1B,eAAe,CAACgC,QAAQ,CAACH,MAAM,CAAC;EACvC,OAAO;IAAEH,MAAM;IAAEG;EAAO,CAAC;AAC7B"}
1
+ {"version":3,"file":"zmodel-module.js","names":["ZModelModule","references","ScopeComputation","services","ZModelScopeComputation","Linker","ZModelLinker","validation","ValidationRegistry","ZModelValidationRegistry","ZModelValidator","lsp","Formatter","ZModelFormatter","createSharedModule","context","ServiceRegistry","DefaultServiceRegistry","Connection","connection","LanguageServer","DefaultLanguageServer","workspace","LangiumDocuments","DefaultLangiumDocuments","LangiumDocumentFactory","DefaultLangiumDocumentFactory","DocumentBuilder","DefaultDocumentBuilder","TextDocuments","TextDocument","IndexManager","DefaultIndexManager","WorkspaceManager","ZModelWorkspaceManager","FileSystemProvider","fileSystemProvider","MutexLock","ConfigurationProvider","DefaultConfigurationProvider","createZModelServices","shared","inject","ZModelGeneratedSharedModule","ZModel","createDefaultModule","ZModelGeneratedModule","register"],"sources":["../../src/language-server/zmodel-module.ts"],"sourcesContent":["import { ZModelGeneratedModule, ZModelGeneratedSharedModule } from '@zenstackhq/language/module';\nimport {\n createDefaultModule,\n DefaultConfigurationProvider,\n DefaultDocumentBuilder,\n DefaultIndexManager,\n DefaultLangiumDocumentFactory,\n DefaultLangiumDocuments,\n DefaultLanguageServer,\n DefaultServiceRegistry,\n DefaultSharedModuleContext,\n inject,\n LangiumDefaultSharedServices,\n LangiumServices,\n LangiumSharedServices,\n Module,\n MutexLock,\n PartialLangiumServices,\n} from 'langium';\nimport { TextDocuments } from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { ZModelValidationRegistry, ZModelValidator } from './validator/zmodel-validator';\nimport { ZModelFormatter } from './zmodel-formatter';\nimport { ZModelLinker } from './zmodel-linker';\nimport { ZModelScopeComputation } from './zmodel-scope';\nimport ZModelWorkspaceManager from './zmodel-workspace-manager';\n\n/**\n * Declaration of custom services - add your own service classes here.\n */\nexport type ZModelAddedServices = {\n validation: {\n ZModelValidator: ZModelValidator;\n };\n};\n\n/**\n * Union of Langium default services and your custom services - use this as constructor parameter\n * of custom service classes.\n */\nexport type ZModelServices = LangiumServices & ZModelAddedServices;\n\n/**\n * Dependency injection module that overrides Langium default services and contributes the\n * declared custom services. The Langium defaults can be partially specified to override only\n * selected services, while the custom services must be fully specified.\n */\nexport const ZModelModule: Module<ZModelServices, PartialLangiumServices & ZModelAddedServices> = {\n references: {\n ScopeComputation: (services) => new ZModelScopeComputation(services),\n Linker: (services) => new ZModelLinker(services),\n },\n validation: {\n ValidationRegistry: (services) => new ZModelValidationRegistry(services),\n ZModelValidator: () => new ZModelValidator(),\n },\n lsp: {\n Formatter: () => new ZModelFormatter(),\n },\n};\n\n// this duplicates createDefaultSharedModule except that a custom WorkspaceManager is used\nexport function createSharedModule(\n context: DefaultSharedModuleContext\n): Module<LangiumSharedServices, LangiumDefaultSharedServices> {\n return {\n ServiceRegistry: () => new DefaultServiceRegistry(),\n lsp: {\n Connection: () => context.connection,\n LanguageServer: (services) => new DefaultLanguageServer(services),\n },\n workspace: {\n LangiumDocuments: (services) => new DefaultLangiumDocuments(services),\n LangiumDocumentFactory: (services) => new DefaultLangiumDocumentFactory(services),\n DocumentBuilder: (services) => new DefaultDocumentBuilder(services),\n TextDocuments: () => new TextDocuments(TextDocument),\n IndexManager: (services) => new DefaultIndexManager(services),\n WorkspaceManager: (services) => new ZModelWorkspaceManager(services),\n FileSystemProvider: (services) => context.fileSystemProvider(services),\n MutexLock: () => new MutexLock(),\n ConfigurationProvider: (services) => new DefaultConfigurationProvider(services),\n },\n };\n}\n\n/**\n * Create the full set of services required by Langium.\n *\n * First inject the shared services by merging two modules:\n * - Langium default shared services\n * - Services generated by langium-cli\n *\n * Then inject the language-specific services by merging three modules:\n * - Langium default language-specific services\n * - Services generated by langium-cli\n * - Services specified in this file\n *\n * @param context Optional module context with the LSP connection\n * @returns An object wrapping the shared services and the language-specific services\n */\nexport function createZModelServices(context: DefaultSharedModuleContext): {\n shared: LangiumSharedServices;\n ZModel: ZModelServices;\n} {\n const shared = inject(createSharedModule(context), ZModelGeneratedSharedModule);\n\n const ZModel = inject(createDefaultModule({ shared }), ZModelGeneratedModule, ZModelModule);\n shared.ServiceRegistry.register(ZModel);\n return { shared, ZModel };\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AAkBA;AACA;AACA;AACA;AACA;AACA;AACA;AAAgE;AAiBhE;AACA;AACA;AACA;AACA;AACO,MAAMA,YAAkF,GAAG;EAC9FC,UAAU,EAAE;IACRC,gBAAgB,EAAGC,QAAQ,IAAK,IAAIC,mCAAsB,CAACD,QAAQ,CAAC;IACpEE,MAAM,EAAGF,QAAQ,IAAK,IAAIG,0BAAY,CAACH,QAAQ;EACnD,CAAC;EACDI,UAAU,EAAE;IACRC,kBAAkB,EAAGL,QAAQ,IAAK,IAAIM,yCAAwB,CAACN,QAAQ,CAAC;IACxEO,eAAe,EAAE,MAAM,IAAIA,gCAAe;EAC9C,CAAC;EACDC,GAAG,EAAE;IACDC,SAAS,EAAE,MAAM,IAAIC,gCAAe;EACxC;AACJ,CAAC;;AAED;AAAA;AACO,SAASC,kBAAkB,CAC9BC,OAAmC,EACwB;EAC3D,OAAO;IACHC,eAAe,EAAE,MAAM,IAAIC,+BAAsB,EAAE;IACnDN,GAAG,EAAE;MACDO,UAAU,EAAE,MAAMH,OAAO,CAACI,UAAU;MACpCC,cAAc,EAAGjB,QAAQ,IAAK,IAAIkB,8BAAqB,CAAClB,QAAQ;IACpE,CAAC;IACDmB,SAAS,EAAE;MACPC,gBAAgB,EAAGpB,QAAQ,IAAK,IAAIqB,gCAAuB,CAACrB,QAAQ,CAAC;MACrEsB,sBAAsB,EAAGtB,QAAQ,IAAK,IAAIuB,sCAA6B,CAACvB,QAAQ,CAAC;MACjFwB,eAAe,EAAGxB,QAAQ,IAAK,IAAIyB,+BAAsB,CAACzB,QAAQ,CAAC;MACnE0B,aAAa,EAAE,MAAM,IAAIA,mCAAa,CAACC,8CAAY,CAAC;MACpDC,YAAY,EAAG5B,QAAQ,IAAK,IAAI6B,4BAAmB,CAAC7B,QAAQ,CAAC;MAC7D8B,gBAAgB,EAAG9B,QAAQ,IAAK,IAAI+B,+BAAsB,CAAC/B,QAAQ,CAAC;MACpEgC,kBAAkB,EAAGhC,QAAQ,IAAKY,OAAO,CAACqB,kBAAkB,CAACjC,QAAQ,CAAC;MACtEkC,SAAS,EAAE,MAAM,IAAIA,kBAAS,EAAE;MAChCC,qBAAqB,EAAGnC,QAAQ,IAAK,IAAIoC,qCAA4B,CAACpC,QAAQ;IAClF;EACJ,CAAC;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASqC,oBAAoB,CAACzB,OAAmC,EAGtE;EACE,MAAM0B,MAAM,GAAG,IAAAC,eAAM,EAAC5B,kBAAkB,CAACC,OAAO,CAAC,EAAE4B,mCAA2B,CAAC;EAE/E,MAAMC,MAAM,GAAG,IAAAF,eAAM,EAAC,IAAAG,4BAAmB,EAAC;IAAEJ;EAAO,CAAC,CAAC,EAAEK,6BAAqB,EAAE9C,YAAY,CAAC;EAC3FyC,MAAM,CAACzB,eAAe,CAAC+B,QAAQ,CAACH,MAAM,CAAC;EACvC,OAAO;IAAEH,MAAM;IAAEG;EAAO,CAAC;AAC7B"}
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": "1.0.0-alpha.21",
6
+ "version": "1.0.0-alpha.23",
7
7
  "author": {
8
8
  "name": "ZenStack Team"
9
9
  },
@@ -90,9 +90,9 @@
90
90
  "vscode-languageserver-textdocument": "^1.0.7",
91
91
  "vscode-uri": "^3.0.6",
92
92
  "zod": "^3.19.1",
93
- "@zenstackhq/runtime": "1.0.0-alpha.21",
94
- "@zenstackhq/language": "1.0.0-alpha.21",
95
- "@zenstackhq/sdk": "1.0.0-alpha.21"
93
+ "@zenstackhq/language": "1.0.0-alpha.23",
94
+ "@zenstackhq/runtime": "1.0.0-alpha.23",
95
+ "@zenstackhq/sdk": "1.0.0-alpha.23"
96
96
  },
97
97
  "devDependencies": {
98
98
  "@babel/cli": "^7.19.3",
@@ -78,7 +78,7 @@ class DeclarationBase {
78
78
  return name;
79
79
  }
80
80
  toString() {
81
- return this.documentations.map(x => `/// ${x}\n`).join('');
81
+ return this.documentations.map(x => `${x}\n`).join('');
82
82
  }
83
83
  }
84
84
  exports.DeclarationBase = DeclarationBase;
@@ -1 +1 @@
1
- {"version":3,"file":"prisma-builder.js","names":["PrismaModel","datasources","generators","models","enums","addDataSource","name","provider","url","shadowDatabaseUrl","ds","DataSource","push","addGenerator","fields","generator","Generator","addModel","model","Model","addEnum","e","Enum","toString","map","d","join","constructor","indentString","DataSourceUrl","value","isEnv","f","JSON","stringify","DeclarationBase","documentations","addComment","x","attributes","addField","type","field","ModelField","addAttribute","args","attr","ModelAttribute","ModelFieldType","array","optional","FieldAttribute","length","a","AttributeArg","AttributeArgValue","Error","Array","isArray","FieldReference","FunctionCall","fr","r","v","FieldReferenceArg","func","FunctionCallArg"],"sources":["../../../src/plugins/prisma/prisma-builder.ts"],"sourcesContent":["import indentString from './indent-string';\n\n/**\n * Prisma schema builder\n */\nexport class PrismaModel {\n private datasources: DataSource[] = [];\n private generators: Generator[] = [];\n private models: Model[] = [];\n private enums: Enum[] = [];\n\n addDataSource(name: string, provider: string, url: DataSourceUrl, shadowDatabaseUrl?: DataSourceUrl): DataSource {\n const ds = new DataSource(name, provider, url, shadowDatabaseUrl);\n this.datasources.push(ds);\n return ds;\n }\n\n addGenerator(name: string, fields: Array<{ name: string; value: string | string[] }>): Generator {\n const generator = new Generator(name, fields);\n this.generators.push(generator);\n return generator;\n }\n\n addModel(name: string): Model {\n const model = new Model(name);\n this.models.push(model);\n return model;\n }\n\n addEnum(name: string, fields: string[]): Enum {\n const e = new Enum(name, fields);\n this.enums.push(e);\n return e;\n }\n\n toString(): string {\n return [...this.datasources, ...this.generators, ...this.enums, ...this.models]\n .map((d) => d.toString())\n .join('\\n\\n');\n }\n}\n\nexport class DataSource {\n constructor(\n public name: string,\n public provider: string,\n public url: DataSourceUrl,\n public shadowDatabaseUrl?: DataSourceUrl\n ) {}\n\n toString(): string {\n return (\n `datasource ${this.name} {\\n` +\n indentString(`provider=\"${this.provider}\"\\n`) +\n indentString(`url=${this.url}\\n`) +\n (this.shadowDatabaseUrl ? indentString(`shadowDatabaseurl=${this.shadowDatabaseUrl}\\n`) : '') +\n `}`\n );\n }\n}\n\nexport class DataSourceUrl {\n constructor(public value: string, public isEnv: boolean) {}\n\n toString(): string {\n return this.isEnv ? `env(\"${this.value}\")` : `\"${this.value}\"`;\n }\n}\n\nexport class Generator {\n constructor(public name: string, public fields: Array<{ name: string; value: string | string[] }>) {}\n\n toString(): string {\n return (\n `generator ${this.name} {\\n` +\n this.fields.map((f) => indentString(`${f.name} = ${JSON.stringify(f.value)}`)).join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class DeclarationBase {\n public documentations: string[] = [];\n\n addComment(name: string): string {\n this.documentations.push(name);\n return name;\n }\n\n toString(): string {\n return this.documentations.map((x) => `/// ${x}\\n`).join('');\n }\n}\nexport class Model extends DeclarationBase {\n public fields: ModelField[] = [];\n public attributes: ModelAttribute[] = [];\n constructor(public name: string, public documentations: string[] = []) {\n super();\n }\n\n addField(\n name: string,\n type: ModelFieldType | string,\n attributes: FieldAttribute[] = [],\n documentations: string[] = []\n ): ModelField {\n const field = new ModelField(name, type, attributes, documentations);\n this.fields.push(field);\n return field;\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): ModelAttribute {\n const attr = new ModelAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n super.toString() +\n `model ${this.name} {\\n` +\n indentString([...this.fields, ...this.attributes].map((d) => d.toString()).join('\\n')) +\n `\\n}`\n );\n }\n}\n\nexport type ScalarTypes =\n | 'String'\n | 'Boolean'\n | 'Int'\n | 'BigInt'\n | 'Float'\n | 'Decimal'\n | 'DateTime'\n | 'Json'\n | 'Bytes'\n | 'Unsupported';\n\nexport class ModelFieldType {\n constructor(public type: ScalarTypes | string, public array?: boolean, public optional?: boolean) {}\n\n toString(): string {\n return `${this.type}${this.array ? '[]' : ''}${this.optional ? '?' : ''}`;\n }\n}\n\nexport class ModelField extends DeclarationBase {\n constructor(\n public name: string,\n public type: ModelFieldType | string,\n public attributes: FieldAttribute[] = [],\n public documentations: string[] = []\n ) {\n super();\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): FieldAttribute {\n const attr = new FieldAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n super.toString() +\n `${this.name} ${this.type}` +\n (this.attributes.length > 0 ? ' ' + this.attributes.map((a) => a.toString()).join(' ') : '')\n );\n }\n}\n\nexport class FieldAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class ModelAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class AttributeArg {\n constructor(public name: string | undefined, public value: AttributeArgValue) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value.toString();\n }\n}\n\nexport class AttributeArgValue {\n constructor(\n public type: 'String' | 'FieldReference' | 'Number' | 'Boolean' | 'Array' | 'FunctionCall',\n public value: string | number | boolean | FieldReference | FunctionCall | AttributeArgValue[]\n ) {\n switch (type) {\n case 'String':\n if (typeof value !== 'string') throw new Error('Value must be string');\n break;\n case 'Number':\n if (typeof value !== 'number') throw new Error('Value must be number');\n break;\n case 'Boolean':\n if (typeof value !== 'boolean') throw new Error('Value must be boolean');\n break;\n case 'Array':\n if (!Array.isArray(value)) throw new Error('Value must be array');\n break;\n case 'FieldReference':\n if (typeof value !== 'string' && !(value instanceof FieldReference))\n throw new Error('Value must be string or FieldReference');\n break;\n case 'FunctionCall':\n if (!(value instanceof FunctionCall)) throw new Error('Value must be FunctionCall');\n break;\n }\n }\n\n toString(): string {\n switch (this.type) {\n case 'String':\n return `\"${this.value}\"`;\n case 'Number':\n return this.value.toString();\n case 'FieldReference': {\n if (typeof this.value === 'string') {\n return this.value;\n } else {\n const fr = this.value as FieldReference;\n let r = fr.field;\n if (fr.args.length > 0) {\n r += '(' + fr.args.map((a) => a.toString()).join(',') + ')';\n }\n return r;\n }\n }\n case 'FunctionCall':\n return this.value.toString();\n case 'Boolean':\n return this.value ? 'true' : 'false';\n case 'Array':\n return '[' + (this.value as AttributeArgValue[]).map((v) => v.toString()).join(', ') + ']';\n default:\n throw new Error(`Unknown attribute value type ${this.type}`);\n }\n }\n}\n\nexport class FieldReference {\n constructor(public field: string, public args: FieldReferenceArg[] = []) {}\n}\n\nexport class FieldReferenceArg {\n constructor(public name: 'sort', public value: 'Asc' | 'Desc') {}\n\n toString(): string {\n return `${this.name}: ${this.value}`;\n }\n}\n\nexport class FunctionCall {\n constructor(public func: string, public args: FunctionCallArg[] = []) {}\n\n toString(): string {\n return `${this.func}` + '(' + this.args.map((a) => a.toString()).join(', ') + ')';\n }\n}\n\nexport class FunctionCallArg {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\n constructor(public name: string | undefined, public value: any) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value;\n }\n}\n\nexport class Enum {\n constructor(public name: string, public fields: EnumField[]) {}\n\n toString(): string {\n return `enum ${this.name} {\\n` + indentString(this.fields.join('\\n')) + '\\n}';\n }\n}\n\ntype EnumField = string;\n"],"mappings":"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"}
1
+ {"version":3,"file":"prisma-builder.js","names":["PrismaModel","datasources","generators","models","enums","addDataSource","name","provider","url","shadowDatabaseUrl","ds","DataSource","push","addGenerator","fields","generator","Generator","addModel","model","Model","addEnum","e","Enum","toString","map","d","join","constructor","indentString","DataSourceUrl","value","isEnv","f","JSON","stringify","DeclarationBase","documentations","addComment","x","attributes","addField","type","field","ModelField","addAttribute","args","attr","ModelAttribute","ModelFieldType","array","optional","FieldAttribute","length","a","AttributeArg","AttributeArgValue","Error","Array","isArray","FieldReference","FunctionCall","fr","r","v","FieldReferenceArg","func","FunctionCallArg"],"sources":["../../../src/plugins/prisma/prisma-builder.ts"],"sourcesContent":["import indentString from './indent-string';\n\n/**\n * Prisma schema builder\n */\nexport class PrismaModel {\n private datasources: DataSource[] = [];\n private generators: Generator[] = [];\n private models: Model[] = [];\n private enums: Enum[] = [];\n\n addDataSource(name: string, provider: string, url: DataSourceUrl, shadowDatabaseUrl?: DataSourceUrl): DataSource {\n const ds = new DataSource(name, provider, url, shadowDatabaseUrl);\n this.datasources.push(ds);\n return ds;\n }\n\n addGenerator(name: string, fields: Array<{ name: string; value: string | string[] }>): Generator {\n const generator = new Generator(name, fields);\n this.generators.push(generator);\n return generator;\n }\n\n addModel(name: string): Model {\n const model = new Model(name);\n this.models.push(model);\n return model;\n }\n\n addEnum(name: string, fields: string[]): Enum {\n const e = new Enum(name, fields);\n this.enums.push(e);\n return e;\n }\n\n toString(): string {\n return [...this.datasources, ...this.generators, ...this.enums, ...this.models]\n .map((d) => d.toString())\n .join('\\n\\n');\n }\n}\n\nexport class DataSource {\n constructor(\n public name: string,\n public provider: string,\n public url: DataSourceUrl,\n public shadowDatabaseUrl?: DataSourceUrl\n ) {}\n\n toString(): string {\n return (\n `datasource ${this.name} {\\n` +\n indentString(`provider=\"${this.provider}\"\\n`) +\n indentString(`url=${this.url}\\n`) +\n (this.shadowDatabaseUrl ? indentString(`shadowDatabaseurl=${this.shadowDatabaseUrl}\\n`) : '') +\n `}`\n );\n }\n}\n\nexport class DataSourceUrl {\n constructor(public value: string, public isEnv: boolean) {}\n\n toString(): string {\n return this.isEnv ? `env(\"${this.value}\")` : `\"${this.value}\"`;\n }\n}\n\nexport class Generator {\n constructor(public name: string, public fields: Array<{ name: string; value: string | string[] }>) {}\n\n toString(): string {\n return (\n `generator ${this.name} {\\n` +\n this.fields.map((f) => indentString(`${f.name} = ${JSON.stringify(f.value)}`)).join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class DeclarationBase {\n public documentations: string[] = [];\n\n addComment(name: string): string {\n this.documentations.push(name);\n return name;\n }\n\n toString(): string {\n return this.documentations.map((x) => `${x}\\n`).join('');\n }\n}\nexport class Model extends DeclarationBase {\n public fields: ModelField[] = [];\n public attributes: ModelAttribute[] = [];\n constructor(public name: string, public documentations: string[] = []) {\n super();\n }\n\n addField(\n name: string,\n type: ModelFieldType | string,\n attributes: FieldAttribute[] = [],\n documentations: string[] = []\n ): ModelField {\n const field = new ModelField(name, type, attributes, documentations);\n this.fields.push(field);\n return field;\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): ModelAttribute {\n const attr = new ModelAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n super.toString() +\n `model ${this.name} {\\n` +\n indentString([...this.fields, ...this.attributes].map((d) => d.toString()).join('\\n')) +\n `\\n}`\n );\n }\n}\n\nexport type ScalarTypes =\n | 'String'\n | 'Boolean'\n | 'Int'\n | 'BigInt'\n | 'Float'\n | 'Decimal'\n | 'DateTime'\n | 'Json'\n | 'Bytes'\n | 'Unsupported';\n\nexport class ModelFieldType {\n constructor(public type: ScalarTypes | string, public array?: boolean, public optional?: boolean) {}\n\n toString(): string {\n return `${this.type}${this.array ? '[]' : ''}${this.optional ? '?' : ''}`;\n }\n}\n\nexport class ModelField extends DeclarationBase {\n constructor(\n public name: string,\n public type: ModelFieldType | string,\n public attributes: FieldAttribute[] = [],\n public documentations: string[] = []\n ) {\n super();\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): FieldAttribute {\n const attr = new FieldAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n super.toString() +\n `${this.name} ${this.type}` +\n (this.attributes.length > 0 ? ' ' + this.attributes.map((a) => a.toString()).join(' ') : '')\n );\n }\n}\n\nexport class FieldAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class ModelAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class AttributeArg {\n constructor(public name: string | undefined, public value: AttributeArgValue) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value.toString();\n }\n}\n\nexport class AttributeArgValue {\n constructor(\n public type: 'String' | 'FieldReference' | 'Number' | 'Boolean' | 'Array' | 'FunctionCall',\n public value: string | number | boolean | FieldReference | FunctionCall | AttributeArgValue[]\n ) {\n switch (type) {\n case 'String':\n if (typeof value !== 'string') throw new Error('Value must be string');\n break;\n case 'Number':\n if (typeof value !== 'number') throw new Error('Value must be number');\n break;\n case 'Boolean':\n if (typeof value !== 'boolean') throw new Error('Value must be boolean');\n break;\n case 'Array':\n if (!Array.isArray(value)) throw new Error('Value must be array');\n break;\n case 'FieldReference':\n if (typeof value !== 'string' && !(value instanceof FieldReference))\n throw new Error('Value must be string or FieldReference');\n break;\n case 'FunctionCall':\n if (!(value instanceof FunctionCall)) throw new Error('Value must be FunctionCall');\n break;\n }\n }\n\n toString(): string {\n switch (this.type) {\n case 'String':\n return `\"${this.value}\"`;\n case 'Number':\n return this.value.toString();\n case 'FieldReference': {\n if (typeof this.value === 'string') {\n return this.value;\n } else {\n const fr = this.value as FieldReference;\n let r = fr.field;\n if (fr.args.length > 0) {\n r += '(' + fr.args.map((a) => a.toString()).join(',') + ')';\n }\n return r;\n }\n }\n case 'FunctionCall':\n return this.value.toString();\n case 'Boolean':\n return this.value ? 'true' : 'false';\n case 'Array':\n return '[' + (this.value as AttributeArgValue[]).map((v) => v.toString()).join(', ') + ']';\n default:\n throw new Error(`Unknown attribute value type ${this.type}`);\n }\n }\n}\n\nexport class FieldReference {\n constructor(public field: string, public args: FieldReferenceArg[] = []) {}\n}\n\nexport class FieldReferenceArg {\n constructor(public name: 'sort', public value: 'Asc' | 'Desc') {}\n\n toString(): string {\n return `${this.name}: ${this.value}`;\n }\n}\n\nexport class FunctionCall {\n constructor(public func: string, public args: FunctionCallArg[] = []) {}\n\n toString(): string {\n return `${this.func}` + '(' + this.args.map((a) => a.toString()).join(', ') + ')';\n }\n}\n\nexport class FunctionCallArg {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\n constructor(public name: string | undefined, public value: any) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value;\n }\n}\n\nexport class Enum {\n constructor(public name: string, public fields: EnumField[]) {}\n\n toString(): string {\n return `enum ${this.name} {\\n` + indentString(this.fields.join('\\n')) + '\\n}';\n }\n}\n\ntype EnumField = string;\n"],"mappings":"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"}
@@ -141,7 +141,10 @@ class PrismaSchemaGenerator {
141
141
  for (const attr of decl.attributes.filter(attr => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {
142
142
  this.generateModelAttribute(model, attr);
143
143
  }
144
- decl.attributes.filter(attr => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref)).forEach(attr => model.addComment(this.zModelGenerator.generateAttribute(attr)));
144
+ decl.attributes.filter(attr => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref)).forEach(attr => model.addComment('/// ' + this.zModelGenerator.generateAttribute(attr)));
145
+
146
+ // user defined comments pass-through
147
+ decl.comments.forEach(c => model.addComment(c));
145
148
  }
146
149
  isPrismaAttribute(attr) {
147
150
  return !!attr.attributes.find(a => {
@@ -158,8 +161,11 @@ class PrismaSchemaGenerator {
158
161
  const type = new _prismaBuilder.ModelFieldType(fieldType, field.type.array, field.type.optional);
159
162
  const attributes = field.attributes.filter(attr => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref)).map(attr => this.makeFieldAttribute(attr));
160
163
  const nonPrismaAttributes = field.attributes.filter(attr => !attr.decl.ref || !this.isPrismaAttribute(attr.decl.ref));
161
- const documentations = nonPrismaAttributes.map(attr => this.zModelGenerator.generateAttribute(attr));
162
- model.addField(field.name, type, attributes, documentations);
164
+ const documentations = nonPrismaAttributes.map(attr => '/// ' + this.zModelGenerator.generateAttribute(attr));
165
+ const result = model.addField(field.name, type, attributes, documentations);
166
+
167
+ // user defined comments pass-through
168
+ field.comments.forEach(c => result.addComment(c));
163
169
  }
164
170
  makeFieldAttribute(attr) {
165
171
  return new _prismaBuilder.FieldAttribute((0, _sdk.resolved)(attr.decl).name, attr.args.map(arg => this.makeAttributeArg(arg)));
@@ -1 +1 @@
1
- {"version":3,"file":"schema-generator.js","names":["PrismaSchemaGenerator","zModelGenerator","ZModelCodeGenerator","PRELUDE","generate","model","options","prisma","PrismaModel","decl","declarations","$type","DataSource","generateDataSource","Enum","generateEnum","DataModel","generateModel","GeneratorDecl","generateGenerator","outFile","output","fs","existsSync","path","dirname","mkdirSync","recursive","writeFile","toString","execSync","dataSource","provider","undefined","url","shadowDatabaseUrl","f","fields","name","isStringLiteral","value","PluginError","r","extractDataSourceUrl","addDataSource","fieldValue","PrismaDataSourceUrl","isInvocationExpr","function","ref","args","length","addGenerator","map","isArrayExpr","getLiteralArray","getLiteral","addModel","field","generateModelField","allowAll","denyAll","hasFieldValidation","analyzePolicies","addField","GUARD_FIELD_NAME","PrismaFieldAttribute","PrismaAttributeArg","PrismaAttributeArgValue","TRANSACTION_FIELD_NAME","addAttribute","attr","attributes","filter","isPrismaAttribute","generateModelAttribute","forEach","addComment","generateAttribute","find","a","fieldType","type","reference","$container","ModelFieldType","array","optional","makeFieldAttribute","nonPrismaAttributes","documentations","resolved","arg","makeAttributeArg","makeAttributeArgValue","node","isLiteralExpr","Array","items","item","isReferenceExpr","PrismaFieldReference","target","PrismaFieldReferenceArg","makeFunctionCall","PrismaFunctionCall","PrismaFunctionCallArg","push","PrismaModelAttribute","addEnum"],"sources":["../../../src/plugins/prisma/schema-generator.ts"],"sourcesContent":["import {\n AstNode,\n Attribute,\n AttributeArg,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n DataSource,\n Enum,\n Expression,\n GeneratorDecl,\n InvocationExpr,\n LiteralExpr,\n Model,\n isArrayExpr,\n isInvocationExpr,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport {\n GUARD_FIELD_NAME,\n PluginError,\n PluginOptions,\n TRANSACTION_FIELD_NAME,\n getLiteral,\n getLiteralArray,\n resolved,\n} from '@zenstackhq/sdk';\nimport fs from 'fs';\nimport { writeFile } from 'fs/promises';\nimport path from 'path';\nimport { analyzePolicies } from '../../utils/ast-utils';\nimport { execSync } from '../../utils/exec-utils';\nimport ZModelCodeGenerator from './zmodel-code-generator';\nimport {\n ModelFieldType,\n AttributeArg as PrismaAttributeArg,\n AttributeArgValue as PrismaAttributeArgValue,\n Model as PrismaDataModel,\n DataSourceUrl as PrismaDataSourceUrl,\n FieldAttribute as PrismaFieldAttribute,\n FieldReference as PrismaFieldReference,\n FieldReferenceArg as PrismaFieldReferenceArg,\n FunctionCall as PrismaFunctionCall,\n FunctionCallArg as PrismaFunctionCallArg,\n PrismaModel,\n ModelAttribute as PrismaModelAttribute,\n} from './prisma-builder';\n\n/**\n * Generates Prisma schema file\n */\nexport default class PrismaSchemaGenerator {\n private zModelGenerator: ZModelCodeGenerator = new ZModelCodeGenerator();\n\n private readonly PRELUDE = `//////////////////////////////////////////////////////////////////////////////////////////////\n// DO NOT MODIFY THIS FILE //\n// This file is automatically generated by ZenStack CLI and should not be manually updated. //\n//////////////////////////////////////////////////////////////////////////////////////////////\n\n`;\n\n async generate(model: Model, options: PluginOptions) {\n const prisma = new PrismaModel();\n\n for (const decl of model.declarations) {\n switch (decl.$type) {\n case DataSource:\n this.generateDataSource(prisma, decl as DataSource);\n break;\n\n case Enum:\n this.generateEnum(prisma, decl as Enum);\n break;\n\n case DataModel:\n this.generateModel(prisma, decl as DataModel);\n break;\n\n case GeneratorDecl:\n this.generateGenerator(prisma, decl as GeneratorDecl);\n break;\n }\n }\n\n const outFile = (options.output as string) ?? './prisma/schema.prisma';\n if (!fs.existsSync(path.dirname(outFile))) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true });\n }\n await writeFile(outFile, this.PRELUDE + prisma.toString());\n\n // run 'prisma generate'\n await execSync(`npx prisma generate --schema ${outFile}`);\n }\n\n private generateDataSource(prisma: PrismaModel, dataSource: DataSource) {\n let provider: string | undefined = undefined;\n let url: PrismaDataSourceUrl | undefined = undefined;\n let shadowDatabaseUrl: PrismaDataSourceUrl | undefined = undefined;\n\n for (const f of dataSource.fields) {\n switch (f.name) {\n case 'provider': {\n if (this.isStringLiteral(f.value)) {\n provider = f.value.value as string;\n } else {\n throw new PluginError('Datasource provider must be set to a string');\n }\n break;\n }\n\n case 'url': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n url = r;\n break;\n }\n\n case 'shadowDatabaseUrl': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n shadowDatabaseUrl = r;\n break;\n }\n }\n }\n\n if (!provider) {\n throw new PluginError('Datasource is missing \"provider\" field');\n }\n if (!url) {\n throw new PluginError('Datasource is missing \"url\" field');\n }\n\n prisma.addDataSource(dataSource.name, provider, url, shadowDatabaseUrl);\n }\n\n private extractDataSourceUrl(fieldValue: LiteralExpr | InvocationExpr) {\n if (this.isStringLiteral(fieldValue)) {\n return new PrismaDataSourceUrl(fieldValue.value as string, false);\n } else if (\n isInvocationExpr(fieldValue) &&\n fieldValue.function.ref?.name === 'env' &&\n fieldValue.args.length === 1 &&\n this.isStringLiteral(fieldValue.args[0].value)\n ) {\n return new PrismaDataSourceUrl(fieldValue.args[0].value.value as string, true);\n } else {\n return null;\n }\n }\n\n private generateGenerator(prisma: PrismaModel, decl: GeneratorDecl) {\n prisma.addGenerator(\n decl.name,\n decl.fields.map((f) => {\n const value = isArrayExpr(f.value) ? getLiteralArray(f.value) : getLiteral(f.value);\n return { name: f.name, value };\n })\n );\n }\n\n private generateModel(prisma: PrismaModel, decl: DataModel) {\n const model = prisma.addModel(decl.name);\n for (const field of decl.fields) {\n this.generateModelField(model, field);\n }\n\n const { allowAll, denyAll, hasFieldValidation } = analyzePolicies(decl);\n\n if ((!allowAll && !denyAll) || hasFieldValidation) {\n // generate auxiliary fields for policy check\n\n // add an \"zenstack_guard\" field for dealing with pure auth() related conditions\n model.addField(GUARD_FIELD_NAME, 'Boolean', [\n new PrismaFieldAttribute('@default', [\n new PrismaAttributeArg(undefined, new PrismaAttributeArgValue('Boolean', true)),\n ]),\n ]);\n\n // add an \"zenstack_transaction\" field for tracking records created/updated with nested writes\n model.addField(TRANSACTION_FIELD_NAME, 'String?');\n\n // create an index for \"zenstack_transaction\" field\n model.addAttribute('@@index', [\n new PrismaAttributeArg(\n undefined,\n new PrismaAttributeArgValue('Array', [\n new PrismaAttributeArgValue('FieldReference', TRANSACTION_FIELD_NAME),\n ])\n ),\n ]);\n }\n\n for (const attr of decl.attributes.filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {\n this.generateModelAttribute(model, attr);\n }\n\n decl.attributes\n .filter((attr) => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref))\n .forEach((attr) => model.addComment(this.zModelGenerator.generateAttribute(attr)));\n }\n\n private isPrismaAttribute(attr: Attribute) {\n return !!attr.attributes.find((a) => a.decl.ref?.name === '@@@prisma');\n }\n\n private generateModelField(model: PrismaDataModel, field: DataModelField) {\n const fieldType = field.type.type || field.type.reference?.ref?.name;\n if (!fieldType) {\n throw new PluginError(`Field type is not resolved: ${field.$container.name}.${field.name}`);\n }\n\n const type = new ModelFieldType(fieldType, field.type.array, field.type.optional);\n\n const attributes = field.attributes\n .filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))\n .map((attr) => this.makeFieldAttribute(attr));\n\n const nonPrismaAttributes = field.attributes.filter(\n (attr) => !attr.decl.ref || !this.isPrismaAttribute(attr.decl.ref)\n );\n\n const documentations = nonPrismaAttributes.map((attr) => this.zModelGenerator.generateAttribute(attr));\n\n model.addField(field.name, type, attributes, documentations);\n }\n\n private makeFieldAttribute(attr: DataModelFieldAttribute) {\n return new PrismaFieldAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n );\n }\n\n private makeAttributeArg(arg: AttributeArg): PrismaAttributeArg {\n return new PrismaAttributeArg(arg.name, this.makeAttributeArgValue(arg.value));\n }\n\n private makeAttributeArgValue(node: Expression): PrismaAttributeArgValue {\n if (isLiteralExpr(node)) {\n switch (typeof node.value) {\n case 'string':\n return new PrismaAttributeArgValue('String', node.value);\n case 'number':\n return new PrismaAttributeArgValue('Number', node.value);\n case 'boolean':\n return new PrismaAttributeArgValue('Boolean', node.value);\n default:\n throw new PluginError(`Unexpected literal type: ${typeof node.value}`);\n }\n } else if (isArrayExpr(node)) {\n return new PrismaAttributeArgValue(\n 'Array',\n new Array(...node.items.map((item) => this.makeAttributeArgValue(item)))\n );\n } else if (isReferenceExpr(node)) {\n return new PrismaAttributeArgValue(\n 'FieldReference',\n new PrismaFieldReference(\n resolved(node.target).name,\n node.args.map((arg) => new PrismaFieldReferenceArg(arg.name, arg.value))\n )\n );\n } else if (isInvocationExpr(node)) {\n // invocation\n return new PrismaAttributeArgValue('FunctionCall', this.makeFunctionCall(node));\n } else {\n throw new PluginError(`Unsupported attribute argument expression type: ${node.$type}`);\n }\n }\n\n makeFunctionCall(node: InvocationExpr): PrismaFunctionCall {\n return new PrismaFunctionCall(\n resolved(node.function).name,\n node.args.map((arg) => {\n if (!isLiteralExpr(arg.value)) {\n throw new PluginError('Function call argument must be literal');\n }\n return new PrismaFunctionCallArg(arg.name, arg.value.value);\n })\n );\n }\n\n private generateModelAttribute(model: PrismaDataModel, attr: DataModelAttribute) {\n model.attributes.push(\n new PrismaModelAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n )\n );\n }\n\n private generateEnum(prisma: PrismaModel, decl: Enum) {\n prisma.addEnum(\n decl.name,\n decl.fields.map((f) => f.name)\n );\n }\n\n private isStringLiteral(node: AstNode): node is LiteralExpr {\n return isLiteralExpr(node) && typeof node.value === 'string';\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"schema-generator.js","names":["PrismaSchemaGenerator","zModelGenerator","ZModelCodeGenerator","PRELUDE","generate","model","options","prisma","PrismaModel","decl","declarations","$type","DataSource","generateDataSource","Enum","generateEnum","DataModel","generateModel","GeneratorDecl","generateGenerator","outFile","output","fs","existsSync","path","dirname","mkdirSync","recursive","writeFile","toString","execSync","dataSource","provider","undefined","url","shadowDatabaseUrl","f","fields","name","isStringLiteral","value","PluginError","r","extractDataSourceUrl","addDataSource","fieldValue","PrismaDataSourceUrl","isInvocationExpr","function","ref","args","length","addGenerator","map","isArrayExpr","getLiteralArray","getLiteral","addModel","field","generateModelField","allowAll","denyAll","hasFieldValidation","analyzePolicies","addField","GUARD_FIELD_NAME","PrismaFieldAttribute","PrismaAttributeArg","PrismaAttributeArgValue","TRANSACTION_FIELD_NAME","addAttribute","attr","attributes","filter","isPrismaAttribute","generateModelAttribute","forEach","addComment","generateAttribute","comments","c","find","a","fieldType","type","reference","$container","ModelFieldType","array","optional","makeFieldAttribute","nonPrismaAttributes","documentations","result","resolved","arg","makeAttributeArg","makeAttributeArgValue","node","isLiteralExpr","Array","items","item","isReferenceExpr","PrismaFieldReference","target","PrismaFieldReferenceArg","makeFunctionCall","PrismaFunctionCall","PrismaFunctionCallArg","push","PrismaModelAttribute","addEnum"],"sources":["../../../src/plugins/prisma/schema-generator.ts"],"sourcesContent":["import {\n AstNode,\n Attribute,\n AttributeArg,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n DataSource,\n Enum,\n Expression,\n GeneratorDecl,\n InvocationExpr,\n LiteralExpr,\n Model,\n isArrayExpr,\n isInvocationExpr,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport {\n GUARD_FIELD_NAME,\n PluginError,\n PluginOptions,\n TRANSACTION_FIELD_NAME,\n getLiteral,\n getLiteralArray,\n resolved,\n} from '@zenstackhq/sdk';\nimport fs from 'fs';\nimport { writeFile } from 'fs/promises';\nimport path from 'path';\nimport { analyzePolicies } from '../../utils/ast-utils';\nimport { execSync } from '../../utils/exec-utils';\nimport ZModelCodeGenerator from './zmodel-code-generator';\nimport {\n ModelFieldType,\n AttributeArg as PrismaAttributeArg,\n AttributeArgValue as PrismaAttributeArgValue,\n Model as PrismaDataModel,\n DataSourceUrl as PrismaDataSourceUrl,\n FieldAttribute as PrismaFieldAttribute,\n FieldReference as PrismaFieldReference,\n FieldReferenceArg as PrismaFieldReferenceArg,\n FunctionCall as PrismaFunctionCall,\n FunctionCallArg as PrismaFunctionCallArg,\n PrismaModel,\n ModelAttribute as PrismaModelAttribute,\n} from './prisma-builder';\n\n/**\n * Generates Prisma schema file\n */\nexport default class PrismaSchemaGenerator {\n private zModelGenerator: ZModelCodeGenerator = new ZModelCodeGenerator();\n\n private readonly PRELUDE = `//////////////////////////////////////////////////////////////////////////////////////////////\n// DO NOT MODIFY THIS FILE //\n// This file is automatically generated by ZenStack CLI and should not be manually updated. //\n//////////////////////////////////////////////////////////////////////////////////////////////\n\n`;\n\n async generate(model: Model, options: PluginOptions) {\n const prisma = new PrismaModel();\n\n for (const decl of model.declarations) {\n switch (decl.$type) {\n case DataSource:\n this.generateDataSource(prisma, decl as DataSource);\n break;\n\n case Enum:\n this.generateEnum(prisma, decl as Enum);\n break;\n\n case DataModel:\n this.generateModel(prisma, decl as DataModel);\n break;\n\n case GeneratorDecl:\n this.generateGenerator(prisma, decl as GeneratorDecl);\n break;\n }\n }\n\n const outFile = (options.output as string) ?? './prisma/schema.prisma';\n if (!fs.existsSync(path.dirname(outFile))) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true });\n }\n await writeFile(outFile, this.PRELUDE + prisma.toString());\n\n // run 'prisma generate'\n await execSync(`npx prisma generate --schema ${outFile}`);\n }\n\n private generateDataSource(prisma: PrismaModel, dataSource: DataSource) {\n let provider: string | undefined = undefined;\n let url: PrismaDataSourceUrl | undefined = undefined;\n let shadowDatabaseUrl: PrismaDataSourceUrl | undefined = undefined;\n\n for (const f of dataSource.fields) {\n switch (f.name) {\n case 'provider': {\n if (this.isStringLiteral(f.value)) {\n provider = f.value.value as string;\n } else {\n throw new PluginError('Datasource provider must be set to a string');\n }\n break;\n }\n\n case 'url': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n url = r;\n break;\n }\n\n case 'shadowDatabaseUrl': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n shadowDatabaseUrl = r;\n break;\n }\n }\n }\n\n if (!provider) {\n throw new PluginError('Datasource is missing \"provider\" field');\n }\n if (!url) {\n throw new PluginError('Datasource is missing \"url\" field');\n }\n\n prisma.addDataSource(dataSource.name, provider, url, shadowDatabaseUrl);\n }\n\n private extractDataSourceUrl(fieldValue: LiteralExpr | InvocationExpr) {\n if (this.isStringLiteral(fieldValue)) {\n return new PrismaDataSourceUrl(fieldValue.value as string, false);\n } else if (\n isInvocationExpr(fieldValue) &&\n fieldValue.function.ref?.name === 'env' &&\n fieldValue.args.length === 1 &&\n this.isStringLiteral(fieldValue.args[0].value)\n ) {\n return new PrismaDataSourceUrl(fieldValue.args[0].value.value as string, true);\n } else {\n return null;\n }\n }\n\n private generateGenerator(prisma: PrismaModel, decl: GeneratorDecl) {\n prisma.addGenerator(\n decl.name,\n decl.fields.map((f) => {\n const value = isArrayExpr(f.value) ? getLiteralArray(f.value) : getLiteral(f.value);\n return { name: f.name, value };\n })\n );\n }\n\n private generateModel(prisma: PrismaModel, decl: DataModel) {\n const model = prisma.addModel(decl.name);\n for (const field of decl.fields) {\n this.generateModelField(model, field);\n }\n\n const { allowAll, denyAll, hasFieldValidation } = analyzePolicies(decl);\n\n if ((!allowAll && !denyAll) || hasFieldValidation) {\n // generate auxiliary fields for policy check\n\n // add an \"zenstack_guard\" field for dealing with pure auth() related conditions\n model.addField(GUARD_FIELD_NAME, 'Boolean', [\n new PrismaFieldAttribute('@default', [\n new PrismaAttributeArg(undefined, new PrismaAttributeArgValue('Boolean', true)),\n ]),\n ]);\n\n // add an \"zenstack_transaction\" field for tracking records created/updated with nested writes\n model.addField(TRANSACTION_FIELD_NAME, 'String?');\n\n // create an index for \"zenstack_transaction\" field\n model.addAttribute('@@index', [\n new PrismaAttributeArg(\n undefined,\n new PrismaAttributeArgValue('Array', [\n new PrismaAttributeArgValue('FieldReference', TRANSACTION_FIELD_NAME),\n ])\n ),\n ]);\n }\n\n for (const attr of decl.attributes.filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {\n this.generateModelAttribute(model, attr);\n }\n\n decl.attributes\n .filter((attr) => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref))\n .forEach((attr) => model.addComment('/// ' + this.zModelGenerator.generateAttribute(attr)));\n\n // user defined comments pass-through\n decl.comments.forEach((c) => model.addComment(c));\n }\n\n private isPrismaAttribute(attr: Attribute) {\n return !!attr.attributes.find((a) => a.decl.ref?.name === '@@@prisma');\n }\n\n private generateModelField(model: PrismaDataModel, field: DataModelField) {\n const fieldType = field.type.type || field.type.reference?.ref?.name;\n if (!fieldType) {\n throw new PluginError(`Field type is not resolved: ${field.$container.name}.${field.name}`);\n }\n\n const type = new ModelFieldType(fieldType, field.type.array, field.type.optional);\n\n const attributes = field.attributes\n .filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))\n .map((attr) => this.makeFieldAttribute(attr));\n\n const nonPrismaAttributes = field.attributes.filter(\n (attr) => !attr.decl.ref || !this.isPrismaAttribute(attr.decl.ref)\n );\n\n const documentations = nonPrismaAttributes.map((attr) => '/// ' + this.zModelGenerator.generateAttribute(attr));\n\n const result = model.addField(field.name, type, attributes, documentations);\n\n // user defined comments pass-through\n field.comments.forEach((c) => result.addComment(c));\n }\n\n private makeFieldAttribute(attr: DataModelFieldAttribute) {\n return new PrismaFieldAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n );\n }\n\n private makeAttributeArg(arg: AttributeArg): PrismaAttributeArg {\n return new PrismaAttributeArg(arg.name, this.makeAttributeArgValue(arg.value));\n }\n\n private makeAttributeArgValue(node: Expression): PrismaAttributeArgValue {\n if (isLiteralExpr(node)) {\n switch (typeof node.value) {\n case 'string':\n return new PrismaAttributeArgValue('String', node.value);\n case 'number':\n return new PrismaAttributeArgValue('Number', node.value);\n case 'boolean':\n return new PrismaAttributeArgValue('Boolean', node.value);\n default:\n throw new PluginError(`Unexpected literal type: ${typeof node.value}`);\n }\n } else if (isArrayExpr(node)) {\n return new PrismaAttributeArgValue(\n 'Array',\n new Array(...node.items.map((item) => this.makeAttributeArgValue(item)))\n );\n } else if (isReferenceExpr(node)) {\n return new PrismaAttributeArgValue(\n 'FieldReference',\n new PrismaFieldReference(\n resolved(node.target).name,\n node.args.map((arg) => new PrismaFieldReferenceArg(arg.name, arg.value))\n )\n );\n } else if (isInvocationExpr(node)) {\n // invocation\n return new PrismaAttributeArgValue('FunctionCall', this.makeFunctionCall(node));\n } else {\n throw new PluginError(`Unsupported attribute argument expression type: ${node.$type}`);\n }\n }\n\n makeFunctionCall(node: InvocationExpr): PrismaFunctionCall {\n return new PrismaFunctionCall(\n resolved(node.function).name,\n node.args.map((arg) => {\n if (!isLiteralExpr(arg.value)) {\n throw new PluginError('Function call argument must be literal');\n }\n return new PrismaFunctionCallArg(arg.name, arg.value.value);\n })\n );\n }\n\n private generateModelAttribute(model: PrismaDataModel, attr: DataModelAttribute) {\n model.attributes.push(\n new PrismaModelAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n )\n );\n }\n\n private generateEnum(prisma: PrismaModel, decl: Enum) {\n prisma.addEnum(\n decl.name,\n decl.fields.map((f) => f.name)\n );\n }\n\n private isStringLiteral(node: AstNode): node is LiteralExpr {\n return isLiteralExpr(node) && typeof node.value === 'string';\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Argument, AttributeArg, BinaryExpr, DataModelAttribute, DataModelFieldAttribute, Expression, InvocationExpr, LiteralExpr, MemberAccessExpr, ReferenceArg, ReferenceExpr, UnaryExpr } from '@zenstackhq/language/ast';
1
+ import { Argument, ArrayExpr, AttributeArg, BinaryExpr, DataModelAttribute, DataModelFieldAttribute, Expression, InvocationExpr, LiteralExpr, MemberAccessExpr, ReferenceArg, ReferenceExpr, UnaryExpr } from '@zenstackhq/language/ast';
2
2
  /**
3
3
  * Options for the generator.
4
4
  */
@@ -12,6 +12,7 @@ export default class ZModelCodeGenerator {
12
12
  generateAttribute(ast: DataModelAttribute | DataModelFieldAttribute): string;
13
13
  generateAttributeArg(ast: AttributeArg): string;
14
14
  generateExpression(ast: Expression): string;
15
+ generateArrayExpr(ast: ArrayExpr): string;
15
16
  generateLiteralExpr(ast: LiteralExpr): string;
16
17
  generateUnaryExpr(ast: UnaryExpr): string;
17
18
  generateBinaryExpr(ast: BinaryExpr): string;
@@ -18,7 +18,11 @@ class ZModelCodeGenerator {
18
18
  return `${(0, _sdk.resolved)(ast.decl).name}${args}`;
19
19
  }
20
20
  generateAttributeArg(ast) {
21
- return this.generateExpression(ast.value);
21
+ if (ast.name) {
22
+ return `${ast.name}: ${this.generateExpression(ast.value)}`;
23
+ } else {
24
+ return this.generateExpression(ast.value);
25
+ }
22
26
  }
23
27
  generateExpression(ast) {
24
28
  switch (ast.$type) {
@@ -26,6 +30,8 @@ class ZModelCodeGenerator {
26
30
  return this.generateLiteralExpr(ast);
27
31
  case _ast.UnaryExpr:
28
32
  return this.generateUnaryExpr(ast);
33
+ case _ast.ArrayExpr:
34
+ return this.generateArrayExpr(ast);
29
35
  case _ast.BinaryExpr:
30
36
  return this.generateBinaryExpr(ast);
31
37
  case _ast.ReferenceExpr:
@@ -38,9 +44,12 @@ class ZModelCodeGenerator {
38
44
  case _ast.ThisExpr:
39
45
  return ast.value;
40
46
  default:
41
- throw new Error(`Not implemented: ${ast.$type}`);
47
+ throw new Error(`Not implemented: ${ast}`);
42
48
  }
43
49
  }
50
+ generateArrayExpr(ast) {
51
+ return `[${ast.items.map(item => this.generateExpression(item)).join(', ')}]`;
52
+ }
44
53
  generateLiteralExpr(ast) {
45
54
  return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value.toString();
46
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"zmodel-code-generator.js","names":["ZModelCodeGenerator","constructor","options","binaryExprNumberOfSpaces","unaryExprNumberOfSpaces","generateAttribute","ast","args","length","map","x","generateAttributeArg","join","resolved","decl","name","generateExpression","value","$type","LiteralExpr","generateLiteralExpr","UnaryExpr","generateUnaryExpr","BinaryExpr","generateBinaryExpr","ReferenceExpr","generateReferenceExpr","MemberAccessExpr","generateMemberExpr","InvocationExpr","generateInvocationExpr","NullExpr","ThisExpr","Error","toString","operator","unaryExprSpace","operand","isCollectionPredicate","isCollectionPredicateOperator","rightExpr","right","left","isLeftParenthesis","isRightParenthesis","isParenthesesNeededForBinaryExpr","binaryExprSpace","generateReferenceArg","target","ref","member","function","generateArgument","repeat","result","currentPriority","BinaryExprOperatorPriority","op","includes"],"sources":["../../../src/plugins/prisma/zmodel-code-generator.ts"],"sourcesContent":["import {\n Argument,\n AttributeArg,\n BinaryExpr,\n DataModelAttribute,\n DataModelFieldAttribute,\n Expression,\n InvocationExpr,\n LiteralExpr,\n MemberAccessExpr,\n NullExpr,\n ReferenceArg,\n ReferenceExpr,\n ThisExpr,\n UnaryExpr,\n BinaryExprOperatorPriority,\n} from '@zenstackhq/language/ast';\nimport { resolved } from '@zenstackhq/sdk';\n\n/**\n * Options for the generator.\n */\nexport interface ZModelCodeOptions {\n binaryExprNumberOfSpaces: number;\n unaryExprNumberOfSpaces: number;\n}\n\nexport default class ZModelCodeGenerator {\n private readonly options: ZModelCodeOptions;\n constructor(options?: Partial<ZModelCodeOptions>) {\n this.options = {\n binaryExprNumberOfSpaces: options?.binaryExprNumberOfSpaces ?? 1,\n unaryExprNumberOfSpaces: options?.unaryExprNumberOfSpaces ?? 0,\n };\n }\n generateAttribute(ast: DataModelAttribute | DataModelFieldAttribute): string {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateAttributeArg(x)).join(', ')})` : '';\n return `${resolved(ast.decl).name}${args}`;\n }\n\n generateAttributeArg(ast: AttributeArg) {\n return this.generateExpression(ast.value);\n }\n\n generateExpression(ast: Expression): string {\n switch (ast.$type) {\n case LiteralExpr:\n return this.generateLiteralExpr(ast as LiteralExpr);\n case UnaryExpr:\n return this.generateUnaryExpr(ast as UnaryExpr);\n case BinaryExpr:\n return this.generateBinaryExpr(ast as BinaryExpr);\n case ReferenceExpr:\n return this.generateReferenceExpr(ast as ReferenceExpr);\n case MemberAccessExpr:\n return this.generateMemberExpr(ast as MemberAccessExpr);\n case InvocationExpr:\n return this.generateInvocationExpr(ast as InvocationExpr);\n case NullExpr:\n case ThisExpr:\n return (ast as NullExpr | ThisExpr).value;\n default:\n throw new Error(`Not implemented: ${ast.$type}`);\n }\n }\n\n generateLiteralExpr(ast: LiteralExpr) {\n return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value.toString();\n }\n\n generateUnaryExpr(ast: UnaryExpr) {\n return `${ast.operator}${this.unaryExprSpace}${this.generateExpression(ast.operand)}`;\n }\n\n generateBinaryExpr(ast: BinaryExpr) {\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n const rightExpr = this.generateExpression(ast.right);\n\n const { left: isLeftParenthesis, right: isRightParenthesis } = this.isParenthesesNeededForBinaryExpr(ast);\n\n return `${isLeftParenthesis ? '(' : ''}${this.generateExpression(ast.left)}${isLeftParenthesis ? ')' : ''}${\n this.binaryExprSpace\n }${operator}${this.binaryExprSpace}${isRightParenthesis ? '(' : ''}${\n isCollectionPredicate ? `[${rightExpr}]` : rightExpr\n }${isRightParenthesis ? ')' : ''}`;\n }\n\n generateReferenceExpr(ast: ReferenceExpr) {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateReferenceArg(x)).join(', ')})` : '';\n return `${ast.target.ref?.name}${args}`;\n }\n\n generateReferenceArg(ast: ReferenceArg) {\n return `${ast.name}:${ast.value}`;\n }\n\n generateMemberExpr(ast: MemberAccessExpr) {\n return `${this.generateExpression(ast.operand)}.${ast.member.ref?.name}`;\n }\n\n generateInvocationExpr(ast: InvocationExpr) {\n return `${ast.function.ref?.name}(${ast.args.map((x) => this.generateArgument(x)).join(', ')})`;\n }\n\n generateArgument(ast: Argument) {\n return `${ast.name && ':'} ${this.generateExpression(ast.value)}`;\n }\n\n private get binaryExprSpace(): string {\n return ' '.repeat(this.options.binaryExprNumberOfSpaces);\n }\n\n private get unaryExprSpace(): string {\n return ' '.repeat(this.options.unaryExprNumberOfSpaces);\n }\n\n private isParenthesesNeededForBinaryExpr(ast: BinaryExpr): { left: boolean; right: boolean } {\n const result = { left: false, right: false };\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n\n const currentPriority = BinaryExprOperatorPriority[operator];\n\n if (\n ast.left.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.left as BinaryExpr)['operator']] < currentPriority\n ) {\n result.left = true;\n }\n /**\n * 1 collection predicate operator has [] around the right operand, no need to add parenthesis.\n * 2 grammar is left associative, so if the right operand has the same priority still need to add parenthesis.\n **/\n if (\n !isCollectionPredicate &&\n ast.right.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.right as BinaryExpr)['operator']] <= currentPriority\n ) {\n result.right = true;\n }\n\n return result;\n }\n\n private isCollectionPredicateOperator(op: BinaryExpr['operator']) {\n return ['?', '!', '^'].includes(op);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"zmodel-code-generator.js","names":["ZModelCodeGenerator","constructor","options","binaryExprNumberOfSpaces","unaryExprNumberOfSpaces","generateAttribute","ast","args","length","map","x","generateAttributeArg","join","resolved","decl","name","generateExpression","value","$type","LiteralExpr","generateLiteralExpr","UnaryExpr","generateUnaryExpr","ArrayExpr","generateArrayExpr","BinaryExpr","generateBinaryExpr","ReferenceExpr","generateReferenceExpr","MemberAccessExpr","generateMemberExpr","InvocationExpr","generateInvocationExpr","NullExpr","ThisExpr","Error","items","item","toString","operator","unaryExprSpace","operand","isCollectionPredicate","isCollectionPredicateOperator","rightExpr","right","left","isLeftParenthesis","isRightParenthesis","isParenthesesNeededForBinaryExpr","binaryExprSpace","generateReferenceArg","target","ref","member","function","generateArgument","repeat","result","currentPriority","BinaryExprOperatorPriority","op","includes"],"sources":["../../../src/plugins/prisma/zmodel-code-generator.ts"],"sourcesContent":["import {\n Argument,\n ArrayExpr,\n AttributeArg,\n BinaryExpr,\n BinaryExprOperatorPriority,\n DataModelAttribute,\n DataModelFieldAttribute,\n Expression,\n InvocationExpr,\n LiteralExpr,\n MemberAccessExpr,\n NullExpr,\n ReferenceArg,\n ReferenceExpr,\n ThisExpr,\n UnaryExpr,\n} from '@zenstackhq/language/ast';\nimport { resolved } from '@zenstackhq/sdk';\n\n/**\n * Options for the generator.\n */\nexport interface ZModelCodeOptions {\n binaryExprNumberOfSpaces: number;\n unaryExprNumberOfSpaces: number;\n}\n\nexport default class ZModelCodeGenerator {\n private readonly options: ZModelCodeOptions;\n constructor(options?: Partial<ZModelCodeOptions>) {\n this.options = {\n binaryExprNumberOfSpaces: options?.binaryExprNumberOfSpaces ?? 1,\n unaryExprNumberOfSpaces: options?.unaryExprNumberOfSpaces ?? 0,\n };\n }\n generateAttribute(ast: DataModelAttribute | DataModelFieldAttribute): string {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateAttributeArg(x)).join(', ')})` : '';\n return `${resolved(ast.decl).name}${args}`;\n }\n\n generateAttributeArg(ast: AttributeArg) {\n if (ast.name) {\n return `${ast.name}: ${this.generateExpression(ast.value)}`;\n } else {\n return this.generateExpression(ast.value);\n }\n }\n\n generateExpression(ast: Expression): string {\n switch (ast.$type) {\n case LiteralExpr:\n return this.generateLiteralExpr(ast as LiteralExpr);\n case UnaryExpr:\n return this.generateUnaryExpr(ast as UnaryExpr);\n case ArrayExpr:\n return this.generateArrayExpr(ast as ArrayExpr);\n case BinaryExpr:\n return this.generateBinaryExpr(ast as BinaryExpr);\n case ReferenceExpr:\n return this.generateReferenceExpr(ast as ReferenceExpr);\n case MemberAccessExpr:\n return this.generateMemberExpr(ast as MemberAccessExpr);\n case InvocationExpr:\n return this.generateInvocationExpr(ast as InvocationExpr);\n case NullExpr:\n case ThisExpr:\n return (ast as NullExpr | ThisExpr).value;\n default:\n throw new Error(`Not implemented: ${ast}`);\n }\n }\n\n generateArrayExpr(ast: ArrayExpr) {\n return `[${ast.items.map((item) => this.generateExpression(item)).join(', ')}]`;\n }\n\n generateLiteralExpr(ast: LiteralExpr) {\n return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value.toString();\n }\n\n generateUnaryExpr(ast: UnaryExpr) {\n return `${ast.operator}${this.unaryExprSpace}${this.generateExpression(ast.operand)}`;\n }\n\n generateBinaryExpr(ast: BinaryExpr) {\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n const rightExpr = this.generateExpression(ast.right);\n\n const { left: isLeftParenthesis, right: isRightParenthesis } = this.isParenthesesNeededForBinaryExpr(ast);\n\n return `${isLeftParenthesis ? '(' : ''}${this.generateExpression(ast.left)}${isLeftParenthesis ? ')' : ''}${\n this.binaryExprSpace\n }${operator}${this.binaryExprSpace}${isRightParenthesis ? '(' : ''}${\n isCollectionPredicate ? `[${rightExpr}]` : rightExpr\n }${isRightParenthesis ? ')' : ''}`;\n }\n\n generateReferenceExpr(ast: ReferenceExpr) {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateReferenceArg(x)).join(', ')})` : '';\n return `${ast.target.ref?.name}${args}`;\n }\n\n generateReferenceArg(ast: ReferenceArg) {\n return `${ast.name}:${ast.value}`;\n }\n\n generateMemberExpr(ast: MemberAccessExpr) {\n return `${this.generateExpression(ast.operand)}.${ast.member.ref?.name}`;\n }\n\n generateInvocationExpr(ast: InvocationExpr) {\n return `${ast.function.ref?.name}(${ast.args.map((x) => this.generateArgument(x)).join(', ')})`;\n }\n\n generateArgument(ast: Argument) {\n return `${ast.name && ':'} ${this.generateExpression(ast.value)}`;\n }\n\n private get binaryExprSpace(): string {\n return ' '.repeat(this.options.binaryExprNumberOfSpaces);\n }\n\n private get unaryExprSpace(): string {\n return ' '.repeat(this.options.unaryExprNumberOfSpaces);\n }\n\n private isParenthesesNeededForBinaryExpr(ast: BinaryExpr): { left: boolean; right: boolean } {\n const result = { left: false, right: false };\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n\n const currentPriority = BinaryExprOperatorPriority[operator];\n\n if (\n ast.left.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.left as BinaryExpr)['operator']] < currentPriority\n ) {\n result.left = true;\n }\n /**\n * 1 collection predicate operator has [] around the right operand, no need to add parenthesis.\n * 2 grammar is left associative, so if the right operand has the same priority still need to add parenthesis.\n **/\n if (\n !isCollectionPredicate &&\n ast.right.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.right as BinaryExpr)['operator']] <= currentPriority\n ) {\n result.right = true;\n }\n\n return result;\n }\n\n private isCollectionPredicateOperator(op: BinaryExpr['operator']) {\n return ['?', '!', '^'].includes(op);\n }\n}\n"],"mappings":"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"}