@loopback/context 4.0.0-alpha.8 → 4.1.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 (201) 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/binding.d.ts +0 -75
  115. package/lib/binding.js +0 -103
  116. package/lib/binding.js.map +0 -1
  117. package/lib/context.d.ts +0 -14
  118. package/lib/context.js +0 -97
  119. package/lib/context.js.map +0 -1
  120. package/lib/index.d.ts +0 -1
  121. package/lib/index.js +0 -12
  122. package/lib/index.js.map +0 -1
  123. package/lib/inject.d.ts +0 -46
  124. package/lib/inject.js +0 -74
  125. package/lib/inject.js.map +0 -1
  126. package/lib/isPromise.d.ts +0 -1
  127. package/lib/isPromise.js +0 -15
  128. package/lib/isPromise.js.map +0 -1
  129. package/lib/reflect.d.ts +0 -39
  130. package/lib/reflect.js +0 -20
  131. package/lib/reflect.js.map +0 -1
  132. package/lib/resolver.d.ts +0 -30
  133. package/lib/resolver.js +0 -129
  134. package/lib/resolver.js.map +0 -1
  135. package/lib/src/binding.d.ts +0 -85
  136. package/lib/src/binding.js +0 -123
  137. package/lib/src/binding.js.map +0 -1
  138. package/lib/src/context.d.ts +0 -14
  139. package/lib/src/context.js +0 -97
  140. package/lib/src/context.js.map +0 -1
  141. package/lib/src/index.d.ts +0 -10
  142. package/lib/src/index.js +0 -27
  143. package/lib/src/index.js.map +0 -1
  144. package/lib/src/inject.d.ts +0 -46
  145. package/lib/src/inject.js +0 -74
  146. package/lib/src/inject.js.map +0 -1
  147. package/lib/src/isPromise.d.ts +0 -1
  148. package/lib/src/isPromise.js +0 -15
  149. package/lib/src/isPromise.js.map +0 -1
  150. package/lib/src/provider.d.ts +0 -29
  151. package/lib/src/provider.js.map +0 -1
  152. package/lib/src/reflect.d.ts +0 -38
  153. package/lib/src/reflect.js +0 -143
  154. package/lib/src/reflect.js.map +0 -1
  155. package/lib/src/resolver.d.ts +0 -34
  156. package/lib/src/resolver.js +0 -144
  157. package/lib/src/resolver.js.map +0 -1
  158. package/lib6/binding.d.ts +0 -75
  159. package/lib6/binding.js +0 -103
  160. package/lib6/binding.js.map +0 -1
  161. package/lib6/context.d.ts +0 -14
  162. package/lib6/context.js +0 -97
  163. package/lib6/context.js.map +0 -1
  164. package/lib6/index.d.ts +0 -1
  165. package/lib6/index.js +0 -12
  166. package/lib6/index.js.map +0 -1
  167. package/lib6/inject.d.ts +0 -46
  168. package/lib6/inject.js +0 -74
  169. package/lib6/inject.js.map +0 -1
  170. package/lib6/isPromise.d.ts +0 -1
  171. package/lib6/isPromise.js +0 -15
  172. package/lib6/isPromise.js.map +0 -1
  173. package/lib6/reflect.d.ts +0 -39
  174. package/lib6/reflect.js +0 -20
  175. package/lib6/reflect.js.map +0 -1
  176. package/lib6/resolver.d.ts +0 -30
  177. package/lib6/resolver.js +0 -129
  178. package/lib6/resolver.js.map +0 -1
  179. package/lib6/src/binding.d.ts +0 -85
  180. package/lib6/src/binding.js +0 -133
  181. package/lib6/src/binding.js.map +0 -1
  182. package/lib6/src/context.d.ts +0 -14
  183. package/lib6/src/context.js +0 -97
  184. package/lib6/src/context.js.map +0 -1
  185. package/lib6/src/index.d.ts +0 -10
  186. package/lib6/src/index.js +0 -27
  187. package/lib6/src/index.js.map +0 -1
  188. package/lib6/src/inject.d.ts +0 -46
  189. package/lib6/src/inject.js +0 -74
  190. package/lib6/src/inject.js.map +0 -1
  191. package/lib6/src/isPromise.d.ts +0 -1
  192. package/lib6/src/isPromise.js +0 -15
  193. package/lib6/src/isPromise.js.map +0 -1
  194. package/lib6/src/provider.d.ts +0 -29
  195. package/lib6/src/provider.js.map +0 -1
  196. package/lib6/src/reflect.d.ts +0 -38
  197. package/lib6/src/reflect.js +0 -143
  198. package/lib6/src/reflect.js.map +0 -1
  199. package/lib6/src/resolver.d.ts +0 -34
  200. package/lib6/src/resolver.js +0 -154
  201. package/lib6/src/resolver.js.map +0 -1
