flow-update

Statically type checked model updates using Flow

Usage no npm install needed!

<script type="module">
  import flowUpdate from 'https://cdn.skypack.dev/flow-update';
</script>

README

Statically type checked model updates using Flow

Motivation

There's a ton of packages that help to update nested objects and arrays in a declarative and immutable manner, their APIs are focused on being ergonomic for a dynamic language though.

This package trades a bit of ergonomics in favour of a suitable API for a static type checker.

Flow configuration

This library leverages the shadow files technique, so no configuration required.

Usage

// @flow

import {
  mergeObject,
  mergeArray,
  swapArray,
  spliceArray,
  removeDictionary
} from 'flow-update'

type Person = {
  name: string,
  age: number,
  hobbies?: {
    surf: boolean,
    climbing: boolean
  }
};

const person1: Person = { name: 'Giulio', age: 42 }

mergeObject(person1, {
  hobbies: mergeObject(person1.hobbies || {}, {
    surf: true,
    climbing: false
    //climbing: 1 // <= error
  })
})

const arr: Array<number> = [1, 2, 3]

mergeArray(arr, [1], [10])
// mergeArray(arr, ['a'], [10]) // <= error

swapArray(arr, 0, 1)
// swapArray(arr, 0, 'a') // <= error

const myFish: Array<string> = ['angel', 'clown', 'mandarin', 'surgeon']

spliceArray(myFish, [{ start: 2, deleteCount: 0, items: ['drum'] }])
// spliceArray(myFish, [{ start: 2, deleteCount: 0, items: [1] }]) // <= error

spliceArray(myFish, [{ start: 3, deleteCount: 2 }])

type K = 'a' | 'b';
const dict: {[key: K]: number} = {a: 1, b: 2}

mergeDictionary(dict, { a: 1 })
// mergeDictionary(dict, { a: 'a' }) // <= error
// mergeDictionary(dict, { c: 1 }) // <= error

removeDictionary(dict, ['a'])
// removeDictionary(dict, ['a', 'c']) // <= error

API

Please see the index.js file.