0.0.4 • Published 1 year ago

@mattiasahlsen/ts-utils v0.0.4

Weekly downloads
-
License
-
Repository
-
Last release
1 year ago

@mattiasahlsen/ts-utils

This is a library written complete in Typescript the right way, with proper type support and inferred types.

Npm link: https://www.npmjs.com/package/@mattiasahlsen/ts-utils

Install

npm install @mattiasahlsen/ts-utils --save

Importing

Recommended way to import, only import the used function

This will reduce the imported bundle size.

import { notUndefined } from "@mattiasahlsen/ts-utils/not-undefined";
import { duplicateFilter } from "@mattiasahlsen/ts-utils/duplicate-filter";

Import many (or all) functions in the same import

This will include all the functions in the package in the imported bundle, even if you only use a few.

import { notUndefined, duplicateFilter } from "@mattiasahlsen/ts-utils";

Functions

notUndefined()

function notUndefined<T>(x: T | undefined): x is T;

Usage

import { notUndefined } from "@mattiasahlsen/ts-utils/not-undefined";

[1, undefined, 2].filter(notUndefined) // [1, 2]

duplicateFilter()

function duplicateFilter<T>(
  element: T,
  index: number,
  elements: T[]
): boolean;

Usage

import { notUndefined } from "@mattiasahlsen/ts-utils/duplicate-filter";

[1, 1, 2].filter(duplicateFilter) // [1, 2]

range()

function range(toOrFrom: number, toParameter?: number): number[];

Usage

import { range } from "@mattiasahlsen/ts-utils/range";

range(5) // [0, 1, 2, 3, 4]
range(2, 5) // [2, 3, 4]

copySubsetOfObject()

function copySubsetOfObject<T extends object, Key extends keyof T>(
  originalObject: T,
  keys: readonly Key[]
): Pick<T, Key>;

Usage

import { copySubsetOfObject } from "@mattiasahlsen/ts-utils/copy-subset-of-object"

copySubsetOfObject({ key1: "val1", key2: "val2" }, ["key1"]) // { key1: "val1" }

getPromiseWithResolve()

function getPromiseWithResolve(options?: {
  timeout?: number // defaults to no timeout
  timeoutErrorMessage?: string
})

Usage

import { getPromiseWithResolve } from "@mattiasahlsen/ts-utils/get-promise-with-resolve"

// The resolve and reject are bound to the promise
// The promise will automatically reject with
// a timeout error in 10 seconds
const { promise, resolve, reject } = getPromiseWithResolve({ timeout: 10000 })

// Any function with access to the shared cache will
// be able to wait for the promise that will resolve
// to the service
someSharedCache.someServiceNotYetCreated = promise

// This function has access to resolve the promise,
// and can also pass it to other functions
someServiceManagerThatWillEventuallyFetchTheService.queueFetchingService(
  "someServiceNotYetCreated",
  resolve
)

Classes

RandomNumberGenerator

A seedable random number generator. This generator is not cryptographically secure. Should rather be used for testing or non-security-related functionality.

interface IRandomNumberGenerator {
  randomNumber(max?: number): number
  randomInt(max: number): number
  resetSeed(seed: number): void
}

class RandomNumberGenerator
  implements IRandomNumberGenerator;
import { RandomNumberGenerator } from "@mattiasahlsen/ts-utils/random-numbers";

const seed = 1
const randomNumberGenerator = new RandomNumberGenerator(seed)

const maxNumber = 5
randomNumberGenerator.randomNumber(maxNumber) // random number between 0 and 5 (not including 0 or 5)

randomNumberGenerator.resetSeed(seed)
randomNumberGenerator.randomNumber(maxNumber) // the same random number

randomNumberGenerator.randomInt(5) // a random integer between (and including) 0 and 4

DependencyManager

A class to asynchronously manage dependencies between services.

export interface IDependencyManager {
  registerService(serviceKey: string, service: unknown): void
  getDependency(
    serviceKey: string,
    options: { from: string }
  ): Promise<unknown>
  findCircularDependencies(serviceKey: string): void
}

class DependencyManager implements IDependencyManager

Usage

// In the aggregator service file

import { DependencyManager } from "@mattiasahlsen/ts-utils/dependency-manager";

// Wait for a dependency that is loaded later
const dependencyManager = new DependencyManager()
const testServicePromise = dependencyManager.getDependency('testService', {
  from: 'aggregatorService', // passed to be able to track circular dependencies
})
// promise not yet resolved
testServicePromise.then(() => {
  console.log("testService resolved)
})

// no console.log yet

const mockTestService = mock()
dependencyManager.registerService('$testService', mockTestService)

// now the service is registered, the promise will be resolved and
// we we would see "testservice resolved" in the console