getTestClient.ts•2.27 kB
import { dmmfToRuntimeDataModel, GetPrismaClientConfig } from '@prisma/client-common'
import { getDMMF } from '@prisma/client-generator-js'
import {
extractPreviewFeatures,
getConfig,
getSchemaWithPath,
parseEnvValue,
printConfigWarnings,
} from '@prisma/internals'
import path from 'path'
import { parse } from 'stacktrace-parser'
import { getPrismaClient } from '../runtime/getPrismaClient'
import { generateInFolder } from './generateInFolder'
//TODO Rename to generateTestClientInMemory
/**
* Returns an in-memory client for testing
*/
export async function getTestClient(schemaDir?: string, printWarnings?: boolean): Promise<any> {
const callSite = path.dirname(require.main?.filename ?? '')
const absSchemaDir = path.resolve(callSite, schemaDir ?? '')
const { schemas: datamodel } = (await getSchemaWithPath(undefined, undefined, { cwd: absSchemaDir }))!
const config = await getConfig({ datamodel })
if (printWarnings) {
printConfigWarnings(config.warnings)
}
const generator = config.generators.find((g) => parseEnvValue(g.provider) === 'prisma-client-js')
const previewFeatures = extractPreviewFeatures(config.generators)
;(global as any).TARGET_BUILD_TYPE = 'client'
const document = await getDMMF({
datamodel,
previewFeatures,
})
const activeProvider = config.datasources[0].activeProvider
const options: GetPrismaClientConfig = {
runtimeDataModel: dmmfToRuntimeDataModel(document.datamodel),
previewFeatures: generator?.previewFeatures ?? [],
clientVersion: '0.0.0',
engineVersion: '0000000000000000000000000000000000000000',
activeProvider,
inlineSchema: datamodel[0][1], // TODO: merge schemas
}
return getPrismaClient(options)
}
/**
* Options of `generateTestClient` function.
*/
type GenerateTestClientOptions = {
/**
* Directory to search for the schema in and generate the client in.
*/
projectDir?: string
}
/**
* Actually generates a test client into ./@prisma/client
*/
export async function generateTestClient({ projectDir }: GenerateTestClientOptions = {}): Promise<any> {
if (!projectDir) {
const callsite = parse(new Error('').stack!)
projectDir = path.dirname(callsite[1].file!)
}
await generateInFolder({
projectDir,
})
}