Generate Typescript types from a live database Introduction to the idea is outlined here.
Works with Postgres databases.
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
Here is an example configuration file:
const path = require('path');
module.exports = {
connection: {
host: 'localhost',
user: 'postgres',
password: 'postgres',
database: 'acme',
},
filenameCasing: 'dash',
typeCasing: 'pascal',
propertyCasing: 'camel',,
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:
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.
Specifies how you like your files cased. Can be any of the recase options: dash
, snake
, camel
or pascal
. Default is pascal
which means your generated files will have filenames that look like this: UserProfile.ts
.
Specifies what the casing of types (interfaces) should be. If left undefined, they will preserve the casing in the database.
Specifies the casing of property names. If left undefined, they will preserve the casing in the database.
Specifies what the casing of your database entities are. This is mostly for edge cases, if left undefined it will typically just work but if you are experiencing trouble, it might help you specifying what the casing of your tables and columns is.
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
.
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.
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.
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.
This is an array of schemas to process. These contain the following fields:
Name of the schema.
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.
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.
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