kanel-kysely
Version:
Kysely extension for Kanel
98 lines (64 loc) • 2.74 kB
Markdown
# Kysely extension for Kanel
Generate [Kysely](https://kysely.dev/) types directly from your Postgres database.
This packages extends [Kanel](https://github.com/kristiandupont/kanel) with some Kysely specific features.
Check ./example/.kanelrc.js for how to customize your schema generation.
```typescript
// @generated
// This file is automatically generated by Kanel. Do not modify manually.
import type { ColumnType, Selectable, Insertable, Updateable } from "kysely";
/** Identifier type for actor */
export type ActorId = number & { __flavor?: "ActorId" };
/** Represents the table public.actor */
export default interface ActorTable {
/** Database type: pg_catalog.int4 */
actor_id: ColumnType<ActorId, ActorId | null, ActorId | null>;
/** Database type: pg_catalog.varchar */
first_name: ColumnType<string, string, string | null>;
/** Database type: pg_catalog.varchar */
last_name: ColumnType<string, string, string | null>;
/** Database type: pg_catalog.timestamp */
last_update: ColumnType<Date, Date | null, Date | null>;
}
export type Actor = Selectable<ActorTable>;
export type NewActor = Insertable<ActorTable>;
export type ActorUpdate = Updateable<ActorTable>;
```
Assuming you already have Kanel installed, add this with
```bash
$ npm i -D kanel-kysely
```
To use it, add it to your `.kanelrc.js` file:
```javascript
const { makeKyselyHook } = require("kanel-kysely");
module.exports = {
// ... your config here.
preRenderHooks: [makeKyselyHook()],
};
```
## Note About Branded IDs
Kanel generates some types with extra guards.
```typescript
/** Identifier type for actor */
export type ActorId = number & { __flavor?: "ActorId" };
```
`{ __flavor?: 'ActorId' }` exists at build time and _not at runtime_. It will prevent you from accidentally passing an incorrect value for the Id.
To pass a string value as primary key or foreign key reference, just add a type assertion for the `<table>Id` generated type.
In cases such as subqueries, the type assertion will happen automatically.
## Usage with `CamelCasePlugin`
If you use Kysely with `CamelCasePlugin` then append `kyselyCamelCaseHook` to `preRenderHooks`:
```ts
const { makeKyselyHook, kyselyCamelCaseHook } = require("kanel-kysely");
module.exports = {
// ... your config here.
preRenderHooks: [makeKyselyHook(), kyselyCamelCaseHook],
};
```
## Type Filter
If you're using Kysely for migrations, you might want to filter the types of the migration tables, such as `kysely_migration` and `kysely_migration_lock`. The `kyselyTypeFilter` will do this for you.
```ts
const { kyselyTypeFilter } = require("kanel-kysely");
module.exports = {
/// ... your config here.
typeFilter: kyselyTypeFilter,
};
```