UNPKG

@injectable-ts/react

Version:

Purely-functional strictly-typed IoC/DI for TypeScript

32 lines (27 loc) 1.36 kB
import * as React from 'react'; import { createContext, useContext, useMemo } from 'react'; import { TOKEN_ACCESSOR_KEY } from '@injectable-ts/core'; const context = /* @__PURE__ */ createContext(undefined); /* @__NO_SIDE_EFFECTS__ */ function useInjectable(input, overrides) { const dependencies = useContext(context); if (dependencies === undefined) { throw new Error('useInjectable must be called within DependenciesProvider subtree'); } return useMemo(() => // eslint-disable-next-line no-restricted-syntax input(overrides === undefined ? dependencies : Object.assign(Object.assign({}, dependencies), overrides)), [dependencies, overrides, input]); } const checkedAccessor = (dependencies, name) => { if (name in dependencies) { return dependencies[name]; } throw new Error(`Missing dependency: ${JSON.stringify(name)}`); }; /* @__NO_SIDE_EFFECTS__ */ function DependenciesProvider(props) { const previousDependencies = useContext(context); const mergedDependencies = useMemo(() => (Object.assign(Object.assign({ [TOKEN_ACCESSOR_KEY]: checkedAccessor }, previousDependencies), props.value)), [previousDependencies, props.value]); return (React.createElement(context.Provider, { value: mergedDependencies }, props.children)); } export { DependenciesProvider, useInjectable };