From d66eef2c7ef3f94ac1651f3bb0761f61108de476 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 6 Mar 2023 11:18:30 +0800 Subject: [PATCH 1/2] feat: add support for type modifier attributes --- package.json | 2 +- packages/language/package.json | 2 +- packages/next/package.json | 2 +- packages/plugins/react/package.json | 2 +- packages/plugins/trpc/package.json | 2 +- packages/runtime/package.json | 2 +- packages/schema/package.json | 2 +- .../validator/datamodel-validator.ts | 2 + .../src/language-server/validator/utils.ts | 3 + packages/schema/src/res/stdlib.zmodel | 126 ++++++++++++++++-- .../validation/attribute-validation.test.ts | 104 +++++++++++++++ packages/sdk/package.json | 2 +- packages/testtools/package.json | 2 +- tests/integration/test-run/package-lock.json | 2 +- 14 files changed, 237 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index c242b4b13..45000fb8d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zenstack-monorepo", - "version": "1.0.0-alpha.55", + "version": "1.0.0-alpha.56", "description": "", "scripts": { "build": "pnpm -r build", diff --git a/packages/language/package.json b/packages/language/package.json index b9b76bbd8..9255bc83e 100644 --- a/packages/language/package.json +++ b/packages/language/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/language", - "version": "1.0.0-alpha.55", + "version": "1.0.0-alpha.56", "displayName": "ZenStack modeling language compiler", "description": "ZenStack modeling language compiler", "homepage": "https://zenstack.dev", diff --git a/packages/next/package.json b/packages/next/package.json index 181c36b6a..b77b58744 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/next", - "version": "1.0.0-alpha.55", + "version": "1.0.0-alpha.56", "displayName": "ZenStack Next.js integration", "description": "ZenStack Next.js integration", "homepage": "https://zenstack.dev", diff --git a/packages/plugins/react/package.json b/packages/plugins/react/package.json index c8cdeb7b1..258476b26 100644 --- a/packages/plugins/react/package.json +++ b/packages/plugins/react/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/react", "displayName": "ZenStack plugin and runtime for ReactJS", - "version": "1.0.0-alpha.55", + "version": "1.0.0-alpha.56", "description": "ZenStack plugin and runtime for ReactJS", "main": "index.js", "repository": { diff --git a/packages/plugins/trpc/package.json b/packages/plugins/trpc/package.json index c92c1aeec..7d652358f 100644 --- a/packages/plugins/trpc/package.json +++ b/packages/plugins/trpc/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/trpc", "displayName": "ZenStack plugin for tRPC", - "version": "1.0.0-alpha.55", + "version": "1.0.0-alpha.56", "description": "ZenStack plugin for tRPC", "main": "index.js", "repository": { diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 87273829e..9bd73738f 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/runtime", "displayName": "ZenStack Runtime Library", - "version": "1.0.0-alpha.55", + "version": "1.0.0-alpha.56", "description": "Runtime of ZenStack for both client-side and server-side environments.", "repository": { "type": "git", diff --git a/packages/schema/package.json b/packages/schema/package.json index 8f33abf9c..6fa920912 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -3,7 +3,7 @@ "publisher": "zenstack", "displayName": "ZenStack Language Tools", "description": "A toolkit for building secure CRUD apps with Next.js + Typescript", - "version": "1.0.0-alpha.55", + "version": "1.0.0-alpha.56", "author": { "name": "ZenStack Team" }, diff --git a/packages/schema/src/language-server/validator/datamodel-validator.ts b/packages/schema/src/language-server/validator/datamodel-validator.ts index c7cc74a29..9a645d484 100644 --- a/packages/schema/src/language-server/validator/datamodel-validator.ts +++ b/packages/schema/src/language-server/validator/datamodel-validator.ts @@ -23,6 +23,8 @@ export default class DataModelValidator implements AstValidator { } private validateFields(dm: DataModel, accept: ValidationAcceptor) { + // TODO: check conflict of @id and @@id + const idFields = dm.fields.filter((f) => f.attributes.find((attr) => attr.decl.ref?.name === '@id')); if (idFields.length === 0) { const { allows, denies, hasFieldValidation } = analyzePolicies(dm); diff --git a/packages/schema/src/language-server/validator/utils.ts b/packages/schema/src/language-server/validator/utils.ts index a29af47e3..8fb507e85 100644 --- a/packages/schema/src/language-server/validator/utils.ts +++ b/packages/schema/src/language-server/validator/utils.ts @@ -267,6 +267,9 @@ function isValidAttributeTarget(attrDecl: Attribute, targetDecl: DataModelField) case 'IntField': allowed = allowed || targetDecl.type.type === 'Int'; break; + case 'BigIntField': + allowed = allowed || targetDecl.type.type === 'BigInt'; + break; case 'FloatField': allowed = allowed || targetDecl.type.type === 'Float'; break; diff --git a/packages/schema/src/res/stdlib.zmodel b/packages/schema/src/res/stdlib.zmodel index cd78b7a4f..a7ec66d3a 100644 --- a/packages/schema/src/res/stdlib.zmodel +++ b/packages/schema/src/res/stdlib.zmodel @@ -39,6 +39,7 @@ enum ReferentialAction { enum AttributeTargetField { StringField IntField + BigIntField FloatField DecimalField BooleanField @@ -51,43 +52,51 @@ enum AttributeTargetField { /* * Reads value from an environment variable. */ -function env(name: String): String {} +function env(name: String): String { +} /* * Gets the current login user. */ -function auth(): Any {} +function auth(): Any { +} /* * Gets current date-time (as DateTime type). */ -function now(): DateTime {} +function now(): DateTime { +} /* * Generates a globally unique identifier based on the UUID specs. */ -function uuid(): String {} +function uuid(): String { +} /* * Generates a globally unique identifier based on the CUID spec. */ -function cuid(): String {} +function cuid(): String { +} /* * Creates a sequence of integers in the underlying database and assign the incremented * values to the ID values of the created records based on the sequence. */ -function autoincrement(): Int {} +function autoincrement(): Int { +} /* * Represents default values that cannot be expressed in the Prisma schema (such as random()). */ -function dbgenerated(expr: String): Any {} +function dbgenerated(expr: String): Any { +} /** * Gets entities value before an update. Only valid when used in a "update" policy rule. */ -function future(): Any {} +function future(): Any { +} /** * Marks an attribute to be only applicable to certain field types. @@ -114,6 +123,11 @@ attribute @default(_ value: ContextType) @@@prisma */ attribute @unique(map: String?) @@@prisma +/* + * Defines a multi-field ID (composite ID) on the model. + */ +attribute @@id(_ fields: FieldReference[], name: String?, map: String?) @@@prisma + /* * Defines a compound unique constraint for the specified fields. */ @@ -144,6 +158,102 @@ attribute @@map(_ name: String) @@@prisma */ attribute @updatedAt() @@@targetField([DateTimeField]) @@@prisma +// String type modifiers + +// TODO: deal with keyword conflict +// attribute @db.String(x: Int) @@@targetField([StringField]) @@@prisma +attribute @db.Text() @@@targetField([StringField]) @@@prisma +attribute @db.NText() @@@targetField([StringField]) @@@prisma +attribute @db.Char(_ x: Int) @@@targetField([StringField]) @@@prisma +attribute @db.NChar(_ x: Int) @@@targetField([StringField]) @@@prisma +attribute @db.VarChar(_ x: Int) @@@targetField([StringField]) @@@prisma +attribute @db.NVarChar(_ x: Int) @@@targetField([StringField]) @@@prisma +attribute @db.CatalogSingleChar() @@@targetField([StringField]) @@@prisma +attribute @db.TinyText() @@@targetField([StringField]) @@@prisma +attribute @db.MediumText() @@@targetField([StringField]) @@@prisma +attribute @db.LongText() @@@targetField([StringField]) @@@prisma +attribute @db.Bit(_ x: Int?) @@@targetField([StringField, BooleanField, BytesField]) @@@prisma +attribute @db.VarBit(_ x: Int?) @@@targetField([StringField]) @@@prisma +attribute @db.Uuid() @@@targetField([StringField]) @@@prisma +attribute @db.UniqueIdentifier() @@@targetField([StringField]) @@@prisma +attribute @db.Xml() @@@targetField([StringField]) @@@prisma +attribute @db.Inet() @@@targetField([StringField]) @@@prisma +attribute @db.Citext() @@@targetField([StringField]) @@@prisma + +// Boolean type modifiers + +// TODO: deal with keyword conflict +// attribute @db.Boolean() @@@targetField([BooleanField]) @@@prisma +attribute @db.TinyInt(_ x: Int?) @@@targetField([BooleanField]) @@@prisma +attribute @db.Bool() @@@targetField([BooleanField]) @@@prisma + +// Int type modifiers + +attribute @db.Integer() @@@targetField([IntField]) @@@prisma +attribute @db.SmallInt() @@@targetField([IntField]) @@@prisma +// TODO: deal with keyword conflict +// attribute @db.Int() @@@targetField([IntField]) @@@prisma +attribute @db.Oid() @@@targetField([IntField]) @@@prisma +attribute @db.UnsignedInt() @@@targetField([IntField]) @@@prisma +attribute @db.UnsignedSmallInt() @@@targetField([IntField]) @@@prisma +attribute @db.MediumInt() @@@targetField([IntField]) @@@prisma +attribute @db.UnsignedMediumInt() @@@targetField([IntField]) @@@prisma +attribute @db.UnsignedTinyInt() @@@targetField([IntField]) @@@prisma +attribute @db.Year() @@@targetField([IntField]) @@@prisma +attribute @db.Int4() @@@targetField([IntField]) @@@prisma +attribute @db.Int2() @@@targetField([IntField]) @@@prisma + +// BigInt type modifiers + +// TODO: deal with keyword conflict +// attribute @db.BigInt() @@@targetField([BigIntField]) @@@prisma +attribute @db.UnsignedBigInt() @@@targetField([BigIntField]) @@@prisma +attribute @db.Int8() @@@targetField([BigIntField]) @@@prisma + +// Float/Decimal type modifiers +attribute @db.DoublePrecision() @@@targetField([FloatField, DecimalField]) @@@prisma +attribute @db.Real() @@@targetField([FloatField, DecimalField]) @@@prisma +// TODO: deal with keyword conflict +// attribute @db.Float() @@@targetField([FloatField, DecimalField]) @@@prisma +// attribute @db.Decimal() @@@targetField([FloatField, DecimalField]) @@@prisma +attribute @db.Double() @@@targetField([FloatField, DecimalField]) @@@prisma +attribute @db.Money() @@@targetField([FloatField, DecimalField]) @@@prisma +attribute @db.SmallMoney() @@@targetField([FloatField, DecimalField]) @@@prisma +attribute @db.Float8() @@@targetField([FloatField, DecimalField]) @@@prisma +attribute @db.Float4() @@@targetField([FloatField, DecimalField]) @@@prisma + +// DateTime type modifiers + +// TODO: deal with keyword conflict +// attribute @db.DateTime(x: Int?) @@@targetField([DateTimeField]) @@@prisma +attribute @db.DateTime2() @@@targetField([DateTimeField]) @@@prisma +attribute @db.SmallDateTime() @@@targetField([DateTimeField]) @@@prisma +attribute @db.DateTimeOffset() @@@targetField([DateTimeField]) @@@prisma +attribute @db.Timestamp(_ x: Int?) @@@targetField([DateTimeField]) @@@prisma +attribute @db.Timestamptz(_ x: Int?) @@@targetField([DateTimeField]) @@@prisma +attribute @db.Date() @@@targetField([DateTimeField]) @@@prisma +attribute @db.Time(_ x: Int?) @@@targetField([DateTimeField]) @@@prisma +attribute @db.Timetz(_ x: Int?) @@@targetField([DateTimeField]) @@@prisma + +// Json type modifiers + +// TODO: deal with keyword conflict +// attribute @db.Json() @@@targetField([JsonField]) @@@prisma +attribute @db.JsonB() @@@targetField([JsonField]) @@@prisma + +// Bytes type modifiers + +// TODO: deal with keyword conflict +// attribute @db.Bytes() @@@targetField([BytesField]) @@@prisma +attribute @db.ByteA() @@@targetField([BytesField]) @@@prisma +attribute @db.LongBlob() @@@targetField([BytesField]) @@@prisma +attribute @db.Binary() @@@targetField([BytesField]) @@@prisma +attribute @db.VarBinary() @@@targetField([BytesField]) @@@prisma +attribute @db.TinyBlob() @@@targetField([BytesField]) @@@prisma +attribute @db.Blob() @@@targetField([BytesField]) @@@prisma +attribute @db.MediumBlob() @@@targetField([BytesField]) @@@prisma +attribute @db.Image() @@@targetField([BytesField]) @@@prisma + /* * Defines an access policy that allows a set of operations when the given condition is true. */ diff --git a/packages/schema/tests/schema/validation/attribute-validation.test.ts b/packages/schema/tests/schema/validation/attribute-validation.test.ts index 309d2b5ad..38dcbc995 100644 --- a/packages/schema/tests/schema/validation/attribute-validation.test.ts +++ b/packages/schema/tests/schema/validation/attribute-validation.test.ts @@ -154,6 +154,15 @@ describe('Attribute tests', () => { }); it('model attribute coverage', async () => { + await loadModel(` + ${prelude} + model A { + x Int + y String + @@id([x, y], name: 'x_y', map: '_x_y') + } + `); + await loadModel(` ${prelude} model A { @@ -216,6 +225,101 @@ describe('Attribute tests', () => { `); }); + it('type modifier attribute coverage', async () => { + await loadModel(` + ${prelude} + + model _String { + _text String @db.Text + _ntext String @db.NText + _char String @db.Char(10) + _nchar String @db.NChar(10) + _varchar String @db.VarChar(10) + _nvarChar String @db.NVarChar(10) + _catalogSingleChar String @db.CatalogSingleChar + _tinyText String @db.TinyText + _mediumText String @db.MediumText + _longText String @db.LongText + _bit String @db.Bit + _bit1 String @db.Bit(1) + _varbit String @db.VarBit + _varbit1 String @db.VarBit(1) + _uuid String @db.Uuid + _uniqueIdentifier String @db.UniqueIdentifier + _xml String @db.Xml + _inet String @db.Inet + _citext String @db.Citext + } + + model _Boolean { + _bit Boolean @db.Bit + _bit1 Boolean @db.Bit(1) + _tinyInt Boolean @db.TinyInt + _tinyInt1 Boolean @db.TinyInt(1) + } + + model _Int { + _integer Int @db.Integer + _smallInt Int @db.SmallInt + _oid Int @db.Oid + _unsignedInt Int @db.UnsignedInt + _unsignedSmallInt Int @db.UnsignedSmallInt + _mediumInt Int @db.MediumInt + _unsignedMediumInt Int @db.UnsignedMediumInt + _unsignedTinyInt Int @db.UnsignedTinyInt + _year Int @db.Year + _int4 Int @db.Int4 + _int2 Int @db.Int2 + } + + model _BigInt { + _unsignedBigInt BigInt @db.UnsignedBigInt + _int8 BigInt @db.Int8 + } + + model _FloatDecimal { + _doublePrecision Float @db.DoublePrecision + _real Float @db.Real + _double Float @db.Double + _money Float @db.Money + _money1 Decimal @db.Money + _smallMoney Float @db.SmallMoney + _float8 Float @db.Float8 + _float4 Float @db.Float4 + } + + model _DateTime { + _dateTime2 DateTime @db.DateTime2 + _smallDateTime DateTime @db.SmallDateTime + _dateTimeOffset DateTime @db.DateTimeOffset + _timestamp DateTime @db.Timestamp + _timestamp1 DateTime @db.Timestamp(1) + _timestamptz DateTime @db.Timestamptz + _timestamptz1 DateTime @db.Timestamptz(1) + _date DateTime @db.Date + _time DateTime @db.Time + _time1 DateTime @db.Time(1) + _timetz DateTime @db.Timetz + _timetz1 DateTime @db.Timetz(1) + } + + model _Json { + _jsonb Json @db.JsonB + } + + model _Bytes { + _byteA Bytes @db.ByteA + _longBlob Bytes @db.LongBlob + _binary Bytes @db.Binary + _varBinary Bytes @db.VarBinary + _tinyBlob Bytes @db.TinyBlob + _blob Bytes @db.Blob + _mediumBlob Bytes @db.MediumBlob + _image Bytes @db.Image + } + `); + }); + it('attribute function coverage', async () => { await loadModel(` ${prelude} diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 6e70a5d88..aedc1e296 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/sdk", - "version": "1.0.0-alpha.55", + "version": "1.0.0-alpha.56", "description": "ZenStack plugin development SDK", "main": "index.js", "scripts": { diff --git a/packages/testtools/package.json b/packages/testtools/package.json index c9afdabdd..5596475fd 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/testtools", - "version": "1.0.0-alpha.55", + "version": "1.0.0-alpha.56", "description": "ZenStack Test Tools", "main": "index.js", "publishConfig": { diff --git a/tests/integration/test-run/package-lock.json b/tests/integration/test-run/package-lock.json index 74c9c5c8b..d42fea66a 100644 --- a/tests/integration/test-run/package-lock.json +++ b/tests/integration/test-run/package-lock.json @@ -126,7 +126,7 @@ }, "../../../packages/runtime/dist": { "name": "@zenstackhq/runtime", - "version": "1.0.0-alpha.55", + "version": "1.0.0-alpha.56", "license": "MIT", "dependencies": { "@types/bcryptjs": "^2.4.2", From c9edd27285478857cfd75448189aa084ea631904 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 6 Mar 2023 11:58:22 +0800 Subject: [PATCH 2/2] fix token precedence --- packages/language/src/generated/grammar.ts | 22 ++++++++++++---- packages/language/src/zmodel.langium | 5 ++-- packages/schema/src/res/stdlib.zmodel | 26 +++++++------------ .../validation/attribute-validation.test.ts | 10 +++++++ 4 files changed, 39 insertions(+), 24 deletions(-) diff --git a/packages/language/src/generated/grammar.ts b/packages/language/src/generated/grammar.ts index 52caebc1b..93a60d292 100644 --- a/packages/language/src/generated/grammar.ts +++ b/packages/language/src/generated/grammar.ts @@ -2035,11 +2035,23 @@ export const ZModelGrammar = (): Grammar => loadedZModelGrammar ?? (loadedZModel "value": "." }, { - "$type": "RuleCall", - "rule": { - "$ref": "#/rules@53" - }, - "arguments": [] + "$type": "Alternatives", + "elements": [ + { + "$type": "RuleCall", + "rule": { + "$ref": "#/rules@53" + }, + "arguments": [] + }, + { + "$type": "RuleCall", + "rule": { + "$ref": "#/rules@48" + }, + "arguments": [] + } + ] } ], "cardinality": "*" diff --git a/packages/language/src/zmodel.langium b/packages/language/src/zmodel.langium index 267483ec0..e807c942d 100644 --- a/packages/language/src/zmodel.langium +++ b/packages/language/src/zmodel.langium @@ -171,7 +171,8 @@ FunctionParamType: (type=ExpressionType | reference=[TypeDeclaration]) (array?='[' ']')?; QualifiedName returns string: - ID ('.' ID)*; + // TODO: is this the right way to deal with token precedence? + ID ('.' (ID|BuiltinType))*; // attribute-level attribute AttributeAttributeName returns string: @@ -221,7 +222,7 @@ ExpressionType returns string: 'String' | 'Int' | 'Float' | 'Boolean' | 'DateTime' | 'Null' | 'Any'; BuiltinType returns string: - 'String'|'Boolean'|'Int'|'BigInt'|'Float'|'Decimal'|'DateTime'|'Json'|'Bytes'; + 'String' | 'Boolean' | 'Int' | 'BigInt' | 'Float' | 'Decimal' | 'DateTime' | 'Json' | 'Bytes'; hidden terminal WS: /\s+/; terminal BOOLEAN returns boolean: /true|false/; diff --git a/packages/schema/src/res/stdlib.zmodel b/packages/schema/src/res/stdlib.zmodel index a7ec66d3a..07d01c35e 100644 --- a/packages/schema/src/res/stdlib.zmodel +++ b/packages/schema/src/res/stdlib.zmodel @@ -160,8 +160,7 @@ attribute @updatedAt() @@@targetField([DateTimeField]) @@@prisma // String type modifiers -// TODO: deal with keyword conflict -// attribute @db.String(x: Int) @@@targetField([StringField]) @@@prisma +attribute @db.String(_ x: Int?) @@@targetField([StringField]) @@@prisma attribute @db.Text() @@@targetField([StringField]) @@@prisma attribute @db.NText() @@@targetField([StringField]) @@@prisma attribute @db.Char(_ x: Int) @@@targetField([StringField]) @@@prisma @@ -182,17 +181,15 @@ attribute @db.Citext() @@@targetField([StringField]) @@@prisma // Boolean type modifiers -// TODO: deal with keyword conflict -// attribute @db.Boolean() @@@targetField([BooleanField]) @@@prisma +attribute @db.Boolean() @@@targetField([BooleanField]) @@@prisma attribute @db.TinyInt(_ x: Int?) @@@targetField([BooleanField]) @@@prisma attribute @db.Bool() @@@targetField([BooleanField]) @@@prisma // Int type modifiers +attribute @db.Int() @@@targetField([IntField]) @@@prisma attribute @db.Integer() @@@targetField([IntField]) @@@prisma attribute @db.SmallInt() @@@targetField([IntField]) @@@prisma -// TODO: deal with keyword conflict -// attribute @db.Int() @@@targetField([IntField]) @@@prisma attribute @db.Oid() @@@targetField([IntField]) @@@prisma attribute @db.UnsignedInt() @@@targetField([IntField]) @@@prisma attribute @db.UnsignedSmallInt() @@@targetField([IntField]) @@@prisma @@ -205,17 +202,15 @@ attribute @db.Int2() @@@targetField([IntField]) @@@prisma // BigInt type modifiers -// TODO: deal with keyword conflict -// attribute @db.BigInt() @@@targetField([BigIntField]) @@@prisma +attribute @db.BigInt() @@@targetField([BigIntField]) @@@prisma attribute @db.UnsignedBigInt() @@@targetField([BigIntField]) @@@prisma attribute @db.Int8() @@@targetField([BigIntField]) @@@prisma // Float/Decimal type modifiers attribute @db.DoublePrecision() @@@targetField([FloatField, DecimalField]) @@@prisma attribute @db.Real() @@@targetField([FloatField, DecimalField]) @@@prisma -// TODO: deal with keyword conflict -// attribute @db.Float() @@@targetField([FloatField, DecimalField]) @@@prisma -// attribute @db.Decimal() @@@targetField([FloatField, DecimalField]) @@@prisma +attribute @db.Float() @@@targetField([FloatField, DecimalField]) @@@prisma +attribute @db.Decimal() @@@targetField([FloatField, DecimalField]) @@@prisma attribute @db.Double() @@@targetField([FloatField, DecimalField]) @@@prisma attribute @db.Money() @@@targetField([FloatField, DecimalField]) @@@prisma attribute @db.SmallMoney() @@@targetField([FloatField, DecimalField]) @@@prisma @@ -224,8 +219,7 @@ attribute @db.Float4() @@@targetField([FloatField, DecimalField]) @@@prisma // DateTime type modifiers -// TODO: deal with keyword conflict -// attribute @db.DateTime(x: Int?) @@@targetField([DateTimeField]) @@@prisma +attribute @db.DateTime(x: Int?) @@@targetField([DateTimeField]) @@@prisma attribute @db.DateTime2() @@@targetField([DateTimeField]) @@@prisma attribute @db.SmallDateTime() @@@targetField([DateTimeField]) @@@prisma attribute @db.DateTimeOffset() @@@targetField([DateTimeField]) @@@prisma @@ -237,14 +231,12 @@ attribute @db.Timetz(_ x: Int?) @@@targetField([DateTimeField]) @@@prisma // Json type modifiers -// TODO: deal with keyword conflict -// attribute @db.Json() @@@targetField([JsonField]) @@@prisma +attribute @db.Json() @@@targetField([JsonField]) @@@prisma attribute @db.JsonB() @@@targetField([JsonField]) @@@prisma // Bytes type modifiers -// TODO: deal with keyword conflict -// attribute @db.Bytes() @@@targetField([BytesField]) @@@prisma +attribute @db.Bytes() @@@targetField([BytesField]) @@@prisma attribute @db.ByteA() @@@targetField([BytesField]) @@@prisma attribute @db.LongBlob() @@@targetField([BytesField]) @@@prisma attribute @db.Binary() @@@targetField([BytesField]) @@@prisma diff --git a/packages/schema/tests/schema/validation/attribute-validation.test.ts b/packages/schema/tests/schema/validation/attribute-validation.test.ts index 38dcbc995..f93cccec1 100644 --- a/packages/schema/tests/schema/validation/attribute-validation.test.ts +++ b/packages/schema/tests/schema/validation/attribute-validation.test.ts @@ -230,6 +230,8 @@ describe('Attribute tests', () => { ${prelude} model _String { + _string String @db.String + _string1 String @db.String(1) _text String @db.Text _ntext String @db.NText _char String @db.Char(10) @@ -252,6 +254,7 @@ describe('Attribute tests', () => { } model _Boolean { + _boolean Boolean @db.Boolean _bit Boolean @db.Bit _bit1 Boolean @db.Bit(1) _tinyInt Boolean @db.TinyInt @@ -259,6 +262,7 @@ describe('Attribute tests', () => { } model _Int { + _int Int @db.Int _integer Int @db.Integer _smallInt Int @db.SmallInt _oid Int @db.Oid @@ -273,11 +277,14 @@ describe('Attribute tests', () => { } model _BigInt { + _bigInt BigInt @db.BigInt _unsignedBigInt BigInt @db.UnsignedBigInt _int8 BigInt @db.Int8 } model _FloatDecimal { + _float Float @db.Float + _decimal Decimal @db.Decimal _doublePrecision Float @db.DoublePrecision _real Float @db.Real _double Float @db.Double @@ -289,6 +296,7 @@ describe('Attribute tests', () => { } model _DateTime { + _dateTime DateTime @db.DateTime _dateTime2 DateTime @db.DateTime2 _smallDateTime DateTime @db.SmallDateTime _dateTimeOffset DateTime @db.DateTimeOffset @@ -304,10 +312,12 @@ describe('Attribute tests', () => { } model _Json { + _json Json @db.Json _jsonb Json @db.JsonB } model _Bytes { + _bytes Bytes @db.Bytes _byteA Bytes @db.ByteA _longBlob Bytes @db.LongBlob _binary Bytes @db.Binary