0.1.0 • Published 1 year ago

@apoyo/std v0.1.0

Weekly downloads
8
License
MIT
Repository
github
Last release
1 year ago

Apoyo - Std

npm version build size three shaking

Warning: This package is still in development and features may still change, be renamed or removed.

However, we would appreciate any feedback you have on how to improve this library:

  • Which features are missing?
  • Which features are hard to understand or unnecessary?
  • Which features need to be improved?

Installation

npm install @apoyo/std

Motivation

Today, there exists a huge variety of utility libraries in the JS ecosystem: underscore, lodash, ramda, etc...

While these libraries may be great, they don't fit my needs and are missing a lot of utilities I require in my day by day work.

Pipeable: underscore or lodash utilities are not pipeable, which means combining multiple operations requires a lot of temporary variables, which harms the code quality.

Typescript: None of the above tools have been written specifically for Typescript, which means some functions are hard to type or don't play nicely with Typescript at all.

Three-shaking: The above libraries don't have great out-of-the-box Tree-shaking capabilities.

Content: These libraries mainly cover utilities for Arrays and Records, whis means you will have to install other packages to cover missing utilities:

  • A package for custom errors / improved error handling.
  • A package for Promise utilities, to execute for example Promises in concurrence / in sequence
  • A package to accumulate Results without throwing
  • Etc...

Goal

This library has a few main goal:

  • Avoid dependency hells, by not having to install a multitude of utility packages required to do common tasks.

  • Avoid any naming conflicts by putting all utilities related to a data-structure in their respective "barrel" export.

  • Ease of usage: While large, the library should be easy to read and learn.

Modules

  • Arr containing Array utilities
  • Dict containing Record utilities
  • Str containing String utilities
  • Err containing Error utilities
  • Prom containig Promise utilities
  • Task containing lazy Promises utilities (type Task<A> = () => Promise<A>)
  • Result which can represent the failure or success of an operation (type Result<A,E> = Ok<A> | Ko<E>)

Honorable mentions

fp-ts:

This library has been heavily inspired by fp-ts, and has re-implemented a lot of useful concepts (Results, Tasks, Option, Ord, pipe, etc...)

However, fp-ts is unfortunaly too complicated to use and doesn't always integrate well with existing code. As such, while this library may have a few similarities, @apoyo/std has been heavily simplified for easier usage.

v-error: The Err module has been heavily inspired by the way you chain errors with v-error. However, we didn't need the "printf" style messages formatting and decided to rather use "mustache" styled messages.

pupa: The Str module a small template function based on this package.

escape-goat: The Str module also re-integrates the small htmlEscape and htmlUnescape functions, which have been copied inspired by this package.

p-limit: This library is known for it's capabilities to execute at maximum X promises at once. The Task module implements it's own concurrence and sequence functions, allowing you to achieve the same without this dependency.

enum-for: We re-used the 3 mentionned lines in our Enum module

Examples

  • Chaining errors:
const users = await pipe(
  findUsers(),
  Prom.mapError(Err.chain('findUsers failed'))
)
  • Execute Promises in sequence or concurrently:
await pipe(
  tasks,
  Task.concurrent(4),
  Task.run
)
  • Accumulate results without throwing:
const operation = (value) => {
  if (value < 0) {
    throw new Error('number should be positive')
  }
  return value
}

const [ok, ko] = pipe(
  [1,-2,3],
  Arr.map(Result.tryCatchFn(operation)),
  Arr.separate
)

expect(ok).toEqual([1,3])
expect(ko).toEqual([-2])
  • And more...
0.1.0

1 year ago

0.0.13

2 years ago

0.0.14

2 years ago

0.0.15

2 years ago

0.0.12

2 years ago

0.0.11

3 years ago

0.0.10

3 years ago

0.0.9

3 years ago

0.0.8

3 years ago

0.0.7

3 years ago

0.0.6

3 years ago

0.0.5

3 years ago

0.0.3

3 years ago

0.0.4

3 years ago

0.0.2

3 years ago

0.0.1

3 years ago