JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 5129
  • Score
    100M100P100Q132148F
  • License MIT

Generate `effect` schemas from Drizzle ORM schemas

Package Exports

  • @handfish/drizzle-effect

Readme

drizzle-effect npm

npm npm bundle size Discord License
If you know SQL, you know Drizzle ORM

drizzle-effect is a plugin for Drizzle ORM that allows you to generate Effect schemas from Drizzle ORM schemas.

For drizzle version 0.41

Database Insert schema Select schema
PostgreSQL
MySQL
SQLite

Usage

import { pgEnum, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core';
import { createInsertSchema, createSelectSchema } from 'drizzle-effect';
import { Schema } from '@effect/schema';

const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  email: text('email').notNull(),
  role: text('role', { enum: ['admin', 'user'] }).notNull(),
  createdAt: timestamp('created_at').notNull().defaultNow(),
});

// Schema for inserting a user - can be used to validate API requests
const insertUserSchema = createInsertSchema(users);

// Schema for selecting a user - can be used to validate API responses
const selectUserSchema = createSelectSchema(users);

// Overriding the fields
const insertUserSchema = createInsertSchema(users, {
  role: Schema.String,
});

const emailPattern = /[^ .@]+@[^ .@]+\.[^ .@]/;

// Refining the fields - useful if you want to change the fields before they become nullable/optional in the final schema
const insertUserSchema = createInsertSchema(users, {
  id: (schema) => schema.id.pipe(Schema.positive()),
  email: (schema) => schema.email.pipe(Schema.pattern(emailPattern)),
  role: Schema.String,
});

// Usage

const user = Schema.decodeSync(insertUserSchema)({
  name: 'John Doe',
  email: 'johndoe@test.com',
  role: 'admin',
});

// Effect schema type is also inferred from the table schema, so you have full type safety.
// Additionally it is created using `Schema.Struct`, so you can do:
const requestSchema = insertUserSchema.pick('name', 'email');