Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

hotscript

gvergnaud1.2mISC1.0.13TypeScript support: included

A library of composable functions for the type-level! Transform your TypeScript types in any way you want using functions you already know.

readme

Higher-Order TypeScript (HOTScript)

A library of composable functions for the type level!

Transform your TypeScript types in any way you want using functions you already know.

image

Features

  • Type-level higher-order functions (Tuples.Map, Tuples.Filter, Objects.MapValues, etc).
  • Type-level pattern matching with Match.
  • Performant math operations (Numbers.Add, Numbers.Sub, Numbers.Mul, Numbers.Div, etc).
  • Custom "lambda" functions.

🚧 work in progress 🚧

Installation

You can find HotScript on npm:

npm install -D hotscript

HotScript is a work-in-progress library, so expect breaking changes in its API.

Examples

Transforming a list

Run this as a TypeScript Playground

import { Pipe, Tuples, Strings, Numbers } from "hotscript";

type res1 = Pipe<
  //  ^? 62
  [1, 2, 3, 4],
  [
    Tuples.Map<Numbers.Add<3>>,       // [4, 5, 6, 7]
    Tuples.Join<".">,                 // "4.5.6.7"
    Strings.Split<".">,               // ["4", "5", "6", "7"]
    Tuples.Map<Strings.Prepend<"1">>, // ["14", "15", "16", "17"]
    Tuples.Map<Strings.ToNumber>,     // [14, 15, 16, 17]
    Tuples.Sum                        // 62
  ]
>;

Defining a first-class function

Run this as a TypeScript Playground

import { Call, Fn, Tuples } from "hotscript";

// This is a type-level "lambda"!
interface Duplicate extends Fn {
  return: [this["arg0"], this["arg0"]];
}

type result1 = Call<Tuples.Map<Duplicate>, [1, 2, 3, 4]>;
//     ^? [[1, 1], [2, 2], [3, 3], [4, 4]]

type result2 = Call<Tuples.FlatMap<Duplicate>, [1, 2, 3, 4]>;
//     ^? [1, 1, 2, 2, 3, 3, 4, 4]

Transforming an object type

Run this as a TypeScript Playground

import { Pipe, Objects, Booleans } from "hotscript";

// Let's compose some functions to transform an object type:
type ToAPIPayload<T> = Pipe<
  T,
  [
    Objects.OmitBy<Booleans.Equals<symbol>>,
    Objects.Assign<{ metadata: { newUser: true } }>,
    Objects.SnakeCaseDeep,
    Objects.Assign<{ id: string }>
  ]
>;
type T = ToAPIPayload<{
  id: symbol;
  firstName: string;
  lastName: string;
}>;
// Returns:
type T = {
  id: string;
  metadata: { new_user: true };
  first_name: string;
  last_name: string;
};

Parsing a route path

Run this as a TypeScript Playground

https://user-images.githubusercontent.com/2315749/222081717-96217cd2-ac89-4e06-a942-17fbda717cd2.mp4

import { Pipe, Objects, Strings, ComposeLeft, Tuples, Match } from "hotscript";

type res5 = Pipe<
  //    ^? { id: string, index: number }
  "/users/<id:string>/posts/<index:number>",
  [
    Strings.Split<"/">,
    Tuples.Filter<Strings.StartsWith<"<">>,
    Tuples.Map<ComposeLeft<[Strings.Trim<"<" | ">">, Strings.Split<":">]>>,
    Tuples.ToUnion,
    Objects.FromEntries,
    Objects.MapValues<
      Match<[Match.With<"string", string>, Match.With<"number", number>]>
    >
  ]
>;

API

  • <input checked="" disabled="" type="checkbox"> Core
    • <input checked="" disabled="" type="checkbox"> Pipe<Input, Fn[]>
    • <input checked="" disabled="" type="checkbox"> PipeRight<Fn[], Input>
    • <input checked="" disabled="" type="checkbox"> Call<Fn, ...Arg>
    • <input checked="" disabled="" type="checkbox"> Apply<Fn, Arg[]>
    • <input checked="" disabled="" type="checkbox"> PartialApply<Fn, Arg[]>
    • <input checked="" disabled="" type="checkbox"> Compose<Fn[]>
    • <input checked="" disabled="" type="checkbox"> ComposeLeft<Fn[]>
  • <input checked="" disabled="" type="checkbox"> Function
    • <input checked="" disabled="" type="checkbox"> ReturnType<Fn>
    • <input checked="" disabled="" type="checkbox"> Parameters<Fn>
    • <input checked="" disabled="" type="checkbox"> Parameter<N, Fn>
    • <input checked="" disabled="" type="checkbox"> MapReturnType<Fn, FunctionType>
    • <input checked="" disabled="" type="checkbox"> MapParameters<Fn, FunctionType>
  • <input disabled="" type="checkbox"> Tuples
    • <input checked="" disabled="" type="checkbox"> Create<X> -> [X]
    • <input checked="" disabled="" type="checkbox"> Partition<Tuple>
    • <input checked="" disabled="" type="checkbox"> IsEmpty<Tuple>
    • <input checked="" disabled="" type="checkbox"> Zip<...Tuple[]>
    • <input checked="" disabled="" type="checkbox"> ZipWith<Fn, ...Tuple[]>
    • <input checked="" disabled="" type="checkbox"> Sort<Tuple>
    • <input checked="" disabled="" type="checkbox"> Head<Tuple>
    • <input checked="" disabled="" type="checkbox"> Tail<Tuple>
    • <input checked="" disabled="" type="checkbox"> At<N, Tuple>
    • <input checked="" disabled="" type="checkbox"> Last<Tuple>
    • <input checked="" disabled="" type="checkbox"> FlatMap<Fn, Tuple>
    • <input checked="" disabled="" type="checkbox"> Find<Fn, Tuple>
    • <input checked="" disabled="" type="checkbox"> Drop<N, Tuple>
    • <input checked="" disabled="" type="checkbox"> Take<N, Tuple>
    • <input checked="" disabled="" type="checkbox"> TakeWhile<Fn, Tuple>
    • <input checked="" disabled="" type="checkbox"> GroupBy<Fn, Tuple>
    • <input checked="" disabled="" type="checkbox"> Join<Str, Tuple>
    • <input checked="" disabled="" type="checkbox"> Map<Fn, Tuple>
    • <input checked="" disabled="" type="checkbox"> Filter<Fn, Tuple>
    • <input checked="" disabled="" type="checkbox"> Reduce<Fn, Init, Tuple>
    • <input checked="" disabled="" type="checkbox"> ReduceRight<Fn, Init, Tuple>
    • <input checked="" disabled="" type="checkbox"> Reverse<Tuple>
    • <input checked="" disabled="" type="checkbox"> Every<Fn, Tuple>
    • <input checked="" disabled="" type="checkbox"> Some<Fn, Tuple>
    • <input checked="" disabled="" type="checkbox"> SplitAt<N, Tuple>
    • <input checked="" disabled="" type="checkbox"> ToUnion<Tuple>
    • <input checked="" disabled="" type="checkbox"> ToIntersection<Tuple>
    • <input checked="" disabled="" type="checkbox"> Prepend<X, Tuple>
    • <input checked="" disabled="" type="checkbox"> Append<X, Tuple>
    • <input checked="" disabled="" type="checkbox"> Concat<T1, T2>
    • <input checked="" disabled="" type="checkbox"> Min<Tuple>
    • <input checked="" disabled="" type="checkbox"> Max<Tuple>
    • <input checked="" disabled="" type="checkbox"> Sum<Tuple>
  • <input disabled="" type="checkbox"> Object
    • <input checked="" disabled="" type="checkbox"> Readonly<Obj>
    • <input checked="" disabled="" type="checkbox"> Mutable<Obj>
    • <input checked="" disabled="" type="checkbox"> Required<Obj>
    • <input checked="" disabled="" type="checkbox"> Partial<Obj>
    • <input checked="" disabled="" type="checkbox"> ReadonlyDeep<Obj>
    • <input checked="" disabled="" type="checkbox"> MutableDeep<Obj>
    • <input checked="" disabled="" type="checkbox"> RequiredDeep<Obj>
    • <input checked="" disabled="" type="checkbox"> PartialDeep<Obj>
    • <input checked="" disabled="" type="checkbox"> Update<Path, Fn | V, Obj>
    • <input checked="" disabled="" type="checkbox"> Record<Key, Value>
    • <input checked="" disabled="" type="checkbox"> Keys<Obj>
    • <input checked="" disabled="" type="checkbox"> Values<Obj>
    • <input checked="" disabled="" type="checkbox"> AllPaths<Obj>
    • <input checked="" disabled="" type="checkbox"> Create<Pattern, X>
    • <input checked="" disabled="" type="checkbox"> Get<Path, Obj>
    • <input checked="" disabled="" type="checkbox"> FromEntries<[Key, Value]>
    • <input checked="" disabled="" type="checkbox"> Entries<Obj>
    • <input checked="" disabled="" type="checkbox"> MapValues<Fn, Obj>
    • <input checked="" disabled="" type="checkbox"> MapKeys<Fn, Obj>
    • <input checked="" disabled="" type="checkbox"> Assign<...Obj>
    • <input checked="" disabled="" type="checkbox"> Pick<Key, Obj>
    • <input checked="" disabled="" type="checkbox"> PickBy<Fn, Obj>
    • <input checked="" disabled="" type="checkbox"> Omit<Key, Obj>
    • <input checked="" disabled="" type="checkbox"> OmitBy<Fn, Obj>
    • <input checked="" disabled="" type="checkbox"> CamelCase<Obj>
    • <input checked="" disabled="" type="checkbox"> CamelCaseDeep<Obj>
    • <input checked="" disabled="" type="checkbox"> SnakeCase<Obj>
    • <input checked="" disabled="" type="checkbox"> SnakeCaseDeep<Obj>
    • <input checked="" disabled="" type="checkbox"> KebabCase<Obj>
    • <input checked="" disabled="" type="checkbox"> KebabCaseDeep<Obj>
  • <input disabled="" type="checkbox"> Union
    • <input checked="" disabled="" type="checkbox"> Map<Fn, U>
    • <input checked="" disabled="" type="checkbox"> Extract<T, U>
    • <input checked="" disabled="" type="checkbox"> ExtractBy<Fn, U>
    • <input checked="" disabled="" type="checkbox"> Exclude<T, U>
    • <input checked="" disabled="" type="checkbox"> ExcludeBy<Fn, U>
    • <input checked="" disabled="" type="checkbox"> NonNullable<U>
    • <input checked="" disabled="" type="checkbox"> ToTuple<U>
    • <input checked="" disabled="" type="checkbox"> ToIntersection<U>
  • <input disabled="" type="checkbox"> String
    • <input checked="" disabled="" type="checkbox"> Length<Str>
    • <input checked="" disabled="" type="checkbox"> TrimLeft<Str>
    • <input checked="" disabled="" type="checkbox"> TrimRight<Str>
    • <input checked="" disabled="" type="checkbox"> Trim<Str>
    • <input checked="" disabled="" type="checkbox"> Join<Sep, Str>
    • <input checked="" disabled="" type="checkbox"> Replace<From, To, Str>
    • <input checked="" disabled="" type="checkbox"> Slice<Start, End, Str>
    • <input checked="" disabled="" type="checkbox"> Split<Sep, Str>
    • <input checked="" disabled="" type="checkbox"> Repeat<N, Str>
    • <input checked="" disabled="" type="checkbox"> StartsWith<S, Str>
    • <input checked="" disabled="" type="checkbox"> EndsWith<E, Str>
    • <input checked="" disabled="" type="checkbox"> ToTuple<Str>
    • <input checked="" disabled="" type="checkbox"> ToNumber<Str>
    • <input checked="" disabled="" type="checkbox"> ToString<Str>
    • <input checked="" disabled="" type="checkbox"> Prepend<Start, Str>
    • <input checked="" disabled="" type="checkbox"> Append<End, Str>
    • <input checked="" disabled="" type="checkbox"> Uppercase<Str>
    • <input checked="" disabled="" type="checkbox"> Lowercase<Str>
    • <input checked="" disabled="" type="checkbox"> Capitalize<Str>
    • <input checked="" disabled="" type="checkbox"> Uncapitalize<Str>
    • <input checked="" disabled="" type="checkbox"> SnakeCase<Str>
    • <input checked="" disabled="" type="checkbox"> CamelCase<Str>
    • <input checked="" disabled="" type="checkbox"> KebabCase<Str>
    • <input checked="" disabled="" type="checkbox"> Compare<Str, Str>
    • <input checked="" disabled="" type="checkbox"> Equal<Str, Str>
    • <input checked="" disabled="" type="checkbox"> NotEqual<Str, Str>
    • <input checked="" disabled="" type="checkbox"> LessThan<Str, Str>
    • <input checked="" disabled="" type="checkbox"> LessThanOrEqual<Str, Str>
    • <input checked="" disabled="" type="checkbox"> GreaterThan<Str, Str>
    • <input checked="" disabled="" type="checkbox"> GreaterThanOrEqual<Str, Str>
  • <input disabled="" type="checkbox"> Number
    • <input checked="" disabled="" type="checkbox"> Add<N, M>
    • <input checked="" disabled="" type="checkbox"> Multiply<N, M>
    • <input checked="" disabled="" type="checkbox"> Subtract<N, M>
    • <input checked="" disabled="" type="checkbox"> Negate<N>
    • <input checked="" disabled="" type="checkbox"> Power<N, M>
    • <input checked="" disabled="" type="checkbox"> Div<N, M>
    • <input checked="" disabled="" type="checkbox"> Mod<N, M>
    • <input checked="" disabled="" type="checkbox"> Abs<N>
    • <input checked="" disabled="" type="checkbox"> Compare<N, M>
    • <input checked="" disabled="" type="checkbox"> GreaterThan<N, M>
    • <input checked="" disabled="" type="checkbox"> GreaterThanOrEqual<N, M>
    • <input checked="" disabled="" type="checkbox"> LessThan<N, M>
    • <input checked="" disabled="" type="checkbox"> LessThanOrEqual<N, M>
  • <input disabled="" type="checkbox"> Boolean
    • <input checked="" disabled="" type="checkbox"> And<Bool, Bool>
    • <input checked="" disabled="" type="checkbox"> Or<Bool, Bool>
    • <input checked="" disabled="" type="checkbox"> XOr<Bool, Bool>
    • <input checked="" disabled="" type="checkbox"> Not<Bool>
    • <input checked="" disabled="" type="checkbox"> Extends<A, B>
    • <input checked="" disabled="" type="checkbox"> Equals<A, B>
    • <input checked="" disabled="" type="checkbox"> DoesNotExtend<A, B>