1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const util_1 = require("@azera/util");
|
4 | require("reflect-metadata");
|
5 | const container_1 = require("./container");
|
6 | const errors_1 = require("./errors");
|
7 | const util_2 = require("./util");
|
8 | let { Type } = util_2.Decorator;
|
9 | exports.META_INJECT = Symbol('container.inject');
|
10 | exports.META_PARAMETERS_INJECT = Symbol('container.constructor.inject');
|
11 | /**
|
12 | * Get a class constructor
|
13 | * @param {any} value
|
14 | */
|
15 | function getTarget(value) {
|
16 | return value.constructor && (value.constructor == Function || util_1.is.Async(value)) ? value : value.constructor;
|
17 | }
|
18 | exports.getTarget = getTarget;
|
19 | /**
|
20 | * Check if a function or class has definition property
|
21 | * @param {Function} value Function or class to check
|
22 | */
|
23 | function hasDefinition(value) {
|
24 | //@ts-ignore
|
25 | return !!getTarget(value)[exports.META_INJECT];
|
26 | }
|
27 | exports.hasDefinition = hasDefinition;
|
28 | function emitTypes() {
|
29 | return (target, method) => null;
|
30 | }
|
31 | exports.emitTypes = emitTypes;
|
32 | /**
|
33 | * Get default class definition
|
34 | * @param {Function} target
|
35 | */
|
36 | function 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 | }
|
59 | exports.getInitialDefinition = getInitialDefinition;
|
60 | /**
|
61 | * Get decorated definition for a class or function
|
62 | */
|
63 | function 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 | }
|
74 | exports.getDefinition = getDefinition;
|
75 | /**
|
76 | * set decorated definition for a class or function
|
77 | */
|
78 | function 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 | }
|
83 | exports.setDefinition = setDefinition;
|
84 | function 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 | }
|
94 | exports.extendDefinition = extendDefinition;
|
95 | function 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 | }
|
102 | function 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 | }
|
112 | function 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 | }
|
164 | exports.Inject = Inject;
|
165 | function Tag(...tags) {
|
166 | return (target) => {
|
167 | Service({ tags })(target);
|
168 | };
|
169 | }
|
170 | exports.Tag = Tag;
|
171 | function 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 | }
|
181 | exports.Service = Service;
|
182 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQWlDO0FBQ2pDLDRCQUEwQjtBQUMxQiwyQ0FBZ0g7QUFDaEgscUNBQTBDO0FBRTFDLGlDQUFtQztBQUNuQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsZ0JBQVMsQ0FBQztBQUdaLFFBQUEsV0FBVyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ3pDLFFBQUEsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQUM7QUFFN0U7OztHQUdHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLEtBQVU7SUFDaEMsT0FBTyxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxRQUFRLElBQUksU0FBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7QUFDL0csQ0FBQztBQUZELDhCQUVDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsYUFBYSxDQUFDLEtBQWU7SUFDekMsWUFBWTtJQUNaLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBRSxtQkFBVyxDQUFFLENBQUM7QUFDN0MsQ0FBQztBQUhELHNDQUdDO0FBRUQsU0FBZ0IsU0FBUztJQUNyQixPQUFPLENBQUMsTUFBVyxFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQ2pELENBQUM7QUFGRCw4QkFFQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLE1BQWdCLEVBQUUsT0FBYTtJQUVoRSxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLDhCQUFzQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FB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 |
\ | No newline at end of file |