0.42.0

drizzle-team/drizzle-orm0.42.0Apr 15, 2025by github-actions[bot]

AI Summary

This release primarily fixes a critical issue with duplicate exports in drizzle-orm that caused SyntaxError when importing with custom loaders, and adds TypeScript enum support for pgEnum and mysqlEnum. The update also includes improvements to inArray, PlanetScale driver integration, and a new InferEnum type.

Key Highlights

  • Fixed duplicate exports issue causing SyntaxError when using custom loaders
  • Added TypeScript enum support for pgEnum and mysqlEnum - now accepts both string unions and TS enums
  • inArray now accepts ReadonlyArray as a value
  • Added row type parameter support for @planetscale/database's execute
  • New InferEnum type for better enum inference

New Features

  • Duplicate imports removal - fixed SyntaxError for exports like 'eq' and 'lte'
  • pgEnum and mysqlEnum now accept TypeScript enums with full type inference
  • New InferEnum type for enum inference
  • inArray accepts ReadonlyArray as input parameter
  • Row type parameter passed to @planetscale/database's execute method

Full Release Notes

## Features

### Duplicate imports removal

When importing from `drizzle-orm` using custom loaders, you may encounter issues such as: `SyntaxError: The requested module 'drizzle-orm' does not provide an export named 'eq'`

This issue arose because there were duplicated exports in `drizzle-orm`. To address this, we added a set of tests that checks every file in `drizzle-orm` to ensure all exports are valid. These tests will fail if any new duplicated exports appear.

In this release, we’ve removed all duplicated exports, so you should no longer encounter this issue.

### `pgEnum` and `mysqlEnum` now can accept both strings and TS enums

If you provide a TypeScript enum, all your types will be inferred as that enum - so you can insert and retrieve enum values directly. If you provide a string union, it will work as before.

```ts
enum Test {
  a = 'a',
  b = 'b',
  c = 'c',
}

const tableWithTsEnums = mysqlTable('enums_test_case', {
  id: serial().primaryKey(),
  enum1: mysqlEnum(Test).notNull(),
  enum2: mysqlEnum(Test).default(Test.a),
});

await db.insert(tableWithTsEnums).values([
  { id: 1, enum1: Test.a, enum2: Test.b, enum3: Test.c },
  { id: 2, enum1: Test.a, enum3: Test.c },
  { id: 3, enum1: Test.a },
]);

const res = await db.select().from(tableWithTsEnums);

expect(res).toEqual([
  { id: 1, enum1: 'a', enum2: 'b', enum3: 'c' },
  { id: 2, enum1: 'a', enum2: 'a', enum3: 'c' },
  { id: 3, enum1: 'a', enum2: 'a', enum3: 'b' },
]);
```

## Improvements
- Make `inArray` accept `ReadonlyArray` as a value - thanks @Zamiell
- Pass row type parameter to `@planetscale/database`'s execute - thanks @ayrton
- New `InferEnum` type - thanks @totigm

## Issues closed

- [Add first-class support for TS native enums](https://github.com/drizzle-team/drizzle-orm/issues/332)
- [[FEATURE]: support const enums](https://github.com/drizzle-team/drizzle-orm/issues/2798)
- [[BUG]: SyntaxError: The requested module 'drizzle-orm' does not provide an export named 'lte'](https://github.com/drizzle-team/drizzle-orm/issues/4079)