Giter VIP home page Giter VIP logo

tserial's Introduction

tserial

Runtime deserialization for TypeScript interfaces and type aliases

Table of Contents

Overview

Read the blog post for a high level summary

TypeScript's structural typing system offers a powerful way to represent the shape of data. Data delivered across systems is, by default, not validated. A developer version can use type assertions to "cast" untrusted input to the expected type, but this is often done in an insecure way. Developers will usually write code that validates input data and coerces it to the right type.

tserial automates this process and offers a way to securely deserialize data at runtime.

Design Goals

  • Should use plain TypeScript expressions as the source of truth (no DSLs or codecs)
  • Should define a subset of type expressions that represent serializable data. Expressions involving functions (classes, function declarations and expressions, etc) will not be permitted.
  • Should offer consumers a way to opt-in to interfaces/type aliases they would like to be validated at runtime
  • Should generate a single file with a deserialization routine
  • Should have no runtime dependencies
  • Should have minimal build time dependencies
  • Deserialization routine should use composable assertions and type guards which incrementally prove adherence to a type expression via narrowing
    • Hedges against "stale" output since compiler will usually raise errors when narrowing produces an incomplete type
  • Deserialization routine must produce granular error data. If data isn't valid, structured error data should be returned to the caller
  • Node.js, browser, and deno support

Installation

npm install tserial --save-dev

yarn add tserial --dev

Usage

The CLI and Node API use the same underlying modules. Both generate file content. The CLI takes care of writing the file to the file system, while the Node API just returns string content.

In either mode, it's highly recommended to use a formatter like prettier to format the generated code. No attempt has been made to autogenerate well-formatted code.

CLI

# all options
tserial --help

# minimal command, use tsconfig.json at project root and default tag identifier
tserial --out ./path/to/generated_file.ts

# custom tsconfig
tserial --out ./path/to/generated_file.ts --tsconfig some-custom-tsconfig.json

# custom tag name (defaults to serializable)
# custom tsconfig
tserial --out ./path/to/generated_file.ts --tag myCustomTag

# deno imports
tserial --out ./path/to/generated_file.ts --deno

Node API

Check out render-content in renderer tests for an example of how the test suite calls the Node API.

Direct use of the Node API will allow greater flexibility within existing build systems, but the CLI may be faster to start with.

tserial's People

Contributors

lukeautry avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

tserial's Issues

Path separators render as backslashes on Windows

A path to a file ./foo/bar/baz will render an import as something like import { MyType } from '.\foo\bar\baz'

This is problematic because

  1. The backslashes are not escaped
  2. If integrating with CI on a Unix-like system, performing a diff against a file committed from Windows will fail against the locally generated Unix file

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.