JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 11028
  • Score
    100M100P100Q122026F
  • License MIT

A flow compatible type system for JS.

Package Exports

  • flow-runtime

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (flow-runtime) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Flow Runtime

A runtime type system for JavaScript with full Flow compatibility.

What?

Provides a rich API for defining, inspecting and verifying data types in JavaScript. Any value that can be represented in JS can be represented by flow-runtime, including full support for polymorphism and parameterized types.

See the docs for more information.

Usage

import t from 'flow-runtime';

const number = t.number();
const string = t.string();

string.accepts('foo'); // true
string.accepts(123); // false
number.accepts(123); // true

string.assert('Hello World!'); // ok
string.assert(false); // throws
number.assert(456); // ok
number.assert('nope'); // throws

const numberOrString = t.union(number, string);

numberOrString.assert(123); // ok
numberOrString.assert("baz"); // ok
numberOrString.assert(false); // throws

const fooOrBar = t.union(
  t.string('foo'),
  t.string('bar')
);

fooOrBar.assert('foo'); // ok
fooOrBar.assert('bar'); // ok
fooOrBar.assert('qux'); // throws

const Thing = t.object(
  t.property('name', t.string()),
  t.property('url', t.nullable(t.string()))
);

Thing.assert({
  name: 'Example',
  url: 'http://example.com/'
}); // OK


Thing.assert({
  name: 'Example'
}); // OK

Thing.assert({
  name: false
}); // throws

const arrayOfStrings = t.array(t.string());

arrayOfStrings.assert()

// ---------------------------------------------

const UserStatus = t.union(
  t.string('PENDING'),
  t.string('ACTIVE'),
  t.string('INACTIVE')
);

const PreferenceName = t.union(
  t.string('marketingOptIn'),
  t.string('darkColourScheme')
);

const UserPreferences = t.object(
  t.indexer(PreferenceName, t.boolean())
);

const User = t.object({
  id: t.number(),
  name: t.string(),
  email: t.string(),
  status: UserStatus,
  preferences: UserPreferences
});

const validUser = {
  id: 123,
  name: 'Sally',
  email: 'sally@example.com',
  status: 'PENDING',
  preferences: {
    marketingOptIn: true
  }
};

const invalidUser = {
  id: false, // invalid
  name: 'Bob',
  email: 'bob@example.com',
  status: 'NOPE', // invalid
  preferences: {
    marketingOptIn: true,
    nope: true // invalid
  }
};

User.accepts(validUser); // true
User.accepts(invalidUser); // false

User.assert(validUser); // OK
User.assert(invalidUser); // throws TypeError