From 5839caf908edcd0b54c9b3791372e3554f06e0df Mon Sep 17 00:00:00 2001 From: Manuel Maute Date: Sat, 28 May 2022 17:14:32 +0200 Subject: [PATCH 1/9] fix: @id always optional for default values --- prisma/schema.prisma | 4 ++-- prisma/typebox/Post.ts | 2 +- prisma/typebox/PostInput.ts | 2 +- prisma/typebox/User.ts | 2 +- prisma/typebox/UserInput.ts | 2 +- prisma/typebox/index.ts | 5 +++++ src/generator/transformDMMF.ts | 4 ++-- 7 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 prisma/typebox/index.ts diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 87477e6..c5318b5 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -28,8 +28,8 @@ model User { } model Post { - id Int @id @default(autoincrement()) - user User? @relation(fields: [userId], references: [id]) + id String @id @default(cuid()) + user User? @relation(fields: [userId], references: [id]) userId Int? } diff --git a/prisma/typebox/Post.ts b/prisma/typebox/Post.ts index a46e9a8..f811ec6 100644 --- a/prisma/typebox/Post.ts +++ b/prisma/typebox/Post.ts @@ -2,7 +2,7 @@ import { Type, Static } from "@sinclair/typebox"; import { Role } from "./Role"; export const Post = Type.Object({ - id: Type.Number(), + id: Type.String(), user: Type.Optional( Type.Object({ id: Type.Number(), diff --git a/prisma/typebox/PostInput.ts b/prisma/typebox/PostInput.ts index 43e96d1..d6c7e99 100644 --- a/prisma/typebox/PostInput.ts +++ b/prisma/typebox/PostInput.ts @@ -2,7 +2,7 @@ import { Type, Static } from "@sinclair/typebox"; import { Role } from "./Role"; export const PostInput = Type.Object({ - id: Type.Optional(Type.Number()), + id: Type.Optional(Type.String()), user: Type.Optional( Type.Object({ id: Type.Optional(Type.Number()), diff --git a/prisma/typebox/User.ts b/prisma/typebox/User.ts index 4b56c55..dbe70a8 100644 --- a/prisma/typebox/User.ts +++ b/prisma/typebox/User.ts @@ -12,7 +12,7 @@ export const User = Type.Object({ role: Type.Optional(Role), posts: Type.Array( Type.Object({ - id: Type.Number(), + id: Type.String(), userId: Type.Optional(Type.Number()), }) ), diff --git a/prisma/typebox/UserInput.ts b/prisma/typebox/UserInput.ts index 702b3bd..cee1d3a 100644 --- a/prisma/typebox/UserInput.ts +++ b/prisma/typebox/UserInput.ts @@ -12,7 +12,7 @@ export const UserInput = Type.Object({ role: Type.Optional(Role), posts: Type.Array( Type.Object({ - id: Type.Optional(Type.Number()), + id: Type.Optional(Type.String()), userId: Type.Optional(Type.Number()), }) ), diff --git a/prisma/typebox/index.ts b/prisma/typebox/index.ts new file mode 100644 index 0000000..b37ac35 --- /dev/null +++ b/prisma/typebox/index.ts @@ -0,0 +1,5 @@ +export * from './User'; +export * from './Post'; +export * from './UserInput'; +export * from './Role'; +export * from './PostInput'; diff --git a/src/generator/transformDMMF.ts b/src/generator/transformDMMF.ts index 919516c..ec0a0e5 100644 --- a/src/generator/transformDMMF.ts +++ b/src/generator/transformDMMF.ts @@ -25,8 +25,8 @@ const transformField = (field: DMMF.Field) => { inputTokens = [...tokens]; - // @id cannot be optional except for input if it's auto increment - if (field.isId && (field?.default as any)?.name === 'autoincrement') { + // @id can be optional for input value if it has a default defined + if (field.isId && (field?.default as any)) { inputTokens.splice(1, 0, 'Type.Optional('); inputTokens.splice(inputTokens.length, 0, ')'); } From 7c8737655b9082b70cb9f6dbbe1c1e45f74e9117 Mon Sep 17 00:00:00 2001 From: Manuel Maute Date: Sat, 28 May 2022 17:22:40 +0200 Subject: [PATCH 2/9] fix: @id always optional for default values --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 8dc9554..4e3ad76 100644 --- a/package.json +++ b/package.json @@ -20,13 +20,13 @@ "typebox", "typebox-generator" ], - "homepage": "https://github.com/adeyahya/prisma-typebox-generator", + "homepage": "https://github.com/jsbrain/prisma-typebox-generator", "repository": { - "url": "https://github.com/adeyahya/prisma-typebox-generator.git" + "url": "https://github.com/jsbrain/prisma-typebox-generator.git" }, "bugs": { "email": "adeyahyaprasetyo@gmail.com", - "url": "https://github.com/adeyahya/prisma-typebox-generator/issues" + "url": "https://github.com/jsbrain/prisma-typebox-generator/issues" }, "dependencies": { "@prisma/generator-helper": "^2.20.1", From 956ddba41f7bde27542658528d1d83b7a4fcb6df Mon Sep 17 00:00:00 2001 From: Manuel Maute Date: Sat, 28 May 2022 17:27:17 +0200 Subject: [PATCH 3/9] fix: @id always optional for default values --- prisma/typebox/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/prisma/typebox/index.ts b/prisma/typebox/index.ts index b37ac35..60eba8a 100644 --- a/prisma/typebox/index.ts +++ b/prisma/typebox/index.ts @@ -1,5 +1,5 @@ export * from './User'; -export * from './Post'; export * from './UserInput'; -export * from './Role'; +export * from './Post'; export * from './PostInput'; +export * from './Role'; From f669cc903cf7b0d8f0e7f9697c2cdb62d02bf547 Mon Sep 17 00:00:00 2001 From: Manuel Maute Date: Sat, 28 May 2022 19:17:58 +0200 Subject: [PATCH 4/9] feat: job creation via api --- package.json | 4 ++-- prisma/schema.prisma | 5 +++-- prisma/typebox/Post.ts | 2 +- prisma/typebox/PostInput.ts | 8 ++++---- prisma/typebox/User.ts | 2 +- prisma/typebox/UserInput.ts | 2 +- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 4e3ad76..fad8041 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "prisma-typebox-generator", - "version": "2.0.2", + "name": "jsbrain-prisma-typebox-generator", + "version": "2.0.3", "main": "dist/index.js", "license": "MIT", "files": [ diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c5318b5..0966274 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -28,8 +28,9 @@ model User { } model Post { - id String @id @default(cuid()) - user User? @relation(fields: [userId], references: [id]) + // id String @id @default(cuid()) + id Int @id @default(autoincrement()) + user User? @relation(fields: [userId], references: [id]) userId Int? } diff --git a/prisma/typebox/Post.ts b/prisma/typebox/Post.ts index f811ec6..a46e9a8 100644 --- a/prisma/typebox/Post.ts +++ b/prisma/typebox/Post.ts @@ -2,7 +2,7 @@ import { Type, Static } from "@sinclair/typebox"; import { Role } from "./Role"; export const Post = Type.Object({ - id: Type.String(), + id: Type.Number(), user: Type.Optional( Type.Object({ id: Type.Number(), diff --git a/prisma/typebox/PostInput.ts b/prisma/typebox/PostInput.ts index d6c7e99..043d9d0 100644 --- a/prisma/typebox/PostInput.ts +++ b/prisma/typebox/PostInput.ts @@ -1,8 +1,8 @@ -import { Type, Static } from "@sinclair/typebox"; -import { Role } from "./Role"; +import { Type, Static } from '@sinclair/typebox'; +import { Role } from './Role'; export const PostInput = Type.Object({ - id: Type.Optional(Type.String()), + id: Type.Optional(Type.Number()), user: Type.Optional( Type.Object({ id: Type.Optional(Type.Number()), @@ -17,7 +17,7 @@ export const PostInput = Type.Object({ biography: Type.String(), decimal: Type.Number(), biginteger: Type.Integer(), - }) + }), ), userId: Type.Optional(Type.Number()), }); diff --git a/prisma/typebox/User.ts b/prisma/typebox/User.ts index dbe70a8..4b56c55 100644 --- a/prisma/typebox/User.ts +++ b/prisma/typebox/User.ts @@ -12,7 +12,7 @@ export const User = Type.Object({ role: Type.Optional(Role), posts: Type.Array( Type.Object({ - id: Type.String(), + id: Type.Number(), userId: Type.Optional(Type.Number()), }) ), diff --git a/prisma/typebox/UserInput.ts b/prisma/typebox/UserInput.ts index cee1d3a..702b3bd 100644 --- a/prisma/typebox/UserInput.ts +++ b/prisma/typebox/UserInput.ts @@ -12,7 +12,7 @@ export const UserInput = Type.Object({ role: Type.Optional(Role), posts: Type.Array( Type.Object({ - id: Type.Optional(Type.String()), + id: Type.Optional(Type.Number()), userId: Type.Optional(Type.Number()), }) ), From 79f8718b2c46c4839224b1c8b7ddeaed9d4e0461 Mon Sep 17 00:00:00 2001 From: Manuel Maute Date: Wed, 2 Nov 2022 17:21:19 +0100 Subject: [PATCH 5/9] feat: add option to exclude relations --- prisma/schema.prisma | 3 ++- prisma/typebox/Post.ts | 17 --------------- prisma/typebox/PostInput.ts | 19 +---------------- prisma/typebox/User.ts | 8 ------- prisma/typebox/UserInput.ts | 8 ------- src/generator/transformDMMF.ts | 39 ++++++++++++++++++++++++++++------ src/index.ts | 2 +- 7 files changed, 37 insertions(+), 59 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 0966274..5f5b183 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -3,7 +3,8 @@ generator client { } generator docs { - provider = "node ./dist/index.js" + provider = "node ./dist/index.js" + includeRelations = false } datasource db { diff --git a/prisma/typebox/Post.ts b/prisma/typebox/Post.ts index a46e9a8..b7c923d 100644 --- a/prisma/typebox/Post.ts +++ b/prisma/typebox/Post.ts @@ -1,24 +1,7 @@ import { Type, Static } from "@sinclair/typebox"; -import { Role } from "./Role"; export const Post = Type.Object({ id: Type.Number(), - user: Type.Optional( - Type.Object({ - id: Type.Number(), - createdAt: Type.Optional(Type.String()), - email: Type.String(), - weight: Type.Optional(Type.Number()), - is18: Type.Optional(Type.Boolean()), - name: Type.Optional(Type.String()), - successorId: Type.Optional(Type.Number()), - role: Type.Optional(Role), - keywords: Type.Array(Type.String()), - biography: Type.String(), - decimal: Type.Number(), - biginteger: Type.Integer(), - }) - ), userId: Type.Optional(Type.Number()), }); diff --git a/prisma/typebox/PostInput.ts b/prisma/typebox/PostInput.ts index 043d9d0..7e7647a 100644 --- a/prisma/typebox/PostInput.ts +++ b/prisma/typebox/PostInput.ts @@ -1,24 +1,7 @@ -import { Type, Static } from '@sinclair/typebox'; -import { Role } from './Role'; +import { Type, Static } from "@sinclair/typebox"; export const PostInput = Type.Object({ id: Type.Optional(Type.Number()), - user: Type.Optional( - Type.Object({ - id: Type.Optional(Type.Number()), - createdAt: Type.Optional(Type.String()), - email: Type.String(), - weight: Type.Optional(Type.Number()), - is18: Type.Optional(Type.Boolean()), - name: Type.Optional(Type.String()), - successorId: Type.Optional(Type.Number()), - role: Type.Optional(Role), - keywords: Type.Array(Type.String()), - biography: Type.String(), - decimal: Type.Number(), - biginteger: Type.Integer(), - }), - ), userId: Type.Optional(Type.Number()), }); diff --git a/prisma/typebox/User.ts b/prisma/typebox/User.ts index 4b56c55..4bc0084 100644 --- a/prisma/typebox/User.ts +++ b/prisma/typebox/User.ts @@ -1,5 +1,4 @@ import { Type, Static } from "@sinclair/typebox"; -import { Role } from "./Role"; export const User = Type.Object({ id: Type.Number(), @@ -9,13 +8,6 @@ export const User = Type.Object({ is18: Type.Optional(Type.Boolean()), name: Type.Optional(Type.String()), successorId: Type.Optional(Type.Number()), - role: Type.Optional(Role), - posts: Type.Array( - Type.Object({ - id: Type.Number(), - userId: Type.Optional(Type.Number()), - }) - ), keywords: Type.Array(Type.String()), biography: Type.String(), decimal: Type.Number(), diff --git a/prisma/typebox/UserInput.ts b/prisma/typebox/UserInput.ts index 702b3bd..14554fa 100644 --- a/prisma/typebox/UserInput.ts +++ b/prisma/typebox/UserInput.ts @@ -1,5 +1,4 @@ import { Type, Static } from "@sinclair/typebox"; -import { Role } from "./Role"; export const UserInput = Type.Object({ id: Type.Optional(Type.Number()), @@ -9,13 +8,6 @@ export const UserInput = Type.Object({ is18: Type.Optional(Type.Boolean()), name: Type.Optional(Type.String()), successorId: Type.Optional(Type.Number()), - role: Type.Optional(Role), - posts: Type.Array( - Type.Object({ - id: Type.Optional(Type.Number()), - userId: Type.Optional(Type.Number()), - }) - ), keywords: Type.Array(Type.String()), biography: Type.String(), decimal: Type.Number(), diff --git a/src/generator/transformDMMF.ts b/src/generator/transformDMMF.ts index ec0a0e5..8e8dc8a 100644 --- a/src/generator/transformDMMF.ts +++ b/src/generator/transformDMMF.ts @@ -1,5 +1,9 @@ import type { DMMF } from '@prisma/generator-helper'; +type TransformDMMFOptions = { + includeRelations?: 'true' | 'false'; +}; + const transformField = (field: DMMF.Field) => { const tokens = [field.name + ':']; let inputTokens = []; @@ -45,14 +49,23 @@ const transformField = (field: DMMF.Field) => { }; }; -const transformFields = (fields: DMMF.Field[]) => { +const transformFields = ( + fields: DMMF.Field[], + config: TransformDMMFOptions, +) => { let dependencies = new Set(); const _fields: string[] = []; const _inputFields: string[] = []; fields.map(transformField).forEach((field) => { + // TODO: Remove and add raw models as separate files. + if (field.deps.size > 0 && config.includeRelations === 'false') { + return; + } + _fields.push(field.str); _inputFields.push(field.strInput); + [...field.deps].forEach((d) => { dependencies.add(d); }); @@ -65,8 +78,12 @@ const transformFields = (fields: DMMF.Field[]) => { }; }; -const transformModel = (model: DMMF.Model, models?: DMMF.Model[]) => { - const fields = transformFields(model.fields); +const transformModel = ( + config: TransformDMMFOptions, + model: DMMF.Model, + models?: DMMF.Model[], +) => { + const fields = transformFields(model.fields, config); let raw = [ `${models ? '' : `export const ${model.name} = `}Type.Object({\n\t`, fields.rawString, @@ -108,7 +125,17 @@ export const transformEnum = (enm: DMMF.DatamodelEnum) => { ].join('\n'); }; -export function transformDMMF(dmmf: DMMF.Document) { +export function transformDMMF( + dmmf: DMMF.Document, + _config: TransformDMMFOptions, +) { + const { includeRelations = 'true' } = _config; + + // Set default config! + const config: TransformDMMFOptions = { + includeRelations, + }; + const { models, enums } = dmmf.datamodel; const importStatements = new Set([ 'import {Type, Static} from "@sinclair/typebox"', @@ -116,12 +143,12 @@ export function transformDMMF(dmmf: DMMF.Document) { return [ ...models.map((model) => { - let { raw, inputRaw, deps } = transformModel(model); + let { raw, inputRaw, deps } = transformModel(config, model); [...deps].forEach((d) => { const depsModel = models.find((m) => m.name === d) as DMMF.Model; if (depsModel) { - const replacer = transformModel(depsModel, models); + const replacer = transformModel(config, depsModel, models); const re = new RegExp(`::${d}::`, 'gm'); raw = raw.replace(re, replacer.raw); inputRaw = inputRaw.replace(re, replacer.inputRaw); diff --git a/src/index.ts b/src/index.ts index 4a7e2e5..8bb3a2f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,7 +13,7 @@ generatorHandler({ }; }, async onGenerate(options) { - const payload = transformDMMF(options.dmmf); + const payload = transformDMMF(options.dmmf, options.generator.config); if (options.generator.output) { const outputDir = // This ensures previous version of prisma are still supported From 9c730a172bb88796834fb1537556f5ec535ed32a Mon Sep 17 00:00:00 2001 From: Manuel Maute Date: Wed, 2 Nov 2022 17:22:56 +0100 Subject: [PATCH 6/9] chore: update deps --- package.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index fad8041..189c73f 100644 --- a/package.json +++ b/package.json @@ -29,35 +29,35 @@ "url": "https://github.com/jsbrain/prisma-typebox-generator/issues" }, "dependencies": { - "@prisma/generator-helper": "^2.20.1", - "@prisma/sdk": "^2.20.1", + "@prisma/generator-helper": "^4.5.0", + "@prisma/sdk": "^4.0.0", "core-js": "3.10.0", - "prettier": "^2.3.0" + "prettier": "^2.7.1" }, "devDependencies": { "@babel/cli": "^7.13.14", "@babel/core": "^7.13.14", "@babel/preset-env": "^7.13.12", "@babel/preset-typescript": "^7.13.0", - "@prisma/client": "^2.20.1", + "@prisma/client": "^4.5.0", "@semantic-release/changelog": "^5.0.1", "@semantic-release/commit-analyzer": "^8.0.1", "@semantic-release/git": "^9.0.0", "@semantic-release/github": "^7.2.0", "@semantic-release/npm": "^7.1.0", "@semantic-release/release-notes-generator": "^9.0.2", - "@sinclair/typebox": "^0.16.7", + "@sinclair/typebox": "^0.25.2", "@types/jest": "26.0.22", "@types/node": "^14.14.37", - "ajv": "^8.0.5", - "ajv-formats": "^2.0.2", + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", "babel-jest": "^26.6.3", "jest": "26.6.3", - "prisma": "^2.20.1", + "prisma": "^4.5.0", "semantic-release": "^17.4.2", "ts-jest": "^26.5.4", "ts-node": "^9.1.1", - "typescript": "^4.2.3" + "typescript": "^4.8.4" }, "scripts": { "generate": "prisma generate", From 596b4f73b5d95530a6e0800dbaf357dfd6fb33df Mon Sep 17 00:00:00 2001 From: Manuel Maute Date: Wed, 2 Nov 2022 17:58:50 +0100 Subject: [PATCH 7/9] chore: update readme --- README.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 67b33b5..abd931d 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,8 @@ yarn add -D prisma-typebox-generator ```prisma generator typebox { provider = "prisma-typebox-generator" + // Optionally exclude relations from the generated types + includeRelations = false // default: true } ``` diff --git a/package.json b/package.json index 189c73f..5da79b2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsbrain-prisma-typebox-generator", - "version": "2.0.3", + "version": "2.0.4", "main": "dist/index.js", "license": "MIT", "files": [ From a835170e9516e29ab702ea08cfa134584228c62e Mon Sep 17 00:00:00 2001 From: Manuel Maute Date: Wed, 2 Nov 2022 18:13:07 +0100 Subject: [PATCH 8/9] feat: add prefix option --- README.md | 2 ++ package.json | 2 +- prisma/schema.prisma | 1 + prisma/typebox/Post.ts | 4 +-- prisma/typebox/PostInput.ts | 4 +-- prisma/typebox/Role.ts | 6 ++-- prisma/typebox/User.ts | 4 +-- prisma/typebox/UserInput.ts | 4 +-- prisma/typebox/index.ts | 4 +-- src/generator/transformDMMF.ts | 58 ++++++++++++++++++++++++++++------ 10 files changed, 65 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index abd931d..2fbf797 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,8 @@ generator typebox { provider = "prisma-typebox-generator" // Optionally exclude relations from the generated types includeRelations = false // default: true + // Optionally prefix all types with a string + prefix = "tbx_" // default: "" } ``` diff --git a/package.json b/package.json index 5da79b2..e63ffea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsbrain-prisma-typebox-generator", - "version": "2.0.4", + "version": "2.0.5", "main": "dist/index.js", "license": "MIT", "files": [ diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5f5b183..e21c264 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -5,6 +5,7 @@ generator client { generator docs { provider = "node ./dist/index.js" includeRelations = false + prefix = "tbx_" } datasource db { diff --git a/prisma/typebox/Post.ts b/prisma/typebox/Post.ts index b7c923d..b7e146a 100644 --- a/prisma/typebox/Post.ts +++ b/prisma/typebox/Post.ts @@ -1,8 +1,8 @@ import { Type, Static } from "@sinclair/typebox"; -export const Post = Type.Object({ +export const tbx_Post = Type.Object({ id: Type.Number(), userId: Type.Optional(Type.Number()), }); -export type PostType = Static; +export type tbx_PostType = Static; diff --git a/prisma/typebox/PostInput.ts b/prisma/typebox/PostInput.ts index 7e7647a..6dfc88e 100644 --- a/prisma/typebox/PostInput.ts +++ b/prisma/typebox/PostInput.ts @@ -1,8 +1,8 @@ import { Type, Static } from "@sinclair/typebox"; -export const PostInput = Type.Object({ +export const tbx_PostInput = Type.Object({ id: Type.Optional(Type.Number()), userId: Type.Optional(Type.Number()), }); -export type PostInputType = Static; +export type tbx_PostInputType = Static; diff --git a/prisma/typebox/Role.ts b/prisma/typebox/Role.ts index ca45732..6ee7189 100644 --- a/prisma/typebox/Role.ts +++ b/prisma/typebox/Role.ts @@ -1,10 +1,10 @@ import { Type, Static } from "@sinclair/typebox"; -export const RoleConst = { +export const tbx_RoleConst = { USER: Type.Literal("USER"), ADMIN: Type.Literal("ADMIN"), }; -export const Role = Type.KeyOf(Type.Object(RoleConst)); +export const tbx_Role = Type.KeyOf(Type.Object(tbx_RoleConst)); -export type RoleType = Static; +export type tbx_RoleType = Static; diff --git a/prisma/typebox/User.ts b/prisma/typebox/User.ts index 4bc0084..aad15b0 100644 --- a/prisma/typebox/User.ts +++ b/prisma/typebox/User.ts @@ -1,6 +1,6 @@ import { Type, Static } from "@sinclair/typebox"; -export const User = Type.Object({ +export const tbx_User = Type.Object({ id: Type.Number(), createdAt: Type.Optional(Type.String()), email: Type.String(), @@ -14,4 +14,4 @@ export const User = Type.Object({ biginteger: Type.Integer(), }); -export type UserType = Static; +export type tbx_UserType = Static; diff --git a/prisma/typebox/UserInput.ts b/prisma/typebox/UserInput.ts index 14554fa..eaa8e3c 100644 --- a/prisma/typebox/UserInput.ts +++ b/prisma/typebox/UserInput.ts @@ -1,6 +1,6 @@ import { Type, Static } from "@sinclair/typebox"; -export const UserInput = Type.Object({ +export const tbx_UserInput = Type.Object({ id: Type.Optional(Type.Number()), createdAt: Type.Optional(Type.String()), email: Type.String(), @@ -14,4 +14,4 @@ export const UserInput = Type.Object({ biginteger: Type.Integer(), }); -export type UserInputType = Static; +export type tbx_UserInputType = Static; diff --git a/prisma/typebox/index.ts b/prisma/typebox/index.ts index 60eba8a..b72157c 100644 --- a/prisma/typebox/index.ts +++ b/prisma/typebox/index.ts @@ -1,5 +1,5 @@ -export * from './User'; -export * from './UserInput'; export * from './Post'; export * from './PostInput'; +export * from './UserInput'; export * from './Role'; +export * from './User'; diff --git a/src/generator/transformDMMF.ts b/src/generator/transformDMMF.ts index 8e8dc8a..f3d0e11 100644 --- a/src/generator/transformDMMF.ts +++ b/src/generator/transformDMMF.ts @@ -1,9 +1,17 @@ import type { DMMF } from '@prisma/generator-helper'; type TransformDMMFOptions = { + prefix?: string; includeRelations?: 'true' | 'false'; }; +function prefixName(name: string, prefix?: string) { + if (prefix) { + return `${prefix}${name}`; + } + return name; +} + const transformField = (field: DMMF.Field) => { const tokens = [field.name + ':']; let inputTokens = []; @@ -85,12 +93,18 @@ const transformModel = ( ) => { const fields = transformFields(model.fields, config); let raw = [ - `${models ? '' : `export const ${model.name} = `}Type.Object({\n\t`, + `${ + models ? '' : `export const ${prefixName(model.name, config.prefix)} = ` + }Type.Object({\n\t`, fields.rawString, '})', ].join('\n'); let inputRaw = [ - `${models ? '' : `export const ${model.name}Input = `}Type.Object({\n\t`, + `${ + models + ? '' + : `export const ${prefixName(model.name, config.prefix)}Input = ` + }Type.Object({\n\t`, fields.rawInputString, '})', ].join('\n'); @@ -111,17 +125,29 @@ const transformModel = ( }; }; -export const transformEnum = (enm: DMMF.DatamodelEnum) => { +export const transformEnum = ( + enm: DMMF.DatamodelEnum, + config: TransformDMMFOptions, +) => { const values = enm.values .map((v) => `${v.name}: Type.Literal('${v.name}'),\n`) .join(''); return [ - `export const ${enm.name}Const = {`, + `export const ${prefixName(enm.name, config.prefix)}Const = {`, values, '}\n', - `export const ${enm.name} = Type.KeyOf(Type.Object(${enm.name}Const))\n`, - `export type ${enm.name}Type = Static`, + `export const ${prefixName( + enm.name, + config.prefix, + )} = Type.KeyOf(Type.Object(${prefixName( + enm.name, + config.prefix, + )}Const))\n`, + `export type ${prefixName( + enm.name, + config.prefix, + )}Type = Static`, ].join('\n'); }; @@ -129,11 +155,12 @@ export function transformDMMF( dmmf: DMMF.Document, _config: TransformDMMFOptions, ) { - const { includeRelations = 'true' } = _config; + const { includeRelations = 'true', prefix = undefined } = _config; // Set default config! const config: TransformDMMFOptions = { includeRelations, + prefix, }; const { models, enums } = dmmf.datamodel; @@ -165,16 +192,27 @@ export function transformDMMF( }); return { + // TODO: Add prefix to file names as well? + // name: prefixName(model.name, config.prefix), name: model.name, rawString: [ [...importStatements].join('\n'), raw, - `export type ${model.name}Type = Static`, + `export type ${prefixName( + model.name, + config.prefix, + )}Type = Static`, ].join('\n\n'), inputRawString: [ [...importStatements].join('\n'), inputRaw, - `export type ${model.name}InputType = Static`, + `export type ${prefixName( + model.name, + config.prefix, + )}InputType = Static`, ].join('\n\n'), }; }), @@ -184,7 +222,7 @@ export function transformDMMF( inputRawString: null, rawString: 'import {Type, Static} from "@sinclair/typebox"\n\n' + - transformEnum(enm), + transformEnum(enm, config), }; }), ]; From 404fb17925e9bb20d9ddd22927316ac98a46f3e7 Mon Sep 17 00:00:00 2001 From: Manuel Maute Date: Wed, 2 Nov 2022 19:12:15 +0100 Subject: [PATCH 9/9] fix: enum imports --- package.json | 2 +- prisma/typebox/Post.ts | 1 + prisma/typebox/PostInput.ts | 1 + prisma/typebox/User.ts | 2 ++ prisma/typebox/UserInput.ts | 2 ++ prisma/typebox/index.ts | 4 ++-- src/generator/transformDMMF.ts | 18 ++++++++++++++---- 7 files changed, 23 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index e63ffea..1151ff0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jsbrain-prisma-typebox-generator", - "version": "2.0.5", + "version": "2.0.6", "main": "dist/index.js", "license": "MIT", "files": [ diff --git a/prisma/typebox/Post.ts b/prisma/typebox/Post.ts index b7e146a..feb11b4 100644 --- a/prisma/typebox/Post.ts +++ b/prisma/typebox/Post.ts @@ -1,4 +1,5 @@ import { Type, Static } from "@sinclair/typebox"; +import { tbx_Role } from "./Role"; export const tbx_Post = Type.Object({ id: Type.Number(), diff --git a/prisma/typebox/PostInput.ts b/prisma/typebox/PostInput.ts index 6dfc88e..97ed9b1 100644 --- a/prisma/typebox/PostInput.ts +++ b/prisma/typebox/PostInput.ts @@ -1,4 +1,5 @@ import { Type, Static } from "@sinclair/typebox"; +import { tbx_Role } from "./Role"; export const tbx_PostInput = Type.Object({ id: Type.Optional(Type.Number()), diff --git a/prisma/typebox/User.ts b/prisma/typebox/User.ts index aad15b0..128cf91 100644 --- a/prisma/typebox/User.ts +++ b/prisma/typebox/User.ts @@ -1,4 +1,5 @@ import { Type, Static } from "@sinclair/typebox"; +import { tbx_Role } from "./Role"; export const tbx_User = Type.Object({ id: Type.Number(), @@ -8,6 +9,7 @@ export const tbx_User = Type.Object({ is18: Type.Optional(Type.Boolean()), name: Type.Optional(Type.String()), successorId: Type.Optional(Type.Number()), + role: Type.Optional(tbx_Role), keywords: Type.Array(Type.String()), biography: Type.String(), decimal: Type.Number(), diff --git a/prisma/typebox/UserInput.ts b/prisma/typebox/UserInput.ts index eaa8e3c..40c328c 100644 --- a/prisma/typebox/UserInput.ts +++ b/prisma/typebox/UserInput.ts @@ -1,4 +1,5 @@ import { Type, Static } from "@sinclair/typebox"; +import { tbx_Role } from "./Role"; export const tbx_UserInput = Type.Object({ id: Type.Optional(Type.Number()), @@ -8,6 +9,7 @@ export const tbx_UserInput = Type.Object({ is18: Type.Optional(Type.Boolean()), name: Type.Optional(Type.String()), successorId: Type.Optional(Type.Number()), + role: Type.Optional(tbx_Role), keywords: Type.Array(Type.String()), biography: Type.String(), decimal: Type.Number(), diff --git a/prisma/typebox/index.ts b/prisma/typebox/index.ts index b72157c..9005f99 100644 --- a/prisma/typebox/index.ts +++ b/prisma/typebox/index.ts @@ -1,5 +1,5 @@ +export * from './User'; export * from './Post'; -export * from './PostInput'; export * from './UserInput'; +export * from './PostInput'; export * from './Role'; -export * from './User'; diff --git a/src/generator/transformDMMF.ts b/src/generator/transformDMMF.ts index f3d0e11..80250c3 100644 --- a/src/generator/transformDMMF.ts +++ b/src/generator/transformDMMF.ts @@ -54,6 +54,7 @@ const transformField = (field: DMMF.Field) => { str: tokens.join(' ').concat('\n'), strInput: inputTokens.join(' ').concat('\n'), deps, + original: field, }; }; @@ -67,7 +68,12 @@ const transformFields = ( fields.map(transformField).forEach((field) => { // TODO: Remove and add raw models as separate files. - if (field.deps.size > 0 && config.includeRelations === 'false') { + if ( + field.deps.size > 0 && + config.includeRelations === 'false' && + // Check if the field is a relation, so we'll still include enums. + !!field.original.relationName + ) { return; } @@ -185,9 +191,13 @@ export function transformDMMF( enums.forEach((enm) => { const re = new RegExp(`::${enm.name}::`, 'gm'); if (raw.match(re)) { - raw = raw.replace(re, enm.name); - inputRaw = inputRaw.replace(re, enm.name); - importStatements.add(`import { ${enm.name} } from './${enm.name}'`); + raw = raw.replace(re, prefixName(enm.name, config.prefix)); + inputRaw = inputRaw.replace(re, prefixName(enm.name, config.prefix)); + importStatements.add( + `import { ${prefixName(enm.name, config.prefix)} } from './${ + enm.name + }'`, + ); } });