@loopback/context 4.0.0-alpha.9 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/LICENSE +25 -0
  2. package/README.md +116 -0
  3. package/dist/binding-config.d.ts +40 -0
  4. package/dist/binding-config.js +33 -0
  5. package/dist/binding-config.js.map +1 -0
  6. package/dist/binding-decorator.d.ts +45 -0
  7. package/dist/binding-decorator.js +118 -0
  8. package/dist/binding-decorator.js.map +1 -0
  9. package/dist/binding-filter.d.ts +108 -0
  10. package/dist/binding-filter.js +162 -0
  11. package/dist/binding-filter.js.map +1 -0
  12. package/dist/binding-inspector.d.ts +150 -0
  13. package/dist/binding-inspector.js +249 -0
  14. package/dist/binding-inspector.js.map +1 -0
  15. package/dist/binding-key.d.ts +66 -0
  16. package/dist/binding-key.js +121 -0
  17. package/dist/binding-key.js.map +1 -0
  18. package/dist/binding-sorter.d.ts +71 -0
  19. package/dist/binding-sorter.js +89 -0
  20. package/dist/binding-sorter.js.map +1 -0
  21. package/dist/binding.d.ts +577 -0
  22. package/dist/binding.js +788 -0
  23. package/dist/binding.js.map +1 -0
  24. package/dist/context-event.d.ts +23 -0
  25. package/dist/context-event.js +7 -0
  26. package/dist/context-event.js.map +1 -0
  27. package/dist/context-observer.d.ts +36 -0
  28. package/dist/context-observer.js +7 -0
  29. package/dist/context-observer.js.map +1 -0
  30. package/dist/context-subscription.d.ts +147 -0
  31. package/dist/context-subscription.js +317 -0
  32. package/dist/context-subscription.js.map +1 -0
  33. package/dist/context-tag-indexer.d.ts +42 -0
  34. package/dist/context-tag-indexer.js +135 -0
  35. package/dist/context-tag-indexer.js.map +1 -0
  36. package/dist/context-view.d.ts +209 -0
  37. package/dist/context-view.js +240 -0
  38. package/dist/context-view.js.map +1 -0
  39. package/dist/context.d.ts +513 -0
  40. package/dist/context.js +717 -0
  41. package/dist/context.js.map +1 -0
  42. package/dist/index.d.ts +52 -0
  43. package/dist/index.js +60 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/inject-config.d.ts +67 -0
  46. package/dist/inject-config.js +181 -0
  47. package/dist/inject-config.js.map +1 -0
  48. package/dist/inject.d.ts +250 -0
  49. package/dist/inject.js +535 -0
  50. package/dist/inject.js.map +1 -0
  51. package/dist/interception-proxy.d.ts +76 -0
  52. package/dist/interception-proxy.js +67 -0
  53. package/dist/interception-proxy.js.map +1 -0
  54. package/dist/interceptor-chain.d.ts +121 -0
  55. package/dist/interceptor-chain.js +148 -0
  56. package/dist/interceptor-chain.js.map +1 -0
  57. package/dist/interceptor.d.ts +138 -0
  58. package/dist/interceptor.js +299 -0
  59. package/dist/interceptor.js.map +1 -0
  60. package/dist/invocation.d.ts +101 -0
  61. package/dist/invocation.js +163 -0
  62. package/dist/invocation.js.map +1 -0
  63. package/dist/json-types.d.ts +28 -0
  64. package/{lib/src/provider.js → dist/json-types.js} +3 -3
  65. package/dist/json-types.js.map +1 -0
  66. package/dist/keys.d.ts +65 -0
  67. package/dist/keys.js +74 -0
  68. package/dist/keys.js.map +1 -0
  69. package/dist/provider.d.ts +31 -0
  70. package/{lib6/src → dist}/provider.js +2 -2
  71. package/dist/provider.js.map +1 -0
  72. package/dist/resolution-session.d.ts +180 -0
  73. package/dist/resolution-session.js +274 -0
  74. package/dist/resolution-session.js.map +1 -0
  75. package/dist/resolver.d.ts +46 -0
  76. package/dist/resolver.js +203 -0
  77. package/dist/resolver.js.map +1 -0
  78. package/dist/unique-id.d.ts +14 -0
  79. package/dist/unique-id.js +26 -0
  80. package/dist/unique-id.js.map +1 -0
  81. package/dist/value-promise.d.ts +134 -0
  82. package/dist/value-promise.js +277 -0
  83. package/dist/value-promise.js.map +1 -0
  84. package/package.json +49 -34
  85. package/src/binding-config.ts +73 -0
  86. package/src/binding-decorator.ts +136 -0
  87. package/src/binding-filter.ts +250 -0
  88. package/src/binding-inspector.ts +371 -0
  89. package/src/binding-key.ts +136 -0
  90. package/src/binding-sorter.ts +124 -0
  91. package/src/binding.ts +1107 -0
  92. package/src/context-event.ts +30 -0
  93. package/src/context-observer.ts +50 -0
  94. package/src/context-subscription.ts +402 -0
  95. package/src/context-tag-indexer.ts +147 -0
  96. package/src/context-view.ts +440 -0
  97. package/src/context.ts +1079 -0
  98. package/src/index.ts +58 -0
  99. package/src/inject-config.ts +239 -0
  100. package/src/inject.ts +796 -0
  101. package/src/interception-proxy.ts +127 -0
  102. package/src/interceptor-chain.ts +268 -0
  103. package/src/interceptor.ts +430 -0
  104. package/src/invocation.ts +269 -0
  105. package/src/json-types.ts +35 -0
  106. package/src/keys.ts +85 -0
  107. package/src/provider.ts +37 -0
  108. package/src/resolution-session.ts +414 -0
  109. package/src/resolver.ts +282 -0
  110. package/src/unique-id.ts +24 -0
  111. package/src/value-promise.ts +318 -0
  112. package/index.d.ts +0 -6
  113. package/index.js +0 -9
  114. package/lib/index.d.ts +0 -1
  115. package/lib/index.js +0 -12
  116. package/lib/index.js.map +0 -1
  117. package/lib/src/binding.d.ts +0 -98
  118. package/lib/src/binding.js +0 -169
  119. package/lib/src/binding.js.map +0 -1
  120. package/lib/src/context.d.ts +0 -14
  121. package/lib/src/context.js +0 -122
  122. package/lib/src/context.js.map +0 -1
  123. package/lib/src/index.d.ts +0 -10
  124. package/lib/src/index.js +0 -25
  125. package/lib/src/index.js.map +0 -1
  126. package/lib/src/inject.d.ts +0 -60
  127. package/lib/src/inject.js +0 -112
  128. package/lib/src/inject.js.map +0 -1
  129. package/lib/src/is-promise.d.ts +0 -1
  130. package/lib/src/is-promise.js +0 -15
  131. package/lib/src/is-promise.js.map +0 -1
  132. package/lib/src/provider.d.ts +0 -31
  133. package/lib/src/provider.js.map +0 -1
  134. package/lib/src/reflect.d.ts +0 -38
  135. package/lib/src/reflect.js +0 -143
  136. package/lib/src/reflect.js.map +0 -1
  137. package/lib/src/resolver.d.ts +0 -30
  138. package/lib/src/resolver.js +0 -141
  139. package/lib/src/resolver.js.map +0 -1
  140. package/lib6/index.d.ts +0 -1
  141. package/lib6/index.js +0 -12
  142. package/lib6/index.js.map +0 -1
  143. package/lib6/src/binding.d.ts +0 -98
  144. package/lib6/src/binding.js +0 -169
  145. package/lib6/src/binding.js.map +0 -1
  146. package/lib6/src/context.d.ts +0 -14
  147. package/lib6/src/context.js +0 -122
  148. package/lib6/src/context.js.map +0 -1
  149. package/lib6/src/index.d.ts +0 -10
  150. package/lib6/src/index.js +0 -25
  151. package/lib6/src/index.js.map +0 -1
  152. package/lib6/src/inject.d.ts +0 -60
  153. package/lib6/src/inject.js +0 -112
  154. package/lib6/src/inject.js.map +0 -1
  155. package/lib6/src/is-promise.d.ts +0 -1
  156. package/lib6/src/is-promise.js +0 -15
  157. package/lib6/src/is-promise.js.map +0 -1
  158. package/lib6/src/provider.d.ts +0 -31
  159. package/lib6/src/provider.js.map +0 -1
  160. package/lib6/src/reflect.d.ts +0 -38
  161. package/lib6/src/reflect.js +0 -143
  162. package/lib6/src/reflect.js.map +0 -1
  163. package/lib6/src/resolver.d.ts +0 -30
  164. package/lib6/src/resolver.js +0 -141
  165. package/lib6/src/resolver.js.map +0 -1
