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

relational_modeler

v0.4.0

Published

A language for describing logical relations and generating SQL schemata to enforce them.

Downloads

9

Readme

Try the web interface at: https://blakelapierre.github.io/relational_modeler

Sample Models:

database_name{
  schema_name {
    table_name {
      @primaryKey,
      attribute
    } -> foreign_table

    foreign_table {
      @primaryKey,
      attribute? boolean
    }
  }
}

experiments { @id, inserted_at timestamp } {
  binary {
    coin_flip {
      outcome { 'H', 'T' }
    }
  }

  cats_on_pants {
    cat { name }
    cat_position { position { 'pants1', 'pants2', 'both', 'neither' } } -> cat
  }
}

dist  {
  accounts {
    accounts {key}
  }

  features {
    features {description}
    accounts_features -> accounts.accounts -> features
  }

  billing {
    transaction {amount numeric} -> features.accounts_features
  }
}

dist {@id, inserted_at timestamp} {
  accounts {
    account {key}
  }

  features {
    feature {description, unlocked boolean} -> feature (parent_feature)
    account_feature -> accounts.account -> feature
    feature_cost {cost numeric > 0} -> feature
    feature_schedule {global_unlock_value numeric} -> feature
    feature_progress {contributed_value numeric} -> feature
  }

  transactions {
    transaction -> accounts.account
    transaction_detail {amount numeric} -> transaction
    transaction_account_feature -> features.account_feature -> transaction_detail
  }
}

dist {@id, inserted_at timestamp} {
  accounts {
    account {key}
    account_feature -> account -> features.feature
  }

  features {
    feature {description} -> feature (parent_feature)
    feature_cost {cost numeric} -> !feature
    feature_schedule {global_unlock_value numeric} -> !feature
    feature_progress {contributed_value numeric} -> !feature

    // NOTE: this syntax is not currently available
    feature_unlocked : feature_progress.contributed_value >= feature_schedule.global_unlock_value
  }

  transactions {
    transaction -> accounts.account
    transaction_detail {amount numeric} -> transaction
    transaction_account_feature -> accounts.account_feature -> transaction_detail
  }
}

For the full grammar, please see its definition.

 @ - Indicates the attribute is part of the table's PRIMARY KEY
 ! - Indicates the attribute is part of a UNIQUE constraint
 ? - Indicates the attribute may be NULL
-> - Indicates a foreign key attribute REFERENCES the primary key of another table

###Installation

npm install -g relational_modeler

###Command-line Interface (CLI) Usage

relational_modeler sample.model

This will generate two files: 1) sample.sql and 2) sample.import.

sample.sql will contain a script that will create a database and schema for the model on a PostgreSQL database (other database engines can be easily added, but are not currently supported).

sample.import will contain a script that can be used to import data from character-separated-values (CSV) files. The characters used to delimit and quote values in the file may be passed as parameters.

All parameters:

relational_modeler [model file] [import file delimiter character] [import file quote character] [database engine]

###Web Interface Usage

The web interface is available at: https://blakelapierre.github.io/relational_modeler

The web interface can also be accessed by making the .dist/web_interface directory available to a web server and then accessing the index.html file.

Models can be typed or copy-pasted into the model text field and the corresponding SQL and import scripts may be copy-pasted out of the browser into any application you want.

###API Usage

import {api, GrammarError} from 'relational_modeler';

const modelText =
`database_name{
  schema_name {
    table_name {
      !primaryKey,
      attribute
    } -> foreign_table

    foreign_table {
      !primaryKey,
      attribute? boolean
    }
  }
}`;

try {
  console.log(api(modelText, 'postgresql', '^', '~').schema.join('\n'));
}
catch (e) {
  if (e instanceof GrammarError) {
    console.log(e.match.message);
  }
  else console.log(e);
}