import '../vendor/TypeDef.2.js';
import { B as BaseObject, L as LifetimeType, I as IBaseObjectConstructor } from '../vendor/TypeDef.3.js';
import { C as ClassDecorator, P as PropertyDecorator } from '../vendor/TypeDef.12.js';
import { S as Schema } from '../vendor/TypeDef.5.js';
import '../vendor/TypeDef.11.js';

/**
 * Class Decorator
 * @param lifetime
 * @param lock
 * @constructor
 */
declare function Lifetime<ClassConstructor extends typeof BaseObject>(lifetime: LifetimeType, lock?: boolean): ClassDecorator<ClassConstructor>;
/**
 * Class Decorator
 * @param lock
 * @constructor
 */
declare function Singleton<ClassConstructor extends typeof BaseObject>(lock?: boolean): ClassDecorator<ClassConstructor>;
/**
 * Class Decorator
 * @param lock
 * @constructor
 */
declare function Transient<ClassConstructor extends typeof BaseObject>(lock?: boolean): ClassDecorator<ClassConstructor>;
/**
 * Class Decorator
 * @param lock
 * @constructor
 */
declare function Scoped<ClassConstructor extends typeof BaseObject>(lock?: boolean): ClassDecorator<ClassConstructor>;

/**
 * Class Decorator
 * @constructor
 */
declare function Autoload<ClassConstructor extends typeof BaseObject>(): ClassDecorator<ClassConstructor>;

/**
 * Property Decorator
 * @param schema
 * @param fn
 * @constructor
 */
declare function Configurable<ClassPrototype extends BaseObject, DataType>(schema?: Schema<DataType>, fn?: (this: ClassPrototype, value: DataType) => DataType | Promise<DataType>): PropertyDecorator<ClassPrototype>;

type InjectionName = string | symbol | IBaseObjectConstructor<BaseObject>;
type InjectionTransformFunction = (injection: any) => any | Promise<any>;

/**
 *
 * @constructor
 */
declare function Inject<ClassPrototype extends BaseObject>(): PropertyDecorator<ClassPrototype>;
/**
 * Property Decorator
 * @param name
 * @constructor
 */
declare function Inject<ClassPrototype extends BaseObject>(name: InjectionName): PropertyDecorator<ClassPrototype>;
/**
 * Property Decorator
 * @param transform
 * @constructor
 */
declare function Inject<ClassPrototype extends BaseObject>(transform: InjectionTransformFunction): PropertyDecorator<ClassPrototype>;
/**
 * Property Decorator
 * @param name
 * @param transform
 * @constructor
 */
declare function Inject<ClassPrototype extends BaseObject>(name: InjectionName, transform: InjectionTransformFunction): PropertyDecorator<ClassPrototype>;

export { Autoload, Configurable, Inject, Lifetime, Scoped, Singleton, Transient };
