@zenstackhq/sdk 3.0.0-alpha.2 → 3.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../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 * as ModelUtils from './model-utils';\nexport { PrismaSchemaGenerator } from './prisma/prisma-schema-generator';\nexport * from './ts-schema-generator';\nexport * from './zmodel-code-generator';\nexport { ModelUtils };\n","import {\n isArrayExpr,\n isDataModel,\n isLiteralExpr,\n isModel,\n isReferenceExpr,\n Model,\n ReferenceExpr,\n type AstNode,\n type Attribute,\n type AttributeParam,\n type DataModel,\n type DataModelAttribute,\n type DataModelField,\n type DataModelFieldAttribute,\n type Enum,\n type EnumField,\n type FunctionDecl,\n type Reference,\n type TypeDef,\n type TypeDefField,\n} from '@zenstackhq/language/ast';\n\nexport function isIdField(field: DataModelField) {\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 const model = field.$container as DataModel;\n\n // model-level @@id attribute with a list of fields\n const modelLevelIds = getModelIdFields(model);\n if (modelLevelIds.map((f) => f.name).includes(field.name)) {\n return true;\n }\n\n if (\n model.fields.some((f) => hasAttribute(f, '@id')) ||\n modelLevelIds.length > 0\n ) {\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 = model.fields.find((f) =>\n hasAttribute(f, '@unique')\n );\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(model);\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:\n | DataModel\n | TypeDef\n | DataModelField\n | Enum\n | EnumField\n | FunctionDecl\n | Attribute\n | AttributeParam,\n name: string\n) {\n return !!getAttribute(decl, name);\n}\n\nexport function getAttribute(\n decl:\n | DataModel\n | TypeDef\n | DataModelField\n | TypeDefField\n | Enum\n | EnumField\n | FunctionDecl\n | Attribute\n | AttributeParam,\n name: string\n) {\n return (\n decl.attributes as (DataModelAttribute | DataModelFieldAttribute)[]\n ).find((attr) => attr.decl.$refText === name);\n}\n\n/**\n * Gets `@@id` fields declared at the data model level (including search in base models)\n */\nexport function getModelIdFields(model: DataModel) {\n const modelsToCheck = model.$baseMerged\n ? [model]\n : [model, ...getRecursiveBases(model)];\n\n for (const modelToCheck of modelsToCheck) {\n const idAttr = modelToCheck.attributes.find(\n (attr) => attr.decl.$refText === '@@id'\n );\n if (!idAttr) {\n continue;\n }\n const fieldsArg = idAttr.args.find(\n (a) => a.$resolvedParam?.name === 'fields'\n );\n if (!fieldsArg || !isArrayExpr(fieldsArg.value)) {\n continue;\n }\n\n return fieldsArg.value.items\n .filter((item): item is ReferenceExpr => isReferenceExpr(item))\n .map((item) => item.target.ref as DataModelField);\n }\n\n return [];\n}\n\n/**\n * Gets `@@unique` fields declared at the data model level (including search in base models)\n */\nexport function getModelUniqueFields(model: DataModel) {\n const modelsToCheck = model.$baseMerged\n ? [model]\n : [model, ...getRecursiveBases(model)];\n\n for (const modelToCheck of modelsToCheck) {\n const uniqueAttr = modelToCheck.attributes.find(\n (attr) => attr.decl.$refText === '@@unique'\n );\n if (!uniqueAttr) {\n continue;\n }\n const fieldsArg = uniqueAttr.args.find(\n (a) => a.$resolvedParam?.name === 'fields'\n );\n if (!fieldsArg || !isArrayExpr(fieldsArg.value)) {\n continue;\n }\n\n return fieldsArg.value.items\n .filter((item): item is ReferenceExpr => isReferenceExpr(item))\n .map((item) => item.target.ref as DataModelField);\n }\n\n return [];\n}\n\nexport function getRecursiveBases(\n dataModel: DataModel,\n includeDelegate = true,\n seen = new Set<DataModel>()\n): DataModel[] {\n const result: DataModel[] = [];\n if (seen.has(dataModel)) {\n return result;\n }\n seen.add(dataModel);\n dataModel.superTypes.forEach((superType) => {\n const baseDecl = superType.ref;\n if (baseDecl) {\n if (!includeDelegate && isDelegateModel(baseDecl)) {\n return;\n }\n result.push(baseDecl);\n result.push(...getRecursiveBases(baseDecl, includeDelegate, seen));\n }\n });\n return result;\n}\n\nexport function isDelegateModel(node: AstNode) {\n return isDataModel(node) && hasAttribute(node, '@@delegate');\n}\n\nexport function isUniqueField(field: DataModelField) {\n if (hasAttribute(field, '@unique')) {\n return true;\n }\n const modelIds = getAttribute(field.$container, '@@unique');\n if (\n modelIds &&\n modelIds.args.some(\n (arg) => isLiteralExpr(arg.value) && arg.value.value === field.name\n )\n ) {\n return true;\n }\n return false;\n}\n\nexport function isFromStdlib(node: AstNode) {\n const model = getContainingModel(node);\n return (\n !!model &&\n !!model.$document &&\n model.$document.uri.path.endsWith('stdlib.zmodel')\n );\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) =>\n isDataModel(d) &&\n d.attributes.some((attr) => attr.decl.$refText === '@@auth')\n );\n if (!found) {\n found = model.declarations.find(\n (d) => isDataModel(d) && d.name === 'User'\n );\n }\n return found;\n}\n","import {\n AttributeArg,\n BooleanLiteral,\n ConfigArrayExpr,\n ConfigExpr,\n ConfigInvocationArg,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n DataModelFieldType,\n DataSource,\n Enum,\n EnumField,\n Expression,\n GeneratorDecl,\n InvocationExpr,\n isArrayExpr,\n isInvocationExpr,\n isLiteralExpr,\n isModel,\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 { AstUtils } from 'langium';\nimport { match, P } from 'ts-pattern';\n\nimport { ModelUtils, ZModelCodeGenerator } from '..';\nimport {\n AttributeArgValue,\n ModelField,\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/**\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 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 ? '(' +\n item.args\n .map((arg) =>\n this.configInvocationArgToText(arg)\n )\n .join(', ') +\n ')'\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\n ? prisma.addView(decl.name)\n : prisma.addModel(decl.name);\n for (const field of decl.fields) {\n if (ModelUtils.hasAttribute(field, '@computed')) {\n continue; // skip computed fields\n }\n // TODO: exclude fields inherited from delegate\n this.generateModelField(model, field);\n }\n\n for (const attr of decl.attributes.filter((attr) =>\n this.isPrismaAttribute(attr)\n )) {\n this.generateContainerAttribute(model, attr);\n }\n\n // user defined comments pass-through\n decl.comments.forEach((c) => model.addComment(c));\n\n // TODO: delegate model handling\n // // physical: generate relation fields on base models linking to concrete models\n // this.generateDelegateRelationForBase(model, decl);\n\n // TODO: delegate model handling\n // // physical: generate reverse relation fields on concrete models\n // this.generateDelegateRelationForConcrete(model, decl);\n\n // TODO: delegate model handling\n // // logical: expand relations on other models that reference delegated models to concrete models\n // this.expandPolymorphicRelations(model, decl);\n\n // TODO: delegate model handling\n // // logical: ensure relations inherited from delegate models\n // this.ensureRelationsInheritedFromDelegate(model, decl);\n }\n\n private isPrismaAttribute(\n attr: DataModelAttribute | DataModelFieldAttribute\n ) {\n if (!attr.decl.ref) {\n return false;\n }\n return attr.decl.ref.attributes.some(\n (a) => a.decl.ref?.name === '@@@prisma'\n );\n }\n\n private getUnsupportedFieldType(fieldType: DataModelFieldType) {\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(\n model: PrismaDataModel,\n field: DataModelField,\n addToFront = false\n ) {\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(\n `Field type is not resolved: ${field.$container.name}.${field.name}`\n );\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(\n fieldType,\n isArray,\n field.type.optional\n );\n\n const attributes = field.attributes\n .filter((attr) => this.isPrismaAttribute(attr))\n // `@default` with calling functions from plugin is handled outside Prisma\n .filter((attr) => !this.isDefaultWithPluginInvocation(attr))\n .filter(\n (attr) =>\n // when building physical schema, exclude `@default` for id fields inherited from delegate base\n !(\n ModelUtils.isIdField(field) &&\n this.isInheritedFromDelegate(field) &&\n attr.decl.$refText === '@default'\n )\n )\n .map((attr) => this.makeFieldAttribute(attr));\n\n const docs = [...field.comments];\n const result = model.addField(\n field.name,\n type,\n attributes,\n docs,\n addToFront\n );\n\n // if (\n // field.attributes.some((attr) =>\n // this.isDefaultWithPluginInvocation(attr)\n // )\n // ) {\n // // field has `@default` from a plugin function call, turn it into a dummy default value, and the\n // // real default value setting is handled outside Prisma\n // this.setDummyDefault(result, field);\n // }\n\n return result;\n }\n\n private isDefaultWithPluginInvocation(attr: DataModelFieldAttribute) {\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(\n (node) =>\n isInvocationExpr(node) && this.isFromPlugin(node.function.ref)\n );\n }\n\n private isFromPlugin(node: AstNode | undefined) {\n const model = AstUtils.getContainerOfType(node, isModel);\n return (\n !!model &&\n !!model.$document &&\n model.$document.uri.path.endsWith('plugin.zmodel')\n );\n }\n\n private setDummyDefault(result: ModelField, field: DataModelField) {\n const dummyDefaultValue = match(field.type.type)\n .with('String', () => new AttributeArgValue('String', ''))\n .with(\n P.union('Int', 'BigInt', 'Float', 'Decimal'),\n () => new AttributeArgValue('Number', '0')\n )\n .with('Boolean', () => new AttributeArgValue('Boolean', 'false'))\n .with(\n 'DateTime',\n () =>\n new AttributeArgValue(\n 'FunctionCall',\n new PrismaFunctionCall('now')\n )\n )\n .with('Json', () => new AttributeArgValue('String', '{}'))\n .with('Bytes', () => new AttributeArgValue('String', ''))\n .otherwise(() => {\n throw new Error(\n `Unsupported field type with default value: ${field.type.type}`\n );\n });\n\n result.attributes.push(\n new PrismaFieldAttribute('@default', [\n new PrismaAttributeArg(undefined, dummyDefaultValue),\n ])\n );\n }\n\n private isInheritedFromDelegate(field: DataModelField) {\n return (\n field.$inheritedFrom &&\n ModelUtils.isDelegateModel(field.$inheritedFrom)\n );\n }\n\n private makeFieldAttribute(attr: DataModelFieldAttribute) {\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(\n arg.name,\n this.makeAttributeArgValue(arg.value)\n );\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(\n ...node.items.map((item) =>\n this.makeAttributeArgValue(item)\n )\n )\n );\n } else if (isReferenceExpr(node)) {\n return new PrismaAttributeArgValue(\n 'FieldReference',\n new PrismaFieldReference(\n node.target.ref!.name,\n node.args.map(\n (arg) =>\n new PrismaFieldReferenceArg(\n arg.name,\n this.exprToText(arg.value)\n )\n )\n )\n );\n } else if (isInvocationExpr(node)) {\n // invocation\n return new PrismaAttributeArgValue(\n 'FunctionCall',\n this.makeFunctionCall(node)\n );\n } else {\n throw Error(\n `Unsupported attribute argument expression type: ${node.$type}`\n );\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(\n 'Function call argument must be literal or null'\n );\n });\n\n return new PrismaFunctionCallArg(val);\n })\n );\n }\n\n private generateContainerAttribute(\n container: PrismaContainerDeclaration,\n attr: DataModelAttribute\n ) {\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) =>\n this.isPrismaAttribute(attr)\n )) {\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","// 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 [\n ...this.datasources,\n ...this.generators,\n ...this.enums,\n ...this.models,\n ]\n .map((d) => d.toString())\n .join('\\n\\n');\n }\n}\n\nexport class DataSource {\n constructor(public name: string, public fields: SimpleField[] = []) {}\n\n toString(): string {\n return (\n `datasource ${this.name} {\\n` +\n this.fields\n .map((f) => indentString(`${f.name} = ${f.text}`))\n .join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class Generator {\n constructor(public name: string, public fields: SimpleField[]) {}\n\n toString(): string {\n return (\n `generator ${this.name} {\\n` +\n this.fields\n .map((f) => indentString(`${f.name} = ${f.text}`))\n .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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 ? '[]' : ''}${\n this.optional ? '?' : ''\n }`;\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\n ? ' ' + this.attributes.map((a) => a.toString()).join(' ')\n : '')\n );\n }\n}\n\nexport class FieldAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return (\n `${this.name}(` +\n this.args.map((a) => a.toString()).join(', ') +\n `)`\n );\n }\n}\n\nexport class ContainerAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return (\n `${this.name}(` +\n this.args.map((a) => a.toString()).join(', ') +\n `)`\n );\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\n ? `${this.name}: ${this.value}`\n : this.value.toString();\n }\n}\n\nexport class AttributeArgValue {\n constructor(\n public type:\n | 'String'\n | 'FieldReference'\n | 'Number'\n | 'Boolean'\n | 'Array'\n | 'FunctionCall',\n public value:\n | string\n | number\n | boolean\n | FieldReference\n | FunctionCall\n | AttributeArgValue[]\n ) {\n switch (type) {\n case 'String':\n if (typeof value !== 'string')\n 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')\n throw new Error('Value must be boolean');\n break;\n case 'Array':\n if (!Array.isArray(value))\n throw new Error('Value must be array');\n break;\n case 'FieldReference':\n if (\n typeof value !== 'string' &&\n !(value instanceof FieldReference)\n )\n throw new Error('Value must be string or FieldReference');\n break;\n case 'FunctionCall':\n if (!(value instanceof FunctionCall))\n 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 +=\n '(' +\n fr.args.map((a) => a.toString()).join(',') +\n ')';\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 (\n '[' +\n (this.value as AttributeArgValue[])\n .map((v) => v.toString())\n .join(', ') +\n ']'\n );\n default:\n throw new Error(`Unknown attribute value type ${this.type}`);\n }\n }\n}\n\nexport class FieldReference {\n constructor(public field: string, public args: FieldReferenceArg[] = []) {}\n}\n\nexport class FieldReferenceArg {\n constructor(public name: string, public value: string) {}\n\n toString(): string {\n return `${this.name}: ${this.value}`;\n }\n}\n\nexport class FunctionCall {\n constructor(public func: string, public args: FunctionCallArg[] = []) {}\n\n toString(): string {\n return (\n `${this.func}` +\n '(' +\n this.args.map((a) => a.toString()).join(', ') +\n ')'\n );\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(public name: string, documentations: string[] = []) {\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(\n [...this.fields, ...this.attributes]\n .map((d) => d.toString())\n .join('\\n')\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\n ? ' ' + this.attributes.map((a) => a.toString()).join(' ')\n : '')\n );\n }\n}\n","import { loadDocument } from '@zenstackhq/language';\nimport {\n ArrayExpr,\n AttributeArg,\n BinaryExpr,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n Enum,\n Expression,\n InvocationExpr,\n isArrayExpr,\n isBinaryExpr,\n isDataModel,\n isDataModelField,\n isDataSource,\n isEnum,\n isEnumField,\n isInvocationExpr,\n isLiteralExpr,\n isMemberAccessExpr,\n isNullExpr,\n isProcedure,\n isReferenceExpr,\n isThisExpr,\n isUnaryExpr,\n LiteralExpr,\n MemberAccessExpr,\n Procedure,\n ReferenceExpr,\n UnaryExpr,\n type Model,\n} from '@zenstackhq/language/ast';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport invariant from 'tiny-invariant';\nimport { match } from 'ts-pattern';\nimport * as ts from 'typescript';\nimport { ModelUtils } from '.';\nimport {\n getAttribute,\n getAuthDecl,\n hasAttribute,\n isIdField,\n isUniqueField,\n} from './model-utils';\n\nexport class TsSchemaGenerator {\n public async generate(\n schemaFile: string,\n pluginModelFiles: string[],\n outputFile: string\n ) {\n const loaded = await loadDocument(schemaFile, pluginModelFiles);\n if (!loaded.success) {\n throw new Error(`Error loading schema:${loaded.errors.join('\\n')}`);\n }\n\n const { model, warnings } = loaded;\n const statements: ts.Statement[] = [];\n\n this.generateSchemaStatements(model, statements);\n\n this.generateBannerComments(statements);\n\n const sourceFile = ts.createSourceFile(\n outputFile,\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\n fs.mkdirSync(path.dirname(outputFile), { recursive: true });\n fs.writeFileSync(outputFile, result);\n\n return { model, warnings };\n }\n\n private generateSchemaStatements(model: Model, statements: ts.Statement[]) {\n const hasComputedFields = model.declarations.some(\n (d) =>\n isDataModel(d) &&\n d.fields.some((f) => hasAttribute(f, '@computed'))\n );\n\n const runtimeImportDecl = 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('SchemaDef')\n ),\n ...(hasComputedFields\n ? [\n ts.factory.createImportSpecifier(\n true,\n undefined,\n ts.factory.createIdentifier(\n 'OperandExpression'\n )\n ),\n ]\n : []),\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier('ExpressionUtils')\n ),\n ])\n ),\n ts.factory.createStringLiteral('@zenstackhq/runtime/schema')\n );\n statements.push(runtimeImportDecl);\n\n const { type: providerType } = this.getDataSourceProvider(model);\n switch (providerType) {\n case 'sqlite': {\n // add imports for calculating the path of sqlite database file\n\n // `import path from 'node:path';`\n const pathImportDecl = ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n false,\n ts.factory.createIdentifier('path'),\n undefined\n ),\n ts.factory.createStringLiteral('node:path')\n );\n statements.push(pathImportDecl);\n\n // `import url from 'node:url';`\n const urlImportDecl = ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n false,\n ts.factory.createIdentifier('url'),\n undefined\n ),\n ts.factory.createStringLiteral('node:url')\n );\n statements.push(urlImportDecl);\n\n // `import { toDialectConfig } from '@zenstackhq/runtime/utils/sqlite-utils';`\n const dialectConfigImportDecl =\n ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n false,\n undefined,\n ts.factory.createNamedImports([\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier(\n 'toDialectConfig'\n )\n ),\n ])\n ),\n ts.factory.createStringLiteral(\n '@zenstackhq/runtime/utils/sqlite-utils'\n )\n );\n statements.push(dialectConfigImportDecl);\n break;\n }\n\n case 'postgresql': {\n // `import { toDialectConfig } from '@zenstackhq/runtime/utils/pg-utils';`\n const dialectConfigImportDecl =\n ts.factory.createImportDeclaration(\n undefined,\n ts.factory.createImportClause(\n false,\n undefined,\n ts.factory.createNamedImports([\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier(\n 'toDialectConfig'\n )\n ),\n ])\n ),\n ts.factory.createStringLiteral(\n '@zenstackhq/runtime/utils/pg-utils'\n )\n );\n statements.push(dialectConfigImportDecl);\n break;\n }\n }\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(\n this.createSchemaObject(model),\n ts.factory.createTypeReferenceNode('const')\n ),\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 createSchemaObject(model: Model) {\n const properties: ts.PropertyAssignment[] = [\n // provider\n ts.factory.createPropertyAssignment(\n 'provider',\n this.createProviderObject(model)\n ),\n\n // models\n ts.factory.createPropertyAssignment(\n 'models',\n this.createModelsObject(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) =>\n ts.factory.createPropertyAssignment(\n e.name,\n this.createEnumObject(e)\n )\n ),\n true\n )\n )\n );\n }\n\n // authType\n const authType = getAuthDecl(model);\n if (authType) {\n properties.push(\n ts.factory.createPropertyAssignment(\n 'authType',\n this.createLiteralNode(authType.name)\n )\n );\n }\n\n // procedures\n const procedures = model.declarations.filter(isProcedure);\n if (procedures.length > 0) {\n properties.push(\n ts.factory.createPropertyAssignment(\n 'procedures',\n this.createProceduresObject(procedures)\n )\n );\n }\n\n // plugins\n properties.push(\n ts.factory.createPropertyAssignment(\n 'plugins',\n ts.factory.createObjectLiteralExpression([], true)\n )\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 [\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(dsProvider.type)\n ),\n ts.factory.createPropertyAssignment(\n 'dialectConfigProvider',\n this.createDialectConfigProvider(dsProvider)\n ),\n ],\n true\n );\n }\n\n private createModelsObject(model: Model) {\n return ts.factory.createObjectLiteralExpression(\n model.declarations\n .filter(\n (d): d is DataModel =>\n isDataModel(d) && !hasAttribute(d, '@@ignore')\n )\n .map((dm) =>\n ts.factory.createPropertyAssignment(\n dm.name,\n this.createDataModelObject(dm)\n )\n ),\n true\n );\n }\n\n private createDataModelObject(dm: DataModel) {\n const fields: ts.PropertyAssignment[] = [\n // fields\n ts.factory.createPropertyAssignment(\n 'fields',\n ts.factory.createObjectLiteralExpression(\n dm.fields\n .filter((field) => !hasAttribute(field, '@ignore'))\n .map((field) =>\n ts.factory.createPropertyAssignment(\n field.name,\n this.createDataModelFieldObject(field)\n )\n ),\n true\n )\n ),\n\n // attributes\n ...(dm.attributes.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'attributes',\n ts.factory.createArrayLiteralExpression(\n dm.attributes.map((attr) =>\n this.createAttributeObject(attr)\n ),\n true\n )\n ),\n ]\n : []),\n\n // idFields\n ts.factory.createPropertyAssignment(\n 'idFields',\n ts.factory.createArrayLiteralExpression(\n this.getIdFields(dm).map((idField) =>\n ts.factory.createStringLiteral(idField)\n )\n )\n ),\n\n // uniqueFields\n ts.factory.createPropertyAssignment(\n 'uniqueFields',\n this.createUniqueFieldsObject(dm)\n ),\n ];\n\n const computedFields = dm.fields.filter((f) =>\n hasAttribute(f, '@computed')\n );\n\n if (computedFields.length > 0) {\n fields.push(\n ts.factory.createPropertyAssignment(\n 'computedFields',\n this.createComputedFieldsObject(computedFields)\n )\n );\n }\n\n return ts.factory.createObjectLiteralExpression(fields, true);\n }\n\n private createComputedFieldsObject(fields: DataModelField[]) {\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 ts.factory.createTypeReferenceNode('OperandExpression', [\n ts.factory.createKeywordTypeNode(\n this.mapTypeToTSSyntaxKeyword(field.type.type!)\n ),\n ]),\n ts.factory.createBlock(\n [\n ts.factory.createThrowStatement(\n ts.factory.createNewExpression(\n ts.factory.createIdentifier('Error'),\n undefined,\n [\n ts.factory.createStringLiteral(\n 'This is a stub for computed field'\n ),\n ]\n )\n ),\n ],\n true\n )\n )\n ),\n true\n );\n }\n\n private mapTypeToTSSyntaxKeyword(type: string) {\n return match<string, ts.KeywordTypeSyntaxKind>(type)\n .with('String', () => ts.SyntaxKind.StringKeyword)\n .with('Boolean', () => ts.SyntaxKind.BooleanKeyword)\n .with('Int', () => ts.SyntaxKind.NumberKeyword)\n .with('Float', () => ts.SyntaxKind.NumberKeyword)\n .with('BigInt', () => ts.SyntaxKind.BigIntKeyword)\n .with('Decimal', () => ts.SyntaxKind.NumberKeyword)\n .otherwise(() => ts.SyntaxKind.UnknownKeyword);\n }\n\n private createDataModelFieldObject(field: DataModelField) {\n const objectFields = [\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(\n field.type.type ?? field.type.reference!.$refText\n )\n ),\n ];\n\n if (isIdField(field)) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'id',\n ts.factory.createTrue()\n )\n );\n }\n\n if (isUniqueField(field)) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'unique',\n ts.factory.createTrue()\n )\n );\n }\n\n if (field.type.optional) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'optional',\n ts.factory.createTrue()\n )\n );\n }\n\n if (field.type.array) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'array',\n ts.factory.createTrue()\n )\n );\n }\n\n if (hasAttribute(field, '@updatedAt')) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'updatedAt',\n ts.factory.createTrue()\n )\n );\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) =>\n this.createAttributeObject(attr)\n )\n )\n )\n );\n }\n\n const defaultValue = this.getMappedDefault(field);\n if (defaultValue !== undefined) {\n if (typeof defaultValue === 'object') {\n if ('call' in defaultValue) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n\n ts.factory.createCallExpression(\n ts.factory.createIdentifier(\n 'ExpressionUtils.call'\n ),\n undefined,\n [\n ts.factory.createStringLiteral(\n defaultValue.call\n ),\n ...(defaultValue.args.length > 0\n ? [\n ts.factory.createArrayLiteralExpression(\n defaultValue.args.map((arg) =>\n this.createLiteralNode(\n arg\n )\n )\n ),\n ]\n : []),\n ]\n )\n )\n );\n } else if ('authMember' in defaultValue) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n ts.factory.createCallExpression(\n ts.factory.createIdentifier(\n 'ExpressionUtils.member'\n ),\n undefined,\n [\n ts.factory.createCallExpression(\n ts.factory.createIdentifier(\n 'ExpressionUtils.call'\n ),\n undefined,\n [ts.factory.createStringLiteral('auth')]\n ),\n ts.factory.createArrayLiteralExpression(\n defaultValue.authMember.map((m) =>\n ts.factory.createStringLiteral(m)\n )\n ),\n ]\n )\n )\n );\n } else {\n throw new Error(\n `Unsupported default value type for field ${field.name}`\n );\n }\n } else {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n typeof defaultValue === 'string'\n ? ts.factory.createStringLiteral(defaultValue)\n : typeof defaultValue === 'number'\n ? ts.factory.createNumericLiteral(defaultValue)\n : defaultValue === true\n ? ts.factory.createTrue()\n : ts.factory.createFalse()\n )\n );\n }\n }\n\n if (hasAttribute(field, '@computed')) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'computed',\n ts.factory.createTrue()\n )\n );\n }\n\n if (isDataModel(field.type.reference?.ref)) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'relation',\n this.createRelationObject(field)\n )\n );\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 getDataSourceProvider(\n model: Model\n ):\n | { type: string; env: undefined; url: string }\n | { type: string; env: string; url: undefined } {\n const dataSource = model.declarations.find(isDataSource);\n invariant(dataSource, 'No data source found in the model');\n\n const providerExpr = dataSource.fields.find(\n (f) => f.name === 'provider'\n )?.value;\n invariant(isLiteralExpr(providerExpr), 'Provider must be a literal');\n const type = providerExpr.value as string;\n\n const urlExpr = dataSource.fields.find((f) => f.name === 'url')?.value;\n invariant(\n isLiteralExpr(urlExpr) || isInvocationExpr(urlExpr),\n 'URL must be a literal or env function'\n );\n\n if (isLiteralExpr(urlExpr)) {\n return { type, url: urlExpr.value as string, env: undefined };\n } else if (isInvocationExpr(urlExpr)) {\n invariant(\n urlExpr.function.$refText === 'env',\n 'only \"env\" function is supported'\n );\n invariant(\n urlExpr.args.length === 1,\n 'env function must have one argument'\n );\n return {\n type,\n env: (urlExpr.args[0]!.value as LiteralExpr).value as string,\n url: undefined,\n };\n } else {\n throw new Error('Unsupported URL type');\n }\n }\n\n private getMappedDefault(\n field: DataModelField\n ):\n | string\n | number\n | boolean\n | { call: string; args: any[] }\n | { authMember: string[] }\n | undefined {\n const defaultAttr = getAttribute(field, '@default');\n if (!defaultAttr) {\n return undefined;\n }\n\n const defaultValue = defaultAttr.args[0]?.value;\n invariant(defaultValue, 'Expected a default value');\n\n if (isLiteralExpr(defaultValue)) {\n const lit = (defaultValue as LiteralExpr).value;\n return field.type.type === 'Boolean'\n ? (lit as boolean)\n : ['Int', 'Float', 'Decimal', 'BigInt'].includes(\n field.type.type!\n )\n ? Number(lit)\n : lit;\n } else if (\n isReferenceExpr(defaultValue) &&\n isEnumField(defaultValue.target.ref)\n ) {\n return defaultValue.target.ref.name;\n } else if (isInvocationExpr(defaultValue)) {\n return {\n call: defaultValue.function.$refText,\n args: defaultValue.args.map((arg) =>\n this.getLiteral(arg.value)\n ),\n };\n } else if (this.isAuthMemberAccess(defaultValue)) {\n return {\n authMember: this.getMemberAccessChain(defaultValue),\n };\n } else {\n throw new Error(\n `Unsupported default value type for field ${field.name}`\n );\n }\n }\n\n private getMemberAccessChain(expr: MemberAccessExpr): string[] {\n if (!isMemberAccessExpr(expr.operand)) {\n return [expr.member.$refText];\n } else {\n return [\n ...this.getMemberAccessChain(expr.operand),\n expr.member.$refText,\n ];\n }\n }\n\n private isAuthMemberAccess(expr: Expression): expr is MemberAccessExpr {\n if (isMemberAccessExpr(expr)) {\n return (\n this.isAuthInvocation(expr.operand) ||\n this.isAuthMemberAccess(expr.operand)\n );\n } else {\n return false;\n }\n }\n\n private isAuthInvocation(expr: Expression) {\n return (\n isInvocationExpr(expr) &&\n expr.function.$refText === 'auth' &&\n ModelUtils.isFromStdlib(expr.function.ref!)\n );\n }\n\n private createRelationObject(field: DataModelField) {\n const relationFields: ts.PropertyAssignment[] = [];\n\n const oppositeRelation = this.getOppositeRelationField(field);\n if (oppositeRelation) {\n relationFields.push(\n ts.factory.createPropertyAssignment(\n 'opposite',\n ts.factory.createStringLiteral(oppositeRelation.name)\n )\n );\n }\n\n const relationName = this.getRelationName(field);\n if (relationName) {\n relationFields.push(\n ts.factory.createPropertyAssignment(\n 'name',\n ts.factory.createStringLiteral(relationName)\n )\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) =>\n ts.factory.createStringLiteral(el)\n )\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(\n param,\n ts.factory.createStringLiteral(action)\n )\n );\n }\n }\n }\n\n return ts.factory.createObjectLiteralExpression(relationFields);\n }\n\n private getReferenceNames(expr: Expression) {\n return (\n isArrayExpr(expr) &&\n expr.items.map((item) => (item as ReferenceExpr).target.$refText)\n );\n }\n\n private getForeignKeyFor(field: DataModelField) {\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(\n (el) =>\n isReferenceExpr(el) && el.target.ref === field\n )\n ) {\n result.push(f.name);\n }\n }\n }\n }\n return result;\n }\n\n private getOppositeRelationField(field: DataModelField) {\n if (\n !field.type.reference?.ref ||\n !isDataModel(field.type.reference?.ref)\n ) {\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: DataModelField) {\n const relation = getAttribute(field, '@relation');\n if (relation) {\n const nameArg = relation.args.find(\n (arg) => arg.$resolvedParam.name === 'name'\n );\n if (nameArg) {\n invariant(\n isLiteralExpr(nameArg.value),\n 'name must be a literal'\n );\n return nameArg.value.value as string;\n }\n }\n return undefined;\n }\n\n private getIdFields(dm: DataModel) {\n return dm.fields.filter(isIdField).map((f) => f.name);\n }\n\n private createUniqueFieldsObject(dm: DataModel) {\n const properties: ts.PropertyAssignment[] = [];\n\n // field-level id and unique\n for (const field of dm.fields) {\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(\n 'type',\n ts.factory.createStringLiteral(field.type.type!)\n ),\n ])\n )\n );\n }\n }\n\n // model-level id and unique\n for (const attr of dm.attributes) {\n if (\n attr.decl.$refText === '@@id' ||\n attr.decl.$refText === '@@unique'\n ) {\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 = dm.fields.find(\n (f) => f.name === fieldNames[0]\n )!;\n properties.push(\n ts.factory.createPropertyAssignment(\n fieldNames[0]!,\n ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(\n fieldDef.type.type!\n )\n ),\n ])\n )\n );\n } else {\n // multi-field unique\n properties.push(\n ts.factory.createPropertyAssignment(\n fieldNames.join('_'),\n ts.factory.createObjectLiteralExpression(\n fieldNames.map((field) => {\n const fieldDef = dm.fields.find(\n (f) => f.name === field\n )!;\n return ts.factory.createPropertyAssignment(\n field,\n ts.factory.createObjectLiteralExpression(\n [\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(\n fieldDef.type.type!\n )\n ),\n ]\n )\n );\n })\n )\n )\n );\n }\n }\n }\n\n return ts.factory.createObjectLiteralExpression(properties, true);\n }\n\n private createEnumObject(e: Enum) {\n return ts.factory.createObjectLiteralExpression(\n e.fields.map((field) =>\n ts.factory.createPropertyAssignment(\n field.name,\n ts.factory.createStringLiteral(field.name)\n )\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 createDialectConfigProvider(\n dsProvider:\n | { type: string; env: undefined; url: string }\n | { type: string; env: string; url: undefined }\n ) {\n const type = dsProvider.type;\n\n let urlExpr: ts.Expression;\n if (dsProvider.env !== undefined) {\n urlExpr = ts.factory.createIdentifier(\n `process.env['${dsProvider.env}']`\n );\n } else {\n urlExpr = ts.factory.createStringLiteral(dsProvider.url);\n\n if (type === 'sqlite') {\n // convert file: URL to a regular path\n let parsedUrl: URL | undefined;\n try {\n parsedUrl = new URL(dsProvider.url);\n } catch {\n // ignore\n }\n\n if (parsedUrl) {\n if (parsedUrl.protocol !== 'file:') {\n throw new Error(\n 'Invalid SQLite URL: only file protocol is supported'\n );\n }\n urlExpr = ts.factory.createStringLiteral(\n dsProvider.url.replace(/^file:/, '')\n );\n }\n }\n }\n\n return match(type)\n .with('sqlite', () => {\n return ts.factory.createFunctionExpression(\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n ts.factory.createBlock(\n [\n ts.factory.createReturnStatement(\n ts.factory.createCallExpression(\n ts.factory.createIdentifier(\n 'toDialectConfig'\n ),\n undefined,\n [\n urlExpr,\n ts.factory.createIdentifier(\n `typeof __dirname !== 'undefined' ? __dirname : path.dirname(url.fileURLToPath(import.meta.url))`\n ),\n ]\n )\n ),\n ],\n true\n )\n );\n })\n .with('postgresql', () => {\n return ts.factory.createFunctionExpression(\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n ts.factory.createBlock(\n [\n ts.factory.createReturnStatement(\n ts.factory.createCallExpression(\n ts.factory.createIdentifier(\n 'toDialectConfig'\n ),\n undefined,\n [urlExpr]\n )\n ),\n ],\n true\n )\n );\n })\n .otherwise(() => {\n throw new Error(`Unsupported provider: ${type}`);\n });\n }\n\n private createProceduresObject(procedures: Procedure[]) {\n return ts.factory.createObjectLiteralExpression(\n procedures.map((proc) =>\n ts.factory.createPropertyAssignment(\n proc.name,\n this.createProcedureObject(proc)\n )\n ),\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(\n 'name',\n ts.factory.createStringLiteral(param.name)\n ),\n ...(param.optional\n ? [\n ts.factory.createPropertyAssignment(\n 'optional',\n ts.factory.createTrue()\n ),\n ]\n : []),\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(\n param.type.type ?? param.type.reference!.$refText\n )\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(\n ts.factory.createStringLiteral(param.name)\n )\n ),\n ts.factory.createPropertySignature(\n undefined,\n ts.factory.createStringLiteral('type'),\n undefined,\n ts.factory.createLiteralTypeNode(\n ts.factory.createStringLiteral(\n param.type.type ??\n param.type.reference!.$refText\n )\n )\n ),\n ...(param.optional\n ? [\n ts.factory.createPropertySignature(\n undefined,\n ts.factory.createStringLiteral(\n 'optional'\n ),\n undefined,\n ts.factory.createLiteralTypeNode(\n ts.factory.createTrue()\n )\n ),\n ]\n : []),\n ])\n )\n ),\n ]);\n\n return ts.factory.createObjectLiteralExpression(\n [\n ts.factory.createPropertyAssignment(\n 'params',\n ts.factory.createAsExpression(params, paramsType)\n ),\n ts.factory.createPropertyAssignment(\n 'returnType',\n ts.factory.createStringLiteral(\n proc.returnType.type ??\n proc.returnType.reference!.$refText\n )\n ),\n ...(proc.mutation\n ? [\n ts.factory.createPropertyAssignment(\n 'mutation',\n ts.factory.createTrue()\n ),\n ]\n : []),\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`;\n ts.addSyntheticLeadingComment(\n statements[0]!,\n ts.SyntaxKind.SingleLineCommentTrivia,\n banner\n );\n }\n\n private createAttributeObject(\n attr: DataModelAttribute | DataModelFieldAttribute\n ): ts.Expression {\n return ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment(\n 'name',\n ts.factory.createStringLiteral(attr.decl.$refText)\n ),\n ...(attr.args.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'args',\n ts.factory.createArrayLiteralExpression(\n attr.args.map((arg) =>\n this.createAttributeArg(arg)\n )\n )\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 ? [\n ts.factory.createPropertyAssignment(\n 'name',\n ts.factory.createStringLiteral(\n arg.$resolvedParam.name\n )\n ),\n ]\n : []),\n\n // value\n ts.factory.createPropertyAssignment(\n 'value',\n this.createExpression(arg.value)\n ),\n ]);\n }\n\n private createExpression(value: Expression): ts.Expression {\n return match(value)\n .when(isLiteralExpr, (expr) =>\n this.createLiteralExpression(expr.$type, expr.value)\n )\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) =>\n this.createMemberExpression(expr)\n )\n .when(isNullExpr, () => this.createNullExpression())\n .when(isThisExpr, () => this.createThisExpression())\n .otherwise(() => {\n throw new Error(\n `Unsupported attribute arg value: ${value.$type}`\n );\n });\n }\n\n private createThisExpression() {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils._this'),\n undefined,\n []\n );\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(\n members.map((m) => ts.factory.createStringLiteral(m))\n ),\n ];\n\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.member'),\n undefined,\n args\n );\n }\n\n private createNullExpression() {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils._null'),\n undefined,\n []\n );\n }\n\n private createBinaryExpression(expr: BinaryExpr) {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.binary'),\n undefined,\n [\n this.createExpression(expr.left),\n this.createLiteralNode(expr.operator),\n this.createExpression(expr.right),\n ]\n );\n }\n\n private createUnaryExpression(expr: UnaryExpr) {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.unary'),\n undefined,\n [\n this.createLiteralNode(expr.operator),\n this.createExpression(expr.operand),\n ]\n );\n }\n\n private createArrayExpression(expr: ArrayExpr): any {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.array'),\n undefined,\n [\n ts.factory.createArrayLiteralExpression(\n expr.items.map((item) => this.createExpression(item))\n ),\n ]\n );\n }\n\n private createRefExpression(expr: ReferenceExpr): any {\n if (isDataModelField(expr.target.ref)) {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.field'),\n undefined,\n [this.createLiteralNode(expr.target.$refText)]\n );\n } else if (isEnumField(expr.target.ref)) {\n return this.createLiteralExpression(\n 'StringLiteral',\n expr.target.$refText\n );\n } else {\n throw new Error(\n `Unsupported reference type: ${expr.target.$refText}`\n );\n }\n }\n\n private createCallExpression(expr: InvocationExpr) {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.call'),\n undefined,\n [\n ts.factory.createStringLiteral(expr.function.$refText),\n ...(expr.args.length > 0\n ? [\n ts.factory.createArrayLiteralExpression(\n expr.args.map((arg) =>\n this.createExpression(arg.value)\n )\n ),\n ]\n : []),\n ]\n );\n }\n\n private createLiteralExpression(type: string, value: string | boolean) {\n return match(type)\n .with('BooleanLiteral', () =>\n ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.literal'),\n undefined,\n [this.createLiteralNode(value)]\n )\n )\n .with('NumberLiteral', () =>\n ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.literal'),\n undefined,\n [ts.factory.createIdentifier(value as string)]\n )\n )\n .with('StringLiteral', () =>\n ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.literal'),\n undefined,\n [this.createLiteralNode(value)]\n )\n )\n .otherwise(() => {\n throw new Error(`Unsupported literal type: ${type}`);\n });\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 DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n DataModelFieldType,\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 TypeDefField,\n TypeDefFieldType,\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 (\n _target: unknown,\n _propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\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\n ? ' ' + ast.attributes.map((x) => this.generate(x)).join(' ')\n : ''\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(\n (x) =>\n (x.name ? x.name + ': ' : '') + this.generate(x.value)\n )\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.isAbstract ? 'abstract ' : ''}${\n ast.isView ? 'view' : 'model'\n } ${ast.name}${\n ast.superTypes.length > 0\n ? ' extends ' +\n ast.superTypes.map((x) => x.ref?.name).join(', ')\n : ''\n } {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}${\n ast.attributes.length > 0\n ? '\\n\\n' +\n ast.attributes\n .map((x) => this.indent + this.generate(x))\n .join('\\n')\n : ''\n }\n}`;\n }\n\n @gen(DataModelField)\n private _generateDataModelField(ast: DataModelField) {\n return `${ast.name} ${this.fieldType(ast.type)}${\n ast.attributes.length > 0\n ? ' ' + ast.attributes.map((x) => this.generate(x)).join(' ')\n : ''\n }`;\n }\n\n private fieldType(type: DataModelFieldType | TypeDefFieldType) {\n const baseType = type.type\n ? type.type\n : type.$type == 'DataModelFieldType' && type.unsupported\n ? 'Unsupported(' + this.generate(type.unsupported.value) + ')'\n : type.reference?.$refText;\n return `${baseType}${type.array ? '[]' : ''}${\n type.optional ? '?' : ''\n }`;\n }\n\n @gen(DataModelAttribute)\n private _generateDataModelAttribute(ast: DataModelAttribute) {\n return this.attribute(ast);\n }\n\n @gen(DataModelFieldAttribute)\n private _generateDataModelFieldAttribute(ast: DataModelFieldAttribute) {\n return this.attribute(ast);\n }\n\n private attribute(ast: DataModelAttribute | DataModelFieldAttribute) {\n const args = ast.args.length\n ? `(${ast.args.map((x) => this.generate(x)).join(', ')})`\n : '';\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\n .map((field) => this.objectField(field))\n .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'\n ? `'${ast.value}'`\n : `\"${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(\n ast.operand\n )}`;\n }\n\n @gen(BinaryExpr)\n private _generateBinaryExpr(ast: BinaryExpr) {\n const operator = ast.operator;\n const isCollectionPredicate =\n this.isCollectionPredicateOperator(operator);\n const rightExpr = this.generate(ast.right);\n\n const { left: isLeftParenthesis, right: isRightParenthesis } =\n 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\n ? `(${ast.args.map((x) => this.generate(x)).join(', ')})`\n : '';\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\n .map((x) => this.argument(x))\n .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\n .map((x) => this.generate(x))\n .join(', ')})`;\n }\n\n @gen(AttributeParam)\n private _generateAttributeParam(ast: AttributeParam) {\n return `${ast.default ? '_ ' : ''}${ast.name}: ${this.generate(\n ast.type\n )}`;\n }\n\n @gen(AttributeParamType)\n private _generateAttributeParamType(ast: AttributeParamType) {\n return `${ast.type ?? ast.reference?.$refText}${ast.array ? '[]' : ''}${\n ast.optional ? '?' : ''\n }`;\n }\n\n @gen(FunctionDecl)\n private _generateFunctionDecl(ast: FunctionDecl) {\n return `function ${ast.name}(${ast.params\n .map((x) => this.generate(x))\n .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' +\n ast.attributes\n .map((x) => this.indent + this.generate(x))\n .join('\\n')\n : ''\n }\n}`;\n }\n\n @gen(TypeDefField)\n private _generateTypeDefField(ast: TypeDefField) {\n return `${ast.name} ${this.fieldType(ast.type)}${\n ast.attributes.length > 0\n ? ' ' + ast.attributes.map((x) => this.generate(x)).join(' ')\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 =\n this.isCollectionPredicateOperator(operator);\n\n const currentPriority = BinaryExprOperatorPriority[operator];\n\n if (\n ast.left.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.left as BinaryExpr)['operator']] <\n 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']] <=\n 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;ACAA;;;;;;;;;;;;;;;iBAqBO;AAEA,SAASA,UAAUC,OAAqB;AAE3C,MAAIC,aAAaD,OAAO,KAAA,GAAQ;AAC5B,WAAO;EACX;AAKA,QAAME,QAAQF,MAAMG;AAGpB,QAAMC,gBAAgBC,iBAAiBH,KAAAA;AACvC,MAAIE,cAAcE,IAAI,CAACC,MAAMA,EAAEC,IAAI,EAAEC,SAAST,MAAMQ,IAAI,GAAG;AACvD,WAAO;EACX;AAEA,MACIN,MAAMQ,OAAOC,KAAK,CAACJ,MAAMN,aAAaM,GAAG,KAAA,CAAA,KACzCH,cAAcQ,SAAS,GACzB;AAEE,WAAO;EACX;AAGA,QAAMC,mBAAmBX,MAAMQ,OAAOI,KAAK,CAACP,MACxCN,aAAaM,GAAG,SAAA,CAAA;AAEpB,MAAIM,kBAAkB;AAClB,WAAOA,iBAAiBL,SAASR,MAAMQ;EAC3C;AAGA,QAAMO,mBAAmBC,qBAAqBd,KAAAA;AAC9C,MAAIa,iBAAiBT,IAAI,CAACC,MAAMA,EAAEC,IAAI,EAAEC,SAAST,MAAMQ,IAAI,GAAG;AAC1D,WAAO;EACX;AAEA,SAAO;AACX;AAxCgBT;AA0CT,SAASE,aACZgB,MASAT,MAAY;AAEZ,SAAO,CAAC,CAACU,aAAaD,MAAMT,IAAAA;AAChC;AAbgBP;AAeT,SAASiB,aACZD,MAUAT,MAAY;AAEZ,SACIS,KAAKE,WACPL,KAAK,CAACM,SAASA,KAAKH,KAAKI,aAAab,IAAAA;AAC5C;AAhBgBU;AAqBT,SAASb,iBAAiBH,OAAgB;AAC7C,QAAMoB,gBAAgBpB,MAAMqB,cACtB;IAACrB;MACD;IAACA;OAAUsB,kBAAkBtB,KAAAA;;AAEnC,aAAWuB,gBAAgBH,eAAe;AACtC,UAAMI,SAASD,aAAaN,WAAWL,KACnC,CAACM,SAASA,KAAKH,KAAKI,aAAa,MAAA;AAErC,QAAI,CAACK,QAAQ;AACT;IACJ;AACA,UAAMC,YAAYD,OAAOE,KAAKd,KAC1B,CAACe,MAAMA,EAAEC,gBAAgBtB,SAAS,QAAA;AAEtC,QAAI,CAACmB,aAAa,KAACI,wBAAYJ,UAAUK,KAAK,GAAG;AAC7C;IACJ;AAEA,WAAOL,UAAUK,MAAMC,MAClBC,OAAO,CAACC,aAAgCC,4BAAgBD,IAAAA,CAAAA,EACxD7B,IAAI,CAAC6B,SAASA,KAAKE,OAAOC,GAAG;EACtC;AAEA,SAAO,CAAA;AACX;AAzBgBjC;AA8BT,SAASW,qBAAqBd,OAAgB;AACjD,QAAMoB,gBAAgBpB,MAAMqB,cACtB;IAACrB;MACD;IAACA;OAAUsB,kBAAkBtB,KAAAA;;AAEnC,aAAWuB,gBAAgBH,eAAe;AACtC,UAAMiB,aAAad,aAAaN,WAAWL,KACvC,CAACM,SAASA,KAAKH,KAAKI,aAAa,UAAA;AAErC,QAAI,CAACkB,YAAY;AACb;IACJ;AACA,UAAMZ,YAAYY,WAAWX,KAAKd,KAC9B,CAACe,MAAMA,EAAEC,gBAAgBtB,SAAS,QAAA;AAEtC,QAAI,CAACmB,aAAa,KAACI,wBAAYJ,UAAUK,KAAK,GAAG;AAC7C;IACJ;AAEA,WAAOL,UAAUK,MAAMC,MAClBC,OAAO,CAACC,aAAgCC,4BAAgBD,IAAAA,CAAAA,EACxD7B,IAAI,CAAC6B,SAASA,KAAKE,OAAOC,GAAG;EACtC;AAEA,SAAO,CAAA;AACX;AAzBgBtB;AA2BT,SAASQ,kBACZgB,WACAC,kBAAkB,MAClBC,OAAO,oBAAIC,IAAAA,GAAgB;AAE3B,QAAMC,SAAsB,CAAA;AAC5B,MAAIF,KAAKG,IAAIL,SAAAA,GAAY;AACrB,WAAOI;EACX;AACAF,OAAKI,IAAIN,SAAAA;AACTA,YAAUO,WAAWC,QAAQ,CAACC,cAAAA;AAC1B,UAAMC,WAAWD,UAAUX;AAC3B,QAAIY,UAAU;AACV,UAAI,CAACT,mBAAmBU,gBAAgBD,QAAAA,GAAW;AAC/C;MACJ;AACAN,aAAOQ,KAAKF,QAAAA;AACZN,aAAOQ,KAAI,GAAI5B,kBAAkB0B,UAAUT,iBAAiBC,IAAAA,CAAAA;IAChE;EACJ,CAAA;AACA,SAAOE;AACX;AArBgBpB;AAuBT,SAAS2B,gBAAgBE,MAAa;AACzC,aAAOC,wBAAYD,IAAAA,KAASpD,aAAaoD,MAAM,YAAA;AACnD;AAFgBF;AAIT,SAASI,cAAcvD,OAAqB;AAC/C,MAAIC,aAAaD,OAAO,SAAA,GAAY;AAChC,WAAO;EACX;AACA,QAAMwD,WAAWtC,aAAalB,MAAMG,YAAY,UAAA;AAChD,MACIqD,YACAA,SAAS5B,KAAKjB,KACV,CAAC8C,YAAQC,0BAAcD,IAAIzB,KAAK,KAAKyB,IAAIzB,MAAMA,UAAUhC,MAAMQ,IAAI,GAEzE;AACE,WAAO;EACX;AACA,SAAO;AACX;AAdgB+C;AAgBT,SAASI,aAAaN,MAAa;AACtC,QAAMnD,QAAQ0D,mBAAmBP,IAAAA;AACjC,SACI,CAAC,CAACnD,SACF,CAAC,CAACA,MAAM2D,aACR3D,MAAM2D,UAAUC,IAAIC,KAAKC,SAAS,eAAA;AAE1C;AAPgBL;AAST,SAASC,mBAAmBP,MAAyB;AACxD,MAAI,CAACA,MAAM;AACP,WAAO;EACX;AACA,aAAOY,oBAAQZ,IAAAA,IAAQA,OAAOO,mBAAmBP,KAAKlD,UAAU;AACpE;AALgByD;AAOT,SAASM,SAA4B5B,KAAiB;AACzD,MAAI,CAACA,IAAIA,KAAK;AACV,UAAM,IAAI6B,MAAM,2BAA2B7B,IAAIjB,QAAQ,EAAE;EAC7D;AACA,SAAOiB,IAAIA;AACf;AALgB4B;AAOT,SAASE,YAAYlE,OAAY;AACpC,MAAImE,QAAQnE,MAAMoE,aAAaxD,KAC3B,CAACyD,UACGjB,wBAAYiB,CAAAA,KACZA,EAAEpD,WAAWR,KAAK,CAACS,SAASA,KAAKH,KAAKI,aAAa,QAAA,CAAA;AAE3D,MAAI,CAACgD,OAAO;AACRA,YAAQnE,MAAMoE,aAAaxD,KACvB,CAACyD,UAAMjB,wBAAYiB,CAAAA,KAAMA,EAAE/D,SAAS,MAAA;EAE5C;AACA,SAAO6D;AACX;AAZgBD;;;AChOhB,IAAAI,cA8BO;AACP,qBAAyB;AACzB,wBAAyB;;;AC3BV,SAAf,aAAqCC,QAAgBC,QAAQ,GAAC;AAC1D,QAAMC,SAAS;AACf,SAAOF,OAAOG,QAAQ,eAAeD,OAAOE,OAAOH,KAAAA,CAAAA;AACvD;AAHwBI;;;ACKjB,IAAMC,cAAN,MAAMA;EAVb,OAUaA;;;EACDC,cAA4B,CAAA;EAC5BC,aAA0B,CAAA;EAC1BC,SAAkB,CAAA;EAClBC,QAAgB,CAAA;EAExBC,cAAcC,MAAcC,SAAwB,CAAA,GAAgB;AAChE,UAAMC,KAAK,IAAIC,WAAWH,MAAMC,MAAAA;AAChC,SAAKN,YAAYS,KAAKF,EAAAA;AACtB,WAAOA;EACX;EAEAG,aAAaL,MAAcC,QAAkC;AACzD,UAAMK,YAAY,IAAIC,UAAUP,MAAMC,MAAAA;AACtC,SAAKL,WAAWQ,KAAKE,SAAAA;AACrB,WAAOA;EACX;EAEAE,SAASR,MAAqB;AAC1B,UAAMS,QAAQ,IAAIC,MAAMV,MAAM,KAAA;AAC9B,SAAKH,OAAOO,KAAKK,KAAAA;AACjB,WAAOA;EACX;EAEAE,QAAQX,MAAqB;AACzB,UAAMS,QAAQ,IAAIC,MAAMV,MAAM,IAAA;AAC9B,SAAKH,OAAOO,KAAKK,KAAAA;AACjB,WAAOA;EACX;EAEAG,QAAQZ,MAAoB;AACxB,UAAMa,IAAI,IAAIC,KAAKd,IAAAA;AACnB,SAAKF,MAAMM,KAAKS,CAAAA;AAChB,WAAOA;EACX;EAEAE,WAAmB;AACf,WAAO;SACA,KAAKpB;SACL,KAAKC;SACL,KAAKE;SACL,KAAKD;MAEPmB,IAAI,CAACC,MAAMA,EAAEF,SAAQ,CAAA,EACrBG,KAAK,MAAA;EACd;AACJ;AAEO,IAAMf,aAAN,MAAMA;EA1Db,OA0DaA;;;;;EACTgB,YAAmBnB,MAAqBC,SAAwB,CAAA,GAAI;SAAjDD,OAAAA;SAAqBC,SAAAA;EAA6B;EAErEc,WAAmB;AACf,WACI,cAAc,KAAKf,IAAI;IACvB,KAAKC,OACAe,IAAI,CAACI,MAAMC,aAAa,GAAGD,EAAEpB,IAAI,MAAMoB,EAAEE,IAAI,EAAE,CAAA,EAC/CJ,KAAK,IAAA,IACV;;EAER;AACJ;AAEO,IAAMX,YAAN,MAAMA;EAxEb,OAwEaA;;;;;EACTY,YAAmBnB,MAAqBC,QAAuB;SAA5CD,OAAAA;SAAqBC,SAAAA;EAAwB;EAEhEc,WAAmB;AACf,WACI,aAAa,KAAKf,IAAI;IACtB,KAAKC,OACAe,IAAI,CAACI,MAAMC,aAAa,GAAGD,EAAEpB,IAAI,MAAMoB,EAAEE,IAAI,EAAE,CAAA,EAC/CJ,KAAK,IAAA,IACV;;EAER;AACJ;AAEO,IAAMK,kBAAN,MAAMA;EAtFb,OAsFaA;;;;EACTJ,YAAmBK,iBAA2B,CAAA,GAAI;SAA/BA,iBAAAA;EAAgC;EAEnDC,WAAWzB,MAAsB;AAC7B,SAAKwB,eAAepB,KAAKJ,IAAAA;AACzB,WAAOA;EACX;EAEAe,WAAmB;AACf,WAAO,KAAKS,eAAeR,IAAI,CAACU,MAAM,GAAGA,CAAAA;CAAK,EAAER,KAAK,EAAA;EACzD;AACJ;AAEO,IAAMS,uBAAN,cAAmCJ,gBAAAA;EAnG1C,OAmG0CA;;;;EACtCJ,YACIK,iBAA2B,CAAA,GACpBI,aAA4D,CAAA,GACrE;AACE,UAAMJ,cAAAA,GAAAA,KAFCI,aAAAA;EAGX;AACJ;AAEO,IAAMC,mBAAN,cAA+BN,gBAAAA;EA5GtC,OA4GsCA;;;;EAClCJ,YACIK,iBAA2B,CAAA,GACpBI,aAAwD,CAAA,GACjE;AACE,UAAMJ,cAAAA,GAAAA,KAFCI,aAAAA;EAGX;AACJ;AAEO,IAAMlB,QAAN,cAAoBiB,qBAAAA;EArH3B,OAqH2BA;;;;;EAChB1B;EACPkB,YACWnB,MACA8B,QACPN,iBAA2B,CAAA,GAC7B;AACE,UAAMA,cAAAA,GAAAA,KAJCxB,OAAAA,MAAAA,KACA8B,SAAAA,QAAAA,KAHJ7B,SAAuB,CAAA;EAO9B;EAEA8B,SACI/B,MACAgC,MACAJ,aAAwD,CAAA,GACxDJ,iBAA2B,CAAA,GAC3BS,aAAa,OACH;AACV,UAAMC,QAAQ,IAAIC,WAAWnC,MAAMgC,MAAMJ,YAAYJ,cAAAA;AACrD,QAAIS,YAAY;AACZ,WAAKhC,OAAOmC,QAAQF,KAAAA;IACxB,OAAO;AACH,WAAKjC,OAAOG,KAAK8B,KAAAA;IACrB;AACA,WAAOA;EACX;EAEAG,aAAarC,MAAcsC,OAAuB,CAAA,GAAI;AAClD,UAAMC,OAAO,IAAIC,mBAAmBxC,MAAMsC,IAAAA;AAC1C,SAAKV,WAAWxB,KAAKmC,IAAAA;AACrB,WAAOA;EACX;EAESxB,WAAmB;AAExB,UAAM0B,SAAgB;SAAI,KAAKxC;;AAE/B,QAAI,KAAK2B,WAAWc,SAAS,GAAG;AAE5BD,aAAOrC,KAAK,EAAA;IAChB;AAEAqC,WAAOrC,KAAI,GAAI,KAAKwB,UAAU;AAE9B,WACI,MAAMb,SAAAA,IACN,GAAG,KAAKe,SAAS,SAAS,OAAA,IAAW,KAAK9B,IAAI;IAC9CqB,aAAaoB,OAAOzB,IAAI,CAACC,MAAMA,EAAEF,SAAQ,CAAA,EAAIG,KAAK,IAAA,CAAA,IAClD;;EAER;AACJ;AAcO,IAAMyB,iBAAN,MAAMA;EArLb,OAqLaA;;;;;;EACTxB,YACWa,MACAY,OACAC,UACT;SAHSb,OAAAA;SACAY,QAAAA;SACAC,WAAAA;EACR;EAEH9B,WAAmB;AACf,WAAO,GAAG,KAAKiB,IAAI,GAAG,KAAKY,QAAQ,OAAO,EAAA,GACtC,KAAKC,WAAW,MAAM,EAAA;EAE9B;AACJ;AAEO,IAAMV,aAAN,cAAyBN,iBAAAA;EAnMhC,OAmMgCA;;;;;EAC5BV,YACWnB,MACAgC,MACPJ,aAAwD,CAAA,GACxDJ,iBAA2B,CAAA,GAC7B;AACE,UAAMA,gBAAgBI,UAAAA,GAAAA,KALf5B,OAAAA,MAAAA,KACAgC,OAAAA;EAKX;EAEAK,aAAarC,MAAcsC,OAAuB,CAAA,GAAoB;AAClE,UAAMC,OAAO,IAAIO,eAAe9C,MAAMsC,IAAAA;AACtC,SAAKV,WAAWxB,KAAKmC,IAAAA;AACrB,WAAOA;EACX;EAESxB,WAAmB;AACxB,WACI,MAAMA,SAAAA,IACN,GAAG,KAAKf,IAAI,IAAI,KAAKgC,IAAI,MACxB,KAAKJ,WAAWc,SAAS,IACpB,MAAM,KAAKd,WAAWZ,IAAI,CAAC+B,MAAMA,EAAEhC,SAAQ,CAAA,EAAIG,KAAK,GAAA,IACpD;EAEd;AACJ;AAEO,IAAM4B,iBAAN,MAAMA;EA9Nb,OA8NaA;;;;;EACT3B,YAAmBnB,MAAqBsC,OAAuB,CAAA,GAAI;SAAhDtC,OAAAA;SAAqBsC,OAAAA;EAA4B;EAEpEvB,WAAmB;AACf,WACI,GAAG,KAAKf,IAAI,MACZ,KAAKsC,KAAKtB,IAAI,CAAC+B,MAAMA,EAAEhC,SAAQ,CAAA,EAAIG,KAAK,IAAA,IACxC;EAER;AACJ;AAEO,IAAMsB,qBAAN,MAAMA;EA1Ob,OA0OaA;;;;;EACTrB,YAAmBnB,MAAqBsC,OAAuB,CAAA,GAAI;SAAhDtC,OAAAA;SAAqBsC,OAAAA;EAA4B;EAEpEvB,WAAmB;AACf,WACI,GAAG,KAAKf,IAAI,MACZ,KAAKsC,KAAKtB,IAAI,CAAC+B,MAAMA,EAAEhC,SAAQ,CAAA,EAAIG,KAAK,IAAA,IACxC;EAER;AACJ;AAaO,IAAM8B,eAAN,MAAMA;EAjQb,OAiQaA;;;;;EACTC,YACWC,MACAC,OACT;SAFSD,OAAAA;SACAC,QAAAA;EACR;EAEHC,WAAmB;AACf,WAAO,KAAKF,OACN,GAAG,KAAKA,IAAI,KAAK,KAAKC,KAAK,KAC3B,KAAKA,MAAMC,SAAQ;EAC7B;AACJ;AAEO,IAAMC,oBAAN,MAAMA;EA9Qb,OA8QaA;;;;;EACTJ,YACWK,MAOAH,OAOT;SAdSG,OAAAA;SAOAH,QAAAA;AAQP,YAAQG,MAAAA;MACJ,KAAK;AACD,YAAI,OAAOH,UAAU,SACjB,OAAM,IAAII,MAAM,sBAAA;AACpB;MACJ,KAAK;AACD,YAAI,OAAOJ,UAAU,YAAY,OAAOA,UAAU,SAC9C,OAAM,IAAII,MAAM,gCAAA;AACpB;MACJ,KAAK;AACD,YAAI,OAAOJ,UAAU,UACjB,OAAM,IAAII,MAAM,uBAAA;AACpB;MACJ,KAAK;AACD,YAAI,CAACC,MAAMC,QAAQN,KAAAA,EACf,OAAM,IAAII,MAAM,qBAAA;AACpB;MACJ,KAAK;AACD,YACI,OAAOJ,UAAU,YACjB,EAAEA,iBAAiBO,gBAEnB,OAAM,IAAIH,MAAM,wCAAA;AACpB;MACJ,KAAK;AACD,YAAI,EAAEJ,iBAAiBQ,cACnB,OAAM,IAAIJ,MAAM,4BAAA;AACpB;IACR;EACJ;EAEAH,WAAmB;AACf,YAAQ,KAAKE,MAAI;MACb,KAAK;AAED,eAAOM,KAAKC,UAAU,KAAKV,KAAK;MACpC,KAAK;AACD,eAAO,KAAKA,MAAMC,SAAQ;MAC9B,KAAK,kBAAkB;AACnB,YAAI,OAAO,KAAKD,UAAU,UAAU;AAChC,iBAAO,KAAKA;QAChB,OAAO;AACH,gBAAMW,KAAK,KAAKX;AAChB,cAAIY,IAAID,GAAGE;AACX,cAAIF,GAAGG,KAAKC,SAAS,GAAG;AACpBH,iBACI,MACAD,GAAGG,KAAKE,IAAI,CAACC,MAAMA,EAAEhB,SAAQ,CAAA,EAAIiB,KAAK,GAAA,IACtC;UACR;AACA,iBAAON;QACX;MACJ;MACA,KAAK;AACD,eAAO,KAAKZ,MAAMC,SAAQ;MAC9B,KAAK;AACD,eAAO,KAAKD,QAAQ,SAAS;MACjC,KAAK;AACD,eACI,MACC,KAAKA,MACDgB,IAAI,CAACG,MAAMA,EAAElB,SAAQ,CAAA,EACrBiB,KAAK,IAAA,IACV;MAER;AACI,cAAM,IAAId,MAAM,gCAAgC,KAAKD,IAAI,EAAE;IACnE;EACJ;AACJ;AAEO,IAAMI,iBAAN,MAAMA;EAtWb,OAsWaA;;;;;EACTT,YAAmBe,OAAsBC,OAA4B,CAAA,GAAI;SAAtDD,QAAAA;SAAsBC,OAAAA;EAAiC;AAC9E;AAEO,IAAMM,oBAAN,MAAMA;EA1Wb,OA0WaA;;;;;EACTtB,YAAmBC,MAAqBC,OAAe;SAApCD,OAAAA;SAAqBC,QAAAA;EAAgB;EAExDC,WAAmB;AACf,WAAO,GAAG,KAAKF,IAAI,KAAK,KAAKC,KAAK;EACtC;AACJ;AAEO,IAAMQ,eAAN,MAAMA;EAlXb,OAkXaA;;;;;EACTV,YAAmBuB,MAAqBP,OAA0B,CAAA,GAAI;SAAnDO,OAAAA;SAAqBP,OAAAA;EAA+B;EAEvEb,WAAmB;AACf,WACI,GAAG,KAAKoB,IAAI,MAEZ,KAAKP,KAAKE,IAAI,CAACC,MAAMA,EAAEhB,SAAQ,CAAA,EAAIiB,KAAK,IAAA,IACxC;EAER;AACJ;AAEO,IAAMI,kBAAN,MAAMA;EA/Xb,OA+XaA;;;;EACTxB,YAAmBE,OAAe;SAAfA,QAAAA;EAAgB;EAEnCC,WAAmB;AACf,WAAO,KAAKD;EAChB;AACJ;AAEO,IAAMuB,OAAN,cAAmBC,qBAAAA;EAvY1B,OAuY0BA;;;;EACfC;EAEP3B,YAAmBC,MAAc2B,iBAA2B,CAAA,GAAI;AAC5D,UAAMA,cAAAA,GAAAA,KADS3B,OAAAA,MAAAA,KAFZ0B,SAAsB,CAAA;EAI7B;EACAE,SACI5B,MACA6B,aAAwD,CAAA,GACxDF,iBAA2B,CAAA,GAClB;AACT,UAAMb,QAAQ,IAAIgB,UAAU9B,MAAM6B,YAAYF,cAAAA;AAC9C,SAAKD,OAAOK,KAAKjB,KAAAA;AACjB,WAAOA;EACX;EAEAkB,aAAahC,MAAce,OAAuB,CAAA,GAAI;AAClD,UAAMkB,OAAO,IAAIC,mBAAmBlC,MAAMe,IAAAA;AAC1C,SAAKc,WAAWE,KAAKE,IAAAA;AACrB,WAAOA;EACX;EAESE,WAAWnC,MAAsB;AACtC,SAAK2B,eAAeI,KAAK/B,IAAAA;AACzB,WAAOA;EACX;EAESE,WAAmB;AACxB,WACI,MAAMA,SAAAA,IACN,QAAQ,KAAKF,IAAI;IACjBoC,aACI;SAAI,KAAKV;SAAW,KAAKG;MACpBZ,IAAI,CAACoB,MAAMA,EAAEnC,SAAQ,CAAA,EACrBiB,KAAK,IAAA,CAAA,IAEd;EAER;AACJ;AAEO,IAAMW,YAAN,cAAwBQ,gBAAAA;EAhb/B,OAgb+BA;;;;;EAC3BvC,YACWC,MACA6B,aAAwD,CAAA,GAC/DF,iBAA2B,CAAA,GAC7B;AACE,UAAMA,cAAAA,GAAAA,KAJC3B,OAAAA,MAAAA,KACA6B,aAAAA;EAIX;EAEAG,aAAahC,MAAce,OAAuB,CAAA,GAAoB;AAClE,UAAMkB,OAAO,IAAIM,eAAevC,MAAMe,IAAAA;AACtC,SAAKc,WAAWE,KAAKE,IAAAA;AACrB,WAAOA;EACX;EAES/B,WAAmB;AACxB,WACI,MAAMA,SAAAA,IACN,KAAKF,QACJ,KAAK6B,WAAWb,SAAS,IACpB,MAAM,KAAKa,WAAWZ,IAAI,CAACC,MAAMA,EAAEhB,SAAQ,CAAA,EAAIiB,KAAK,GAAA,IACpD;EAEd;AACJ;;;AF/YO,IAAMqB,wBAAN,MAAMA;EAzDb,OAyDaA;;;;EACQC;EAOjBC,YAA6BC,QAAe;SAAfA,SAAAA;SAPZF,UAAU;;;;;;EAOkB;EAE7C,MAAMG,WAAW;AACb,UAAMC,SAAS,IAAIC,YAAAA;AAEnB,eAAWC,QAAQ,KAAKJ,OAAOK,cAAc;AACzC,cAAQD,KAAKE,OAAK;QACd,KAAKC;AACD,eAAKC,mBAAmBN,QAAQE,IAAAA;AAChC;QAEJ,KAAKK;AACD,eAAKC,aAAaR,QAAQE,IAAAA;AAC1B;QAEJ,KAAKO;AACD,eAAKC,cAAcV,QAAQE,IAAAA;AAC3B;QAEJ,KAAKS;AACD,eAAKC,kBAAkBZ,QAAQE,IAAAA;AAC/B;MACR;IACJ;AAEA,WAAO,KAAKN,UAAUI,OAAOa,SAAQ;EACzC;EAEQP,mBAAmBN,QAAqBc,YAAwB;AACpE,UAAMC,SAAwBD,WAAWC,OAAOC,IAAI,CAACC,OAAO;MACxDC,MAAMD,EAAEC;MACRC,MAAM,KAAKC,iBAAiBH,EAAEI,KAAK;IACvC,EAAA;AACArB,WAAOsB,cAAcR,WAAWI,MAAMH,MAAAA;EAC1C;EAEQK,iBAAiBG,MAAkB;AACvC,YAAIC,2BAAcD,IAAAA,GAAO;AACrB,aAAO,KAAKE,cAAcF,IAAAA;IAC9B,eAAWG,8BAAiBH,IAAAA,GAAO;AAC/B,YAAMI,KAAK,KAAKC,iBAAiBL,IAAAA;AACjC,aAAOI,GAAGd,SAAQ;IACtB,OAAO;AACH,aAAO,KAAKgB,kBAAkBN,IAAAA;IAClC;EACJ;EAEQM,kBAAkBN,MAAuB;AAC7C,WACI,MACAA,KAAKO,MACAd,IAAI,CAACe,SAAAA;AACF,cAAIP,2BAAcO,IAAAA,GAAO;AACrB,eAAO,KAAKN,cAAcM,IAAAA;MAC9B,OAAO;AACH,eACIA,KAAKb,QACJa,KAAKC,KAAKC,SAAS,IACd,MACAF,KAAKC,KACAhB,IAAI,CAACkB,QACF,KAAKC,0BAA0BD,GAAAA,CAAAA,EAElCE,KAAK,IAAA,IACV,MACA;MAEd;IACJ,CAAA,EACCA,KAAK,IAAA,IACV;EAER;EAEQD,0BAA0BD,KAA0B;AACxD,WAAO,GAAGA,IAAIhB,IAAI,KAAK,KAAKO,cAAcS,IAAIb,KAAK,CAAA;EACvD;EAEQI,cAAcF,MAAmB;AACrC,WAAOc,KAAKC,UAAUf,KAAKF,KAAK;EACpC;EAEQT,kBAAkBZ,QAAqBE,MAAqB;AAChEF,WAAOuC,aACHrC,KAAKgB,MACLhB,KAAKa,OAAOC,IAAI,CAACC,OAAO;MACpBC,MAAMD,EAAEC;MACRC,MAAM,KAAKC,iBAAiBH,EAAEI,KAAK;IACvC,EAAA,CAAA;EAER;EAEQX,cAAcV,QAAqBE,MAAiB;AACxD,UAAMsC,QAAQtC,KAAKuC,SACbzC,OAAO0C,QAAQxC,KAAKgB,IAAI,IACxBlB,OAAO2C,SAASzC,KAAKgB,IAAI;AAC/B,eAAW0B,SAAS1C,KAAKa,QAAQ;AAC7B,UAAI8B,oBAAWC,aAAaF,OAAO,WAAA,GAAc;AAC7C;MACJ;AAEA,WAAKG,mBAAmBP,OAAOI,KAAAA;IACnC;AAEA,eAAWI,QAAQ9C,KAAK+C,WAAWC,OAAO,CAACF,UACvC,KAAKG,kBAAkBH,KAAAA,CAAAA,GACxB;AACC,WAAKI,2BAA2BZ,OAAOQ,IAAAA;IAC3C;AAGA9C,SAAKmD,SAASC,QAAQ,CAACC,MAAMf,MAAMgB,WAAWD,CAAAA,CAAAA;EAiBlD;EAEQJ,kBACJH,MACF;AACE,QAAI,CAACA,KAAK9C,KAAKuD,KAAK;AAChB,aAAO;IACX;AACA,WAAOT,KAAK9C,KAAKuD,IAAIR,WAAWS,KAC5B,CAACC,MAAMA,EAAEzD,KAAKuD,KAAKvC,SAAS,WAAA;EAEpC;EAEQ0C,wBAAwBC,WAA+B;AAC3D,QAAIA,UAAUC,aAAa;AACvB,YAAMzC,QAAQ,KAAK0C,iBAAiBF,UAAUC,YAAYzC,KAAK;AAC/D,UAAIA,OAAO;AACP,eAAO,gBAAgBA,KAAAA;MAC3B,OAAO;AACH,eAAO2C;MACX;IACJ,OAAO;AACH,aAAOA;IACX;EACJ;EAEQD,iBAAiBE,MAA+C;AACpE,eAAOC,6BAAgBD,IAAAA,IAAQA,KAAK5C,QAAQ2C;EAChD;EAEQjB,mBACJP,OACAI,OACAuB,aAAa,OACf;AACE,QAAIN;AAEJ,QAAIjB,MAAMwB,KAAKA,MAAM;AAEjBP,kBAAYjB,MAAMwB,KAAKA;IAC3B,WAAWxB,MAAMwB,KAAKC,WAAWZ,KAAK;AAElC,cAAIa,uBAAU1B,MAAMwB,KAAKC,UAAUZ,GAAG,GAAG;AACrCI,oBAAY;MAChB,OAAO;AACHA,oBAAYjB,MAAMwB,KAAKC,UAAUZ,IAAIvC;MACzC;IACJ,OAAO;AAEH,YAAM4C,cAAc,KAAKF,wBAAwBhB,MAAMwB,IAAI;AAC3D,UAAIN,aAAa;AACbD,oBAAYC;MAChB;IACJ;AAEA,QAAI,CAACD,WAAW;AACZ,YAAM,IAAIU,MACN,+BAA+B3B,MAAM4B,WAAWtD,IAAI,IAAI0B,MAAM1B,IAAI,EAAE;IAE5E;AAEA,UAAMuD;;UAEFH,uBAAU1B,MAAMwB,KAAKC,WAAWZ,GAAAA,IAAO,QAAQb,MAAMwB,KAAKM;;AAC9D,UAAMN,OAAO,IAAIO,eACbd,WACAY,SACA7B,MAAMwB,KAAKQ,QAAQ;AAGvB,UAAM3B,aAAaL,MAAMK,WACpBC,OAAO,CAACF,SAAS,KAAKG,kBAAkBH,IAAAA,CAAAA,EAExCE,OAAO,CAACF,SAAS,CAAC,KAAK6B,8BAA8B7B,IAAAA,CAAAA,EACrDE,OACG,CAACF;;MAEG,EACIH,oBAAWiC,UAAUlC,KAAAA,KACrB,KAAKmC,wBAAwBnC,KAAAA,KAC7BI,KAAK9C,KAAK8E,aAAa;KAAS,EAG3ChE,IAAI,CAACgC,SAAS,KAAKiC,mBAAmBjC,IAAAA,CAAAA;AAE3C,UAAMkC,OAAO;SAAItC,MAAMS;;AACvB,UAAM8B,SAAS3C,MAAM4C,SACjBxC,MAAM1B,MACNkD,MACAnB,YACAiC,MACAf,UAAAA;AAaJ,WAAOgB;EACX;EAEQN,8BAA8B7B,MAA+B;AACjE,QAAIA,KAAK9C,KAAKuD,KAAKvC,SAAS,YAAY;AACpC,aAAO;IACX;AAEA,UAAMK,OAAOyB,KAAKhB,KAAK,CAAA,GAAIX;AAC3B,QAAI,CAACE,MAAM;AACP,aAAO;IACX;AAEA,WAAO8D,wBAASC,UAAU/D,IAAAA,EAAMmC,KAC5B,CAACO,aACGvC,8BAAiBuC,IAAAA,KAAS,KAAKsB,aAAatB,KAAKuB,SAAS/B,GAAG,CAAA;EAEzE;EAEQ8B,aAAatB,MAA2B;AAC5C,UAAMzB,QAAQ6C,wBAASI,mBAAmBxB,MAAMyB,mBAAAA;AAChD,WACI,CAAC,CAAClD,SACF,CAAC,CAACA,MAAMmD,aACRnD,MAAMmD,UAAUC,IAAIC,KAAKC,SAAS,eAAA;EAE1C;EAEQC,gBAAgBZ,QAAoBvC,OAAuB;AAC/D,UAAMoD,wBAAoBC,yBAAMrD,MAAMwB,KAAKA,IAAI,EAC1C8B,KAAK,UAAU,MAAM,IAAIC,kBAAkB,UAAU,EAAA,CAAA,EACrDD,KACGE,oBAAEC,MAAM,OAAO,UAAU,SAAS,SAAA,GAClC,MAAM,IAAIF,kBAAkB,UAAU,GAAA,CAAA,EAEzCD,KAAK,WAAW,MAAM,IAAIC,kBAAkB,WAAW,OAAA,CAAA,EACvDD,KACG,YACA,MACI,IAAIC,kBACA,gBACA,IAAIG,aAAmB,KAAA,CAAA,CAAA,EAGlCJ,KAAK,QAAQ,MAAM,IAAIC,kBAAkB,UAAU,IAAA,CAAA,EACnDD,KAAK,SAAS,MAAM,IAAIC,kBAAkB,UAAU,EAAA,CAAA,EACpDI,UAAU,MAAA;AACP,YAAM,IAAIhC,MACN,8CAA8C3B,MAAMwB,KAAKA,IAAI,EAAE;IAEvE,CAAA;AAEJe,WAAOlC,WAAWuD,KACd,IAAIC,eAAqB,YAAY;MACjC,IAAIC,aAAmB1C,QAAWgC,iBAAAA;KACrC,CAAA;EAET;EAEQjB,wBAAwBnC,OAAuB;AACnD,WACIA,MAAM+D,kBACN9D,oBAAW+D,gBAAgBhE,MAAM+D,cAAc;EAEvD;EAEQ1B,mBAAmBjC,MAA+B;AACtD,UAAM6D,WAAW7D,KAAK9C,KAAKuD,IAAKvC;AAChC,WAAO,IAAIuF,eACPI,UACA7D,KAAKhB,KAAKhB,IAAI,CAACkB,QAAQ,KAAK4E,iBAAiB5E,GAAAA,CAAAA,CAAAA;EAErD;EAEQ4E,iBAAiB5E,KAAuC;AAC5D,WAAO,IAAIwE,aACPxE,IAAIhB,MACJ,KAAK6F,sBAAsB7E,IAAIb,KAAK,CAAA;EAE5C;EAEQ0F,sBAAsB9C,MAA2C;AACrE,YAAIzC,2BAAcyC,IAAAA,GAAO;AACrB,YAAM+C,cAAUf,yBAAMhC,KAAK7D,KAAK,EAC3B8F,KAAKe,2BAAe,MAAM,QAAA,EAC1Bf,KAAKgB,2BAAe,MAAM,QAAA,EAC1BhB,KAAKiB,4BAAgB,MAAM,SAAA,EAC3BC,WAAU;AACf,aAAO,IAAIC,kBAAwBL,SAAS/C,KAAK5C,KAAK;IAC1D,eAAWiG,yBAAYrD,IAAAA,GAAO;AAC1B,aAAO,IAAIoD,kBACP,SACA,IAAIE,MAAAA,GACGtD,KAAKnC,MAAMd,IAAI,CAACe,SACf,KAAKgF,sBAAsBhF,IAAAA,CAAAA,CAAAA,CAAAA;IAI3C,eAAWyF,6BAAgBvD,IAAAA,GAAO;AAC9B,aAAO,IAAIoD,kBACP,kBACA,IAAII,eACAxD,KAAKyD,OAAOjE,IAAKvC,MACjB+C,KAAKjC,KAAKhB,IACN,CAACkB,QACG,IAAIyF,kBACAzF,IAAIhB,MACJ,KAAK0G,WAAW1F,IAAIb,KAAK,CAAA,CAAA,CAAA,CAAA;IAKjD,eAAWK,8BAAiBuC,IAAAA,GAAO;AAE/B,aAAO,IAAIoD,kBACP,gBACA,KAAKzF,iBAAiBqC,IAAAA,CAAAA;IAE9B,OAAO;AACH,YAAMM,MACF,mDAAmDN,KAAK7D,KAAK,EAAE;IAEvE;EACJ;EAEQwH,WAAWrG,MAAkB;AACjC,WAAO,IAAIsG,oBAAoB;MAAEC,OAAO;IAAS,CAAA,EAAG/H,SAASwB,IAAAA;EACjE;EAEAK,iBAAiBqC,MAA0C;AACvD,WAAO,IAAIqC,aACPrC,KAAKuB,SAAS/B,IAAKvC,MACnB+C,KAAKjC,KAAKhB,IAAI,CAACkB,QAAAA;AACX,YAAM6F,UAAM9B,yBAAM/D,IAAIb,KAAK,EACtB2G,KAAK9D,6BAAiB,CAAC+D,MAAM,IAAIA,EAAE5G,KAAK,GAAG,EAC3C2G,KAAKxG,2BAAe,CAACyG,MAAMA,EAAE5G,MAAMR,SAAQ,CAAA,EAC3CmH,KAAKE,wBAAY,MAAM,MAAA,EACvB3B,UAAU,MAAA;AACP,cAAM,IAAIhC,MACN,gDAAA;MAER,CAAA;AAEJ,aAAO,IAAI4D,gBAAsBJ,GAAAA;IACrC,CAAA,CAAA;EAER;EAEQ3E,2BACJgF,WACApF,MACF;AACE,UAAM6D,WAAW7D,KAAK9C,KAAKuD,IAAKvC;AAChCkH,cAAUnF,WAAWuD,KACjB,IAAI6B,mBACAxB,UACA7D,KAAKhB,KAAKhB,IAAI,CAACkB,QAAQ,KAAK4E,iBAAiB5E,GAAAA,CAAAA,CAAAA,CAAAA;EAGzD;EAEQ1B,aAAaR,QAAqBE,MAAY;AAClD,UAAMoI,QAAQtI,OAAOuI,QAAQrI,KAAKgB,IAAI;AAEtC,eAAW0B,SAAS1C,KAAKa,QAAQ;AAC7B,WAAKyH,kBAAkBF,OAAO1F,KAAAA;IAClC;AAEA,eAAWI,QAAQ9C,KAAK+C,WAAWC,OAAO,CAACF,UACvC,KAAKG,kBAAkBH,KAAAA,CAAAA,GACxB;AACC,WAAKI,2BAA2BkF,OAAOtF,IAAAA;IAC3C;AAGA9C,SAAKmD,SAASC,QAAQ,CAACC,MAAM+E,MAAM9E,WAAWD,CAAAA,CAAAA;EAClD;EAEQiF,kBAAkBF,OAAmB1F,OAAkB;AAC3D,UAAMK,aAAaL,MAAMK,WACpBC,OAAO,CAACF,SAAS,KAAKG,kBAAkBH,IAAAA,CAAAA,EACxChC,IAAI,CAACgC,SAAS,KAAKiC,mBAAmBjC,IAAAA,CAAAA;AAE3C,UAAMkC,OAAO;SAAItC,MAAMS;;AACvBiF,UAAMlD,SAASxC,MAAM1B,MAAM+B,YAAYiC,IAAAA;EAC3C;AACJ;;;AGneA,sBAA6B;AAC7B,IAAAuD,cAgCO;AACP,qBAAe;AACf,uBAAiB;AACjB,4BAAsB;AACtB,IAAAC,qBAAsB;AACtB,SAAoB;AAUb,IAAMC,oBAAN,MAAMA;EAhDb,OAgDaA;;;EACT,MAAaC,SACTC,YACAC,kBACAC,YACF;AACE,UAAMC,SAAS,UAAMC,8BAAaJ,YAAYC,gBAAAA;AAC9C,QAAI,CAACE,OAAOE,SAAS;AACjB,YAAM,IAAIC,MAAM,wBAAwBH,OAAOI,OAAOC,KAAK,IAAA,CAAA,EAAO;IACtE;AAEA,UAAM,EAAEC,OAAOC,SAAQ,IAAKP;AAC5B,UAAMQ,aAA6B,CAAA;AAEnC,SAAKC,yBAAyBH,OAAOE,UAAAA;AAErC,SAAKE,uBAAuBF,UAAAA;AAE5B,UAAMG,aAAgBC,oBAClBb,YACA,IACGc,gBAAaC,QAChB,OACGC,cAAWC,EAAE;AAEpB,UAAMC,UAAaC,iBAAa;AAChC,UAAMC,SAASF,QAAQG,UAChBC,cAAWC,WACXC,WAAQC,gBAAgBhB,UAAAA,GAC3BG,UAAAA;AAGJc,mBAAAA,QAAGC,UAAUC,iBAAAA,QAAKC,QAAQ7B,UAAAA,GAAa;MAAE8B,WAAW;IAAK,CAAA;AACzDJ,mBAAAA,QAAGK,cAAc/B,YAAYoB,MAAAA;AAE7B,WAAO;MAAEb;MAAOC;IAAS;EAC7B;EAEQE,yBAAyBH,OAAcE,YAA4B;AACvE,UAAMuB,oBAAoBzB,MAAM0B,aAAaC,KACzC,CAACC,UACGC,yBAAYD,CAAAA,KACZA,EAAEE,OAAOH,KAAK,CAACI,MAAMC,aAAaD,GAAG,WAAA,CAAA,CAAA;AAG7C,UAAME,oBAAuBhB,WAAQiB,wBACjCC,QACGlB,WAAQmB,mBACP,OACAD,QACGlB,WAAQoB,mBAAmB;MACvBpB,WAAQqB,sBACP,MACAH,QACGlB,WAAQsB,iBAAiB,WAAA,CAAA;SAE5Bd,oBACE;QACOR,WAAQqB,sBACP,MACAH,QACGlB,WAAQsB,iBACP,mBAAA,CAAA;UAIZ,CAAA;MACHtB,WAAQqB,sBACP,OACAH,QACGlB,WAAQsB,iBAAiB,iBAAA,CAAA;KAEnC,CAAA,GAEFtB,WAAQuB,oBAAoB,4BAAA,CAAA;AAEnCtC,eAAWuC,KAAKR,iBAAAA;AAEhB,UAAM,EAAES,MAAMC,aAAY,IAAK,KAAKC,sBAAsB5C,KAAAA;AAC1D,YAAQ2C,cAAAA;MACJ,KAAK,UAAU;AAIX,cAAME,iBAAoB5B,WAAQiB,wBAC9BC,QACGlB,WAAQmB,mBACP,OACGnB,WAAQsB,iBAAiB,MAAA,GAC5BJ,MAAAA,GAEDlB,WAAQuB,oBAAoB,WAAA,CAAA;AAEnCtC,mBAAWuC,KAAKI,cAAAA;AAGhB,cAAMC,gBAAmB7B,WAAQiB,wBAC7BC,QACGlB,WAAQmB,mBACP,OACGnB,WAAQsB,iBAAiB,KAAA,GAC5BJ,MAAAA,GAEDlB,WAAQuB,oBAAoB,UAAA,CAAA;AAEnCtC,mBAAWuC,KAAKK,aAAAA;AAGhB,cAAMC,0BACC9B,WAAQiB,wBACPC,QACGlB,WAAQmB,mBACP,OACAD,QACGlB,WAAQoB,mBAAmB;UACvBpB,WAAQqB,sBACP,OACAH,QACGlB,WAAQsB,iBACP,iBAAA,CAAA;SAGX,CAAA,GAEFtB,WAAQuB,oBACP,wCAAA,CAAA;AAGZtC,mBAAWuC,KAAKM,uBAAAA;AAChB;MACJ;MAEA,KAAK,cAAc;AAEf,cAAMA,0BACC9B,WAAQiB,wBACPC,QACGlB,WAAQmB,mBACP,OACAD,QACGlB,WAAQoB,mBAAmB;UACvBpB,WAAQqB,sBACP,OACAH,QACGlB,WAAQsB,iBACP,iBAAA,CAAA;SAGX,CAAA,GAEFtB,WAAQuB,oBACP,oCAAA,CAAA;AAGZtC,mBAAWuC,KAAKM,uBAAAA;AAChB;MACJ;IACJ;AAEA,UAAMC,cAAiB/B,WAAQgC,wBAC3B;MAAIhC,WAAQiC,eAAkBC,cAAWC,aAAa;OACnDnC,WAAQoC,8BACP;MACOpC,WAAQqC,0BACP,UACAnB,QACAA,QACGlB,WAAQsC,0BACJtC,WAAQuC,mBACP,KAAKC,mBAAmBzD,KAAAA,GACrBiB,WAAQyC,wBAAwB,OAAA,CAAA,GAEpCzC,WAAQyC,wBAAwB,WAAA,CAAA,CAAA;OAI5CC,aAAUC,KAAK,CAAA;AAG1B1D,eAAWuC,KAAKO,WAAAA;AAGhB,UAAMa,kBAAqB5C,WAAQ6C,2BAC/B;MAAI7C,WAAQiC,eAAkBC,cAAWC,aAAa;OACtD,cACAjB,QACGlB,WAAQyC,wBAAwB,eAAA,CAAA;AAEvCxD,eAAWuC,KAAKoB,eAAAA;EACpB;EAEQJ,mBAAmBzD,OAAc;AACrC,UAAM+D,aAAsC;;MAErC9C,WAAQ+C,yBACP,YACA,KAAKC,qBAAqBjE,KAAAA,CAAAA;;MAI3BiB,WAAQ+C,yBACP,UACA,KAAKE,mBAAmBlE,KAAAA,CAAAA;;AAKhC,UAAMmE,QAAQnE,MAAM0B,aAAa0C,OAAOC,kBAAAA;AACxC,QAAIF,MAAMG,SAAS,GAAG;AAClBP,iBAAWtB,KACJxB,WAAQ+C,yBACP,SACG/C,WAAQsD,8BACPJ,MAAMK,IAAI,CAACC,MACJxD,WAAQ+C,yBACPS,EAAEC,MACF,KAAKC,iBAAiBF,CAAAA,CAAAA,CAAAA,GAG9B,IAAA,CAAA,CAAA;IAIhB;AAGA,UAAMG,WAAWC,YAAY7E,KAAAA;AAC7B,QAAI4E,UAAU;AACVb,iBAAWtB,KACJxB,WAAQ+C,yBACP,YACA,KAAKc,kBAAkBF,SAASF,IAAI,CAAA,CAAA;IAGhD;AAGA,UAAMK,aAAa/E,MAAM0B,aAAa0C,OAAOY,uBAAAA;AAC7C,QAAID,WAAWT,SAAS,GAAG;AACvBP,iBAAWtB,KACJxB,WAAQ+C,yBACP,cACA,KAAKiB,uBAAuBF,UAAAA,CAAAA,CAAAA;IAGxC;AAGAhB,eAAWtB,KACJxB,WAAQ+C,yBACP,WACG/C,WAAQsD,8BAA8B,CAAA,GAAI,IAAA,CAAA,CAAA;AAIrD,WAAUtD,WAAQsD,8BAA8BR,YAAY,IAAA;EAChE;EAEQE,qBAAqBjE,OAA6B;AACtD,UAAMkF,aAAa,KAAKtC,sBAAsB5C,KAAAA;AAC9C,WAAUiB,WAAQsD,8BACd;MACOtD,WAAQ+C,yBACP,QACG/C,WAAQuB,oBAAoB0C,WAAWxC,IAAI,CAAA;MAE/CzB,WAAQ+C,yBACP,yBACA,KAAKmB,4BAA4BD,UAAAA,CAAAA;OAGzC,IAAA;EAER;EAEQhB,mBAAmBlE,OAAc;AACrC,WAAUiB,WAAQsD,8BACdvE,MAAM0B,aACD0C,OACG,CAACxC,UACGC,yBAAYD,CAAAA,KAAM,CAACI,aAAaJ,GAAG,UAAA,CAAA,EAE1C4C,IAAI,CAACY,OACCnE,WAAQ+C,yBACPoB,GAAGV,MACH,KAAKW,sBAAsBD,EAAAA,CAAAA,CAAAA,GAGvC,IAAA;EAER;EAEQC,sBAAsBD,IAAe;AACzC,UAAMtD,SAAkC;;MAEjCb,WAAQ+C,yBACP,UACG/C,WAAQsD,8BACPa,GAAGtD,OACEsC,OAAO,CAACkB,UAAU,CAACtD,aAAasD,OAAO,SAAA,CAAA,EACvCd,IAAI,CAACc,UACCrE,WAAQ+C,yBACPsB,MAAMZ,MACN,KAAKa,2BAA2BD,KAAAA,CAAAA,CAAAA,GAG5C,IAAA,CAAA;;SAKJF,GAAGI,WAAWlB,SAAS,IACrB;QACOrD,WAAQ+C,yBACP,cACG/C,WAAQwE,6BACPL,GAAGI,WAAWhB,IAAI,CAACkB,SACf,KAAKC,sBAAsBD,IAAAA,CAAAA,GAE/B,IAAA,CAAA;UAIZ,CAAA;;MAGHzE,WAAQ+C,yBACP,YACG/C,WAAQwE,6BACP,KAAKG,YAAYR,EAAAA,EAAIZ,IAAI,CAACqB,YACnB5E,WAAQuB,oBAAoBqD,OAAAA,CAAAA,CAAAA,CAAAA;;MAMxC5E,WAAQ+C,yBACP,gBACA,KAAK8B,yBAAyBV,EAAAA,CAAAA;;AAItC,UAAMW,iBAAiBX,GAAGtD,OAAOsC,OAAO,CAACrC,MACrCC,aAAaD,GAAG,WAAA,CAAA;AAGpB,QAAIgE,eAAezB,SAAS,GAAG;AAC3BxC,aAAOW,KACAxB,WAAQ+C,yBACP,kBACA,KAAKgC,2BAA2BD,cAAAA,CAAAA,CAAAA;IAG5C;AAEA,WAAU9E,WAAQsD,8BAA8BzC,QAAQ,IAAA;EAC5D;EAEQkE,2BAA2BlE,QAA0B;AACzD,WAAUb,WAAQsD,8BACdzC,OAAO0C,IAAI,CAACc,UACLrE,WAAQgF,wBACP9D,QACAA,QACAmD,MAAMZ,MACNvC,QACAA,QACA,CAAA,GACGlB,WAAQyC,wBAAwB,qBAAqB;MACjDzC,WAAQiF,sBACP,KAAKC,yBAAyBb,MAAM5C,KAAKA,IAAI,CAAA;KAEpD,GACEzB,WAAQmF,YACP;MACOnF,WAAQoF,qBACJpF,WAAQqF,oBACJrF,WAAQsB,iBAAiB,OAAA,GAC5BJ,QACA;QACOlB,WAAQuB,oBACP,mCAAA;OAEP,CAAA;OAIb,IAAA,CAAA,CAAA,GAIZ,IAAA;EAER;EAEQ2D,yBAAyBzD,MAAc;AAC3C,eAAO6D,0BAAwC7D,IAAAA,EAC1C8D,KAAK,UAAU,MAASrD,cAAWsD,aAAa,EAChDD,KAAK,WAAW,MAASrD,cAAWuD,cAAc,EAClDF,KAAK,OAAO,MAASrD,cAAWwD,aAAa,EAC7CH,KAAK,SAAS,MAASrD,cAAWwD,aAAa,EAC/CH,KAAK,UAAU,MAASrD,cAAWyD,aAAa,EAChDJ,KAAK,WAAW,MAASrD,cAAWwD,aAAa,EACjDE,UAAU,MAAS1D,cAAW2D,cAAc;EACrD;EAEQvB,2BAA2BD,OAAuB;AACtD,UAAMyB,eAAe;MACd9F,WAAQ+C,yBACP,QACG/C,WAAQuB,oBACP8C,MAAM5C,KAAKA,QAAQ4C,MAAM5C,KAAKsE,UAAWC,QAAQ,CAAA;;AAK7D,QAAIC,UAAU5B,KAAAA,GAAQ;AAClByB,mBAAatE,KACNxB,WAAQ+C,yBACP,MACG/C,WAAQkG,WAAU,CAAA,CAAA;IAGjC;AAEA,QAAIC,cAAc9B,KAAAA,GAAQ;AACtByB,mBAAatE,KACNxB,WAAQ+C,yBACP,UACG/C,WAAQkG,WAAU,CAAA,CAAA;IAGjC;AAEA,QAAI7B,MAAM5C,KAAK2E,UAAU;AACrBN,mBAAatE,KACNxB,WAAQ+C,yBACP,YACG/C,WAAQkG,WAAU,CAAA,CAAA;IAGjC;AAEA,QAAI7B,MAAM5C,KAAK4E,OAAO;AAClBP,mBAAatE,KACNxB,WAAQ+C,yBACP,SACG/C,WAAQkG,WAAU,CAAA,CAAA;IAGjC;AAEA,QAAInF,aAAasD,OAAO,YAAA,GAAe;AACnCyB,mBAAatE,KACNxB,WAAQ+C,yBACP,aACG/C,WAAQkG,WAAU,CAAA,CAAA;IAGjC;AAGA,QAAI7B,MAAME,WAAWlB,SAAS,GAAG;AAC7ByC,mBAAatE,KACNxB,WAAQ+C,yBACP,cACG/C,WAAQwE,6BACPH,MAAME,WAAWhB,IAAI,CAACkB,SAClB,KAAKC,sBAAsBD,IAAAA,CAAAA,CAAAA,CAAAA,CAAAA;IAK/C;AAEA,UAAM6B,eAAe,KAAKC,iBAAiBlC,KAAAA;AAC3C,QAAIiC,iBAAiBpF,QAAW;AAC5B,UAAI,OAAOoF,iBAAiB,UAAU;AAClC,YAAI,UAAUA,cAAc;AACxBR,uBAAatE,KACNxB,WAAQ+C,yBACP,WAEG/C,WAAQwG,qBACJxG,WAAQsB,iBACP,sBAAA,GAEJJ,QACA;YACOlB,WAAQuB,oBACP+E,aAAaG,IAAI;eAEjBH,aAAaI,KAAKrD,SAAS,IACzB;cACOrD,WAAQwE,6BACP8B,aAAaI,KAAKnD,IAAI,CAACoD,QACnB,KAAK9C,kBACD8C,GAAAA,CAAAA,CAAAA;gBAKhB,CAAA;WACT,CAAA,CAAA;QAIjB,WAAW,gBAAgBL,cAAc;AACrCR,uBAAatE,KACNxB,WAAQ+C,yBACP,WACG/C,WAAQwG,qBACJxG,WAAQsB,iBACP,wBAAA,GAEJJ,QACA;YACOlB,WAAQwG,qBACJxG,WAAQsB,iBACP,sBAAA,GAEJJ,QACA;cAAIlB,WAAQuB,oBAAoB,MAAA;aAAQ;YAEzCvB,WAAQwE,6BACP8B,aAAaM,WAAWrD,IAAI,CAACsD,MACtB7G,WAAQuB,oBAAoBsF,CAAAA,CAAAA,CAAAA;WAG1C,CAAA,CAAA;QAIjB,OAAO;AACH,gBAAM,IAAIjI,MACN,4CAA4CyF,MAAMZ,IAAI,EAAE;QAEhE;MACJ,OAAO;AACHqC,qBAAatE,KACNxB,WAAQ+C,yBACP,WACA,OAAOuD,iBAAiB,WACftG,WAAQuB,oBAAoB+E,YAAAA,IAC/B,OAAOA,iBAAiB,WACrBtG,WAAQ8G,qBAAqBR,YAAAA,IAChCA,iBAAiB,OACdtG,WAAQkG,WAAU,IAClBlG,WAAQ+G,YAAW,CAAA,CAAA;MAGxC;IACJ;AAEA,QAAIhG,aAAasD,OAAO,WAAA,GAAc;AAClCyB,mBAAatE,KACNxB,WAAQ+C,yBACP,YACG/C,WAAQkG,WAAU,CAAA,CAAA;IAGjC;AAEA,YAAItF,yBAAYyD,MAAM5C,KAAKsE,WAAWiB,GAAAA,GAAM;AACxClB,mBAAatE,KACNxB,WAAQ+C,yBACP,YACA,KAAKkE,qBAAqB5C,KAAAA,CAAAA,CAAAA;IAGtC;AAEA,UAAM6C,QAAQ,KAAKC,iBAAiB9C,KAAAA;AACpC,QAAI6C,SAASA,MAAM7D,SAAS,GAAG;AAC3ByC,mBAAatE,KACNxB,WAAQ+C,yBACP,iBACG/C,WAAQwE,6BACP0C,MAAM3D,IAAI,CAAC6D,OAAUpH,WAAQuB,oBAAoB6F,EAAAA,CAAAA,GACjD,IAAA,CAAA,CAAA;IAIhB;AAEA,WAAUpH,WAAQsD,8BAA8BwC,cAAc,IAAA;EAClE;EAEQnE,sBACJ5C,OAGgD;AAChD,UAAMsI,aAAatI,MAAM0B,aAAa6G,KAAKC,wBAAAA;AAC3CC,8BAAAA,SAAUH,YAAY,mCAAA;AAEtB,UAAMI,eAAeJ,WAAWxG,OAAOyG,KACnC,CAACxG,MAAMA,EAAE2C,SAAS,UAAA,GACnBiE;AACHF,8BAAAA,aAAUG,2BAAcF,YAAAA,GAAe,4BAAA;AACvC,UAAMhG,OAAOgG,aAAaC;AAE1B,UAAME,UAAUP,WAAWxG,OAAOyG,KAAK,CAACxG,MAAMA,EAAE2C,SAAS,KAAA,GAAQiE;AACjEF,8BAAAA,aACIG,2BAAcC,OAAAA,SAAYC,8BAAiBD,OAAAA,GAC3C,uCAAA;AAGJ,YAAID,2BAAcC,OAAAA,GAAU;AACxB,aAAO;QAAEnG;QAAMqG,KAAKF,QAAQF;QAAiBK,KAAK7G;MAAU;IAChE,eAAW2G,8BAAiBD,OAAAA,GAAU;AAClCJ,gCAAAA,SACII,QAAQI,SAAShC,aAAa,OAC9B,kCAAA;AAEJwB,gCAAAA,SACII,QAAQlB,KAAKrD,WAAW,GACxB,qCAAA;AAEJ,aAAO;QACH5B;QACAsG,KAAMH,QAAQlB,KAAK,CAAA,EAAIgB,MAAsBA;QAC7CI,KAAK5G;MACT;IACJ,OAAO;AACH,YAAM,IAAItC,MAAM,sBAAA;IACpB;EACJ;EAEQ2H,iBACJlC,OAOY;AACZ,UAAM4D,cAAcC,aAAa7D,OAAO,UAAA;AACxC,QAAI,CAAC4D,aAAa;AACd,aAAO/G;IACX;AAEA,UAAMoF,eAAe2B,YAAYvB,KAAK,CAAA,GAAIgB;AAC1CF,8BAAAA,SAAUlB,cAAc,0BAAA;AAExB,YAAIqB,2BAAcrB,YAAAA,GAAe;AAC7B,YAAM6B,MAAO7B,aAA6BoB;AAC1C,aAAOrD,MAAM5C,KAAKA,SAAS,YACpB0G,MACD;QAAC;QAAO;QAAS;QAAW;QAAUC,SAClC/D,MAAM5C,KAAKA,IAAI,IAEnB4G,OAAOF,GAAAA,IACPA;IACV,eACIG,6BAAgBhC,YAAAA,SAChBiC,yBAAYjC,aAAakC,OAAOxB,GAAG,GACrC;AACE,aAAOV,aAAakC,OAAOxB,IAAIvD;IACnC,eAAWoE,8BAAiBvB,YAAAA,GAAe;AACvC,aAAO;QACHG,MAAMH,aAAa0B,SAAShC;QAC5BU,MAAMJ,aAAaI,KAAKnD,IAAI,CAACoD,QACzB,KAAK8B,WAAW9B,IAAIe,KAAK,CAAA;MAEjC;IACJ,WAAW,KAAKgB,mBAAmBpC,YAAAA,GAAe;AAC9C,aAAO;QACHM,YAAY,KAAK+B,qBAAqBrC,YAAAA;MAC1C;IACJ,OAAO;AACH,YAAM,IAAI1H,MACN,4CAA4CyF,MAAMZ,IAAI,EAAE;IAEhE;EACJ;EAEQkF,qBAAqBC,MAAkC;AAC3D,QAAI,KAACC,gCAAmBD,KAAKE,OAAO,GAAG;AACnC,aAAO;QAACF,KAAKG,OAAO/C;;IACxB,OAAO;AACH,aAAO;WACA,KAAK2C,qBAAqBC,KAAKE,OAAO;QACzCF,KAAKG,OAAO/C;;IAEpB;EACJ;EAEQ0C,mBAAmBE,MAA4C;AACnE,YAAIC,gCAAmBD,IAAAA,GAAO;AAC1B,aACI,KAAKI,iBAAiBJ,KAAKE,OAAO,KAClC,KAAKJ,mBAAmBE,KAAKE,OAAO;IAE5C,OAAO;AACH,aAAO;IACX;EACJ;EAEQE,iBAAiBJ,MAAkB;AACvC,eACIf,8BAAiBe,IAAAA,KACjBA,KAAKZ,SAAShC,aAAa,UAC3BiD,oBAAWC,aAAaN,KAAKZ,SAAShB,GAAG;EAEjD;EAEQC,qBAAqB5C,OAAuB;AAChD,UAAM8E,iBAA0C,CAAA;AAEhD,UAAMC,mBAAmB,KAAKC,yBAAyBhF,KAAAA;AACvD,QAAI+E,kBAAkB;AAClBD,qBAAe3H,KACRxB,WAAQ+C,yBACP,YACG/C,WAAQuB,oBAAoB6H,iBAAiB3F,IAAI,CAAA,CAAA;IAGhE;AAEA,UAAM6F,eAAe,KAAKC,gBAAgBlF,KAAAA;AAC1C,QAAIiF,cAAc;AACdH,qBAAe3H,KACRxB,WAAQ+C,yBACP,QACG/C,WAAQuB,oBAAoB+H,YAAAA,CAAAA,CAAAA;IAG3C;AAEA,UAAME,WAAWtB,aAAa7D,OAAO,WAAA;AACrC,QAAImF,UAAU;AACV,iBAAW7C,OAAO6C,SAAS9C,MAAM;AAC7B,cAAM+C,QAAQ9C,IAAI+C,eAAejG;AACjC,YAAIgG,UAAU,YAAYA,UAAU,cAAc;AAC9C,gBAAME,aAAa,KAAKC,kBAAkBjD,IAAIe,KAAK;AACnD,cAAIiC,YAAY;AACZR,2BAAe3H,KACRxB,WAAQ+C,yBACP0G,OACGzJ,WAAQwE,6BACPmF,WAAWpG,IAAI,CAACsG,OACT7J,WAAQuB,oBAAoBsI,EAAAA,CAAAA,CAAAA,CAAAA,CAAAA;UAKnD;QACJ;AAEA,YAAIJ,UAAU,cAAcA,UAAU,YAAY;AAC9C,gBAAMK,SAAUnD,IAAIe,MAAwBc,OAAOxC;AACnDmD,yBAAe3H,KACRxB,WAAQ+C,yBACP0G,OACGzJ,WAAQuB,oBAAoBuI,MAAAA,CAAAA,CAAAA;QAG3C;MACJ;IACJ;AAEA,WAAU9J,WAAQsD,8BAA8B6F,cAAAA;EACpD;EAEQS,kBAAkBhB,MAAkB;AACxC,eACImB,yBAAYnB,IAAAA,KACZA,KAAKoB,MAAMzG,IAAI,CAAC0G,SAAUA,KAAuBzB,OAAOxC,QAAQ;EAExE;EAEQmB,iBAAiB9C,OAAuB;AAC5C,UAAMzE,SAAmB,CAAA;AACzB,eAAWkB,KAAKuD,MAAM6F,WAAWrJ,QAAQ;AACrC,YAAM2I,WAAWtB,aAAapH,GAAG,WAAA;AACjC,UAAI0I,UAAU;AACV,mBAAW7C,OAAO6C,SAAS9C,MAAM;AAC7B,cACIC,IAAIlD,SAAS,gBACbsG,yBAAYpD,IAAIe,KAAK,KACrBf,IAAIe,MAAMsC,MAAMtJ,KACZ,CAACmJ,WACGvB,6BAAgBuB,EAAAA,KAAOA,GAAGrB,OAAOxB,QAAQ3C,KAAAA,GAEnD;AACEzE,mBAAO4B,KAAKV,EAAE2C,IAAI;UACtB;QACJ;MACJ;IACJ;AACA,WAAO7D;EACX;EAEQyJ,yBAAyBhF,OAAuB;AACpD,QACI,CAACA,MAAM5C,KAAKsE,WAAWiB,OACvB,KAACpG,yBAAYyD,MAAM5C,KAAKsE,WAAWiB,GAAAA,GACrC;AACE,aAAO9F;IACX;AAEA,UAAMiJ,cAAc9F,MAAM6F;AAC1B,UAAME,cAAc/F,MAAM5C,KAAKsE,UAAUiB;AACzC,UAAMsC,eAAe,KAAKC,gBAAgBlF,KAAAA;AAC1C,eAAWgG,cAAcD,YAAYvJ,QAAQ;AACzC,UAAIwJ,eAAehG,OAAO;AAEtB;MACJ;AACA,UAAIgG,WAAW5I,KAAKsE,WAAWiB,QAAQmD,aAAa;AAChD,YAAIb,cAAc;AAEd,gBAAMgB,oBAAoB,KAAKf,gBAAgBc,UAAAA;AAC/C,cAAIC,sBAAsBhB,cAAc;AACpC,mBAAOe;UACX;QACJ,OAAO;AACH,iBAAOA;QACX;MACJ;IACJ;AACA,WAAOnJ;EACX;EAEQqI,gBAAgBlF,OAAuB;AAC3C,UAAMmF,WAAWtB,aAAa7D,OAAO,WAAA;AACrC,QAAImF,UAAU;AACV,YAAMe,UAAUf,SAAS9C,KAAKY,KAC1B,CAACX,QAAQA,IAAI+C,eAAejG,SAAS,MAAA;AAEzC,UAAI8G,SAAS;AACT/C,kCAAAA,aACIG,2BAAc4C,QAAQ7C,KAAK,GAC3B,wBAAA;AAEJ,eAAO6C,QAAQ7C,MAAMA;MACzB;IACJ;AACA,WAAOxG;EACX;EAEQyD,YAAYR,IAAe;AAC/B,WAAOA,GAAGtD,OAAOsC,OAAO8C,SAAAA,EAAW1C,IAAI,CAACzC,MAAMA,EAAE2C,IAAI;EACxD;EAEQoB,yBAAyBV,IAAe;AAC5C,UAAMrB,aAAsC,CAAA;AAG5C,eAAWuB,SAASF,GAAGtD,QAAQ;AAC3B,UAAIE,aAAasD,OAAO,KAAA,KAAUtD,aAAasD,OAAO,SAAA,GAAY;AAC9DvB,mBAAWtB,KACJxB,WAAQ+C,yBACPsB,MAAMZ,MACHzD,WAAQsD,8BAA8B;UAClCtD,WAAQ+C,yBACP,QACG/C,WAAQuB,oBAAoB8C,MAAM5C,KAAKA,IAAI,CAAA;SAErD,CAAA,CAAA;MAGb;IACJ;AAGA,eAAWgD,QAAQN,GAAGI,YAAY;AAC9B,UACIE,KAAK+F,KAAKxE,aAAa,UACvBvB,KAAK+F,KAAKxE,aAAa,YACzB;AACE,cAAM2D,aAAa,KAAKC,kBAAkBnF,KAAKiC,KAAK,CAAA,EAAIgB,KAAK;AAC7D,YAAI,CAACiC,YAAY;AACb;QACJ;AAEA,YAAIA,WAAWtG,WAAW,GAAG;AAEzB,gBAAMoH,WAAWtG,GAAGtD,OAAOyG,KACvB,CAACxG,MAAMA,EAAE2C,SAASkG,WAAW,CAAA,CAAE;AAEnC7G,qBAAWtB,KACJxB,WAAQ+C,yBACP4G,WAAW,CAAA,GACR3J,WAAQsD,8BAA8B;YAClCtD,WAAQ+C,yBACP,QACG/C,WAAQuB,oBACPkJ,SAAShJ,KAAKA,IAAI,CAAA;WAG7B,CAAA,CAAA;QAGb,OAAO;AAEHqB,qBAAWtB,KACJxB,WAAQ+C,yBACP4G,WAAW7K,KAAK,GAAA,GACbkB,WAAQsD,8BACPqG,WAAWpG,IAAI,CAACc,UAAAA;AACZ,kBAAMoG,WAAWtG,GAAGtD,OAAOyG,KACvB,CAACxG,MAAMA,EAAE2C,SAASY,KAAAA;AAEtB,mBAAUrE,WAAQ+C,yBACdsB,OACGrE,WAAQsD,8BACP;cACOtD,WAAQ+C,yBACP,QACG/C,WAAQuB,oBACPkJ,SAAShJ,KAAKA,IAAI,CAAA;aAG7B,CAAA;UAGb,CAAA,CAAA,CAAA,CAAA;QAIhB;MACJ;IACJ;AAEA,WAAUzB,WAAQsD,8BAA8BR,YAAY,IAAA;EAChE;EAEQY,iBAAiBF,GAAS;AAC9B,WAAUxD,WAAQsD,8BACdE,EAAE3C,OAAO0C,IAAI,CAACc,UACPrE,WAAQ+C,yBACPsB,MAAMZ,MACHzD,WAAQuB,oBAAoB8C,MAAMZ,IAAI,CAAA,CAAA,GAGjD,IAAA;EAER;EAEQgF,WAAWG,MAAkB;AACjC,QAAI,KAACjB,2BAAciB,IAAAA,GAAO;AACtB,YAAM,IAAIhK,MAAM,+BAAA;IACpB;AACA,YAAQgK,MAAM8B,OAAAA;MACV,KAAK;MACL,KAAK;AACD,eAAO9B,KAAKlB;MAChB,KAAK;AACD,eAAOiD,WAAW/B,KAAKlB,KAAK;MAChC;AACI,cAAM,IAAI9I,MAAM,0BAAA;IACxB;EACJ;EAEQiF,kBAAkB8C,KAA4C;AAClE,WAAOA,QAAQ,OACN3G,WAAQ4K,WAAU,IACrB,OAAOjE,QAAQ,WACZ3G,WAAQuB,oBAAoBoF,GAAAA,IAC/B,OAAOA,QAAQ,WACZ3G,WAAQ8G,qBAAqBH,GAAAA,IAChCA,QAAQ,OACL3G,WAAQkG,WAAU,IACrBS,QAAQ,QACL3G,WAAQ+G,YAAW,IACtB7F;EACV;EAEQgD,4BACJD,YAGF;AACE,UAAMxC,OAAOwC,WAAWxC;AAExB,QAAImG;AACJ,QAAI3D,WAAW8D,QAAQ7G,QAAW;AAC9B0G,gBAAa5H,WAAQsB,iBACjB,gBAAgB2C,WAAW8D,GAAG,IAAI;IAE1C,OAAO;AACHH,gBAAa5H,WAAQuB,oBAAoB0C,WAAW6D,GAAG;AAEvD,UAAIrG,SAAS,UAAU;AAEnB,YAAIoJ;AACJ,YAAI;AACAA,sBAAY,IAAIC,IAAI7G,WAAW6D,GAAG;QACtC,QAAQ;QAER;AAEA,YAAI+C,WAAW;AACX,cAAIA,UAAUE,aAAa,SAAS;AAChC,kBAAM,IAAInM,MACN,qDAAA;UAER;AACAgJ,oBAAa5H,WAAQuB,oBACjB0C,WAAW6D,IAAIkD,QAAQ,UAAU,EAAA,CAAA;QAEzC;MACJ;IACJ;AAEA,eAAO1F,0BAAM7D,IAAAA,EACR8D,KAAK,UAAU,MAAA;AACZ,aAAUvF,WAAQiL,yBACd/J,QACAA,QACAA,QACAA,QACAA,QACAA,QACGlB,WAAQmF,YACP;QACOnF,WAAQkL,sBACJlL,WAAQwG,qBACJxG,WAAQsB,iBACP,iBAAA,GAEJJ,QACA;UACI0G;UACG5H,WAAQsB,iBACP,iGAAiG;SAExG,CAAA;SAIb,IAAA,CAAA;IAGZ,CAAA,EACCiE,KAAK,cAAc,MAAA;AAChB,aAAUvF,WAAQiL,yBACd/J,QACAA,QACAA,QACAA,QACAA,QACAA,QACGlB,WAAQmF,YACP;QACOnF,WAAQkL,sBACJlL,WAAQwG,qBACJxG,WAAQsB,iBACP,iBAAA,GAEJJ,QACA;UAAC0G;SAAQ,CAAA;SAIrB,IAAA,CAAA;IAGZ,CAAA,EACChC,UAAU,MAAA;AACP,YAAM,IAAIhH,MAAM,yBAAyB6C,IAAAA,EAAM;IACnD,CAAA;EACR;EAEQuC,uBAAuBF,YAAyB;AACpD,WAAU9D,WAAQsD,8BACdQ,WAAWP,IAAI,CAAC4H,SACTnL,WAAQ+C,yBACPoI,KAAK1H,MACL,KAAK2H,sBAAsBD,IAAAA,CAAAA,CAAAA,GAGnC,IAAA;EAER;EAEQC,sBAAsBD,MAAiB;AAC3C,UAAME,SAAYrL,WAAQwE,6BACtB2G,KAAKE,OAAO9H,IAAI,CAACkG,UACVzJ,WAAQsD,8BAA8B;MAClCtD,WAAQ+C,yBACP,QACG/C,WAAQuB,oBAAoBkI,MAAMhG,IAAI,CAAA;SAEzCgG,MAAMrD,WACJ;QACOpG,WAAQ+C,yBACP,YACG/C,WAAQkG,WAAU,CAAA;UAG7B,CAAA;MACHlG,WAAQ+C,yBACP,QACG/C,WAAQuB,oBACPkI,MAAMhI,KAAKA,QAAQgI,MAAMhI,KAAKsE,UAAWC,QAAQ,CAAA;KAG5D,CAAA,GAEL,IAAA;AAGJ,UAAMsF,aAAgBtL,WAAQuL,oBAAoB;SAC3CJ,KAAKE,OAAO9H,IAAI,CAACkG,UACbzJ,WAAQwL,uBACPtK,QACGlB,WAAQsB,iBAAiBmI,MAAMhG,IAAI,GACtCvC,QACGlB,WAAQyL,sBAAsB;QAC1BzL,WAAQ0L,wBACPxK,QACGlB,WAAQuB,oBAAoB,MAAA,GAC/BL,QACGlB,WAAQ2L,sBACJ3L,WAAQuB,oBAAoBkI,MAAMhG,IAAI,CAAA,CAAA;QAG9CzD,WAAQ0L,wBACPxK,QACGlB,WAAQuB,oBAAoB,MAAA,GAC/BL,QACGlB,WAAQ2L,sBACJ3L,WAAQuB,oBACPkI,MAAMhI,KAAKA,QACPgI,MAAMhI,KAAKsE,UAAWC,QAAQ,CAAA,CAAA;WAI1CyD,MAAMrD,WACJ;UACOpG,WAAQ0L,wBACPxK,QACGlB,WAAQuB,oBACP,UAAA,GAEJL,QACGlB,WAAQ2L,sBACJ3L,WAAQkG,WAAU,CAAA,CAAA;YAIjC,CAAA;OACT,CAAA,CAAA;KAGZ;AAED,WAAUlG,WAAQsD,8BACd;MACOtD,WAAQ+C,yBACP,UACG/C,WAAQuC,mBAAmB8I,QAAQC,UAAAA,CAAAA;MAEvCtL,WAAQ+C,yBACP,cACG/C,WAAQuB,oBACP4J,KAAKS,WAAWnK,QACZ0J,KAAKS,WAAW7F,UAAWC,QAAQ,CAAA;SAG3CmF,KAAKU,WACH;QACO7L,WAAQ+C,yBACP,YACG/C,WAAQkG,WAAU,CAAA;UAG7B,CAAA;OAEV,IAAA;EAER;EAEQ/G,uBAAuBF,YAA4B;AACvD,UAAM6M,SAAS;;;;;;AAMfC,IAAGC,8BACC/M,WAAW,CAAA,GACRiD,cAAW+J,yBACdH,MAAAA;EAER;EAEQpH,sBACJD,MACa;AACb,WAAUzE,WAAQsD,8BAA8B;MACzCtD,WAAQ+C,yBACP,QACG/C,WAAQuB,oBAAoBkD,KAAK+F,KAAKxE,QAAQ,CAAA;SAEjDvB,KAAKiC,KAAKrD,SAAS,IACjB;QACOrD,WAAQ+C,yBACP,QACG/C,WAAQwE,6BACPC,KAAKiC,KAAKnD,IAAI,CAACoD,QACX,KAAKuF,mBAAmBvF,GAAAA,CAAAA,CAAAA,CAAAA;UAKxC,CAAA;KACT;EACL;EAEQuF,mBAAmBvF,KAAkC;AACzD,WAAU3G,WAAQsD,8BAA8B;;SAExCqD,IAAI+C,gBAAgBjG,OAClB;QACOzD,WAAQ+C,yBACP,QACG/C,WAAQuB,oBACPoF,IAAI+C,eAAejG,IAAI,CAAA;UAInC,CAAA;;MAGHzD,WAAQ+C,yBACP,SACA,KAAKoJ,iBAAiBxF,IAAIe,KAAK,CAAA;KAEtC;EACL;EAEQyE,iBAAiBzE,OAAkC;AACvD,eAAOpC,0BAAMoC,KAAAA,EACR0E,KAAKzE,2BAAe,CAACiB,SAClB,KAAKyD,wBAAwBzD,KAAK8B,OAAO9B,KAAKlB,KAAK,CAAA,EAEtD0E,KAAKvE,8BAAkB,CAACe,SAAS,KAAKpC,qBAAqBoC,IAAAA,CAAAA,EAC3DwD,KAAK9D,6BAAiB,CAACM,SAAS,KAAK0D,oBAAoB1D,IAAAA,CAAAA,EACzDwD,KAAKrC,yBAAa,CAACnB,SAAS,KAAK2D,sBAAsB3D,IAAAA,CAAAA,EACvDwD,KAAKI,yBAAa,CAAC5D,SAAS,KAAK6D,sBAAsB7D,IAAAA,CAAAA,EACvDwD,KAAKM,0BAAc,CAAC9D,SAAS,KAAK+D,uBAAuB/D,IAAAA,CAAAA,EACzDwD,KAAKvD,gCAAoB,CAACD,SACvB,KAAKgE,uBAAuBhE,IAAAA,CAAAA,EAE/BwD,KAAKS,wBAAY,MAAM,KAAKC,qBAAoB,CAAA,EAChDV,KAAKW,wBAAY,MAAM,KAAKC,qBAAoB,CAAA,EAChDpH,UAAU,MAAA;AACP,YAAM,IAAIhH,MACN,oCAAoC8I,MAAMgD,KAAK,EAAE;IAEzD,CAAA;EACR;EAEQsC,uBAAuB;AAC3B,WAAUhN,WAAQwG,qBACXxG,WAAQsB,iBAAiB,uBAAA,GAC5BJ,QACA,CAAA,CAAE;EAEV;EAEQ0L,uBAAuBhE,MAAwB;AACnD,UAAMqE,UAAoB,CAAA;AAG1B,QAAIC,UAAsBtE;AAC1B,eAAOC,gCAAmBqE,OAAAA,GAAU;AAChCD,cAAQE,QAAQD,QAAQnE,OAAO/C,QAAQ;AACvCkH,gBAAUA,QAAQpE;IACtB;AACA,UAAMsE,WAAWF;AAEjB,UAAMxG,OAAO;MACT,KAAKyF,iBAAiBiB,QAAAA;MACnBpN,WAAQwE,6BACPyI,QAAQ1J,IAAI,CAACsD,MAAS7G,WAAQuB,oBAAoBsF,CAAAA,CAAAA,CAAAA;;AAI1D,WAAU7G,WAAQwG,qBACXxG,WAAQsB,iBAAiB,wBAAA,GAC5BJ,QACAwF,IAAAA;EAER;EAEQoG,uBAAuB;AAC3B,WAAU9M,WAAQwG,qBACXxG,WAAQsB,iBAAiB,uBAAA,GAC5BJ,QACA,CAAA,CAAE;EAEV;EAEQyL,uBAAuB/D,MAAkB;AAC7C,WAAU5I,WAAQwG,qBACXxG,WAAQsB,iBAAiB,wBAAA,GAC5BJ,QACA;MACI,KAAKiL,iBAAiBvD,KAAKyE,IAAI;MAC/B,KAAKxJ,kBAAkB+E,KAAK0E,QAAQ;MACpC,KAAKnB,iBAAiBvD,KAAK2E,KAAK;KACnC;EAET;EAEQd,sBAAsB7D,MAAiB;AAC3C,WAAU5I,WAAQwG,qBACXxG,WAAQsB,iBAAiB,uBAAA,GAC5BJ,QACA;MACI,KAAK2C,kBAAkB+E,KAAK0E,QAAQ;MACpC,KAAKnB,iBAAiBvD,KAAKE,OAAO;KACrC;EAET;EAEQyD,sBAAsB3D,MAAsB;AAChD,WAAU5I,WAAQwG,qBACXxG,WAAQsB,iBAAiB,uBAAA,GAC5BJ,QACA;MACOlB,WAAQwE,6BACPoE,KAAKoB,MAAMzG,IAAI,CAAC0G,SAAS,KAAKkC,iBAAiBlC,IAAAA,CAAAA,CAAAA;KAEtD;EAET;EAEQqC,oBAAoB1D,MAA0B;AAClD,YAAI4E,8BAAiB5E,KAAKJ,OAAOxB,GAAG,GAAG;AACnC,aAAUhH,WAAQwG,qBACXxG,WAAQsB,iBAAiB,uBAAA,GAC5BJ,QACA;QAAC,KAAK2C,kBAAkB+E,KAAKJ,OAAOxC,QAAQ;OAAE;IAEtD,eAAWuC,yBAAYK,KAAKJ,OAAOxB,GAAG,GAAG;AACrC,aAAO,KAAKqF,wBACR,iBACAzD,KAAKJ,OAAOxC,QAAQ;IAE5B,OAAO;AACH,YAAM,IAAIpH,MACN,+BAA+BgK,KAAKJ,OAAOxC,QAAQ,EAAE;IAE7D;EACJ;EAEQQ,qBAAqBoC,MAAsB;AAC/C,WAAU5I,WAAQwG,qBACXxG,WAAQsB,iBAAiB,sBAAA,GAC5BJ,QACA;MACOlB,WAAQuB,oBAAoBqH,KAAKZ,SAAShC,QAAQ;SACjD4C,KAAKlC,KAAKrD,SAAS,IACjB;QACOrD,WAAQwE,6BACPoE,KAAKlC,KAAKnD,IAAI,CAACoD,QACX,KAAKwF,iBAAiBxF,IAAIe,KAAK,CAAA,CAAA;UAI3C,CAAA;KACT;EAET;EAEQ2E,wBAAwB5K,MAAciG,OAAyB;AACnE,eAAOpC,0BAAM7D,IAAAA,EACR8D,KAAK,kBAAkB,MACjBvF,WAAQwG,qBACJxG,WAAQsB,iBAAiB,yBAAA,GAC5BJ,QACA;MAAC,KAAK2C,kBAAkB6D,KAAAA;KAAO,CAAA,EAGtCnC,KAAK,iBAAiB,MAChBvF,WAAQwG,qBACJxG,WAAQsB,iBAAiB,yBAAA,GAC5BJ,QACA;MAAIlB,WAAQsB,iBAAiBoG,KAAAA;KAAiB,CAAA,EAGrDnC,KAAK,iBAAiB,MAChBvF,WAAQwG,qBACJxG,WAAQsB,iBAAiB,yBAAA,GAC5BJ,QACA;MAAC,KAAK2C,kBAAkB6D,KAAAA;KAAO,CAAA,EAGtC9B,UAAU,MAAA;AACP,YAAM,IAAIhH,MAAM,6BAA6B6C,IAAAA,EAAM;IACvD,CAAA;EACR;AACJ;;;ACv6CA,IAAAgM,cA4CO;;;;;;;;;;;;AAcP,IAAMC,qBAAqB,oBAAIC,IAAAA;AAG/B,SAASC,IAAIC,MAAY;AACrB,SAAO,SACHC,SACAC,cACAC,YAA8B;AAE9B,QAAI,CAACN,mBAAmBO,IAAIJ,IAAAA,GAAO;AAC/BH,yBAAmBQ,IAAIL,MAAMG,UAAAA;IACjC;AACA,WAAOA;EACX;AACJ;AAXSJ;AAgBF,IAAMO,sBAAN,MAAMA;SAAAA;;;EACQC;EAEjBC,YAAYD,SAAsC;AAC9C,SAAKA,UAAU;MACXE,0BAA0BF,SAASE,4BAA4B;MAC/DC,yBAAyBH,SAASG,2BAA2B;MAC7DC,QAAQJ,SAASI,UAAU;MAC3BC,OAAOL,SAASK,SAAS;IAC7B;EACJ;;;;EAKAC,SAASC,KAAsB;AAC3B,UAAMC,UAAUlB,mBAAmBO,IAAIU,IAAIE,KAAK;AAChD,QAAI,CAACD,SAAS;AACV,YAAM,IAAIE,MAAM,mCAAmCH,IAAIE,KAAK,EAAE;IAClE;AACA,WAAOD,QAAQG,MAAMC,KAAK,MAAML,GAAAA;EACpC;EAGQM,eAAeN,KAAY;AAC/B,WAAOA,IAAIO,aAAaC,IAAI,CAACC,MAAM,KAAKV,SAASU,CAAAA,CAAAA,EAAIC,KAAK,MAAA;EAC9D;EAGQC,oBAAoBX,KAAiB;AACzC,WAAO,cAAcA,IAAId,IAAI;EACnCc,IAAIY,OAAOJ,IAAI,CAACK,MAAM,KAAKhB,SAAS,KAAKE,SAASc,CAAAA,CAAAA,EAAIH,KAAK,IAAA,CAAA;;EAEzD;EAGQI,cAAcd,KAAW;AAC7B,WAAO,QAAQA,IAAId,IAAI;EAC7Bc,IAAIY,OAAOJ,IAAI,CAACK,MAAM,KAAKhB,SAAS,KAAKE,SAASc,CAAAA,CAAAA,EAAIH,KAAK,IAAA,CAAA;;EAEzD;EAGQK,mBAAmBf,KAAgB;AACvC,WAAO,GAAGA,IAAId,IAAI,GACdc,IAAIgB,WAAWC,SAAS,IAClB,MAAMjB,IAAIgB,WAAWR,IAAI,CAACK,MAAM,KAAKd,SAASc,CAAAA,CAAAA,EAAIH,KAAK,GAAA,IACvD,EAAA;EAEd;EAGQQ,mBAAmBlB,KAAoB;AAC3C,WAAO,aAAaA,IAAId,IAAI;EAClCc,IAAIY,OAAOJ,IAAI,CAACK,MAAM,KAAKhB,SAAS,KAAKE,SAASc,CAAAA,CAAAA,EAAIH,KAAK,IAAA,CAAA;;EAEzD;EAGQS,qBAAqBnB,KAAkB;AAC3C,WAAO,GAAGA,IAAId,IAAI,MAAM,KAAKa,SAASC,IAAII,KAAK,CAAA;EACnD;EAGQgB,yBAAyBpB,KAAsB;AACnD,WAAO,IAAIA,IAAIqB,MAAMb,IAAI,CAACK,MAAM,KAAKd,SAASc,CAAAA,CAAAA,EAAIH,KAAK,IAAA,CAAA;EAC3D;EAGQY,8BAA8BtB,KAA2B;AAC7D,QAAIA,IAAIuB,KAAKN,WAAW,GAAG;AACvB,aAAOjB,IAAId;IACf,OAAO;AACH,aAAO,GAAGc,IAAId,IAAI,IAAIc,IAAIuB,KACrBf,IACG,CAACK,OACIA,EAAE3B,OAAO2B,EAAE3B,OAAO,OAAO,MAAM,KAAKa,SAASc,EAAET,KAAK,CAAA,EAE5DM,KAAK,IAAA,CAAA;IACd;EACJ;EAGQc,gBAAgBxB,KAAa;AACjC,WAAO,UAAUA,IAAId,IAAI;EAC/Bc,IAAIY,OAAOJ,IAAI,CAACK,MAAM,KAAKhB,SAAS,KAAKE,SAASc,CAAAA,CAAAA,EAAIH,KAAK,IAAA,CAAA;;EAEzD;EAGQe,qBAAqBzB,KAAkB;AAC3C,WAAO,GAAGA,IAAId,IAAI,MAAM,KAAKa,SAASC,IAAII,KAAK,CAAA;EACnD;EAGQsB,mBAAmB1B,KAAgB;AACvC,WAAO,GAAGA,IAAI2B,aAAa,cAAc,EAAA,GACrC3B,IAAI4B,SAAS,SAAS,OAAA,IACtB5B,IAAId,IAAI,GACRc,IAAI6B,WAAWZ,SAAS,IAClB,cACAjB,IAAI6B,WAAWrB,IAAI,CAACK,MAAMA,EAAEiB,KAAK5C,IAAAA,EAAMwB,KAAK,IAAA,IAC5C,EAAA;EAEhBV,IAAIY,OAAOJ,IAAI,CAACK,MAAM,KAAKhB,SAAS,KAAKE,SAASc,CAAAA,CAAAA,EAAIH,KAAK,IAAA,CAAA,GACjDV,IAAIgB,WAAWC,SAAS,IAClB,SACAjB,IAAIgB,WACCR,IAAI,CAACK,MAAM,KAAKhB,SAAS,KAAKE,SAASc,CAAAA,CAAAA,EACvCH,KAAK,IAAA,IACV,EAAA;;EAGd;EAGQqB,wBAAwB/B,KAAqB;AACjD,WAAO,GAAGA,IAAId,IAAI,IAAI,KAAK8C,UAAUhC,IAAIiC,IAAI,CAAA,GACzCjC,IAAIgB,WAAWC,SAAS,IAClB,MAAMjB,IAAIgB,WAAWR,IAAI,CAACK,MAAM,KAAKd,SAASc,CAAAA,CAAAA,EAAIH,KAAK,GAAA,IACvD,EAAA;EAEd;EAEQsB,UAAUC,MAA6C;AAC3D,UAAMC,WAAWD,KAAKA,OAChBA,KAAKA,OACLA,KAAK/B,SAAS,wBAAwB+B,KAAKE,cAC3C,iBAAiB,KAAKpC,SAASkC,KAAKE,YAAY/B,KAAK,IAAI,MACzD6B,KAAKG,WAAWC;AACtB,WAAO,GAAGH,QAAAA,GAAWD,KAAKK,QAAQ,OAAO,EAAA,GACrCL,KAAKM,WAAW,MAAM,EAAA;EAE9B;EAGQC,4BAA4BxC,KAAyB;AACzD,WAAO,KAAKyC,UAAUzC,GAAAA;EAC1B;EAGQ0C,iCAAiC1C,KAA8B;AACnE,WAAO,KAAKyC,UAAUzC,GAAAA;EAC1B;EAEQyC,UAAUzC,KAAmD;AACjE,UAAMuB,OAAOvB,IAAIuB,KAAKN,SAChB,IAAIjB,IAAIuB,KAAKf,IAAI,CAACK,MAAM,KAAKd,SAASc,CAAAA,CAAAA,EAAIH,KAAK,IAAA,CAAA,MAC/C;AACN,WAAO,GAAGiC,SAAS3C,IAAI4C,IAAI,EAAE1D,IAAI,GAAGqC,IAAAA;EACxC;EAGQsB,sBAAsB7C,KAAmB;AAC7C,QAAIA,IAAId,MAAM;AACV,aAAO,GAAGc,IAAId,IAAI,KAAK,KAAKa,SAASC,IAAII,KAAK,CAAA;IAClD,OAAO;AACH,aAAO,KAAKL,SAASC,IAAII,KAAK;IAClC;EACJ;EAGQ0C,oBAAoB9C,KAAiB;AACzC,WAAO,KAAKA,IAAIY,OACXJ,IAAI,CAACuC,UAAU,KAAKC,YAAYD,KAAAA,CAAAA,EAChCrC,KAAK,IAAA,CAAA;EACd;EAEQsC,YAAYD,OAAyB;AACzC,WAAO,GAAGA,MAAM7D,IAAI,KAAK,KAAKa,SAASgD,MAAM3C,KAAK,CAAA;EACtD;EAGQ6C,mBAAmBjD,KAAgB;AACvC,WAAO,IAAIA,IAAIqB,MAAMb,IAAI,CAAC0C,SAAS,KAAKnD,SAASmD,IAAAA,CAAAA,EAAOxC,KAAK,IAAA,CAAA;EACjE;EAGQyC,qBAAqBnD,KAAkB;AAC3C,WAAO,KAAKP,QAAQK,UAAU,WACxB,IAAIE,IAAII,KAAK,MACb,IAAIJ,IAAII,KAAK;EACvB;EAGQgD,uBAAuBpD,KAAoB;AAC/C,WAAOA,IAAII,MAAMiD,SAAQ;EAC7B;EAGQC,wBAAwBtD,KAAqB;AACjD,WAAOA,IAAII,MAAMiD,SAAQ;EAC7B;EAGQE,mBAAmBvD,KAAgB;AACvC,WAAO,GAAGA,IAAIwD,QAAQ,GAAG,KAAKC,cAAc,GAAG,KAAK1D,SAChDC,IAAI0D,OAAO,CAAA;EAEnB;EAGQC,oBAAoB3D,KAAiB;AACzC,UAAMwD,WAAWxD,IAAIwD;AACrB,UAAMI,wBACF,KAAKC,8BAA8BL,QAAAA;AACvC,UAAMM,YAAY,KAAK/D,SAASC,IAAI+D,KAAK;AAEzC,UAAM,EAAEC,MAAMC,mBAAmBF,OAAOG,mBAAkB,IACtD,KAAKC,iCAAiCnE,GAAAA;AAE1C,WAAO,GAAGiE,oBAAoB,MAAM,EAAA,GAAK,KAAKlE,SAASC,IAAIgE,IAAI,CAAA,GAC3DC,oBAAoB,MAAM,EAAA,GAC3BL,wBAAwB,KAAK,KAAKQ,eAAe,GAAGZ,QAAAA,GACnDI,wBAAwB,KAAK,KAAKQ,eAAe,GAClDF,qBAAqB,MAAM,EAAA,GAC1BN,wBAAwB,IAAIE,SAAAA,MAAeA,SAAAA,GAC5CI,qBAAqB,MAAM,EAAA;EAClC;EAGQG,uBAAuBrE,KAAoB;AAC/C,UAAMuB,OAAOvB,IAAIuB,KAAKN,SAChB,IAAIjB,IAAIuB,KAAKf,IAAI,CAACK,MAAM,KAAKd,SAASc,CAAAA,CAAAA,EAAIH,KAAK,IAAA,CAAA,MAC/C;AACN,WAAO,GAAGV,IAAIsE,OAAOxC,KAAK5C,IAAAA,GAAOqC,IAAAA;EACrC;EAGQgD,sBAAsBvE,KAAmB;AAC7C,WAAO,GAAGA,IAAId,IAAI,IAAI,KAAKa,SAASC,IAAII,KAAK,CAAA;EACjD;EAGQoE,oBAAoBxE,KAAuB;AAC/C,WAAO,GAAG,KAAKD,SAASC,IAAI0D,OAAO,CAAA,IAAK1D,IAAIyE,OAAO3C,KAAK5C,IAAAA;EAC5D;EAGQwF,wBAAwB1E,KAAqB;AACjD,WAAO,GAAGA,IAAI2E,SAAS7C,KAAK5C,IAAAA,IAAQc,IAAIuB,KACnCf,IAAI,CAACK,MAAM,KAAK+D,SAAS/D,CAAAA,CAAAA,EACzBH,KAAK,IAAA,CAAA;EACd;EAGQmE,oBAAoB;AACxB,WAAO;EACX;EAGQC,oBAAoB;AACxB,WAAO;EACX;EAGQC,mBAAmB/E,KAAgB;AACvC,WAAO,aAAaA,IAAId,IAAI,IAAIc,IAAIgF,OAC/BxE,IAAI,CAACK,MAAM,KAAKd,SAASc,CAAAA,CAAAA,EACzBH,KAAK,IAAA,CAAA;EACd;EAGQuE,wBAAwBjF,KAAqB;AACjD,WAAO,GAAGA,IAAIkF,UAAU,OAAO,EAAA,GAAKlF,IAAId,IAAI,KAAK,KAAKa,SAClDC,IAAIiC,IAAI,CAAA;EAEhB;EAGQkD,4BAA4BnF,KAAyB;AACzD,WAAO,GAAGA,IAAIiC,QAAQjC,IAAIoC,WAAWC,QAAAA,GAAWrC,IAAIsC,QAAQ,OAAO,EAAA,GAC/DtC,IAAIuC,WAAW,MAAM,EAAA;EAE7B;EAGQ6C,sBAAsBpF,KAAmB;AAC7C,WAAO,YAAYA,IAAId,IAAI,IAAIc,IAAIgF,OAC9BxE,IAAI,CAACK,MAAM,KAAKd,SAASc,CAAAA,CAAAA,EACzBH,KAAK,IAAA,CAAA,KACNV,IAAIqF,aAAa,OAAO,KAAKtF,SAASC,IAAIqF,UAAU,IAAI,EAAA;EAEhE;EAGQC,uBAAuBtF,KAAoB;AAC/C,WAAO,GAAGA,IAAId,IAAI,KAAK,KAAKa,SAASC,IAAIiC,IAAI,CAAA;EACjD;EAGQsD,2BAA2BvF,KAAwB;AACvD,WAAO,GAAGA,IAAIiC,QAAQjC,IAAIoC,WAAWC,QAAAA,GAAWrC,IAAIsC,QAAQ,OAAO,EAAA;EACvE;EAGQkD,iBAAiBxF,KAAc;AACnC,WAAO,QAAQA,IAAId,IAAI;EAC7Bc,IAAIY,OAAOJ,IAAI,CAACK,MAAM,KAAKhB,SAAS,KAAKE,SAASc,CAAAA,CAAAA,EAAIH,KAAK,IAAA,CAAA,GACjDV,IAAIgB,WAAWC,SAAS,IAClB,SACAjB,IAAIgB,WACCR,IAAI,CAACK,MAAM,KAAKhB,SAAS,KAAKE,SAASc,CAAAA,CAAAA,EACvCH,KAAK,IAAA,IACV,EAAA;;EAGd;EAGQ+E,sBAAsBzF,KAAmB;AAC7C,WAAO,GAAGA,IAAId,IAAI,IAAI,KAAK8C,UAAUhC,IAAIiC,IAAI,CAAA,GACzCjC,IAAIgB,WAAWC,SAAS,IAClB,MAAMjB,IAAIgB,WAAWR,IAAI,CAACK,MAAM,KAAKd,SAASc,CAAAA,CAAAA,EAAIH,KAAK,GAAA,IACvD,EAAA;EAEd;EAEQkE,SAAS5E,KAAe;AAC5B,WAAO,KAAKD,SAASC,IAAII,KAAK;EAClC;EAEA,IAAYgE,kBAAkB;AAC1B,WAAO,IAAIsB,OAAO,KAAKjG,QAAQE,wBAAwB;EAC3D;EAEA,IAAY8D,iBAAiB;AACzB,WAAO,IAAIiC,OAAO,KAAKjG,QAAQG,uBAAuB;EAC1D;EAEA,IAAYC,SAAS;AACjB,WAAO,IAAI6F,OAAO,KAAKjG,QAAQI,MAAM;EACzC;EAEQsE,iCAAiCnE,KAGvC;AACE,UAAM2F,SAAS;MAAE3B,MAAM;MAAOD,OAAO;IAAM;AAC3C,UAAMP,WAAWxD,IAAIwD;AACrB,UAAMI,wBACF,KAAKC,8BAA8BL,QAAAA;AAEvC,UAAMoC,kBAAkBC,uCAA2BrC,QAAAA;AAEnD,QACIxD,IAAIgE,KAAK9D,UAAU4F,0BACnBD,uCAA4B7F,IAAIgE,KAAoB,UAAA,CAAW,IAC3D4B,iBACN;AACED,aAAO3B,OAAO;IAClB;AAKA,QACI,CAACJ,yBACD5D,IAAI+D,MAAM7D,UAAU4F,0BACpBD,uCAA4B7F,IAAI+D,MAAqB,UAAA,CAAW,KAC5D6B,iBACN;AACED,aAAO5B,QAAQ;IACnB;AAEA,WAAO4B;EACX;EAEQ9B,8BAA8BkC,IAA4B;AAC9D,WAAO;MAAC;MAAK;MAAK;MAAKC,SAASD,EAAAA;EACpC;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["isIdField","field","hasAttribute","model","$container","modelLevelIds","getModelIdFields","map","f","name","includes","fields","some","length","firstUniqueField","find","modelLevelUnique","getModelUniqueFields","decl","getAttribute","attributes","attr","$refText","modelsToCheck","$baseMerged","getRecursiveBases","modelToCheck","idAttr","fieldsArg","args","a","$resolvedParam","isArrayExpr","value","items","filter","item","isReferenceExpr","target","ref","uniqueAttr","dataModel","includeDelegate","seen","Set","result","has","add","superTypes","forEach","superType","baseDecl","isDelegateModel","push","node","isDataModel","isUniqueField","modelIds","arg","isLiteralExpr","isFromStdlib","getContainingModel","$document","uri","path","endsWith","isModel","resolved","Error","getAuthDecl","found","declarations","d","import_ast","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","constructor","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","constructor","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","PrismaSchemaGenerator","PRELUDE","constructor","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","length","arg","configInvocationArgToText","join","JSON","stringify","addGenerator","model","isView","addView","addModel","field","ModelUtils","hasAttribute","generateModelField","attr","attributes","filter","isPrismaAttribute","generateContainerAttribute","comments","forEach","c","addComment","ref","some","a","getUnsupportedFieldType","fieldType","unsupported","getStringLiteral","undefined","node","isStringLiteral","addToFront","type","reference","isTypeDef","Error","$container","isArray","array","ModelFieldType","optional","isDefaultWithPluginInvocation","isIdField","isInheritedFromDelegate","$refText","makeFieldAttribute","docs","result","addField","AstUtils","streamAst","isFromPlugin","function","getContainerOfType","isModel","$document","uri","path","endsWith","setDummyDefault","dummyDefaultValue","match","with","AttributeArgValue","P","union","PrismaFunctionCall","otherwise","push","PrismaFieldAttribute","PrismaAttributeArg","$inheritedFrom","isDelegateModel","attrName","makeAttributeArg","makeAttributeArgValue","argType","StringLiteral","NumberLiteral","BooleanLiteral","exhaustive","PrismaAttributeArgValue","isArrayExpr","Array","isReferenceExpr","PrismaFieldReference","target","PrismaFieldReferenceArg","exprToText","ZModelCodeGenerator","quote","val","when","v","isNullExpr","PrismaFunctionCallArg","container","PrismaModelAttribute","_enum","addEnum","generateEnumField","import_ast","import_ts_pattern","TsSchemaGenerator","generate","schemaFile","pluginModelFiles","outputFile","loaded","loadDocument","success","Error","errors","join","model","warnings","statements","generateSchemaStatements","generateBannerComments","sourceFile","createSourceFile","ScriptTarget","ESNext","ScriptKind","TS","printer","createPrinter","result","printList","ListFormat","MultiLine","factory","createNodeArray","fs","mkdirSync","path","dirname","recursive","writeFileSync","hasComputedFields","declarations","some","d","isDataModel","fields","f","hasAttribute","runtimeImportDecl","createImportDeclaration","undefined","createImportClause","createNamedImports","createImportSpecifier","createIdentifier","createStringLiteral","push","type","providerType","getDataSourceProvider","pathImportDecl","urlImportDecl","dialectConfigImportDecl","declaration","createVariableStatement","createModifier","SyntaxKind","ExportKeyword","createVariableDeclarationList","createVariableDeclaration","createSatisfiesExpression","createAsExpression","createSchemaObject","createTypeReferenceNode","NodeFlags","Const","typeDeclaration","createTypeAliasDeclaration","properties","createPropertyAssignment","createProviderObject","createModelsObject","enums","filter","isEnum","length","createObjectLiteralExpression","map","e","name","createEnumObject","authType","getAuthDecl","createLiteralNode","procedures","isProcedure","createProceduresObject","dsProvider","createDialectConfigProvider","dm","createDataModelObject","field","createDataModelFieldObject","attributes","createArrayLiteralExpression","attr","createAttributeObject","getIdFields","idField","createUniqueFieldsObject","computedFields","createComputedFieldsObject","createMethodDeclaration","createKeywordTypeNode","mapTypeToTSSyntaxKeyword","createBlock","createThrowStatement","createNewExpression","match","with","StringKeyword","BooleanKeyword","NumberKeyword","BigIntKeyword","otherwise","UnknownKeyword","objectFields","reference","$refText","isIdField","createTrue","isUniqueField","optional","array","defaultValue","getMappedDefault","createCallExpression","call","args","arg","authMember","m","createNumericLiteral","createFalse","ref","createRelationObject","fkFor","getForeignKeyFor","fk","dataSource","find","isDataSource","invariant","providerExpr","value","isLiteralExpr","urlExpr","isInvocationExpr","url","env","function","defaultAttr","getAttribute","lit","includes","Number","isReferenceExpr","isEnumField","target","getLiteral","isAuthMemberAccess","getMemberAccessChain","expr","isMemberAccessExpr","operand","member","isAuthInvocation","ModelUtils","isFromStdlib","relationFields","oppositeRelation","getOppositeRelationField","relationName","getRelationName","relation","param","$resolvedParam","fieldNames","getReferenceNames","el","action","isArrayExpr","items","item","$container","sourceModel","targetModel","otherField","otherRelationName","nameArg","decl","fieldDef","$type","parseFloat","createNull","parsedUrl","URL","protocol","replace","createFunctionExpression","createReturnStatement","proc","createProcedureObject","params","paramsType","createTupleTypeNode","createNamedTupleMember","createTypeLiteralNode","createPropertySignature","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","isDataModelField","import_ast","generationHandlers","Map","gen","name","_target","_propertyKey","descriptor","get","set","ZModelCodeGenerator","options","constructor","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","isAbstract","isView","superTypes","ref","_generateDataModelField","fieldType","type","baseType","unsupported","reference","$refText","array","optional","_generateDataModelAttribute","attribute","_generateDataModelFieldAttribute","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","_generateTypeDefField","repeat","result","currentPriority","BinaryExprOperatorPriority","BinaryExpr","op","includes"]}
1
+ {"version":3,"sources":["../src/index.ts","../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 * as ModelUtils from './model-utils';\nexport { PrismaSchemaGenerator } from './prisma/prisma-schema-generator';\nexport * from './ts-schema-generator';\nexport * from './zmodel-code-generator';\nexport { ModelUtils };\n","import {\n isArrayExpr,\n isDataModel,\n isLiteralExpr,\n isModel,\n isReferenceExpr,\n Model,\n ReferenceExpr,\n type AstNode,\n type Attribute,\n type AttributeParam,\n type DataModel,\n type DataModelAttribute,\n type DataModelField,\n type DataModelFieldAttribute,\n type Enum,\n type EnumField,\n type FunctionDecl,\n type Reference,\n type TypeDef,\n type TypeDefField,\n} from '@zenstackhq/language/ast';\n\nexport function isIdField(field: DataModelField) {\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 const model = field.$container as DataModel;\n\n // model-level @@id attribute with a list of fields\n const modelLevelIds = getModelIdFields(model);\n if (modelLevelIds.map((f) => f.name).includes(field.name)) {\n return true;\n }\n\n if (\n model.fields.some((f) => hasAttribute(f, '@id')) ||\n modelLevelIds.length > 0\n ) {\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 = model.fields.find((f) =>\n hasAttribute(f, '@unique')\n );\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(model);\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:\n | DataModel\n | TypeDef\n | DataModelField\n | Enum\n | EnumField\n | FunctionDecl\n | Attribute\n | AttributeParam,\n name: string\n) {\n return !!getAttribute(decl, name);\n}\n\nexport function getAttribute(\n decl:\n | DataModel\n | TypeDef\n | DataModelField\n | TypeDefField\n | Enum\n | EnumField\n | FunctionDecl\n | Attribute\n | AttributeParam,\n name: string\n) {\n return (\n decl.attributes as (DataModelAttribute | DataModelFieldAttribute)[]\n ).find((attr) => attr.decl.$refText === name);\n}\n\n/**\n * Gets `@@id` fields declared at the data model level (including search in base models)\n */\nexport function getModelIdFields(model: DataModel) {\n const modelsToCheck = model.$baseMerged\n ? [model]\n : [model, ...getRecursiveBases(model)];\n\n for (const modelToCheck of modelsToCheck) {\n const idAttr = modelToCheck.attributes.find(\n (attr) => attr.decl.$refText === '@@id'\n );\n if (!idAttr) {\n continue;\n }\n const fieldsArg = idAttr.args.find(\n (a) => a.$resolvedParam?.name === 'fields'\n );\n if (!fieldsArg || !isArrayExpr(fieldsArg.value)) {\n continue;\n }\n\n return fieldsArg.value.items\n .filter((item): item is ReferenceExpr => isReferenceExpr(item))\n .map((item) => item.target.ref as DataModelField);\n }\n\n return [];\n}\n\n/**\n * Gets `@@unique` fields declared at the data model level (including search in base models)\n */\nexport function getModelUniqueFields(model: DataModel) {\n const modelsToCheck = model.$baseMerged\n ? [model]\n : [model, ...getRecursiveBases(model)];\n\n for (const modelToCheck of modelsToCheck) {\n const uniqueAttr = modelToCheck.attributes.find(\n (attr) => attr.decl.$refText === '@@unique'\n );\n if (!uniqueAttr) {\n continue;\n }\n const fieldsArg = uniqueAttr.args.find(\n (a) => a.$resolvedParam?.name === 'fields'\n );\n if (!fieldsArg || !isArrayExpr(fieldsArg.value)) {\n continue;\n }\n\n return fieldsArg.value.items\n .filter((item): item is ReferenceExpr => isReferenceExpr(item))\n .map((item) => item.target.ref as DataModelField);\n }\n\n return [];\n}\n\nexport function getRecursiveBases(\n dataModel: DataModel,\n includeDelegate = true,\n seen = new Set<DataModel>()\n): DataModel[] {\n const result: DataModel[] = [];\n if (seen.has(dataModel)) {\n return result;\n }\n seen.add(dataModel);\n dataModel.superTypes.forEach((superType) => {\n const baseDecl = superType.ref;\n if (baseDecl) {\n if (!includeDelegate && isDelegateModel(baseDecl)) {\n return;\n }\n result.push(baseDecl);\n result.push(...getRecursiveBases(baseDecl, includeDelegate, seen));\n }\n });\n return result;\n}\n\nexport function isDelegateModel(node: AstNode) {\n return isDataModel(node) && hasAttribute(node, '@@delegate');\n}\n\nexport function isUniqueField(field: DataModelField) {\n if (hasAttribute(field, '@unique')) {\n return true;\n }\n const modelIds = getAttribute(field.$container, '@@unique');\n if (\n modelIds &&\n modelIds.args.some(\n (arg) => isLiteralExpr(arg.value) && arg.value.value === field.name\n )\n ) {\n return true;\n }\n return false;\n}\n\nexport function isFromStdlib(node: AstNode) {\n const model = getContainingModel(node);\n return (\n !!model &&\n !!model.$document &&\n model.$document.uri.path.endsWith('stdlib.zmodel')\n );\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) =>\n isDataModel(d) &&\n d.attributes.some((attr) => attr.decl.$refText === '@@auth')\n );\n if (!found) {\n found = model.declarations.find(\n (d) => isDataModel(d) && d.name === 'User'\n );\n }\n return found;\n}\n","import {\n AttributeArg,\n BooleanLiteral,\n ConfigArrayExpr,\n ConfigExpr,\n ConfigInvocationArg,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n DataModelFieldType,\n DataSource,\n Enum,\n EnumField,\n Expression,\n GeneratorDecl,\n InvocationExpr,\n isArrayExpr,\n isInvocationExpr,\n isLiteralExpr,\n isModel,\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 { AstUtils } from 'langium';\nimport { match, P } from 'ts-pattern';\n\nimport { ModelUtils, ZModelCodeGenerator } from '..';\nimport {\n AttributeArgValue,\n ModelField,\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/**\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 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 ? '(' +\n item.args\n .map((arg) =>\n this.configInvocationArgToText(arg)\n )\n .join(', ') +\n ')'\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\n ? prisma.addView(decl.name)\n : prisma.addModel(decl.name);\n for (const field of decl.fields) {\n if (ModelUtils.hasAttribute(field, '@computed')) {\n continue; // skip computed fields\n }\n // TODO: exclude fields inherited from delegate\n this.generateModelField(model, field);\n }\n\n for (const attr of decl.attributes.filter((attr) =>\n this.isPrismaAttribute(attr)\n )) {\n this.generateContainerAttribute(model, attr);\n }\n\n // user defined comments pass-through\n decl.comments.forEach((c) => model.addComment(c));\n\n // TODO: delegate model handling\n // // physical: generate relation fields on base models linking to concrete models\n // this.generateDelegateRelationForBase(model, decl);\n\n // TODO: delegate model handling\n // // physical: generate reverse relation fields on concrete models\n // this.generateDelegateRelationForConcrete(model, decl);\n\n // TODO: delegate model handling\n // // logical: expand relations on other models that reference delegated models to concrete models\n // this.expandPolymorphicRelations(model, decl);\n\n // TODO: delegate model handling\n // // logical: ensure relations inherited from delegate models\n // this.ensureRelationsInheritedFromDelegate(model, decl);\n }\n\n private isPrismaAttribute(\n attr: DataModelAttribute | DataModelFieldAttribute\n ) {\n if (!attr.decl.ref) {\n return false;\n }\n return attr.decl.ref.attributes.some(\n (a) => a.decl.ref?.name === '@@@prisma'\n );\n }\n\n private getUnsupportedFieldType(fieldType: DataModelFieldType) {\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(\n model: PrismaDataModel,\n field: DataModelField,\n addToFront = false\n ) {\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(\n `Field type is not resolved: ${field.$container.name}.${field.name}`\n );\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(\n fieldType,\n isArray,\n field.type.optional\n );\n\n const attributes = field.attributes\n .filter((attr) => this.isPrismaAttribute(attr))\n // `@default` with calling functions from plugin is handled outside Prisma\n .filter((attr) => !this.isDefaultWithPluginInvocation(attr))\n .filter(\n (attr) =>\n // when building physical schema, exclude `@default` for id fields inherited from delegate base\n !(\n ModelUtils.isIdField(field) &&\n this.isInheritedFromDelegate(field) &&\n attr.decl.$refText === '@default'\n )\n )\n .map((attr) => this.makeFieldAttribute(attr));\n\n const docs = [...field.comments];\n const result = model.addField(\n field.name,\n type,\n attributes,\n docs,\n addToFront\n );\n return result;\n }\n\n private isDefaultWithPluginInvocation(attr: DataModelFieldAttribute) {\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(\n (node) =>\n isInvocationExpr(node) && this.isFromPlugin(node.function.ref)\n );\n }\n\n private isFromPlugin(node: AstNode | undefined) {\n const model = AstUtils.getContainerOfType(node, isModel);\n return (\n !!model &&\n !!model.$document &&\n model.$document.uri.path.endsWith('plugin.zmodel')\n );\n }\n\n private setDummyDefault(result: ModelField, field: DataModelField) {\n const dummyDefaultValue = match(field.type.type)\n .with('String', () => new AttributeArgValue('String', ''))\n .with(\n P.union('Int', 'BigInt', 'Float', 'Decimal'),\n () => new AttributeArgValue('Number', '0')\n )\n .with('Boolean', () => new AttributeArgValue('Boolean', 'false'))\n .with(\n 'DateTime',\n () =>\n new AttributeArgValue(\n 'FunctionCall',\n new PrismaFunctionCall('now')\n )\n )\n .with('Json', () => new AttributeArgValue('String', '{}'))\n .with('Bytes', () => new AttributeArgValue('String', ''))\n .otherwise(() => {\n throw new Error(\n `Unsupported field type with default value: ${field.type.type}`\n );\n });\n\n result.attributes.push(\n new PrismaFieldAttribute('@default', [\n new PrismaAttributeArg(undefined, dummyDefaultValue),\n ])\n );\n }\n\n private isInheritedFromDelegate(field: DataModelField) {\n return (\n field.$inheritedFrom &&\n ModelUtils.isDelegateModel(field.$inheritedFrom)\n );\n }\n\n private makeFieldAttribute(attr: DataModelFieldAttribute) {\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(\n arg.name,\n this.makeAttributeArgValue(arg.value)\n );\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(\n ...node.items.map((item) =>\n this.makeAttributeArgValue(item)\n )\n )\n );\n } else if (isReferenceExpr(node)) {\n return new PrismaAttributeArgValue(\n 'FieldReference',\n new PrismaFieldReference(\n node.target.ref!.name,\n node.args.map(\n (arg) =>\n new PrismaFieldReferenceArg(\n arg.name,\n this.exprToText(arg.value)\n )\n )\n )\n );\n } else if (isInvocationExpr(node)) {\n // invocation\n return new PrismaAttributeArgValue(\n 'FunctionCall',\n this.makeFunctionCall(node)\n );\n } else {\n throw Error(\n `Unsupported attribute argument expression type: ${node.$type}`\n );\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(\n 'Function call argument must be literal or null'\n );\n });\n\n return new PrismaFunctionCallArg(val);\n })\n );\n }\n\n private generateContainerAttribute(\n container: PrismaContainerDeclaration,\n attr: DataModelAttribute\n ) {\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) =>\n this.isPrismaAttribute(attr)\n )) {\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","// 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 [\n ...this.datasources,\n ...this.generators,\n ...this.enums,\n ...this.models,\n ]\n .map((d) => d.toString())\n .join('\\n\\n');\n }\n}\n\nexport class DataSource {\n constructor(public name: string, public fields: SimpleField[] = []) {}\n\n toString(): string {\n return (\n `datasource ${this.name} {\\n` +\n this.fields\n .map((f) => indentString(`${f.name} = ${f.text}`))\n .join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class Generator {\n constructor(public name: string, public fields: SimpleField[]) {}\n\n toString(): string {\n return (\n `generator ${this.name} {\\n` +\n this.fields\n .map((f) => indentString(`${f.name} = ${f.text}`))\n .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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 ? '[]' : ''}${\n this.optional ? '?' : ''\n }`;\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\n ? ' ' + this.attributes.map((a) => a.toString()).join(' ')\n : '')\n );\n }\n}\n\nexport class FieldAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return (\n `${this.name}(` +\n this.args.map((a) => a.toString()).join(', ') +\n `)`\n );\n }\n}\n\nexport class ContainerAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return (\n `${this.name}(` +\n this.args.map((a) => a.toString()).join(', ') +\n `)`\n );\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\n ? `${this.name}: ${this.value}`\n : this.value.toString();\n }\n}\n\nexport class AttributeArgValue {\n constructor(\n public type:\n | 'String'\n | 'FieldReference'\n | 'Number'\n | 'Boolean'\n | 'Array'\n | 'FunctionCall',\n public value:\n | string\n | number\n | boolean\n | FieldReference\n | FunctionCall\n | AttributeArgValue[]\n ) {\n switch (type) {\n case 'String':\n if (typeof value !== 'string')\n 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')\n throw new Error('Value must be boolean');\n break;\n case 'Array':\n if (!Array.isArray(value))\n throw new Error('Value must be array');\n break;\n case 'FieldReference':\n if (\n typeof value !== 'string' &&\n !(value instanceof FieldReference)\n )\n throw new Error('Value must be string or FieldReference');\n break;\n case 'FunctionCall':\n if (!(value instanceof FunctionCall))\n 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 +=\n '(' +\n fr.args.map((a) => a.toString()).join(',') +\n ')';\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 (\n '[' +\n (this.value as AttributeArgValue[])\n .map((v) => v.toString())\n .join(', ') +\n ']'\n );\n default:\n throw new Error(`Unknown attribute value type ${this.type}`);\n }\n }\n}\n\nexport class FieldReference {\n constructor(public field: string, public args: FieldReferenceArg[] = []) {}\n}\n\nexport class FieldReferenceArg {\n constructor(public name: string, public value: string) {}\n\n toString(): string {\n return `${this.name}: ${this.value}`;\n }\n}\n\nexport class FunctionCall {\n constructor(public func: string, public args: FunctionCallArg[] = []) {}\n\n toString(): string {\n return (\n `${this.func}` +\n '(' +\n this.args.map((a) => a.toString()).join(', ') +\n ')'\n );\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(public name: string, documentations: string[] = []) {\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(\n [...this.fields, ...this.attributes]\n .map((d) => d.toString())\n .join('\\n')\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\n ? ' ' + this.attributes.map((a) => a.toString()).join(' ')\n : '')\n );\n }\n}\n","import { loadDocument } from '@zenstackhq/language';\nimport {\n ArrayExpr,\n AttributeArg,\n BinaryExpr,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n Enum,\n Expression,\n InvocationExpr,\n isArrayExpr,\n isBinaryExpr,\n isDataModel,\n isDataModelField,\n isDataSource,\n isEnum,\n isEnumField,\n isInvocationExpr,\n isLiteralExpr,\n isMemberAccessExpr,\n isNullExpr,\n isProcedure,\n isReferenceExpr,\n isThisExpr,\n isUnaryExpr,\n LiteralExpr,\n MemberAccessExpr,\n Procedure,\n ReferenceExpr,\n UnaryExpr,\n type Model,\n} from '@zenstackhq/language/ast';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport invariant from 'tiny-invariant';\nimport { match } from 'ts-pattern';\nimport * as ts from 'typescript';\nimport { ModelUtils } from '.';\nimport {\n getAttribute,\n getAuthDecl,\n hasAttribute,\n isIdField,\n isUniqueField,\n} from './model-utils';\n\nexport class TsSchemaGenerator {\n public async generate(\n schemaFile: string,\n pluginModelFiles: string[],\n outputFile: string\n ) {\n const loaded = await loadDocument(schemaFile, pluginModelFiles);\n if (!loaded.success) {\n throw new Error(`Error loading schema:${loaded.errors.join('\\n')}`);\n }\n\n const { model, warnings } = loaded;\n const statements: ts.Statement[] = [];\n\n this.generateSchemaStatements(model, statements);\n\n this.generateBannerComments(statements);\n\n const sourceFile = ts.createSourceFile(\n outputFile,\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\n fs.mkdirSync(path.dirname(outputFile), { recursive: true });\n fs.writeFileSync(outputFile, result);\n\n return { model, warnings };\n }\n\n private generateSchemaStatements(model: Model, statements: ts.Statement[]) {\n const hasComputedFields = model.declarations.some(\n (d) =>\n isDataModel(d) &&\n d.fields.some((f) => hasAttribute(f, '@computed'))\n );\n\n const runtimeImportDecl = 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('SchemaDef')\n ),\n ...(hasComputedFields\n ? [\n ts.factory.createImportSpecifier(\n true,\n undefined,\n ts.factory.createIdentifier(\n 'OperandExpression'\n )\n ),\n ]\n : []),\n ts.factory.createImportSpecifier(\n false,\n undefined,\n ts.factory.createIdentifier('ExpressionUtils')\n ),\n ])\n ),\n ts.factory.createStringLiteral('@zenstackhq/runtime/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(\n this.createSchemaObject(model),\n ts.factory.createTypeReferenceNode('const')\n ),\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 createSchemaObject(model: Model) {\n const properties: ts.PropertyAssignment[] = [\n // provider\n ts.factory.createPropertyAssignment(\n 'provider',\n this.createProviderObject(model)\n ),\n\n // models\n ts.factory.createPropertyAssignment(\n 'models',\n this.createModelsObject(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) =>\n ts.factory.createPropertyAssignment(\n e.name,\n this.createEnumObject(e)\n )\n ),\n true\n )\n )\n );\n }\n\n // authType\n const authType = getAuthDecl(model);\n if (authType) {\n properties.push(\n ts.factory.createPropertyAssignment(\n 'authType',\n this.createLiteralNode(authType.name)\n )\n );\n }\n\n // procedures\n const procedures = model.declarations.filter(isProcedure);\n if (procedures.length > 0) {\n properties.push(\n ts.factory.createPropertyAssignment(\n 'procedures',\n this.createProceduresObject(procedures)\n )\n );\n }\n\n // plugins\n properties.push(\n ts.factory.createPropertyAssignment(\n 'plugins',\n ts.factory.createObjectLiteralExpression([], true)\n )\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 [\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(dsProvider.type)\n ),\n ],\n true\n );\n }\n\n private createModelsObject(model: Model) {\n return ts.factory.createObjectLiteralExpression(\n model.declarations\n .filter(\n (d): d is DataModel =>\n isDataModel(d) && !hasAttribute(d, '@@ignore')\n )\n .map((dm) =>\n ts.factory.createPropertyAssignment(\n dm.name,\n this.createDataModelObject(dm)\n )\n ),\n true\n );\n }\n\n private createDataModelObject(dm: DataModel) {\n const fields: ts.PropertyAssignment[] = [\n // fields\n ts.factory.createPropertyAssignment(\n 'fields',\n ts.factory.createObjectLiteralExpression(\n dm.fields\n .filter((field) => !hasAttribute(field, '@ignore'))\n .map((field) =>\n ts.factory.createPropertyAssignment(\n field.name,\n this.createDataModelFieldObject(field)\n )\n ),\n true\n )\n ),\n\n // attributes\n ...(dm.attributes.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'attributes',\n ts.factory.createArrayLiteralExpression(\n dm.attributes.map((attr) =>\n this.createAttributeObject(attr)\n ),\n true\n )\n ),\n ]\n : []),\n\n // idFields\n ts.factory.createPropertyAssignment(\n 'idFields',\n ts.factory.createArrayLiteralExpression(\n this.getIdFields(dm).map((idField) =>\n ts.factory.createStringLiteral(idField)\n )\n )\n ),\n\n // uniqueFields\n ts.factory.createPropertyAssignment(\n 'uniqueFields',\n this.createUniqueFieldsObject(dm)\n ),\n ];\n\n const computedFields = dm.fields.filter((f) =>\n hasAttribute(f, '@computed')\n );\n\n if (computedFields.length > 0) {\n fields.push(\n ts.factory.createPropertyAssignment(\n 'computedFields',\n this.createComputedFieldsObject(computedFields)\n )\n );\n }\n\n return ts.factory.createObjectLiteralExpression(fields, true);\n }\n\n private createComputedFieldsObject(fields: DataModelField[]) {\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 ts.factory.createTypeReferenceNode('OperandExpression', [\n ts.factory.createKeywordTypeNode(\n this.mapTypeToTSSyntaxKeyword(field.type.type!)\n ),\n ]),\n ts.factory.createBlock(\n [\n ts.factory.createThrowStatement(\n ts.factory.createNewExpression(\n ts.factory.createIdentifier('Error'),\n undefined,\n [\n ts.factory.createStringLiteral(\n 'This is a stub for computed field'\n ),\n ]\n )\n ),\n ],\n true\n )\n )\n ),\n true\n );\n }\n\n private mapTypeToTSSyntaxKeyword(type: string) {\n return match<string, ts.KeywordTypeSyntaxKind>(type)\n .with('String', () => ts.SyntaxKind.StringKeyword)\n .with('Boolean', () => ts.SyntaxKind.BooleanKeyword)\n .with('Int', () => ts.SyntaxKind.NumberKeyword)\n .with('Float', () => ts.SyntaxKind.NumberKeyword)\n .with('BigInt', () => ts.SyntaxKind.BigIntKeyword)\n .with('Decimal', () => ts.SyntaxKind.NumberKeyword)\n .otherwise(() => ts.SyntaxKind.UnknownKeyword);\n }\n\n private createDataModelFieldObject(field: DataModelField) {\n const objectFields = [\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(\n field.type.type ?? field.type.reference!.$refText\n )\n ),\n ];\n\n if (isIdField(field)) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'id',\n ts.factory.createTrue()\n )\n );\n }\n\n if (isUniqueField(field)) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'unique',\n ts.factory.createTrue()\n )\n );\n }\n\n if (field.type.optional) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'optional',\n ts.factory.createTrue()\n )\n );\n }\n\n if (field.type.array) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'array',\n ts.factory.createTrue()\n )\n );\n }\n\n if (hasAttribute(field, '@updatedAt')) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'updatedAt',\n ts.factory.createTrue()\n )\n );\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) =>\n this.createAttributeObject(attr)\n )\n )\n )\n );\n }\n\n const defaultValue = this.getMappedDefault(field);\n if (defaultValue !== undefined) {\n if (typeof defaultValue === 'object') {\n if ('call' in defaultValue) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n\n ts.factory.createCallExpression(\n ts.factory.createIdentifier(\n 'ExpressionUtils.call'\n ),\n undefined,\n [\n ts.factory.createStringLiteral(\n defaultValue.call\n ),\n ...(defaultValue.args.length > 0\n ? [\n ts.factory.createArrayLiteralExpression(\n defaultValue.args.map((arg) =>\n this.createLiteralNode(\n arg\n )\n )\n ),\n ]\n : []),\n ]\n )\n )\n );\n } else if ('authMember' in defaultValue) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n ts.factory.createCallExpression(\n ts.factory.createIdentifier(\n 'ExpressionUtils.member'\n ),\n undefined,\n [\n ts.factory.createCallExpression(\n ts.factory.createIdentifier(\n 'ExpressionUtils.call'\n ),\n undefined,\n [ts.factory.createStringLiteral('auth')]\n ),\n ts.factory.createArrayLiteralExpression(\n defaultValue.authMember.map((m) =>\n ts.factory.createStringLiteral(m)\n )\n ),\n ]\n )\n )\n );\n } else {\n throw new Error(\n `Unsupported default value type for field ${field.name}`\n );\n }\n } else {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'default',\n typeof defaultValue === 'string'\n ? ts.factory.createStringLiteral(defaultValue)\n : typeof defaultValue === 'number'\n ? ts.factory.createNumericLiteral(defaultValue)\n : defaultValue === true\n ? ts.factory.createTrue()\n : ts.factory.createFalse()\n )\n );\n }\n }\n\n if (hasAttribute(field, '@computed')) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'computed',\n ts.factory.createTrue()\n )\n );\n }\n\n if (isDataModel(field.type.reference?.ref)) {\n objectFields.push(\n ts.factory.createPropertyAssignment(\n 'relation',\n this.createRelationObject(field)\n )\n );\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 getDataSourceProvider(\n model: Model\n ):\n | { type: string; env: undefined; url: string }\n | { type: string; env: string; url: undefined } {\n const dataSource = model.declarations.find(isDataSource);\n invariant(dataSource, 'No data source found in the model');\n\n const providerExpr = dataSource.fields.find(\n (f) => f.name === 'provider'\n )?.value;\n invariant(isLiteralExpr(providerExpr), 'Provider must be a literal');\n const type = providerExpr.value as string;\n\n const urlExpr = dataSource.fields.find((f) => f.name === 'url')?.value;\n invariant(\n isLiteralExpr(urlExpr) || isInvocationExpr(urlExpr),\n 'URL must be a literal or env function'\n );\n\n if (isLiteralExpr(urlExpr)) {\n return { type, url: urlExpr.value as string, env: undefined };\n } else if (isInvocationExpr(urlExpr)) {\n invariant(\n urlExpr.function.$refText === 'env',\n 'only \"env\" function is supported'\n );\n invariant(\n urlExpr.args.length === 1,\n 'env function must have one argument'\n );\n return {\n type,\n env: (urlExpr.args[0]!.value as LiteralExpr).value as string,\n url: undefined,\n };\n } else {\n throw new Error('Unsupported URL type');\n }\n }\n\n private getMappedDefault(\n field: DataModelField\n ):\n | string\n | number\n | boolean\n | { call: string; args: any[] }\n | { authMember: string[] }\n | undefined {\n const defaultAttr = getAttribute(field, '@default');\n if (!defaultAttr) {\n return undefined;\n }\n\n const defaultValue = defaultAttr.args[0]?.value;\n invariant(defaultValue, 'Expected a default value');\n\n if (isLiteralExpr(defaultValue)) {\n const lit = (defaultValue as LiteralExpr).value;\n return field.type.type === 'Boolean'\n ? (lit as boolean)\n : ['Int', 'Float', 'Decimal', 'BigInt'].includes(\n field.type.type!\n )\n ? Number(lit)\n : lit;\n } else if (\n isReferenceExpr(defaultValue) &&\n isEnumField(defaultValue.target.ref)\n ) {\n return defaultValue.target.ref.name;\n } else if (isInvocationExpr(defaultValue)) {\n return {\n call: defaultValue.function.$refText,\n args: defaultValue.args.map((arg) =>\n this.getLiteral(arg.value)\n ),\n };\n } else if (this.isAuthMemberAccess(defaultValue)) {\n return {\n authMember: this.getMemberAccessChain(defaultValue),\n };\n } else {\n throw new Error(\n `Unsupported default value type for field ${field.name}`\n );\n }\n }\n\n private getMemberAccessChain(expr: MemberAccessExpr): string[] {\n if (!isMemberAccessExpr(expr.operand)) {\n return [expr.member.$refText];\n } else {\n return [\n ...this.getMemberAccessChain(expr.operand),\n expr.member.$refText,\n ];\n }\n }\n\n private isAuthMemberAccess(expr: Expression): expr is MemberAccessExpr {\n if (isMemberAccessExpr(expr)) {\n return (\n this.isAuthInvocation(expr.operand) ||\n this.isAuthMemberAccess(expr.operand)\n );\n } else {\n return false;\n }\n }\n\n private isAuthInvocation(expr: Expression) {\n return (\n isInvocationExpr(expr) &&\n expr.function.$refText === 'auth' &&\n ModelUtils.isFromStdlib(expr.function.ref!)\n );\n }\n\n private createRelationObject(field: DataModelField) {\n const relationFields: ts.PropertyAssignment[] = [];\n\n const oppositeRelation = this.getOppositeRelationField(field);\n if (oppositeRelation) {\n relationFields.push(\n ts.factory.createPropertyAssignment(\n 'opposite',\n ts.factory.createStringLiteral(oppositeRelation.name)\n )\n );\n }\n\n const relationName = this.getRelationName(field);\n if (relationName) {\n relationFields.push(\n ts.factory.createPropertyAssignment(\n 'name',\n ts.factory.createStringLiteral(relationName)\n )\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) =>\n ts.factory.createStringLiteral(el)\n )\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(\n param,\n ts.factory.createStringLiteral(action)\n )\n );\n }\n }\n }\n\n return ts.factory.createObjectLiteralExpression(relationFields);\n }\n\n private getReferenceNames(expr: Expression) {\n return (\n isArrayExpr(expr) &&\n expr.items.map((item) => (item as ReferenceExpr).target.$refText)\n );\n }\n\n private getForeignKeyFor(field: DataModelField) {\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(\n (el) =>\n isReferenceExpr(el) && el.target.ref === field\n )\n ) {\n result.push(f.name);\n }\n }\n }\n }\n return result;\n }\n\n private getOppositeRelationField(field: DataModelField) {\n if (\n !field.type.reference?.ref ||\n !isDataModel(field.type.reference?.ref)\n ) {\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: DataModelField) {\n const relation = getAttribute(field, '@relation');\n if (relation) {\n const nameArg = relation.args.find(\n (arg) => arg.$resolvedParam.name === 'name'\n );\n if (nameArg) {\n invariant(\n isLiteralExpr(nameArg.value),\n 'name must be a literal'\n );\n return nameArg.value.value as string;\n }\n }\n return undefined;\n }\n\n private getIdFields(dm: DataModel) {\n return dm.fields.filter(isIdField).map((f) => f.name);\n }\n\n private createUniqueFieldsObject(dm: DataModel) {\n const properties: ts.PropertyAssignment[] = [];\n\n // field-level id and unique\n for (const field of dm.fields) {\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(\n 'type',\n ts.factory.createStringLiteral(field.type.type!)\n ),\n ])\n )\n );\n }\n }\n\n // model-level id and unique\n for (const attr of dm.attributes) {\n if (\n attr.decl.$refText === '@@id' ||\n attr.decl.$refText === '@@unique'\n ) {\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 = dm.fields.find(\n (f) => f.name === fieldNames[0]\n )!;\n properties.push(\n ts.factory.createPropertyAssignment(\n fieldNames[0]!,\n ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(\n fieldDef.type.type!\n )\n ),\n ])\n )\n );\n } else {\n // multi-field unique\n properties.push(\n ts.factory.createPropertyAssignment(\n fieldNames.join('_'),\n ts.factory.createObjectLiteralExpression(\n fieldNames.map((field) => {\n const fieldDef = dm.fields.find(\n (f) => f.name === field\n )!;\n return ts.factory.createPropertyAssignment(\n field,\n ts.factory.createObjectLiteralExpression(\n [\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(\n fieldDef.type.type!\n )\n ),\n ]\n )\n );\n })\n )\n )\n );\n }\n }\n }\n\n return ts.factory.createObjectLiteralExpression(properties, true);\n }\n\n private createEnumObject(e: Enum) {\n return ts.factory.createObjectLiteralExpression(\n e.fields.map((field) =>\n ts.factory.createPropertyAssignment(\n field.name,\n ts.factory.createStringLiteral(field.name)\n )\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) =>\n ts.factory.createPropertyAssignment(\n proc.name,\n this.createProcedureObject(proc)\n )\n ),\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(\n 'name',\n ts.factory.createStringLiteral(param.name)\n ),\n ...(param.optional\n ? [\n ts.factory.createPropertyAssignment(\n 'optional',\n ts.factory.createTrue()\n ),\n ]\n : []),\n ts.factory.createPropertyAssignment(\n 'type',\n ts.factory.createStringLiteral(\n param.type.type ?? param.type.reference!.$refText\n )\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(\n ts.factory.createStringLiteral(param.name)\n )\n ),\n ts.factory.createPropertySignature(\n undefined,\n ts.factory.createStringLiteral('type'),\n undefined,\n ts.factory.createLiteralTypeNode(\n ts.factory.createStringLiteral(\n param.type.type ??\n param.type.reference!.$refText\n )\n )\n ),\n ...(param.optional\n ? [\n ts.factory.createPropertySignature(\n undefined,\n ts.factory.createStringLiteral(\n 'optional'\n ),\n undefined,\n ts.factory.createLiteralTypeNode(\n ts.factory.createTrue()\n )\n ),\n ]\n : []),\n ])\n )\n ),\n ]);\n\n return ts.factory.createObjectLiteralExpression(\n [\n ts.factory.createPropertyAssignment(\n 'params',\n ts.factory.createAsExpression(params, paramsType)\n ),\n ts.factory.createPropertyAssignment(\n 'returnType',\n ts.factory.createStringLiteral(\n proc.returnType.type ??\n proc.returnType.reference!.$refText\n )\n ),\n ...(proc.mutation\n ? [\n ts.factory.createPropertyAssignment(\n 'mutation',\n ts.factory.createTrue()\n ),\n ]\n : []),\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`;\n ts.addSyntheticLeadingComment(\n statements[0]!,\n ts.SyntaxKind.SingleLineCommentTrivia,\n banner\n );\n }\n\n private createAttributeObject(\n attr: DataModelAttribute | DataModelFieldAttribute\n ): ts.Expression {\n return ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment(\n 'name',\n ts.factory.createStringLiteral(attr.decl.$refText)\n ),\n ...(attr.args.length > 0\n ? [\n ts.factory.createPropertyAssignment(\n 'args',\n ts.factory.createArrayLiteralExpression(\n attr.args.map((arg) =>\n this.createAttributeArg(arg)\n )\n )\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 ? [\n ts.factory.createPropertyAssignment(\n 'name',\n ts.factory.createStringLiteral(\n arg.$resolvedParam.name\n )\n ),\n ]\n : []),\n\n // value\n ts.factory.createPropertyAssignment(\n 'value',\n this.createExpression(arg.value)\n ),\n ]);\n }\n\n private createExpression(value: Expression): ts.Expression {\n return match(value)\n .when(isLiteralExpr, (expr) =>\n this.createLiteralExpression(expr.$type, expr.value)\n )\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) =>\n this.createMemberExpression(expr)\n )\n .when(isNullExpr, () => this.createNullExpression())\n .when(isThisExpr, () => this.createThisExpression())\n .otherwise(() => {\n throw new Error(\n `Unsupported attribute arg value: ${value.$type}`\n );\n });\n }\n\n private createThisExpression() {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils._this'),\n undefined,\n []\n );\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(\n members.map((m) => ts.factory.createStringLiteral(m))\n ),\n ];\n\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.member'),\n undefined,\n args\n );\n }\n\n private createNullExpression() {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils._null'),\n undefined,\n []\n );\n }\n\n private createBinaryExpression(expr: BinaryExpr) {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.binary'),\n undefined,\n [\n this.createExpression(expr.left),\n this.createLiteralNode(expr.operator),\n this.createExpression(expr.right),\n ]\n );\n }\n\n private createUnaryExpression(expr: UnaryExpr) {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.unary'),\n undefined,\n [\n this.createLiteralNode(expr.operator),\n this.createExpression(expr.operand),\n ]\n );\n }\n\n private createArrayExpression(expr: ArrayExpr): any {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.array'),\n undefined,\n [\n ts.factory.createArrayLiteralExpression(\n expr.items.map((item) => this.createExpression(item))\n ),\n ]\n );\n }\n\n private createRefExpression(expr: ReferenceExpr): any {\n if (isDataModelField(expr.target.ref)) {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.field'),\n undefined,\n [this.createLiteralNode(expr.target.$refText)]\n );\n } else if (isEnumField(expr.target.ref)) {\n return this.createLiteralExpression(\n 'StringLiteral',\n expr.target.$refText\n );\n } else {\n throw new Error(\n `Unsupported reference type: ${expr.target.$refText}`\n );\n }\n }\n\n private createCallExpression(expr: InvocationExpr) {\n return ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.call'),\n undefined,\n [\n ts.factory.createStringLiteral(expr.function.$refText),\n ...(expr.args.length > 0\n ? [\n ts.factory.createArrayLiteralExpression(\n expr.args.map((arg) =>\n this.createExpression(arg.value)\n )\n ),\n ]\n : []),\n ]\n );\n }\n\n private createLiteralExpression(type: string, value: string | boolean) {\n return match(type)\n .with('BooleanLiteral', () =>\n ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.literal'),\n undefined,\n [this.createLiteralNode(value)]\n )\n )\n .with('NumberLiteral', () =>\n ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.literal'),\n undefined,\n [ts.factory.createIdentifier(value as string)]\n )\n )\n .with('StringLiteral', () =>\n ts.factory.createCallExpression(\n ts.factory.createIdentifier('ExpressionUtils.literal'),\n undefined,\n [this.createLiteralNode(value)]\n )\n )\n .otherwise(() => {\n throw new Error(`Unsupported literal type: ${type}`);\n });\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 DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n DataModelFieldType,\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 TypeDefField,\n TypeDefFieldType,\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 (\n _target: unknown,\n _propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\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\n ? ' ' + ast.attributes.map((x) => this.generate(x)).join(' ')\n : ''\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(\n (x) =>\n (x.name ? x.name + ': ' : '') + this.generate(x.value)\n )\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.isAbstract ? 'abstract ' : ''}${\n ast.isView ? 'view' : 'model'\n } ${ast.name}${\n ast.superTypes.length > 0\n ? ' extends ' +\n ast.superTypes.map((x) => x.ref?.name).join(', ')\n : ''\n } {\n${ast.fields.map((x) => this.indent + this.generate(x)).join('\\n')}${\n ast.attributes.length > 0\n ? '\\n\\n' +\n ast.attributes\n .map((x) => this.indent + this.generate(x))\n .join('\\n')\n : ''\n }\n}`;\n }\n\n @gen(DataModelField)\n private _generateDataModelField(ast: DataModelField) {\n return `${ast.name} ${this.fieldType(ast.type)}${\n ast.attributes.length > 0\n ? ' ' + ast.attributes.map((x) => this.generate(x)).join(' ')\n : ''\n }`;\n }\n\n private fieldType(type: DataModelFieldType | TypeDefFieldType) {\n const baseType = type.type\n ? type.type\n : type.$type == 'DataModelFieldType' && type.unsupported\n ? 'Unsupported(' + this.generate(type.unsupported.value) + ')'\n : type.reference?.$refText;\n return `${baseType}${type.array ? '[]' : ''}${\n type.optional ? '?' : ''\n }`;\n }\n\n @gen(DataModelAttribute)\n private _generateDataModelAttribute(ast: DataModelAttribute) {\n return this.attribute(ast);\n }\n\n @gen(DataModelFieldAttribute)\n private _generateDataModelFieldAttribute(ast: DataModelFieldAttribute) {\n return this.attribute(ast);\n }\n\n private attribute(ast: DataModelAttribute | DataModelFieldAttribute) {\n const args = ast.args.length\n ? `(${ast.args.map((x) => this.generate(x)).join(', ')})`\n : '';\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\n .map((field) => this.objectField(field))\n .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'\n ? `'${ast.value}'`\n : `\"${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(\n ast.operand\n )}`;\n }\n\n @gen(BinaryExpr)\n private _generateBinaryExpr(ast: BinaryExpr) {\n const operator = ast.operator;\n const isCollectionPredicate =\n this.isCollectionPredicateOperator(operator);\n const rightExpr = this.generate(ast.right);\n\n const { left: isLeftParenthesis, right: isRightParenthesis } =\n 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\n ? `(${ast.args.map((x) => this.generate(x)).join(', ')})`\n : '';\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\n .map((x) => this.argument(x))\n .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\n .map((x) => this.generate(x))\n .join(', ')})`;\n }\n\n @gen(AttributeParam)\n private _generateAttributeParam(ast: AttributeParam) {\n return `${ast.default ? '_ ' : ''}${ast.name}: ${this.generate(\n ast.type\n )}`;\n }\n\n @gen(AttributeParamType)\n private _generateAttributeParamType(ast: AttributeParamType) {\n return `${ast.type ?? ast.reference?.$refText}${ast.array ? '[]' : ''}${\n ast.optional ? '?' : ''\n }`;\n }\n\n @gen(FunctionDecl)\n private _generateFunctionDecl(ast: FunctionDecl) {\n return `function ${ast.name}(${ast.params\n .map((x) => this.generate(x))\n .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' +\n ast.attributes\n .map((x) => this.indent + this.generate(x))\n .join('\\n')\n : ''\n }\n}`;\n }\n\n @gen(TypeDefField)\n private _generateTypeDefField(ast: TypeDefField) {\n return `${ast.name} ${this.fieldType(ast.type)}${\n ast.attributes.length > 0\n ? ' ' + ast.attributes.map((x) => this.generate(x)).join(' ')\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 =\n this.isCollectionPredicateOperator(operator);\n\n const currentPriority = BinaryExprOperatorPriority[operator];\n\n if (\n ast.left.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.left as BinaryExpr)['operator']] <\n 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']] <=\n 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":["isIdField","field","hasAttribute","model","$container","modelLevelIds","getModelIdFields","map","f","name","includes","fields","some","length","firstUniqueField","find","modelLevelUnique","getModelUniqueFields","decl","getAttribute","attributes","attr","$refText","modelsToCheck","$baseMerged","getRecursiveBases","modelToCheck","idAttr","fieldsArg","args","a","$resolvedParam","isArrayExpr","value","items","filter","item","isReferenceExpr","target","ref","uniqueAttr","dataModel","includeDelegate","seen","Set","result","has","add","superTypes","forEach","superType","baseDecl","isDelegateModel","push","node","isDataModel","isUniqueField","modelIds","arg","isLiteralExpr","isFromStdlib","getContainingModel","$document","uri","path","endsWith","isModel","resolved","Error","getAuthDecl","found","declarations","d","import_ast","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","constructor","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","constructor","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","PrismaSchemaGenerator","PRELUDE","constructor","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","length","arg","configInvocationArgToText","join","JSON","stringify","addGenerator","model","isView","addView","addModel","field","ModelUtils","hasAttribute","generateModelField","attr","attributes","filter","isPrismaAttribute","generateContainerAttribute","comments","forEach","c","addComment","ref","some","a","getUnsupportedFieldType","fieldType","unsupported","getStringLiteral","undefined","node","isStringLiteral","addToFront","type","reference","isTypeDef","Error","$container","isArray","array","ModelFieldType","optional","isDefaultWithPluginInvocation","isIdField","isInheritedFromDelegate","$refText","makeFieldAttribute","docs","result","addField","AstUtils","streamAst","isFromPlugin","function","getContainerOfType","isModel","$document","uri","path","endsWith","setDummyDefault","dummyDefaultValue","match","with","AttributeArgValue","P","union","PrismaFunctionCall","otherwise","push","PrismaFieldAttribute","PrismaAttributeArg","$inheritedFrom","isDelegateModel","attrName","makeAttributeArg","makeAttributeArgValue","argType","StringLiteral","NumberLiteral","BooleanLiteral","exhaustive","PrismaAttributeArgValue","isArrayExpr","Array","isReferenceExpr","PrismaFieldReference","target","PrismaFieldReferenceArg","exprToText","ZModelCodeGenerator","quote","val","when","v","isNullExpr","PrismaFunctionCallArg","container","PrismaModelAttribute","_enum","addEnum","generateEnumField","import_ast","import_ts_pattern","TsSchemaGenerator","generate","schemaFile","pluginModelFiles","outputFile","loaded","loadDocument","success","Error","errors","join","model","warnings","statements","generateSchemaStatements","generateBannerComments","sourceFile","createSourceFile","ScriptTarget","ESNext","ScriptKind","TS","printer","createPrinter","result","printList","ListFormat","MultiLine","factory","createNodeArray","fs","mkdirSync","path","dirname","recursive","writeFileSync","hasComputedFields","declarations","some","d","isDataModel","fields","f","hasAttribute","runtimeImportDecl","createImportDeclaration","undefined","createImportClause","createNamedImports","createImportSpecifier","createIdentifier","createStringLiteral","push","declaration","createVariableStatement","createModifier","SyntaxKind","ExportKeyword","createVariableDeclarationList","createVariableDeclaration","createSatisfiesExpression","createAsExpression","createSchemaObject","createTypeReferenceNode","NodeFlags","Const","typeDeclaration","createTypeAliasDeclaration","properties","createPropertyAssignment","createProviderObject","createModelsObject","enums","filter","isEnum","length","createObjectLiteralExpression","map","e","name","createEnumObject","authType","getAuthDecl","createLiteralNode","procedures","isProcedure","createProceduresObject","dsProvider","getDataSourceProvider","type","dm","createDataModelObject","field","createDataModelFieldObject","attributes","createArrayLiteralExpression","attr","createAttributeObject","getIdFields","idField","createUniqueFieldsObject","computedFields","createComputedFieldsObject","createMethodDeclaration","createKeywordTypeNode","mapTypeToTSSyntaxKeyword","createBlock","createThrowStatement","createNewExpression","match","with","StringKeyword","BooleanKeyword","NumberKeyword","BigIntKeyword","otherwise","UnknownKeyword","objectFields","reference","$refText","isIdField","createTrue","isUniqueField","optional","array","defaultValue","getMappedDefault","createCallExpression","call","args","arg","authMember","m","createNumericLiteral","createFalse","ref","createRelationObject","fkFor","getForeignKeyFor","fk","dataSource","find","isDataSource","invariant","providerExpr","value","isLiteralExpr","urlExpr","isInvocationExpr","url","env","function","defaultAttr","getAttribute","lit","includes","Number","isReferenceExpr","isEnumField","target","getLiteral","isAuthMemberAccess","getMemberAccessChain","expr","isMemberAccessExpr","operand","member","isAuthInvocation","ModelUtils","isFromStdlib","relationFields","oppositeRelation","getOppositeRelationField","relationName","getRelationName","relation","param","$resolvedParam","fieldNames","getReferenceNames","el","action","isArrayExpr","items","item","$container","sourceModel","targetModel","otherField","otherRelationName","nameArg","decl","fieldDef","$type","parseFloat","createNull","proc","createProcedureObject","params","paramsType","createTupleTypeNode","createNamedTupleMember","createTypeLiteralNode","createPropertySignature","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","isDataModelField","import_ast","generationHandlers","Map","gen","name","_target","_propertyKey","descriptor","get","set","ZModelCodeGenerator","options","constructor","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","isAbstract","isView","superTypes","ref","_generateDataModelField","fieldType","type","baseType","unsupported","reference","$refText","array","optional","_generateDataModelAttribute","attribute","_generateDataModelFieldAttribute","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","_generateTypeDefField","repeat","result","currentPriority","BinaryExprOperatorPriority","BinaryExpr","op","includes"]}