zenstack 1.0.0-alpha.22 → 1.0.0-alpha.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/language-server/validator/utils.js +1 -1
- package/language-server/validator/utils.js.map +1 -1
- package/package.json +4 -4
- package/plugins/prisma/prisma-builder.js +1 -1
- package/plugins/prisma/prisma-builder.js.map +1 -1
- package/plugins/prisma/schema-generator.js +9 -3
- package/plugins/prisma/schema-generator.js.map +1 -1
- package/plugins/prisma/zmodel-code-generator.d.ts +2 -1
- package/plugins/prisma/zmodel-code-generator.js +11 -2
- package/plugins/prisma/zmodel-code-generator.js.map +1 -1
|
@@ -108,7 +108,7 @@ function assignableToAttributeParam(arg, param, attr) {
|
|
|
108
108
|
dstType = 'Any';
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
|
-
return typeAssignable(dstType, argResolvedType.decl) && dstIsArray === argResolvedType.array;
|
|
111
|
+
return typeAssignable(dstType, argResolvedType.decl) && (dstType === 'Any' || dstIsArray === argResolvedType.array);
|
|
112
112
|
} else {
|
|
113
113
|
return (dstRef === null || dstRef === void 0 ? void 0 : dstRef.ref) === argResolvedType.decl && dstIsArray === argResolvedType.array;
|
|
114
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["validateDuplicatedDeclarations","decls","accept","groupByName","reduce","group","decl","name","push","Object","entries","length","node","getStringLiteral","isLiteralExpr","value","undefined","typeAssignable","destType","sourceType","mapBuiltinTypeToExpressionType","type","assignableToAttributeParam","arg","param","attr","argResolvedType","$resolvedType","dstType","dstIsArray","array","dstRef","reference","isArrayExpr","items","find","item","isReferenceExpr","isDataModelField","target","ref","$container"],"sources":["../../../src/language-server/validator/utils.ts"],"sourcesContent":["import {\n AttributeArg,\n AttributeParam,\n BuiltinType,\n DataModelAttribute,\n DataModelFieldAttribute,\n ExpressionType,\n isArrayExpr,\n isDataModelField,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport { AstNode, ValidationAcceptor } from 'langium';\n\n/**\n * Checks if the given declarations have duplicated names\n */\nexport function validateDuplicatedDeclarations(\n decls: Array<AstNode & { name: string }>,\n accept: ValidationAcceptor\n): void {\n const groupByName = decls.reduce<Record<string, Array<AstNode & { name: string }>>>((group, decl) => {\n group[decl.name] = group[decl.name] ?? [];\n group[decl.name].push(decl);\n return group;\n }, {});\n\n for (const [name, decls] of Object.entries<AstNode[]>(groupByName)) {\n if (decls.length > 1) {\n accept('error', `Duplicated declaration name \"${name}\"`, {\n node: decls[1],\n });\n }\n }\n}\n\n/**\n * Try getting string value from a potential string literal expression\n */\nexport function getStringLiteral(node: AstNode | undefined): string | undefined {\n if (isLiteralExpr(node) && typeof node.value === 'string') {\n return node.value;\n } else {\n return undefined;\n }\n}\n\n/**\n * Determines if the given sourceType is assignable to a destination of destType\n */\nexport function typeAssignable(destType: ExpressionType, sourceType: ExpressionType): boolean {\n switch (destType) {\n case 'Any':\n return true;\n case 'Float':\n return sourceType === 'Any' || sourceType === 'Int' || sourceType === 'Float';\n default:\n return sourceType === 'Any' || sourceType === destType;\n }\n}\n\n/**\n * Maps a ZModel builtin type to expression type\n */\nexport function mapBuiltinTypeToExpressionType(type: BuiltinType | 'Any' | 'Null'): ExpressionType | 'Any' {\n switch (type) {\n case 'Any':\n case 'Boolean':\n case 'String':\n case 'DateTime':\n case 'Int':\n case 'Float':\n case 'Null':\n return type;\n case 'BigInt':\n return 'Int';\n case 'Decimal':\n return 'Float';\n case 'Json':\n case 'Bytes':\n return 'Any';\n }\n}\n\n/**\n * Determines if the given attribute argument is assignable to the given attribute parameter\n */\nexport function assignableToAttributeParam(\n arg: AttributeArg,\n param: AttributeParam,\n attr: DataModelAttribute | DataModelFieldAttribute\n): boolean {\n const argResolvedType = arg.$resolvedType;\n if (!argResolvedType) {\n return false;\n }\n\n let dstType = param.type.type;\n const dstIsArray = param.type.array;\n const dstRef = param.type.reference;\n\n if (dstType) {\n if (typeof argResolvedType?.decl !== 'string') {\n // destination type is not a reference, so argument type must be a plain expression\n return false;\n }\n\n if (dstType === 'FieldReference' || dstType === 'TransitiveFieldReference') {\n if (dstIsArray) {\n return (\n isArrayExpr(arg.value) &&\n !arg.value.items.find((item) => !isReferenceExpr(item) || !isDataModelField(item.target.ref))\n );\n } else {\n return isReferenceExpr(arg.value) && isDataModelField(arg.value.target.ref);\n }\n } else if (dstType === 'ContextType') {\n if (isDataModelField(attr.$container)) {\n if (!attr.$container?.type?.type) {\n return false;\n }\n dstType = mapBuiltinTypeToExpressionType(attr.$container.type.type);\n } else {\n dstType = 'Any';\n }\n }\n\n return typeAssignable(dstType, argResolvedType.decl) && dstIsArray === argResolvedType.array;\n } else {\n return dstRef?.ref === argResolvedType.decl && dstIsArray === argResolvedType.array;\n }\n}\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"utils.js","names":["validateDuplicatedDeclarations","decls","accept","groupByName","reduce","group","decl","name","push","Object","entries","length","node","getStringLiteral","isLiteralExpr","value","undefined","typeAssignable","destType","sourceType","mapBuiltinTypeToExpressionType","type","assignableToAttributeParam","arg","param","attr","argResolvedType","$resolvedType","dstType","dstIsArray","array","dstRef","reference","isArrayExpr","items","find","item","isReferenceExpr","isDataModelField","target","ref","$container"],"sources":["../../../src/language-server/validator/utils.ts"],"sourcesContent":["import {\n AttributeArg,\n AttributeParam,\n BuiltinType,\n DataModelAttribute,\n DataModelFieldAttribute,\n ExpressionType,\n isArrayExpr,\n isDataModelField,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport { AstNode, ValidationAcceptor } from 'langium';\n\n/**\n * Checks if the given declarations have duplicated names\n */\nexport function validateDuplicatedDeclarations(\n decls: Array<AstNode & { name: string }>,\n accept: ValidationAcceptor\n): void {\n const groupByName = decls.reduce<Record<string, Array<AstNode & { name: string }>>>((group, decl) => {\n group[decl.name] = group[decl.name] ?? [];\n group[decl.name].push(decl);\n return group;\n }, {});\n\n for (const [name, decls] of Object.entries<AstNode[]>(groupByName)) {\n if (decls.length > 1) {\n accept('error', `Duplicated declaration name \"${name}\"`, {\n node: decls[1],\n });\n }\n }\n}\n\n/**\n * Try getting string value from a potential string literal expression\n */\nexport function getStringLiteral(node: AstNode | undefined): string | undefined {\n if (isLiteralExpr(node) && typeof node.value === 'string') {\n return node.value;\n } else {\n return undefined;\n }\n}\n\n/**\n * Determines if the given sourceType is assignable to a destination of destType\n */\nexport function typeAssignable(destType: ExpressionType, sourceType: ExpressionType): boolean {\n switch (destType) {\n case 'Any':\n return true;\n case 'Float':\n return sourceType === 'Any' || sourceType === 'Int' || sourceType === 'Float';\n default:\n return sourceType === 'Any' || sourceType === destType;\n }\n}\n\n/**\n * Maps a ZModel builtin type to expression type\n */\nexport function mapBuiltinTypeToExpressionType(type: BuiltinType | 'Any' | 'Null'): ExpressionType | 'Any' {\n switch (type) {\n case 'Any':\n case 'Boolean':\n case 'String':\n case 'DateTime':\n case 'Int':\n case 'Float':\n case 'Null':\n return type;\n case 'BigInt':\n return 'Int';\n case 'Decimal':\n return 'Float';\n case 'Json':\n case 'Bytes':\n return 'Any';\n }\n}\n\n/**\n * Determines if the given attribute argument is assignable to the given attribute parameter\n */\nexport function assignableToAttributeParam(\n arg: AttributeArg,\n param: AttributeParam,\n attr: DataModelAttribute | DataModelFieldAttribute\n): boolean {\n const argResolvedType = arg.$resolvedType;\n if (!argResolvedType) {\n return false;\n }\n\n let dstType = param.type.type;\n const dstIsArray = param.type.array;\n const dstRef = param.type.reference;\n\n if (dstType) {\n if (typeof argResolvedType?.decl !== 'string') {\n // destination type is not a reference, so argument type must be a plain expression\n return false;\n }\n\n if (dstType === 'FieldReference' || dstType === 'TransitiveFieldReference') {\n if (dstIsArray) {\n return (\n isArrayExpr(arg.value) &&\n !arg.value.items.find((item) => !isReferenceExpr(item) || !isDataModelField(item.target.ref))\n );\n } else {\n return isReferenceExpr(arg.value) && isDataModelField(arg.value.target.ref);\n }\n } else if (dstType === 'ContextType') {\n if (isDataModelField(attr.$container)) {\n if (!attr.$container?.type?.type) {\n return false;\n }\n dstType = mapBuiltinTypeToExpressionType(attr.$container.type.type);\n } else {\n dstType = 'Any';\n }\n }\n\n return (\n typeAssignable(dstType, argResolvedType.decl) && (dstType === 'Any' || dstIsArray === argResolvedType.array)\n );\n } else {\n return dstRef?.ref === argResolvedType.decl && dstIsArray === argResolvedType.array;\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publisher": "zenstack",
|
|
4
4
|
"displayName": "ZenStack Language Tools",
|
|
5
5
|
"description": "A toolkit for building secure CRUD apps with Next.js + Typescript",
|
|
6
|
-
"version": "1.0.0-alpha.
|
|
6
|
+
"version": "1.0.0-alpha.23",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "ZenStack Team"
|
|
9
9
|
},
|
|
@@ -90,9 +90,9 @@
|
|
|
90
90
|
"vscode-languageserver-textdocument": "^1.0.7",
|
|
91
91
|
"vscode-uri": "^3.0.6",
|
|
92
92
|
"zod": "^3.19.1",
|
|
93
|
-
"@zenstackhq/language": "1.0.0-alpha.
|
|
94
|
-
"@zenstackhq/
|
|
95
|
-
"@zenstackhq/
|
|
93
|
+
"@zenstackhq/language": "1.0.0-alpha.23",
|
|
94
|
+
"@zenstackhq/runtime": "1.0.0-alpha.23",
|
|
95
|
+
"@zenstackhq/sdk": "1.0.0-alpha.23"
|
|
96
96
|
},
|
|
97
97
|
"devDependencies": {
|
|
98
98
|
"@babel/cli": "^7.19.3",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-builder.js","names":["PrismaModel","datasources","generators","models","enums","addDataSource","name","provider","url","shadowDatabaseUrl","ds","DataSource","push","addGenerator","fields","generator","Generator","addModel","model","Model","addEnum","e","Enum","toString","map","d","join","constructor","indentString","DataSourceUrl","value","isEnv","f","JSON","stringify","DeclarationBase","documentations","addComment","x","attributes","addField","type","field","ModelField","addAttribute","args","attr","ModelAttribute","ModelFieldType","array","optional","FieldAttribute","length","a","AttributeArg","AttributeArgValue","Error","Array","isArray","FieldReference","FunctionCall","fr","r","v","FieldReferenceArg","func","FunctionCallArg"],"sources":["../../../src/plugins/prisma/prisma-builder.ts"],"sourcesContent":["import indentString from './indent-string';\n\n/**\n * Prisma schema builder\n */\nexport class PrismaModel {\n private datasources: DataSource[] = [];\n private generators: Generator[] = [];\n private models: Model[] = [];\n private enums: Enum[] = [];\n\n addDataSource(name: string, provider: string, url: DataSourceUrl, shadowDatabaseUrl?: DataSourceUrl): DataSource {\n const ds = new DataSource(name, provider, url, shadowDatabaseUrl);\n this.datasources.push(ds);\n return ds;\n }\n\n addGenerator(name: string, fields: Array<{ name: string; value: string | string[] }>): Generator {\n const generator = new Generator(name, fields);\n this.generators.push(generator);\n return generator;\n }\n\n addModel(name: string): Model {\n const model = new Model(name);\n this.models.push(model);\n return model;\n }\n\n addEnum(name: string, fields: string[]): Enum {\n const e = new Enum(name, fields);\n this.enums.push(e);\n return e;\n }\n\n toString(): string {\n return [...this.datasources, ...this.generators, ...this.enums, ...this.models]\n .map((d) => d.toString())\n .join('\\n\\n');\n }\n}\n\nexport class DataSource {\n constructor(\n public name: string,\n public provider: string,\n public url: DataSourceUrl,\n public shadowDatabaseUrl?: DataSourceUrl\n ) {}\n\n toString(): string {\n return (\n `datasource ${this.name} {\\n` +\n indentString(`provider=\"${this.provider}\"\\n`) +\n indentString(`url=${this.url}\\n`) +\n (this.shadowDatabaseUrl ? indentString(`shadowDatabaseurl=${this.shadowDatabaseUrl}\\n`) : '') +\n `}`\n );\n }\n}\n\nexport class DataSourceUrl {\n constructor(public value: string, public isEnv: boolean) {}\n\n toString(): string {\n return this.isEnv ? `env(\"${this.value}\")` : `\"${this.value}\"`;\n }\n}\n\nexport class Generator {\n constructor(public name: string, public fields: Array<{ name: string; value: string | string[] }>) {}\n\n toString(): string {\n return (\n `generator ${this.name} {\\n` +\n this.fields.map((f) => indentString(`${f.name} = ${JSON.stringify(f.value)}`)).join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class DeclarationBase {\n public documentations: string[] = [];\n\n addComment(name: string): string {\n this.documentations.push(name);\n return name;\n }\n\n toString(): string {\n return this.documentations.map((x) => `/// ${x}\\n`).join('');\n }\n}\nexport class Model extends DeclarationBase {\n public fields: ModelField[] = [];\n public attributes: ModelAttribute[] = [];\n constructor(public name: string, public documentations: string[] = []) {\n super();\n }\n\n addField(\n name: string,\n type: ModelFieldType | string,\n attributes: FieldAttribute[] = [],\n documentations: string[] = []\n ): ModelField {\n const field = new ModelField(name, type, attributes, documentations);\n this.fields.push(field);\n return field;\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): ModelAttribute {\n const attr = new ModelAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n super.toString() +\n `model ${this.name} {\\n` +\n indentString([...this.fields, ...this.attributes].map((d) => d.toString()).join('\\n')) +\n `\\n}`\n );\n }\n}\n\nexport type ScalarTypes =\n | 'String'\n | 'Boolean'\n | 'Int'\n | 'BigInt'\n | 'Float'\n | 'Decimal'\n | 'DateTime'\n | 'Json'\n | 'Bytes'\n | 'Unsupported';\n\nexport class ModelFieldType {\n constructor(public type: ScalarTypes | string, public array?: boolean, public optional?: boolean) {}\n\n toString(): string {\n return `${this.type}${this.array ? '[]' : ''}${this.optional ? '?' : ''}`;\n }\n}\n\nexport class ModelField extends DeclarationBase {\n constructor(\n public name: string,\n public type: ModelFieldType | string,\n public attributes: FieldAttribute[] = [],\n public documentations: string[] = []\n ) {\n super();\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): FieldAttribute {\n const attr = new FieldAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n super.toString() +\n `${this.name} ${this.type}` +\n (this.attributes.length > 0 ? ' ' + this.attributes.map((a) => a.toString()).join(' ') : '')\n );\n }\n}\n\nexport class FieldAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class ModelAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class AttributeArg {\n constructor(public name: string | undefined, public value: AttributeArgValue) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value.toString();\n }\n}\n\nexport class AttributeArgValue {\n constructor(\n public type: 'String' | 'FieldReference' | 'Number' | 'Boolean' | 'Array' | 'FunctionCall',\n public value: string | number | boolean | FieldReference | FunctionCall | AttributeArgValue[]\n ) {\n switch (type) {\n case 'String':\n if (typeof value !== 'string') throw new Error('Value must be string');\n break;\n case 'Number':\n if (typeof value !== 'number') throw new Error('Value must be number');\n break;\n case 'Boolean':\n if (typeof value !== 'boolean') throw new Error('Value must be boolean');\n break;\n case 'Array':\n if (!Array.isArray(value)) throw new Error('Value must be array');\n break;\n case 'FieldReference':\n if (typeof value !== 'string' && !(value instanceof FieldReference))\n throw new Error('Value must be string or FieldReference');\n break;\n case 'FunctionCall':\n if (!(value instanceof FunctionCall)) throw new Error('Value must be FunctionCall');\n break;\n }\n }\n\n toString(): string {\n switch (this.type) {\n case 'String':\n return `\"${this.value}\"`;\n case 'Number':\n return this.value.toString();\n case 'FieldReference': {\n if (typeof this.value === 'string') {\n return this.value;\n } else {\n const fr = this.value as FieldReference;\n let r = fr.field;\n if (fr.args.length > 0) {\n r += '(' + fr.args.map((a) => a.toString()).join(',') + ')';\n }\n return r;\n }\n }\n case 'FunctionCall':\n return this.value.toString();\n case 'Boolean':\n return this.value ? 'true' : 'false';\n case 'Array':\n return '[' + (this.value as AttributeArgValue[]).map((v) => v.toString()).join(', ') + ']';\n default:\n throw new Error(`Unknown attribute value type ${this.type}`);\n }\n }\n}\n\nexport class FieldReference {\n constructor(public field: string, public args: FieldReferenceArg[] = []) {}\n}\n\nexport class FieldReferenceArg {\n constructor(public name: 'sort', public value: 'Asc' | 'Desc') {}\n\n toString(): string {\n return `${this.name}: ${this.value}`;\n }\n}\n\nexport class FunctionCall {\n constructor(public func: string, public args: FunctionCallArg[] = []) {}\n\n toString(): string {\n return `${this.func}` + '(' + this.args.map((a) => a.toString()).join(', ') + ')';\n }\n}\n\nexport class FunctionCallArg {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\n constructor(public name: string | undefined, public value: any) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value;\n }\n}\n\nexport class Enum {\n constructor(public name: string, public fields: EnumField[]) {}\n\n toString(): string {\n return `enum ${this.name} {\\n` + indentString(this.fields.join('\\n')) + '\\n}';\n }\n}\n\ntype EnumField = string;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prisma-builder.js","names":["PrismaModel","datasources","generators","models","enums","addDataSource","name","provider","url","shadowDatabaseUrl","ds","DataSource","push","addGenerator","fields","generator","Generator","addModel","model","Model","addEnum","e","Enum","toString","map","d","join","constructor","indentString","DataSourceUrl","value","isEnv","f","JSON","stringify","DeclarationBase","documentations","addComment","x","attributes","addField","type","field","ModelField","addAttribute","args","attr","ModelAttribute","ModelFieldType","array","optional","FieldAttribute","length","a","AttributeArg","AttributeArgValue","Error","Array","isArray","FieldReference","FunctionCall","fr","r","v","FieldReferenceArg","func","FunctionCallArg"],"sources":["../../../src/plugins/prisma/prisma-builder.ts"],"sourcesContent":["import indentString from './indent-string';\n\n/**\n * Prisma schema builder\n */\nexport class PrismaModel {\n private datasources: DataSource[] = [];\n private generators: Generator[] = [];\n private models: Model[] = [];\n private enums: Enum[] = [];\n\n addDataSource(name: string, provider: string, url: DataSourceUrl, shadowDatabaseUrl?: DataSourceUrl): DataSource {\n const ds = new DataSource(name, provider, url, shadowDatabaseUrl);\n this.datasources.push(ds);\n return ds;\n }\n\n addGenerator(name: string, fields: Array<{ name: string; value: string | string[] }>): Generator {\n const generator = new Generator(name, fields);\n this.generators.push(generator);\n return generator;\n }\n\n addModel(name: string): Model {\n const model = new Model(name);\n this.models.push(model);\n return model;\n }\n\n addEnum(name: string, fields: string[]): Enum {\n const e = new Enum(name, fields);\n this.enums.push(e);\n return e;\n }\n\n toString(): string {\n return [...this.datasources, ...this.generators, ...this.enums, ...this.models]\n .map((d) => d.toString())\n .join('\\n\\n');\n }\n}\n\nexport class DataSource {\n constructor(\n public name: string,\n public provider: string,\n public url: DataSourceUrl,\n public shadowDatabaseUrl?: DataSourceUrl\n ) {}\n\n toString(): string {\n return (\n `datasource ${this.name} {\\n` +\n indentString(`provider=\"${this.provider}\"\\n`) +\n indentString(`url=${this.url}\\n`) +\n (this.shadowDatabaseUrl ? indentString(`shadowDatabaseurl=${this.shadowDatabaseUrl}\\n`) : '') +\n `}`\n );\n }\n}\n\nexport class DataSourceUrl {\n constructor(public value: string, public isEnv: boolean) {}\n\n toString(): string {\n return this.isEnv ? `env(\"${this.value}\")` : `\"${this.value}\"`;\n }\n}\n\nexport class Generator {\n constructor(public name: string, public fields: Array<{ name: string; value: string | string[] }>) {}\n\n toString(): string {\n return (\n `generator ${this.name} {\\n` +\n this.fields.map((f) => indentString(`${f.name} = ${JSON.stringify(f.value)}`)).join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class DeclarationBase {\n public documentations: string[] = [];\n\n addComment(name: string): string {\n this.documentations.push(name);\n return name;\n }\n\n toString(): string {\n return this.documentations.map((x) => `${x}\\n`).join('');\n }\n}\nexport class Model extends DeclarationBase {\n public fields: ModelField[] = [];\n public attributes: ModelAttribute[] = [];\n constructor(public name: string, public documentations: string[] = []) {\n super();\n }\n\n addField(\n name: string,\n type: ModelFieldType | string,\n attributes: FieldAttribute[] = [],\n documentations: string[] = []\n ): ModelField {\n const field = new ModelField(name, type, attributes, documentations);\n this.fields.push(field);\n return field;\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): ModelAttribute {\n const attr = new ModelAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n super.toString() +\n `model ${this.name} {\\n` +\n indentString([...this.fields, ...this.attributes].map((d) => d.toString()).join('\\n')) +\n `\\n}`\n );\n }\n}\n\nexport type ScalarTypes =\n | 'String'\n | 'Boolean'\n | 'Int'\n | 'BigInt'\n | 'Float'\n | 'Decimal'\n | 'DateTime'\n | 'Json'\n | 'Bytes'\n | 'Unsupported';\n\nexport class ModelFieldType {\n constructor(public type: ScalarTypes | string, public array?: boolean, public optional?: boolean) {}\n\n toString(): string {\n return `${this.type}${this.array ? '[]' : ''}${this.optional ? '?' : ''}`;\n }\n}\n\nexport class ModelField extends DeclarationBase {\n constructor(\n public name: string,\n public type: ModelFieldType | string,\n public attributes: FieldAttribute[] = [],\n public documentations: string[] = []\n ) {\n super();\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): FieldAttribute {\n const attr = new FieldAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n super.toString() +\n `${this.name} ${this.type}` +\n (this.attributes.length > 0 ? ' ' + this.attributes.map((a) => a.toString()).join(' ') : '')\n );\n }\n}\n\nexport class FieldAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class ModelAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class AttributeArg {\n constructor(public name: string | undefined, public value: AttributeArgValue) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value.toString();\n }\n}\n\nexport class AttributeArgValue {\n constructor(\n public type: 'String' | 'FieldReference' | 'Number' | 'Boolean' | 'Array' | 'FunctionCall',\n public value: string | number | boolean | FieldReference | FunctionCall | AttributeArgValue[]\n ) {\n switch (type) {\n case 'String':\n if (typeof value !== 'string') throw new Error('Value must be string');\n break;\n case 'Number':\n if (typeof value !== 'number') throw new Error('Value must be number');\n break;\n case 'Boolean':\n if (typeof value !== 'boolean') throw new Error('Value must be boolean');\n break;\n case 'Array':\n if (!Array.isArray(value)) throw new Error('Value must be array');\n break;\n case 'FieldReference':\n if (typeof value !== 'string' && !(value instanceof FieldReference))\n throw new Error('Value must be string or FieldReference');\n break;\n case 'FunctionCall':\n if (!(value instanceof FunctionCall)) throw new Error('Value must be FunctionCall');\n break;\n }\n }\n\n toString(): string {\n switch (this.type) {\n case 'String':\n return `\"${this.value}\"`;\n case 'Number':\n return this.value.toString();\n case 'FieldReference': {\n if (typeof this.value === 'string') {\n return this.value;\n } else {\n const fr = this.value as FieldReference;\n let r = fr.field;\n if (fr.args.length > 0) {\n r += '(' + fr.args.map((a) => a.toString()).join(',') + ')';\n }\n return r;\n }\n }\n case 'FunctionCall':\n return this.value.toString();\n case 'Boolean':\n return this.value ? 'true' : 'false';\n case 'Array':\n return '[' + (this.value as AttributeArgValue[]).map((v) => v.toString()).join(', ') + ']';\n default:\n throw new Error(`Unknown attribute value type ${this.type}`);\n }\n }\n}\n\nexport class FieldReference {\n constructor(public field: string, public args: FieldReferenceArg[] = []) {}\n}\n\nexport class FieldReferenceArg {\n constructor(public name: 'sort', public value: 'Asc' | 'Desc') {}\n\n toString(): string {\n return `${this.name}: ${this.value}`;\n }\n}\n\nexport class FunctionCall {\n constructor(public func: string, public args: FunctionCallArg[] = []) {}\n\n toString(): string {\n return `${this.func}` + '(' + this.args.map((a) => a.toString()).join(', ') + ')';\n }\n}\n\nexport class FunctionCallArg {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\n constructor(public name: string | undefined, public value: any) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value;\n }\n}\n\nexport class Enum {\n constructor(public name: string, public fields: EnumField[]) {}\n\n toString(): string {\n return `enum ${this.name} {\\n` + indentString(this.fields.join('\\n')) + '\\n}';\n }\n}\n\ntype EnumField = string;\n"],"mappings":"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"}
|
|
@@ -141,7 +141,10 @@ class PrismaSchemaGenerator {
|
|
|
141
141
|
for (const attr of decl.attributes.filter(attr => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {
|
|
142
142
|
this.generateModelAttribute(model, attr);
|
|
143
143
|
}
|
|
144
|
-
decl.attributes.filter(attr => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref)).forEach(attr => model.addComment(this.zModelGenerator.generateAttribute(attr)));
|
|
144
|
+
decl.attributes.filter(attr => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref)).forEach(attr => model.addComment('/// ' + this.zModelGenerator.generateAttribute(attr)));
|
|
145
|
+
|
|
146
|
+
// user defined comments pass-through
|
|
147
|
+
decl.comments.forEach(c => model.addComment(c));
|
|
145
148
|
}
|
|
146
149
|
isPrismaAttribute(attr) {
|
|
147
150
|
return !!attr.attributes.find(a => {
|
|
@@ -158,8 +161,11 @@ class PrismaSchemaGenerator {
|
|
|
158
161
|
const type = new _prismaBuilder.ModelFieldType(fieldType, field.type.array, field.type.optional);
|
|
159
162
|
const attributes = field.attributes.filter(attr => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref)).map(attr => this.makeFieldAttribute(attr));
|
|
160
163
|
const nonPrismaAttributes = field.attributes.filter(attr => !attr.decl.ref || !this.isPrismaAttribute(attr.decl.ref));
|
|
161
|
-
const documentations = nonPrismaAttributes.map(attr => this.zModelGenerator.generateAttribute(attr));
|
|
162
|
-
model.addField(field.name, type, attributes, documentations);
|
|
164
|
+
const documentations = nonPrismaAttributes.map(attr => '/// ' + this.zModelGenerator.generateAttribute(attr));
|
|
165
|
+
const result = model.addField(field.name, type, attributes, documentations);
|
|
166
|
+
|
|
167
|
+
// user defined comments pass-through
|
|
168
|
+
field.comments.forEach(c => result.addComment(c));
|
|
163
169
|
}
|
|
164
170
|
makeFieldAttribute(attr) {
|
|
165
171
|
return new _prismaBuilder.FieldAttribute((0, _sdk.resolved)(attr.decl).name, attr.args.map(arg => this.makeAttributeArg(arg)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-generator.js","names":["PrismaSchemaGenerator","zModelGenerator","ZModelCodeGenerator","PRELUDE","generate","model","options","prisma","PrismaModel","decl","declarations","$type","DataSource","generateDataSource","Enum","generateEnum","DataModel","generateModel","GeneratorDecl","generateGenerator","outFile","output","fs","existsSync","path","dirname","mkdirSync","recursive","writeFile","toString","execSync","dataSource","provider","undefined","url","shadowDatabaseUrl","f","fields","name","isStringLiteral","value","PluginError","r","extractDataSourceUrl","addDataSource","fieldValue","PrismaDataSourceUrl","isInvocationExpr","function","ref","args","length","addGenerator","map","isArrayExpr","getLiteralArray","getLiteral","addModel","field","generateModelField","allowAll","denyAll","hasFieldValidation","analyzePolicies","addField","GUARD_FIELD_NAME","PrismaFieldAttribute","PrismaAttributeArg","PrismaAttributeArgValue","TRANSACTION_FIELD_NAME","addAttribute","attr","attributes","filter","isPrismaAttribute","generateModelAttribute","forEach","addComment","generateAttribute","find","a","fieldType","type","reference","$container","ModelFieldType","array","optional","makeFieldAttribute","nonPrismaAttributes","documentations","resolved","arg","makeAttributeArg","makeAttributeArgValue","node","isLiteralExpr","Array","items","item","isReferenceExpr","PrismaFieldReference","target","PrismaFieldReferenceArg","makeFunctionCall","PrismaFunctionCall","PrismaFunctionCallArg","push","PrismaModelAttribute","addEnum"],"sources":["../../../src/plugins/prisma/schema-generator.ts"],"sourcesContent":["import {\n AstNode,\n Attribute,\n AttributeArg,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n DataSource,\n Enum,\n Expression,\n GeneratorDecl,\n InvocationExpr,\n LiteralExpr,\n Model,\n isArrayExpr,\n isInvocationExpr,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport {\n GUARD_FIELD_NAME,\n PluginError,\n PluginOptions,\n TRANSACTION_FIELD_NAME,\n getLiteral,\n getLiteralArray,\n resolved,\n} from '@zenstackhq/sdk';\nimport fs from 'fs';\nimport { writeFile } from 'fs/promises';\nimport path from 'path';\nimport { analyzePolicies } from '../../utils/ast-utils';\nimport { execSync } from '../../utils/exec-utils';\nimport ZModelCodeGenerator from './zmodel-code-generator';\nimport {\n ModelFieldType,\n AttributeArg as PrismaAttributeArg,\n AttributeArgValue as PrismaAttributeArgValue,\n Model as PrismaDataModel,\n DataSourceUrl as PrismaDataSourceUrl,\n FieldAttribute as PrismaFieldAttribute,\n FieldReference as PrismaFieldReference,\n FieldReferenceArg as PrismaFieldReferenceArg,\n FunctionCall as PrismaFunctionCall,\n FunctionCallArg as PrismaFunctionCallArg,\n PrismaModel,\n ModelAttribute as PrismaModelAttribute,\n} from './prisma-builder';\n\n/**\n * Generates Prisma schema file\n */\nexport default class PrismaSchemaGenerator {\n private zModelGenerator: ZModelCodeGenerator = new ZModelCodeGenerator();\n\n private readonly PRELUDE = `//////////////////////////////////////////////////////////////////////////////////////////////\n// DO NOT MODIFY THIS FILE //\n// This file is automatically generated by ZenStack CLI and should not be manually updated. //\n//////////////////////////////////////////////////////////////////////////////////////////////\n\n`;\n\n async generate(model: Model, options: PluginOptions) {\n const prisma = new PrismaModel();\n\n for (const decl of model.declarations) {\n switch (decl.$type) {\n case DataSource:\n this.generateDataSource(prisma, decl as DataSource);\n break;\n\n case Enum:\n this.generateEnum(prisma, decl as Enum);\n break;\n\n case DataModel:\n this.generateModel(prisma, decl as DataModel);\n break;\n\n case GeneratorDecl:\n this.generateGenerator(prisma, decl as GeneratorDecl);\n break;\n }\n }\n\n const outFile = (options.output as string) ?? './prisma/schema.prisma';\n if (!fs.existsSync(path.dirname(outFile))) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true });\n }\n await writeFile(outFile, this.PRELUDE + prisma.toString());\n\n // run 'prisma generate'\n await execSync(`npx prisma generate --schema ${outFile}`);\n }\n\n private generateDataSource(prisma: PrismaModel, dataSource: DataSource) {\n let provider: string | undefined = undefined;\n let url: PrismaDataSourceUrl | undefined = undefined;\n let shadowDatabaseUrl: PrismaDataSourceUrl | undefined = undefined;\n\n for (const f of dataSource.fields) {\n switch (f.name) {\n case 'provider': {\n if (this.isStringLiteral(f.value)) {\n provider = f.value.value as string;\n } else {\n throw new PluginError('Datasource provider must be set to a string');\n }\n break;\n }\n\n case 'url': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n url = r;\n break;\n }\n\n case 'shadowDatabaseUrl': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n shadowDatabaseUrl = r;\n break;\n }\n }\n }\n\n if (!provider) {\n throw new PluginError('Datasource is missing \"provider\" field');\n }\n if (!url) {\n throw new PluginError('Datasource is missing \"url\" field');\n }\n\n prisma.addDataSource(dataSource.name, provider, url, shadowDatabaseUrl);\n }\n\n private extractDataSourceUrl(fieldValue: LiteralExpr | InvocationExpr) {\n if (this.isStringLiteral(fieldValue)) {\n return new PrismaDataSourceUrl(fieldValue.value as string, false);\n } else if (\n isInvocationExpr(fieldValue) &&\n fieldValue.function.ref?.name === 'env' &&\n fieldValue.args.length === 1 &&\n this.isStringLiteral(fieldValue.args[0].value)\n ) {\n return new PrismaDataSourceUrl(fieldValue.args[0].value.value as string, true);\n } else {\n return null;\n }\n }\n\n private generateGenerator(prisma: PrismaModel, decl: GeneratorDecl) {\n prisma.addGenerator(\n decl.name,\n decl.fields.map((f) => {\n const value = isArrayExpr(f.value) ? getLiteralArray(f.value) : getLiteral(f.value);\n return { name: f.name, value };\n })\n );\n }\n\n private generateModel(prisma: PrismaModel, decl: DataModel) {\n const model = prisma.addModel(decl.name);\n for (const field of decl.fields) {\n this.generateModelField(model, field);\n }\n\n const { allowAll, denyAll, hasFieldValidation } = analyzePolicies(decl);\n\n if ((!allowAll && !denyAll) || hasFieldValidation) {\n // generate auxiliary fields for policy check\n\n // add an \"zenstack_guard\" field for dealing with pure auth() related conditions\n model.addField(GUARD_FIELD_NAME, 'Boolean', [\n new PrismaFieldAttribute('@default', [\n new PrismaAttributeArg(undefined, new PrismaAttributeArgValue('Boolean', true)),\n ]),\n ]);\n\n // add an \"zenstack_transaction\" field for tracking records created/updated with nested writes\n model.addField(TRANSACTION_FIELD_NAME, 'String?');\n\n // create an index for \"zenstack_transaction\" field\n model.addAttribute('@@index', [\n new PrismaAttributeArg(\n undefined,\n new PrismaAttributeArgValue('Array', [\n new PrismaAttributeArgValue('FieldReference', TRANSACTION_FIELD_NAME),\n ])\n ),\n ]);\n }\n\n for (const attr of decl.attributes.filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {\n this.generateModelAttribute(model, attr);\n }\n\n decl.attributes\n .filter((attr) => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref))\n .forEach((attr) => model.addComment(this.zModelGenerator.generateAttribute(attr)));\n }\n\n private isPrismaAttribute(attr: Attribute) {\n return !!attr.attributes.find((a) => a.decl.ref?.name === '@@@prisma');\n }\n\n private generateModelField(model: PrismaDataModel, field: DataModelField) {\n const fieldType = field.type.type || field.type.reference?.ref?.name;\n if (!fieldType) {\n throw new PluginError(`Field type is not resolved: ${field.$container.name}.${field.name}`);\n }\n\n const type = new ModelFieldType(fieldType, field.type.array, field.type.optional);\n\n const attributes = field.attributes\n .filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))\n .map((attr) => this.makeFieldAttribute(attr));\n\n const nonPrismaAttributes = field.attributes.filter(\n (attr) => !attr.decl.ref || !this.isPrismaAttribute(attr.decl.ref)\n );\n\n const documentations = nonPrismaAttributes.map((attr) => this.zModelGenerator.generateAttribute(attr));\n\n model.addField(field.name, type, attributes, documentations);\n }\n\n private makeFieldAttribute(attr: DataModelFieldAttribute) {\n return new PrismaFieldAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n );\n }\n\n private makeAttributeArg(arg: AttributeArg): PrismaAttributeArg {\n return new PrismaAttributeArg(arg.name, this.makeAttributeArgValue(arg.value));\n }\n\n private makeAttributeArgValue(node: Expression): PrismaAttributeArgValue {\n if (isLiteralExpr(node)) {\n switch (typeof node.value) {\n case 'string':\n return new PrismaAttributeArgValue('String', node.value);\n case 'number':\n return new PrismaAttributeArgValue('Number', node.value);\n case 'boolean':\n return new PrismaAttributeArgValue('Boolean', node.value);\n default:\n throw new PluginError(`Unexpected literal type: ${typeof node.value}`);\n }\n } else if (isArrayExpr(node)) {\n return new PrismaAttributeArgValue(\n 'Array',\n new Array(...node.items.map((item) => this.makeAttributeArgValue(item)))\n );\n } else if (isReferenceExpr(node)) {\n return new PrismaAttributeArgValue(\n 'FieldReference',\n new PrismaFieldReference(\n resolved(node.target).name,\n node.args.map((arg) => new PrismaFieldReferenceArg(arg.name, arg.value))\n )\n );\n } else if (isInvocationExpr(node)) {\n // invocation\n return new PrismaAttributeArgValue('FunctionCall', this.makeFunctionCall(node));\n } else {\n throw new PluginError(`Unsupported attribute argument expression type: ${node.$type}`);\n }\n }\n\n makeFunctionCall(node: InvocationExpr): PrismaFunctionCall {\n return new PrismaFunctionCall(\n resolved(node.function).name,\n node.args.map((arg) => {\n if (!isLiteralExpr(arg.value)) {\n throw new PluginError('Function call argument must be literal');\n }\n return new PrismaFunctionCallArg(arg.name, arg.value.value);\n })\n );\n }\n\n private generateModelAttribute(model: PrismaDataModel, attr: DataModelAttribute) {\n model.attributes.push(\n new PrismaModelAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n )\n );\n }\n\n private generateEnum(prisma: PrismaModel, decl: Enum) {\n prisma.addEnum(\n decl.name,\n decl.fields.map((f) => f.name)\n );\n }\n\n private isStringLiteral(node: AstNode): node is LiteralExpr {\n return isLiteralExpr(node) && typeof node.value === 'string';\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema-generator.js","names":["PrismaSchemaGenerator","zModelGenerator","ZModelCodeGenerator","PRELUDE","generate","model","options","prisma","PrismaModel","decl","declarations","$type","DataSource","generateDataSource","Enum","generateEnum","DataModel","generateModel","GeneratorDecl","generateGenerator","outFile","output","fs","existsSync","path","dirname","mkdirSync","recursive","writeFile","toString","execSync","dataSource","provider","undefined","url","shadowDatabaseUrl","f","fields","name","isStringLiteral","value","PluginError","r","extractDataSourceUrl","addDataSource","fieldValue","PrismaDataSourceUrl","isInvocationExpr","function","ref","args","length","addGenerator","map","isArrayExpr","getLiteralArray","getLiteral","addModel","field","generateModelField","allowAll","denyAll","hasFieldValidation","analyzePolicies","addField","GUARD_FIELD_NAME","PrismaFieldAttribute","PrismaAttributeArg","PrismaAttributeArgValue","TRANSACTION_FIELD_NAME","addAttribute","attr","attributes","filter","isPrismaAttribute","generateModelAttribute","forEach","addComment","generateAttribute","comments","c","find","a","fieldType","type","reference","$container","ModelFieldType","array","optional","makeFieldAttribute","nonPrismaAttributes","documentations","result","resolved","arg","makeAttributeArg","makeAttributeArgValue","node","isLiteralExpr","Array","items","item","isReferenceExpr","PrismaFieldReference","target","PrismaFieldReferenceArg","makeFunctionCall","PrismaFunctionCall","PrismaFunctionCallArg","push","PrismaModelAttribute","addEnum"],"sources":["../../../src/plugins/prisma/schema-generator.ts"],"sourcesContent":["import {\n AstNode,\n Attribute,\n AttributeArg,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n DataSource,\n Enum,\n Expression,\n GeneratorDecl,\n InvocationExpr,\n LiteralExpr,\n Model,\n isArrayExpr,\n isInvocationExpr,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport {\n GUARD_FIELD_NAME,\n PluginError,\n PluginOptions,\n TRANSACTION_FIELD_NAME,\n getLiteral,\n getLiteralArray,\n resolved,\n} from '@zenstackhq/sdk';\nimport fs from 'fs';\nimport { writeFile } from 'fs/promises';\nimport path from 'path';\nimport { analyzePolicies } from '../../utils/ast-utils';\nimport { execSync } from '../../utils/exec-utils';\nimport ZModelCodeGenerator from './zmodel-code-generator';\nimport {\n ModelFieldType,\n AttributeArg as PrismaAttributeArg,\n AttributeArgValue as PrismaAttributeArgValue,\n Model as PrismaDataModel,\n DataSourceUrl as PrismaDataSourceUrl,\n FieldAttribute as PrismaFieldAttribute,\n FieldReference as PrismaFieldReference,\n FieldReferenceArg as PrismaFieldReferenceArg,\n FunctionCall as PrismaFunctionCall,\n FunctionCallArg as PrismaFunctionCallArg,\n PrismaModel,\n ModelAttribute as PrismaModelAttribute,\n} from './prisma-builder';\n\n/**\n * Generates Prisma schema file\n */\nexport default class PrismaSchemaGenerator {\n private zModelGenerator: ZModelCodeGenerator = new ZModelCodeGenerator();\n\n private readonly PRELUDE = `//////////////////////////////////////////////////////////////////////////////////////////////\n// DO NOT MODIFY THIS FILE //\n// This file is automatically generated by ZenStack CLI and should not be manually updated. //\n//////////////////////////////////////////////////////////////////////////////////////////////\n\n`;\n\n async generate(model: Model, options: PluginOptions) {\n const prisma = new PrismaModel();\n\n for (const decl of model.declarations) {\n switch (decl.$type) {\n case DataSource:\n this.generateDataSource(prisma, decl as DataSource);\n break;\n\n case Enum:\n this.generateEnum(prisma, decl as Enum);\n break;\n\n case DataModel:\n this.generateModel(prisma, decl as DataModel);\n break;\n\n case GeneratorDecl:\n this.generateGenerator(prisma, decl as GeneratorDecl);\n break;\n }\n }\n\n const outFile = (options.output as string) ?? './prisma/schema.prisma';\n if (!fs.existsSync(path.dirname(outFile))) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true });\n }\n await writeFile(outFile, this.PRELUDE + prisma.toString());\n\n // run 'prisma generate'\n await execSync(`npx prisma generate --schema ${outFile}`);\n }\n\n private generateDataSource(prisma: PrismaModel, dataSource: DataSource) {\n let provider: string | undefined = undefined;\n let url: PrismaDataSourceUrl | undefined = undefined;\n let shadowDatabaseUrl: PrismaDataSourceUrl | undefined = undefined;\n\n for (const f of dataSource.fields) {\n switch (f.name) {\n case 'provider': {\n if (this.isStringLiteral(f.value)) {\n provider = f.value.value as string;\n } else {\n throw new PluginError('Datasource provider must be set to a string');\n }\n break;\n }\n\n case 'url': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n url = r;\n break;\n }\n\n case 'shadowDatabaseUrl': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n shadowDatabaseUrl = r;\n break;\n }\n }\n }\n\n if (!provider) {\n throw new PluginError('Datasource is missing \"provider\" field');\n }\n if (!url) {\n throw new PluginError('Datasource is missing \"url\" field');\n }\n\n prisma.addDataSource(dataSource.name, provider, url, shadowDatabaseUrl);\n }\n\n private extractDataSourceUrl(fieldValue: LiteralExpr | InvocationExpr) {\n if (this.isStringLiteral(fieldValue)) {\n return new PrismaDataSourceUrl(fieldValue.value as string, false);\n } else if (\n isInvocationExpr(fieldValue) &&\n fieldValue.function.ref?.name === 'env' &&\n fieldValue.args.length === 1 &&\n this.isStringLiteral(fieldValue.args[0].value)\n ) {\n return new PrismaDataSourceUrl(fieldValue.args[0].value.value as string, true);\n } else {\n return null;\n }\n }\n\n private generateGenerator(prisma: PrismaModel, decl: GeneratorDecl) {\n prisma.addGenerator(\n decl.name,\n decl.fields.map((f) => {\n const value = isArrayExpr(f.value) ? getLiteralArray(f.value) : getLiteral(f.value);\n return { name: f.name, value };\n })\n );\n }\n\n private generateModel(prisma: PrismaModel, decl: DataModel) {\n const model = prisma.addModel(decl.name);\n for (const field of decl.fields) {\n this.generateModelField(model, field);\n }\n\n const { allowAll, denyAll, hasFieldValidation } = analyzePolicies(decl);\n\n if ((!allowAll && !denyAll) || hasFieldValidation) {\n // generate auxiliary fields for policy check\n\n // add an \"zenstack_guard\" field for dealing with pure auth() related conditions\n model.addField(GUARD_FIELD_NAME, 'Boolean', [\n new PrismaFieldAttribute('@default', [\n new PrismaAttributeArg(undefined, new PrismaAttributeArgValue('Boolean', true)),\n ]),\n ]);\n\n // add an \"zenstack_transaction\" field for tracking records created/updated with nested writes\n model.addField(TRANSACTION_FIELD_NAME, 'String?');\n\n // create an index for \"zenstack_transaction\" field\n model.addAttribute('@@index', [\n new PrismaAttributeArg(\n undefined,\n new PrismaAttributeArgValue('Array', [\n new PrismaAttributeArgValue('FieldReference', TRANSACTION_FIELD_NAME),\n ])\n ),\n ]);\n }\n\n for (const attr of decl.attributes.filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {\n this.generateModelAttribute(model, attr);\n }\n\n decl.attributes\n .filter((attr) => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref))\n .forEach((attr) => model.addComment('/// ' + this.zModelGenerator.generateAttribute(attr)));\n\n // user defined comments pass-through\n decl.comments.forEach((c) => model.addComment(c));\n }\n\n private isPrismaAttribute(attr: Attribute) {\n return !!attr.attributes.find((a) => a.decl.ref?.name === '@@@prisma');\n }\n\n private generateModelField(model: PrismaDataModel, field: DataModelField) {\n const fieldType = field.type.type || field.type.reference?.ref?.name;\n if (!fieldType) {\n throw new PluginError(`Field type is not resolved: ${field.$container.name}.${field.name}`);\n }\n\n const type = new ModelFieldType(fieldType, field.type.array, field.type.optional);\n\n const attributes = field.attributes\n .filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))\n .map((attr) => this.makeFieldAttribute(attr));\n\n const nonPrismaAttributes = field.attributes.filter(\n (attr) => !attr.decl.ref || !this.isPrismaAttribute(attr.decl.ref)\n );\n\n const documentations = nonPrismaAttributes.map((attr) => '/// ' + this.zModelGenerator.generateAttribute(attr));\n\n const result = model.addField(field.name, type, attributes, documentations);\n\n // user defined comments pass-through\n field.comments.forEach((c) => result.addComment(c));\n }\n\n private makeFieldAttribute(attr: DataModelFieldAttribute) {\n return new PrismaFieldAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n );\n }\n\n private makeAttributeArg(arg: AttributeArg): PrismaAttributeArg {\n return new PrismaAttributeArg(arg.name, this.makeAttributeArgValue(arg.value));\n }\n\n private makeAttributeArgValue(node: Expression): PrismaAttributeArgValue {\n if (isLiteralExpr(node)) {\n switch (typeof node.value) {\n case 'string':\n return new PrismaAttributeArgValue('String', node.value);\n case 'number':\n return new PrismaAttributeArgValue('Number', node.value);\n case 'boolean':\n return new PrismaAttributeArgValue('Boolean', node.value);\n default:\n throw new PluginError(`Unexpected literal type: ${typeof node.value}`);\n }\n } else if (isArrayExpr(node)) {\n return new PrismaAttributeArgValue(\n 'Array',\n new Array(...node.items.map((item) => this.makeAttributeArgValue(item)))\n );\n } else if (isReferenceExpr(node)) {\n return new PrismaAttributeArgValue(\n 'FieldReference',\n new PrismaFieldReference(\n resolved(node.target).name,\n node.args.map((arg) => new PrismaFieldReferenceArg(arg.name, arg.value))\n )\n );\n } else if (isInvocationExpr(node)) {\n // invocation\n return new PrismaAttributeArgValue('FunctionCall', this.makeFunctionCall(node));\n } else {\n throw new PluginError(`Unsupported attribute argument expression type: ${node.$type}`);\n }\n }\n\n makeFunctionCall(node: InvocationExpr): PrismaFunctionCall {\n return new PrismaFunctionCall(\n resolved(node.function).name,\n node.args.map((arg) => {\n if (!isLiteralExpr(arg.value)) {\n throw new PluginError('Function call argument must be literal');\n }\n return new PrismaFunctionCallArg(arg.name, arg.value.value);\n })\n );\n }\n\n private generateModelAttribute(model: PrismaDataModel, attr: DataModelAttribute) {\n model.attributes.push(\n new PrismaModelAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n )\n );\n }\n\n private generateEnum(prisma: PrismaModel, decl: Enum) {\n prisma.addEnum(\n decl.name,\n decl.fields.map((f) => f.name)\n );\n }\n\n private isStringLiteral(node: AstNode): node is LiteralExpr {\n return isLiteralExpr(node) && typeof node.value === 'string';\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Argument, AttributeArg, BinaryExpr, DataModelAttribute, DataModelFieldAttribute, Expression, InvocationExpr, LiteralExpr, MemberAccessExpr, ReferenceArg, ReferenceExpr, UnaryExpr } from '@zenstackhq/language/ast';
|
|
1
|
+
import { Argument, ArrayExpr, AttributeArg, BinaryExpr, DataModelAttribute, DataModelFieldAttribute, Expression, InvocationExpr, LiteralExpr, MemberAccessExpr, ReferenceArg, ReferenceExpr, UnaryExpr } from '@zenstackhq/language/ast';
|
|
2
2
|
/**
|
|
3
3
|
* Options for the generator.
|
|
4
4
|
*/
|
|
@@ -12,6 +12,7 @@ export default class ZModelCodeGenerator {
|
|
|
12
12
|
generateAttribute(ast: DataModelAttribute | DataModelFieldAttribute): string;
|
|
13
13
|
generateAttributeArg(ast: AttributeArg): string;
|
|
14
14
|
generateExpression(ast: Expression): string;
|
|
15
|
+
generateArrayExpr(ast: ArrayExpr): string;
|
|
15
16
|
generateLiteralExpr(ast: LiteralExpr): string;
|
|
16
17
|
generateUnaryExpr(ast: UnaryExpr): string;
|
|
17
18
|
generateBinaryExpr(ast: BinaryExpr): string;
|
|
@@ -18,7 +18,11 @@ class ZModelCodeGenerator {
|
|
|
18
18
|
return `${(0, _sdk.resolved)(ast.decl).name}${args}`;
|
|
19
19
|
}
|
|
20
20
|
generateAttributeArg(ast) {
|
|
21
|
-
|
|
21
|
+
if (ast.name) {
|
|
22
|
+
return `${ast.name}: ${this.generateExpression(ast.value)}`;
|
|
23
|
+
} else {
|
|
24
|
+
return this.generateExpression(ast.value);
|
|
25
|
+
}
|
|
22
26
|
}
|
|
23
27
|
generateExpression(ast) {
|
|
24
28
|
switch (ast.$type) {
|
|
@@ -26,6 +30,8 @@ class ZModelCodeGenerator {
|
|
|
26
30
|
return this.generateLiteralExpr(ast);
|
|
27
31
|
case _ast.UnaryExpr:
|
|
28
32
|
return this.generateUnaryExpr(ast);
|
|
33
|
+
case _ast.ArrayExpr:
|
|
34
|
+
return this.generateArrayExpr(ast);
|
|
29
35
|
case _ast.BinaryExpr:
|
|
30
36
|
return this.generateBinaryExpr(ast);
|
|
31
37
|
case _ast.ReferenceExpr:
|
|
@@ -38,9 +44,12 @@ class ZModelCodeGenerator {
|
|
|
38
44
|
case _ast.ThisExpr:
|
|
39
45
|
return ast.value;
|
|
40
46
|
default:
|
|
41
|
-
throw new Error(`Not implemented: ${ast
|
|
47
|
+
throw new Error(`Not implemented: ${ast}`);
|
|
42
48
|
}
|
|
43
49
|
}
|
|
50
|
+
generateArrayExpr(ast) {
|
|
51
|
+
return `[${ast.items.map(item => this.generateExpression(item)).join(', ')}]`;
|
|
52
|
+
}
|
|
44
53
|
generateLiteralExpr(ast) {
|
|
45
54
|
return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value.toString();
|
|
46
55
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zmodel-code-generator.js","names":["ZModelCodeGenerator","constructor","options","binaryExprNumberOfSpaces","unaryExprNumberOfSpaces","generateAttribute","ast","args","length","map","x","generateAttributeArg","join","resolved","decl","name","generateExpression","value","$type","LiteralExpr","generateLiteralExpr","UnaryExpr","generateUnaryExpr","BinaryExpr","generateBinaryExpr","ReferenceExpr","generateReferenceExpr","MemberAccessExpr","generateMemberExpr","InvocationExpr","generateInvocationExpr","NullExpr","ThisExpr","Error","toString","operator","unaryExprSpace","operand","isCollectionPredicate","isCollectionPredicateOperator","rightExpr","right","left","isLeftParenthesis","isRightParenthesis","isParenthesesNeededForBinaryExpr","binaryExprSpace","generateReferenceArg","target","ref","member","function","generateArgument","repeat","result","currentPriority","BinaryExprOperatorPriority","op","includes"],"sources":["../../../src/plugins/prisma/zmodel-code-generator.ts"],"sourcesContent":["import {\n Argument,\n AttributeArg,\n BinaryExpr,\n DataModelAttribute,\n DataModelFieldAttribute,\n Expression,\n InvocationExpr,\n LiteralExpr,\n MemberAccessExpr,\n NullExpr,\n ReferenceArg,\n ReferenceExpr,\n ThisExpr,\n UnaryExpr,\n BinaryExprOperatorPriority,\n} from '@zenstackhq/language/ast';\nimport { resolved } from '@zenstackhq/sdk';\n\n/**\n * Options for the generator.\n */\nexport interface ZModelCodeOptions {\n binaryExprNumberOfSpaces: number;\n unaryExprNumberOfSpaces: number;\n}\n\nexport default class ZModelCodeGenerator {\n private readonly options: ZModelCodeOptions;\n constructor(options?: Partial<ZModelCodeOptions>) {\n this.options = {\n binaryExprNumberOfSpaces: options?.binaryExprNumberOfSpaces ?? 1,\n unaryExprNumberOfSpaces: options?.unaryExprNumberOfSpaces ?? 0,\n };\n }\n generateAttribute(ast: DataModelAttribute | DataModelFieldAttribute): string {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateAttributeArg(x)).join(', ')})` : '';\n return `${resolved(ast.decl).name}${args}`;\n }\n\n generateAttributeArg(ast: AttributeArg) {\n return this.generateExpression(ast.value);\n }\n\n generateExpression(ast: Expression): string {\n switch (ast.$type) {\n case LiteralExpr:\n return this.generateLiteralExpr(ast as LiteralExpr);\n case UnaryExpr:\n return this.generateUnaryExpr(ast as UnaryExpr);\n case BinaryExpr:\n return this.generateBinaryExpr(ast as BinaryExpr);\n case ReferenceExpr:\n return this.generateReferenceExpr(ast as ReferenceExpr);\n case MemberAccessExpr:\n return this.generateMemberExpr(ast as MemberAccessExpr);\n case InvocationExpr:\n return this.generateInvocationExpr(ast as InvocationExpr);\n case NullExpr:\n case ThisExpr:\n return (ast as NullExpr | ThisExpr).value;\n default:\n throw new Error(`Not implemented: ${ast.$type}`);\n }\n }\n\n generateLiteralExpr(ast: LiteralExpr) {\n return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value.toString();\n }\n\n generateUnaryExpr(ast: UnaryExpr) {\n return `${ast.operator}${this.unaryExprSpace}${this.generateExpression(ast.operand)}`;\n }\n\n generateBinaryExpr(ast: BinaryExpr) {\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n const rightExpr = this.generateExpression(ast.right);\n\n const { left: isLeftParenthesis, right: isRightParenthesis } = this.isParenthesesNeededForBinaryExpr(ast);\n\n return `${isLeftParenthesis ? '(' : ''}${this.generateExpression(ast.left)}${isLeftParenthesis ? ')' : ''}${\n this.binaryExprSpace\n }${operator}${this.binaryExprSpace}${isRightParenthesis ? '(' : ''}${\n isCollectionPredicate ? `[${rightExpr}]` : rightExpr\n }${isRightParenthesis ? ')' : ''}`;\n }\n\n generateReferenceExpr(ast: ReferenceExpr) {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateReferenceArg(x)).join(', ')})` : '';\n return `${ast.target.ref?.name}${args}`;\n }\n\n generateReferenceArg(ast: ReferenceArg) {\n return `${ast.name}:${ast.value}`;\n }\n\n generateMemberExpr(ast: MemberAccessExpr) {\n return `${this.generateExpression(ast.operand)}.${ast.member.ref?.name}`;\n }\n\n generateInvocationExpr(ast: InvocationExpr) {\n return `${ast.function.ref?.name}(${ast.args.map((x) => this.generateArgument(x)).join(', ')})`;\n }\n\n generateArgument(ast: Argument) {\n return `${ast.name && ':'} ${this.generateExpression(ast.value)}`;\n }\n\n private get binaryExprSpace(): string {\n return ' '.repeat(this.options.binaryExprNumberOfSpaces);\n }\n\n private get unaryExprSpace(): string {\n return ' '.repeat(this.options.unaryExprNumberOfSpaces);\n }\n\n private isParenthesesNeededForBinaryExpr(ast: BinaryExpr): { left: boolean; right: boolean } {\n const result = { left: false, right: false };\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n\n const currentPriority = BinaryExprOperatorPriority[operator];\n\n if (\n ast.left.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.left as BinaryExpr)['operator']] < currentPriority\n ) {\n result.left = true;\n }\n /**\n * 1 collection predicate operator has [] around the right operand, no need to add parenthesis.\n * 2 grammar is left associative, so if the right operand has the same priority still need to add parenthesis.\n **/\n if (\n !isCollectionPredicate &&\n ast.right.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.right as BinaryExpr)['operator']] <= currentPriority\n ) {\n result.right = true;\n }\n\n return result;\n }\n\n private isCollectionPredicateOperator(op: BinaryExpr['operator']) {\n return ['?', '!', '^'].includes(op);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"zmodel-code-generator.js","names":["ZModelCodeGenerator","constructor","options","binaryExprNumberOfSpaces","unaryExprNumberOfSpaces","generateAttribute","ast","args","length","map","x","generateAttributeArg","join","resolved","decl","name","generateExpression","value","$type","LiteralExpr","generateLiteralExpr","UnaryExpr","generateUnaryExpr","ArrayExpr","generateArrayExpr","BinaryExpr","generateBinaryExpr","ReferenceExpr","generateReferenceExpr","MemberAccessExpr","generateMemberExpr","InvocationExpr","generateInvocationExpr","NullExpr","ThisExpr","Error","items","item","toString","operator","unaryExprSpace","operand","isCollectionPredicate","isCollectionPredicateOperator","rightExpr","right","left","isLeftParenthesis","isRightParenthesis","isParenthesesNeededForBinaryExpr","binaryExprSpace","generateReferenceArg","target","ref","member","function","generateArgument","repeat","result","currentPriority","BinaryExprOperatorPriority","op","includes"],"sources":["../../../src/plugins/prisma/zmodel-code-generator.ts"],"sourcesContent":["import {\n Argument,\n ArrayExpr,\n AttributeArg,\n BinaryExpr,\n BinaryExprOperatorPriority,\n DataModelAttribute,\n DataModelFieldAttribute,\n Expression,\n InvocationExpr,\n LiteralExpr,\n MemberAccessExpr,\n NullExpr,\n ReferenceArg,\n ReferenceExpr,\n ThisExpr,\n UnaryExpr,\n} from '@zenstackhq/language/ast';\nimport { resolved } from '@zenstackhq/sdk';\n\n/**\n * Options for the generator.\n */\nexport interface ZModelCodeOptions {\n binaryExprNumberOfSpaces: number;\n unaryExprNumberOfSpaces: number;\n}\n\nexport default class ZModelCodeGenerator {\n private readonly options: ZModelCodeOptions;\n constructor(options?: Partial<ZModelCodeOptions>) {\n this.options = {\n binaryExprNumberOfSpaces: options?.binaryExprNumberOfSpaces ?? 1,\n unaryExprNumberOfSpaces: options?.unaryExprNumberOfSpaces ?? 0,\n };\n }\n generateAttribute(ast: DataModelAttribute | DataModelFieldAttribute): string {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateAttributeArg(x)).join(', ')})` : '';\n return `${resolved(ast.decl).name}${args}`;\n }\n\n generateAttributeArg(ast: AttributeArg) {\n if (ast.name) {\n return `${ast.name}: ${this.generateExpression(ast.value)}`;\n } else {\n return this.generateExpression(ast.value);\n }\n }\n\n generateExpression(ast: Expression): string {\n switch (ast.$type) {\n case LiteralExpr:\n return this.generateLiteralExpr(ast as LiteralExpr);\n case UnaryExpr:\n return this.generateUnaryExpr(ast as UnaryExpr);\n case ArrayExpr:\n return this.generateArrayExpr(ast as ArrayExpr);\n case BinaryExpr:\n return this.generateBinaryExpr(ast as BinaryExpr);\n case ReferenceExpr:\n return this.generateReferenceExpr(ast as ReferenceExpr);\n case MemberAccessExpr:\n return this.generateMemberExpr(ast as MemberAccessExpr);\n case InvocationExpr:\n return this.generateInvocationExpr(ast as InvocationExpr);\n case NullExpr:\n case ThisExpr:\n return (ast as NullExpr | ThisExpr).value;\n default:\n throw new Error(`Not implemented: ${ast}`);\n }\n }\n\n generateArrayExpr(ast: ArrayExpr) {\n return `[${ast.items.map((item) => this.generateExpression(item)).join(', ')}]`;\n }\n\n generateLiteralExpr(ast: LiteralExpr) {\n return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value.toString();\n }\n\n generateUnaryExpr(ast: UnaryExpr) {\n return `${ast.operator}${this.unaryExprSpace}${this.generateExpression(ast.operand)}`;\n }\n\n generateBinaryExpr(ast: BinaryExpr) {\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n const rightExpr = this.generateExpression(ast.right);\n\n const { left: isLeftParenthesis, right: isRightParenthesis } = this.isParenthesesNeededForBinaryExpr(ast);\n\n return `${isLeftParenthesis ? '(' : ''}${this.generateExpression(ast.left)}${isLeftParenthesis ? ')' : ''}${\n this.binaryExprSpace\n }${operator}${this.binaryExprSpace}${isRightParenthesis ? '(' : ''}${\n isCollectionPredicate ? `[${rightExpr}]` : rightExpr\n }${isRightParenthesis ? ')' : ''}`;\n }\n\n generateReferenceExpr(ast: ReferenceExpr) {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateReferenceArg(x)).join(', ')})` : '';\n return `${ast.target.ref?.name}${args}`;\n }\n\n generateReferenceArg(ast: ReferenceArg) {\n return `${ast.name}:${ast.value}`;\n }\n\n generateMemberExpr(ast: MemberAccessExpr) {\n return `${this.generateExpression(ast.operand)}.${ast.member.ref?.name}`;\n }\n\n generateInvocationExpr(ast: InvocationExpr) {\n return `${ast.function.ref?.name}(${ast.args.map((x) => this.generateArgument(x)).join(', ')})`;\n }\n\n generateArgument(ast: Argument) {\n return `${ast.name && ':'} ${this.generateExpression(ast.value)}`;\n }\n\n private get binaryExprSpace(): string {\n return ' '.repeat(this.options.binaryExprNumberOfSpaces);\n }\n\n private get unaryExprSpace(): string {\n return ' '.repeat(this.options.unaryExprNumberOfSpaces);\n }\n\n private isParenthesesNeededForBinaryExpr(ast: BinaryExpr): { left: boolean; right: boolean } {\n const result = { left: false, right: false };\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n\n const currentPriority = BinaryExprOperatorPriority[operator];\n\n if (\n ast.left.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.left as BinaryExpr)['operator']] < currentPriority\n ) {\n result.left = true;\n }\n /**\n * 1 collection predicate operator has [] around the right operand, no need to add parenthesis.\n * 2 grammar is left associative, so if the right operand has the same priority still need to add parenthesis.\n **/\n if (\n !isCollectionPredicate &&\n ast.right.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.right as BinaryExpr)['operator']] <= currentPriority\n ) {\n result.right = true;\n }\n\n return result;\n }\n\n private isCollectionPredicateOperator(op: BinaryExpr['operator']) {\n return ['?', '!', '^'].includes(op);\n }\n}\n"],"mappings":"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"}
|