npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

psql-schema-ts-compiler

v1.0.0

Published

A simple sql schema to typescript types compiler!

Downloads

9

Readme

Postgres Schema Type Compiler

This is a simple tool that grabs a postgres schema, and attempts to generate compatible typescript types.

NOTE The parser was initially made with the intentions of being able to parse every type of postgresql statement/expression (it wasnt initally made with idea of specializing it specifically with a .sql schema). But since it seems like I wont do that, I may refine it to fit this specific need rather than every. I will probably simplify it much more later on whenever I have time...

Installing

  npm install psql-schema-ts-typegen

Running

  npx compile -p ./path-to-your-schema.sql -m default

Flags

  // the flags below are for mode selection, there is currently two modes: "default" and "kysley"
  // example: -m default
  -m 
  --mode
    
  // the flags below are for targetting your schema file.
  // example: -p ./your-schema.sql
  -p
  --path  

Modes

There is two kinds of modes:

DEFAULT: This mode just tries to compile your schema to a valid typescript type representation.

KYSLEY: This is still a work in progress, but at the momment it automatically sets the defaulted schema columns as Generated.

Examples of the tool in action


CREATE TYPE "authority" AS ENUM ('OWNER', 'ADMINISTRATOR', 'MEMBER', 'CUSTOM');

CREATE TYPE "user_info" AS (
  birthday TIMESTAMP,
  favorite_color VARCHAR(255),
  first_pet_name VARCHAR(255),
  pet_authority "authority"
);

CREATE TABLE "user"(
  id UUID PRIMARY KEY UNIQUE DEFAULT uuid_generate_v4(),
  username VARCHAR(125) NOT NULL UNIQUE,
  password_hash TEXT NOT NULL,
  description TEXT DEFAULT NULL,
  -- expecting url to picture.
  picture TEXT DEFAULT NULL,
  additional_info "user_info" NOT NULL
);

Below is the compiled typescript types:

export type authority =
	"OWNER" |
	"ADMINISTRATOR" |
	"MEMBER" |
	"CUSTOM" 

export interface user_info {
	birthday: Date;
	favorite_color: string;
	first_pet_name: string;
	pet_authority: authority;
};

export interface user {
	id: string;
	username: string;
	password_hash: string;
	description?: string;
	picture?: string;
	additional_info: user_info;
};

Then here is the same schema output but with kysley mode on:

import type { Generated } from "kysley";

export type authority =
	"OWNER" |
	"ADMINISTRATOR" |
	"MEMBER" |
	"CUSTOM" 

export interface user_info {
	birthday: Date;
	favorite_color: string;
	first_pet_name: string;
	pet_authority: authority;
};

export interface user {
	id: Generated<string>;
	username: Generated<string>;
	password_hash: Generated<string>;
	description?: Generated<string>;
	picture?: Generated<string>;
	additional_info: Generated<user_info>;
};

Pretty Cool!

Design

This may be unecessary but I will still add it cos why not, the idea is quite simple.

  1. Lexical Analysis -> Tokens for the SQL parser
  2. Parser -> SQL AST
  3. Transformer -> We transform the SQL AST into a TS-Compat AST
  4. Compiler -> We simply walk over the TS-Compat AST and output our file.