package/dist/inject.js ADDED
@@ -0,0 +1,535 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2017,2020. All Rights Reserved.
3
+ // Node module: @loopback/context
4
+ // This file is licensed under the MIT License.
5
+ // License text available at https://opensource.org/licenses/MIT
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.hasInjections = exports.inspectInjections = exports.describeInjectedProperties = exports.inspectTargetType = exports.describeInjectedArguments = exports.assertTargetType = exports.Getter = exports.inject = void 0;
8
+ const metadata_1 = require("@loopback/metadata");
9
+ const binding_1 = require("./binding");
10
+ const binding_filter_1 = require("./binding-filter");
11
+ const context_view_1 = require("./context-view");
12
+ const resolution_session_1 = require("./resolution-session");
13
+ const INJECT_PARAMETERS_KEY = metadata_1.MetadataAccessor.create('inject:parameters');
14
+ const INJECT_PROPERTIES_KEY = metadata_1.MetadataAccessor.create('inject:properties');
15
+ // A key to cache described argument injections
16
+ const INJECT_METHODS_KEY = metadata_1.MetadataAccessor.create('inject:methods');
17
+ /**
18
+ * A decorator to annotate method arguments for automatic injection
19
+ * by LoopBack IoC container.
20
+ *
21
+ * @example
22
+ * Usage - Typescript:
23
+ *
24
+ * ```ts
25
+ * class InfoController {
26
+ * @inject('authentication.user') public userName: string;
27
+ *
28
+ * constructor(@inject('application.name') public appName: string) {
29
+ * }
30
+ * // ...
31
+ * }
32
+ * ```
33
+ *
34
+ * Usage - JavaScript:
35
+ *
36
+ * - TODO(bajtos)
37
+ *
38
+ * @param bindingSelector - What binding to use in order to resolve the value of the
39
+ * decorated constructor parameter or property.
40
+ * @param metadata - Optional metadata to help the injection
41
+ * @param resolve - Optional function to resolve the injection
42
+ *
43
+ */
44
+ function inject(bindingSelector, metadata, resolve) {
45
+ if (typeof bindingSelector === 'function' && !resolve) {
46
+ resolve = resolveValuesByFilter;
47
+ }
48
+ const injectionMetadata = Object.assign({ decorator: '@inject' }, metadata);
49
+ if (injectionMetadata.bindingComparator && !resolve) {
50
+ throw new Error('Binding comparator is only allowed with a binding filter');
51
+ }
52
+ if (!bindingSelector && typeof resolve !== 'function') {
53
+ throw new Error('A non-empty binding selector or resolve function is required for @inject');
54
+ }
55
+ return function markParameterOrPropertyAsInjected(target, member, methodDescriptorOrParameterIndex) {
56
+ if (typeof methodDescriptorOrParameterIndex === 'number') {
57
+ // The decorator is applied to a method parameter
58
+ // Please note propertyKey is `undefined` for constructor
59
+ const paramDecorator = metadata_1.ParameterDecoratorFactory.createDecorator(INJECT_PARAMETERS_KEY, {
60
+ target,
61
+ member,
62
+ methodDescriptorOrParameterIndex,
63
+ bindingSelector,
64
+ metadata: injectionMetadata,
65
+ resolve,
66
+ },
67
+ // Do not deep clone the spec as only metadata is mutable and it's
68
+ // shallowly cloned
69
+ { cloneInputSpec: false, decoratorName: injectionMetadata.decorator });
70
+ paramDecorator(target, member, methodDescriptorOrParameterIndex);
71
+ }
72
+ else if (member) {
73
+ // Property or method
74
+ if (target instanceof Function) {
75
+ throw new Error('@inject is not supported for a static property: ' +
76
+ metadata_1.DecoratorFactory.getTargetName(target, member));
77
+ }
78
+ if (methodDescriptorOrParameterIndex) {
79
+ // Method
80
+ throw new Error('@inject cannot be used on a method: ' +
81
+ metadata_1.DecoratorFactory.getTargetName(target, member, methodDescriptorOrParameterIndex));
82
+ }
83
+ const propDecorator = metadata_1.PropertyDecoratorFactory.createDecorator(INJECT_PROPERTIES_KEY, {
84
+ target,
85
+ member,
86
+ methodDescriptorOrParameterIndex,
87
+ bindingSelector,
88
+ metadata: injectionMetadata,
89
+ resolve,
90
+ },
91
+ // Do not deep clone the spec as only metadata is mutable and it's
92
+ // shallowly cloned
93
+ { cloneInputSpec: false, decoratorName: injectionMetadata.decorator });
94
+ propDecorator(target, member);
95
+ }
96
+ else {
97
+ // It won't happen here as `@inject` is not compatible with ClassDecorator
98
+ /* istanbul ignore next */
99
+ throw new Error('@inject can only be used on a property or a method parameter');
100
+ }
101
+ };
102
+ }
103
+ exports.inject = inject;
104
+ var Getter;
105
+ (function (Getter) {
106
+ /**
107
+ * Convert a value into a Getter returning that value.
108
+ * @param value
109
+ */
110
+ function fromValue(value) {
111
+ return () => Promise.resolve(value);
112
+ }
113
+ Getter.fromValue = fromValue;
114
+ })(Getter = exports.Getter || (exports.Getter = {}));
115
+ (function (inject) {
116
+ /**
117
+ * Inject a function for getting the actual bound value.
118
+ *
119
+ * This is useful when implementing Actions, where
120
+ * the action is instantiated for Sequence constructor, but some
121
+ * of action's dependencies become bound only after other actions
122
+ * have been executed by the sequence.
123
+ *
124
+ * See also `Getter<T>`.
125
+ *
126
+ * @param bindingSelector - The binding key or filter we want to eventually get
127
+ * value(s) from.
128
+ * @param metadata - Optional metadata to help the injection
129
+ */
130
+ inject.getter = function injectGetter(bindingSelector, metadata) {
131
+ metadata = Object.assign({ decorator: '@inject.getter' }, metadata);
132
+ return inject(bindingSelector, metadata, (0, binding_filter_1.isBindingAddress)(bindingSelector)
133
+ ? resolveAsGetter
134
+ : resolveAsGetterByFilter);
135
+ };
136
+ /**
137
+ * Inject a function for setting (binding) the given key to a given
138
+ * value. (Only static/constant values are supported, it's not possible
139
+ * to bind a key to a class or a provider.)
140
+ *
141
+ * This is useful e.g. when implementing Actions that are contributing
142
+ * new Elements.
143
+ *
144
+ * See also `Setter<T>`.
145
+ *
146
+ * @param bindingKey - The key of the value we want to set.
147
+ * @param metadata - Optional metadata to help the injection
148
+ */
149
+ inject.setter = function injectSetter(bindingKey, metadata) {
150
+ metadata = Object.assign({ decorator: '@inject.setter' }, metadata);
151
+ return inject(bindingKey, metadata, resolveAsSetter);
152
+ };
153
+ /**
154
+ * Inject the binding object for the given key. This is useful if a binding
155
+ * needs to be set up beyond just a constant value allowed by
156
+ * `@inject.setter`. The injected binding is found or created based on the
157
+ * `metadata.bindingCreation` option. See `BindingCreationPolicy` for more
158
+ * details.
159
+ *
160
+ * @example
161
+ *
162
+ * ```ts
163
+ * class MyAuthAction {
164
+ * @inject.binding('current-user', {
165
+ * bindingCreation: BindingCreationPolicy.ALWAYS_CREATE,
166
+ * })
167
+ * private userBinding: Binding<UserProfile>;
168
+ *
169
+ * async authenticate() {
170
+ * this.userBinding.toDynamicValue(() => {...});
171
+ * }
172
+ * }
173
+ * ```
174
+ *
175
+ * @param bindingKey - Binding key
176
+ * @param metadata - Metadata for the injection
177
+ */
178
+ inject.binding = function injectBinding(bindingKey, metadata) {
179
+ metadata = Object.assign({ decorator: '@inject.binding' }, metadata);
180
+ return inject(bindingKey !== null && bindingKey !== void 0 ? bindingKey : '', metadata, resolveAsBinding);
181
+ };
182
+ /**
183
+ * Inject an array of values by a tag pattern string or regexp
184
+ *
185
+ * @example
186
+ * ```ts
187
+ * class AuthenticationManager {
188
+ * constructor(
189
+ * @inject.tag('authentication.strategy') public strategies: Strategy[],
190
+ * ) {}
191
+ * }
192
+ * ```
193
+ * @param bindingTag - Tag name, regex or object
194
+ * @param metadata - Optional metadata to help the injection
195
+ */
196
+ inject.tag = function injectByTag(bindingTag, metadata) {
197
+ metadata = Object.assign({ decorator: '@inject.tag', tag: bindingTag }, metadata);
198
+ return inject((0, binding_filter_1.filterByTag)(bindingTag), metadata);
199
+ };
200
+ /**
201
+ * Inject matching bound values by the filter function
202
+ *
203
+ * @example
204
+ * ```ts
205
+ * class MyControllerWithView {
206
+ * @inject.view(filterByTag('foo'))
207
+ * view: ContextView<string[]>;
208
+ * }
209
+ * ```
210
+ * @param bindingFilter - A binding filter function
211
+ * @param metadata
212
+ */
213
+ inject.view = function injectContextView(bindingFilter, metadata) {
214
+ metadata = Object.assign({ decorator: '@inject.view' }, metadata);
215
+ return inject(bindingFilter, metadata, resolveAsContextView);
216
+ };
217
+ /**
218
+ * Inject the context object.
219
+ *
220
+ * @example
221
+ * ```ts
222
+ * class MyProvider {
223
+ * constructor(@inject.context() private ctx: Context) {}
224
+ * }
225
+ * ```
226
+ */
227
+ inject.context = function injectContext() {
228
+ return inject('', { decorator: '@inject.context' }, (ctx) => ctx);
229
+ };
230
+ })(inject = exports.inject || (exports.inject = {}));
231
+ /**
232
+ * Assert the target type inspected from TypeScript for injection to be the
233
+ * expected type. If the types don't match, an error is thrown.
234
+ * @param injection - Injection information
235
+ * @param expectedType - Expected type
236
+ * @param expectedTypeName - Name of the expected type to be used in the error
237
+ * @returns The name of the target
238
+ */
239
+ function assertTargetType(injection, expectedType, expectedTypeName) {
240
+ const targetName = resolution_session_1.ResolutionSession.describeInjection(injection).targetName;
241
+ const targetType = inspectTargetType(injection);
242
+ if (targetType && targetType !== expectedType) {
243
+ expectedTypeName = expectedTypeName !== null && expectedTypeName !== void 0 ? expectedTypeName : expectedType.name;
244
+ throw new Error(`The type of ${targetName} (${targetType.name}) is not ${expectedTypeName}`);
245
+ }
246
+ return targetName;
247
+ }
248
+ exports.assertTargetType = assertTargetType;
249
+ /**
250
+ * Resolver for `@inject.getter`
251
+ * @param ctx
252
+ * @param injection
253
+ * @param session
254
+ */
255
+ function resolveAsGetter(ctx, injection, session) {
256
+ assertTargetType(injection, Function, 'Getter function');
257
+ const bindingSelector = injection.bindingSelector;
258
+ // We need to clone the session for the getter as it will be resolved later
259
+ const forkedSession = resolution_session_1.ResolutionSession.fork(session);
260
+ const options = {
261
+ session: forkedSession,
262
+ ...injection.metadata,
263
+ };
264
+ return function getter() {
265
+ return ctx.get(bindingSelector, options);
266
+ };
267
+ }
268
+ /**
269
+ * Resolver for `@inject.setter`
270
+ * @param ctx
271
+ * @param injection
272
+ */
273
+ function resolveAsSetter(ctx, injection) {
274
+ const targetName = assertTargetType(injection, Function, 'Setter function');
275
+ const bindingSelector = injection.bindingSelector;
276
+ if (!(0, binding_filter_1.isBindingAddress)(bindingSelector)) {
277
+ throw new Error(`@inject.setter (${targetName}) does not allow BindingFilter.`);
278
+ }
279
+ if (bindingSelector === '') {
280
+ throw new Error('Binding key is not set for @inject.setter');
281
+ }
282
+ // No resolution session should be propagated into the setter
283
+ return function setter(value) {
284
+ const binding = findOrCreateBindingForInjection(ctx, injection);
285
+ binding.to(value);
286
+ };
287
+ }
288
+ function resolveAsBinding(ctx, injection, session) {
289
+ const targetName = assertTargetType(injection, binding_1.Binding);
290
+ const bindingSelector = injection.bindingSelector;
291
+ if (!(0, binding_filter_1.isBindingAddress)(bindingSelector)) {
292
+ throw new Error(`@inject.binding (${targetName}) does not allow BindingFilter.`);
293
+ }
294
+ return findOrCreateBindingForInjection(ctx, injection, session);
295
+ }
296
+ function findOrCreateBindingForInjection(ctx, injection, session) {
297
+ if (injection.bindingSelector === '')
298
+ return session === null || session === void 0 ? void 0 : session.currentBinding;
299
+ const bindingCreation = injection.metadata &&
300
+ injection.metadata.bindingCreation;
301
+ const binding = ctx.findOrCreateBinding(injection.bindingSelector, bindingCreation);
302
+ return binding;
303
+ }
304
+ /**
305
+ * Check if constructor injection should be applied to the base class
306
+ * of the given target class
307
+ *
308
+ * @param targetClass - Target class
309
+ */
310
+ function shouldSkipBaseConstructorInjection(targetClass) {
311
+ // FXIME(rfeng): We use the class definition to check certain patterns
312
+ const classDef = targetClass.toString();
313
+ return (
314
+ /*
315
+ * See https://github.com/loopbackio/loopback-next/issues/2946
316
+ * A class decorator can return a new constructor that mixes in
317
+ * additional properties/methods.
318
+ *
319
+ * @example
320
+ * ```ts
321
+ * class extends baseConstructor {
322
+ * // The constructor calls `super(...arguments)`
323
+ * constructor() {
324
+ * super(...arguments);
325
+ * }
326
+ * classProperty = 'a classProperty';
327
+ * classFunction() {
328
+ * return 'a classFunction';
329
+ * }
330
+ * };
331
+ * ```
332
+ *
333
+ * We check the following pattern:
334
+ * ```ts
335
+ * constructor() {
336
+ * super(...arguments);
337
+ * }
338
+ * ```
339
+ */
340
+ !classDef.match(/\s+constructor\s*\(\s*\)\s*\{\s*super\(\.\.\.arguments\)/) &&
341
+ /*
342
+ * See https://github.com/loopbackio/loopback-next/issues/1565
343
+ *
344
+ * @example
345
+ * ```ts
346
+ * class BaseClass {
347
+ * constructor(@inject('foo') protected foo: string) {}
348
+ * // ...
349
+ * }
350
+ *
351
+ * class SubClass extends BaseClass {
352
+ * // No explicit constructor is present
353
+ *
354
+ * @inject('bar')
355
+ * private bar: number;
356
+ * // ...
357
+ * };
358
+ *
359
+ */
360
+ classDef.match(/\s+constructor\s*\([^\)]*\)\s+\{/m));
361
+ }
362
+ /**
363
+ * Return an array of injection objects for parameters
364
+ * @param target - The target class for constructor or static methods,
365
+ * or the prototype for instance methods
366
+ * @param method - Method name, undefined for constructor
367
+ */
368
+ function describeInjectedArguments(target, method) {
369
+ var _a, _b;
370
+ method = method !== null && method !== void 0 ? method : '';
371
+ // Try to read from cache
372
+ const cache = (_a = metadata_1.MetadataInspector.getAllMethodMetadata(INJECT_METHODS_KEY, target, {
373
+ ownMetadataOnly: true,
374
+ })) !== null && _a !== void 0 ? _a : {};
375
+ let meta = cache[method];
376
+ if (meta)
377
+ return meta;
378
+ // Build the description
379
+ const options = {};
380
+ if (method === '') {
381
+ if (shouldSkipBaseConstructorInjection(target)) {
382
+ options.ownMetadataOnly = true;
383
+ }
384
+ }
385
+ else if (Object.prototype.hasOwnProperty.call(target, method)) {
386
+ // The method exists in the target, no injections on the super method
387
+ // should be honored
388
+ options.ownMetadataOnly = true;
389
+ }
390
+ meta =
391
+ (_b = metadata_1.MetadataInspector.getAllParameterMetadata(INJECT_PARAMETERS_KEY, target, method, options)) !== null && _b !== void 0 ? _b : [];
392
+ // Cache the result
393
+ cache[method] = meta;
394
+ metadata_1.MetadataInspector.defineMetadata(INJECT_METHODS_KEY, cache, target);
395
+ return meta;
396
+ }
397
+ exports.describeInjectedArguments = describeInjectedArguments;
398
+ /**
399
+ * Inspect the target type for the injection to find out the corresponding
400
+ * JavaScript type
401
+ * @param injection - Injection information
402
+ */
403
+ function inspectTargetType(injection) {
404
+ var _a;
405
+ if (typeof injection.methodDescriptorOrParameterIndex === 'number') {
406
+ const designType = metadata_1.MetadataInspector.getDesignTypeForMethod(injection.target, injection.member);
407
+ return (_a = designType === null || designType === void 0 ? void 0 : designType.parameterTypes) === null || _a === void 0 ? void 0 : _a[injection.methodDescriptorOrParameterIndex];
408
+ }
409
+ return metadata_1.MetadataInspector.getDesignTypeForProperty(injection.target, injection.member);
410
+ }
411
+ exports.inspectTargetType = inspectTargetType;
412
+ /**
413
+ * Resolve an array of bound values matching the filter function for `@inject`.
414
+ * @param ctx - Context object
415
+ * @param injection - Injection information
416
+ * @param session - Resolution session
417
+ */
418
+ function resolveValuesByFilter(ctx, injection, session) {
419
+ assertTargetType(injection, Array);
420
+ const bindingFilter = injection.bindingSelector;
421
+ const view = new context_view_1.ContextView(ctx, bindingFilter, injection.metadata.bindingComparator);
422
+ return view.resolve(session);
423
+ }
424
+ /**
425
+ * Resolve to a getter function that returns an array of bound values matching
426
+ * the filter function for `@inject.getter`.
427
+ *
428
+ * @param ctx - Context object
429
+ * @param injection - Injection information
430
+ * @param session - Resolution session
431
+ */
432
+ function resolveAsGetterByFilter(ctx, injection, session) {
433
+ assertTargetType(injection, Function, 'Getter function');
434
+ const bindingFilter = injection.bindingSelector;
435
+ return (0, context_view_1.createViewGetter)(ctx, bindingFilter, injection.metadata.bindingComparator, session);
436
+ }
437
+ /**
438
+ * Resolve to an instance of `ContextView` by the binding filter function
439
+ * for `@inject.view`
440
+ * @param ctx - Context object
441
+ * @param injection - Injection information
442
+ */
443
+ function resolveAsContextView(ctx, injection) {
444
+ assertTargetType(injection, context_view_1.ContextView);
445
+ const bindingFilter = injection.bindingSelector;
446
+ const view = new context_view_1.ContextView(ctx, bindingFilter, injection.metadata.bindingComparator);
447
+ view.open();
448
+ return view;
449
+ }
450
+ /**
451
+ * Return a map of injection objects for properties
452
+ * @param target - The target class for static properties or
453
+ * prototype for instance properties.
454
+ */
455
+ function describeInjectedProperties(target) {
456
+ var _a;
457
+ const metadata = (_a = metadata_1.MetadataInspector.getAllPropertyMetadata(INJECT_PROPERTIES_KEY, target)) !== null && _a !== void 0 ? _a : {};
458
+ return metadata;
459
+ }
460
+ exports.describeInjectedProperties = describeInjectedProperties;
461
+ /**
462
+ * Inspect injections for a binding created with `toClass` or `toProvider`
463
+ * @param binding - Binding object
464
+ */
465
+ function inspectInjections(binding) {
466
+ var _a;
467
+ const json = {};
468
+ const ctor = (_a = binding.valueConstructor) !== null && _a !== void 0 ? _a : binding.providerConstructor;
469
+ if (ctor == null)
470
+ return json;
471
+ const constructorInjections = describeInjectedArguments(ctor, '').map(inspectInjection);
472
+ if (constructorInjections.length) {
473
+ json.constructorArguments = constructorInjections;
474
+ }
475
+ const propertyInjections = describeInjectedProperties(ctor.prototype);
476
+ const properties = {};
477
+ for (const p in propertyInjections) {
478
+ properties[p] = inspectInjection(propertyInjections[p]);
479
+ }
480
+ if (Object.keys(properties).length) {
481
+ json.properties = properties;
482
+ }
483
+ return json;
484
+ }
485
+ exports.inspectInjections = inspectInjections;
486
+ /**
487
+ * Inspect an injection
488
+ * @param injection - Injection information
489
+ */
490
+ function inspectInjection(injection) {
491
+ var _a, _b;
492
+ const injectionInfo = resolution_session_1.ResolutionSession.describeInjection(injection);
493
+ const descriptor = {};
494
+ if (injectionInfo.targetName) {
495
+ descriptor.targetName = injectionInfo.targetName;
496
+ }
497
+ if ((0, binding_filter_1.isBindingAddress)(injectionInfo.bindingSelector)) {
498
+ // Binding key
499
+ descriptor.bindingKey = injectionInfo.bindingSelector.toString();
500
+ }
501
+ else if ((0, binding_filter_1.isBindingTagFilter)(injectionInfo.bindingSelector)) {
502
+ // Binding tag filter
503
+ descriptor.bindingTagPattern = JSON.parse(JSON.stringify(injectionInfo.bindingSelector.bindingTagPattern));
504
+ }
505
+ else {
506
+ // Binding filter function
507
+ descriptor.bindingFilter =
508
+ (_b = (_a = injectionInfo.bindingSelector) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '<function>';
509
+ }
510
+ // Inspect metadata
511
+ if (injectionInfo.metadata) {
512
+ if (injectionInfo.metadata.decorator &&
513
+ injectionInfo.metadata.decorator !== '@inject') {
514
+ descriptor.decorator = injectionInfo.metadata.decorator;
515
+ }
516
+ if (injectionInfo.metadata.optional) {
517
+ descriptor.optional = injectionInfo.metadata.optional;
518
+ }
519
+ }
520
+ return descriptor;
521
+ }
522
+ /**
523
+ * Check if the given class has `@inject` or other decorations that map to
524
+ * `@inject`.
525
+ *
526
+ * @param cls - Class with possible `@inject` decorations
527
+ */
528
+ function hasInjections(cls) {
529
+ return (metadata_1.MetadataInspector.getClassMetadata(INJECT_PARAMETERS_KEY, cls) != null ||
530
+ metadata_1.Reflector.getMetadata(INJECT_PARAMETERS_KEY.toString(), cls.prototype) !=
531
+ null ||
532
+ metadata_1.MetadataInspector.getAllPropertyMetadata(INJECT_PROPERTIES_KEY, cls.prototype) != null);
533
+ }
534
+ exports.hasInjections = hasInjections;
535
+ //# sourceMappingURL=inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.js","sourceRoot":"","sources":["../src/inject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { Context } from './context';
2
+ import { InvocationArgs, InvocationSource } from './invocation';
3
+ import { ResolutionSession } from './resolution-session';
4
+ import { ValueOrPromise } from './value-promise';
5
+ /**
6
+ * Create the Promise type for `T`. If `T` extends `Promise`, the type is `T`,
7
+ * otherwise the type is `ValueOrPromise<T>`.
8
+ */
9
+ export declare type AsValueOrPromise<T> = T extends Promise<unknown> ? T : ValueOrPromise<T>;
10
+ /**
11
+ * The intercepted variant of a function to return `ValueOrPromise<T>`.
12
+ * If `T` is not a function, the type is `T`.
13
+ */
14
+ export declare type AsInterceptedFunction<T> = T extends (...args: InvocationArgs) => infer R ? (...args: Parameters<T>) => AsValueOrPromise<R> : T;
15
+ /**
16
+ * The proxy type for `T`. The return type for any method of `T` with original
17
+ * return type `R` becomes `ValueOrPromise<R>` if `R` does not extend `Promise`.
18
+ * Property types stay untouched.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * class MyController {
23
+ * name: string;
24
+ *
25
+ * greet(name: string): string {
26
+ * return `Hello, ${name}`;
27
+ * }
28
+ *
29
+ * async hello(name: string) {
30
+ * return `Hello, ${name}`;
31
+ * }
32
+ * }
33
+ * ```
34
+ *
35
+ * `AsyncProxy<MyController>` will be:
36
+ * ```ts
37
+ * {
38
+ * name: string; // the same as MyController
39
+ * greet(name: string): ValueOrPromise<string>; // the return type becomes `ValueOrPromise<string>`
40
+ * hello(name: string): Promise<string>; // the same as MyController
41
+ * }
42
+ * ```
43
+ */
44
+ export declare type AsyncProxy<T> = {
45
+ [P in keyof T]: AsInterceptedFunction<T[P]>;
46
+ };
47
+ /**
48
+ * Invocation source for injected proxies. It wraps a snapshot of the
49
+ * `ResolutionSession` that tracks the binding/injection stack.
50
+ */
51
+ export declare class ProxySource implements InvocationSource<ResolutionSession> {
52
+ readonly value: ResolutionSession;
53
+ type: string;
54
+ constructor(value: ResolutionSession);
55
+ toString(): string;
56
+ }
57
+ /**
58
+ * A proxy handler that applies interceptors
59
+ *
60
+ * See https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Proxy
61
+ */
62
+ export declare class InterceptionHandler<T extends object> implements ProxyHandler<T> {
63
+ private context;
64
+ private session?;
65
+ private source?;
66
+ constructor(context?: Context, session?: ResolutionSession | undefined, source?: InvocationSource<unknown> | undefined);
67
+ get(target: T, propertyName: PropertyKey, receiver: unknown): any;
68
+ }
69
+ /**
70
+ * Create a proxy that applies interceptors for method invocations
71
+ * @param target - Target class or object
72
+ * @param context - Context object
73
+ * @param session - Resolution session
74
+ * @param source - Invocation source
75
+ */
76
+ export declare function createProxyWithInterceptors<T extends object>(target: T, context?: Context, session?: ResolutionSession, source?: InvocationSource): AsyncProxy<T>;