Need help with kanel?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

kristiandupont
152 Stars 11 Forks MIT License 182 Commits 5 Opened issues

Description

Generate Typescript types from Postgres

Services available

!
?

Need anything else?

Contributors list

# 59,992
C#
realm
.NET
Xamarin
97 commits
# 100,931
Haskell
C#
promise...
Postgre...
1 commit
# 148,100
HTML
statech...
CSS
visuali...
1 commit

Kanel

Generate Typescript types from a live database Introduction to the idea is outlined here.

Works with Postgres databases.

Usage

Install with:

$ npm i -D kanel

or

$ yarn add --dev kanel

To run, make sure you are in a folder that has a

.kanelrc.js
configuration file and that your database is running, and type:
$ npx kanel

or

$ yarn kanel

Configuration

Here is an example configuration file:

const path = require('path');

module.exports = { connection: { host: 'localhost', user: 'postgres', password: 'postgres', database: 'acme', },

preDeleteModelFolder: true,

customTypeMap: { tsvector: 'string', bpchar: 'string', },

schemas: [ { name: 'public', ignore: ['knex_migrations', 'knex_migrations_lock'], modelFolder: path.join(__dirname, 'src', 'models'), }, ], };

The configuration file contains the following fields:

connection
(Required)

This is the database connection object. It follows the

client
constructor in pg. As you will typically want to run Kanel on your development machine, you probably want a simple localhost connection as in the example above.

preDeleteModelFolder

Delete the model folder before generating files? Set this to

true
if you want to make sure that there are no deprecated models in your model folder after running Kanel. Defaults to
false
.

customTypeMap

This allows you to specify (or override) which types to map to. Kanel recognizes the most common types and applies the most likely Typescript type to it, but you might want to override this. This map maps from postgres type to typescript type.

modelHooks

If you need to perform some modification of any or all of the models before writing the files, you can do so with a hook. The

modelHooks
property can be an array of functions that can modify the contents. They should have the following signature:
(lines: string[], src: Model) => string[]
. The first argument is the array of strings that represent the lines in the file. The second is the model as returned from
extract-pg-schema
-- you can see an example here.

modelNominator

A function (

(modelName: string) => string
) that converts a table or view name into an interface name. If, say, you use
snake_casing
for your database entities, but prefer
PascalCasing
for your interfaces, you can give this a function that makes such a conversion (the recase library will help you with this if you want -- see the example folder).

propertyNominator

A function (

(propertyName: string, model: Model) => string
) that converts the name of a column to a property name. The model (table or view) that it belongs to is passed as the second parameter in case you should need it.

initializerNominator

A function (

(givenName: string, modelName: string) => string
) that converts a table or view name into the initializer name. The first parameter is the name that was produced by the model nominator, and the second parameter is the original, unprocessed name. This defaults to a function that appends
Initializer
to the name.

idNominator

A function (

(givenName: string, modelName: string) => string
) that converts a table or view name into the identifier name. The first parameter is the name that was produced by the model nominator, and the second parameter is the original, unprocessed name. This defaults to a function that appends
Id
to the name.

typeHooks

Like the

modelHooks
property, this property can specify a number of hooks to attach to generation of type (enum) files. They have the same signature, only the
src
parameter is a type object.

typeNominator

A function (

(modelName: string) => string
) that converts a custom postgres type (enum) name into a type name.

fileNominator

A function

(givenName: string, originalName: string)
that converts the name of a table, view or type into the corresponding file name. NOTE this should return a string with no
.ts
extension, as it's used in
import
statements as well.

schemas
(Required)

This is an array of schemas to process. These contain the following fields:

schema.name
(Required)

Name of the schema.

schema.modelFolder
(Required)

Folder on disk where the models will be stored. Note that if

preDeleteModelFolder
above is set, this folder will be deleted and recreated when Kanel is run.

schema.ignore

An array of tables and views to ignore. Use this if there are things in your database you don't care to generate models for like migration information etc.

Example

To see an example of the result, check out the /example folder. It uses the Sample Database from www.postgresqltutorial.com.

Kanel will scan tables, views and enum types. It will generate a model type for each table and view. Additionally, it will create an initializer type for tables that aren't tagged

@fixed
in the comment. Initializer types represent the requirements for creating a new row in the table. Columns that are nullable or have default values are considered optional.

Documentation is extracted from postgres comments on your tables, columns etc., as jsdoc. For more info about postgres comments, see: https://www.postgresql.org/docs/9.1/sql-comment.html


We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.