Skip to content

Solvro/lib-solvro-utils

Repository files navigation

Solvro utils

A collection of small utility functions that can be used both on the backend and frontend.

Contents

arrays

ics

Contains the main parseICS function, which parses the provided ICS text to a JSON representation.

  • BEGIN/END are treated as nested object delimeters.
  • Nested objects can either be an object, or an array of objects on the parent object, depending if there are repeats of that object type.
    • if an object contains only one object of a type, the key corresponding to that type will contain an object
    • if it contains multiple objects of a type, the key corresponding to that type will contain an array
  • Regular properties with : delimeters are treated as strings.
  • Inline objects with ; delimeters are represented as objects.

map

Contains the ExtendedMap class, an extension of the vanilla Map with the following extra methods:

  • getOrInsert, getOrInsertWith, getOrInsertWithAsync - getter methods that insert a default value if a key does not exist. probably inspired by rust's map Entry structs. useful for building Map-based caches.

An existing vanilla Map instance can be converted to an ExtendedMap with the extendMap() function. (beware: contains prototype shenanigans) ... or you can extend the entire vanilla Map prototype with extendGlobally()... but please don't do that in library code.

Extending the vanilla Map prototype

Use the following snippet to access ExtendedMap functions on any Map instance. Make sure to either run this at the start of your program, or before using any ExtendedMap functions on a Map object.

import { ExtendedMap, extendGlobally } from "@solvro/utils/map";

declare global {
  interface Map<K, V> {
    getOrInsert: ExtendedMap<K, V>["getOrInsert"];
    getOrInsertWith: ExtendedMap<K, V>["getOrInsertWith"];
    getOrInsertWithAsync: ExtendedMap<K, V>["getOrInsertWithAsync"];
  }
}

extendGlobally();

misc

  • isPlainObject - checks whether a value is a plain object (not null, not undefined, not an array, not a class instance - just an object)
  • assertExhaustive - utility function for ensuring that all possible cases in a switch statement were covered

option

  • *Map - Basically Rust's Option::map ported to JS. Read the JSDoc comments for details.
  • assert* - assertion functions that ensure the given value is not null/undefined (depending on function)

promises

  • wait - returns a promise that resolves after some time (the classic new promise -> set timeout that everyone had to write at least once)

request_bundler

Contains the RequestBundler class, built on top of ExtendedMap. Provides a simple way to limit concurrent requests of the same type, while redirecting duplicates to existing tasks.

semaphore

Contains a simple async Semaphore class. Useful for limiting concurrent task counts.

License

This library is licensed under MPL-2.0.

About

smol environment-agnostic zero dependency utils

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •