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

bolt-typegen

v1.2.4

Published

Generate TypeScript types from bolt security rules

Downloads

1

Readme

Bolt Type Generator :zap:

Build Status

Generate TypesScript types from types declared in Bolt security rules.

This tool is useful if you use Bolt Compiler to author your security rules and you use typescript to write client code.

Consider some trivial security rules like:

path / is ToySchema {
  read() { true }
}

type ToySchema {
  stringChild: String;
  nullableChild: Number | Null;
}

You can use this tool to generate types that reflect what the rules enforce:

export interface ToySchema {
  stringChild: string;
  nullableChild?: number;
}

Then you can use the emitted types to gain static typing of the values retrieved from firebase:

firebase.database().ref('/').once('value').then(snapshot => {
  // 🎉
  const x: ToySchema = snapshot.val();
})

Features

Preference for interface declarations with type declaration fallback

Bolt type definitions are translated to interface declarations whenever possible, and type declarations otherwise, such as when the type extends a native type or a Map (which are rendered as Records). It is possible to declare interfaces that extend Records, for example, when string is passed as the key type argument, but we do not detect and emit interface declarations for those cases yet.

type NativeExtension extends String {}
type ObjectExtension {
  child: String;
}
export type NativeExtension = String;
export interface ObjectExtension {
  child: string;
}

Optional properties

In the Firebase realtime database, a field cannot hold null as a value. Assigning null to a field removes the field from the object entirely. Therefore, given a bolt type like:

type MyObject {
  nonNullableField: String;
  nullableField: String | Null;
}

a naive translation to nullableField: string | null; is incorrect, and we make the property optional instead:

export interface MyObject {
  nonNullableField: string;
  nullableField?: string;
}

Fields in the realtime database also cannot hold an empty object as a value. When all the fields on an object are assigned null (are deleted), the field that held the object is also removed entirely. Consider the type:

type MyObject {
  nullableField: String | null;
}

type MyOtherObject {
  myObject: MyObject;
}

The field myObject does not explicitly include Null in a union like in the first example, but the field must still be optional because if nullableField is set to null, the value would be an empty object, and the myObject field is removed.

See the basic nullable, implicit nullability, and implicity nullability via type params tests for more cases and examples.

Usage

    import { generateTypes } from 'bolt-typegen';

    generateTypes('type Person { name: String }')
    // => 'export interface Person { name: string; }'