Skip to content

feat: Add option to install DrizzleORM #31

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 16 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/steps/2.addModules/moduleConfigs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import auth from "./moduleConfigs/auth"
import trpc from "./moduleConfigs/trpc"
import tailwind from "./moduleConfigs/tailwind"
import naiveui from "./moduleConfigs/naiveui"
import drizzle from "./moduleConfigs/drizzle"

export declare interface File {
path: string;
Expand All @@ -28,9 +29,10 @@ export declare interface ModuleConfig {
}

// TODO: Improve files approach: It will fail as soon as the content of a file depends on two dependencies at the same time!
export type Modules = "prisma" | "auth" | "trpc" | "tailwind" | "naiveui"
export type Modules = "prisma" | "drizzle" | "auth" | "trpc" | "tailwind" | "naiveui"
export const moduleConfigs: Record<Modules, ModuleConfig> = {
"prisma": prisma,
"drizzle": drizzle,
"auth": auth,
"trpc": trpc,
"tailwind": tailwind,
Expand Down
123 changes: 123 additions & 0 deletions src/steps/2.addModules/moduleConfigs/drizzle.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import { generateModuleHTMLComponent, generateModuleHTMLSnippet } from "../generateModuleComponents"
import type { ModuleConfig } from "../moduleConfigs"

const drizzleConfig = `import type { Config } from 'drizzle-kit'

export default {
schema: './db/schema.ts',
out: './drizzle',
driver: 'better-sqlite',
dbCredentials: {
url: 'sqlite.db'
}
} satisfies Config
`

const drizzleSchema = `import { sql } from 'drizzle-orm'
import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'

export const users = sqliteTable('users', {
id: integer('id').primaryKey(),
firstName: text('first_name'),
lastName: text('last_name'),
age: integer('age'),
createdAt: text('created_at').default(sql\`CURRENT_TIMESTAMP\`)
})

export type User = typeof users.$inferSelect;
export type InsertUser = typeof users.$inferInsert
`

const drizzleService = `import Database from 'better-sqlite3'
import { drizzle } from 'drizzle-orm/better-sqlite3'
import * as schema from '../../db/schema'

export const sqlite = new Database('sqlite.db')
export const db = drizzle(sqlite, { schema })
`

const drizzleAPIGet = `import { eq } from 'drizzle-orm'
import { db } from './sqlite-service'

export default defineEventHandler(async () => {
try {
const usersResp = await db.query.users.findMany({
where: users => eq(users.firstName, 'Zoey')
})
return usersResp
} catch (e: any) {
throw createError({
statusCode: 400,
statusMessage: e.message
})
}
})
`

const drizzleDemoComponent = `<script lang="ts" setup>
const { data: users } = useFetch('/api/users')
</script>
<template>
${generateModuleHTMLComponent(
"Drizzle ORM",
"If you know SQL, you know Drizzle ORM: Drizzle ORM follows the SQL-like syntax whenever possible, are strongly typed ground up, and fail at compile time, not in runtime.",
"https://orm.drizzle.team/",
`<p>
Drizzle ORM Data from the database, received {{ users?.length || 0 }} records!
</p>`,
"",
).html}
</template>
`

const drizzle: ModuleConfig = {
humanReadableName: "Drizzle ORM",
description: "TypeScript ORM that feels like writing SQL. See more: https://orm.drizzle.team/",
dependencies: [
{
name: "drizzle-orm",
version: "^0.28.6",
isDev: false
},
{
name: "drizzle-kit",
version: "^0.19.13",
isDev: true
},
{
name: "better-sqlite3",
version: "^9.0.0",
isDev: false
},
{
name: "@types/better-sqlite3",
version: "^7.6.5",
isDev: true
},
],
nuxtConfig: {},
files: [{
path: "drizzle.config.ts",
content: drizzleConfig
}, {
path: "db/schema.ts",
content: drizzleSchema
}, {
path: "server/api/sqlite-service.ts",
content: drizzleService
}, {
path: "server/api/users.get.ts",
content: drizzleAPIGet
}, {
path: "components/Welcome/DrizzleDemo.vue",
content: drizzleDemoComponent,
}],
tasksPostInstall: [
"- [ ] Drizzle: Edit your `db/schema.ts` to your liking",
"- [ ] Drizzle: Run `npx drizzle-kit push:sqlite` to sync the schema to your database",
"- [ ] Drizzle: Run `npx drizzle-kit studio` to use the built-in Drizzle Database explorer",
],
indexVue: generateModuleHTMLSnippet("WelcomeDrizzleDemo"),
}

export default drizzle