0.0.2 • Published 1 year ago

@adaptably/provide v0.0.2

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

@adaptably/provide

Simple dependency injection and replacement for Node.js applications.

Motivation

This package encourages an architectural pattern of keeping functions that do stuff (setup functions) separate from functions that put stuff together (provider functions).

The result is modular application code that is easy to test without complex dependency mocking.

Installation

npm install @adaptably/provide

Basic Usage

adopt.setup.js

Setup functions expect dependencies to be provided to them.

export default ({ getAvailableBreed }) => {
  return async (numberToAdopt) => {
    const adoptedBreed = await getAvailableBreed()
    return `Adopted ${ numberToAdopt } ${ adoptedBreed }(s)!`
  }
}

Providers provide a default set of dependencies to setup functions.

adopt.provide.js

import provide from '@adaptably/provide'
import getAvailableBreed from './getAvailableBreed.js' // Calls an API and returns a dog breed.
import setupAdoptDog from './adopt.setup.js'

export default provide(setupAdoptDog).with({ getAvailableBreed })

adopt.test.js

Testing becomes simple without complex mocking.

import provideAdopt from './adopt.provide.js'

test('adopts whatever dog breed is available', async () => {
  const adoptTerrier = await provideAdopt.withReplaced({ getAvailableBreed: () => 'Terrier' })
  expect(adoptTerrier(2)).toEqual('Adopted 2 Terrier(s)!')

  const adoptLabrador = await provideAdopt.withReplaced({ getAvailableBreed: () => 'Labrador' })
  expect(adoptLabrador(2)).toEqual('Adopted 2 Labrador(s)!')

  const adoptRandom = await provideAdopt()
  expect(adoptRandom(2)).toEqual('Adopted 2 [whatever breed the API really returns](s)!')
})
0.0.2

1 year ago

0.0.1

1 year ago