Skip to content

js-programming/hegel

 
 

Repository files navigation

Hegel

Hegel Logo

Hegel is a static type checker for JavaScript with strong typings, high inference level and a lot of additional goodies. To read more about Hegel, check out Docs.

The main features:

  1. Soundness
const numbers: Array<number> = [];
// Error: Type "Array<number>" is incompatible with type "Array<number | string>"
const numbersOrStrings: Array<string | number> = numbers;
// Error: Property "toLocaleString" does not exist in "Number | undefined"
const localeString = numbers[1].toLocaleString();
  1. Strong Type System
function provideNumber(providedData: ?number) {
  // Error: Type "number | undefined" is incompatible with type "boolean"
  if (!providedData) {
    // Oops you lost "0"
    throw new TypeError("Number was not provided");
  }
  return providedData;
}
  1. High level type Inference
// Inferenced as "<_q, _c>((_c) => _q) => (_c) => Promise<_q>"
const promisify = fn => arg => Promise.resolve(fn(arg));
// Inferenced as "<_c>(_c) => Promise<_c>"
const id = promisify(x => x);
// Inferenced as "Promise<string>"
const upperStr = id("It will be inferenced").then(str => str.toUpperCase());
// Inferenced as "Promise<number>"
const twicedNum = id(42).then(num => num ** 2);
  1. Typed Errors
// Inferenced type "(unknown) => undefined throws TypeError"
function assertNumber(arg) {
  if (typeof arg !== "number") {
    throw new TypeError("Given arg is not a number");
  }
}
// Inferenced type "(unknown) => undefined throws ReferenceError | TypeError"
function assertField(obj) {
  if (typeof obj === "object" && obj !== null && "value" in obj) {
    assertNumber(obj.value)
  }
  throw new ReferenceError('"value" property doesn\'t exist');
}
try {
  assertField({});
} catch(error) {
  // error type is "ReferenceError | TypeError | unknown"
}

Installation

You can install Hegel CLI using npm or yarn:

$ npm install -g @hegel/cli
# or
$ yarn global add @hegel/cli

Or install localy only for your project:

$ npm install -D @hegel/cli
# or
$ yarn add -D @hegel/cli

Hegel was developed for current LTS version of Node.js (12.16.1). So, you need to have at least 12 version.

Project Overview

There are few separated packages in Hegel project:

  • The main logic of analysis is placed in @hegel/core
  • CLI interfaces is placed in @hegel/cli
  • The main typings (typings for browser or node.js environment and for default global environment) are placed in @hegel/typings
  • Language Server (which currently work with VS Code) is placed in @hegel/language-server
  • Documentation is placed in @hegel/docs

Building Hegel from source

Hegel is written in JavaScript (Node.js 12 is required). Ensure that you have Git and Node.js 12 installed.

  1. Clone the repo:
$ git clone git@github.com:JSMonk/hegel.git
  1. Change to the @hegel/cli directory:
$ cd hegel/packages/cli
  1. Install dependencies
$ npm i
  1. That's all. You can build @hegel/cli:
npm run build

The result code will be compiled into build directory. And you can debug it with default Node.js debugger:

node --inspect-brk ./build/index.js

Tests

Currently all tests are written for @hegel/core, so, if you will change code inside @hegel/core package, you can run tests by:

npm run test

License

Hegel is MIT-licensed (LICENSE).

About

An advanced static type checker

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 100.0%