@zenstackhq/sdk 3.0.0-beta.15 → 3.0.0-beta.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/model-utils.ts","../src/prisma/prisma-schema-generator.ts","../src/prisma/indent-string.ts","../src/prisma/prisma-builder.ts","../src/ts-schema-generator.ts","../src/zmodel-code-generator.ts"],"sourcesContent":["import {\n isDataModel,\n isLiteralExpr,\n isModel,\n isTypeDef,\n type AstNode,\n type Attribute,\n type AttributeParam,\n type DataField,\n type DataFieldAttribute,\n type DataModel,\n type DataModelAttribute,\n type Enum,\n type EnumField,\n type FunctionDecl,\n type Model,\n type Reference,\n type TypeDef,\n} from '@zenstackhq/language/ast';\n\nimport { getAllFields, getModelIdFields, getModelUniqueFields, type AttributeTarget } from '@zenstackhq/language/utils';\n\nexport function isIdField(field: DataField, contextModel: DataModel) {\n // field-level @id attribute\n if (hasAttribute(field, '@id')) {\n return true;\n }\n\n // NOTE: we have to use name to match fields because the fields\n // may be inherited from an abstract base and have cloned identities\n\n // model-level @@id attribute with a list of fields\n const modelLevelIds = getModelIdFields(contextModel);\n if (modelLevelIds.map((f) => f.name).includes(field.name)) {\n return true;\n }\n\n const allFields = getAllFields(contextModel);\n if (allFields.some((f) => hasAttribute(f, '@id')) || modelLevelIds.length > 0) {\n // the model already has id field, don't check @unique and @@unique\n return false;\n }\n\n // then, the first field with @unique can be used as id\n const firstUniqueField = allFields.find((f) => hasAttribute(f, '@unique'));\n if (firstUniqueField) {\n return firstUniqueField.name === field.name;\n }\n\n // last, the first model level @@unique can be used as id\n const modelLevelUnique = getModelUniqueFields(contextModel);\n if (modelLevelUnique.map((f) => f.name).includes(field.name)) {\n return true;\n }\n\n return false;\n}\n\nexport function hasAttribute(\n decl: DataModel | TypeDef | DataField | Enum | EnumField | FunctionDecl | Attribute | AttributeParam,\n name: string,\n) {\n return !!getAttribute(decl, name);\n}\n\nexport function getAttribute(decl: AttributeTarget, name: string) {\n return (decl.attributes as (DataModelAttribute | DataFieldAttribute)[]).find((attr) => attr.decl.$refText === name);\n}\n\nexport function isDelegateModel(node: AstNode) {\n return isDataModel(node) && hasAttribute(node, '@@delegate');\n}\n\nexport function isUniqueField(field: DataField) {\n if (hasAttribute(field, '@unique')) {\n return true;\n }\n const modelIds = getAttribute(field.$container, '@@unique');\n if (modelIds && modelIds.args.some((arg) => isLiteralExpr(arg.value) && arg.value.value === field.name)) {\n return true;\n }\n return false;\n}\n\nexport function isFromStdlib(node: AstNode) {\n const model = getContainingModel(node);\n return !!model && !!model.$document && model.$document.uri.path.endsWith('stdlib.zmodel');\n}\n\nexport function getContainingModel(node: AstNode | undefined): Model | null {\n if (!node) {\n return null;\n }\n return isModel(node) ? node : getContainingModel(node.$container);\n}\n\nexport function resolved<T extends AstNode>(ref: Reference<T>): T {\n if (!ref.ref) {\n throw new Error(`Reference not resolved: ${ref.$refText}`);\n }\n return ref.ref;\n}\n\nexport function getAuthDecl(model: Model) {\n let found = model.declarations.find(\n (d) => (isDataModel(d) || isTypeDef(d)) && d.attributes.some((attr) => attr.decl.$refText === '@@auth'),\n );\n if (!found) {\n found = model.declarations.find((d) => isDataModel(d) && d.name === 'User');\n }\n return found;\n}\n\nexport function getIdFields(dm: DataModel) {\n return getAllFields(dm)\n .filter((f) => isIdField(f, dm))\n .map((f) => f.name);\n}\n\n/**\n * Prefix for auxiliary relation fields generated for delegated models\n */\nexport const DELEGATE_AUX_RELATION_PREFIX = 'delegate_aux';\n","import { lowerCaseFirst } from '@zenstackhq/common-helpers';\nimport {\n AttributeArg,\n BooleanLiteral,\n ConfigArrayExpr,\n ConfigExpr,\n ConfigInvocationArg,\n DataField,\n DataFieldAttribute,\n DataFieldType,\n DataModel,\n DataModelAttribute,\n DataSource,\n Enum,\n EnumField,\n Expression,\n GeneratorDecl,\n InvocationExpr,\n isArrayExpr,\n isDataModel,\n isInvocationExpr,\n isLiteralExpr,\n isNullExpr,\n isReferenceExpr,\n isStringLiteral,\n isTypeDef,\n LiteralExpr,\n Model,\n NumberLiteral,\n StringLiteral,\n type AstNode,\n} from '@zenstackhq/language/ast';\nimport { getAllAttributes, getAllFields, isAuthInvocation, isDelegateModel } from '@zenstackhq/language/utils';\nimport { AstUtils } from 'langium';\nimport { match } from 'ts-pattern';\nimport { ModelUtils, ZModelCodeGenerator } from '..';\nimport { DELEGATE_AUX_RELATION_PREFIX, getIdFields } from '../model-utils';\nimport {\n AttributeArgValue,\n ModelFieldType,\n AttributeArg as PrismaAttributeArg,\n AttributeArgValue as PrismaAttributeArgValue,\n ContainerDeclaration as PrismaContainerDeclaration,\n Model as PrismaDataModel,\n Enum as PrismaEnum,\n FieldAttribute as PrismaFieldAttribute,\n FieldReference as PrismaFieldReference,\n FieldReferenceArg as PrismaFieldReferenceArg,\n FunctionCall as PrismaFunctionCall,\n FunctionCallArg as PrismaFunctionCallArg,\n PrismaModel,\n ContainerAttribute as PrismaModelAttribute,\n type SimpleField,\n} from './prisma-builder';\n\n// Some database providers like postgres and mysql have default limit to the length of identifiers\n// Here we use a conservative value that should work for most cases, and truncate names if needed\nconst IDENTIFIER_NAME_MAX_LENGTH = 50 - DELEGATE_AUX_RELATION_PREFIX.length;\n\n/**\n * Generates Prisma schema file\n */\nexport class PrismaSchemaGenerator {\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 // a mapping from full names to shortened names\n private shortNameMap = new Map<string, string>();\n\n constructor(private readonly zmodel: Model) {}\n\n async generate() {\n const prisma = new PrismaModel();\n\n for (const decl of this.zmodel.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 return this.PRELUDE + prisma.toString();\n }\n\n private generateDataSource(prisma: PrismaModel, dataSource: DataSource) {\n const fields: SimpleField[] = dataSource.fields.map((f) => ({\n name: f.name,\n text: this.configExprToText(f.value),\n }));\n prisma.addDataSource(dataSource.name, fields);\n }\n\n private configExprToText(expr: ConfigExpr) {\n if (isLiteralExpr(expr)) {\n return this.literalToText(expr);\n } else if (isInvocationExpr(expr)) {\n const fc = this.makeFunctionCall(expr);\n return fc.toString();\n } else {\n return this.configArrayToText(expr);\n }\n }\n\n private configArrayToText(expr: ConfigArrayExpr) {\n return (\n '[' +\n expr.items\n .map((item) => {\n if (isLiteralExpr(item)) {\n return this.literalToText(item);\n } else {\n return (\n item.name +\n (item.args.length > 0\n ? '(' + item.args.map((arg) => this.configInvocationArgToText(arg)).join(', ') + ')'\n : '')\n );\n }\n })\n .join(', ') +\n ']'\n );\n }\n\n private configInvocationArgToText(arg: ConfigInvocationArg) {\n return `${arg.name}: ${this.literalToText(arg.value)}`;\n }\n\n private literalToText(expr: LiteralExpr) {\n return JSON.stringify(expr.value);\n }\n\n private generateGenerator(prisma: PrismaModel, decl: GeneratorDecl) {\n prisma.addGenerator(\n decl.name,\n decl.fields.map((f) => ({\n name: f.name,\n text: this.configExprToText(f.value),\n })),\n );\n }\n\n private generateModel(prisma: PrismaModel, decl: DataModel) {\n const model = decl.isView ? prisma.addView(decl.name) : prisma.addModel(decl.name);\n const allFields = getAllFields(decl, true);\n for (const field of allFields) {\n if (ModelUtils.hasAttribute(field, '@computed')) {\n continue; // skip computed fields\n }\n // exclude non-id fields inherited from delegate\n if (ModelUtils.isIdField(field, decl) || !this.isInheritedFromDelegate(field, decl)) {\n this.generateModelField(model, field, decl);\n }\n }\n\n const allAttributes = getAllAttributes(decl);\n for (const attr of allAttributes.filter(\n (attr) => this.isPrismaAttribute(attr) && !this.isInheritedMapAttribute(attr, decl),\n )) {\n this.generateContainerAttribute(model, attr);\n }\n\n // user defined comments pass-through\n decl.comments.forEach((c) => model.addComment(c));\n\n // generate relation fields on base models linking to concrete models\n this.generateDelegateRelationForBase(model, decl);\n\n // generate reverse relation fields on concrete models\n this.generateDelegateRelationForConcrete(model, decl);\n }\n\n private isInheritedMapAttribute(attr: DataModelAttribute, contextModel: DataModel) {\n if (attr.$container === contextModel) {\n return false;\n }\n\n const attrName = attr.decl.ref?.name ?? attr.decl.$refText;\n return attrName === '@@map';\n }\n\n private isPrismaAttribute(attr: DataModelAttribute | DataFieldAttribute) {\n if (!attr.decl.ref) {\n return false;\n }\n return attr.decl.ref.attributes.some((a) => a.decl.ref?.name === '@@@prisma');\n }\n\n private getUnsupportedFieldType(fieldType: DataFieldType) {\n if (fieldType.unsupported) {\n const value = this.getStringLiteral(fieldType.unsupported.value);\n if (value) {\n return `Unsupported(\"${value}\")`;\n } else {\n return undefined;\n }\n } else {\n return undefined;\n }\n }\n\n private getStringLiteral(node: AstNode | undefined): string | undefined {\n return isStringLiteral(node) ? node.value : undefined;\n }\n\n private generateModelField(model: PrismaDataModel, field: DataField, contextModel: DataModel, addToFront = false) {\n let fieldType: string | undefined;\n\n if (field.type.type) {\n // intrinsic type\n fieldType = field.type.type;\n } else if (field.type.reference?.ref) {\n // model, enum, or type-def\n if (isTypeDef(field.type.reference.ref)) {\n fieldType = 'Json';\n } else {\n fieldType = field.type.reference.ref.name;\n }\n } else {\n // Unsupported type\n const unsupported = this.getUnsupportedFieldType(field.type);\n if (unsupported) {\n fieldType = unsupported;\n }\n }\n\n if (!fieldType) {\n throw new Error(`Field type is not resolved: ${field.$container.name}.${field.name}`);\n }\n\n const isArray =\n // typed-JSON fields should be translated to scalar Json type\n isTypeDef(field.type.reference?.ref) ? false : field.type.array;\n const type = new ModelFieldType(fieldType, isArray, field.type.optional);\n\n const attributes = field.attributes\n .filter((attr) => this.isPrismaAttribute(attr))\n // `@default` using `auth()` is handled outside Prisma\n .filter((attr) => !this.isDefaultWithAuthInvocation(attr))\n .filter(\n (attr) =>\n // when building physical schema, exclude `@default` for id fields inherited from delegate base\n !(\n ModelUtils.isIdField(field, contextModel) &&\n this.isInheritedFromDelegate(field, contextModel) &&\n attr.decl.$refText === '@default'\n ),\n )\n .map((attr) => this.makeFieldAttribute(attr));\n\n const docs = [...field.comments];\n const result = model.addField(field.name, type, attributes, docs, addToFront);\n return result;\n }\n\n private isDefaultWithAuthInvocation(attr: DataFieldAttribute) {\n if (attr.decl.ref?.name !== '@default') {\n return false;\n }\n\n const expr = attr.args[0]?.value;\n if (!expr) {\n return false;\n }\n\n return AstUtils.streamAst(expr).some(isAuthInvocation);\n }\n\n private isInheritedFromDelegate(field: DataField, contextModel: DataModel) {\n return field.$container !== contextModel && ModelUtils.isDelegateModel(field.$container);\n }\n\n private makeFieldAttribute(attr: DataFieldAttribute) {\n const attrName = attr.decl.ref!.name;\n return new PrismaFieldAttribute(\n attrName,\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 const argType = match(node.$type)\n .with(StringLiteral, () => 'String' as const)\n .with(NumberLiteral, () => 'Number' as const)\n .with(BooleanLiteral, () => 'Boolean' as const)\n .exhaustive();\n return new PrismaAttributeArgValue(argType, node.value);\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 node.target.ref!.name,\n node.args.map((arg) => new PrismaFieldReferenceArg(arg.name, this.exprToText(arg.value))),\n ),\n );\n } else if (isInvocationExpr(node)) {\n // invocation\n return new PrismaAttributeArgValue('FunctionCall', this.makeFunctionCall(node));\n } else {\n throw Error(`Unsupported attribute argument expression type: ${node.$type}`);\n }\n }\n\n private exprToText(expr: Expression) {\n return new ZModelCodeGenerator({ quote: 'double' }).generate(expr);\n }\n\n makeFunctionCall(node: InvocationExpr): PrismaFunctionCall {\n return new PrismaFunctionCall(\n node.function.ref!.name,\n node.args.map((arg) => {\n const val = match(arg.value)\n .when(isStringLiteral, (v) => `\"${v.value}\"`)\n .when(isLiteralExpr, (v) => v.value.toString())\n .when(isNullExpr, () => 'null')\n .otherwise(() => {\n throw new Error('Function call argument must be literal or null');\n });\n\n return new PrismaFunctionCallArg(val);\n }),\n );\n }\n\n private generateContainerAttribute(container: PrismaContainerDeclaration, attr: DataModelAttribute) {\n const attrName = attr.decl.ref!.name;\n container.attributes.push(\n new PrismaModelAttribute(\n attrName,\n attr.args.map((arg) => this.makeAttributeArg(arg)),\n ),\n );\n }\n\n private generateEnum(prisma: PrismaModel, decl: Enum) {\n const _enum = prisma.addEnum(decl.name);\n\n for (const field of decl.fields) {\n this.generateEnumField(_enum, field);\n }\n\n for (const attr of decl.attributes.filter((attr) => this.isPrismaAttribute(attr))) {\n this.generateContainerAttribute(_enum, attr);\n }\n\n // user defined comments pass-through\n decl.comments.forEach((c) => _enum.addComment(c));\n }\n\n private generateEnumField(_enum: PrismaEnum, field: EnumField) {\n const attributes = field.attributes\n .filter((attr) => this.isPrismaAttribute(attr))\n .map((attr) => this.makeFieldAttribute(attr));\n\n const docs = [...field.comments];\n _enum.addField(field.name, attributes, docs);\n }\n\n private generateDelegateRelationForBase(model: PrismaDataModel, decl: DataModel) {\n if (!isDelegateModel(decl)) {\n return;\n }\n\n // collect concrete models inheriting this model\n const concreteModels = this.getConcreteModels(decl);\n\n // generate an optional relation field in delegate base model to each concrete model\n concreteModels.forEach((concrete) => {\n const auxName = this.truncate(`${DELEGATE_AUX_RELATION_PREFIX}_${lowerCaseFirst(concrete.name)}`);\n model.addField(auxName, new ModelFieldType(concrete.name, false, true));\n });\n }\n\n private generateDelegateRelationForConcrete(model: PrismaDataModel, concreteDecl: DataModel) {\n // generate a relation field for each delegated base model\n const base = concreteDecl.baseModel?.ref;\n if (!base) {\n return;\n }\n\n const idFields = getIdFields(base);\n\n // add relation fields\n const relationField = this.truncate(`${DELEGATE_AUX_RELATION_PREFIX}_${lowerCaseFirst(base.name)}`);\n model.addField(relationField, base.name, [\n new PrismaFieldAttribute('@relation', [\n new PrismaAttributeArg(\n 'fields',\n new AttributeArgValue(\n 'Array',\n idFields.map(\n (idField) => new AttributeArgValue('FieldReference', new PrismaFieldReference(idField)),\n ),\n ),\n ),\n new PrismaAttributeArg(\n 'references',\n new AttributeArgValue(\n 'Array',\n idFields.map(\n (idField) => new AttributeArgValue('FieldReference', new PrismaFieldReference(idField)),\n ),\n ),\n ),\n new PrismaAttributeArg(\n 'onDelete',\n new AttributeArgValue('FieldReference', new PrismaFieldReference('Cascade')),\n ),\n new PrismaAttributeArg(\n 'onUpdate',\n new AttributeArgValue('FieldReference', new PrismaFieldReference('Cascade')),\n ),\n ]),\n ]);\n }\n\n private getConcreteModels(dataModel: DataModel): DataModel[] {\n if (!isDelegateModel(dataModel)) {\n return [];\n }\n return dataModel.$container.declarations.filter(\n (d): d is DataModel => isDataModel(d) && d !== dataModel && d.baseModel?.ref === dataModel,\n );\n }\n\n private truncate(name: string) {\n if (name.length <= IDENTIFIER_NAME_MAX_LENGTH) {\n return name;\n }\n\n const existing = this.shortNameMap.get(name);\n if (existing) {\n return existing;\n }\n\n const baseName = name.slice(0, IDENTIFIER_NAME_MAX_LENGTH);\n let index = 0;\n let shortName = `${baseName}_${index}`;\n\n while (true) {\n const conflict = Array.from(this.shortNameMap.values()).find((v) => v === shortName);\n if (!conflict) {\n this.shortNameMap.set(name, shortName);\n break;\n }\n\n // try next index\n index++;\n shortName = `${baseName}_${index}`;\n }\n\n return shortName;\n }\n}\n","// https://github.com/sindresorhus/indent-string\n\n/**\n * Utility for indenting strings\n */\nexport default function indentString(string: string, count = 4): string {\n const indent = ' ';\n return string.replace(/^(?!\\s*$)/gm, indent.repeat(count));\n}\n","import indentString from './indent-string';\n\n/**\n * Field used by datasource and generator declarations.\n */\nexport type SimpleField = { name: string; text: 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, fields: SimpleField[] = []): DataSource {\n const ds = new DataSource(name, fields);\n this.datasources.push(ds);\n return ds;\n }\n\n addGenerator(name: string, fields: SimpleField[]): 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, false);\n this.models.push(model);\n return model;\n }\n\n addView(name: string): Model {\n const model = new Model(name, true);\n this.models.push(model);\n return model;\n }\n\n addEnum(name: string): Enum {\n const e = new Enum(name);\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 fields: SimpleField[] = [],\n ) {}\n\n toString(): string {\n return (\n `datasource ${this.name} {\\n` +\n this.fields.map((f) => indentString(`${f.name} = ${f.text}`)).join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class Generator {\n constructor(\n public name: string,\n public fields: SimpleField[],\n ) {}\n\n toString(): string {\n return (\n `generator ${this.name} {\\n` +\n this.fields.map((f) => indentString(`${f.name} = ${f.text}`)).join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class DeclarationBase {\n constructor(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}\n\nexport class ContainerDeclaration extends DeclarationBase {\n constructor(\n documentations: string[] = [],\n public attributes: (ContainerAttribute | PassThroughAttribute)[] = [],\n ) {\n super(documentations);\n }\n}\n\nexport class FieldDeclaration extends DeclarationBase {\n constructor(\n documentations: string[] = [],\n public attributes: (FieldAttribute | PassThroughAttribute)[] = [],\n ) {\n super(documentations);\n }\n}\n\nexport class Model extends ContainerDeclaration {\n public fields: ModelField[] = [];\n constructor(\n public name: string,\n public isView: boolean,\n documentations: string[] = [],\n ) {\n super(documentations);\n }\n\n addField(\n name: string,\n type: ModelFieldType | string,\n attributes: (FieldAttribute | PassThroughAttribute)[] = [],\n documentations: string[] = [],\n addToFront = false,\n ): ModelField {\n const field = new ModelField(name, type, attributes, documentations);\n if (addToFront) {\n this.fields.unshift(field);\n } else {\n this.fields.push(field);\n }\n return field;\n }\n\n addAttribute(name: string, args: AttributeArg[] = []) {\n const attr = new ContainerAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n override toString(): string {\n const result: any[] = [...this.fields];\n\n if (this.attributes.length > 0) {\n // Add a blank line before the attributes\n result.push('');\n }\n\n result.push(...this.attributes);\n\n return (\n super.toString() +\n `${this.isView ? 'view' : 'model'} ${this.name} {\\n` +\n indentString(result.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(\n public type: ScalarTypes | string,\n public array?: boolean,\n public optional?: boolean,\n ) {}\n\n toString(): string {\n return `${this.type}${this.array ? '[]' : ''}${this.optional ? '?' : ''}`;\n }\n}\n\nexport class ModelField extends FieldDeclaration {\n constructor(\n public name: string,\n public type: ModelFieldType | string,\n attributes: (FieldAttribute | PassThroughAttribute)[] = [],\n documentations: string[] = [],\n ) {\n super(documentations, attributes);\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 override 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(\n public name: string,\n public args: AttributeArg[] = [],\n ) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class ContainerAttribute {\n constructor(\n public name: string,\n public args: AttributeArg[] = [],\n ) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\n/**\n * Represents @@prisma.passthrough and @prisma.passthrough\n */\nexport class PassThroughAttribute {\n constructor(public text: string) {}\n\n toString(): string {\n return this.text;\n }\n}\n\nexport class AttributeArg {\n constructor(\n public name: string | undefined,\n public value: AttributeArgValue,\n ) {}\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' && typeof value !== 'string')\n throw new Error('Value must be number or string');\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 // use JSON.stringify to escape quotes\n return JSON.stringify(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(\n public field: string,\n public args: FieldReferenceArg[] = [],\n ) {}\n}\n\nexport class FieldReferenceArg {\n constructor(\n public name: string,\n public value: string,\n ) {}\n\n toString(): string {\n return `${this.name}: ${this.value}`;\n }\n}\n\nexport class FunctionCall {\n constructor(\n public func: string,\n public args: FunctionCallArg[] = [],\n ) {}\n\n toString(): string {\n return `${this.func}` + '(' + this.args.map((a) => a.toString()).join(', ') + ')';\n }\n}\n\nexport class FunctionCallArg {\n constructor(public value: string) {}\n\n toString(): string {\n return this.value;\n }\n}\n\nexport class Enum extends ContainerDeclaration {\n public fields: EnumField[] = [];\n\n constructor(\n public name: string,\n documentations: string[] = [],\n ) {\n super(documentations);\n }\n addField(\n name: string,\n attributes: (FieldAttribute | PassThroughAttribute)[] = [],\n documentations: string[] = [],\n ): EnumField {\n const field = new EnumField(name, attributes, documentations);\n this.fields.push(field);\n return field;\n }\n\n addAttribute(name: string, args: AttributeArg[] = []) {\n const attr = new ContainerAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n override addComment(name: string): string {\n this.documentations.push(name);\n return name;\n }\n\n override toString(): string {\n return (\n super.toString() +\n `enum ${this.name} {\\n` +\n indentString([...this.fields, ...this.attributes].map((d) => d.toString()).join('\\n')) +\n '\\n}'\n );\n }\n}\n\nexport class EnumField extends DeclarationBase {\n constructor(\n public name: string,\n public attributes: (FieldAttribute | PassThroughAttribute)[] = [],\n documentations: string[] = [],\n ) {\n super(documentations);\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 override toString(): string {\n return (\n super.toString() +\n this.name +\n (this.attributes.length > 0 ? ' ' + this.attributes.map((a) => a.toString()).join(' ') : '')\n );\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n ArrayExpr,\n AttributeArg,\n BinaryExpr,\n DataField,\n DataFieldAttribute,\n DataFieldType,\n DataModel,\n DataModelAttribute,\n Enum,\n Expression,\n InvocationExpr,\n isArrayExpr,\n isBinaryExpr,\n isDataField,\n isDataModel,\n isDataSource,\n isEnum,\n isEnumField,\n isInvocationExpr,\n isLiteralExpr,\n isMemberAccessExpr,\n isNullExpr,\n isProcedure,\n isReferenceExpr,\n isThisExpr,\n isTypeDef,\n isUnaryExpr,\n LiteralExpr,\n MemberAccessExpr,\n Procedure,\n ReferenceExpr,\n TypeDef,\n UnaryExpr,\n type Model,\n} from '@zenstackhq/language/ast';\nimport { getAllAttributes, getAllFields, isDataFieldReference } from '@zenstackhq/language/utils';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { match } from 'ts-pattern';\nimport * as ts from 'typescript';\nimport { ModelUtils } from '.';\nimport {\n getAttribute,\n getAuthDecl,\n getIdFields,\n hasAttribute,\n isDelegateModel,\n isIdField,\n isUniqueField,\n} from './model-utils';\n\nexport class TsSchemaGenerator {\n private usedExpressionUtils = false;\n\n async generate(model: Model, outputDir: string) {\n fs.mkdirSync(outputDir, { recursive: true });\n\n // Reset the flag for each generation\n this.usedExpressionUtils = false;\n\n // the schema itself\n this.generateSchema(model, outputDir);\n\n // the model types\n this.generateModelsAndTypeDefs(model, outputDir);\n\n // the input types\n this.generateInputTypes(model, outputDir);\n }\n\n private generateSchema(model: Model, outputDir: string) {\n const statements: ts.Statement[] = [];\n this.generateSchemaStatements(model, statements);\n this.generateBannerComments(statements);\n\n const schemaOutputFile = path.join(outputDir, 'schema.ts');\n const sourceFile = ts.createSourceFile(schemaOutputFile, '', ts.ScriptTarget.ESNext, false, ts.ScriptKind.TS);\n const printer = ts.createPrinter();\n const result = printer.printList(ts.ListFormat.MultiLine, ts.factory.createNodeArray(statements), sourceFile);\n fs.writeFileSync(schemaOutputFile, result);\n }\n\n private generateSchemaStatements(model: Model, statements: ts.Statement[]) {\n const hasComputedFields = model.declarations.some(\n (d) => isDataModel(d) && d.fields.some((f) => hasAttribute(f, '@computed')),\n );\n\n // Generate schema content first to determine if ExpressionUtils is needed\n const schemaObject = this.createSchemaObject(model);\n\n // Now generate the import declaration with the correct imports\n const runtimeImportDecl = ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n false,\n undefined,\n ts.factory.createNamedImports([\n ts.factory.createImportSpecifier(true, undefined, ts.factory.createIdentifier('SchemaDef')),\n ...(hasComputedFields\n ? [\n ts.factory.createImportSpecifier(\n true,\n undefined,\n ts.factory.createIdentifier('OperandExpression'),\n ),\n ]\n : []),\n ...(this.usedExpressionUtils\n ? [\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier('ExpressionUtils'),\n ),\n ]\n : []),\n ]),\n ),\n ts.factory.createStringLiteral('@zenstackhq/orm/schema'),\n );\n statements.push(runtimeImportDecl);\n\n const declaration = ts.factory.createVariableStatement(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n ts.factory.createVariableDeclarationList(\n [\n ts.factory.createVariableDeclaration(\n 'schema',\n undefined,\n undefined,\n ts.factory.createSatisfiesExpression(\n ts.factory.createAsExpression(schemaObject, ts.factory.createTypeReferenceNode('const')),\n ts.factory.createTypeReferenceNode('SchemaDef'),\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n );\n statements.push(declaration);\n\n // create statement \"export type SchemaType = typeof schema;\"\n const typeDeclaration = ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n 'SchemaType',\n undefined,\n ts.factory.createTypeReferenceNode('typeof schema'),\n );\n statements.push(typeDeclaration);\n }\n\n private createExpressionUtilsCall(method: string, args?: ts.Expression[]): ts.CallExpression {\n this.usedExpressionUtils = true;\n return ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('ExpressionUtils'), method),\n undefined,\n args || [],\n );\n }\n\n private createSchemaObject(model: Model) {\n const properties: ts.PropertyAssignment[] = [\n // provider\n ts.factory.createPropertyAssignment('provider', this.createProviderObject(model)),\n\n // models\n ts.factory.createPropertyAssignment('models', this.createModelsObject(model)),\n\n // typeDefs\n ...(model.declarations.some(isTypeDef)\n ? [ts.factory.createPropertyAssignment('typeDefs', this.createTypeDefsObject(model))]\n : []),\n ];\n\n // enums\n const enums = model.declarations.filter(isEnum);\n if (enums.length > 0) {\n properties.push(\n ts.factory.createPropertyAssignment(\n 'enums',\n ts.factory.createObjectLiteralExpression(\n enums.map((e) => ts.factory.createPropertyAssignment(e.name, this.createEnumObject(e))),\n true,\n ),\n ),\n );\n }\n\n // authType\n const authType = getAuthDecl(model);\n if (authType) {\n properties.push(ts.factory.createPropertyAssignment('authType', this.createLiteralNode(authType.name)));\n }\n\n // procedures\n const procedures = model.declarations.filter(isProcedure);\n if (procedures.length > 0) {\n properties.push(ts.factory.createPropertyAssignment('procedures', this.createProceduresObject(procedures)));\n }\n\n // plugins\n properties.push(\n ts.factory.createPropertyAssignment('plugins', ts.factory.createObjectLiteralExpression([], true)),\n );\n\n return ts.factory.createObjectLiteralExpression(properties, true);\n }\n\n private createProviderObject(model: Model): ts.Expression {\n const dsProvider = this.getDataSourceProvider(model);\n return ts.factory.createObjectLiteralExpression(\n [ts.factory.createPropertyAssignment('type', ts.factory.createStringLiteral(dsProvider.type))],\n true,\n );\n }\n\n private createModelsObject(model: Model) {\n return ts.factory.createObjectLiteralExpression(\n model.declarations\n .filter((d): d is DataModel => isDataModel(d) && !hasAttribute(d, '@@ignore'))\n .map((dm) => ts.factory.createPropertyAssignment(dm.name, this.createDataModelObject(dm))),\n true,\n );\n }\n\n private createTypeDefsObject(model: Model): ts.Expression {\n return ts.factory.createObjectLiteralExpression(\n model.declarations\n .filter((d): d is TypeDef => isTypeDef(d))\n .map((td) => ts.factory.createPropertyAssignment(td.name, this.createTypeDefObject(td))),\n true,\n );\n }\n\n private createDataModelObject(dm: DataModel) {\n const allFields = getAllFields(dm);\n const allAttributes = getAllAttributes(dm).filter((attr) => {\n // exclude `@@delegate` attribute from base model\n if (attr.decl.$refText === '@@delegate' && attr.$container !== dm) {\n return false;\n }\n return true;\n });\n const subModels = this.getSubModels(dm);\n\n const fields: ts.PropertyAssignment[] = [\n // name\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(dm.name)),\n\n // baseModel\n ...(dm.baseModel\n ? [\n ts.factory.createPropertyAssignment(\n 'baseModel',\n ts.factory.createStringLiteral(dm.baseModel.$refText),\n ),\n ]\n : []),\n\n // fields\n ts.factory.createPropertyAssignment(\n 'fields',\n ts.factory.createObjectLiteralExpression(\n allFields.map((field) =>\n ts.factory.createPropertyAssignment(field.name, this.createDataFieldObject(field, dm)),\n ),\n true,\n ),\n ),\n\n // attributes\n ...(allAttributes.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'attributes',\n ts.factory.createArrayLiteralExpression(\n allAttributes.map((attr) => this.createAttributeObject(attr)),\n true,\n ),\n ),\n ]\n : []),\n\n // idFields\n ts.factory.createPropertyAssignment(\n 'idFields',\n ts.factory.createArrayLiteralExpression(\n getIdFields(dm).map((idField) => ts.factory.createStringLiteral(idField)),\n ),\n ),\n\n // uniqueFields\n ts.factory.createPropertyAssignment('uniqueFields', this.createUniqueFieldsObject(dm)),\n\n // isDelegate\n ...(isDelegateModel(dm)\n ? [ts.factory.createPropertyAssignment('isDelegate', ts.factory.createTrue())]\n : []),\n\n // subModels\n ...(subModels.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'subModels',\n ts.factory.createArrayLiteralExpression(\n subModels.map((subModel) => ts.factory.createStringLiteral(subModel)),\n ),\n ),\n ]\n : []),\n\n ...(dm.isView ? [ts.factory.createPropertyAssignment('isView', ts.factory.createTrue())] : []),\n ];\n\n const computedFields = dm.fields.filter((f) => hasAttribute(f, '@computed'));\n\n if (computedFields.length > 0) {\n fields.push(\n ts.factory.createPropertyAssignment('computedFields', this.createComputedFieldsObject(computedFields)),\n );\n }\n\n return ts.factory.createObjectLiteralExpression(fields, true);\n }\n\n private getSubModels(dm: DataModel) {\n return dm.$container.declarations\n .filter(isDataModel)\n .filter((d) => d.baseModel?.ref === dm)\n .map((d) => d.name);\n }\n\n private createTypeDefObject(td: TypeDef): ts.Expression {\n const allFields = getAllFields(td);\n const allAttributes = getAllAttributes(td);\n\n const fields: ts.PropertyAssignment[] = [\n // name\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(td.name)),\n\n // fields\n ts.factory.createPropertyAssignment(\n 'fields',\n ts.factory.createObjectLiteralExpression(\n allFields.map((field) =>\n ts.factory.createPropertyAssignment(field.name, this.createDataFieldObject(field, undefined)),\n ),\n true,\n ),\n ),\n\n // attributes\n ...(allAttributes.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'attributes',\n ts.factory.createArrayLiteralExpression(\n allAttributes.map((attr) => this.createAttributeObject(attr)),\n true,\n ),\n ),\n ]\n : []),\n ];\n\n return ts.factory.createObjectLiteralExpression(fields, true);\n }\n\n private createComputedFieldsObject(fields: DataField[]) {\n return ts.factory.createObjectLiteralExpression(\n fields.map((field) =>\n ts.factory.createMethodDeclaration(\n undefined,\n undefined,\n field.name,\n undefined,\n undefined,\n [\n // parameter: `context: { modelAlias: string }`\n ts.factory.createParameterDeclaration(\n undefined,\n undefined,\n '_context',\n undefined,\n ts.factory.createTypeLiteralNode([\n ts.factory.createPropertySignature(\n undefined,\n 'modelAlias',\n undefined,\n ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n ),\n ]),\n undefined,\n ),\n ],\n ts.factory.createTypeReferenceNode('OperandExpression', [\n ts.factory.createTypeReferenceNode(this.mapFieldTypeToTSType(field.type)),\n ]),\n ts.factory.createBlock(\n [\n ts.factory.createThrowStatement(\n ts.factory.createNewExpression(ts.factory.createIdentifier('Error'), undefined, [\n ts.factory.createStringLiteral('This is a stub for computed field'),\n ]),\n ),\n ],\n true,\n ),\n ),\n ),\n true,\n );\n }\n\n private mapFieldTypeToTSType(type: DataFieldType) {\n let result = match(type.type)\n .with('String', () => 'string')\n .with('Boolean', () => 'boolean')\n .with('Int', () => 'number')\n .with('Float', () => 'number')\n .with('BigInt', () => 'bigint')\n .with('Decimal', () => 'number')\n .otherwise(() => 'unknown');\n if (type.array) {\n result = `${result}[]`;\n }\n if (type.optional) {\n result = `${result} | null`;\n }\n return result;\n }\n\n private createDataFieldObject(field: DataField, contextModel: DataModel | undefined) {\n const objectFields = [\n // name\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(field.name)),\n // type\n ts.factory.createPropertyAssignment('type', this.generateFieldTypeLiteral(field)),\n ];\n\n if (contextModel && ModelUtils.isIdField(field, contextModel)) {\n objectFields.push(ts.factory.createPropertyAssignment('id', ts.factory.createTrue()));\n }\n\n if (isUniqueField(field)) {\n objectFields.push(ts.factory.createPropertyAssignment('unique', ts.factory.createTrue()));\n }\n\n if (field.type.optional) {\n objectFields.push(ts.factory.createPropertyAssignment('optional', ts.factory.createTrue()));\n }\n\n if (field.type.array) {\n objectFields.push(ts.factory.createPropertyAssignment('array', ts.factory.createTrue()));\n }\n\n if (hasAttribute(field, '@updatedAt')) {\n objectFields.push(ts.factory.createPropertyAssignment('updatedAt', ts.factory.createTrue()));\n }\n\n // originModel\n if (\n contextModel &&\n // id fields are duplicated in inherited models\n !isIdField(field, contextModel) &&\n field.$container !== contextModel &&\n isDelegateModel(field.$container)\n ) {\n // field is inherited from delegate\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'originModel',\n ts.factory.createStringLiteral(field.$container.name),\n ),\n );\n }\n\n // discriminator\n if (this.isDiscriminatorField(field)) {\n objectFields.push(ts.factory.createPropertyAssignment('isDiscriminator', ts.factory.createTrue()));\n }\n\n // attributes\n if (field.attributes.length > 0) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'attributes',\n ts.factory.createArrayLiteralExpression(\n field.attributes.map((attr) => this.createAttributeObject(attr)),\n ),\n ),\n );\n }\n\n const defaultValue = this.getFieldMappedDefault(field);\n if (defaultValue !== undefined) {\n if (typeof defaultValue === 'object' && !Array.isArray(defaultValue)) {\n if ('call' in defaultValue) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n\n this.createExpressionUtilsCall('call', [\n ts.factory.createStringLiteral(defaultValue.call),\n ...(defaultValue.args.length > 0\n ? [\n ts.factory.createArrayLiteralExpression(\n defaultValue.args.map((arg) =>\n this.createExpressionUtilsCall('literal', [\n this.createLiteralNode(arg),\n ]),\n ),\n ),\n ]\n : []),\n ]),\n ),\n );\n } else if ('authMember' in defaultValue) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n this.createExpressionUtilsCall('member', [\n this.createExpressionUtilsCall('call', [ts.factory.createStringLiteral('auth')]),\n ts.factory.createArrayLiteralExpression(\n defaultValue.authMember.map((m) => ts.factory.createStringLiteral(m)),\n ),\n ]),\n ),\n );\n } else {\n throw new Error(`Unsupported default value type for field ${field.name}`);\n }\n } else {\n if (Array.isArray(defaultValue)) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n ts.factory.createArrayLiteralExpression(\n defaultValue.map((item) => this.createLiteralNode(item as any)),\n ),\n ),\n );\n } else {\n objectFields.push(\n ts.factory.createPropertyAssignment('default', this.createLiteralNode(defaultValue)),\n );\n }\n }\n }\n\n if (hasAttribute(field, '@computed')) {\n objectFields.push(ts.factory.createPropertyAssignment('computed', ts.factory.createTrue()));\n }\n\n if (isDataModel(field.type.reference?.ref)) {\n objectFields.push(ts.factory.createPropertyAssignment('relation', this.createRelationObject(field)));\n }\n\n const fkFor = this.getForeignKeyFor(field);\n if (fkFor && fkFor.length > 0) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'foreignKeyFor',\n ts.factory.createArrayLiteralExpression(\n fkFor.map((fk) => ts.factory.createStringLiteral(fk)),\n true,\n ),\n ),\n );\n }\n\n return ts.factory.createObjectLiteralExpression(objectFields, true);\n }\n\n private isDiscriminatorField(field: DataField) {\n const origin = field.$container;\n return getAttribute(origin, '@@delegate')?.args.some(\n (arg) =>\n arg.$resolvedParam.name === 'discriminator' &&\n isDataFieldReference(arg.value) &&\n arg.value.target.ref === field,\n );\n }\n\n private getDataSourceProvider(model: Model) {\n const dataSource = model.declarations.find(isDataSource);\n invariant(dataSource, 'No data source found in the model');\n\n const providerExpr = dataSource.fields.find((f) => f.name === 'provider')?.value;\n invariant(isLiteralExpr(providerExpr), 'Provider must be a literal');\n const type = providerExpr.value as string;\n return { type };\n }\n\n private getFieldMappedDefault(\n field: DataField,\n ): string | number | boolean | unknown[] | { call: string; args: any[] } | { authMember: string[] } | undefined {\n const defaultAttr = getAttribute(field, '@default');\n if (!defaultAttr) {\n return undefined;\n }\n const defaultValue = defaultAttr.args[0]?.value;\n invariant(defaultValue, 'Expected a default value');\n return this.getMappedValue(defaultValue, field.type);\n }\n\n private getMappedValue(\n expr: Expression,\n fieldType: DataFieldType,\n ): string | number | boolean | unknown[] | { call: string; args: any[] } | { authMember: string[] } | undefined {\n if (isLiteralExpr(expr)) {\n const lit = (expr as LiteralExpr).value;\n return fieldType.type === 'Boolean'\n ? (lit as boolean)\n : ['Int', 'Float', 'Decimal', 'BigInt'].includes(fieldType.type!)\n ? Number(lit)\n : lit;\n } else if (isArrayExpr(expr)) {\n return expr.items.map((item) => this.getMappedValue(item, fieldType));\n } else if (isReferenceExpr(expr) && isEnumField(expr.target.ref)) {\n return expr.target.ref.name;\n } else if (isInvocationExpr(expr)) {\n return {\n call: expr.function.$refText,\n args: expr.args.map((arg) => this.getLiteral(arg.value)),\n };\n } else if (this.isAuthMemberAccess(expr)) {\n return {\n authMember: this.getMemberAccessChain(expr),\n };\n } else {\n throw new Error(`Unsupported default value type for ${expr.$type}`);\n }\n }\n\n private getMemberAccessChain(expr: MemberAccessExpr): string[] {\n if (!isMemberAccessExpr(expr.operand)) {\n return [expr.member.$refText];\n } else {\n return [...this.getMemberAccessChain(expr.operand), expr.member.$refText];\n }\n }\n\n private isAuthMemberAccess(expr: Expression): expr is MemberAccessExpr {\n if (isMemberAccessExpr(expr)) {\n return this.isAuthInvocation(expr.operand) || this.isAuthMemberAccess(expr.operand);\n } else {\n return false;\n }\n }\n\n private isAuthInvocation(expr: Expression) {\n return (\n isInvocationExpr(expr) && expr.function.$refText === 'auth' && ModelUtils.isFromStdlib(expr.function.ref!)\n );\n }\n\n private createRelationObject(field: DataField) {\n const relationFields: ts.PropertyAssignment[] = [];\n\n const oppositeRelation = this.getOppositeRelationField(field);\n if (oppositeRelation) {\n relationFields.push(\n ts.factory.createPropertyAssignment('opposite', ts.factory.createStringLiteral(oppositeRelation.name)),\n );\n }\n\n const relationName = this.getRelationName(field);\n if (relationName) {\n relationFields.push(\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(relationName)),\n );\n }\n\n const relation = getAttribute(field, '@relation');\n if (relation) {\n for (const arg of relation.args) {\n const param = arg.$resolvedParam.name;\n if (param === 'fields' || param === 'references') {\n const fieldNames = this.getReferenceNames(arg.value);\n if (fieldNames) {\n relationFields.push(\n ts.factory.createPropertyAssignment(\n param,\n ts.factory.createArrayLiteralExpression(\n fieldNames.map((el) => ts.factory.createStringLiteral(el)),\n ),\n ),\n );\n }\n }\n\n if (param === 'onDelete' || param === 'onUpdate') {\n const action = (arg.value as ReferenceExpr).target.$refText;\n relationFields.push(\n ts.factory.createPropertyAssignment(param, ts.factory.createStringLiteral(action)),\n );\n }\n }\n }\n\n return ts.factory.createObjectLiteralExpression(relationFields);\n }\n\n private getReferenceNames(expr: Expression) {\n return isArrayExpr(expr) && expr.items.map((item) => (item as ReferenceExpr).target.$refText);\n }\n\n private getForeignKeyFor(field: DataField) {\n const result: string[] = [];\n for (const f of field.$container.fields) {\n const relation = getAttribute(f, '@relation');\n if (relation) {\n for (const arg of relation.args) {\n if (\n arg.name === 'fields' &&\n isArrayExpr(arg.value) &&\n arg.value.items.some((el) => isReferenceExpr(el) && el.target.ref === field)\n ) {\n result.push(f.name);\n }\n }\n }\n }\n return result;\n }\n\n private getOppositeRelationField(field: DataField) {\n if (!field.type.reference?.ref || !isDataModel(field.type.reference?.ref)) {\n return undefined;\n }\n\n const sourceModel = field.$container as DataModel;\n const targetModel = field.type.reference.ref as DataModel;\n const relationName = this.getRelationName(field);\n for (const otherField of targetModel.fields) {\n if (otherField === field) {\n // backlink field is never self\n continue;\n }\n if (otherField.type.reference?.ref === sourceModel) {\n if (relationName) {\n // if relation has a name, the opposite side must match\n const otherRelationName = this.getRelationName(otherField);\n if (otherRelationName === relationName) {\n return otherField;\n }\n } else {\n return otherField;\n }\n }\n }\n return undefined;\n }\n\n private getRelationName(field: DataField) {\n const relation = getAttribute(field, '@relation');\n if (relation) {\n const nameArg = relation.args.find((arg) => arg.$resolvedParam.name === 'name');\n if (nameArg) {\n invariant(isLiteralExpr(nameArg.value), 'name must be a literal');\n return nameArg.value.value as string;\n }\n }\n return undefined;\n }\n\n private createUniqueFieldsObject(dm: DataModel) {\n const properties: ts.PropertyAssignment[] = [];\n\n // field-level id and unique\n const allFields = getAllFields(dm);\n for (const field of allFields) {\n if (hasAttribute(field, '@id') || hasAttribute(field, '@unique')) {\n properties.push(\n ts.factory.createPropertyAssignment(\n field.name,\n ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment('type', this.generateFieldTypeLiteral(field)),\n ]),\n ),\n );\n }\n }\n\n // model-level id and unique\n const allAttributes = getAllAttributes(dm);\n\n // it's possible to have the same set of fields in both `@@id` and `@@unique`\n // so we need to deduplicate them\n const seenKeys = new Set<string>();\n for (const attr of allAttributes) {\n if (attr.decl.$refText === '@@id' || attr.decl.$refText === '@@unique') {\n const fieldNames = this.getReferenceNames(attr.args[0]!.value);\n if (!fieldNames) {\n continue;\n }\n\n if (fieldNames.length === 1) {\n // single-field unique\n const fieldDef = allFields.find((f) => f.name === fieldNames[0])!;\n properties.push(\n ts.factory.createPropertyAssignment(\n fieldNames[0]!,\n ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment('type', this.generateFieldTypeLiteral(fieldDef)),\n ]),\n ),\n );\n } else {\n // multi-field unique\n const key = this.getCompoundUniqueKey(attr, fieldNames);\n if (seenKeys.has(key)) {\n continue;\n }\n seenKeys.add(key);\n properties.push(\n ts.factory.createPropertyAssignment(\n key,\n ts.factory.createObjectLiteralExpression(\n fieldNames.map((field) => {\n const fieldDef = allFields.find((f) => f.name === field)!;\n return ts.factory.createPropertyAssignment(\n field,\n ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment(\n 'type',\n this.generateFieldTypeLiteral(fieldDef),\n ),\n ]),\n );\n }),\n ),\n ),\n );\n }\n }\n }\n\n return ts.factory.createObjectLiteralExpression(properties, true);\n }\n\n private getCompoundUniqueKey(attr: DataModelAttribute, fieldNames: string[]) {\n const nameArg = attr.args.find((arg) => arg.$resolvedParam.name === 'name');\n if (nameArg && isLiteralExpr(nameArg.value)) {\n return nameArg.value.value as string;\n } else {\n return fieldNames.join('_');\n }\n }\n\n private generateFieldTypeLiteral(field: DataField): ts.Expression {\n invariant(\n field.type.type || field.type.reference || field.type.unsupported,\n 'Field type must be a primitive, reference, or Unsupported',\n );\n\n return field.type.type\n ? ts.factory.createStringLiteral(field.type.type)\n : field.type.reference\n ? ts.factory.createStringLiteral(field.type.reference.$refText)\n : // `Unsupported` type\n ts.factory.createStringLiteral('Unsupported');\n }\n\n private createEnumObject(e: Enum) {\n return ts.factory.createObjectLiteralExpression(\n e.fields.map((field) =>\n ts.factory.createPropertyAssignment(field.name, ts.factory.createStringLiteral(field.name)),\n ),\n true,\n );\n }\n\n private getLiteral(expr: Expression) {\n if (!isLiteralExpr(expr)) {\n throw new Error('Expected a literal expression');\n }\n switch (expr?.$type) {\n case 'StringLiteral':\n case 'BooleanLiteral':\n return expr.value;\n case 'NumberLiteral':\n return parseFloat(expr.value);\n default:\n throw new Error('Unsupported literal type');\n }\n }\n\n private createLiteralNode(arg: string | number | boolean | null): any {\n return arg === null\n ? ts.factory.createNull()\n : typeof arg === 'string'\n ? ts.factory.createStringLiteral(arg)\n : typeof arg === 'number'\n ? ts.factory.createNumericLiteral(arg)\n : arg === true\n ? ts.factory.createTrue()\n : arg === false\n ? ts.factory.createFalse()\n : undefined;\n }\n\n private createProceduresObject(procedures: Procedure[]) {\n return ts.factory.createObjectLiteralExpression(\n procedures.map((proc) => ts.factory.createPropertyAssignment(proc.name, this.createProcedureObject(proc))),\n true,\n );\n }\n\n private createProcedureObject(proc: Procedure) {\n const params = ts.factory.createArrayLiteralExpression(\n proc.params.map((param) =>\n ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(param.name)),\n ...(param.optional\n ? [ts.factory.createPropertyAssignment('optional', ts.factory.createTrue())]\n : []),\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(param.type.type ?? param.type.reference!.$refText),\n ),\n ]),\n ),\n true,\n );\n\n const paramsType = ts.factory.createTupleTypeNode([\n ...proc.params.map((param) =>\n ts.factory.createNamedTupleMember(\n undefined,\n ts.factory.createIdentifier(param.name),\n undefined,\n ts.factory.createTypeLiteralNode([\n ts.factory.createPropertySignature(\n undefined,\n ts.factory.createStringLiteral('name'),\n undefined,\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(param.name)),\n ),\n ts.factory.createPropertySignature(\n undefined,\n ts.factory.createStringLiteral('type'),\n undefined,\n ts.factory.createLiteralTypeNode(\n ts.factory.createStringLiteral(param.type.type ?? param.type.reference!.$refText),\n ),\n ),\n ...(param.optional\n ? [\n ts.factory.createPropertySignature(\n undefined,\n ts.factory.createStringLiteral('optional'),\n undefined,\n ts.factory.createLiteralTypeNode(ts.factory.createTrue()),\n ),\n ]\n : []),\n ]),\n ),\n ),\n ]);\n\n return ts.factory.createObjectLiteralExpression(\n [\n ts.factory.createPropertyAssignment('params', ts.factory.createAsExpression(params, paramsType)),\n ts.factory.createPropertyAssignment(\n 'returnType',\n ts.factory.createStringLiteral(proc.returnType.type ?? proc.returnType.reference!.$refText),\n ),\n ...(proc.mutation ? [ts.factory.createPropertyAssignment('mutation', ts.factory.createTrue())] : []),\n ],\n true,\n );\n }\n\n private generateBannerComments(statements: ts.Statement[]) {\n const banner = `////////////////////////////////////////////////////////////////////////////////////////////\n// DO NOT MODIFY THIS FILE //\n// This file is automatically generated by ZenStack CLI and should not be manually updated. //\n//////////////////////////////////////////////////////////////////////////////////////////////\n\n/* eslint-disable */\n\n`;\n ts.addSyntheticLeadingComment(statements[0]!, ts.SyntaxKind.SingleLineCommentTrivia, banner);\n }\n\n private createAttributeObject(attr: DataModelAttribute | DataFieldAttribute): ts.Expression {\n return ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(attr.decl.$refText)),\n ...(attr.args.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'args',\n ts.factory.createArrayLiteralExpression(attr.args.map((arg) => this.createAttributeArg(arg))),\n ),\n ]\n : []),\n ]);\n }\n\n private createAttributeArg(arg: AttributeArg): ts.Expression {\n return ts.factory.createObjectLiteralExpression([\n // name\n ...(arg.$resolvedParam?.name\n ? [ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(arg.$resolvedParam.name))]\n : []),\n\n // value\n ts.factory.createPropertyAssignment('value', this.createExpression(arg.value)),\n ]);\n }\n\n private createExpression(value: Expression): ts.Expression {\n return match(value)\n .when(isLiteralExpr, (expr) => this.createLiteralExpression(expr.$type, expr.value))\n .when(isInvocationExpr, (expr) => this.createCallExpression(expr))\n .when(isReferenceExpr, (expr) => this.createRefExpression(expr))\n .when(isArrayExpr, (expr) => this.createArrayExpression(expr))\n .when(isUnaryExpr, (expr) => this.createUnaryExpression(expr))\n .when(isBinaryExpr, (expr) => this.createBinaryExpression(expr))\n .when(isMemberAccessExpr, (expr) => this.createMemberExpression(expr))\n .when(isNullExpr, () => this.createNullExpression())\n .when(isThisExpr, () => this.createThisExpression())\n .otherwise(() => {\n throw new Error(`Unsupported attribute arg value: ${value.$type}`);\n });\n }\n\n private createThisExpression() {\n return this.createExpressionUtilsCall('_this');\n }\n\n private createMemberExpression(expr: MemberAccessExpr) {\n const members: string[] = [];\n\n // turn nested member access expression into a flat list of members\n let current: Expression = expr;\n while (isMemberAccessExpr(current)) {\n members.unshift(current.member.$refText);\n current = current.operand;\n }\n const receiver = current;\n\n const args = [\n this.createExpression(receiver),\n ts.factory.createArrayLiteralExpression(members.map((m) => ts.factory.createStringLiteral(m))),\n ];\n\n return this.createExpressionUtilsCall('member', args);\n }\n\n private createNullExpression() {\n return this.createExpressionUtilsCall('_null');\n }\n\n private createBinaryExpression(expr: BinaryExpr) {\n return this.createExpressionUtilsCall('binary', [\n this.createExpression(expr.left),\n this.createLiteralNode(expr.operator),\n this.createExpression(expr.right),\n ]);\n }\n\n private createUnaryExpression(expr: UnaryExpr) {\n return this.createExpressionUtilsCall('unary', [\n this.createLiteralNode(expr.operator),\n this.createExpression(expr.operand),\n ]);\n }\n\n private createArrayExpression(expr: ArrayExpr): any {\n return this.createExpressionUtilsCall('array', [\n ts.factory.createArrayLiteralExpression(expr.items.map((item) => this.createExpression(item))),\n ]);\n }\n\n private createRefExpression(expr: ReferenceExpr): any {\n if (isDataField(expr.target.ref)) {\n return this.createExpressionUtilsCall('field', [this.createLiteralNode(expr.target.$refText)]);\n } else if (isEnumField(expr.target.ref)) {\n return this.createLiteralExpression('StringLiteral', expr.target.$refText);\n } else {\n throw new Error(`Unsupported reference type: ${expr.target.$refText}`);\n }\n }\n\n private createCallExpression(expr: InvocationExpr) {\n return this.createExpressionUtilsCall('call', [\n ts.factory.createStringLiteral(expr.function.$refText),\n ...(expr.args.length > 0\n ? [ts.factory.createArrayLiteralExpression(expr.args.map((arg) => this.createExpression(arg.value)))]\n : []),\n ]);\n }\n\n private createLiteralExpression(type: string, value: string | boolean) {\n return match(type)\n .with('BooleanLiteral', () => this.createExpressionUtilsCall('literal', [this.createLiteralNode(value)]))\n .with('NumberLiteral', () =>\n this.createExpressionUtilsCall('literal', [ts.factory.createIdentifier(value as string)]),\n )\n .with('StringLiteral', () => this.createExpressionUtilsCall('literal', [this.createLiteralNode(value)]))\n .otherwise(() => {\n throw new Error(`Unsupported literal type: ${type}`);\n });\n }\n\n private generateModelsAndTypeDefs(model: Model, outputDir: string) {\n const statements: ts.Statement[] = [];\n\n // generate: import { schema as $schema, type SchemaType as $Schema } from './schema';\n statements.push(this.generateSchemaImport(model, true, true));\n\n // generate: import type { ModelResult as $ModelResult } from '@zenstackhq/orm';\n statements.push(\n ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n false,\n undefined,\n ts.factory.createNamedImports([\n ts.factory.createImportSpecifier(\n true,\n undefined,\n ts.factory.createIdentifier(`ModelResult as $ModelResult`),\n ),\n ...(model.declarations.some(isTypeDef)\n ? [\n ts.factory.createImportSpecifier(\n true,\n undefined,\n ts.factory.createIdentifier(`TypeDefResult as $TypeDefResult`),\n ),\n ]\n : []),\n ]),\n ),\n ts.factory.createStringLiteral('@zenstackhq/orm'),\n ),\n );\n\n // generate: export type Model = $ModelResult<Schema, 'Model'>;\n const dataModels = model.declarations.filter(isDataModel);\n for (const dm of dataModels) {\n let modelType = ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n dm.name,\n undefined,\n ts.factory.createTypeReferenceNode('$ModelResult', [\n ts.factory.createTypeReferenceNode('$Schema'),\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(dm.name)),\n ]),\n );\n if (dm.comments.length > 0) {\n modelType = this.generateDocs(modelType, dm);\n }\n statements.push(modelType);\n }\n\n // generate: export type TypeDef = $TypeDefResult<Schema, 'TypeDef'>;\n const typeDefs = model.declarations.filter(isTypeDef);\n for (const td of typeDefs) {\n let typeDef = ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n td.name,\n undefined,\n ts.factory.createTypeReferenceNode('$TypeDefResult', [\n ts.factory.createTypeReferenceNode('$Schema'),\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(td.name)),\n ]),\n );\n if (td.comments.length > 0) {\n typeDef = this.generateDocs(typeDef, td);\n }\n statements.push(typeDef);\n }\n\n // generate: export const Enum = $schema.enums.Enum;\n const enums = model.declarations.filter(isEnum);\n for (const e of enums) {\n let enumDecl = ts.factory.createVariableStatement(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n ts.factory.createVariableDeclarationList(\n [\n ts.factory.createVariableDeclaration(\n e.name,\n undefined,\n undefined,\n ts.factory.createPropertyAccessExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createIdentifier('$schema'),\n ts.factory.createIdentifier('enums'),\n ),\n ts.factory.createIdentifier(e.name),\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n );\n if (e.comments.length > 0) {\n enumDecl = this.generateDocs(enumDecl, e);\n }\n statements.push(enumDecl);\n\n // generate: export type Enum = (typeof Enum)[keyof typeof Enum];\n let typeAlias = ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n e.name,\n undefined,\n ts.factory.createIndexedAccessTypeNode(\n ts.factory.createTypeQueryNode(ts.factory.createIdentifier(e.name)),\n ts.factory.createTypeOperatorNode(\n ts.SyntaxKind.KeyOfKeyword,\n ts.factory.createTypeQueryNode(ts.factory.createIdentifier(e.name)),\n ),\n ),\n );\n if (e.comments.length > 0) {\n typeAlias = this.generateDocs(typeAlias, e);\n }\n statements.push(typeAlias);\n }\n\n this.generateBannerComments(statements);\n\n // write to file\n const outputFile = path.join(outputDir, 'models.ts');\n const sourceFile = ts.createSourceFile(outputFile, '', ts.ScriptTarget.ESNext, false, ts.ScriptKind.TS);\n const printer = ts.createPrinter();\n const result = printer.printList(ts.ListFormat.MultiLine, ts.factory.createNodeArray(statements), sourceFile);\n fs.writeFileSync(outputFile, result);\n }\n\n private generateSchemaImport(model: Model, schemaObject: boolean, schemaType: boolean) {\n const importSpecifiers = [];\n\n if (schemaObject) {\n if (model.declarations.some(isEnum)) {\n // enums require referencing the schema object\n importSpecifiers.push(\n ts.factory.createImportSpecifier(\n false,\n ts.factory.createIdentifier('schema'),\n ts.factory.createIdentifier('$schema'),\n ),\n );\n }\n }\n\n if (schemaType) {\n importSpecifiers.push(\n ts.factory.createImportSpecifier(\n true,\n ts.factory.createIdentifier('SchemaType'),\n ts.factory.createIdentifier('$Schema'),\n ),\n );\n }\n\n return ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(false, undefined, ts.factory.createNamedImports(importSpecifiers)),\n ts.factory.createStringLiteral('./schema'),\n );\n }\n\n private generateDocs<T extends ts.TypeAliasDeclaration | ts.VariableStatement>(\n tsDecl: T,\n decl: DataModel | TypeDef | Enum,\n ): T {\n return ts.addSyntheticLeadingComment(\n tsDecl,\n ts.SyntaxKind.MultiLineCommentTrivia,\n `*\\n * ${decl.comments.map((c) => c.replace(/^\\s*\\/*\\s*/, '')).join('\\n * ')}\\n `,\n true,\n );\n }\n\n private generateInputTypes(model: Model, outputDir: string) {\n const dataModels = model.declarations.filter(isDataModel);\n const statements: ts.Statement[] = [];\n\n // generate: import { SchemaType as $Schema } from './schema';\n statements.push(this.generateSchemaImport(model, false, true));\n\n // generate: import { CreateArgs as $CreateArgs, ... } from '@zenstackhq/orm';\n const inputTypes = [\n 'FindManyArgs',\n 'FindUniqueArgs',\n 'FindFirstArgs',\n 'CreateArgs',\n 'CreateManyArgs',\n 'CreateManyAndReturnArgs',\n 'UpdateArgs',\n 'UpdateManyArgs',\n 'UpdateManyAndReturnArgs',\n 'UpsertArgs',\n 'DeleteArgs',\n 'DeleteManyArgs',\n 'CountArgs',\n 'AggregateArgs',\n 'GroupByArgs',\n 'WhereInput',\n 'SelectInput',\n 'IncludeInput',\n 'OmitInput',\n ];\n\n const inputTypeNameFixes = {\n SelectInput: 'Select',\n IncludeInput: 'Include',\n OmitInput: 'Omit',\n };\n\n // generate: import { CreateArgs as $CreateArgs, ... } from '@zenstackhq/orm';\n statements.push(\n ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n true,\n undefined,\n ts.factory.createNamedImports(\n inputTypes.map((inputType) =>\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier(`${inputType} as $${inputType}`),\n ),\n ),\n ),\n ),\n ts.factory.createStringLiteral('@zenstackhq/orm'),\n ),\n );\n\n // generate: import { type SelectIncludeOmit as $SelectIncludeOmit, type SimplifiedModelResult as $SimplifiedModelResult } from '@zenstackhq/orm';\n statements.push(\n ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n true,\n undefined,\n ts.factory.createNamedImports([\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier('SimplifiedModelResult as $SimplifiedModelResult'),\n ),\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier('SelectIncludeOmit as $SelectIncludeOmit'),\n ),\n ]),\n ),\n ts.factory.createStringLiteral('@zenstackhq/orm'),\n ),\n );\n\n for (const dm of dataModels) {\n // generate: export type ModelCreateArgs = $CreateArgs<Schema, Model>;\n for (const inputType of inputTypes) {\n const exportName = inputTypeNameFixes[inputType as keyof typeof inputTypeNameFixes]\n ? `${dm.name}${inputTypeNameFixes[inputType as keyof typeof inputTypeNameFixes]}`\n : `${dm.name}${inputType}`;\n statements.push(\n ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n exportName,\n undefined,\n ts.factory.createTypeReferenceNode(`$${inputType}`, [\n ts.factory.createTypeReferenceNode('$Schema'),\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(dm.name)),\n ]),\n ),\n );\n }\n\n // generate: export type ModelGetPayload<Args extends $SelectIncludeOmit<Schema, Model, true>> = $SimplifiedModelResult<Schema, Model, Args>;\n statements.push(\n ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n `${dm.name}GetPayload`,\n [\n ts.factory.createTypeParameterDeclaration(\n undefined,\n 'Args',\n ts.factory.createTypeReferenceNode('$SelectIncludeOmit', [\n ts.factory.createTypeReferenceNode('$Schema'),\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(dm.name)),\n ts.factory.createLiteralTypeNode(ts.factory.createTrue()),\n ]),\n ),\n ],\n ts.factory.createTypeReferenceNode('$SimplifiedModelResult', [\n ts.factory.createTypeReferenceNode('$Schema'),\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(dm.name)),\n ts.factory.createTypeReferenceNode('Args'),\n ]),\n ),\n );\n }\n\n this.generateBannerComments(statements);\n\n // write to file\n const outputFile = path.join(outputDir, 'input.ts');\n const sourceFile = ts.createSourceFile(outputFile, '', ts.ScriptTarget.ESNext, false, ts.ScriptKind.TS);\n const printer = ts.createPrinter();\n const result = printer.printList(ts.ListFormat.MultiLine, ts.factory.createNodeArray(statements), sourceFile);\n fs.writeFileSync(outputFile, result);\n }\n}\n","import {\n Argument,\n ArrayExpr,\n Attribute,\n AttributeArg,\n AttributeParam,\n AttributeParamType,\n BinaryExpr,\n BinaryExprOperatorPriority,\n BooleanLiteral,\n ConfigArrayExpr,\n ConfigField,\n ConfigInvocationExpr,\n DataField,\n DataFieldAttribute,\n DataFieldType,\n DataModel,\n DataModelAttribute,\n DataSource,\n Enum,\n EnumField,\n FieldInitializer,\n FunctionDecl,\n FunctionParam,\n FunctionParamType,\n GeneratorDecl,\n InvocationExpr,\n LiteralExpr,\n MemberAccessExpr,\n Model,\n NullExpr,\n NumberLiteral,\n ObjectExpr,\n Plugin,\n PluginField,\n ReferenceArg,\n ReferenceExpr,\n StringLiteral,\n ThisExpr,\n TypeDef,\n UnaryExpr,\n type AstNode,\n} from '@zenstackhq/language/ast';\nimport { resolved } from './model-utils';\n\n/**\n * Options for the generator.\n */\nexport interface ZModelCodeOptions {\n binaryExprNumberOfSpaces: number;\n unaryExprNumberOfSpaces: number;\n indent: number;\n quote: 'single' | 'double';\n}\n\n// a registry of generation handlers marked with @gen\nconst generationHandlers = new Map<string, PropertyDescriptor>();\n\n// generation handler decorator\nfunction gen(name: string) {\n return function (_target: unknown, _propertyKey: string, descriptor: PropertyDescriptor) {\n if (!generationHandlers.get(name)) {\n generationHandlers.set(name, descriptor);\n }\n return descriptor;\n };\n}\n\n/**\n * Generates ZModel source code from AST.\n */\nexport class ZModelCodeGenerator {\n private readonly options: ZModelCodeOptions;\n\n constructor(options?: Partial<ZModelCodeOptions>) {\n this.options = {\n binaryExprNumberOfSpaces: options?.binaryExprNumberOfSpaces ?? 1,\n unaryExprNumberOfSpaces: options?.unaryExprNumberOfSpaces ?? 0,\n indent: options?.indent ?? 4,\n quote: options?.quote ?? 'single',\n };\n }\n\n /**\n * Generates ZModel source code from AST.\n */\n generate(ast: AstNode): string {\n const handler = generationHandlers.get(ast.$type);\n if (!handler) {\n throw new Error(`No generation handler found for ${ast.$type}`);\n }\n return handler.value.call(this, ast);\n }\n\n @gen(Model)\n private _generateModel(ast: Model) {\n return ast.declarations.map((d) => this.generate(d)).join('\\n\\n');\n }\n\n @gen(DataSource)\n private _generateDataSource(ast: DataSource) {\n return `datasource ${ast.name} {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}\n}`;\n }\n\n @gen(Enum)\n private _generateEnum(ast: Enum) {\n return `enum ${ast.name} {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}\n}`;\n }\n\n @gen(EnumField)\n private _generateEnumField(ast: EnumField) {\n return `${ast.name}${\n ast.attributes.length > 0 ? ' ' + ast.attributes.map((x) => this.generate(x)).join(' ') : ''\n }`;\n }\n\n @gen(GeneratorDecl)\n private _generateGenerator(ast: GeneratorDecl) {\n return `generator ${ast.name} {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}\n}`;\n }\n\n @gen(ConfigField)\n private _generateConfigField(ast: ConfigField) {\n return `${ast.name} = ${this.generate(ast.value)}`;\n }\n\n @gen(ConfigArrayExpr)\n private _generateConfigArrayExpr(ast: ConfigArrayExpr) {\n return `[${ast.items.map((x) => this.generate(x)).join(', ')}]`;\n }\n\n @gen(ConfigInvocationExpr)\n private _generateConfigInvocationExpr(ast: ConfigInvocationExpr) {\n if (ast.args.length === 0) {\n return ast.name;\n } else {\n return `${ast.name}(${ast.args\n .map((x) => (x.name ? x.name + ': ' : '') + this.generate(x.value))\n .join(', ')})`;\n }\n }\n\n @gen(Plugin)\n private _generatePlugin(ast: Plugin) {\n return `plugin ${ast.name} {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}\n}`;\n }\n\n @gen(PluginField)\n private _generatePluginField(ast: PluginField) {\n return `${ast.name} = ${this.generate(ast.value)}`;\n }\n\n @gen(DataModel)\n private _generateDataModel(ast: DataModel) {\n return `${ast.isView ? 'view' : 'model'} ${ast.name}${\n ast.mixins.length > 0 ? ' mixes ' + ast.mixins.map((x) => x.ref?.name).join(', ') : ''\n } {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}${\n ast.attributes.length > 0\n ? '\\n\\n' + ast.attributes.map((x) => this.indent + this.generate(x)).join('\\n')\n : ''\n }\n}`;\n }\n\n @gen(DataField)\n private _generateDataField(ast: DataField) {\n return `${ast.name} ${this.fieldType(ast.type)}${\n ast.attributes.length > 0 ? ' ' + ast.attributes.map((x) => this.generate(x)).join(' ') : ''\n }`;\n }\n\n private fieldType(type: DataFieldType) {\n const baseType = type.type\n ? type.type\n : type.$type == 'DataFieldType' && type.unsupported\n ? 'Unsupported(' + this.generate(type.unsupported.value) + ')'\n : type.reference?.$refText;\n return `${baseType}${type.array ? '[]' : ''}${type.optional ? '?' : ''}`;\n }\n\n @gen(DataModelAttribute)\n private _generateDataModelAttribute(ast: DataModelAttribute) {\n return this.attribute(ast);\n }\n\n @gen(DataFieldAttribute)\n private _generateDataFieldAttribute(ast: DataFieldAttribute) {\n return this.attribute(ast);\n }\n\n private attribute(ast: DataModelAttribute | DataFieldAttribute) {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generate(x)).join(', ')})` : '';\n return `${resolved(ast.decl).name}${args}`;\n }\n\n @gen(AttributeArg)\n private _generateAttributeArg(ast: AttributeArg) {\n if (ast.name) {\n return `${ast.name}: ${this.generate(ast.value)}`;\n } else {\n return this.generate(ast.value);\n }\n }\n\n @gen(ObjectExpr)\n private _generateObjectExpr(ast: ObjectExpr) {\n return `{ ${ast.fields.map((field) => this.objectField(field)).join(', ')} }`;\n }\n\n private objectField(field: FieldInitializer) {\n return `${field.name}: ${this.generate(field.value)}`;\n }\n\n @gen(ArrayExpr)\n private _generateArrayExpr(ast: ArrayExpr) {\n return `[${ast.items.map((item) => this.generate(item)).join(', ')}]`;\n }\n\n @gen(StringLiteral)\n private _generateLiteralExpr(ast: LiteralExpr) {\n return this.options.quote === 'single' ? `'${ast.value}'` : `\"${ast.value}\"`;\n }\n\n @gen(NumberLiteral)\n private _generateNumberLiteral(ast: NumberLiteral) {\n return ast.value.toString();\n }\n\n @gen(BooleanLiteral)\n private _generateBooleanLiteral(ast: BooleanLiteral) {\n return ast.value.toString();\n }\n\n @gen(UnaryExpr)\n private _generateUnaryExpr(ast: UnaryExpr) {\n return `${ast.operator}${this.unaryExprSpace}${this.generate(ast.operand)}`;\n }\n\n @gen(BinaryExpr)\n private _generateBinaryExpr(ast: BinaryExpr) {\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n const rightExpr = this.generate(ast.right);\n\n const { left: isLeftParenthesis, right: isRightParenthesis } = this.isParenthesesNeededForBinaryExpr(ast);\n\n return `${isLeftParenthesis ? '(' : ''}${this.generate(ast.left)}${\n isLeftParenthesis ? ')' : ''\n }${isCollectionPredicate ? '' : this.binaryExprSpace}${operator}${\n isCollectionPredicate ? '' : this.binaryExprSpace\n }${isRightParenthesis ? '(' : ''}${\n isCollectionPredicate ? `[${rightExpr}]` : rightExpr\n }${isRightParenthesis ? ')' : ''}`;\n }\n\n @gen(ReferenceExpr)\n private _generateReferenceExpr(ast: ReferenceExpr) {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generate(x)).join(', ')})` : '';\n return `${ast.target.ref?.name}${args}`;\n }\n\n @gen(ReferenceArg)\n private _generateReferenceArg(ast: ReferenceArg) {\n return `${ast.name}:${this.generate(ast.value)}`;\n }\n\n @gen(MemberAccessExpr)\n private _generateMemberExpr(ast: MemberAccessExpr) {\n return `${this.generate(ast.operand)}.${ast.member.ref?.name}`;\n }\n\n @gen(InvocationExpr)\n private _generateInvocationExpr(ast: InvocationExpr) {\n return `${ast.function.ref?.name}(${ast.args.map((x) => this.argument(x)).join(', ')})`;\n }\n\n @gen(NullExpr)\n private _generateNullExpr() {\n return 'null';\n }\n\n @gen(ThisExpr)\n private _generateThisExpr() {\n return 'this';\n }\n\n @gen(Attribute)\n private _generateAttribute(ast: Attribute) {\n return `attribute ${ast.name}(${ast.params.map((x) => this.generate(x)).join(', ')})`;\n }\n\n @gen(AttributeParam)\n private _generateAttributeParam(ast: AttributeParam) {\n return `${ast.default ? '_ ' : ''}${ast.name}: ${this.generate(ast.type)}`;\n }\n\n @gen(AttributeParamType)\n private _generateAttributeParamType(ast: AttributeParamType) {\n return `${ast.type ?? ast.reference?.$refText}${ast.array ? '[]' : ''}${ast.optional ? '?' : ''}`;\n }\n\n @gen(FunctionDecl)\n private _generateFunctionDecl(ast: FunctionDecl) {\n return `function ${ast.name}(${ast.params.map((x) => this.generate(x)).join(', ')}) ${\n ast.returnType ? ': ' + this.generate(ast.returnType) : ''\n } {}`;\n }\n\n @gen(FunctionParam)\n private _generateFunctionParam(ast: FunctionParam) {\n return `${ast.name}: ${this.generate(ast.type)}`;\n }\n\n @gen(FunctionParamType)\n private _generateFunctionParamType(ast: FunctionParamType) {\n return `${ast.type ?? ast.reference?.$refText}${ast.array ? '[]' : ''}`;\n }\n\n @gen(TypeDef)\n private _generateTypeDef(ast: TypeDef) {\n return `type ${ast.name} {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}${\n ast.attributes.length > 0\n ? '\\n\\n' + ast.attributes.map((x) => this.indent + this.generate(x)).join('\\n')\n : ''\n }\n}`;\n }\n\n private argument(ast: Argument) {\n return this.generate(ast.value);\n }\n\n private get binaryExprSpace() {\n return ' '.repeat(this.options.binaryExprNumberOfSpaces);\n }\n\n private get unaryExprSpace() {\n return ' '.repeat(this.options.unaryExprNumberOfSpaces);\n }\n\n private get indent() {\n return ' '.repeat(this.options.indent);\n }\n\n private isParenthesesNeededForBinaryExpr(ast: BinaryExpr): {\n left: boolean;\n right: boolean;\n } {\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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","names":["isDataModel","isLiteralExpr","isModel","isTypeDef","getAllFields","getModelIdFields","getModelUniqueFields","isIdField","field","contextModel","hasAttribute","modelLevelIds","getModelIdFields","map","f","name","includes","allFields","getAllFields","some","length","firstUniqueField","find","modelLevelUnique","getModelUniqueFields","decl","getAttribute","attributes","attr","$refText","isDelegateModel","node","isDataModel","isUniqueField","modelIds","$container","args","arg","isLiteralExpr","value","isFromStdlib","model","getContainingModel","$document","uri","path","endsWith","isModel","resolved","ref","Error","getAuthDecl","found","declarations","d","isTypeDef","getIdFields","dm","filter","DELEGATE_AUX_RELATION_PREFIX","lowerCaseFirst","BooleanLiteral","DataModel","DataSource","Enum","GeneratorDecl","isArrayExpr","isDataModel","isInvocationExpr","isLiteralExpr","isNullExpr","isReferenceExpr","isStringLiteral","isTypeDef","NumberLiteral","StringLiteral","getAllAttributes","getAllFields","isAuthInvocation","isDelegateModel","AstUtils","match","string","count","indent","replace","repeat","indentString","PrismaModel","datasources","generators","models","enums","addDataSource","name","fields","ds","DataSource","push","addGenerator","generator","Generator","addModel","model","Model","addView","addEnum","e","Enum","toString","map","d","join","f","indentString","text","DeclarationBase","documentations","addComment","x","ContainerDeclaration","attributes","FieldDeclaration","isView","addField","type","addToFront","field","ModelField","unshift","addAttribute","args","attr","ContainerAttribute","result","length","ModelFieldType","array","optional","FieldAttribute","a","AttributeArg","name","value","toString","AttributeArgValue","type","Error","Array","isArray","FieldReference","FunctionCall","JSON","stringify","fr","r","field","args","length","map","a","join","v","FieldReferenceArg","func","FunctionCallArg","Enum","ContainerDeclaration","fields","documentations","addField","attributes","EnumField","push","addAttribute","attr","ContainerAttribute","addComment","indentString","d","DeclarationBase","FieldAttribute","IDENTIFIER_NAME_MAX_LENGTH","DELEGATE_AUX_RELATION_PREFIX","length","PrismaSchemaGenerator","PRELUDE","shortNameMap","Map","zmodel","generate","prisma","PrismaModel","decl","declarations","$type","DataSource","generateDataSource","Enum","generateEnum","DataModel","generateModel","GeneratorDecl","generateGenerator","toString","dataSource","fields","map","f","name","text","configExprToText","value","addDataSource","expr","isLiteralExpr","literalToText","isInvocationExpr","fc","makeFunctionCall","configArrayToText","items","item","args","arg","configInvocationArgToText","join","JSON","stringify","addGenerator","model","isView","addView","addModel","allFields","getAllFields","field","ModelUtils","hasAttribute","isIdField","isInheritedFromDelegate","generateModelField","allAttributes","getAllAttributes","attr","filter","isPrismaAttribute","isInheritedMapAttribute","generateContainerAttribute","comments","forEach","c","addComment","generateDelegateRelationForBase","generateDelegateRelationForConcrete","contextModel","$container","attrName","ref","$refText","attributes","some","a","getUnsupportedFieldType","fieldType","unsupported","getStringLiteral","undefined","node","isStringLiteral","addToFront","type","reference","isTypeDef","Error","isArray","array","ModelFieldType","optional","isDefaultWithAuthInvocation","makeFieldAttribute","docs","result","addField","AstUtils","streamAst","isAuthInvocation","isDelegateModel","PrismaFieldAttribute","makeAttributeArg","PrismaAttributeArg","makeAttributeArgValue","argType","match","with","StringLiteral","NumberLiteral","BooleanLiteral","exhaustive","PrismaAttributeArgValue","isArrayExpr","Array","isReferenceExpr","PrismaFieldReference","target","PrismaFieldReferenceArg","exprToText","ZModelCodeGenerator","quote","PrismaFunctionCall","function","val","when","v","isNullExpr","otherwise","PrismaFunctionCallArg","container","push","PrismaModelAttribute","_enum","addEnum","generateEnumField","concreteModels","getConcreteModels","concrete","auxName","truncate","lowerCaseFirst","concreteDecl","base","baseModel","idFields","getIdFields","relationField","AttributeArgValue","idField","dataModel","d","isDataModel","existing","get","baseName","slice","index","shortName","conflict","from","values","find","set","invariant","isArrayExpr","isBinaryExpr","isDataField","isDataModel","isDataSource","isEnum","isEnumField","isInvocationExpr","isLiteralExpr","isMemberAccessExpr","isNullExpr","isProcedure","isReferenceExpr","isThisExpr","isTypeDef","isUnaryExpr","getAllAttributes","getAllFields","isDataFieldReference","fs","path","match","ts","TsSchemaGenerator","usedExpressionUtils","generate","model","outputDir","fs","mkdirSync","recursive","generateSchema","generateModelsAndTypeDefs","generateInputTypes","statements","generateSchemaStatements","generateBannerComments","schemaOutputFile","path","join","sourceFile","createSourceFile","ScriptTarget","ESNext","ScriptKind","TS","printer","createPrinter","result","printList","ListFormat","MultiLine","factory","createNodeArray","writeFileSync","hasComputedFields","declarations","some","d","isDataModel","fields","f","hasAttribute","schemaObject","createSchemaObject","runtimeImportDecl","createImportDeclaration","undefined","createImportClause","createNamedImports","createImportSpecifier","createIdentifier","createStringLiteral","push","declaration","createVariableStatement","createModifier","SyntaxKind","ExportKeyword","createVariableDeclarationList","createVariableDeclaration","createSatisfiesExpression","createAsExpression","createTypeReferenceNode","NodeFlags","Const","typeDeclaration","createTypeAliasDeclaration","createExpressionUtilsCall","method","args","createCallExpression","createPropertyAccessExpression","properties","createPropertyAssignment","createProviderObject","createModelsObject","isTypeDef","createTypeDefsObject","enums","filter","isEnum","length","createObjectLiteralExpression","map","e","name","createEnumObject","authType","getAuthDecl","createLiteralNode","procedures","isProcedure","createProceduresObject","dsProvider","getDataSourceProvider","type","dm","createDataModelObject","td","createTypeDefObject","allFields","getAllFields","allAttributes","getAllAttributes","attr","decl","$refText","$container","subModels","getSubModels","baseModel","field","createDataFieldObject","createArrayLiteralExpression","createAttributeObject","getIdFields","idField","createUniqueFieldsObject","isDelegateModel","createTrue","subModel","isView","computedFields","createComputedFieldsObject","ref","createMethodDeclaration","createParameterDeclaration","createTypeLiteralNode","createPropertySignature","createKeywordTypeNode","StringKeyword","mapFieldTypeToTSType","createBlock","createThrowStatement","createNewExpression","match","with","otherwise","array","optional","contextModel","objectFields","generateFieldTypeLiteral","ModelUtils","isIdField","isUniqueField","isDiscriminatorField","attributes","defaultValue","getFieldMappedDefault","Array","isArray","call","arg","authMember","m","Error","item","reference","createRelationObject","fkFor","getForeignKeyFor","fk","origin","getAttribute","$resolvedParam","isDataFieldReference","value","target","dataSource","find","isDataSource","invariant","providerExpr","isLiteralExpr","defaultAttr","getMappedValue","expr","fieldType","lit","includes","Number","isArrayExpr","items","isReferenceExpr","isEnumField","isInvocationExpr","function","getLiteral","isAuthMemberAccess","getMemberAccessChain","$type","isMemberAccessExpr","operand","member","isAuthInvocation","isFromStdlib","relationFields","oppositeRelation","getOppositeRelationField","relationName","getRelationName","relation","param","fieldNames","getReferenceNames","el","action","sourceModel","targetModel","otherField","otherRelationName","nameArg","seenKeys","Set","fieldDef","key","getCompoundUniqueKey","has","add","unsupported","parseFloat","createNull","createNumericLiteral","createFalse","proc","createProcedureObject","params","paramsType","createTupleTypeNode","createNamedTupleMember","createLiteralTypeNode","returnType","mutation","banner","ts","addSyntheticLeadingComment","SingleLineCommentTrivia","createAttributeArg","createExpression","when","createLiteralExpression","createRefExpression","createArrayExpression","isUnaryExpr","createUnaryExpression","isBinaryExpr","createBinaryExpression","createMemberExpression","isNullExpr","createNullExpression","isThisExpr","createThisExpression","members","current","unshift","receiver","left","operator","right","isDataField","generateSchemaImport","dataModels","modelType","comments","generateDocs","typeDefs","typeDef","enumDecl","typeAlias","createIndexedAccessTypeNode","createTypeQueryNode","createTypeOperatorNode","KeyOfKeyword","outputFile","schemaType","importSpecifiers","tsDecl","MultiLineCommentTrivia","c","replace","inputTypes","inputTypeNameFixes","SelectInput","IncludeInput","OmitInput","inputType","exportName","createTypeParameterDeclaration","ArrayExpr","Attribute","AttributeArg","AttributeParam","AttributeParamType","BinaryExpr","BinaryExprOperatorPriority","BooleanLiteral","ConfigArrayExpr","ConfigField","ConfigInvocationExpr","DataField","DataFieldAttribute","DataModel","DataModelAttribute","DataSource","Enum","EnumField","FunctionDecl","FunctionParam","FunctionParamType","GeneratorDecl","InvocationExpr","LiteralExpr","MemberAccessExpr","Model","NullExpr","NumberLiteral","ObjectExpr","Plugin","PluginField","ReferenceArg","ReferenceExpr","StringLiteral","ThisExpr","TypeDef","UnaryExpr","generationHandlers","Map","gen","name","_target","_propertyKey","descriptor","get","set","ZModelCodeGenerator","options","binaryExprNumberOfSpaces","unaryExprNumberOfSpaces","indent","quote","generate","ast","handler","$type","Error","value","call","_generateModel","declarations","map","d","join","_generateDataSource","fields","x","_generateEnum","_generateEnumField","attributes","length","_generateGenerator","_generateConfigField","_generateConfigArrayExpr","items","_generateConfigInvocationExpr","args","_generatePlugin","_generatePluginField","_generateDataModel","isView","mixins","ref","_generateDataField","fieldType","type","baseType","unsupported","reference","$refText","array","optional","_generateDataModelAttribute","attribute","_generateDataFieldAttribute","resolved","decl","_generateAttributeArg","_generateObjectExpr","field","objectField","_generateArrayExpr","item","_generateLiteralExpr","_generateNumberLiteral","toString","_generateBooleanLiteral","_generateUnaryExpr","operator","unaryExprSpace","operand","_generateBinaryExpr","isCollectionPredicate","isCollectionPredicateOperator","rightExpr","right","left","isLeftParenthesis","isRightParenthesis","isParenthesesNeededForBinaryExpr","binaryExprSpace","_generateReferenceExpr","target","_generateReferenceArg","_generateMemberExpr","member","_generateInvocationExpr","function","argument","_generateNullExpr","_generateThisExpr","_generateAttribute","params","_generateAttributeParam","default","_generateAttributeParamType","_generateFunctionDecl","returnType","_generateFunctionParam","_generateFunctionParamType","_generateTypeDef","repeat","result","currentPriority","BinaryExprOperatorPriority","BinaryExpr","op","includes"]}
1
+ {"version":3,"sources":["../src/model-utils.ts","../src/prisma/prisma-schema-generator.ts","../src/prisma/indent-string.ts","../src/prisma/prisma-builder.ts","../src/ts-schema-generator.ts","../src/zmodel-code-generator.ts"],"sourcesContent":["import {\n isDataModel,\n isLiteralExpr,\n isModel,\n isTypeDef,\n type AstNode,\n type Attribute,\n type AttributeParam,\n type DataField,\n type DataFieldAttribute,\n type DataModel,\n type DataModelAttribute,\n type Enum,\n type EnumField,\n type FunctionDecl,\n type Model,\n type Reference,\n type TypeDef,\n} from '@zenstackhq/language/ast';\n\nimport { getAllFields, getModelIdFields, getModelUniqueFields, type AttributeTarget } from '@zenstackhq/language/utils';\n\nexport function isIdField(field: DataField, contextModel: DataModel) {\n // field-level @id attribute\n if (hasAttribute(field, '@id')) {\n return true;\n }\n\n // NOTE: we have to use name to match fields because the fields\n // may be inherited from a base and have different identities\n\n // model-level @@id attribute with a list of fields\n const modelLevelIds = getModelIdFields(contextModel);\n if (modelLevelIds.map((f) => f.name).includes(field.name)) {\n return true;\n }\n\n const allFields = getAllFields(contextModel);\n if (allFields.some((f) => hasAttribute(f, '@id')) || modelLevelIds.length > 0) {\n // the model already has `@id` or `@@id` field, don't further check unique fields\n return false;\n }\n\n // then, the first field with @unique can be used as id\n const firstUniqueField = allFields.find((f) => hasAttribute(f, '@unique'));\n if (firstUniqueField) {\n return firstUniqueField.name === field.name;\n }\n\n // last, the first model level @@unique can be used as id\n const modelLevelUnique = getModelUniqueFields(contextModel);\n if (modelLevelUnique.map((f) => f.name).includes(field.name)) {\n return true;\n }\n\n return false;\n}\n\nexport function hasAttribute(\n decl: DataModel | TypeDef | DataField | Enum | EnumField | FunctionDecl | Attribute | AttributeParam,\n name: string,\n) {\n return !!getAttribute(decl, name);\n}\n\nexport function getAttribute(decl: AttributeTarget, name: string) {\n return (decl.attributes as (DataModelAttribute | DataFieldAttribute)[]).find((attr) => attr.decl.$refText === name);\n}\n\nexport function isDelegateModel(node: AstNode) {\n return isDataModel(node) && hasAttribute(node, '@@delegate');\n}\n\nexport function isUniqueField(field: DataField) {\n if (hasAttribute(field, '@unique')) {\n return true;\n }\n const modelIds = getAttribute(field.$container, '@@unique');\n if (modelIds && modelIds.args.some((arg) => isLiteralExpr(arg.value) && arg.value.value === field.name)) {\n return true;\n }\n return false;\n}\n\nexport function isFromStdlib(node: AstNode) {\n const model = getContainingModel(node);\n return !!model && !!model.$document && model.$document.uri.path.endsWith('stdlib.zmodel');\n}\n\nexport function getContainingModel(node: AstNode | undefined): Model | null {\n if (!node) {\n return null;\n }\n return isModel(node) ? node : getContainingModel(node.$container);\n}\n\nexport function resolved<T extends AstNode>(ref: Reference<T>): T {\n if (!ref.ref) {\n throw new Error(`Reference not resolved: ${ref.$refText}`);\n }\n return ref.ref;\n}\n\nexport function getAuthDecl(model: Model) {\n let found = model.declarations.find(\n (d) => (isDataModel(d) || isTypeDef(d)) && d.attributes.some((attr) => attr.decl.$refText === '@@auth'),\n );\n if (!found) {\n found = model.declarations.find((d) => isDataModel(d) && d.name === 'User');\n }\n return found;\n}\n\nexport function getIdFields(dm: DataModel) {\n return getAllFields(dm)\n .filter((f) => isIdField(f, dm))\n .map((f) => f.name);\n}\n\n/**\n * Prefix for auxiliary relation fields generated for delegated models\n */\nexport const DELEGATE_AUX_RELATION_PREFIX = 'delegate_aux';\n","import { lowerCaseFirst } from '@zenstackhq/common-helpers';\nimport {\n AttributeArg,\n BooleanLiteral,\n ConfigArrayExpr,\n ConfigExpr,\n ConfigInvocationArg,\n DataField,\n DataFieldAttribute,\n DataFieldType,\n DataModel,\n DataModelAttribute,\n DataSource,\n Enum,\n EnumField,\n Expression,\n GeneratorDecl,\n InvocationExpr,\n isArrayExpr,\n isDataModel,\n isInvocationExpr,\n isLiteralExpr,\n isNullExpr,\n isReferenceExpr,\n isStringLiteral,\n isTypeDef,\n LiteralExpr,\n Model,\n NumberLiteral,\n StringLiteral,\n type AstNode,\n} from '@zenstackhq/language/ast';\nimport { getAllAttributes, getAllFields, isAuthInvocation, isDelegateModel } from '@zenstackhq/language/utils';\nimport { AstUtils } from 'langium';\nimport { match } from 'ts-pattern';\nimport { ModelUtils, ZModelCodeGenerator } from '..';\nimport { DELEGATE_AUX_RELATION_PREFIX, getIdFields } from '../model-utils';\nimport {\n AttributeArgValue,\n ModelFieldType,\n AttributeArg as PrismaAttributeArg,\n AttributeArgValue as PrismaAttributeArgValue,\n ContainerDeclaration as PrismaContainerDeclaration,\n Model as PrismaDataModel,\n Enum as PrismaEnum,\n FieldAttribute as PrismaFieldAttribute,\n FieldReference as PrismaFieldReference,\n FieldReferenceArg as PrismaFieldReferenceArg,\n FunctionCall as PrismaFunctionCall,\n FunctionCallArg as PrismaFunctionCallArg,\n PrismaModel,\n ContainerAttribute as PrismaModelAttribute,\n type SimpleField,\n} from './prisma-builder';\n\n// Some database providers like postgres and mysql have default limit to the length of identifiers\n// Here we use a conservative value that should work for most cases, and truncate names if needed\nconst IDENTIFIER_NAME_MAX_LENGTH = 50 - DELEGATE_AUX_RELATION_PREFIX.length;\n\n/**\n * Generates Prisma schema file\n */\nexport class PrismaSchemaGenerator {\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 // a mapping from full names to shortened names\n private shortNameMap = new Map<string, string>();\n\n constructor(private readonly zmodel: Model) {}\n\n async generate() {\n const prisma = new PrismaModel();\n\n for (const decl of this.zmodel.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 return this.PRELUDE + prisma.toString();\n }\n\n private generateDataSource(prisma: PrismaModel, dataSource: DataSource) {\n const fields: SimpleField[] = dataSource.fields.map((f) => ({\n name: f.name,\n text: this.configExprToText(f.value),\n }));\n prisma.addDataSource(dataSource.name, fields);\n }\n\n private configExprToText(expr: ConfigExpr) {\n if (isLiteralExpr(expr)) {\n return this.literalToText(expr);\n } else if (isInvocationExpr(expr)) {\n const fc = this.makeFunctionCall(expr);\n return fc.toString();\n } else {\n return this.configArrayToText(expr);\n }\n }\n\n private configArrayToText(expr: ConfigArrayExpr) {\n return (\n '[' +\n expr.items\n .map((item) => {\n if (isLiteralExpr(item)) {\n return this.literalToText(item);\n } else {\n return (\n item.name +\n (item.args.length > 0\n ? '(' + item.args.map((arg) => this.configInvocationArgToText(arg)).join(', ') + ')'\n : '')\n );\n }\n })\n .join(', ') +\n ']'\n );\n }\n\n private configInvocationArgToText(arg: ConfigInvocationArg) {\n return `${arg.name}: ${this.literalToText(arg.value)}`;\n }\n\n private literalToText(expr: LiteralExpr) {\n return JSON.stringify(expr.value);\n }\n\n private generateGenerator(prisma: PrismaModel, decl: GeneratorDecl) {\n prisma.addGenerator(\n decl.name,\n decl.fields.map((f) => ({\n name: f.name,\n text: this.configExprToText(f.value),\n })),\n );\n }\n\n private generateModel(prisma: PrismaModel, decl: DataModel) {\n const model = decl.isView ? prisma.addView(decl.name) : prisma.addModel(decl.name);\n const allFields = getAllFields(decl, true);\n for (const field of allFields) {\n if (ModelUtils.hasAttribute(field, '@computed')) {\n continue; // skip computed fields\n }\n // exclude non-id fields inherited from delegate\n if (ModelUtils.isIdField(field, decl) || !this.isInheritedFromDelegate(field, decl)) {\n this.generateModelField(model, field, decl);\n }\n }\n\n const allAttributes = getAllAttributes(decl);\n for (const attr of allAttributes.filter(\n (attr) => this.isPrismaAttribute(attr) && !this.isInheritedMapAttribute(attr, decl),\n )) {\n this.generateContainerAttribute(model, attr);\n }\n\n // user defined comments pass-through\n decl.comments.forEach((c) => model.addComment(c));\n\n // generate relation fields on base models linking to concrete models\n this.generateDelegateRelationForBase(model, decl);\n\n // generate reverse relation fields on concrete models\n this.generateDelegateRelationForConcrete(model, decl);\n }\n\n private isInheritedMapAttribute(attr: DataModelAttribute, contextModel: DataModel) {\n if (attr.$container === contextModel) {\n return false;\n }\n\n const attrName = attr.decl.ref?.name ?? attr.decl.$refText;\n return attrName === '@@map';\n }\n\n private isPrismaAttribute(attr: DataModelAttribute | DataFieldAttribute) {\n if (!attr.decl.ref) {\n return false;\n }\n return attr.decl.ref.attributes.some((a) => a.decl.ref?.name === '@@@prisma');\n }\n\n private getUnsupportedFieldType(fieldType: DataFieldType) {\n if (fieldType.unsupported) {\n const value = this.getStringLiteral(fieldType.unsupported.value);\n if (value) {\n return `Unsupported(\"${value}\")`;\n } else {\n return undefined;\n }\n } else {\n return undefined;\n }\n }\n\n private getStringLiteral(node: AstNode | undefined): string | undefined {\n return isStringLiteral(node) ? node.value : undefined;\n }\n\n private generateModelField(model: PrismaDataModel, field: DataField, contextModel: DataModel, addToFront = false) {\n let fieldType: string | undefined;\n\n if (field.type.type) {\n // intrinsic type\n fieldType = field.type.type;\n } else if (field.type.reference?.ref) {\n // model, enum, or type-def\n if (isTypeDef(field.type.reference.ref)) {\n fieldType = 'Json';\n } else {\n fieldType = field.type.reference.ref.name;\n }\n } else {\n // Unsupported type\n const unsupported = this.getUnsupportedFieldType(field.type);\n if (unsupported) {\n fieldType = unsupported;\n }\n }\n\n if (!fieldType) {\n throw new Error(`Field type is not resolved: ${field.$container.name}.${field.name}`);\n }\n\n const isArray =\n // typed-JSON fields should be translated to scalar Json type\n isTypeDef(field.type.reference?.ref) ? false : field.type.array;\n const type = new ModelFieldType(fieldType, isArray, field.type.optional);\n\n const attributes = field.attributes\n .filter((attr) => this.isPrismaAttribute(attr))\n // `@default` using `auth()` is handled outside Prisma\n .filter((attr) => !this.isDefaultWithAuthInvocation(attr))\n .filter(\n (attr) =>\n // when building physical schema, exclude `@default` for id fields inherited from delegate base\n !(\n ModelUtils.isIdField(field, contextModel) &&\n this.isInheritedFromDelegate(field, contextModel) &&\n attr.decl.$refText === '@default'\n ),\n )\n .map((attr) => this.makeFieldAttribute(attr));\n\n const docs = [...field.comments];\n const result = model.addField(field.name, type, attributes, docs, addToFront);\n return result;\n }\n\n private isDefaultWithAuthInvocation(attr: DataFieldAttribute) {\n if (attr.decl.ref?.name !== '@default') {\n return false;\n }\n\n const expr = attr.args[0]?.value;\n if (!expr) {\n return false;\n }\n\n return AstUtils.streamAst(expr).some(isAuthInvocation);\n }\n\n private isInheritedFromDelegate(field: DataField, contextModel: DataModel) {\n return field.$container !== contextModel && ModelUtils.isDelegateModel(field.$container);\n }\n\n private makeFieldAttribute(attr: DataFieldAttribute) {\n const attrName = attr.decl.ref!.name;\n return new PrismaFieldAttribute(\n attrName,\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 const argType = match(node.$type)\n .with(StringLiteral, () => 'String' as const)\n .with(NumberLiteral, () => 'Number' as const)\n .with(BooleanLiteral, () => 'Boolean' as const)\n .exhaustive();\n return new PrismaAttributeArgValue(argType, node.value);\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 node.target.ref!.name,\n node.args.map((arg) => new PrismaFieldReferenceArg(arg.name, this.exprToText(arg.value))),\n ),\n );\n } else if (isInvocationExpr(node)) {\n // invocation\n return new PrismaAttributeArgValue('FunctionCall', this.makeFunctionCall(node));\n } else {\n throw Error(`Unsupported attribute argument expression type: ${node.$type}`);\n }\n }\n\n private exprToText(expr: Expression) {\n return new ZModelCodeGenerator({ quote: 'double' }).generate(expr);\n }\n\n makeFunctionCall(node: InvocationExpr): PrismaFunctionCall {\n return new PrismaFunctionCall(\n node.function.ref!.name,\n node.args.map((arg) => {\n const val = match(arg.value)\n .when(isStringLiteral, (v) => `\"${v.value}\"`)\n .when(isLiteralExpr, (v) => v.value.toString())\n .when(isNullExpr, () => 'null')\n .otherwise(() => {\n throw new Error('Function call argument must be literal or null');\n });\n\n return new PrismaFunctionCallArg(val);\n }),\n );\n }\n\n private generateContainerAttribute(container: PrismaContainerDeclaration, attr: DataModelAttribute) {\n const attrName = attr.decl.ref!.name;\n container.attributes.push(\n new PrismaModelAttribute(\n attrName,\n attr.args.map((arg) => this.makeAttributeArg(arg)),\n ),\n );\n }\n\n private generateEnum(prisma: PrismaModel, decl: Enum) {\n const _enum = prisma.addEnum(decl.name);\n\n for (const field of decl.fields) {\n this.generateEnumField(_enum, field);\n }\n\n for (const attr of decl.attributes.filter((attr) => this.isPrismaAttribute(attr))) {\n this.generateContainerAttribute(_enum, attr);\n }\n\n // user defined comments pass-through\n decl.comments.forEach((c) => _enum.addComment(c));\n }\n\n private generateEnumField(_enum: PrismaEnum, field: EnumField) {\n const attributes = field.attributes\n .filter((attr) => this.isPrismaAttribute(attr))\n .map((attr) => this.makeFieldAttribute(attr));\n\n const docs = [...field.comments];\n _enum.addField(field.name, attributes, docs);\n }\n\n private generateDelegateRelationForBase(model: PrismaDataModel, decl: DataModel) {\n if (!isDelegateModel(decl)) {\n return;\n }\n\n // collect concrete models inheriting this model\n const concreteModels = this.getConcreteModels(decl);\n\n // generate an optional relation field in delegate base model to each concrete model\n concreteModels.forEach((concrete) => {\n const auxName = this.truncate(`${DELEGATE_AUX_RELATION_PREFIX}_${lowerCaseFirst(concrete.name)}`);\n model.addField(auxName, new ModelFieldType(concrete.name, false, true));\n });\n }\n\n private generateDelegateRelationForConcrete(model: PrismaDataModel, concreteDecl: DataModel) {\n // generate a relation field for each delegated base model\n const base = concreteDecl.baseModel?.ref;\n if (!base) {\n return;\n }\n\n const idFields = getIdFields(base);\n\n // add relation fields\n const relationField = this.truncate(`${DELEGATE_AUX_RELATION_PREFIX}_${lowerCaseFirst(base.name)}`);\n model.addField(relationField, base.name, [\n new PrismaFieldAttribute('@relation', [\n new PrismaAttributeArg(\n 'fields',\n new AttributeArgValue(\n 'Array',\n idFields.map(\n (idField) => new AttributeArgValue('FieldReference', new PrismaFieldReference(idField)),\n ),\n ),\n ),\n new PrismaAttributeArg(\n 'references',\n new AttributeArgValue(\n 'Array',\n idFields.map(\n (idField) => new AttributeArgValue('FieldReference', new PrismaFieldReference(idField)),\n ),\n ),\n ),\n new PrismaAttributeArg(\n 'onDelete',\n new AttributeArgValue('FieldReference', new PrismaFieldReference('Cascade')),\n ),\n new PrismaAttributeArg(\n 'onUpdate',\n new AttributeArgValue('FieldReference', new PrismaFieldReference('Cascade')),\n ),\n ]),\n ]);\n }\n\n private getConcreteModels(dataModel: DataModel): DataModel[] {\n if (!isDelegateModel(dataModel)) {\n return [];\n }\n return dataModel.$container.declarations.filter(\n (d): d is DataModel => isDataModel(d) && d !== dataModel && d.baseModel?.ref === dataModel,\n );\n }\n\n private truncate(name: string) {\n if (name.length <= IDENTIFIER_NAME_MAX_LENGTH) {\n return name;\n }\n\n const existing = this.shortNameMap.get(name);\n if (existing) {\n return existing;\n }\n\n const baseName = name.slice(0, IDENTIFIER_NAME_MAX_LENGTH);\n let index = 0;\n let shortName = `${baseName}_${index}`;\n\n while (true) {\n const conflict = Array.from(this.shortNameMap.values()).find((v) => v === shortName);\n if (!conflict) {\n this.shortNameMap.set(name, shortName);\n break;\n }\n\n // try next index\n index++;\n shortName = `${baseName}_${index}`;\n }\n\n return shortName;\n }\n}\n","// https://github.com/sindresorhus/indent-string\n\n/**\n * Utility for indenting strings\n */\nexport default function indentString(string: string, count = 4): string {\n const indent = ' ';\n return string.replace(/^(?!\\s*$)/gm, indent.repeat(count));\n}\n","import indentString from './indent-string';\n\n/**\n * Field used by datasource and generator declarations.\n */\nexport type SimpleField = { name: string; text: 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, fields: SimpleField[] = []): DataSource {\n const ds = new DataSource(name, fields);\n this.datasources.push(ds);\n return ds;\n }\n\n addGenerator(name: string, fields: SimpleField[]): 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, false);\n this.models.push(model);\n return model;\n }\n\n addView(name: string): Model {\n const model = new Model(name, true);\n this.models.push(model);\n return model;\n }\n\n addEnum(name: string): Enum {\n const e = new Enum(name);\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 fields: SimpleField[] = [],\n ) {}\n\n toString(): string {\n return (\n `datasource ${this.name} {\\n` +\n this.fields.map((f) => indentString(`${f.name} = ${f.text}`)).join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class Generator {\n constructor(\n public name: string,\n public fields: SimpleField[],\n ) {}\n\n toString(): string {\n return (\n `generator ${this.name} {\\n` +\n this.fields.map((f) => indentString(`${f.name} = ${f.text}`)).join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class DeclarationBase {\n constructor(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}\n\nexport class ContainerDeclaration extends DeclarationBase {\n constructor(\n documentations: string[] = [],\n public attributes: (ContainerAttribute | PassThroughAttribute)[] = [],\n ) {\n super(documentations);\n }\n}\n\nexport class FieldDeclaration extends DeclarationBase {\n constructor(\n documentations: string[] = [],\n public attributes: (FieldAttribute | PassThroughAttribute)[] = [],\n ) {\n super(documentations);\n }\n}\n\nexport class Model extends ContainerDeclaration {\n public fields: ModelField[] = [];\n constructor(\n public name: string,\n public isView: boolean,\n documentations: string[] = [],\n ) {\n super(documentations);\n }\n\n addField(\n name: string,\n type: ModelFieldType | string,\n attributes: (FieldAttribute | PassThroughAttribute)[] = [],\n documentations: string[] = [],\n addToFront = false,\n ): ModelField {\n const field = new ModelField(name, type, attributes, documentations);\n if (addToFront) {\n this.fields.unshift(field);\n } else {\n this.fields.push(field);\n }\n return field;\n }\n\n addAttribute(name: string, args: AttributeArg[] = []) {\n const attr = new ContainerAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n override toString(): string {\n const result: any[] = [...this.fields];\n\n if (this.attributes.length > 0) {\n // Add a blank line before the attributes\n result.push('');\n }\n\n result.push(...this.attributes);\n\n return (\n super.toString() +\n `${this.isView ? 'view' : 'model'} ${this.name} {\\n` +\n indentString(result.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(\n public type: ScalarTypes | string,\n public array?: boolean,\n public optional?: boolean,\n ) {}\n\n toString(): string {\n return `${this.type}${this.array ? '[]' : ''}${this.optional ? '?' : ''}`;\n }\n}\n\nexport class ModelField extends FieldDeclaration {\n constructor(\n public name: string,\n public type: ModelFieldType | string,\n attributes: (FieldAttribute | PassThroughAttribute)[] = [],\n documentations: string[] = [],\n ) {\n super(documentations, attributes);\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 override 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(\n public name: string,\n public args: AttributeArg[] = [],\n ) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class ContainerAttribute {\n constructor(\n public name: string,\n public args: AttributeArg[] = [],\n ) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\n/**\n * Represents @@prisma.passthrough and @prisma.passthrough\n */\nexport class PassThroughAttribute {\n constructor(public text: string) {}\n\n toString(): string {\n return this.text;\n }\n}\n\nexport class AttributeArg {\n constructor(\n public name: string | undefined,\n public value: AttributeArgValue,\n ) {}\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' && typeof value !== 'string')\n throw new Error('Value must be number or string');\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 // use JSON.stringify to escape quotes\n return JSON.stringify(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(\n public field: string,\n public args: FieldReferenceArg[] = [],\n ) {}\n}\n\nexport class FieldReferenceArg {\n constructor(\n public name: string,\n public value: string,\n ) {}\n\n toString(): string {\n return `${this.name}: ${this.value}`;\n }\n}\n\nexport class FunctionCall {\n constructor(\n public func: string,\n public args: FunctionCallArg[] = [],\n ) {}\n\n toString(): string {\n return `${this.func}` + '(' + this.args.map((a) => a.toString()).join(', ') + ')';\n }\n}\n\nexport class FunctionCallArg {\n constructor(public value: string) {}\n\n toString(): string {\n return this.value;\n }\n}\n\nexport class Enum extends ContainerDeclaration {\n public fields: EnumField[] = [];\n\n constructor(\n public name: string,\n documentations: string[] = [],\n ) {\n super(documentations);\n }\n addField(\n name: string,\n attributes: (FieldAttribute | PassThroughAttribute)[] = [],\n documentations: string[] = [],\n ): EnumField {\n const field = new EnumField(name, attributes, documentations);\n this.fields.push(field);\n return field;\n }\n\n addAttribute(name: string, args: AttributeArg[] = []) {\n const attr = new ContainerAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n override addComment(name: string): string {\n this.documentations.push(name);\n return name;\n }\n\n override toString(): string {\n return (\n super.toString() +\n `enum ${this.name} {\\n` +\n indentString([...this.fields, ...this.attributes].map((d) => d.toString()).join('\\n')) +\n '\\n}'\n );\n }\n}\n\nexport class EnumField extends DeclarationBase {\n constructor(\n public name: string,\n public attributes: (FieldAttribute | PassThroughAttribute)[] = [],\n documentations: string[] = [],\n ) {\n super(documentations);\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 override toString(): string {\n return (\n super.toString() +\n this.name +\n (this.attributes.length > 0 ? ' ' + this.attributes.map((a) => a.toString()).join(' ') : '')\n );\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n ArrayExpr,\n AttributeArg,\n BinaryExpr,\n DataField,\n DataFieldAttribute,\n DataFieldType,\n DataModel,\n DataModelAttribute,\n Enum,\n Expression,\n InvocationExpr,\n isArrayExpr,\n isBinaryExpr,\n isDataField,\n isDataModel,\n isDataSource,\n isEnum,\n isEnumField,\n isInvocationExpr,\n isLiteralExpr,\n isMemberAccessExpr,\n isNullExpr,\n isProcedure,\n isReferenceExpr,\n isThisExpr,\n isTypeDef,\n isUnaryExpr,\n LiteralExpr,\n MemberAccessExpr,\n Procedure,\n ReferenceExpr,\n TypeDef,\n UnaryExpr,\n type Model,\n} from '@zenstackhq/language/ast';\nimport { getAllAttributes, getAllFields, isDataFieldReference } from '@zenstackhq/language/utils';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { match } from 'ts-pattern';\nimport * as ts from 'typescript';\nimport { ModelUtils } from '.';\nimport {\n getAttribute,\n getAuthDecl,\n getIdFields,\n hasAttribute,\n isDelegateModel,\n isIdField,\n isUniqueField,\n} from './model-utils';\n\nexport type TsSchemaGeneratorOptions = {\n outDir: string;\n lite?: boolean;\n liteOnly?: boolean;\n};\n\nexport class TsSchemaGenerator {\n private usedExpressionUtils = false;\n\n async generate(model: Model, options: TsSchemaGeneratorOptions) {\n fs.mkdirSync(options.outDir, { recursive: true });\n\n // Reset the flag for each generation\n this.usedExpressionUtils = false;\n\n // the schema itself\n this.generateSchema(model, options);\n\n // the model types\n this.generateModelsAndTypeDefs(model, options);\n\n // the input types\n this.generateInputTypes(model, options);\n }\n\n private generateSchema(model: Model, options: TsSchemaGeneratorOptions) {\n const targets: { lite: boolean; file: string }[] = [];\n if (!options.liteOnly) {\n targets.push({ lite: false, file: 'schema.ts' });\n }\n if (options.lite || options.liteOnly) {\n targets.push({ lite: true, file: 'schema-lite.ts' });\n }\n\n for (const { lite, file } of targets) {\n const statements: ts.Statement[] = [];\n this.generateSchemaStatements(model, statements, lite);\n this.generateBannerComments(statements);\n\n const schemaOutputFile = path.join(options.outDir, file);\n const sourceFile = ts.createSourceFile(\n schemaOutputFile,\n '',\n ts.ScriptTarget.ESNext,\n false,\n ts.ScriptKind.TS,\n );\n const printer = ts.createPrinter();\n const result = printer.printList(\n ts.ListFormat.MultiLine,\n ts.factory.createNodeArray(statements),\n sourceFile,\n );\n fs.writeFileSync(schemaOutputFile, result);\n }\n }\n\n private generateSchemaStatements(model: Model, statements: ts.Statement[], lite: boolean) {\n const hasComputedFields = model.declarations.some(\n (d) => isDataModel(d) && d.fields.some((f) => hasAttribute(f, '@computed')),\n );\n\n // Generate schema content first to determine if ExpressionUtils is needed\n const schemaObject = this.createSchemaObject(model, lite);\n\n // Now generate the import declaration with the correct imports\n const runtimeImportDecl = ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n false,\n undefined,\n ts.factory.createNamedImports([\n ts.factory.createImportSpecifier(true, undefined, ts.factory.createIdentifier('SchemaDef')),\n ...(hasComputedFields\n ? [\n ts.factory.createImportSpecifier(\n true,\n undefined,\n ts.factory.createIdentifier('OperandExpression'),\n ),\n ]\n : []),\n ...(this.usedExpressionUtils\n ? [\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier('ExpressionUtils'),\n ),\n ]\n : []),\n ]),\n ),\n ts.factory.createStringLiteral('@zenstackhq/orm/schema'),\n );\n statements.push(runtimeImportDecl);\n\n const declaration = ts.factory.createVariableStatement(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n ts.factory.createVariableDeclarationList(\n [\n ts.factory.createVariableDeclaration(\n 'schema',\n undefined,\n undefined,\n ts.factory.createSatisfiesExpression(\n ts.factory.createAsExpression(schemaObject, ts.factory.createTypeReferenceNode('const')),\n ts.factory.createTypeReferenceNode('SchemaDef'),\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n );\n statements.push(declaration);\n\n // create statement \"export type SchemaType = typeof schema;\"\n const typeDeclaration = ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n 'SchemaType',\n undefined,\n ts.factory.createTypeReferenceNode('typeof schema'),\n );\n statements.push(typeDeclaration);\n }\n\n private createExpressionUtilsCall(method: string, args?: ts.Expression[]): ts.CallExpression {\n this.usedExpressionUtils = true;\n return ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier('ExpressionUtils'), method),\n undefined,\n args || [],\n );\n }\n\n private createSchemaObject(model: Model, lite: boolean): ts.Expression {\n const properties: ts.PropertyAssignment[] = [\n // provider\n ts.factory.createPropertyAssignment('provider', this.createProviderObject(model)),\n\n // models\n ts.factory.createPropertyAssignment('models', this.createModelsObject(model, lite)),\n\n // typeDefs\n ...(model.declarations.some(isTypeDef)\n ? [ts.factory.createPropertyAssignment('typeDefs', this.createTypeDefsObject(model, lite))]\n : []),\n ];\n\n // enums\n const enums = model.declarations.filter(isEnum);\n if (enums.length > 0) {\n properties.push(\n ts.factory.createPropertyAssignment(\n 'enums',\n ts.factory.createObjectLiteralExpression(\n enums.map((e) => ts.factory.createPropertyAssignment(e.name, this.createEnumObject(e))),\n true,\n ),\n ),\n );\n }\n\n // authType\n const authType = getAuthDecl(model);\n if (authType) {\n properties.push(ts.factory.createPropertyAssignment('authType', this.createLiteralNode(authType.name)));\n }\n\n // procedures\n const procedures = model.declarations.filter(isProcedure);\n if (procedures.length > 0) {\n properties.push(ts.factory.createPropertyAssignment('procedures', this.createProceduresObject(procedures)));\n }\n\n // plugins\n properties.push(\n ts.factory.createPropertyAssignment('plugins', ts.factory.createObjectLiteralExpression([], true)),\n );\n\n return ts.factory.createObjectLiteralExpression(properties, true);\n }\n\n private createProviderObject(model: Model): ts.Expression {\n const dsProvider = this.getDataSourceProvider(model);\n return ts.factory.createObjectLiteralExpression(\n [ts.factory.createPropertyAssignment('type', ts.factory.createStringLiteral(dsProvider.type))],\n true,\n );\n }\n\n private createModelsObject(model: Model, lite: boolean): ts.Expression {\n return ts.factory.createObjectLiteralExpression(\n model.declarations\n .filter((d): d is DataModel => isDataModel(d) && !hasAttribute(d, '@@ignore'))\n .map((dm) => ts.factory.createPropertyAssignment(dm.name, this.createDataModelObject(dm, lite))),\n true,\n );\n }\n\n private createTypeDefsObject(model: Model, lite: boolean): ts.Expression {\n return ts.factory.createObjectLiteralExpression(\n model.declarations\n .filter((d): d is TypeDef => isTypeDef(d))\n .map((td) => ts.factory.createPropertyAssignment(td.name, this.createTypeDefObject(td, lite))),\n true,\n );\n }\n\n private createDataModelObject(dm: DataModel, lite: boolean) {\n const allFields = getAllFields(dm);\n const allAttributes = lite\n ? [] // in lite mode, skip all model-level attributes\n : getAllAttributes(dm).filter((attr) => {\n // exclude `@@delegate` attribute from base model\n if (attr.decl.$refText === '@@delegate' && attr.$container !== dm) {\n return false;\n }\n return true;\n });\n const subModels = this.getSubModels(dm);\n\n const fields: ts.PropertyAssignment[] = [\n // name\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(dm.name)),\n\n // baseModel\n ...(dm.baseModel\n ? [\n ts.factory.createPropertyAssignment(\n 'baseModel',\n ts.factory.createStringLiteral(dm.baseModel.$refText),\n ),\n ]\n : []),\n\n // fields\n ts.factory.createPropertyAssignment(\n 'fields',\n ts.factory.createObjectLiteralExpression(\n allFields.map((field) =>\n ts.factory.createPropertyAssignment(field.name, this.createDataFieldObject(field, dm, lite)),\n ),\n true,\n ),\n ),\n\n // attributes\n ...(allAttributes.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'attributes',\n ts.factory.createArrayLiteralExpression(\n allAttributes.map((attr) => this.createAttributeObject(attr)),\n true,\n ),\n ),\n ]\n : []),\n\n // idFields\n ts.factory.createPropertyAssignment(\n 'idFields',\n ts.factory.createArrayLiteralExpression(\n getIdFields(dm).map((idField) => ts.factory.createStringLiteral(idField)),\n ),\n ),\n\n // uniqueFields\n ts.factory.createPropertyAssignment('uniqueFields', this.createUniqueFieldsObject(dm)),\n\n // isDelegate\n ...(isDelegateModel(dm)\n ? [ts.factory.createPropertyAssignment('isDelegate', ts.factory.createTrue())]\n : []),\n\n // subModels\n ...(subModels.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'subModels',\n ts.factory.createArrayLiteralExpression(\n subModels.map((subModel) => ts.factory.createStringLiteral(subModel)),\n ),\n ),\n ]\n : []),\n\n ...(dm.isView ? [ts.factory.createPropertyAssignment('isView', ts.factory.createTrue())] : []),\n ];\n\n const computedFields = dm.fields.filter((f) => hasAttribute(f, '@computed'));\n\n if (computedFields.length > 0) {\n fields.push(\n ts.factory.createPropertyAssignment('computedFields', this.createComputedFieldsObject(computedFields)),\n );\n }\n\n return ts.factory.createObjectLiteralExpression(fields, true);\n }\n\n private getSubModels(dm: DataModel) {\n return dm.$container.declarations\n .filter(isDataModel)\n .filter((d) => d.baseModel?.ref === dm)\n .map((d) => d.name);\n }\n\n private createTypeDefObject(td: TypeDef, lite: boolean): ts.Expression {\n const allFields = getAllFields(td);\n const allAttributes = getAllAttributes(td);\n\n const fields: ts.PropertyAssignment[] = [\n // name\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(td.name)),\n\n // fields\n ts.factory.createPropertyAssignment(\n 'fields',\n ts.factory.createObjectLiteralExpression(\n allFields.map((field) =>\n ts.factory.createPropertyAssignment(\n field.name,\n this.createDataFieldObject(field, undefined, lite),\n ),\n ),\n true,\n ),\n ),\n\n // attributes\n ...(allAttributes.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'attributes',\n ts.factory.createArrayLiteralExpression(\n allAttributes.map((attr) => this.createAttributeObject(attr)),\n true,\n ),\n ),\n ]\n : []),\n ];\n\n return ts.factory.createObjectLiteralExpression(fields, true);\n }\n\n private createComputedFieldsObject(fields: DataField[]) {\n return ts.factory.createObjectLiteralExpression(\n fields.map((field) =>\n ts.factory.createMethodDeclaration(\n undefined,\n undefined,\n field.name,\n undefined,\n undefined,\n [\n // parameter: `context: { modelAlias: string }`\n ts.factory.createParameterDeclaration(\n undefined,\n undefined,\n '_context',\n undefined,\n ts.factory.createTypeLiteralNode([\n ts.factory.createPropertySignature(\n undefined,\n 'modelAlias',\n undefined,\n ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),\n ),\n ]),\n undefined,\n ),\n ],\n ts.factory.createTypeReferenceNode('OperandExpression', [\n ts.factory.createTypeReferenceNode(this.mapFieldTypeToTSType(field.type)),\n ]),\n ts.factory.createBlock(\n [\n ts.factory.createThrowStatement(\n ts.factory.createNewExpression(ts.factory.createIdentifier('Error'), undefined, [\n ts.factory.createStringLiteral('This is a stub for computed field'),\n ]),\n ),\n ],\n true,\n ),\n ),\n ),\n true,\n );\n }\n\n private mapFieldTypeToTSType(type: DataFieldType) {\n let result = match(type.type)\n .with('String', () => 'string')\n .with('Boolean', () => 'boolean')\n .with('Int', () => 'number')\n .with('Float', () => 'number')\n .with('BigInt', () => 'bigint')\n .with('Decimal', () => 'number')\n .otherwise(() => 'unknown');\n if (type.array) {\n result = `${result}[]`;\n }\n if (type.optional) {\n result = `${result} | null`;\n }\n return result;\n }\n\n private createDataFieldObject(field: DataField, contextModel: DataModel | undefined, lite: boolean) {\n const objectFields = [\n // name\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(field.name)),\n // type\n ts.factory.createPropertyAssignment('type', this.generateFieldTypeLiteral(field)),\n ];\n\n if (contextModel && ModelUtils.isIdField(field, contextModel)) {\n objectFields.push(ts.factory.createPropertyAssignment('id', ts.factory.createTrue()));\n }\n\n if (isUniqueField(field)) {\n objectFields.push(ts.factory.createPropertyAssignment('unique', ts.factory.createTrue()));\n }\n\n if (field.type.optional) {\n objectFields.push(ts.factory.createPropertyAssignment('optional', ts.factory.createTrue()));\n }\n\n if (field.type.array) {\n objectFields.push(ts.factory.createPropertyAssignment('array', ts.factory.createTrue()));\n }\n\n if (hasAttribute(field, '@updatedAt')) {\n objectFields.push(ts.factory.createPropertyAssignment('updatedAt', ts.factory.createTrue()));\n }\n\n // originModel\n if (\n contextModel &&\n // id fields are duplicated in inherited models\n !isIdField(field, contextModel) &&\n field.$container !== contextModel &&\n isDelegateModel(field.$container)\n ) {\n // field is inherited from delegate\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'originModel',\n ts.factory.createStringLiteral(field.$container.name),\n ),\n );\n }\n\n // discriminator\n if (this.isDiscriminatorField(field)) {\n objectFields.push(ts.factory.createPropertyAssignment('isDiscriminator', ts.factory.createTrue()));\n }\n\n // attributes, only when not in lite mode\n if (!lite && field.attributes.length > 0) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'attributes',\n ts.factory.createArrayLiteralExpression(\n field.attributes.map((attr) => this.createAttributeObject(attr)),\n ),\n ),\n );\n }\n\n const defaultValue = this.getFieldMappedDefault(field);\n if (defaultValue !== undefined) {\n if (typeof defaultValue === 'object' && !Array.isArray(defaultValue)) {\n if ('call' in defaultValue) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n\n this.createExpressionUtilsCall('call', [\n ts.factory.createStringLiteral(defaultValue.call),\n ...(defaultValue.args.length > 0\n ? [\n ts.factory.createArrayLiteralExpression(\n defaultValue.args.map((arg) =>\n this.createExpressionUtilsCall('literal', [\n this.createLiteralNode(arg),\n ]),\n ),\n ),\n ]\n : []),\n ]),\n ),\n );\n } else if ('authMember' in defaultValue) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n this.createExpressionUtilsCall('member', [\n this.createExpressionUtilsCall('call', [ts.factory.createStringLiteral('auth')]),\n ts.factory.createArrayLiteralExpression(\n defaultValue.authMember.map((m) => ts.factory.createStringLiteral(m)),\n ),\n ]),\n ),\n );\n } else {\n throw new Error(`Unsupported default value type for field ${field.name}`);\n }\n } else {\n if (Array.isArray(defaultValue)) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n ts.factory.createArrayLiteralExpression(\n defaultValue.map((item) => this.createLiteralNode(item as any)),\n ),\n ),\n );\n } else {\n objectFields.push(\n ts.factory.createPropertyAssignment('default', this.createLiteralNode(defaultValue)),\n );\n }\n }\n }\n\n if (hasAttribute(field, '@computed')) {\n objectFields.push(ts.factory.createPropertyAssignment('computed', ts.factory.createTrue()));\n }\n\n if (isDataModel(field.type.reference?.ref)) {\n objectFields.push(ts.factory.createPropertyAssignment('relation', this.createRelationObject(field)));\n }\n\n const fkFor = this.getForeignKeyFor(field);\n if (fkFor && fkFor.length > 0) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'foreignKeyFor',\n ts.factory.createArrayLiteralExpression(\n fkFor.map((fk) => ts.factory.createStringLiteral(fk)),\n true,\n ),\n ),\n );\n }\n\n return ts.factory.createObjectLiteralExpression(objectFields, true);\n }\n\n private isDiscriminatorField(field: DataField) {\n const origin = field.$container;\n return getAttribute(origin, '@@delegate')?.args.some(\n (arg) =>\n arg.$resolvedParam.name === 'discriminator' &&\n isDataFieldReference(arg.value) &&\n arg.value.target.ref === field,\n );\n }\n\n private getDataSourceProvider(model: Model) {\n const dataSource = model.declarations.find(isDataSource);\n invariant(dataSource, 'No data source found in the model');\n\n const providerExpr = dataSource.fields.find((f) => f.name === 'provider')?.value;\n invariant(isLiteralExpr(providerExpr), 'Provider must be a literal');\n const type = providerExpr.value as string;\n return { type };\n }\n\n private getFieldMappedDefault(\n field: DataField,\n ): string | number | boolean | unknown[] | { call: string; args: any[] } | { authMember: string[] } | undefined {\n const defaultAttr = getAttribute(field, '@default');\n if (!defaultAttr) {\n return undefined;\n }\n const defaultValue = defaultAttr.args[0]?.value;\n invariant(defaultValue, 'Expected a default value');\n return this.getMappedValue(defaultValue, field.type);\n }\n\n private getMappedValue(\n expr: Expression,\n fieldType: DataFieldType,\n ): string | number | boolean | unknown[] | { call: string; args: any[] } | { authMember: string[] } | undefined {\n if (isLiteralExpr(expr)) {\n const lit = (expr as LiteralExpr).value;\n return fieldType.type === 'Boolean'\n ? (lit as boolean)\n : ['Int', 'Float', 'Decimal', 'BigInt'].includes(fieldType.type!)\n ? Number(lit)\n : lit;\n } else if (isArrayExpr(expr)) {\n return expr.items.map((item) => this.getMappedValue(item, fieldType));\n } else if (isReferenceExpr(expr) && isEnumField(expr.target.ref)) {\n return expr.target.ref.name;\n } else if (isInvocationExpr(expr)) {\n return {\n call: expr.function.$refText,\n args: expr.args.map((arg) => this.getLiteral(arg.value)),\n };\n } else if (this.isAuthMemberAccess(expr)) {\n return {\n authMember: this.getMemberAccessChain(expr),\n };\n } else {\n throw new Error(`Unsupported default value type for ${expr.$type}`);\n }\n }\n\n private getMemberAccessChain(expr: MemberAccessExpr): string[] {\n if (!isMemberAccessExpr(expr.operand)) {\n return [expr.member.$refText];\n } else {\n return [...this.getMemberAccessChain(expr.operand), expr.member.$refText];\n }\n }\n\n private isAuthMemberAccess(expr: Expression): expr is MemberAccessExpr {\n if (isMemberAccessExpr(expr)) {\n return this.isAuthInvocation(expr.operand) || this.isAuthMemberAccess(expr.operand);\n } else {\n return false;\n }\n }\n\n private isAuthInvocation(expr: Expression) {\n return (\n isInvocationExpr(expr) && expr.function.$refText === 'auth' && ModelUtils.isFromStdlib(expr.function.ref!)\n );\n }\n\n private createRelationObject(field: DataField) {\n const relationFields: ts.PropertyAssignment[] = [];\n\n const oppositeRelation = this.getOppositeRelationField(field);\n if (oppositeRelation) {\n relationFields.push(\n ts.factory.createPropertyAssignment('opposite', ts.factory.createStringLiteral(oppositeRelation.name)),\n );\n }\n\n const relationName = this.getRelationName(field);\n if (relationName) {\n relationFields.push(\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(relationName)),\n );\n }\n\n const relation = getAttribute(field, '@relation');\n if (relation) {\n for (const arg of relation.args) {\n const param = arg.$resolvedParam.name;\n if (param === 'fields' || param === 'references') {\n const fieldNames = this.getReferenceNames(arg.value);\n if (fieldNames) {\n relationFields.push(\n ts.factory.createPropertyAssignment(\n param,\n ts.factory.createArrayLiteralExpression(\n fieldNames.map((el) => ts.factory.createStringLiteral(el)),\n ),\n ),\n );\n }\n }\n\n if (param === 'onDelete' || param === 'onUpdate') {\n const action = (arg.value as ReferenceExpr).target.$refText;\n relationFields.push(\n ts.factory.createPropertyAssignment(param, ts.factory.createStringLiteral(action)),\n );\n }\n }\n }\n\n return ts.factory.createObjectLiteralExpression(relationFields);\n }\n\n private getReferenceNames(expr: Expression) {\n return isArrayExpr(expr) && expr.items.map((item) => (item as ReferenceExpr).target.$refText);\n }\n\n private getForeignKeyFor(field: DataField) {\n const result: string[] = [];\n for (const f of field.$container.fields) {\n const relation = getAttribute(f, '@relation');\n if (relation) {\n for (const arg of relation.args) {\n if (\n arg.name === 'fields' &&\n isArrayExpr(arg.value) &&\n arg.value.items.some((el) => isReferenceExpr(el) && el.target.ref === field)\n ) {\n result.push(f.name);\n }\n }\n }\n }\n return result;\n }\n\n private getOppositeRelationField(field: DataField) {\n if (!field.type.reference?.ref || !isDataModel(field.type.reference?.ref)) {\n return undefined;\n }\n\n const sourceModel = field.$container as DataModel;\n const targetModel = field.type.reference.ref as DataModel;\n const relationName = this.getRelationName(field);\n for (const otherField of targetModel.fields) {\n if (otherField === field) {\n // backlink field is never self\n continue;\n }\n if (otherField.type.reference?.ref === sourceModel) {\n if (relationName) {\n // if relation has a name, the opposite side must match\n const otherRelationName = this.getRelationName(otherField);\n if (otherRelationName === relationName) {\n return otherField;\n }\n } else {\n return otherField;\n }\n }\n }\n return undefined;\n }\n\n private getRelationName(field: DataField) {\n const relation = getAttribute(field, '@relation');\n if (relation) {\n const nameArg = relation.args.find((arg) => arg.$resolvedParam.name === 'name');\n if (nameArg) {\n invariant(isLiteralExpr(nameArg.value), 'name must be a literal');\n return nameArg.value.value as string;\n }\n }\n return undefined;\n }\n\n private createUniqueFieldsObject(dm: DataModel) {\n const properties: ts.PropertyAssignment[] = [];\n\n // field-level id and unique\n const allFields = getAllFields(dm);\n for (const field of allFields) {\n if (hasAttribute(field, '@id') || hasAttribute(field, '@unique')) {\n properties.push(\n ts.factory.createPropertyAssignment(\n field.name,\n ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment('type', this.generateFieldTypeLiteral(field)),\n ]),\n ),\n );\n }\n }\n\n // model-level id and unique\n const allAttributes = getAllAttributes(dm);\n\n // it's possible to have the same set of fields in both `@@id` and `@@unique`\n // so we need to deduplicate them\n const seenKeys = new Set<string>();\n for (const attr of allAttributes) {\n if (attr.decl.$refText === '@@id' || attr.decl.$refText === '@@unique') {\n const fieldNames = this.getReferenceNames(attr.args[0]!.value);\n if (!fieldNames) {\n continue;\n }\n\n if (fieldNames.length === 1) {\n // single-field unique\n const fieldDef = allFields.find((f) => f.name === fieldNames[0])!;\n properties.push(\n ts.factory.createPropertyAssignment(\n fieldNames[0]!,\n ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment('type', this.generateFieldTypeLiteral(fieldDef)),\n ]),\n ),\n );\n } else {\n // multi-field unique\n const key = this.getCompoundUniqueKey(attr, fieldNames);\n if (seenKeys.has(key)) {\n continue;\n }\n seenKeys.add(key);\n properties.push(\n ts.factory.createPropertyAssignment(\n key,\n ts.factory.createObjectLiteralExpression(\n fieldNames.map((field) => {\n const fieldDef = allFields.find((f) => f.name === field)!;\n return ts.factory.createPropertyAssignment(\n field,\n ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment(\n 'type',\n this.generateFieldTypeLiteral(fieldDef),\n ),\n ]),\n );\n }),\n ),\n ),\n );\n }\n }\n }\n\n return ts.factory.createObjectLiteralExpression(properties, true);\n }\n\n private getCompoundUniqueKey(attr: DataModelAttribute, fieldNames: string[]) {\n const nameArg = attr.args.find((arg) => arg.$resolvedParam.name === 'name');\n if (nameArg && isLiteralExpr(nameArg.value)) {\n return nameArg.value.value as string;\n } else {\n return fieldNames.join('_');\n }\n }\n\n private generateFieldTypeLiteral(field: DataField): ts.Expression {\n invariant(\n field.type.type || field.type.reference || field.type.unsupported,\n 'Field type must be a primitive, reference, or Unsupported',\n );\n\n return field.type.type\n ? ts.factory.createStringLiteral(field.type.type)\n : field.type.reference\n ? ts.factory.createStringLiteral(field.type.reference.$refText)\n : // `Unsupported` type\n ts.factory.createStringLiteral('Unsupported');\n }\n\n private createEnumObject(e: Enum) {\n return ts.factory.createObjectLiteralExpression(\n e.fields.map((field) =>\n ts.factory.createPropertyAssignment(field.name, ts.factory.createStringLiteral(field.name)),\n ),\n true,\n );\n }\n\n private getLiteral(expr: Expression) {\n if (!isLiteralExpr(expr)) {\n throw new Error('Expected a literal expression');\n }\n switch (expr?.$type) {\n case 'StringLiteral':\n case 'BooleanLiteral':\n return expr.value;\n case 'NumberLiteral':\n return parseFloat(expr.value);\n default:\n throw new Error('Unsupported literal type');\n }\n }\n\n private createLiteralNode(arg: string | number | boolean | null): any {\n return arg === null\n ? ts.factory.createNull()\n : typeof arg === 'string'\n ? ts.factory.createStringLiteral(arg)\n : typeof arg === 'number'\n ? ts.factory.createNumericLiteral(arg)\n : arg === true\n ? ts.factory.createTrue()\n : arg === false\n ? ts.factory.createFalse()\n : undefined;\n }\n\n private createProceduresObject(procedures: Procedure[]) {\n return ts.factory.createObjectLiteralExpression(\n procedures.map((proc) => ts.factory.createPropertyAssignment(proc.name, this.createProcedureObject(proc))),\n true,\n );\n }\n\n private createProcedureObject(proc: Procedure) {\n const params = ts.factory.createArrayLiteralExpression(\n proc.params.map((param) =>\n ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(param.name)),\n ...(param.optional\n ? [ts.factory.createPropertyAssignment('optional', ts.factory.createTrue())]\n : []),\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(param.type.type ?? param.type.reference!.$refText),\n ),\n ]),\n ),\n true,\n );\n\n const paramsType = ts.factory.createTupleTypeNode([\n ...proc.params.map((param) =>\n ts.factory.createNamedTupleMember(\n undefined,\n ts.factory.createIdentifier(param.name),\n undefined,\n ts.factory.createTypeLiteralNode([\n ts.factory.createPropertySignature(\n undefined,\n ts.factory.createStringLiteral('name'),\n undefined,\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(param.name)),\n ),\n ts.factory.createPropertySignature(\n undefined,\n ts.factory.createStringLiteral('type'),\n undefined,\n ts.factory.createLiteralTypeNode(\n ts.factory.createStringLiteral(param.type.type ?? param.type.reference!.$refText),\n ),\n ),\n ...(param.optional\n ? [\n ts.factory.createPropertySignature(\n undefined,\n ts.factory.createStringLiteral('optional'),\n undefined,\n ts.factory.createLiteralTypeNode(ts.factory.createTrue()),\n ),\n ]\n : []),\n ]),\n ),\n ),\n ]);\n\n return ts.factory.createObjectLiteralExpression(\n [\n ts.factory.createPropertyAssignment('params', ts.factory.createAsExpression(params, paramsType)),\n ts.factory.createPropertyAssignment(\n 'returnType',\n ts.factory.createStringLiteral(proc.returnType.type ?? proc.returnType.reference!.$refText),\n ),\n ...(proc.mutation ? [ts.factory.createPropertyAssignment('mutation', ts.factory.createTrue())] : []),\n ],\n true,\n );\n }\n\n private generateBannerComments(statements: ts.Statement[]) {\n const banner = `////////////////////////////////////////////////////////////////////////////////////////////\n// DO NOT MODIFY THIS FILE //\n// This file is automatically generated by ZenStack CLI and should not be manually updated. //\n//////////////////////////////////////////////////////////////////////////////////////////////\n\n/* eslint-disable */\n\n`;\n ts.addSyntheticLeadingComment(statements[0]!, ts.SyntaxKind.SingleLineCommentTrivia, banner);\n }\n\n private createAttributeObject(attr: DataModelAttribute | DataFieldAttribute): ts.Expression {\n return ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(attr.decl.$refText)),\n ...(attr.args.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'args',\n ts.factory.createArrayLiteralExpression(attr.args.map((arg) => this.createAttributeArg(arg))),\n ),\n ]\n : []),\n ]);\n }\n\n private createAttributeArg(arg: AttributeArg): ts.Expression {\n return ts.factory.createObjectLiteralExpression([\n // name\n ...(arg.$resolvedParam?.name\n ? [ts.factory.createPropertyAssignment('name', ts.factory.createStringLiteral(arg.$resolvedParam.name))]\n : []),\n\n // value\n ts.factory.createPropertyAssignment('value', this.createExpression(arg.value)),\n ]);\n }\n\n private createExpression(value: Expression): ts.Expression {\n return match(value)\n .when(isLiteralExpr, (expr) => this.createLiteralExpression(expr.$type, expr.value))\n .when(isInvocationExpr, (expr) => this.createCallExpression(expr))\n .when(isReferenceExpr, (expr) => this.createRefExpression(expr))\n .when(isArrayExpr, (expr) => this.createArrayExpression(expr))\n .when(isUnaryExpr, (expr) => this.createUnaryExpression(expr))\n .when(isBinaryExpr, (expr) => this.createBinaryExpression(expr))\n .when(isMemberAccessExpr, (expr) => this.createMemberExpression(expr))\n .when(isNullExpr, () => this.createNullExpression())\n .when(isThisExpr, () => this.createThisExpression())\n .otherwise(() => {\n throw new Error(`Unsupported attribute arg value: ${value.$type}`);\n });\n }\n\n private createThisExpression() {\n return this.createExpressionUtilsCall('_this');\n }\n\n private createMemberExpression(expr: MemberAccessExpr) {\n const members: string[] = [];\n\n // turn nested member access expression into a flat list of members\n let current: Expression = expr;\n while (isMemberAccessExpr(current)) {\n members.unshift(current.member.$refText);\n current = current.operand;\n }\n const receiver = current;\n\n const args = [\n this.createExpression(receiver),\n ts.factory.createArrayLiteralExpression(members.map((m) => ts.factory.createStringLiteral(m))),\n ];\n\n return this.createExpressionUtilsCall('member', args);\n }\n\n private createNullExpression() {\n return this.createExpressionUtilsCall('_null');\n }\n\n private createBinaryExpression(expr: BinaryExpr) {\n return this.createExpressionUtilsCall('binary', [\n this.createExpression(expr.left),\n this.createLiteralNode(expr.operator),\n this.createExpression(expr.right),\n ]);\n }\n\n private createUnaryExpression(expr: UnaryExpr) {\n return this.createExpressionUtilsCall('unary', [\n this.createLiteralNode(expr.operator),\n this.createExpression(expr.operand),\n ]);\n }\n\n private createArrayExpression(expr: ArrayExpr): any {\n return this.createExpressionUtilsCall('array', [\n ts.factory.createArrayLiteralExpression(expr.items.map((item) => this.createExpression(item))),\n ]);\n }\n\n private createRefExpression(expr: ReferenceExpr): any {\n if (isDataField(expr.target.ref)) {\n return this.createExpressionUtilsCall('field', [this.createLiteralNode(expr.target.$refText)]);\n } else if (isEnumField(expr.target.ref)) {\n return this.createLiteralExpression('StringLiteral', expr.target.$refText);\n } else {\n throw new Error(`Unsupported reference type: ${expr.target.$refText}`);\n }\n }\n\n private createCallExpression(expr: InvocationExpr) {\n return this.createExpressionUtilsCall('call', [\n ts.factory.createStringLiteral(expr.function.$refText),\n ...(expr.args.length > 0\n ? [ts.factory.createArrayLiteralExpression(expr.args.map((arg) => this.createExpression(arg.value)))]\n : []),\n ]);\n }\n\n private createLiteralExpression(type: string, value: string | boolean) {\n return match(type)\n .with('BooleanLiteral', () => this.createExpressionUtilsCall('literal', [this.createLiteralNode(value)]))\n .with('NumberLiteral', () =>\n this.createExpressionUtilsCall('literal', [ts.factory.createIdentifier(value as string)]),\n )\n .with('StringLiteral', () => this.createExpressionUtilsCall('literal', [this.createLiteralNode(value)]))\n .otherwise(() => {\n throw new Error(`Unsupported literal type: ${type}`);\n });\n }\n\n private generateModelsAndTypeDefs(model: Model, options: TsSchemaGeneratorOptions) {\n const statements: ts.Statement[] = [];\n\n // generate: import { schema as $schema, type SchemaType as $Schema } from './schema';\n statements.push(this.generateSchemaImport(model, true, true, !!(options.lite || options.liteOnly)));\n\n // generate: import type { ModelResult as $ModelResult } from '@zenstackhq/orm';\n statements.push(\n ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n false,\n undefined,\n ts.factory.createNamedImports([\n ts.factory.createImportSpecifier(\n true,\n undefined,\n ts.factory.createIdentifier(`ModelResult as $ModelResult`),\n ),\n ...(model.declarations.some(isTypeDef)\n ? [\n ts.factory.createImportSpecifier(\n true,\n undefined,\n ts.factory.createIdentifier(`TypeDefResult as $TypeDefResult`),\n ),\n ]\n : []),\n ]),\n ),\n ts.factory.createStringLiteral('@zenstackhq/orm'),\n ),\n );\n\n // generate: export type Model = $ModelResult<Schema, 'Model'>;\n const dataModels = model.declarations.filter(isDataModel);\n for (const dm of dataModels) {\n let modelType = ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n dm.name,\n undefined,\n ts.factory.createTypeReferenceNode('$ModelResult', [\n ts.factory.createTypeReferenceNode('$Schema'),\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(dm.name)),\n ]),\n );\n if (dm.comments.length > 0) {\n modelType = this.generateDocs(modelType, dm);\n }\n statements.push(modelType);\n }\n\n // generate: export type TypeDef = $TypeDefResult<Schema, 'TypeDef'>;\n const typeDefs = model.declarations.filter(isTypeDef);\n for (const td of typeDefs) {\n let typeDef = ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n td.name,\n undefined,\n ts.factory.createTypeReferenceNode('$TypeDefResult', [\n ts.factory.createTypeReferenceNode('$Schema'),\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(td.name)),\n ]),\n );\n if (td.comments.length > 0) {\n typeDef = this.generateDocs(typeDef, td);\n }\n statements.push(typeDef);\n }\n\n // generate: export const Enum = $schema.enums.Enum;\n const enums = model.declarations.filter(isEnum);\n for (const e of enums) {\n let enumDecl = ts.factory.createVariableStatement(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n ts.factory.createVariableDeclarationList(\n [\n ts.factory.createVariableDeclaration(\n e.name,\n undefined,\n undefined,\n ts.factory.createPropertyAccessExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createIdentifier('$schema'),\n ts.factory.createIdentifier('enums'),\n ),\n ts.factory.createIdentifier(e.name),\n ),\n ),\n ],\n ts.NodeFlags.Const,\n ),\n );\n if (e.comments.length > 0) {\n enumDecl = this.generateDocs(enumDecl, e);\n }\n statements.push(enumDecl);\n\n // generate: export type Enum = (typeof Enum)[keyof typeof Enum];\n let typeAlias = ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n e.name,\n undefined,\n ts.factory.createIndexedAccessTypeNode(\n ts.factory.createTypeQueryNode(ts.factory.createIdentifier(e.name)),\n ts.factory.createTypeOperatorNode(\n ts.SyntaxKind.KeyOfKeyword,\n ts.factory.createTypeQueryNode(ts.factory.createIdentifier(e.name)),\n ),\n ),\n );\n if (e.comments.length > 0) {\n typeAlias = this.generateDocs(typeAlias, e);\n }\n statements.push(typeAlias);\n }\n\n this.generateBannerComments(statements);\n\n // write to file\n const outputFile = path.join(options.outDir, 'models.ts');\n const sourceFile = ts.createSourceFile(outputFile, '', ts.ScriptTarget.ESNext, false, ts.ScriptKind.TS);\n const printer = ts.createPrinter();\n const result = printer.printList(ts.ListFormat.MultiLine, ts.factory.createNodeArray(statements), sourceFile);\n fs.writeFileSync(outputFile, result);\n }\n\n private generateSchemaImport(model: Model, schemaObject: boolean, schemaType: boolean, useLite: boolean) {\n const importSpecifiers = [];\n\n if (schemaObject) {\n if (model.declarations.some(isEnum)) {\n // enums require referencing the schema object\n importSpecifiers.push(\n ts.factory.createImportSpecifier(\n false,\n ts.factory.createIdentifier('schema'),\n ts.factory.createIdentifier('$schema'),\n ),\n );\n }\n }\n\n if (schemaType) {\n importSpecifiers.push(\n ts.factory.createImportSpecifier(\n true,\n ts.factory.createIdentifier('SchemaType'),\n ts.factory.createIdentifier('$Schema'),\n ),\n );\n }\n\n return ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(false, undefined, ts.factory.createNamedImports(importSpecifiers)),\n ts.factory.createStringLiteral(useLite ? './schema-lite' : './schema'),\n );\n }\n\n private generateDocs<T extends ts.TypeAliasDeclaration | ts.VariableStatement>(\n tsDecl: T,\n decl: DataModel | TypeDef | Enum,\n ): T {\n return ts.addSyntheticLeadingComment(\n tsDecl,\n ts.SyntaxKind.MultiLineCommentTrivia,\n `*\\n * ${decl.comments.map((c) => c.replace(/^\\s*\\/*\\s*/, '')).join('\\n * ')}\\n `,\n true,\n );\n }\n\n private generateInputTypes(model: Model, options: TsSchemaGeneratorOptions) {\n const dataModels = model.declarations.filter(isDataModel);\n const statements: ts.Statement[] = [];\n\n // generate: import { SchemaType as $Schema } from './schema';\n statements.push(this.generateSchemaImport(model, false, true, !!(options.lite || options.liteOnly)));\n\n // generate: import { CreateArgs as $CreateArgs, ... } from '@zenstackhq/orm';\n const inputTypes = [\n 'FindManyArgs',\n 'FindUniqueArgs',\n 'FindFirstArgs',\n 'CreateArgs',\n 'CreateManyArgs',\n 'CreateManyAndReturnArgs',\n 'UpdateArgs',\n 'UpdateManyArgs',\n 'UpdateManyAndReturnArgs',\n 'UpsertArgs',\n 'DeleteArgs',\n 'DeleteManyArgs',\n 'CountArgs',\n 'AggregateArgs',\n 'GroupByArgs',\n 'WhereInput',\n 'SelectInput',\n 'IncludeInput',\n 'OmitInput',\n ];\n\n const inputTypeNameFixes = {\n SelectInput: 'Select',\n IncludeInput: 'Include',\n OmitInput: 'Omit',\n };\n\n // generate: import { CreateArgs as $CreateArgs, ... } from '@zenstackhq/orm';\n statements.push(\n ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n true,\n undefined,\n ts.factory.createNamedImports(\n inputTypes.map((inputType) =>\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier(`${inputType} as $${inputType}`),\n ),\n ),\n ),\n ),\n ts.factory.createStringLiteral('@zenstackhq/orm'),\n ),\n );\n\n // generate: import { type SelectIncludeOmit as $SelectIncludeOmit, type SimplifiedModelResult as $SimplifiedModelResult } from '@zenstackhq/orm';\n statements.push(\n ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n true,\n undefined,\n ts.factory.createNamedImports([\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier('SimplifiedModelResult as $SimplifiedModelResult'),\n ),\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier('SelectIncludeOmit as $SelectIncludeOmit'),\n ),\n ]),\n ),\n ts.factory.createStringLiteral('@zenstackhq/orm'),\n ),\n );\n\n for (const dm of dataModels) {\n // generate: export type ModelCreateArgs = $CreateArgs<Schema, Model>;\n for (const inputType of inputTypes) {\n const exportName = inputTypeNameFixes[inputType as keyof typeof inputTypeNameFixes]\n ? `${dm.name}${inputTypeNameFixes[inputType as keyof typeof inputTypeNameFixes]}`\n : `${dm.name}${inputType}`;\n statements.push(\n ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n exportName,\n undefined,\n ts.factory.createTypeReferenceNode(`$${inputType}`, [\n ts.factory.createTypeReferenceNode('$Schema'),\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(dm.name)),\n ]),\n ),\n );\n }\n\n // generate: export type ModelGetPayload<Args extends $SelectIncludeOmit<Schema, Model, true>> = $SimplifiedModelResult<Schema, Model, Args>;\n statements.push(\n ts.factory.createTypeAliasDeclaration(\n [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n `${dm.name}GetPayload`,\n [\n ts.factory.createTypeParameterDeclaration(\n undefined,\n 'Args',\n ts.factory.createTypeReferenceNode('$SelectIncludeOmit', [\n ts.factory.createTypeReferenceNode('$Schema'),\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(dm.name)),\n ts.factory.createLiteralTypeNode(ts.factory.createTrue()),\n ]),\n ),\n ],\n ts.factory.createTypeReferenceNode('$SimplifiedModelResult', [\n ts.factory.createTypeReferenceNode('$Schema'),\n ts.factory.createLiteralTypeNode(ts.factory.createStringLiteral(dm.name)),\n ts.factory.createTypeReferenceNode('Args'),\n ]),\n ),\n );\n }\n\n this.generateBannerComments(statements);\n\n // write to file\n const outputFile = path.join(options.outDir, 'input.ts');\n const sourceFile = ts.createSourceFile(outputFile, '', ts.ScriptTarget.ESNext, false, ts.ScriptKind.TS);\n const printer = ts.createPrinter();\n const result = printer.printList(ts.ListFormat.MultiLine, ts.factory.createNodeArray(statements), sourceFile);\n fs.writeFileSync(outputFile, result);\n }\n}\n","import {\n Argument,\n ArrayExpr,\n Attribute,\n AttributeArg,\n AttributeParam,\n AttributeParamType,\n BinaryExpr,\n BinaryExprOperatorPriority,\n BooleanLiteral,\n ConfigArrayExpr,\n ConfigField,\n ConfigInvocationExpr,\n DataField,\n DataFieldAttribute,\n DataFieldType,\n DataModel,\n DataModelAttribute,\n DataSource,\n Enum,\n EnumField,\n FieldInitializer,\n FunctionDecl,\n FunctionParam,\n FunctionParamType,\n GeneratorDecl,\n InvocationExpr,\n LiteralExpr,\n MemberAccessExpr,\n Model,\n NullExpr,\n NumberLiteral,\n ObjectExpr,\n Plugin,\n PluginField,\n ReferenceArg,\n ReferenceExpr,\n StringLiteral,\n ThisExpr,\n TypeDef,\n UnaryExpr,\n type AstNode,\n} from '@zenstackhq/language/ast';\nimport { resolved } from './model-utils';\n\n/**\n * Options for the generator.\n */\nexport interface ZModelCodeOptions {\n binaryExprNumberOfSpaces: number;\n unaryExprNumberOfSpaces: number;\n indent: number;\n quote: 'single' | 'double';\n}\n\n// a registry of generation handlers marked with @gen\nconst generationHandlers = new Map<string, PropertyDescriptor>();\n\n// generation handler decorator\nfunction gen(name: string) {\n return function (_target: unknown, _propertyKey: string, descriptor: PropertyDescriptor) {\n if (!generationHandlers.get(name)) {\n generationHandlers.set(name, descriptor);\n }\n return descriptor;\n };\n}\n\n/**\n * Generates ZModel source code from AST.\n */\nexport class ZModelCodeGenerator {\n private readonly options: ZModelCodeOptions;\n\n constructor(options?: Partial<ZModelCodeOptions>) {\n this.options = {\n binaryExprNumberOfSpaces: options?.binaryExprNumberOfSpaces ?? 1,\n unaryExprNumberOfSpaces: options?.unaryExprNumberOfSpaces ?? 0,\n indent: options?.indent ?? 4,\n quote: options?.quote ?? 'single',\n };\n }\n\n /**\n * Generates ZModel source code from AST.\n */\n generate(ast: AstNode): string {\n const handler = generationHandlers.get(ast.$type);\n if (!handler) {\n throw new Error(`No generation handler found for ${ast.$type}`);\n }\n return handler.value.call(this, ast);\n }\n\n @gen(Model)\n private _generateModel(ast: Model) {\n return ast.declarations.map((d) => this.generate(d)).join('\\n\\n');\n }\n\n @gen(DataSource)\n private _generateDataSource(ast: DataSource) {\n return `datasource ${ast.name} {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}\n}`;\n }\n\n @gen(Enum)\n private _generateEnum(ast: Enum) {\n return `enum ${ast.name} {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}\n}`;\n }\n\n @gen(EnumField)\n private _generateEnumField(ast: EnumField) {\n return `${ast.name}${\n ast.attributes.length > 0 ? ' ' + ast.attributes.map((x) => this.generate(x)).join(' ') : ''\n }`;\n }\n\n @gen(GeneratorDecl)\n private _generateGenerator(ast: GeneratorDecl) {\n return `generator ${ast.name} {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}\n}`;\n }\n\n @gen(ConfigField)\n private _generateConfigField(ast: ConfigField) {\n return `${ast.name} = ${this.generate(ast.value)}`;\n }\n\n @gen(ConfigArrayExpr)\n private _generateConfigArrayExpr(ast: ConfigArrayExpr) {\n return `[${ast.items.map((x) => this.generate(x)).join(', ')}]`;\n }\n\n @gen(ConfigInvocationExpr)\n private _generateConfigInvocationExpr(ast: ConfigInvocationExpr) {\n if (ast.args.length === 0) {\n return ast.name;\n } else {\n return `${ast.name}(${ast.args\n .map((x) => (x.name ? x.name + ': ' : '') + this.generate(x.value))\n .join(', ')})`;\n }\n }\n\n @gen(Plugin)\n private _generatePlugin(ast: Plugin) {\n return `plugin ${ast.name} {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}\n}`;\n }\n\n @gen(PluginField)\n private _generatePluginField(ast: PluginField) {\n return `${ast.name} = ${this.generate(ast.value)}`;\n }\n\n @gen(DataModel)\n private _generateDataModel(ast: DataModel) {\n return `${ast.isView ? 'view' : 'model'} ${ast.name}${\n ast.mixins.length > 0 ? ' mixes ' + ast.mixins.map((x) => x.ref?.name).join(', ') : ''\n } {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}${\n ast.attributes.length > 0\n ? '\\n\\n' + ast.attributes.map((x) => this.indent + this.generate(x)).join('\\n')\n : ''\n }\n}`;\n }\n\n @gen(DataField)\n private _generateDataField(ast: DataField) {\n return `${ast.name} ${this.fieldType(ast.type)}${\n ast.attributes.length > 0 ? ' ' + ast.attributes.map((x) => this.generate(x)).join(' ') : ''\n }`;\n }\n\n private fieldType(type: DataFieldType) {\n const baseType = type.type\n ? type.type\n : type.$type == 'DataFieldType' && type.unsupported\n ? 'Unsupported(' + this.generate(type.unsupported.value) + ')'\n : type.reference?.$refText;\n return `${baseType}${type.array ? '[]' : ''}${type.optional ? '?' : ''}`;\n }\n\n @gen(DataModelAttribute)\n private _generateDataModelAttribute(ast: DataModelAttribute) {\n return this.attribute(ast);\n }\n\n @gen(DataFieldAttribute)\n private _generateDataFieldAttribute(ast: DataFieldAttribute) {\n return this.attribute(ast);\n }\n\n private attribute(ast: DataModelAttribute | DataFieldAttribute) {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generate(x)).join(', ')})` : '';\n return `${resolved(ast.decl).name}${args}`;\n }\n\n @gen(AttributeArg)\n private _generateAttributeArg(ast: AttributeArg) {\n if (ast.name) {\n return `${ast.name}: ${this.generate(ast.value)}`;\n } else {\n return this.generate(ast.value);\n }\n }\n\n @gen(ObjectExpr)\n private _generateObjectExpr(ast: ObjectExpr) {\n return `{ ${ast.fields.map((field) => this.objectField(field)).join(', ')} }`;\n }\n\n private objectField(field: FieldInitializer) {\n return `${field.name}: ${this.generate(field.value)}`;\n }\n\n @gen(ArrayExpr)\n private _generateArrayExpr(ast: ArrayExpr) {\n return `[${ast.items.map((item) => this.generate(item)).join(', ')}]`;\n }\n\n @gen(StringLiteral)\n private _generateLiteralExpr(ast: LiteralExpr) {\n return this.options.quote === 'single' ? `'${ast.value}'` : `\"${ast.value}\"`;\n }\n\n @gen(NumberLiteral)\n private _generateNumberLiteral(ast: NumberLiteral) {\n return ast.value.toString();\n }\n\n @gen(BooleanLiteral)\n private _generateBooleanLiteral(ast: BooleanLiteral) {\n return ast.value.toString();\n }\n\n @gen(UnaryExpr)\n private _generateUnaryExpr(ast: UnaryExpr) {\n return `${ast.operator}${this.unaryExprSpace}${this.generate(ast.operand)}`;\n }\n\n @gen(BinaryExpr)\n private _generateBinaryExpr(ast: BinaryExpr) {\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n const rightExpr = this.generate(ast.right);\n\n const { left: isLeftParenthesis, right: isRightParenthesis } = this.isParenthesesNeededForBinaryExpr(ast);\n\n return `${isLeftParenthesis ? '(' : ''}${this.generate(ast.left)}${\n isLeftParenthesis ? ')' : ''\n }${isCollectionPredicate ? '' : this.binaryExprSpace}${operator}${\n isCollectionPredicate ? '' : this.binaryExprSpace\n }${isRightParenthesis ? '(' : ''}${\n isCollectionPredicate ? `[${rightExpr}]` : rightExpr\n }${isRightParenthesis ? ')' : ''}`;\n }\n\n @gen(ReferenceExpr)\n private _generateReferenceExpr(ast: ReferenceExpr) {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generate(x)).join(', ')})` : '';\n return `${ast.target.ref?.name}${args}`;\n }\n\n @gen(ReferenceArg)\n private _generateReferenceArg(ast: ReferenceArg) {\n return `${ast.name}:${this.generate(ast.value)}`;\n }\n\n @gen(MemberAccessExpr)\n private _generateMemberExpr(ast: MemberAccessExpr) {\n return `${this.generate(ast.operand)}.${ast.member.ref?.name}`;\n }\n\n @gen(InvocationExpr)\n private _generateInvocationExpr(ast: InvocationExpr) {\n return `${ast.function.ref?.name}(${ast.args.map((x) => this.argument(x)).join(', ')})`;\n }\n\n @gen(NullExpr)\n private _generateNullExpr() {\n return 'null';\n }\n\n @gen(ThisExpr)\n private _generateThisExpr() {\n return 'this';\n }\n\n @gen(Attribute)\n private _generateAttribute(ast: Attribute) {\n return `attribute ${ast.name}(${ast.params.map((x) => this.generate(x)).join(', ')})`;\n }\n\n @gen(AttributeParam)\n private _generateAttributeParam(ast: AttributeParam) {\n return `${ast.default ? '_ ' : ''}${ast.name}: ${this.generate(ast.type)}`;\n }\n\n @gen(AttributeParamType)\n private _generateAttributeParamType(ast: AttributeParamType) {\n return `${ast.type ?? ast.reference?.$refText}${ast.array ? '[]' : ''}${ast.optional ? '?' : ''}`;\n }\n\n @gen(FunctionDecl)\n private _generateFunctionDecl(ast: FunctionDecl) {\n return `function ${ast.name}(${ast.params.map((x) => this.generate(x)).join(', ')}) ${\n ast.returnType ? ': ' + this.generate(ast.returnType) : ''\n } {}`;\n }\n\n @gen(FunctionParam)\n private _generateFunctionParam(ast: FunctionParam) {\n return `${ast.name}: ${this.generate(ast.type)}`;\n }\n\n @gen(FunctionParamType)\n private _generateFunctionParamType(ast: FunctionParamType) {\n return `${ast.type ?? ast.reference?.$refText}${ast.array ? '[]' : ''}`;\n }\n\n @gen(TypeDef)\n private _generateTypeDef(ast: TypeDef) {\n return `type ${ast.name} {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}${\n ast.attributes.length > 0\n ? '\\n\\n' + ast.attributes.map((x) => this.indent + this.generate(x)).join('\\n')\n : ''\n }\n}`;\n }\n\n private argument(ast: Argument) {\n return this.generate(ast.value);\n }\n\n private get binaryExprSpace() {\n return ' '.repeat(this.options.binaryExprNumberOfSpaces);\n }\n\n private get unaryExprSpace() {\n return ' '.repeat(this.options.unaryExprNumberOfSpaces);\n }\n\n private get indent() {\n return ' '.repeat(this.options.indent);\n }\n\n private isParenthesesNeededForBinaryExpr(ast: BinaryExpr): {\n left: boolean;\n right: boolean;\n } {\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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","names":["isDataModel","isLiteralExpr","isModel","isTypeDef","getAllFields","getModelIdFields","getModelUniqueFields","isIdField","field","contextModel","hasAttribute","modelLevelIds","getModelIdFields","map","f","name","includes","allFields","getAllFields","some","length","firstUniqueField","find","modelLevelUnique","getModelUniqueFields","decl","getAttribute","attributes","attr","$refText","isDelegateModel","node","isDataModel","isUniqueField","modelIds","$container","args","arg","isLiteralExpr","value","isFromStdlib","model","getContainingModel","$document","uri","path","endsWith","isModel","resolved","ref","Error","getAuthDecl","found","declarations","d","isTypeDef","getIdFields","dm","filter","DELEGATE_AUX_RELATION_PREFIX","lowerCaseFirst","BooleanLiteral","DataModel","DataSource","Enum","GeneratorDecl","isArrayExpr","isDataModel","isInvocationExpr","isLiteralExpr","isNullExpr","isReferenceExpr","isStringLiteral","isTypeDef","NumberLiteral","StringLiteral","getAllAttributes","getAllFields","isAuthInvocation","isDelegateModel","AstUtils","match","string","count","indent","replace","repeat","indentString","PrismaModel","datasources","generators","models","enums","addDataSource","name","fields","ds","DataSource","push","addGenerator","generator","Generator","addModel","model","Model","addView","addEnum","e","Enum","toString","map","d","join","f","indentString","text","DeclarationBase","documentations","addComment","x","ContainerDeclaration","attributes","FieldDeclaration","isView","addField","type","addToFront","field","ModelField","unshift","addAttribute","args","attr","ContainerAttribute","result","length","ModelFieldType","array","optional","FieldAttribute","a","AttributeArg","name","value","toString","AttributeArgValue","type","Error","Array","isArray","FieldReference","FunctionCall","JSON","stringify","fr","r","field","args","length","map","a","join","v","FieldReferenceArg","func","FunctionCallArg","Enum","ContainerDeclaration","fields","documentations","addField","attributes","EnumField","push","addAttribute","attr","ContainerAttribute","addComment","indentString","d","DeclarationBase","FieldAttribute","IDENTIFIER_NAME_MAX_LENGTH","DELEGATE_AUX_RELATION_PREFIX","length","PrismaSchemaGenerator","PRELUDE","shortNameMap","Map","zmodel","generate","prisma","PrismaModel","decl","declarations","$type","DataSource","generateDataSource","Enum","generateEnum","DataModel","generateModel","GeneratorDecl","generateGenerator","toString","dataSource","fields","map","f","name","text","configExprToText","value","addDataSource","expr","isLiteralExpr","literalToText","isInvocationExpr","fc","makeFunctionCall","configArrayToText","items","item","args","arg","configInvocationArgToText","join","JSON","stringify","addGenerator","model","isView","addView","addModel","allFields","getAllFields","field","ModelUtils","hasAttribute","isIdField","isInheritedFromDelegate","generateModelField","allAttributes","getAllAttributes","attr","filter","isPrismaAttribute","isInheritedMapAttribute","generateContainerAttribute","comments","forEach","c","addComment","generateDelegateRelationForBase","generateDelegateRelationForConcrete","contextModel","$container","attrName","ref","$refText","attributes","some","a","getUnsupportedFieldType","fieldType","unsupported","getStringLiteral","undefined","node","isStringLiteral","addToFront","type","reference","isTypeDef","Error","isArray","array","ModelFieldType","optional","isDefaultWithAuthInvocation","makeFieldAttribute","docs","result","addField","AstUtils","streamAst","isAuthInvocation","isDelegateModel","PrismaFieldAttribute","makeAttributeArg","PrismaAttributeArg","makeAttributeArgValue","argType","match","with","StringLiteral","NumberLiteral","BooleanLiteral","exhaustive","PrismaAttributeArgValue","isArrayExpr","Array","isReferenceExpr","PrismaFieldReference","target","PrismaFieldReferenceArg","exprToText","ZModelCodeGenerator","quote","PrismaFunctionCall","function","val","when","v","isNullExpr","otherwise","PrismaFunctionCallArg","container","push","PrismaModelAttribute","_enum","addEnum","generateEnumField","concreteModels","getConcreteModels","concrete","auxName","truncate","lowerCaseFirst","concreteDecl","base","baseModel","idFields","getIdFields","relationField","AttributeArgValue","idField","dataModel","d","isDataModel","existing","get","baseName","slice","index","shortName","conflict","from","values","find","set","invariant","isArrayExpr","isBinaryExpr","isDataField","isDataModel","isDataSource","isEnum","isEnumField","isInvocationExpr","isLiteralExpr","isMemberAccessExpr","isNullExpr","isProcedure","isReferenceExpr","isThisExpr","isTypeDef","isUnaryExpr","getAllAttributes","getAllFields","isDataFieldReference","fs","path","match","ts","TsSchemaGenerator","usedExpressionUtils","generate","model","options","fs","mkdirSync","outDir","recursive","generateSchema","generateModelsAndTypeDefs","generateInputTypes","targets","liteOnly","push","lite","file","statements","generateSchemaStatements","generateBannerComments","schemaOutputFile","path","join","sourceFile","createSourceFile","ScriptTarget","ESNext","ScriptKind","TS","printer","createPrinter","result","printList","ListFormat","MultiLine","factory","createNodeArray","writeFileSync","hasComputedFields","declarations","some","d","isDataModel","fields","f","hasAttribute","schemaObject","createSchemaObject","runtimeImportDecl","createImportDeclaration","undefined","createImportClause","createNamedImports","createImportSpecifier","createIdentifier","createStringLiteral","declaration","createVariableStatement","createModifier","SyntaxKind","ExportKeyword","createVariableDeclarationList","createVariableDeclaration","createSatisfiesExpression","createAsExpression","createTypeReferenceNode","NodeFlags","Const","typeDeclaration","createTypeAliasDeclaration","createExpressionUtilsCall","method","args","createCallExpression","createPropertyAccessExpression","properties","createPropertyAssignment","createProviderObject","createModelsObject","isTypeDef","createTypeDefsObject","enums","filter","isEnum","length","createObjectLiteralExpression","map","e","name","createEnumObject","authType","getAuthDecl","createLiteralNode","procedures","isProcedure","createProceduresObject","dsProvider","getDataSourceProvider","type","dm","createDataModelObject","td","createTypeDefObject","allFields","getAllFields","allAttributes","getAllAttributes","attr","decl","$refText","$container","subModels","getSubModels","baseModel","field","createDataFieldObject","createArrayLiteralExpression","createAttributeObject","getIdFields","idField","createUniqueFieldsObject","isDelegateModel","createTrue","subModel","isView","computedFields","createComputedFieldsObject","ref","createMethodDeclaration","createParameterDeclaration","createTypeLiteralNode","createPropertySignature","createKeywordTypeNode","StringKeyword","mapFieldTypeToTSType","createBlock","createThrowStatement","createNewExpression","match","with","otherwise","array","optional","contextModel","objectFields","generateFieldTypeLiteral","ModelUtils","isIdField","isUniqueField","isDiscriminatorField","attributes","defaultValue","getFieldMappedDefault","Array","isArray","call","arg","authMember","m","Error","item","reference","createRelationObject","fkFor","getForeignKeyFor","fk","origin","getAttribute","$resolvedParam","isDataFieldReference","value","target","dataSource","find","isDataSource","invariant","providerExpr","isLiteralExpr","defaultAttr","getMappedValue","expr","fieldType","lit","includes","Number","isArrayExpr","items","isReferenceExpr","isEnumField","isInvocationExpr","function","getLiteral","isAuthMemberAccess","getMemberAccessChain","$type","isMemberAccessExpr","operand","member","isAuthInvocation","isFromStdlib","relationFields","oppositeRelation","getOppositeRelationField","relationName","getRelationName","relation","param","fieldNames","getReferenceNames","el","action","sourceModel","targetModel","otherField","otherRelationName","nameArg","seenKeys","Set","fieldDef","key","getCompoundUniqueKey","has","add","unsupported","parseFloat","createNull","createNumericLiteral","createFalse","proc","createProcedureObject","params","paramsType","createTupleTypeNode","createNamedTupleMember","createLiteralTypeNode","returnType","mutation","banner","ts","addSyntheticLeadingComment","SingleLineCommentTrivia","createAttributeArg","createExpression","when","createLiteralExpression","createRefExpression","createArrayExpression","isUnaryExpr","createUnaryExpression","isBinaryExpr","createBinaryExpression","createMemberExpression","isNullExpr","createNullExpression","isThisExpr","createThisExpression","members","current","unshift","receiver","left","operator","right","isDataField","generateSchemaImport","dataModels","modelType","comments","generateDocs","typeDefs","typeDef","enumDecl","typeAlias","createIndexedAccessTypeNode","createTypeQueryNode","createTypeOperatorNode","KeyOfKeyword","outputFile","schemaType","useLite","importSpecifiers","tsDecl","MultiLineCommentTrivia","c","replace","inputTypes","inputTypeNameFixes","SelectInput","IncludeInput","OmitInput","inputType","exportName","createTypeParameterDeclaration","ArrayExpr","Attribute","AttributeArg","AttributeParam","AttributeParamType","BinaryExpr","BinaryExprOperatorPriority","BooleanLiteral","ConfigArrayExpr","ConfigField","ConfigInvocationExpr","DataField","DataFieldAttribute","DataModel","DataModelAttribute","DataSource","Enum","EnumField","FunctionDecl","FunctionParam","FunctionParamType","GeneratorDecl","InvocationExpr","LiteralExpr","MemberAccessExpr","Model","NullExpr","NumberLiteral","ObjectExpr","Plugin","PluginField","ReferenceArg","ReferenceExpr","StringLiteral","ThisExpr","TypeDef","UnaryExpr","generationHandlers","Map","gen","name","_target","_propertyKey","descriptor","get","set","ZModelCodeGenerator","options","binaryExprNumberOfSpaces","unaryExprNumberOfSpaces","indent","quote","generate","ast","handler","$type","Error","value","call","_generateModel","declarations","map","d","join","_generateDataSource","fields","x","_generateEnum","_generateEnumField","attributes","length","_generateGenerator","_generateConfigField","_generateConfigArrayExpr","items","_generateConfigInvocationExpr","args","_generatePlugin","_generatePluginField","_generateDataModel","isView","mixins","ref","_generateDataField","fieldType","type","baseType","unsupported","reference","$refText","array","optional","_generateDataModelAttribute","attribute","_generateDataFieldAttribute","resolved","decl","_generateAttributeArg","_generateObjectExpr","field","objectField","_generateArrayExpr","item","_generateLiteralExpr","_generateNumberLiteral","toString","_generateBooleanLiteral","_generateUnaryExpr","operator","unaryExprSpace","operand","_generateBinaryExpr","isCollectionPredicate","isCollectionPredicateOperator","rightExpr","right","left","isLeftParenthesis","isRightParenthesis","isParenthesesNeededForBinaryExpr","binaryExprSpace","_generateReferenceExpr","target","_generateReferenceArg","_generateMemberExpr","member","_generateInvocationExpr","function","argument","_generateNullExpr","_generateThisExpr","_generateAttribute","params","_generateAttributeParam","default","_generateAttributeParamType","_generateFunctionDecl","returnType","_generateFunctionParam","_generateFunctionParamType","_generateTypeDef","repeat","result","currentPriority","BinaryExprOperatorPriority","BinaryExpr","op","includes"]}