Latest Threat ResearchGlassWorm Loader Hits Open VSX via Developer Account Compromise.Details
Socket
Book a DemoInstallSign in
Socket

jstyper

Package Overview
Dependencies
Maintainers
1
Versions
31
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

jstyper

Turns your JavaScript to TypeScript / Flow (adds types, converts requires to imports, etc); *ALPHA QUALITY*

latest
Source
npmnpm
Version
0.5.0
Version published
Maintainers
1
Created
Source

jstyper Build Status npm version

Turns your JavaScript to TypeScript / Flow (adds types, converts requires to imports, etc); ALPHA QUALITY

JsTyper adds {TypeScript, Flow, Closure} types to JavaScript programs using iterative type propagation and the TypeScript Language Services.

Run it

  • Interactive online demo
  • npm i -g jstyper then jstyper input.js
    • Noteworthy flags:
      • -o <outputDir> (or --outputDir=<outputDir>): where files should be generated
      • --declarations: only generate interface files (*.d.ts)

Features

  • Assumes your JS code is correct, and propagates inferred types globally (across different files):
    • From call sites: if you call f(1), it will assume function f can take a number argument. If you call f() somewhere else, it will assume that argument is optional.
    • From function bodies: in function f(x) { return x * 2 } it's obvious x must be a number. Similar constraints appear when you test arguments for nullity or for equality with other values, etc.
    • From call shapes: from x.y() * x.n; it infers x: {y(): void, readonly n: number}
  • Rewrites require calls to ES2016 (ES6) imports.
  • Rewrites module.exports to ES2016 (ES6) exports.
  • Supports writing declarations (*.d.ts) files only with the --declarations flag.
  • Writes a summary of imported / required module interfaces in dependencies.d.ts (e.g. if you var foo = require('foo'); foo.bar() it will infer declare module "foo" { export function bar(): void })
  • Rewrites var to let

Example

example.js:

function f(x) {
  return x * 2;
}

function g(x, o) {
  if (o.addValue) {
    return f(x) + o.value;
  }
  return o.name == 'default' ? x : 'y';
}

function gg(x, y) {
  var v = g(x, y);
  return v;
}

example.ts:

function f(x: number): number {
  return x * 2;
}

function g(x: number, o: {addValue: boolean, value: any, name: string}) {
  if (o.addValue) {
    return f(x) + o.value;
  }
  return o.name == 'default' ? x : 'y';
}

function gg(x: number, y: {addValue: boolean, value: any, name: string}) {
  let v = g(x, y);
  return v;
}

TODO

  • Bundle & support DOM & ES2015+ libs
  • Support var foo = require('./bar').foo pattern
  • Support var Foo = function() {}; Foo.prototype.bar = ... (create companion interface Foo { bar... })
  • Parse and output flow comment / flow types (+ compare with Flow)
  • Lint mode
  • Split large tests into smaller specs
  • Better propagate contextual types in expressions (e.g. in (a && b && c, a ? b : c)
  • Use type constraints instead of types to allow local inference passes
  • Support merging of symbols added after structural members {x: number} | Foo
  • Handle index operators
  • Infer x: Promise<T> from (await x): T
  • WebDriver test for demo
  • Support literal types
  • Use const when appropriate in var rewrite.
  • Proper cli args parsing + --help
  • Better new F() class creation inference

Hack it

  • Clone this repo
  • Run npm i
  • Debug the demo npm start (will auto-reload and auto-run tests after any changes made to the TypeScript sources)
  • More options: take a look at package.json's script entries

Keywords

typescript

FAQs

Package last updated on 19 Feb 2017

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts