Skip to content

Commit

Permalink
refactor & fix
Browse files Browse the repository at this point in the history
  • Loading branch information
Jolg42 committed Apr 26, 2024
1 parent 0301082 commit 921c86f
Show file tree
Hide file tree
Showing 4 changed files with 158 additions and 155 deletions.
109 changes: 70 additions & 39 deletions packages/cli/src/Init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,27 +20,28 @@ import { match, P } from 'ts-pattern'
import { isError } from 'util'

import { printError } from './utils/prompt/utils/print'
import { getDefaultSchemaModel, getSchemaModelCockroachDb, getSchemaModelMongoDb } from './utils/schemaGenerator'

export const defaultSchema = (props?: {
datasourceProvider?: ConnectorType
generatorProvider?: string
previewFeatures?: string[]
output?: string
withModel?: boolean
}) => {
const {
datasourceProvider = 'postgresql',
generatorProvider = defaultGeneratorProvider,
previewFeatures = defaultPreviewFeatures,
output = defaultOutput,
withModel = false,
} = props || {}

const aboutAccelerate = `\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n`

const isProviderCompatibleWithAccelerate = datasourceProvider !== 'sqlite'

return `// This is your Prisma schema file,
let schema = `// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
${isProviderCompatibleWithAccelerate ? aboutAccelerate : ''}
generator client {
Expand All @@ -56,17 +57,40 @@ datasource db {
url = env("DATABASE_URL")
}
`
}

export const withModelSchema = (provider: ConnectorType = 'postgresql') => {
switch (provider) {
case 'mongodb':
return getSchemaModelMongoDb(provider)
case 'cockroachdb':
return getSchemaModelCockroachDb(provider)
default:
return getDefaultSchemaModel(provider)
// We add a model to the schema file if the user passed the --with-model flag
if (withModel) {
const defaultAttributes = `email String @unique
name String?`

switch (datasourceProvider) {
case 'mongodb':
schema += `
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
${defaultAttributes}
}
`
break
case 'cockroachdb':
schema += `
model User {
id BigInt @id @default(sequence())
${defaultAttributes}
}
`
break
default:
schema += `
model User {
id Int @id @default(autoincrement())
${defaultAttributes}
}
`
}
}

return schema
}

export const defaultEnv = (
Expand All @@ -84,8 +108,8 @@ export const defaultEnv = (
return env
}

export const defaultPort = (provider: ConnectorType) => {
switch (provider) {
export const defaultPort = (datasourceProvider: ConnectorType) => {
switch (datasourceProvider) {
case 'mysql':
return 3306
case 'sqlserver':
Expand All @@ -101,8 +125,12 @@ export const defaultPort = (provider: ConnectorType) => {
return undefined
}

export const defaultURL = (provider: ConnectorType, port = defaultPort(provider), schema = 'public') => {
switch (provider) {
export const defaultURL = (
datasourceProvider: ConnectorType,
port = defaultPort(datasourceProvider),
schema = 'public',
) => {
switch (datasourceProvider) {
case 'postgresql':
return `postgresql://johndoe:randompassword@localhost:${port}/mydb?schema=${schema}`
case 'cockroachdb':
Expand Down Expand Up @@ -240,22 +268,28 @@ export class Init implements Command {
process.exit(1)
}

const { provider, url } = await match(args)
const { datasourceProvider, url } = await match(args)
.with(
{
'--datasource-provider': P.when((provider): provider is string => Boolean(provider)),
'--datasource-provider': P.when((datasourceProvider): datasourceProvider is string =>
Boolean(datasourceProvider),
),
},
(input) => {
const providerLowercase = input['--datasource-provider'].toLowerCase()
if (!['postgresql', 'mysql', 'sqlserver', 'sqlite', 'mongodb', 'cockroachdb'].includes(providerLowercase)) {
const datasourceProviderLowercase = input['--datasource-provider'].toLowerCase()
if (
!['postgresql', 'mysql', 'sqlserver', 'sqlite', 'mongodb', 'cockroachdb'].includes(
datasourceProviderLowercase,
)
) {
throw new Error(
`Provider "${args['--datasource-provider']}" is invalid or not supported. Try again with "postgresql", "mysql", "sqlite", "sqlserver", "mongodb" or "cockroachdb".`,
)
}
const provider = providerLowercase as ConnectorType
const url = defaultURL(provider)
const datasourceProvider = datasourceProviderLowercase as ConnectorType
const url = defaultURL(datasourceProvider)
return Promise.resolve({
provider,
datasourceProvider,
url,
})
},
Expand All @@ -280,14 +314,14 @@ export class Init implements Command {
}
}

const provider = protocolToConnectorType(`${url.split(':')[0]}:`)
return { provider, url }
const datasourceProvider = protocolToConnectorType(`${url.split(':')[0]}:`)
return { datasourceProvider, url }
},
)
.otherwise(() => {
// Default to PostgreSQL
return Promise.resolve({
provider: 'postgresql' as ConnectorType,
datasourceProvider: 'postgresql' as ConnectorType,
url: undefined,
})
})
Expand All @@ -307,19 +341,16 @@ export class Init implements Command {
fs.mkdirSync(prismaFolder)
}