@@ -0,0 +1,299 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2019,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.registerInterceptor = exports.invokeMethodWithInterceptors = exports.intercept = exports.INTERCEPT_CLASS_KEY = exports.mergeInterceptors = exports.INTERCEPT_METHOD_KEY = exports.globalInterceptor = exports.asGlobalInterceptor = exports.InterceptedInvocationContext = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const metadata_1 = require("@loopback/metadata");
10
+ const assert_1 = (0, tslib_1.__importDefault)(require("assert"));
11
+ const debug_1 = (0, tslib_1.__importDefault)(require("debug"));
12
+ const binding_decorator_1 = require("./binding-decorator");
13
+ const binding_inspector_1 = require("./binding-inspector");
14
+ const binding_key_1 = require("./binding-key");
15
+ const binding_sorter_1 = require("./binding-sorter");
16
+ const interceptor_chain_1 = require("./interceptor-chain");
17
+ const invocation_1 = require("./invocation");
18
+ const keys_1 = require("./keys");
19
+ const value_promise_1 = require("./value-promise");
20
+ const debug = (0, debug_1.default)('loopback:context:interceptor');
21
+ /**
22
+ * A specialized InvocationContext for interceptors
23
+ */
24
+ class InterceptedInvocationContext extends invocation_1.InvocationContext {
25
+ /**
26
+ * Discover all binding keys for global interceptors (tagged by
27
+ * ContextTags.GLOBAL_INTERCEPTOR)
28
+ */
29
+ getGlobalInterceptorBindingKeys() {
30
+ let bindings = this.findByTag(keys_1.ContextTags.GLOBAL_INTERCEPTOR);
31
+ bindings = bindings.filter(binding =>
32
+ // Only include interceptors that match the source type of the invocation
33
+ this.applicableTo(binding));
34
+ this.sortGlobalInterceptorBindings(bindings);
35
+ const keys = bindings.map(b => b.key);
36
+ debug('Global interceptor binding keys:', keys);
37
+ return keys;
38
+ }
39
+ /**
40
+ * Check if the binding for a global interceptor matches the source type
41
+ * of the invocation
42
+ * @param binding - Binding
43
+ */
44
+ applicableTo(binding) {
45
+ var _a;
46
+ const sourceType = (_a = this.source) === null || _a === void 0 ? void 0 : _a.type;
47
+ // Unknown source type, always apply
48
+ if (sourceType == null)
49
+ return true;
50
+ const allowedSource = binding.tagMap[keys_1.ContextTags.GLOBAL_INTERCEPTOR_SOURCE];
51
+ return (
52
+ // No tag, always apply
53
+ allowedSource == null ||
54
+ // source matched
55
+ allowedSource === sourceType ||
56
+ // source included in the string[]
57
+ (Array.isArray(allowedSource) && allowedSource.includes(sourceType)));
58
+ }
59
+ /**
60
+ * Sort global interceptor bindings by `globalInterceptorGroup` tags
61
+ * @param bindings - An array of global interceptor bindings
62
+ */
63
+ sortGlobalInterceptorBindings(bindings) {
64
+ var _a;
65
+ // Get predefined ordered groups for global interceptors
66
+ const orderedGroups = (_a = this.getSync(keys_1.ContextBindings.GLOBAL_INTERCEPTOR_ORDERED_GROUPS, {
67
+ optional: true,
68
+ })) !== null && _a !== void 0 ? _a : [];
69
+ return (0, binding_sorter_1.sortBindingsByPhase)(bindings, keys_1.ContextTags.GLOBAL_INTERCEPTOR_GROUP, orderedGroups);
70
+ }
71
+ /**
72
+ * Load all interceptors for the given invocation context. It adds
73
+ * interceptors from possibly three sources:
74
+ * 1. method level `@intercept`
75
+ * 2. class level `@intercept`
76
+ * 3. global interceptors discovered in the context
77
+ */
78
+ loadInterceptors() {
79
+ var _a, _b;
80
+ let interceptors = (_a = metadata_1.MetadataInspector.getMethodMetadata(exports.INTERCEPT_METHOD_KEY, this.target, this.methodName)) !== null && _a !== void 0 ? _a : [];
81
+ const targetClass = typeof this.target === 'function' ? this.target : this.target.constructor;
82
+ const classInterceptors = (_b = metadata_1.MetadataInspector.getClassMetadata(exports.INTERCEPT_CLASS_KEY, targetClass)) !== null && _b !== void 0 ? _b : [];
83
+ // Inserting class level interceptors before method level ones
84
+ interceptors = mergeInterceptors(classInterceptors, interceptors);
85
+ const globalInterceptors = this.getGlobalInterceptorBindingKeys();
86
+ // Inserting global interceptors
87
+ interceptors = mergeInterceptors(globalInterceptors, interceptors);
88
+ debug('Interceptors for %s', this.targetName, interceptors);
89
+ return interceptors;
90
+ }
91
+ }
92
+ exports.InterceptedInvocationContext = InterceptedInvocationContext;
93
+ /**
94
+ * The `BindingTemplate` function to configure a binding as a global interceptor
95
+ * by tagging it with `ContextTags.INTERCEPTOR`
96
+ * @param group - Group for ordering the interceptor
97
+ */
98
+ function asGlobalInterceptor(group) {
99
+ return binding => {
100
+ binding
101
+ // Tagging with `GLOBAL_INTERCEPTOR` is required.
102
+ .tag(keys_1.ContextTags.GLOBAL_INTERCEPTOR)
103
+ // `GLOBAL_INTERCEPTOR_NAMESPACE` is to make the binding key more readable.
104
+ .tag({ [keys_1.ContextTags.NAMESPACE]: keys_1.GLOBAL_INTERCEPTOR_NAMESPACE });
105
+ if (group)
106
+ binding.tag({ [keys_1.ContextTags.GLOBAL_INTERCEPTOR_GROUP]: group });
107
+ };
108
+ }
109
+ exports.asGlobalInterceptor = asGlobalInterceptor;
110
+ /**
111
+ * `@globalInterceptor` decorator to mark the class as a global interceptor
112
+ * @param group - Group for ordering the interceptor
113
+ * @param specs - Extra binding specs
114
+ */
115
+ function globalInterceptor(group, ...specs) {
116
+ return (0, binding_decorator_1.injectable)(asGlobalInterceptor(group), ...specs);
117
+ }
118
+ exports.globalInterceptor = globalInterceptor;
119
+ /**
120
+ * Metadata key for method-level interceptors
121
+ */
122
+ exports.INTERCEPT_METHOD_KEY = metadata_1.MetadataAccessor.create('intercept:method');
123
+ /**
124
+ * Adding interceptors from the spec to the front of existing ones. Duplicate
125
+ * entries are eliminated from the spec side.
126
+ *
127
+ * For example:
128
+ *
129
+ * - [log] + [cache, log] => [cache, log]
130
+ * - [log] + [log, cache] => [log, cache]
131
+ * - [] + [cache, log] => [cache, log]
132
+ * - [cache, log] + [] => [cache, log]
133
+ * - [log] + [cache] => [log, cache]
134
+ *
135
+ * @param interceptorsFromSpec - Interceptors from `@intercept`
136
+ * @param existingInterceptors - Interceptors already applied for the method
137
+ */
138
+ function mergeInterceptors(interceptorsFromSpec, existingInterceptors) {
139
+ const interceptorsToApply = new Set(interceptorsFromSpec);
140
+ const appliedInterceptors = new Set(existingInterceptors);
141
+ // Remove interceptors that already exist
142
+ for (const i of interceptorsToApply) {
143
+ if (appliedInterceptors.has(i)) {
144
+ interceptorsToApply.delete(i);
145
+ }
146
+ }
147
+ // Add existing interceptors after ones from the spec
148
+ for (const i of appliedInterceptors) {
149
+ interceptorsToApply.add(i);
150
+ }
151
+ return Array.from(interceptorsToApply);
152
+ }
153
+ exports.mergeInterceptors = mergeInterceptors;
154
+ /**
155
+ * Metadata key for method-level interceptors
156
+ */
157
+ exports.INTERCEPT_CLASS_KEY = metadata_1.MetadataAccessor.create('intercept:class');
158
+ /**
159
+ * A factory to define `@intercept` for classes. It allows `@intercept` to be
160
+ * used multiple times on the same class.
161
+ */
162
+ class InterceptClassDecoratorFactory extends metadata_1.ClassDecoratorFactory {
163
+ mergeWithOwn(ownMetadata, target) {
164
+ ownMetadata = ownMetadata || [];
165
+ return mergeInterceptors(this.spec, ownMetadata);
166
+ }
167
+ }
168
+ /**
169
+ * A factory to define `@intercept` for methods. It allows `@intercept` to be
170
+ * used multiple times on the same method.
171
+ */
172
+ class InterceptMethodDecoratorFactory extends metadata_1.MethodDecoratorFactory {
173
+ mergeWithOwn(ownMetadata, target, methodName, methodDescriptor) {
174
+ ownMetadata = ownMetadata || {};
175
+ const interceptors = ownMetadata[methodName] || [];
176
+ // Adding interceptors to the list
177
+ ownMetadata[methodName] = mergeInterceptors(this.spec, interceptors);
178
+ return ownMetadata;
179
+ }
180
+ }
181
+ /**
182
+ * Decorator function `@intercept` for classes/methods to apply interceptors. It
183
+ * can be applied on a class and its public methods. Multiple occurrences of
184
+ * `@intercept` are allowed on the same target class or method. The decorator
185
+ * takes a list of `interceptor` functions or binding keys.
186
+ *
187
+ * @example
188
+ * ```ts
189
+ * @intercept(log, metrics)
190
+ * class MyController {
191
+ * @intercept('caching-interceptor')
192
+ * @intercept('name-validation-interceptor')
193
+ * greet(name: string) {
194
+ * return `Hello, ${name}`;
195
+ * }
196
+ * }
197
+ * ```
198
+ *
199
+ * @param interceptorOrKeys - One or more interceptors or binding keys that are
200
+ * resolved to be interceptors
201
+ */
202
+ function intercept(...interceptorOrKeys) {
203
+ return function interceptDecoratorForClassOrMethod(
204
+ // Class or a prototype
205
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
206
+ target, method,
207
+ // Use `any` to for `TypedPropertyDescriptor`
208
+ // See https://github.com/loopbackio/loopback-next/pull/2704
209
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
210
+ methodDescriptor) {
211
+ if (method && methodDescriptor) {
212
+ // Method
213
+ return InterceptMethodDecoratorFactory.createDecorator(exports.INTERCEPT_METHOD_KEY, interceptorOrKeys, { decoratorName: '@intercept' })(target, method, methodDescriptor);
214
+ }
215
+ if (typeof target === 'function' && !method && !methodDescriptor) {
216
+ // Class
217
+ return InterceptClassDecoratorFactory.createDecorator(exports.INTERCEPT_CLASS_KEY, interceptorOrKeys, { decoratorName: '@intercept' })(target);
218
+ }
219
+ // Not on a class or method
220
+ throw new Error('@intercept cannot be used on a property: ' +
221
+ metadata_1.DecoratorFactory.getTargetName(target, method, methodDescriptor));
222
+ };
223
+ }
224
+ exports.intercept = intercept;
225
+ /**
226
+ * Invoke a method with the given context
227
+ * @param context - Context object
228
+ * @param target - Target class (for static methods) or object (for instance methods)
229
+ * @param methodName - Method name
230
+ * @param args - An array of argument values
231
+ * @param options - Options for the invocation
232
+ */
233
+ function invokeMethodWithInterceptors(context, target, methodName, args, options = {}) {
234
+ // Do not allow `skipInterceptors` as it's against the function name
235
+ // `invokeMethodWithInterceptors`
236
+ (0, assert_1.default)(!options.skipInterceptors, 'skipInterceptors is not allowed');
237
+ const invocationCtx = new InterceptedInvocationContext(context, target, methodName, args, options.source);
238
+ invocationCtx.assertMethodExists();
239
+ return (0, value_promise_1.tryWithFinally)(() => {
240
+ const interceptors = invocationCtx.loadInterceptors();
241
+ const targetMethodInvoker = () => invocationCtx.invokeTargetMethod(options);
242
+ interceptors.push(targetMethodInvoker);
243
+ return (0, interceptor_chain_1.invokeInterceptors)(invocationCtx, interceptors);
244
+ }, () => invocationCtx.close());
245
+ }
246
+ exports.invokeMethodWithInterceptors = invokeMethodWithInterceptors;
247
+ /**
248
+ * Register an interceptor function or provider class to the given context
249
+ * @param ctx - Context object
250
+ * @param interceptor - An interceptor function or provider class
251
+ * @param options - Options for the interceptor binding
252
+ */
253
+ function registerInterceptor(ctx, interceptor, options = {}) {
254
+ var _a, _b, _c;
255
+ let { global } = options;
256
+ const { group, source } = options;
257
+ if (group != null || source != null) {
258
+ // If group or source is set, assuming global
259
+ global = global !== false;
260
+ }
261
+ const namespace = ((_b = (_a = options.namespace) !== null && _a !== void 0 ? _a : options.defaultNamespace) !== null && _b !== void 0 ? _b : global)
262
+ ? keys_1.GLOBAL_INTERCEPTOR_NAMESPACE
263
+ : keys_1.LOCAL_INTERCEPTOR_NAMESPACE;
264
+ let binding;
265
+ if ((0, binding_inspector_1.isProviderClass)(interceptor)) {
266
+ binding = (0, binding_inspector_1.createBindingFromClass)(interceptor, {
267
+ defaultNamespace: namespace,
268
+ ...options,
269
+ });
270
+ if (binding.tagMap[keys_1.ContextTags.GLOBAL_INTERCEPTOR]) {
271
+ global = true;
272
+ }
273
+ ctx.add(binding);
274
+ }
275
+ else {
276
+ let key = options.key;
277
+ if (!key) {
278
+ const name = (_c = options.name) !== null && _c !== void 0 ? _c : interceptor.name;
279
+ if (!name) {
280
+ key = binding_key_1.BindingKey.generate(namespace).key;
281
+ }
282
+ else {
283
+ key = `${namespace}.${name}`;
284
+ }
285
+ }
286
+ binding = ctx
287
+ .bind(key)
288
+ .to(interceptor);
289
+ }
290
+ if (global) {
291
+ binding.apply(asGlobalInterceptor(group));
292
+ if (source) {
293
+ binding.tag({ [keys_1.ContextTags.GLOBAL_INTERCEPTOR_SOURCE]: source });
294
+ }
295
+ }
296
+ return binding;
297
+ }
298
+ exports.registerInterceptor = registerInterceptor;
299
+ //# sourceMappingURL=interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import { Context } from './context';
2
+ import { ResolutionSession } from './resolution-session';
3
+ import { ValueOrPromise } from './value-promise';
4
+ /**
5
+ * Return value for a method invocation
6
+ */
7
+ export declare type InvocationResult = any;
8
+ /**
9
+ * Array of arguments for a method invocation
10
+ */
11
+ export declare type InvocationArgs = any[];
12
+ /**
13
+ * An interface to represent the caller of the invocation
14
+ */
15
+ export interface InvocationSource<T = unknown> {
16
+ /**
17
+ * Type of the invoker, such as `proxy` and `route`
18
+ */
19
+ readonly type: string;
20
+ /**
21
+ * Metadata for the source, such as `ResolutionSession`
22
+ */
23
+ readonly value: T;
24
+ }
25
+ /**
26
+ * InvocationContext represents the context to invoke interceptors for a method.
27
+ * The context can be used to access metadata about the invocation as well as
28
+ * other dependencies.
29
+ */
30
+ export declare class InvocationContext extends Context {
31
+ readonly target: object;
32
+ readonly methodName: string;
33
+ readonly args: InvocationArgs;
34
+ readonly source?: InvocationSource<unknown> | undefined;
35
+ /**
36
+ * Construct a new instance of `InvocationContext`
37
+ * @param parent - Parent context, such as the RequestContext
38
+ * @param target - Target class (for static methods) or prototype/object
39
+ * (for instance methods)
40
+ * @param methodName - Method name
41
+ * @param args - An array of arguments
42
+ */
43
+ constructor(parent: Context, target: object, methodName: string, args: InvocationArgs, source?: InvocationSource<unknown> | undefined);
44
+ /**
45
+ * The target class, such as `OrderController`
46
+ */
47
+ get targetClass(): Function;
48
+ /**
49
+ * The target name, such as `OrderController.prototype.cancelOrder`
50
+ */
51
+ get targetName(): string;
52
+ /**
53
+ * Description of the invocation
54
+ */
55
+ get description(): string;
56
+ toString(): string;
57
+ /**
58
+ * Assert the method exists on the target. An error will be thrown if otherwise.
59
+ * @param context - Invocation context
60
+ */
61
+ assertMethodExists(): Record<string, Function>;
62
+ /**
63
+ * Invoke the target method with the given context
64
+ * @param context - Invocation context
65
+ * @param options - Options for the invocation
66
+ */
67
+ invokeTargetMethod(options?: InvocationOptions): any;
68
+ }
69
+ /**
70
+ * Options to control invocations
71
+ */
72
+ export declare type InvocationOptions = {
73
+ /**
74
+ * Skip dependency injection on method parameters
75
+ */
76
+ skipParameterInjection?: boolean;
77
+ /**
78
+ * Skip invocation of interceptors
79
+ */
80
+ skipInterceptors?: boolean;
81
+ /**
82
+ * Information about the source object that makes the invocation. For REST,
83
+ * it's a `Route`. For injected proxies, it's a `Binding`.
84
+ */
85
+ source?: InvocationSource;
86
+ /**
87
+ * Resolution session
88
+ */
89
+ session?: ResolutionSession;
90
+ };
91
+ /**
92
+ * Invoke a method using dependency injection. Interceptors are invoked as part
93
+ * of the invocation.
94
+ * @param target - Target of the method, it will be the class for a static
95
+ * method, and instance or class prototype for a prototype method
96
+ * @param method - Name of the method
97
+ * @param ctx - Context object
98
+ * @param nonInjectedArgs - Optional array of args for non-injected parameters
99
+ * @param options - Options for the invocation
100
+ */
101
+ export declare function invokeMethod(target: object, method: string, ctx: Context, nonInjectedArgs?: InvocationArgs, options?: InvocationOptions): ValueOrPromise<InvocationResult>;
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2019,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.invokeMethod = exports.InvocationContext = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const metadata_1 = require("@loopback/metadata");
10
+ const assert_1 = (0, tslib_1.__importDefault)(require("assert"));
11
+ const debug_1 = (0, tslib_1.__importDefault)(require("debug"));
12
+ const context_1 = require("./context");
13
+ const interceptor_1 = require("./interceptor");
14
+ const resolver_1 = require("./resolver");
15
+ const value_promise_1 = require("./value-promise");
16
+ const debug = (0, debug_1.default)('loopback:context:invocation');
17
+ const getTargetName = metadata_1.DecoratorFactory.getTargetName;
18
+ /**
19
+ * InvocationContext represents the context to invoke interceptors for a method.
20
+ * The context can be used to access metadata about the invocation as well as
21
+ * other dependencies.
22
+ */
23
+ class InvocationContext extends context_1.Context {
24
+ /**
25
+ * Construct a new instance of `InvocationContext`
26
+ * @param parent - Parent context, such as the RequestContext
27
+ * @param target - Target class (for static methods) or prototype/object
28
+ * (for instance methods)
29
+ * @param methodName - Method name
30
+ * @param args - An array of arguments
31
+ */
32
+ constructor(parent, target, methodName, args, source) {
33
+ super(parent);
34
+ this.target = target;
35
+ this.methodName = methodName;
36
+ this.args = args;
37
+ this.source = source;
38
+ }
39
+ /**
40
+ * The target class, such as `OrderController`
41
+ */
42
+ get targetClass() {
43
+ return typeof this.target === 'function'
44
+ ? this.target
45
+ : this.target.constructor;
46
+ }
47
+ /**
48
+ * The target name, such as `OrderController.prototype.cancelOrder`
49
+ */
50
+ get targetName() {
51
+ return getTargetName(this.target, this.methodName);
52
+ }
53
+ /**
54
+ * Description of the invocation
55
+ */
56
+ get description() {
57
+ const source = this.source == null ? '' : `${this.source} => `;
58
+ return `InvocationContext(${this.name}): ${source}${this.targetName}`;
59
+ }
60
+ toString() {
61
+ return this.description;
62
+ }
63
+ /**
64
+ * Assert the method exists on the target. An error will be thrown if otherwise.
65
+ * @param context - Invocation context
66
+ */
67
+ assertMethodExists() {
68
+ const targetWithMethods = this.target;
69
+ if (typeof targetWithMethods[this.methodName] !== 'function') {
70
+ const targetName = getTargetName(this.target, this.methodName);
71
+ (0, assert_1.default)(false, `Method ${targetName} not found`);
72
+ }
73
+ return targetWithMethods;
74
+ }
75
+ /**
76
+ * Invoke the target method with the given context
77
+ * @param context - Invocation context
78
+ * @param options - Options for the invocation
79
+ */
80
+ invokeTargetMethod(options = { skipParameterInjection: true }) {
81
+ const targetWithMethods = this.assertMethodExists();
82
+ if (!options.skipParameterInjection) {
83
+ return invokeTargetMethodWithInjection(this, targetWithMethods, this.methodName, this.args, options.session);
84
+ }
85
+ return invokeTargetMethod(this, targetWithMethods, this.methodName, this.args);
86
+ }
87
+ }
88
+ exports.InvocationContext = InvocationContext;
89
+ /**
90
+ * Invoke a method using dependency injection. Interceptors are invoked as part
91
+ * of the invocation.
92
+ * @param target - Target of the method, it will be the class for a static
93
+ * method, and instance or class prototype for a prototype method
94
+ * @param method - Name of the method
95
+ * @param ctx - Context object
96
+ * @param nonInjectedArgs - Optional array of args for non-injected parameters
97
+ * @param options - Options for the invocation
98
+ */
99
+ function invokeMethod(target, method, ctx, nonInjectedArgs = [], options = {}) {
100
+ if (options.skipInterceptors) {
101
+ if (options.skipParameterInjection) {
102
+ // Invoke the target method directly without injection or interception
103
+ return invokeTargetMethod(ctx, target, method, nonInjectedArgs);
104
+ }
105
+ else {
106
+ return invokeTargetMethodWithInjection(ctx, target, method, nonInjectedArgs, options.session);
107
+ }
108
+ }
109
+ // Invoke the target method with interception but no injection
110
+ return (0, interceptor_1.invokeMethodWithInterceptors)(ctx, target, method, nonInjectedArgs, options);
111
+ }
112
+ exports.invokeMethod = invokeMethod;
113
+ /**
114
+ * Invoke a method. Method parameter dependency injection is honored.
115
+ * @param target - Target of the method, it will be the class for a static
116
+ * method, and instance or class prototype for a prototype method
117
+ * @param method - Name of the method
118
+ * @param ctx - Context
119
+ * @param nonInjectedArgs - Optional array of args for non-injected parameters
120
+ */
121
+ function invokeTargetMethodWithInjection(ctx, target, method, nonInjectedArgs, session) {
122
+ const methodName = getTargetName(target, method);
123
+ /* istanbul ignore if */
124
+ if (debug.enabled) {
125
+ debug('Invoking method %s', methodName);
126
+ if (nonInjectedArgs === null || nonInjectedArgs === void 0 ? void 0 : nonInjectedArgs.length) {
127
+ debug('Non-injected arguments:', nonInjectedArgs);
128
+ }
129
+ }
130
+ const argsOrPromise = (0, resolver_1.resolveInjectedArguments)(target, method, ctx, session, nonInjectedArgs);
131
+ const targetWithMethods = target;
132
+ (0, assert_1.default)(typeof targetWithMethods[method] === 'function', `Method ${method} not found`);
133
+ return (0, value_promise_1.transformValueOrPromise)(argsOrPromise, args => {
134
+ /* istanbul ignore if */
135
+ if (debug.enabled) {
136
+ debug('Injected arguments for %s:', methodName, args);
137
+ }
138
+ return invokeTargetMethod(ctx, targetWithMethods, method, args);
139
+ });
140
+ }
141
+ /**
142
+ * Invoke the target method
143
+ * @param ctx - Context object
144
+ * @param target - Target class or object
145
+ * @param methodName - Target method name
146
+ * @param args - Arguments
147
+ */
148
+ function invokeTargetMethod(ctx, // Not used
149
+ target, methodName, args) {
150
+ const targetWithMethods = target;
151
+ /* istanbul ignore if */
152
+ if (debug.enabled) {
153
+ debug('Invoking method %s', getTargetName(target, methodName), args);
154
+ }
155
+ // Invoke the target method
156
+ const result = targetWithMethods[methodName](...args);
157
+ /* istanbul ignore if */
158
+ if (debug.enabled) {
159
+ debug('Method invoked: %s', getTargetName(target, methodName), result);
160
+ }
161
+ return result;
162
+ }
163
+ //# sourceMappingURL=invocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invocation.js","sourceRoot":"","sources":["../src/invocation.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,iCAAiC;AACjC,+CAA+C;AAC/C,gEAAgE;;;;AAEhE,iDAAoD;AACpD,iEAA4B;AAC5B,+DAAiC;AACjC,uCAAkC;AAClC,+CAA2D;AAE3D,yCAAoD;AACpD,mDAAwE;AAExE,MAAM,KAAK,GAAG,IAAA,eAAY,EAAC,6BAA6B,CAAC,CAAC;AAC1D,MAAM,aAAa,GAAG,2BAAgB,CAAC,aAAa,CAAC;AA4BrD;;;;GAIG;AACH,MAAa,iBAAkB,SAAQ,iBAAO;IAC5C;;;;;;;OAOG;IACH,YACE,MAAe,EACC,MAAc,EACd,UAAkB,EAClB,IAAoB,EACpB,MAAyB;QAEzC,KAAK,CAAC,MAAM,CAAC,CAAC;QALE,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAQ;QAClB,SAAI,GAAJ,IAAI,CAAgB;QACpB,WAAM,GAAN,MAAM,CAAmB;IAG3C,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU;YACtC,CAAC,CAAC,IAAI,CAAC,MAAM;YACb,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,MAAM,CAAC;QAC/D,OAAO,qBAAqB,IAAI,CAAC,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IACxE,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAkC,CAAC;QAClE,IAAI,OAAO,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,UAAU,EAAE;YAC5D,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/D,IAAA,gBAAM,EAAC,KAAK,EAAE,UAAU,UAAU,YAAY,CAAC,CAAC;SACjD;QACD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAChB,UAA6B,EAAC,sBAAsB,EAAE,IAAI,EAAC;QAE3D,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE;YACnC,OAAO,+BAA+B,CACpC,IAAI,EACJ,iBAAiB,EACjB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,IAAI,EACT,OAAO,CAAC,OAAO,CAChB,CAAC;SACH;QACD,OAAO,kBAAkB,CACvB,IAAI,EACJ,iBAAiB,EACjB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,IAAI,CACV,CAAC;IACJ,CAAC;CACF;AArFD,8CAqFC;AAyBD;;;;;;;;;GASG;AACH,SAAgB,YAAY,CAC1B,MAAc,EACd,MAAc,EACd,GAAY,EACZ,kBAAkC,EAAE,EACpC,UAA6B,EAAE;IAE/B,IAAI,OAAO,CAAC,gBAAgB,EAAE;QAC5B,IAAI,OAAO,CAAC,sBAAsB,EAAE;YAClC,sEAAsE;YACtE,OAAO,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;SACjE;aAAM;YACL,OAAO,+BAA+B,CACpC,GAAG,EACH,MAAM,EACN,MAAM,EACN,eAAe,EACf,OAAO,CAAC,OAAO,CAChB,CAAC;SACH;KACF;IACD,8DAA8D;IAC9D,OAAO,IAAA,0CAA4B,EACjC,GAAG,EACH,MAAM,EACN,MAAM,EACN,eAAe,EACf,OAAO,CACR,CAAC;AACJ,CAAC;AA7BD,oCA6BC;AAED;;;;;;;GAOG;AACH,SAAS,+BAA+B,CACtC,GAAY,EACZ,MAAc,EACd,MAAc,EACd,eAAgC,EAChC,OAA2B;IAE3B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,wBAAwB;IACxB,IAAI,KAAK,CAAC,OAAO,EAAE;QACjB,KAAK,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;QACxC,IAAI,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,MAAM,EAAE;YAC3B,KAAK,CAAC,yBAAyB,EAAE,eAAe,CAAC,CAAC;SACnD;KACF;IACD,MAAM,aAAa,GAAG,IAAA,mCAAwB,EAC5C,MAAM,EACN,MAAM,EACN,GAAG,EACH,OAAO,EACP,eAAe,CAChB,CAAC;IACF,MAAM,iBAAiB,GAAG,MAAkC,CAAC;IAC7D,IAAA,gBAAM,EACJ,OAAO,iBAAiB,CAAC,MAAM,CAAC,KAAK,UAAU,EAC/C,UAAU,MAAM,YAAY,CAC7B,CAAC;IACF,OAAO,IAAA,uCAAuB,EAAC,aAAa,EAAE,IAAI,CAAC,EAAE;QACnD,wBAAwB;QACxB,IAAI,KAAK,CAAC,OAAO,EAAE;YACjB,KAAK,CAAC,4BAA4B,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;SACvD;QACD,OAAO,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB,CACzB,GAAY,EAAE,WAAW;AACzB,MAAc,EACd,UAAkB,EAClB,IAAoB;IAEpB,MAAM,iBAAiB,GAAG,MAAkC,CAAC;IAC7D,wBAAwB;IACxB,IAAI,KAAK,CAAC,OAAO,EAAE;QACjB,KAAK,CAAC,oBAAoB,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;KACtE;IACD,2BAA2B;IAC3B,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACtD,wBAAwB;IACxB,IAAI,KAAK,CAAC,OAAO,EAAE;QACjB,KAAK,CAAC,oBAAoB,EAAE,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;KACxE;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Type definition for JSON types
3
+ */
4
+ /**
5
+ * JSON primitive types:
6
+ * - string
7
+ * - number
8
+ * - boolean
9
+ * - null
10
+ */
11
+ export declare type JSONPrimitive = string | number | boolean | null;
12
+ /**
13
+ * JSON values
14
+ * - primitive
15
+ * - object
16
+ * - array
17
+ */
18
+ export declare type JSONValue = JSONPrimitive | JSONObject | JSONArray;
19
+ /**
20
+ * JSON object
21
+ */
22
+ export interface JSONObject extends Record<string, JSONValue> {
23
+ }
24
+ /**
25
+ * JSON array
26
+ */
27
+ export interface JSONArray extends Array<JSONValue> {
28
+ }
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- // Copyright IBM Corp. 2013,2017. All Rights Reserved.
3
- // Node module: loopback
2
+ // Copyright IBM Corp. 2020. All Rights Reserved.
3
+ // Node module: @loopback/context
4
4
  // This file is licensed under the MIT License.
5
5
  // License text available at https://opensource.org/licenses/MIT
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- //# sourceMappingURL=provider.js.map
7
+ //# sourceMappingURL=json-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-types.js","sourceRoot":"","sources":["../src/json-types.ts"],"names":[],"mappings":";AAAA,iDAAiD;AACjD,iCAAiC;AACjC,+CAA+C;AAC/C,gEAAgE"}