raveclassic/injectable-ts

applySequenceS

coolassassin opened this issue · 0 comments

import { Injectable, InjectableValue, UnknownDependencyTree } from '@injectable-ts/core'
import { InjectableDependencyTree } from '@injectable-ts/core/src/injectable'

// eslint-disable-next-line @typescript-eslint/no-explicit-any
type InjectableUnknown = Injectable<UnknownDependencyTree, unknown>
type Sequenced<As extends { [K in keyof As]: InjectableUnknown }> = Injectable<
  InjectableDependencyTree<As[keyof As]>,
  { [K in keyof As]: InjectableValue<As[K]> }
>

export const applySequenceS =
  <As extends Record<string, InjectableUnknown>>(as: As): Sequenced<As> =>
  (context) =>
    // eslint-disable-next-line no-restricted-syntax
    Object.entries(as).reduce(
      (acc, [key, value]) => ({
        ...acc,
        [key]: value(context),
      }),
      // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
      {} as ReturnType<Sequenced<As>>
    )