UNPKG

14.8 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const util_1 = require("@azera/util");
4require("reflect-metadata");
5const container_1 = require("./container");
6const errors_1 = require("./errors");
7const util_2 = require("./util");
8let { Type } = util_2.Decorator;
9exports.META_INJECT = Symbol('container.inject');
10exports.META_PARAMETERS_INJECT = Symbol('container.constructor.inject');
11/**
12 * Get a class constructor
13 * @param {any} value
14 */
15function getTarget(value) {
16 return value.constructor && (value.constructor == Function || util_1.is.Async(value)) ? value : value.constructor;
17}
18exports.getTarget = getTarget;
19/**
20 * Check if a function or class has definition property
21 * @param {Function} value Function or class to check
22 */
23function hasDefinition(value) {
24 //@ts-ignore
25 return !!getTarget(value)[exports.META_INJECT];
26}
27exports.hasDefinition = hasDefinition;
28function emitTypes() {
29 return (target, method) => null;
30}
31exports.emitTypes = emitTypes;
32/**
33 * Get default class definition
34 * @param {Function} target
35 */
36function getInitialDefinition(target, context) {
37 let deps = Reflect.hasMetadata(exports.META_PARAMETERS_INJECT, target) ? [] : container_1.getDependencies(target).deps;
38 if (context) {
39 if (Reflect.hasMetadata("design:paramtypes", context, target.name)) {
40 Reflect.getMetadata("design:paramtypes", context, target.name);
41 }
42 }
43 return container_1.Definition({
44 $target: target,
45 service: target,
46 name: target.name,
47 properties: {},
48 parameters: deps,
49 private: false,
50 tags: [],
51 isFactory: container_1.isFactory(target),
52 invoke: !util_1.is.Class(target) && !container_1.SERVICE_REGEX.test(target.name),
53 calls: {},
54 methods: {},
55 imports: [],
56 autoTags: []
57 });
58}
59exports.getInitialDefinition = getInitialDefinition;
60/**
61 * Get decorated definition for a class or function
62 */
63function getDefinition(value, context) {
64 let target = getTarget(value);
65 if (Reflect.hasMetadata(exports.META_INJECT, target)) {
66 return Reflect.getMetadata(exports.META_INJECT, target);
67 }
68 let initial = getInitialDefinition(target, context);
69 Reflect.defineMetadata(exports.META_INJECT, initial, target);
70 return initial;
71 //@ts-ignore
72 //return target[DEF] || ( target[DEF] = getInitialDefinition(target, context));
73}
74exports.getDefinition = getDefinition;
75/**
76 * set decorated definition for a class or function
77 */
78function setDefinition(value, definition) {
79 return extendDefinition(value, definition);
80 // let target = getTarget(value);
81 // return target[DEF] || ( target[DEF] = Definition(Object.assign({ name: target.name }, definition)) );
82}
83exports.setDefinition = setDefinition;
84function extendDefinition(value, definition) {
85 let target = getTarget(value);
86 let old = getDefinition(target);
87 // Fix methods combine
88 if (definition.methods) {
89 definition.methods = Object.assign(old.methods, definition.methods);
90 }
91 //@ts-ignore
92 return target[exports.META_INJECT] = container_1.Definition(Object.assign(old, definition));
93}
94exports.extendDefinition = extendDefinition;
95function optimizeServiceType(type, name) {
96 if (type == Array)
97 return '$$' + name;
98 else if (type == String || type == Object || type == Number)
99 return '$' + name;
100 return type;
101}
102function getParameterServiceOrThrow(service, target, key, index) {
103 if (service)
104 return service;
105 if (Reflect.hasMetadata('design:paramtypes', target, key)) {
106 return optimizeServiceType(Reflect.getMetadata('design:paramtypes', target, key)[index], key);
107 }
108 else if (!service) {
109 throw new errors_1.DecoratorError(`Please specify service for parameter injection`, target, key, index);
110 }
111}
112function Inject(service, options) {
113 return (target, key, index) => {
114 let type = util_2.Decorator.getType(target, key, index);
115 switch (type) {
116 case Type.MethodParameter:
117 service = getParameterServiceOrThrow(service, target, key, index);
118 let def = getDefinition(target);
119 if (!util_1.is.Array(def.methods[key]))
120 def.methods[key] = [];
121 def.methods[key][index] = service;
122 break;
123 case Type.Method:
124 // throw new DecoratorError(`Decorate ${ type } not allowed`, target, key, index);
125 if (Reflect.hasMetadata("design:paramtypes", target, key)) {
126 let types = Reflect.getMetadata("design:paramtypes", target, key);
127 let endOfDep = false;
128 let deps = types.map((type, i) => {
129 if (container_1.isInternalClass(type)) {
130 endOfDep = true;
131 return null;
132 }
133 if (endOfDep)
134 throw Error(`Dependencies must come first in method ${target.constructor.name}${key}`);
135 return type;
136 }).filter(dep => !!dep);
137 //@ts-ignore
138 getDefinition(target).methods[key] = deps;
139 }
140 break;
141 case Type.ConstructorParameter:
142 Reflect.defineMetadata(exports.META_PARAMETERS_INJECT, true, target);
143 service = getParameterServiceOrThrow(service, target, key, index);
144 getDefinition(target).parameters[index] = service;
145 break;
146 case Type.Property:
147 options = Object.assign({
148 lateBinding: true
149 }, options);
150 if (!service && Reflect.hasMetadata("design:type", target, key))
151 service = optimizeServiceType(Reflect.getMetadata("design:type", target, key), key);
152 if (service instanceof Function && service.name == 'Function')
153 service = key;
154 getDefinition(target).properties[key] = options ? Object.assign({ name: service }, options) : service;
155 break;
156 case Type.Class:
157 setDefinition(target, {
158 parameters: util_1.is.Array(service) ? service : [service]
159 });
160 break;
161 }
162 };
163}
164exports.Inject = Inject;
165function Tag(...tags) {
166 return (target) => {
167 Service({ tags })(target);
168 };
169}
170exports.Tag = Tag;
171function Service(definition = {}) {
172 return (target) => {
173 if (typeof definition === 'string') {
174 definition = { name: definition };
175 }
176 // Check inheritance
177 container_1.Container.checkInheritance(target);
178 extendDefinition(target, definition);
179 };
180}
181exports.Service = Service;
182//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQWlDO0FBQ2pDLDRCQUEwQjtBQUMxQiwyQ0FBZ0g7QUFDaEgscUNBQTBDO0FBRTFDLGlDQUFtQztBQUNuQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsZ0JBQVMsQ0FBQztBQUdaLFFBQUEsV0FBVyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ3pDLFFBQUEsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQUM7QUFFN0U7OztHQUdHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLEtBQVU7SUFDaEMsT0FBTyxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxRQUFRLElBQUksU0FBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7QUFDL0csQ0FBQztBQUZELDhCQUVDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsYUFBYSxDQUFDLEtBQWU7SUFDekMsWUFBWTtJQUNaLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBRSxtQkFBVyxDQUFFLENBQUM7QUFDN0MsQ0FBQztBQUhELHNDQUdDO0FBRUQsU0FBZ0IsU0FBUztJQUNyQixPQUFPLENBQUMsTUFBVyxFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQ2pELENBQUM7QUFGRCw4QkFFQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLE1BQWdCLEVBQUUsT0FBYTtJQUVoRSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLDhCQUFzQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FB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
\No newline at end of file