From a62009aa50c60217a0fed52060675caf188dcd50 Mon Sep 17 00:00:00 2001 From: JYC Date: Mon, 14 Nov 2022 20:25:22 +0100 Subject: [PATCH] Feat/schema (#270) * :sparkles: NEW: feature schema * :pencil2: DOC: changeset * :ok_hand: FIX: lint * :construction: FIX: prettier * :construction: FIX: prettier --- .changeset/real-dingos-kick.md | 5 +++ .prettierignore | 1 + packages/all-in/prisma/schema.prisma | 20 +++++++++++ packages/all-in/src/lib/hooks/graphql.ts | 35 +++++++++++-------- packages/all-in/src/lib/index.ts | 1 + .../all-in/src/lib/modules/_enums/index.ts | 8 +++++ .../_enums/typedefs/ENUM.MyDemoEnum.graphql | 5 +++ .../lib/modules/_enums/ui/lists/MyDemoList.ts | 7 ++++ packages/all-in/src/lib/vite/KitQLVite.ts | 11 +++--- packages/all-in/src/lib/vite/actionEnum.ts | 19 ++++++---- packages/all-in/src/lib/vite/generate.ts | 23 ++++++------ packages/all-in/vite.config.ts | 2 +- 12 files changed, 97 insertions(+), 40 deletions(-) create mode 100644 .changeset/real-dingos-kick.md create mode 100644 packages/all-in/prisma/schema.prisma create mode 100644 packages/all-in/src/lib/modules/_enums/index.ts create mode 100644 packages/all-in/src/lib/modules/_enums/typedefs/ENUM.MyDemoEnum.graphql create mode 100644 packages/all-in/src/lib/modules/_enums/ui/lists/MyDemoList.ts diff --git a/.changeset/real-dingos-kick.md b/.changeset/real-dingos-kick.md new file mode 100644 index 00000000..930e5758 --- /dev/null +++ b/.changeset/real-dingos-kick.md @@ -0,0 +1,5 @@ +--- +'@kitql/all-in': patch +--- + +add schema option to the handler if you don't want to work with modules diff --git a/.prettierignore b/.prettierignore index 7a0c9342..64992334 100644 --- a/.prettierignore +++ b/.prettierignore @@ -14,3 +14,4 @@ README.md $houdini $kitql +packages/all-in/src/lib/modules/_enums/**/* \ No newline at end of file diff --git a/packages/all-in/prisma/schema.prisma b/packages/all-in/prisma/schema.prisma new file mode 100644 index 00000000..cc1800cd --- /dev/null +++ b/packages/all-in/prisma/schema.prisma @@ -0,0 +1,20 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +model test { + id String @id @default(cuid()) + name String + my_demo my_demo_enum +} + +enum my_demo_enum { + ONE + TWO + FOUR +} diff --git a/packages/all-in/src/lib/hooks/graphql.ts b/packages/all-in/src/lib/hooks/graphql.ts index 22f57ae1..4b5101a9 100644 --- a/packages/all-in/src/lib/hooks/graphql.ts +++ b/packages/all-in/src/lib/hooks/graphql.ts @@ -23,6 +23,12 @@ export type KitQLHandleGraphQL( options?: KitQLHandleGraphQL ): Handle { // set defaults - const { graphiQLPath, endpoint, plugins, context } = { + const { graphiQLPath, endpoint, plugins, context, schema } = { graphiQLPath: undefined, endpoint: '/api/graphql', plugins: [], context: () => { return {} as TUserContext }, + schema: createSchema({ + typeDefs: ` + type Query { + _greetings: String + } + `, + resolvers: { + Query: { + _greetings: () => + 'Yes yoga is up and running! Now, to make it work with your own schema, you need to `useKitqlModules(modules)` via plugins', + }, + }, + }), ...options, } @@ -65,19 +84,7 @@ export function handleGraphql( const kitqlServer = createYoga({ logging: true, // will be overwritten by modules - schema: createSchema({ - typeDefs: ` - type Query { - _greetings: String - } - `, - resolvers: { - Query: { - _greetings: () => - 'Yes yoga is up and running! Now, to make it work with your own schema, you need to `useKitqlModules(modules)` via plugins', - }, - }, - }), + schema, context, plugins: kitqlPlugins.concat(plugins || []), graphqlEndpoint: endpoint, diff --git a/packages/all-in/src/lib/index.ts b/packages/all-in/src/lib/index.ts index d84a5f55..28acb96e 100644 --- a/packages/all-in/src/lib/index.ts +++ b/packages/all-in/src/lib/index.ts @@ -30,3 +30,4 @@ export type { KitQLVite } from './vite/KitQLVite.js' // graphql-yoga export type { Plugin as YogaPlugin } from 'graphql-yoga' +export { createSchema } from 'graphql-yoga' diff --git a/packages/all-in/src/lib/modules/_enums/index.ts b/packages/all-in/src/lib/modules/_enums/index.ts new file mode 100644 index 00000000..e513bf13 --- /dev/null +++ b/packages/all-in/src/lib/modules/_enums/index.ts @@ -0,0 +1,8 @@ +import { createModule } from 'graphql-modules' + +import { typeDefs } from './$kitql/typedefs' + +export const _enumsModule = createModule({ + id: 'enums-module', + typeDefs +}) diff --git a/packages/all-in/src/lib/modules/_enums/typedefs/ENUM.MyDemoEnum.graphql b/packages/all-in/src/lib/modules/_enums/typedefs/ENUM.MyDemoEnum.graphql new file mode 100644 index 00000000..5d863b1f --- /dev/null +++ b/packages/all-in/src/lib/modules/_enums/typedefs/ENUM.MyDemoEnum.graphql @@ -0,0 +1,5 @@ +enum MyDemoEnum { + ONE + TWO + FOUR +} diff --git a/packages/all-in/src/lib/modules/_enums/ui/lists/MyDemoList.ts b/packages/all-in/src/lib/modules/_enums/ui/lists/MyDemoList.ts new file mode 100644 index 00000000..0458b2d8 --- /dev/null +++ b/packages/all-in/src/lib/modules/_enums/ui/lists/MyDemoList.ts @@ -0,0 +1,7 @@ +import { type MyDemoEnum } from '$graphql/$kitql/graphqlTypes' + +export const MyDemoList: Record = { + ONE: 'One', + TWO: 'Two', + FOUR: 'Four', +} diff --git a/packages/all-in/src/lib/vite/KitQLVite.ts b/packages/all-in/src/lib/vite/KitQLVite.ts index 642d8128..f5fc2f1a 100644 --- a/packages/all-in/src/lib/vite/KitQLVite.ts +++ b/packages/all-in/src/lib/vite/KitQLVite.ts @@ -1,7 +1,7 @@ -export type TEnumsModuleConfig = { - prismaFile: string - enumsModuleFolder: string -} +// export type TEnumsModuleConfig = { +// prismaFile: string +// enumsModuleFolder: string +// } export type KitQLVite = { projectName?: string @@ -11,7 +11,8 @@ export type KitQLVite = { // importBaseTypesFrom?: string // modules?: string[] - createEnumsModule?: TEnumsModuleConfig | false + prismaFileForEnums?: string | false + // createEnumsModule?: TEnumsModuleConfig | false // mergeModuleTypedefs?: boolean // mergeModuleResolvers?: boolean // mergeContexts?: boolean diff --git a/packages/all-in/src/lib/vite/actionEnum.ts b/packages/all-in/src/lib/vite/actionEnum.ts index 0d588024..6a073e9d 100644 --- a/packages/all-in/src/lib/vite/actionEnum.ts +++ b/packages/all-in/src/lib/vite/actionEnum.ts @@ -9,7 +9,8 @@ export function actionEnum( enumsModuleFolder: string, moduleOutputFolder: string, importBaseTypesFrom: string, - enums: Record + enums: Record, + localDev: boolean ) { // Typedefs createFolderIfNotExists(join(enumsModuleFolder, '_enums')) @@ -38,26 +39,30 @@ export function actionEnum( const keyWOEnum = key.replace('Enum', '') const enumFileData = [] - enumFileData.push(`import { type ${key} } from '${importBaseTypesFrom}';`) + const line1 = `import { type ${key} } from '${importBaseTypesFrom}';` + enumFileData.push(line1) enumFileData.push(``) - enumFileData.push(`export const ${keyWOEnum}List: Record<${key}, string> = {`) + const line2 = `export const ${keyWOEnum}List: Record<${key}, string> = ` + enumFileData.push(`${line2} {`) list.forEach((c, i) => { const isLast = i === list.length - 1 enumFileData.push(`\t${c}: '${toPascalCase(c.toLowerCase())}'${isLast ? '' : ','}`) }) - enumFileData.push(`};`) + enumFileData.push(`}`) enumFileData.push(``) + const filePath = join(enumsModuleFolder, '_enums', 'ui', 'lists', `${keyWOEnum}List.ts`) + // Write this file only if it doesn't exist! // Like this, you can change the value with text that will be displayed in the UI! - if (!existsSync(join(enumsModuleFolder, '_enums', 'ui', 'lists', `${keyWOEnum}List.ts`))) { - write(join(enumsModuleFolder, '_enums', 'ui', 'lists', `${keyWOEnum}List.ts`), enumFileData) + if (!existsSync(filePath)) { + write(filePath, enumFileData) } } // Index const enumFileData = [] - enumFileData.push(`import { createModule } from 'graphql-modules'`) + enumFileData.push(`import { createModule } from ${localDev ? `'graphql-modules'` : `'@kitql/all-in'`}`) enumFileData.push(``) enumFileData.push(`import { typeDefs } from './${moduleOutputFolder}/typedefs'`) enumFileData.push(``) diff --git a/packages/all-in/src/lib/vite/generate.ts b/packages/all-in/src/lib/vite/generate.ts index 73e4b534..e70c78dc 100644 --- a/packages/all-in/src/lib/vite/generate.ts +++ b/packages/all-in/src/lib/vite/generate.ts @@ -42,22 +42,19 @@ export function generate(log: Log, config?: KitQLVite) { } // Enums - if (config?.createEnumsModule) { - const { prismaFile, enumsModuleFolder } = { - prismaFile: '', - enumsModuleFolder: '', - ...config?.createEnumsModule, - } - - const prismaFilePath = getFullPath(prismaFile) - if (readLines(prismaFilePath).length === 0) { - const enums = getPrismaEnum(readLines(prismaFilePath)) - const enumsKeys = actionEnum(enumsModuleFolder, moduleOutputFolder, importBaseTypesFrom, enums) + if (config?.prismaFileForEnums) { + const enumsModuleFolder = './src/lib/modules' + const prismaFilePath = getFullPath(config.prismaFileForEnums) + const prismaFileContent = readLines(prismaFilePath) + + if (prismaFileContent.length !== 0) { + const enums = getPrismaEnum(prismaFileContent) + const enumsKeys = actionEnum(enumsModuleFolder, moduleOutputFolder, importBaseTypesFrom, enums, localDev) meta.enums = enumsKeys.length // log.info(`${logGreen('✔')} ${logGreen('Enums')} created [${enumsKeys.map(c => logGreen(c)).join(',')}]`) } else { - log.error(`${'❌'} file ${logRed(prismaFilePath)} not found!`) - throw new Error(`file ${prismaFilePath} not found!`) + log.error(`file ${logRed(prismaFilePath)} not found!`) + // throw new Error(`file ${prismaFilePath} not found!`) } } diff --git a/packages/all-in/vite.config.ts b/packages/all-in/vite.config.ts index df4cebda..7d2b9966 100644 --- a/packages/all-in/vite.config.ts +++ b/packages/all-in/vite.config.ts @@ -6,7 +6,7 @@ import { kitql } from './src/lib/vite/plugin.js' // import { kitql } from '@kitql/all-in' const config: UserConfig = { - plugins: [kitql({ projectName: 'myPrj', localDev: true }), sveltekit()], + plugins: [kitql({ projectName: 'myPrj', localDev: true, prismaFileForEnums: './prisma/schema.prisma' }), sveltekit()], optimizeDeps: { include: ['safe-stable-stringify'],