Skip to content

Commit

Permalink
Merge pull request #12 from modevol-com/drizzle
Browse files Browse the repository at this point in the history
  • Loading branch information
xcfox authored Jan 23, 2025
2 parents 532c1af + 3e6cbcb commit 144efa8
Show file tree
Hide file tree
Showing 40 changed files with 5,815 additions and 214 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Init docker
run: |
docker compose -f docker-compose.yml up -d
- name: Setup pnpm
uses: ./.github/actions/pnpm
- name: Build
Expand Down
28 changes: 28 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
version: '3.8'

services:
mysql:
image: mysql:9.1
container_name: gqloom_mysql
restart: unless-stopped
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: 1
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql

postgres:
image: postgres:17.2
container_name: gqloom_postgres
restart: unless-stopped
environment:
POSTGRES_HOST_AUTH_METHOD: trust
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data

volumes:
mysql_data:
postgres_data:
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
"check": "biome check --write . && pnpm run check:type",
"check:type": "tsc --noEmit",
"build": "pnpm -F '@gqloom/*' run build",
"prepare": "husky"
"prepare": "husky",
"compose-up": "docker compose up -d"
},
"lint-staged": {
"*.{ts,tsx,js,jsx,json}": ["biome check --no-errors-on-unmatched --write"],
Expand Down
19 changes: 9 additions & 10 deletions packages/core/src/utils/loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,15 @@ export type BatchLoadFn<TKey, TData> = (
) => Promise<(TData | Error)[]>

export class EasyDataLoader<TKey, TData> {
protected queue: TKey[]
protected cache: Map<TKey, Promise<TData>>
protected resolvers: Map<
TKey,
[
resolve: (value: TData | PromiseLike<TData>) => void,
reject: (reason?: any) => void,
]
>
constructor(protected readonly batchLoadFn: BatchLoadFn<TKey, TData>) {
this.queue = []
this.cache = new Map()
Expand Down Expand Up @@ -34,16 +43,6 @@ export class EasyDataLoader<TKey, TData> {
this.resolvers.delete(key)
}

protected queue: TKey[]
protected cache: Map<TKey, Promise<TData>>
protected resolvers: Map<
TKey,
[
resolve: (value: TData | PromiseLike<TData>) => void,
reject: (reason?: any) => void,
]
>

protected async executeBatchLoad(): Promise<void> {
if (this.queue.length === 0) return

Expand Down
8 changes: 7 additions & 1 deletion packages/core/src/utils/string.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest"
import { pascalCase } from "./string"
import { capitalize, pascalCase } from "./string"

describe("toPascalCase", () => {
it("should convert kebab-case to PascalCase", () => {
Expand All @@ -26,3 +26,9 @@ describe("toPascalCase", () => {
expect(pascalCase("multiple-words-here")).toBe("MultipleWordsHere")
})
})

describe("capitalize", () => {
it("should capitalize the first letter of a string", () => {
expect(capitalize("hello")).toBe("Hello")
})
})
4 changes: 4 additions & 0 deletions packages/core/src/utils/string.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,7 @@ export function pascalCase(str: string): string {
)
.join("")
}

export function capitalize<T extends string>(str: T): Capitalize<T> {
return (str.slice(0, 1).toUpperCase() + str.slice(1)) as Capitalize<T>
}
2 changes: 2 additions & 0 deletions packages/drizzle/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
test/**/*.db*
.env
11 changes: 11 additions & 0 deletions packages/drizzle/drizzle-mysql.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { defineConfig } from "drizzle-kit"
import { config } from "./env.config"

export default defineConfig({
dialect: "mysql",
schema: "./test/schema/mysql.ts",
dbCredentials: {
url: config.mysqlUrl,
},
tablesFilter: ["drizzle_*"],
})
12 changes: 12 additions & 0 deletions packages/drizzle/drizzle-postgres.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import "dotenv/config"
import { defineConfig } from "drizzle-kit"
import { config } from "./env.config"

export default defineConfig({
dialect: "postgresql",
schema: "./test/schema/postgres.ts",
dbCredentials: {
url: config.postgresUrl,
},
tablesFilter: ["drizzle_*"],
})
9 changes: 9 additions & 0 deletions packages/drizzle/drizzle-sqlite-1.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { defineConfig } from "drizzle-kit"

export default defineConfig({
dialect: "sqlite",
schema: "./test/schema/sqlite.ts",
dbCredentials: {
url: "file:./test/schema/sqlite-1.db",
},
})
9 changes: 9 additions & 0 deletions packages/drizzle/drizzle-sqlite.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { defineConfig } from "drizzle-kit"

export default defineConfig({
dialect: "sqlite",
schema: "./test/schema/sqlite.ts",
dbCredentials: {
url: "file:./test/schema/sqlite.db",
},
})
9 changes: 9 additions & 0 deletions packages/drizzle/env.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import * as dotenv from "dotenv"

dotenv.config({ path: new URL("./.env", import.meta.url) })

export const config = {
mysqlUrl: process.env.MYSQL_URL ?? "mysql://root@localhost:3306/mysql",
postgresUrl:
process.env.POSTGRESQL_URL ?? "postgres://postgres@localhost:5432/postgres",
}
64 changes: 64 additions & 0 deletions packages/drizzle/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
{
"name": "@gqloom/drizzle",
"version": "0.6.0",
"description": "GQLoom integration with Drizzle ORM",
"type": "module",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
".": {
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
},
"require": {
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
}
},
"scripts": {
"build": "tsup",
"push": "drizzle-kit push --config=drizzle-mysql.config.ts && drizzle-kit push --config=drizzle-postgres.config.ts && drizzle-kit push --config=drizzle-sqlite.config.ts && drizzle-kit push --config=drizzle-sqlite-1.config.ts",
"postinstall": "pnpm run push"
},
"files": ["dist"],
"keywords": [
"gqloom",
"graphql",
"schema",
"typescript",
"drizzle",
"drizzle-orm"
],
"author": "xcfox",
"license": "MIT",
"peerDependencies": {
"@gqloom/core": ">= 0.6.0",
"drizzle-orm": ">= 0.38.0",
"graphql": ">= 16.8.0"
},
"devDependencies": {
"@gqloom/core": "workspace:*",
"@libsql/client": "^0.14.0",
"@types/pg": "^8.11.10",
"dotenv": "^16.4.7",
"drizzle-kit": "^0.30.1",
"drizzle-orm": "^0.38.3",
"graphql": "^16.8.1",
"graphql-yoga": "^5.6.0",
"mysql2": "^3.12.0",
"pg": "^8.13.1",
"tsx": "^4.7.2",
"valibot": "1.0.0-beta.12"
},
"homepage": "https://gqloom.dev/",
"repository": {
"type": "git",
"url": "https://github.com/modevol-com/gqloom.git",
"directory": "packages/drizzle"
},
"publishConfig": {
"access": "public"
}
}
34 changes: 34 additions & 0 deletions packages/drizzle/src/helper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import type { Column, SQL } from "drizzle-orm"
import { sql } from "drizzle-orm"

/**
* Creates an IN clause for multiple columns
* Example: (col1, col2) IN ((val1, val2), (val3, val4))
*/
export function inArrayMultiple(
columns: Column[],
values: readonly unknown[][]
): SQL<unknown> {
// Early return for empty values
if (values.length === 0) {
return sql`FALSE`
}
// Create (col1, col2, ...) part
const columnsPart = sql`(${sql.join(
columns.map((c) => sql`${c}`),
sql`, `
)})`

// Create ((val1, val2), (val3, val4), ...) part
const valueTuples = values.map(
(tuple) =>
sql`(${sql.join(
tuple.map((v) => sql`${v}`),
sql`, `
)})`
)
const valuesPart = sql.join(valueTuples, sql`, `)

// Combine into final IN clause
return sql`${columnsPart} IN (${valuesPart})`
}
Loading

0 comments on commit 144efa8

Please sign in to comment.