@react-mvi/di
Version:
Dependency injection module for React MVI.
61 lines (50 loc) • 1.61 kB
text/typescript
// -*- mode: typescript -*-
/**
* @fileoverview DIを制御するデコレータの定義
* @author Taketoshi Aono
*/
import Symbol from 'es6-symbol';
/**
* DIの設定キー
*/
export const injectionTargetSymbol = Symbol('__injections__');
/**
* dynamicデコレータのキー
*/
export const dynamicTargetSymbol = Symbol('__dynamic_injections__');
/**
* diの設定を保持する配列を初期化する
* @param target 対象のオブジェクト
* @param symbol 配列のキー
*/
function addInjection(target: Object, symbol: symbol) {
if (!target[symbol]) {
target[symbol] = [];
}
}
/**
* DIしたいプロパティに設定するデコレータ
* @param name プロパティ名とは違うモジュールを注入したい場合の名前
* @returns メソッドデコレータ
*/
export function inject(name?: string) {
return (target: Object, propertyKey: string | symbol): void => {
addInjection(target, injectionTargetSymbol);
if (name) {
target[injectionTargetSymbol].push([name, propertyKey]);
} else {
target[injectionTargetSymbol].push([propertyKey, propertyKey]);
}
}
}
/**
* DIしたいコンストラクタ引数に設定するデコレータ
* @param name 注入したいモジュール名かモジュール名の正規表現
* @returns パラメータデコレータ
*/
export function param(name: string|RegExp) {
return (target: any, propertyKey: string | symbol, parameterIndex: number) => {
addInjection(target, injectionTargetSymbol);
target[injectionTargetSymbol][parameterIndex] = [name, name];
}
}