if (args['--with-model']) {
fs.writeFileSync(path.join(prismaFolder, 'schema.prisma'), withModelSchema(provider))
} else {
fs.writeFileSync(
path.join(prismaFolder, 'schema.prisma'),
defaultSchema({
datasourceProvider: provider,
generatorProvider,
previewFeatures,
output,
}),
)
}
fs.writeFileSync(
path.join(prismaFolder, 'schema.prisma'),
defaultSchema({
datasourceProvider,
generatorProvider,
previewFeatures,
output,
withModel: args['--with-model'],
}),
)

const warnings: string[] = []
const envPath = path.join(outputDir, '.env')
Expand Down Expand Up @@ -356,7 +387,7 @@ export class Init implements Command {

const steps: string[] = []

if (provider === 'mongodb') {
if (datasourceProvider === 'mongodb') {
steps.push(`Define models in the schema.prisma file.`)
} else {
steps.push(
Expand Down
10 changes: 6 additions & 4 deletions packages/cli/src/__tests__/commands/Init.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import fs from 'fs'
import { join } from 'path'
import stripAnsi from 'strip-ansi'

import { defaultEnv, defaultGitIgnore, defaultSchema, withModelSchema } from '../../Init'
import { defaultEnv, defaultGitIgnore, defaultSchema } from '../../Init'

const ctx = jestContext.new().add(jestConsoleContext()).assemble()

Expand Down Expand Up @@ -237,7 +237,7 @@ test('works with --with-model param postgresql', async () => {
expect(stripAnsi(result.stdout)).toMatchSnapshot()

const schema = fs.readFileSync(join(ctx.tmpDir, 'prisma', 'schema.prisma'), 'utf-8')
expect(schema).toMatch(withModelSchema('postgresql'))
expect(schema).toMatch(defaultSchema({ withModel: true, datasourceProvider: 'postgresql' }))
expect(schema).toMatchSnapshot()
})

Expand All @@ -247,7 +247,7 @@ test('works with --with-model param mongodb', async () => {
expect(stripAnsi(result.stdout)).toMatchSnapshot()

const schema = fs.readFileSync(join(ctx.tmpDir, 'prisma', 'schema.prisma'), 'utf-8')
expect(schema).toMatch(withModelSchema('mongodb'))
expect(schema).toMatch(defaultSchema({ withModel: true, datasourceProvider: 'mongodb' }))
expect(schema).toMatchSnapshot()
})

Expand All @@ -257,7 +257,7 @@ test('works with --with-model param cockroachdb', async () => {
expect(stripAnsi(result.stdout)).toMatchSnapshot()

const schema = fs.readFileSync(join(ctx.tmpDir, 'prisma', 'schema.prisma'), 'utf-8')
expect(schema).toMatch(withModelSchema('cockroachdb'))
expect(schema).toMatch(defaultSchema({ withModel: true, datasourceProvider: 'cockroachdb' }))
})

test('works with generator param - `go run github.com/steebchen/prisma-client-go`', async () => {
Expand All @@ -277,6 +277,8 @@ test('works with generator param - `go run github.com/steebchen/prisma-client-go
test('works with preview features - mock test', async () => {
ctx.fixture('init')
const result = await ctx.cli('init', '--preview-feature', 'mock-123')
expect(stripAnsi(result.stdout)).toMatchSnapshot()

const schema = fs.readFileSync(join(ctx.tmpDir, 'prisma', 'schema.prisma'), 'utf-8')
expect(schema).toMatch(
defaultSchema({
Expand Down

0 comments on commit 921c86f

Please sign in to comment.