0.3.1 • Published 9 months ago

@vyke/dency v0.3.1

Weekly downloads
-
License
MIT
Repository
-
Last release
9 months ago

Simple and lightweight dependency injection for vanilla JavaScript and TypeScript

Features

  • No decorators, no annotations, no classes
  • Simple API
  • Scoped, singleton and transient dependencies
  • TypeScript support
  • No dependencies
  • Tiny size

Installation

npm i @vyke/dency

Examples

import { defineInjectable, inject } from '@vyke/dency'

const getHello = defineInjectable(() => 'Hello')
const getWorld = defineInjectable(() => 'World')
const getHelloWorld = defineInjectable((hello = inject(getHello), world = inject(getWorld)) => `${hello}, ${world}!`)
// the three dependencies are singletons by default

const helloWorld = inject(getHelloWorld) // Hello, World!

With Scopes

import { createScope, defineInjectable, inject } from '@vyke/dency'
const firstScope = createScope()
const secondScope = createScope()

const getTheme = defineInjectable(() => {
	let color = 'light'
	return { // the return value is the dependency and can be anything
		getColor: () => color,
		toogle: () => {
			color = color === 'light' ? 'dark' : 'light'
		}
	}
})

const createThemeToggle = defineDep((theme = inject(getTheme)) => {
	return {
		toogle: () => theme.toogle()
	}
}, { scopeTye: TRANSIENT_SCOPE })

// both toggles will have the same theme
// but they will be different instances
const toggle1 = firstScope.inject(createThemeToggle)
const toggle2 = secondScope.inject(createThemeToggle)

With Props

import { createScope, defineDep, inject, SCOPED_SCOPE } from '@vyke/dency'

const getHello = defineDep((name: string) => `Hello, ${name}!`)

const hello = inject(getHello, 'John') // Hello, John!

API

rootScope

The root scope. It is used by default if no scope is provided.

createScope

Create a new scope.

import { createScope, defineInjectable } from '@vyke/dency'

const scope = createScope()

const createDep = defineInjectable(() => 'foo', {
	scopeType: SCOPED_SCOPE
})

const myDep = scope.inject(createDep)

SINGLETON_SCOPE

Singleton scope type.

TRANSIENT_SCOPE

Transient scope type.

SCOPED_SCOPE

Scoped scope type.

SCOPE_TYPE

Scope types.

defineInjectable

Defines an injectable and returns it.

import { defineInjectable, SINGLETON_SCOPE } from '@vyke/dency'

const createDep1 = defineInjectable(() => {
	return 'Hello, World!'
}, { scopeType: SINGLETON_SCOPE })
const createDep2 = defineInjectable(() => {
	return 'Hello, World!'
}) // Default scope type is SINGLETON_SCOPE

inject

Injects an injectable and returns the instance.

import { defineInjectable, inject, SINGLETON_SCOPE } from '@vyke/dency'
const createDep = defineInjectable(() => {
	return 'Hello, World'
}, { scopeType: SINGLETON_SCOPE })
const dep = inject(createDep) // can be used anywhere

console.log(dep) // Hello, World

// but usually, it is used inside another injectable
const createDep1 = defineInjectable((dep = inject(createDep)) => {
	return `${dep}!`
})

console.log(inject(createDep1)) // Hello, World!

use

Returns the instance of an injectable if it exists.

import { defineInjectable, SINGLETON_SCOPE, use } from '@vyke/dency'
const createDep = defineInjectable(() => {
	return 'Hello, World'
})

const dep = use(createDep) // probably undefined

Others vyke projects

0.3.1

9 months ago

0.3.0

9 months ago

0.1.0

10 months ago

0.1.2

10 months ago

0.2.0

10 months ago

0.1.1

10 months ago

0.0.9

2 years ago

0.0.8

2 years ago

0.0.7

2 years ago

0.0.6

2 years ago

0.0.5

2 years ago

0.0.4

2 years ago