zenstack 0.6.0-pre.17 → 0.6.0-pre.19
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/cli/cli-util.d.ts +1 -1
- package/cli/cli-util.js +32 -76
- package/cli/cli-util.js.map +1 -1
- package/cli/index.d.ts +4 -0
- package/cli/index.js +17 -18
- package/cli/index.js.map +1 -1
- package/package.json +4 -4
- package/plugins/prisma/prisma-builder.d.ts +12 -5
- package/plugins/prisma/prisma-builder.js +24 -9
- package/plugins/prisma/prisma-builder.js.map +1 -1
- package/plugins/prisma/schema-generator.d.ts +2 -0
- package/plugins/prisma/schema-generator.js +13 -2
- package/plugins/prisma/schema-generator.js.map +1 -1
- package/plugins/react-hooks/react-hooks-generator.js +4 -4
- package/plugins/react-hooks/react-hooks-generator.js.map +1 -1
- package/plugins/zmodel-code/zmodel-code-generator.d.ts +27 -0
- package/plugins/zmodel-code/zmodel-code-generator.js +110 -0
- package/plugins/zmodel-code/zmodel-code-generator.js.map +1 -0
- package/res/starter.zmodel +47 -0
- package/telemetry.js +5 -5
- package/telemetry.js.map +1 -1
- package/utils/exec-utils.d.ts +1 -1
- package/utils/exec-utils.js +7 -2
- package/utils/exec-utils.js.map +1 -1
- package/utils/pkg-utils.d.ts +1 -1
- package/utils/pkg-utils.js +4 -4
- package/utils/pkg-utils.js.map +1 -1
- package/utils/version-utils.d.ts +1 -0
- package/utils/version-utils.js +15 -0
- package/utils/version-utils.js.map +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-generator.js","names":["PrismaSchemaGenerator","generate","model","options","prisma","PrismaModel","decl","declarations","$type","DataSource","generateDataSource","Enum","generateEnum","DataModel","generateModel","Generator","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","find","a","fieldType","type","reference","$container","ModelFieldType","array","optional","makeFieldAttribute","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 Generator,\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 {\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 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 Generator:\n this.generateGenerator(prisma, decl as Generator);\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, 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: Generator) {\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\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 model.addField(field.name, type, attributes);\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","Generator","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 Generator,\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/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 Generator:\n this.generateGenerator(prisma, decl as Generator);\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: Generator) {\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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"}
|
|
@@ -50,9 +50,8 @@ function generateModelHooks(project, outDir, model) {
|
|
|
50
50
|
overwrite: true
|
|
51
51
|
});
|
|
52
52
|
sf.addImportDeclaration({
|
|
53
|
-
namedImports: [
|
|
54
|
-
|
|
55
|
-
}, `type ${model.name}`],
|
|
53
|
+
namedImports: ['Prisma', model.name],
|
|
54
|
+
isTypeOnly: true,
|
|
56
55
|
moduleSpecifier: '@prisma/client'
|
|
57
56
|
});
|
|
58
57
|
sf.addStatements([`import { useContext } from 'react';`, `import { RequestHandlerContext } from '@zenstackhq/next/client';`, `import { request, type RequestOptions } from '${_pluginUtils.RUNTIME_PACKAGE}/client';`]);
|
|
@@ -60,8 +59,9 @@ function generateModelHooks(project, outDir, model) {
|
|
|
60
59
|
name: `use${model.name}`,
|
|
61
60
|
isExported: true
|
|
62
61
|
});
|
|
63
|
-
|
|
62
|
+
const prefixesToMutate = ['find', 'aggregate', 'count', 'groupBy'];
|
|
64
63
|
const modelRouteName = (0, _changeCase.camelCase)(model.name);
|
|
64
|
+
useFunc.addStatements(['const { endpoint } = useContext(RequestHandlerContext);', `const prefixesToMutate = [${prefixesToMutate.map(prefix => '`${endpoint}/' + modelRouteName + '/' + prefix + '`').join(', ')}];`, 'const mutate = request.getMutate(prefixesToMutate);']);
|
|
65
65
|
|
|
66
66
|
// create
|
|
67
67
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-hooks-generator.js","names":["generate","model","options","project","Project","models","warnings","dm","declarations","filter","d","isDataModel","hasAllowRule","attributes","find","attr","decl","ref","name","push","outDir","output","generateIndex","forEach","generateModelHooks","save","wrapReadbackErrorCheck","code","fileName","paramCase","sf","createSourceFile","path","join","undefined","overwrite","addImportDeclaration","namedImports","moduleSpecifier","addStatements","RUNTIME_PACKAGE","useFunc","addFunction","isExported","modelRouteName","camelCase","argsType","inputType","returnType","isAsync","typeParameters","parameters","type","addBody","formatText","map"],"sources":["../../../src/plugins/react-hooks/react-hooks-generator.ts"],"sourcesContent":["import { DataModel, Model, isDataModel } from '@zenstackhq/language/ast';\nimport { PluginOptions } from '@zenstackhq/sdk';\nimport { camelCase, paramCase } from 'change-case';\nimport * as path from 'path';\nimport { Project } from 'ts-morph';\nimport { RUNTIME_PACKAGE } from '../plugin-utils';\n\nexport async function generate(model: Model, options: PluginOptions) {\n const project = new Project();\n const models: DataModel[] = [];\n const warnings: string[] = [];\n\n for (const dm of model.declarations.filter((d): d is DataModel => isDataModel(d))) {\n const hasAllowRule = dm.attributes.find((attr) => attr.decl.ref?.name === '@@allow');\n if (!hasAllowRule) {\n warnings.push(`Not generating hooks for \"${dm.name}\" because it doesn't have any @@allow rule`);\n } else {\n models.push(dm);\n }\n }\n\n const outDir = (options.output as string) ?? 'node_modules/.zenstack/src/hooks';\n\n generateIndex(project, outDir, models);\n\n models.forEach((d) => generateModelHooks(project, outDir, d));\n\n await project.save();\n return warnings;\n}\n\nfunction wrapReadbackErrorCheck(code: string) {\n return `try {\n ${code}\n } catch (err: any) {\n if (err.prisma && err.code === 'P2004') {\n // unable to readback data\n return undefined;\n } else {\n throw err;\n }\n }`;\n}\n\nfunction generateModelHooks(project: Project, outDir: string, model: DataModel) {\n const fileName = paramCase(model.name);\n const sf = project.createSourceFile(path.join(outDir, `${fileName}.ts`), undefined, { overwrite: true });\n\n sf.addImportDeclaration({\n namedImports: [{ name: 'Prisma' }, `type ${model.name}`],\n moduleSpecifier: '@prisma/client',\n });\n sf.addStatements([\n `import { useContext } from 'react';`,\n `import { RequestHandlerContext } from '@zenstackhq/next/client';`,\n `import { request, type RequestOptions } from '${RUNTIME_PACKAGE}/client';`,\n ]);\n\n const useFunc = sf.addFunction({\n name: `use${model.name}`,\n isExported: true,\n });\n\n useFunc.addStatements([\n 'const mutate = request.getMutate();',\n 'const { endpoint } = useContext(RequestHandlerContext);',\n ]);\n\n const modelRouteName = camelCase(model.name);\n\n // create\n {\n const argsType = `Prisma.${model.name}CreateArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.CheckSelect<T, ${model.name}, Prisma.${model.name}GetPayload<T>>`;\n useFunc\n .addFunction({\n name: 'create',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n wrapReadbackErrorCheck(\n `return await request.post<${inputType}, ${returnType}>(\\`\\${endpoint}/${modelRouteName}/create\\`, args, mutate);`\n ),\n ]);\n }\n\n // createMany\n {\n const argsType = `Prisma.${model.name}CreateManyArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.BatchPayload`;\n useFunc\n .addFunction({\n name: 'createMany',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return await request.post<${inputType}, ${returnType}>(\\`\\${endpoint}/${modelRouteName}/createMany\\`, args, mutate);`,\n ]);\n }\n\n // findMany\n {\n const argsType = `Prisma.${model.name}FindManyArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Array<Prisma.${model.name}GetPayload<T>>`;\n useFunc\n .addFunction({\n name: 'findMany',\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args?',\n type: inputType,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/findMany\\`, args, options);`,\n ]);\n }\n\n // findUnique\n {\n const argsType = `Prisma.${model.name}FindUniqueArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.${model.name}GetPayload<T>`;\n useFunc\n .addFunction({\n name: 'findUnique',\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/findUnique\\`, args, options);`,\n ]);\n }\n\n // findFirst\n {\n const argsType = `Prisma.${model.name}FindFirstArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.${model.name}GetPayload<T>`;\n useFunc\n .addFunction({\n name: 'findFirst',\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/findFirst\\`, args, options);`,\n ]);\n }\n\n // update\n {\n const argsType = `Prisma.${model.name}UpdateArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.${model.name}GetPayload<T>`;\n useFunc\n .addFunction({\n name: 'update',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n wrapReadbackErrorCheck(\n `return await request.put<${inputType}, ${returnType}>(\\`\\${endpoint}/${modelRouteName}/update\\`, args, mutate);`\n ),\n ]);\n }\n\n // updateMany\n {\n const argsType = `Prisma.${model.name}UpdateManyArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.BatchPayload`;\n useFunc\n .addFunction({\n name: 'updateMany',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return await request.put<${inputType}, ${returnType}>(\\`\\${endpoint}/${modelRouteName}/updateMany\\`, args, mutate);`,\n ]);\n }\n\n // upsert\n {\n const argsType = `Prisma.${model.name}UpsertArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.${model.name}GetPayload<T>`;\n useFunc\n .addFunction({\n name: 'upsert',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n wrapReadbackErrorCheck(\n `return await request.put<${inputType}, ${returnType}>(\\`\\${endpoint}/${modelRouteName}/upsert\\`, args, mutate);`\n ),\n ]);\n }\n\n // del\n {\n const argsType = `Prisma.${model.name}DeleteArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.${model.name}GetPayload<T>`;\n useFunc\n .addFunction({\n name: 'del',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args?',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n wrapReadbackErrorCheck(\n `return await request.del<${returnType}>(\\`\\${endpoint}/${modelRouteName}/delete\\`, args, mutate);`\n ),\n ]);\n }\n\n // deleteMany\n {\n const argsType = `Prisma.${model.name}DeleteManyArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.BatchPayload`;\n useFunc\n .addFunction({\n name: 'deleteMany',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args?',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return await request.del<${returnType}>(\\`\\${endpoint}/${modelRouteName}/deleteMany\\`, args, mutate);`,\n ]);\n }\n\n // aggregate\n {\n const argsType = `Prisma.${model.name}AggregateArgs`;\n const inputType = `Prisma.Subset<T, ${argsType}>`;\n const returnType = `Prisma.Get${model.name}AggregateType<T>`;\n useFunc\n .addFunction({\n name: 'aggregate',\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/aggregate\\`, args, options);`,\n ]);\n }\n\n // groupBy\n {\n const returnType = `{} extends InputErrors ? Prisma.Get${model.name}GroupByPayload<T> : InputErrors`;\n useFunc\n .addFunction({\n name: 'groupBy',\n typeParameters: [\n `T extends Prisma.${model.name}GroupByArgs`,\n `HasSelectOrTake extends Prisma.Or<Prisma.Extends<'skip', Prisma.Keys<T>>, Prisma.Extends<'take', Prisma.Keys<T>>>`,\n `OrderByArg extends Prisma.True extends HasSelectOrTake ? { orderBy: Prisma.UserGroupByArgs['orderBy'] }: { orderBy?: Prisma.UserGroupByArgs['orderBy'] },`,\n `OrderFields extends Prisma.ExcludeUnderscoreKeys<Prisma.Keys<Prisma.MaybeTupleToUnion<T['orderBy']>>>`,\n `ByFields extends Prisma.TupleToUnion<T['by']>`,\n `ByValid extends Prisma.Has<ByFields, OrderFields>`,\n `HavingFields extends Prisma.GetHavingFields<T['having']>`,\n `HavingValid extends Prisma.Has<ByFields, HavingFields>`,\n `ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False`,\n `InputErrors extends ByEmpty extends Prisma.True\n ? \\`Error: \"by\" must not be empty.\\`\n : HavingValid extends Prisma.False\n ? {\n [P in HavingFields]: P extends ByFields\n ? never\n : P extends string\n ? \\`Error: Field \"\\${P}\" used in \"having\" needs to be provided in \"by\".\\`\n : [\n Error,\n 'Field ',\n P,\n \\` in \"having\" needs to be provided in \"by\"\\`,\n ]\n }[HavingFields]\n : 'take' extends Prisma.Keys<T>\n ? 'orderBy' extends Prisma.Keys<T>\n ? ByValid extends Prisma.True\n ? {}\n : {\n [P in OrderFields]: P extends ByFields\n ? never\n : \\`Error: Field \"\\${P}\" in \"orderBy\" needs to be provided in \"by\"\\`\n }[OrderFields]\n : 'Error: If you provide \"take\", you also need to provide \"orderBy\"'\n : 'skip' extends Prisma.Keys<T>\n ? 'orderBy' extends Prisma.Keys<T>\n ? ByValid extends Prisma.True\n ? {}\n : {\n [P in OrderFields]: P extends ByFields\n ? never\n : \\`Error: Field \"\\${P}\" in \"orderBy\" needs to be provided in \"by\"\\`\n }[OrderFields]\n : 'Error: If you provide \"skip\", you also need to provide \"orderBy\"'\n : ByValid extends Prisma.True\n ? {}\n : {\n [P in OrderFields]: P extends ByFields\n ? never\n : \\`Error: Field \"\\${P}\" in \"orderBy\" needs to be provided in \"by\"\\`\n }[OrderFields]`,\n ],\n parameters: [\n {\n name: 'args',\n type: `Prisma.SubsetIntersection<T, Prisma.${model.name}GroupByArgs, OrderByArg> & InputErrors`,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/groupBy\\`, args, options);`,\n ]);\n }\n\n // count\n {\n const argsType = `Prisma.${model.name}CountArgs`;\n const inputType = `Prisma.Subset<T, ${argsType}>`;\n const returnType = `T extends { select: any; } ? T['select'] extends true ? number : Prisma.GetScalarType<T['select'], Prisma.${model.name}CountAggregateOutputType> : number`;\n useFunc\n .addFunction({\n name: 'count',\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/count\\`, args, options);`,\n ]);\n }\n\n useFunc.addStatements([\n 'return { create, createMany, findMany, findUnique, findFirst, update, updateMany, upsert, del, deleteMany, aggregate, groupBy, count };',\n ]);\n\n sf.formatText();\n}\n\nfunction generateIndex(project: Project, outDir: string, models: DataModel[]) {\n const sf = project.createSourceFile(path.join(outDir, 'index.ts'), undefined, { overwrite: true });\n\n sf.addStatements(models.map((d) => `export * from './${paramCase(d.name)}';`));\n\n sf.formatText();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-hooks-generator.js","names":["generate","model","options","project","Project","models","warnings","dm","declarations","filter","d","isDataModel","hasAllowRule","attributes","find","attr","decl","ref","name","push","outDir","output","generateIndex","forEach","generateModelHooks","save","wrapReadbackErrorCheck","code","fileName","paramCase","sf","createSourceFile","path","join","undefined","overwrite","addImportDeclaration","namedImports","isTypeOnly","moduleSpecifier","addStatements","RUNTIME_PACKAGE","useFunc","addFunction","isExported","prefixesToMutate","modelRouteName","camelCase","map","prefix","argsType","inputType","returnType","isAsync","typeParameters","parameters","type","addBody","formatText"],"sources":["../../../src/plugins/react-hooks/react-hooks-generator.ts"],"sourcesContent":["import { DataModel, Model, isDataModel } from '@zenstackhq/language/ast';\nimport { PluginOptions } from '@zenstackhq/sdk';\nimport { camelCase, paramCase } from 'change-case';\nimport * as path from 'path';\nimport { Project } from 'ts-morph';\nimport { RUNTIME_PACKAGE } from '../plugin-utils';\n\nexport async function generate(model: Model, options: PluginOptions) {\n const project = new Project();\n const models: DataModel[] = [];\n const warnings: string[] = [];\n\n for (const dm of model.declarations.filter((d): d is DataModel => isDataModel(d))) {\n const hasAllowRule = dm.attributes.find((attr) => attr.decl.ref?.name === '@@allow');\n if (!hasAllowRule) {\n warnings.push(`Not generating hooks for \"${dm.name}\" because it doesn't have any @@allow rule`);\n } else {\n models.push(dm);\n }\n }\n\n const outDir = (options.output as string) ?? 'node_modules/.zenstack/src/hooks';\n\n generateIndex(project, outDir, models);\n\n models.forEach((d) => generateModelHooks(project, outDir, d));\n\n await project.save();\n return warnings;\n}\n\nfunction wrapReadbackErrorCheck(code: string) {\n return `try {\n ${code}\n } catch (err: any) {\n if (err.prisma && err.code === 'P2004') {\n // unable to readback data\n return undefined;\n } else {\n throw err;\n }\n }`;\n}\n\nfunction generateModelHooks(project: Project, outDir: string, model: DataModel) {\n const fileName = paramCase(model.name);\n const sf = project.createSourceFile(path.join(outDir, `${fileName}.ts`), undefined, { overwrite: true });\n\n sf.addImportDeclaration({\n namedImports: ['Prisma', model.name],\n isTypeOnly: true,\n moduleSpecifier: '@prisma/client',\n });\n sf.addStatements([\n `import { useContext } from 'react';`,\n `import { RequestHandlerContext } from '@zenstackhq/next/client';`,\n `import { request, type RequestOptions } from '${RUNTIME_PACKAGE}/client';`,\n ]);\n\n const useFunc = sf.addFunction({\n name: `use${model.name}`,\n isExported: true,\n });\n\n const prefixesToMutate = ['find', 'aggregate', 'count', 'groupBy'];\n const modelRouteName = camelCase(model.name);\n\n useFunc.addStatements([\n 'const { endpoint } = useContext(RequestHandlerContext);',\n `const prefixesToMutate = [${prefixesToMutate\n .map((prefix) => '`${endpoint}/' + modelRouteName + '/' + prefix + '`')\n .join(', ')}];`,\n 'const mutate = request.getMutate(prefixesToMutate);',\n ]);\n\n // create\n {\n const argsType = `Prisma.${model.name}CreateArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.CheckSelect<T, ${model.name}, Prisma.${model.name}GetPayload<T>>`;\n useFunc\n .addFunction({\n name: 'create',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n wrapReadbackErrorCheck(\n `return await request.post<${inputType}, ${returnType}>(\\`\\${endpoint}/${modelRouteName}/create\\`, args, mutate);`\n ),\n ]);\n }\n\n // createMany\n {\n const argsType = `Prisma.${model.name}CreateManyArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.BatchPayload`;\n useFunc\n .addFunction({\n name: 'createMany',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return await request.post<${inputType}, ${returnType}>(\\`\\${endpoint}/${modelRouteName}/createMany\\`, args, mutate);`,\n ]);\n }\n\n // findMany\n {\n const argsType = `Prisma.${model.name}FindManyArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Array<Prisma.${model.name}GetPayload<T>>`;\n useFunc\n .addFunction({\n name: 'findMany',\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args?',\n type: inputType,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/findMany\\`, args, options);`,\n ]);\n }\n\n // findUnique\n {\n const argsType = `Prisma.${model.name}FindUniqueArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.${model.name}GetPayload<T>`;\n useFunc\n .addFunction({\n name: 'findUnique',\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/findUnique\\`, args, options);`,\n ]);\n }\n\n // findFirst\n {\n const argsType = `Prisma.${model.name}FindFirstArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.${model.name}GetPayload<T>`;\n useFunc\n .addFunction({\n name: 'findFirst',\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/findFirst\\`, args, options);`,\n ]);\n }\n\n // update\n {\n const argsType = `Prisma.${model.name}UpdateArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.${model.name}GetPayload<T>`;\n useFunc\n .addFunction({\n name: 'update',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n wrapReadbackErrorCheck(\n `return await request.put<${inputType}, ${returnType}>(\\`\\${endpoint}/${modelRouteName}/update\\`, args, mutate);`\n ),\n ]);\n }\n\n // updateMany\n {\n const argsType = `Prisma.${model.name}UpdateManyArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.BatchPayload`;\n useFunc\n .addFunction({\n name: 'updateMany',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return await request.put<${inputType}, ${returnType}>(\\`\\${endpoint}/${modelRouteName}/updateMany\\`, args, mutate);`,\n ]);\n }\n\n // upsert\n {\n const argsType = `Prisma.${model.name}UpsertArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.${model.name}GetPayload<T>`;\n useFunc\n .addFunction({\n name: 'upsert',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n wrapReadbackErrorCheck(\n `return await request.put<${inputType}, ${returnType}>(\\`\\${endpoint}/${modelRouteName}/upsert\\`, args, mutate);`\n ),\n ]);\n }\n\n // del\n {\n const argsType = `Prisma.${model.name}DeleteArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.${model.name}GetPayload<T>`;\n useFunc\n .addFunction({\n name: 'del',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args?',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n wrapReadbackErrorCheck(\n `return await request.del<${returnType}>(\\`\\${endpoint}/${modelRouteName}/delete\\`, args, mutate);`\n ),\n ]);\n }\n\n // deleteMany\n {\n const argsType = `Prisma.${model.name}DeleteManyArgs`;\n const inputType = `Prisma.SelectSubset<T, ${argsType}>`;\n const returnType = `Prisma.BatchPayload`;\n useFunc\n .addFunction({\n name: 'deleteMany',\n isAsync: true,\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args?',\n type: inputType,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return await request.del<${returnType}>(\\`\\${endpoint}/${modelRouteName}/deleteMany\\`, args, mutate);`,\n ]);\n }\n\n // aggregate\n {\n const argsType = `Prisma.${model.name}AggregateArgs`;\n const inputType = `Prisma.Subset<T, ${argsType}>`;\n const returnType = `Prisma.Get${model.name}AggregateType<T>`;\n useFunc\n .addFunction({\n name: 'aggregate',\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/aggregate\\`, args, options);`,\n ]);\n }\n\n // groupBy\n {\n const returnType = `{} extends InputErrors ? Prisma.Get${model.name}GroupByPayload<T> : InputErrors`;\n useFunc\n .addFunction({\n name: 'groupBy',\n typeParameters: [\n `T extends Prisma.${model.name}GroupByArgs`,\n `HasSelectOrTake extends Prisma.Or<Prisma.Extends<'skip', Prisma.Keys<T>>, Prisma.Extends<'take', Prisma.Keys<T>>>`,\n `OrderByArg extends Prisma.True extends HasSelectOrTake ? { orderBy: Prisma.UserGroupByArgs['orderBy'] }: { orderBy?: Prisma.UserGroupByArgs['orderBy'] },`,\n `OrderFields extends Prisma.ExcludeUnderscoreKeys<Prisma.Keys<Prisma.MaybeTupleToUnion<T['orderBy']>>>`,\n `ByFields extends Prisma.TupleToUnion<T['by']>`,\n `ByValid extends Prisma.Has<ByFields, OrderFields>`,\n `HavingFields extends Prisma.GetHavingFields<T['having']>`,\n `HavingValid extends Prisma.Has<ByFields, HavingFields>`,\n `ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False`,\n `InputErrors extends ByEmpty extends Prisma.True\n ? \\`Error: \"by\" must not be empty.\\`\n : HavingValid extends Prisma.False\n ? {\n [P in HavingFields]: P extends ByFields\n ? never\n : P extends string\n ? \\`Error: Field \"\\${P}\" used in \"having\" needs to be provided in \"by\".\\`\n : [\n Error,\n 'Field ',\n P,\n \\` in \"having\" needs to be provided in \"by\"\\`,\n ]\n }[HavingFields]\n : 'take' extends Prisma.Keys<T>\n ? 'orderBy' extends Prisma.Keys<T>\n ? ByValid extends Prisma.True\n ? {}\n : {\n [P in OrderFields]: P extends ByFields\n ? never\n : \\`Error: Field \"\\${P}\" in \"orderBy\" needs to be provided in \"by\"\\`\n }[OrderFields]\n : 'Error: If you provide \"take\", you also need to provide \"orderBy\"'\n : 'skip' extends Prisma.Keys<T>\n ? 'orderBy' extends Prisma.Keys<T>\n ? ByValid extends Prisma.True\n ? {}\n : {\n [P in OrderFields]: P extends ByFields\n ? never\n : \\`Error: Field \"\\${P}\" in \"orderBy\" needs to be provided in \"by\"\\`\n }[OrderFields]\n : 'Error: If you provide \"skip\", you also need to provide \"orderBy\"'\n : ByValid extends Prisma.True\n ? {}\n : {\n [P in OrderFields]: P extends ByFields\n ? never\n : \\`Error: Field \"\\${P}\" in \"orderBy\" needs to be provided in \"by\"\\`\n }[OrderFields]`,\n ],\n parameters: [\n {\n name: 'args',\n type: `Prisma.SubsetIntersection<T, Prisma.${model.name}GroupByArgs, OrderByArg> & InputErrors`,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/groupBy\\`, args, options);`,\n ]);\n }\n\n // count\n {\n const argsType = `Prisma.${model.name}CountArgs`;\n const inputType = `Prisma.Subset<T, ${argsType}>`;\n const returnType = `T extends { select: any; } ? T['select'] extends true ? number : Prisma.GetScalarType<T['select'], Prisma.${model.name}CountAggregateOutputType> : number`;\n useFunc\n .addFunction({\n name: 'count',\n typeParameters: [`T extends ${argsType}`],\n parameters: [\n {\n name: 'args',\n type: inputType,\n },\n {\n name: 'options?',\n type: `RequestOptions<${returnType}>`,\n },\n ],\n })\n .addBody()\n .addStatements([\n `return request.get<${returnType}>(\\`\\${endpoint}/${modelRouteName}/count\\`, args, options);`,\n ]);\n }\n\n useFunc.addStatements([\n 'return { create, createMany, findMany, findUnique, findFirst, update, updateMany, upsert, del, deleteMany, aggregate, groupBy, count };',\n ]);\n\n sf.formatText();\n}\n\nfunction generateIndex(project: Project, outDir: string, models: DataModel[]) {\n const sf = project.createSourceFile(path.join(outDir, 'index.ts'), undefined, { overwrite: true });\n\n sf.addStatements(models.map((d) => `export * from './${paramCase(d.name)}';`));\n\n sf.formatText();\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Argument, AttributeArg, BinaryExpr, DataModelAttribute, DataModelFieldAttribute, Expression, InvocationExpr, LiteralExpr, MemberAccessExpr, ReferenceArg, ReferenceExpr, UnaryExpr } from '@zenstackhq/language/ast';
|
|
2
|
+
/**
|
|
3
|
+
* Options for the generator.
|
|
4
|
+
*/
|
|
5
|
+
export interface ZModelCodeOptions {
|
|
6
|
+
binaryExprNumberOfSpaces: number;
|
|
7
|
+
unaryExprNumberOfSpaces: number;
|
|
8
|
+
}
|
|
9
|
+
export default class ZModelCodeGenerator {
|
|
10
|
+
private readonly options;
|
|
11
|
+
constructor(options?: Partial<ZModelCodeOptions>);
|
|
12
|
+
generateAttribute(ast: DataModelAttribute | DataModelFieldAttribute): string;
|
|
13
|
+
generateAttributeArg(ast: AttributeArg): string;
|
|
14
|
+
generateExpression(ast: Expression): string;
|
|
15
|
+
generateLiteralExpr(ast: LiteralExpr): string;
|
|
16
|
+
generateUnaryExpr(ast: UnaryExpr): string;
|
|
17
|
+
generateBinaryExpr(ast: BinaryExpr): string;
|
|
18
|
+
generateReferenceExpr(ast: ReferenceExpr): string;
|
|
19
|
+
generateReferenceArg(ast: ReferenceArg): string;
|
|
20
|
+
generateMemberExpr(ast: MemberAccessExpr): string;
|
|
21
|
+
generateInvocationExpr(ast: InvocationExpr): string;
|
|
22
|
+
generateArgument(ast: Argument): string;
|
|
23
|
+
private get binaryExprSpace();
|
|
24
|
+
private get unaryExprSpace();
|
|
25
|
+
private isParenthesesNeededForBinaryExpr;
|
|
26
|
+
private isCollectionPredicateOperator;
|
|
27
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _ast = require("@zenstackhq/language/ast");
|
|
8
|
+
var _sdk = require("@zenstackhq/sdk");
|
|
9
|
+
class ZModelCodeGenerator {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.options = {
|
|
12
|
+
binaryExprNumberOfSpaces: (options === null || options === void 0 ? void 0 : options.binaryExprNumberOfSpaces) ?? 1,
|
|
13
|
+
unaryExprNumberOfSpaces: (options === null || options === void 0 ? void 0 : options.unaryExprNumberOfSpaces) ?? 0
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
generateAttribute(ast) {
|
|
17
|
+
const args = ast.args.length ? `(${ast.args.map(x => this.generateAttributeArg(x)).join(', ')})` : '';
|
|
18
|
+
return `${(0, _sdk.resolved)(ast.decl).name}${args}`;
|
|
19
|
+
}
|
|
20
|
+
generateAttributeArg(ast) {
|
|
21
|
+
return this.generateExpression(ast.value);
|
|
22
|
+
}
|
|
23
|
+
generateExpression(ast) {
|
|
24
|
+
switch (ast.$type) {
|
|
25
|
+
case _ast.LiteralExpr:
|
|
26
|
+
return this.generateLiteralExpr(ast);
|
|
27
|
+
case _ast.UnaryExpr:
|
|
28
|
+
return this.generateUnaryExpr(ast);
|
|
29
|
+
case _ast.BinaryExpr:
|
|
30
|
+
return this.generateBinaryExpr(ast);
|
|
31
|
+
case _ast.ReferenceExpr:
|
|
32
|
+
return this.generateReferenceExpr(ast);
|
|
33
|
+
case _ast.MemberAccessExpr:
|
|
34
|
+
return this.generateMemberExpr(ast);
|
|
35
|
+
case _ast.InvocationExpr:
|
|
36
|
+
return this.generateInvocationExpr(ast);
|
|
37
|
+
case _ast.NullExpr:
|
|
38
|
+
case _ast.ThisExpr:
|
|
39
|
+
return ast.value;
|
|
40
|
+
default:
|
|
41
|
+
throw new Error(`Not implemented: ${ast.$type}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
generateLiteralExpr(ast) {
|
|
45
|
+
return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value.toString();
|
|
46
|
+
}
|
|
47
|
+
generateUnaryExpr(ast) {
|
|
48
|
+
return `${ast.operator}${this.unaryExprSpace}${this.generateExpression(ast.operand)}`;
|
|
49
|
+
}
|
|
50
|
+
generateBinaryExpr(ast) {
|
|
51
|
+
const operator = ast.operator;
|
|
52
|
+
const isCollectionPredicate = this.isCollectionPredicateOperator(operator);
|
|
53
|
+
const rightExpr = this.generateExpression(ast.right);
|
|
54
|
+
const {
|
|
55
|
+
left: isLeftParenthesis,
|
|
56
|
+
right: isRightParenthesis
|
|
57
|
+
} = this.isParenthesesNeededForBinaryExpr(ast);
|
|
58
|
+
return `${isLeftParenthesis ? '(' : ''}${this.generateExpression(ast.left)}${isLeftParenthesis ? ')' : ''}${this.binaryExprSpace}${operator}${this.binaryExprSpace}${isRightParenthesis ? '(' : ''}${isCollectionPredicate ? `[${rightExpr}]` : rightExpr}${isRightParenthesis ? ')' : ''}`;
|
|
59
|
+
}
|
|
60
|
+
generateReferenceExpr(ast) {
|
|
61
|
+
var _ast$target$ref;
|
|
62
|
+
const args = ast.args.length ? `(${ast.args.map(x => this.generateReferenceArg(x)).join(', ')})` : '';
|
|
63
|
+
return `${(_ast$target$ref = ast.target.ref) === null || _ast$target$ref === void 0 ? void 0 : _ast$target$ref.name}${args}`;
|
|
64
|
+
}
|
|
65
|
+
generateReferenceArg(ast) {
|
|
66
|
+
return `${ast.name}:${ast.value}`;
|
|
67
|
+
}
|
|
68
|
+
generateMemberExpr(ast) {
|
|
69
|
+
var _ast$member$ref;
|
|
70
|
+
return `${this.generateExpression(ast.operand)}.${(_ast$member$ref = ast.member.ref) === null || _ast$member$ref === void 0 ? void 0 : _ast$member$ref.name}`;
|
|
71
|
+
}
|
|
72
|
+
generateInvocationExpr(ast) {
|
|
73
|
+
var _ast$function$ref;
|
|
74
|
+
return `${(_ast$function$ref = ast.function.ref) === null || _ast$function$ref === void 0 ? void 0 : _ast$function$ref.name}(${ast.args.map(x => this.generateArgument(x)).join(', ')})`;
|
|
75
|
+
}
|
|
76
|
+
generateArgument(ast) {
|
|
77
|
+
return `${ast.name && ':'} ${this.generateExpression(ast.value)}`;
|
|
78
|
+
}
|
|
79
|
+
get binaryExprSpace() {
|
|
80
|
+
return ' '.repeat(this.options.binaryExprNumberOfSpaces);
|
|
81
|
+
}
|
|
82
|
+
get unaryExprSpace() {
|
|
83
|
+
return ' '.repeat(this.options.unaryExprNumberOfSpaces);
|
|
84
|
+
}
|
|
85
|
+
isParenthesesNeededForBinaryExpr(ast) {
|
|
86
|
+
const result = {
|
|
87
|
+
left: false,
|
|
88
|
+
right: false
|
|
89
|
+
};
|
|
90
|
+
const operator = ast.operator;
|
|
91
|
+
const isCollectionPredicate = this.isCollectionPredicateOperator(operator);
|
|
92
|
+
const currentPriority = _ast.BinaryExprOperatorPriority[operator];
|
|
93
|
+
if (ast.left.$type === _ast.BinaryExpr && _ast.BinaryExprOperatorPriority[ast.left['operator']] < currentPriority) {
|
|
94
|
+
result.left = true;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 1 collection predicate operator has [] around the right operand, no need to add parenthesis.
|
|
98
|
+
* 2 grammar is left associative, so if the right operand has the same priority still need to add parenthesis.
|
|
99
|
+
**/
|
|
100
|
+
if (!isCollectionPredicate && ast.right.$type === _ast.BinaryExpr && _ast.BinaryExprOperatorPriority[ast.right['operator']] <= currentPriority) {
|
|
101
|
+
result.right = true;
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
isCollectionPredicateOperator(op) {
|
|
106
|
+
return ['?', '!', '^'].includes(op);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.default = ZModelCodeGenerator;
|
|
110
|
+
//# sourceMappingURL=zmodel-code-generator.js.map
|
|
@@ -0,0 +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/zmodel-code/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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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// This is a sample model to get you started.
|
|
2
|
+
// Learn how to model you app: https://zenstack.dev/#/modeling-your-app.
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* A sample data source using local sqlite db.
|
|
6
|
+
* See how to use a different db: https://zenstack.dev/#/zmodel-data-source.
|
|
7
|
+
*/
|
|
8
|
+
datasource db {
|
|
9
|
+
provider = 'sqlite'
|
|
10
|
+
url = 'file:./todo.db'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* User model
|
|
15
|
+
*/
|
|
16
|
+
model User {
|
|
17
|
+
id String @id @default(cuid())
|
|
18
|
+
email String @unique @email
|
|
19
|
+
password String @password @omit @length(8, 16)
|
|
20
|
+
posts Post[]
|
|
21
|
+
|
|
22
|
+
// everybody can signup
|
|
23
|
+
@@allow('create', true)
|
|
24
|
+
|
|
25
|
+
// full access by self
|
|
26
|
+
@@allow('all', auth() == this)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* Post model
|
|
31
|
+
*/
|
|
32
|
+
model Post {
|
|
33
|
+
id String @id @default(cuid())
|
|
34
|
+
createdAt DateTime @default(now())
|
|
35
|
+
updatedAt DateTime @updatedAt
|
|
36
|
+
title String @length(1, 256)
|
|
37
|
+
content String
|
|
38
|
+
published Boolean @default(false)
|
|
39
|
+
author User? @relation(fields: [authorId], references: [id])
|
|
40
|
+
authorId String?
|
|
41
|
+
|
|
42
|
+
// allow read for all signin users
|
|
43
|
+
@@allow('read', auth() != null && published)
|
|
44
|
+
|
|
45
|
+
// full access by author
|
|
46
|
+
@@allow('all', author == auth())
|
|
47
|
+
}
|
package/telemetry.js
CHANGED
|
@@ -4,14 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.Telemetry = void 0;
|
|
7
|
+
var _asyncExitHook = _interopRequireDefault(require("async-exit-hook"));
|
|
8
|
+
var _commander = require("commander");
|
|
9
|
+
var _cuid = _interopRequireDefault(require("cuid"));
|
|
7
10
|
var _mixpanel = require("mixpanel");
|
|
8
11
|
var _nodeMachineId = require("node-machine-id");
|
|
9
|
-
var _cuid = _interopRequireDefault(require("cuid"));
|
|
10
12
|
var os = _interopRequireWildcard(require("os"));
|
|
11
13
|
var _sleepPromise = _interopRequireDefault(require("sleep-promise"));
|
|
12
|
-
var _asyncExitHook = _interopRequireDefault(require("async-exit-hook"));
|
|
13
14
|
var _cliError = require("./cli/cli-error");
|
|
14
|
-
var
|
|
15
|
+
var _versionUtils = require("./utils/version-utils");
|
|
15
16
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
16
17
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -23,8 +24,7 @@ class Telemetry {
|
|
|
23
24
|
sessionid = (0, _cuid.default)();
|
|
24
25
|
trackingToken = process && process.env && process.env.TELEMETRY_TRACKING_TOKEN || "74944eb779d7d3b4ce185be843fde9fc";
|
|
25
26
|
_os = os.platform();
|
|
26
|
-
|
|
27
|
-
version = require('./package.json').version;
|
|
27
|
+
version = (0, _versionUtils.getVersion)();
|
|
28
28
|
exitWait = 200;
|
|
29
29
|
constructor() {
|
|
30
30
|
if ((process && process.env && process.env.DO_NOT_TRACK || "1") !== '1' && this.trackingToken) {
|
package/telemetry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","names":["Telemetry","hostId","machineIdSync","sessionid","cuid","trackingToken","_os","os","platform","version","
|
|
1
|
+
{"version":3,"file":"telemetry.js","names":["Telemetry","hostId","machineIdSync","sessionid","cuid","trackingToken","_os","os","platform","version","getVersion","exitWait","constructor","mixpanel","init","geolocate","exitHook","callback","sleep","errorHandler","err","track","message","stack","CliError","CommanderError","console","error","process","exit","unhandledRejectionHandler","uncaughtExceptionHandler","event","properties","payload","distinct_id","session","time","Date","$os","nodeVersion","trackSpan","startEvent","completeEvent","errorEvent","action","start","now","success","Promise","resolve","duration"],"sources":["../src/telemetry.ts"],"sourcesContent":["import exitHook from 'async-exit-hook';\nimport { CommanderError } from 'commander';\nimport cuid from 'cuid';\nimport { init, Mixpanel } from 'mixpanel';\nimport { machineIdSync } from 'node-machine-id';\nimport * as os from 'os';\nimport sleep from 'sleep-promise';\nimport { CliError } from './cli/cli-error';\nimport { getVersion } from './utils/version-utils';\n\n/**\n * Telemetry events\n */\nexport type TelemetryEvents =\n | 'cli:start'\n | 'cli:complete'\n | 'cli:error'\n | 'cli:command:start'\n | 'cli:command:complete'\n | 'cli:command:error'\n | 'cli:plugin:start'\n | 'cli:plugin:complete'\n | 'cli:plugin:error';\n\n/**\n * Utility class for sending telemetry\n */\nexport class Telemetry {\n private readonly mixpanel: Mixpanel | undefined;\n private readonly hostId = machineIdSync();\n private readonly sessionid = cuid();\n private readonly trackingToken = process.env.TELEMETRY_TRACKING_TOKEN;\n private readonly _os = os.platform();\n private readonly version = getVersion();\n private exitWait = 200;\n\n constructor() {\n if (process.env.DO_NOT_TRACK !== '1' && this.trackingToken) {\n this.mixpanel = init(this.trackingToken, {\n geolocate: true,\n });\n }\n\n exitHook(async (callback) => {\n if (this.mixpanel) {\n // a small delay to ensure telemetry is sent\n await sleep(this.exitWait);\n }\n callback();\n });\n\n const errorHandler = async (err: Error) => {\n this.track('cli:error', {\n message: err.message,\n stack: err.stack,\n });\n if (this.mixpanel) {\n // a small delay to ensure telemetry is sent\n await sleep(this.exitWait);\n }\n\n if (err instanceof CliError || err instanceof CommanderError) {\n // error already logged\n } else {\n console.error('\\nAn unexpected error occurred:\\n', err);\n }\n\n process.exit(1);\n };\n\n exitHook.unhandledRejectionHandler(errorHandler);\n exitHook.uncaughtExceptionHandler(errorHandler);\n }\n\n track(event: TelemetryEvents, properties: Record<string, unknown> = {}) {\n if (this.mixpanel) {\n const payload = {\n distinct_id: this.hostId,\n session: this.sessionid,\n time: new Date(),\n $os: this._os,\n nodeVersion: process.version,\n version: this.version,\n ...properties,\n };\n this.mixpanel.track(event, payload);\n }\n }\n\n async trackSpan(\n startEvent: TelemetryEvents,\n completeEvent: TelemetryEvents,\n errorEvent: TelemetryEvents,\n properties: Record<string, unknown>,\n action: () => Promise<unknown> | void\n ) {\n this.track(startEvent, properties);\n const start = Date.now();\n let success = true;\n try {\n await Promise.resolve(action());\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n this.track(errorEvent, {\n message: err.message,\n stack: err.stack,\n ...properties,\n });\n success = false;\n throw err;\n } finally {\n this.track(completeEvent, {\n duration: Date.now() - start,\n success,\n ...properties,\n });\n }\n }\n}\n\nexport default new Telemetry();\n"],"mappings":"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"}
|
package/utils/exec-utils.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ import { StdioOptions } from 'child_process';
|
|
|
3
3
|
/**
|
|
4
4
|
* Utility for executing command synchronously and prints outputs on current console
|
|
5
5
|
*/
|
|
6
|
-
export declare function execSync(cmd: string, stdio?: StdioOptions): void;
|
|
6
|
+
export declare function execSync(cmd: string, stdio?: StdioOptions, env?: Record<string, string>): void;
|
package/utils/exec-utils.js
CHANGED
|
@@ -8,10 +8,15 @@ var _child_process = require("child_process");
|
|
|
8
8
|
/**
|
|
9
9
|
* Utility for executing command synchronously and prints outputs on current console
|
|
10
10
|
*/
|
|
11
|
-
function execSync(cmd, stdio = 'inherit') {
|
|
11
|
+
function execSync(cmd, stdio = 'inherit', env) {
|
|
12
|
+
const mergedEnv = {
|
|
13
|
+
...process.env,
|
|
14
|
+
...env
|
|
15
|
+
};
|
|
12
16
|
(0, _child_process.execSync)(cmd, {
|
|
13
17
|
encoding: 'utf-8',
|
|
14
|
-
stdio
|
|
18
|
+
stdio,
|
|
19
|
+
env: mergedEnv
|
|
15
20
|
});
|
|
16
21
|
}
|
|
17
22
|
//# sourceMappingURL=exec-utils.js.map
|
package/utils/exec-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec-utils.js","names":["execSync","cmd","stdio","_exec","encoding"],"sources":["../../src/utils/exec-utils.ts"],"sourcesContent":["import { execSync as _exec, StdioOptions } from 'child_process';\n\n/**\n * Utility for executing command synchronously and prints outputs on current console\n */\nexport function execSync(cmd: string, stdio: StdioOptions = 'inherit'): void {\n _exec(cmd, { encoding: 'utf-8', stdio });\n}\n"],"mappings":";;;;;;AAAA;AAEA;AACA;AACA;AACO,SAASA,QAAQ,CAACC,GAAW,EAAEC,KAAmB,GAAG,SAAS,EAAQ;
|
|
1
|
+
{"version":3,"file":"exec-utils.js","names":["execSync","cmd","stdio","env","mergedEnv","process","_exec","encoding"],"sources":["../../src/utils/exec-utils.ts"],"sourcesContent":["import { execSync as _exec, StdioOptions } from 'child_process';\n\n/**\n * Utility for executing command synchronously and prints outputs on current console\n */\nexport function execSync(cmd: string, stdio: StdioOptions = 'inherit', env?: Record<string, string>): void {\n const mergedEnv = { ...process.env, ...env };\n _exec(cmd, { encoding: 'utf-8', stdio, env: mergedEnv });\n}\n"],"mappings":";;;;;;AAAA;AAEA;AACA;AACA;AACO,SAASA,QAAQ,CAACC,GAAW,EAAEC,KAAmB,GAAG,SAAS,EAAEC,GAA4B,EAAQ;EACvG,MAAMC,SAAS,GAAG;IAAE,GAAGC,OAAO,CAACF,GAAG;IAAE,GAAGA;EAAI,CAAC;EAC5C,IAAAG,uBAAK,EAACL,GAAG,EAAE;IAAEM,QAAQ,EAAE,OAAO;IAAEL,KAAK;IAAEC,GAAG,EAAEC;EAAU,CAAC,CAAC;AAC5D"}
|
package/utils/pkg-utils.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export declare type PackageManagers = 'npm' | 'yarn' | 'pnpm';
|
|
2
|
-
export declare function installPackage(pkg: string, dev: boolean, pkgManager?: PackageManagers | undefined, projectPath?: string): void;
|
|
2
|
+
export declare function installPackage(pkg: string, dev: boolean, pkgManager?: PackageManagers | undefined, tag?: string, projectPath?: string): void;
|
|
3
3
|
export declare function ensurePackage(pkg: string, dev: boolean, pkgManager?: PackageManagers | undefined, projectPath?: string): void;
|
package/utils/pkg-utils.js
CHANGED
|
@@ -18,18 +18,18 @@ function getPackageManager(projectPath = '.') {
|
|
|
18
18
|
return 'npm';
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
function installPackage(pkg, dev, pkgManager = undefined, projectPath = '.') {
|
|
21
|
+
function installPackage(pkg, dev, pkgManager = undefined, tag = 'latest', projectPath = '.') {
|
|
22
22
|
const manager = pkgManager ?? getPackageManager(projectPath);
|
|
23
23
|
console.log(`Installing package "${pkg}" with ${manager}`);
|
|
24
24
|
switch (manager) {
|
|
25
25
|
case 'yarn':
|
|
26
|
-
(0, _execUtils.execSync)(`yarn --cwd "${projectPath}" add ${pkg} ${dev ? ' --dev' : ''} --ignore-engines`);
|
|
26
|
+
(0, _execUtils.execSync)(`yarn --cwd "${projectPath}" add ${pkg}@${tag} ${dev ? ' --dev' : ''} --ignore-engines`);
|
|
27
27
|
break;
|
|
28
28
|
case 'pnpm':
|
|
29
|
-
(0, _execUtils.execSync)(`pnpm add -C "${projectPath}" ${dev ? ' --save-dev' : ''} ${pkg}`);
|
|
29
|
+
(0, _execUtils.execSync)(`pnpm add -C "${projectPath}" ${dev ? ' --save-dev' : ''} ${pkg}@${tag}`);
|
|
30
30
|
break;
|
|
31
31
|
default:
|
|
32
|
-
(0, _execUtils.execSync)(`npm install --prefix "${projectPath}" ${dev ? ' --save-dev' : ''} ${pkg}`);
|
|
32
|
+
(0, _execUtils.execSync)(`npm install --prefix "${projectPath}" ${dev ? ' --save-dev' : ''} ${pkg}@${tag}`);
|
|
33
33
|
break;
|
|
34
34
|
}
|
|
35
35
|
}
|