@loopback/context 1.23.5 → 2.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.
- package/CHANGELOG.md +81 -0
- package/dist/binding-config.js +1 -1
- package/dist/binding-config.js.map +1 -1
- package/dist/binding-filter.d.ts +19 -1
- package/dist/binding-filter.js +40 -7
- package/dist/binding-filter.js.map +1 -1
- package/dist/binding-inspector.js +12 -11
- package/dist/binding-inspector.js.map +1 -1
- package/dist/binding-sorter.js +2 -2
- package/dist/binding-sorter.js.map +1 -1
- package/dist/binding.d.ts +42 -4
- package/dist/binding.js +40 -10
- package/dist/binding.js.map +1 -1
- package/dist/context-event.d.ts +23 -0
- package/dist/context-event.js +7 -0
- package/dist/context-event.js.map +1 -0
- package/dist/context-observer.d.ts +1 -36
- package/dist/context-subscription.d.ts +147 -0
- package/dist/context-subscription.js +336 -0
- package/dist/context-subscription.js.map +1 -0
- package/dist/context-tag-indexer.d.ts +42 -0
- package/dist/context-tag-indexer.js +134 -0
- package/dist/context-tag-indexer.js.map +1 -0
- package/dist/context-view.d.ts +2 -1
- package/dist/context-view.js +5 -2
- package/dist/context-view.js.map +1 -1
- package/dist/context.d.ts +35 -66
- package/dist/context.js +78 -250
- package/dist/context.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/inject-config.js +3 -3
- package/dist/inject-config.js.map +1 -1
- package/dist/inject.d.ts +2 -2
- package/dist/inject.js +18 -11
- package/dist/inject.js.map +1 -1
- package/dist/interception-proxy.d.ts +15 -3
- package/dist/interception-proxy.js +20 -4
- package/dist/interception-proxy.js.map +1 -1
- package/dist/interceptor-chain.js +5 -2
- package/dist/interceptor-chain.js.map +1 -1
- package/dist/interceptor.d.ts +6 -0
- package/dist/interceptor.js +38 -12
- package/dist/interceptor.js.map +1 -1
- package/dist/invocation.d.ts +20 -2
- package/dist/invocation.js +14 -12
- package/dist/invocation.js.map +1 -1
- package/dist/keys.d.ts +6 -0
- package/dist/keys.js +6 -0
- package/dist/keys.js.map +1 -1
- package/dist/resolution-session.d.ts +1 -0
- package/dist/resolution-session.js +13 -6
- package/dist/resolution-session.js.map +1 -1
- package/dist/resolver.js +13 -8
- package/dist/resolver.js.map +1 -1
- package/dist/value-promise.d.ts +1 -3
- package/package.json +9 -9
- package/src/binding-config.ts +1 -1
- package/src/binding-filter.ts +61 -9
- package/src/binding-inspector.ts +6 -8
- package/src/binding-sorter.ts +2 -2
- package/src/binding.ts +73 -9
- package/src/context-event.ts +30 -0
- package/src/context-observer.ts +1 -38
- package/src/context-subscription.ts +403 -0
- package/src/context-tag-indexer.ts +149 -0
- package/src/context-view.ts +3 -6
- package/src/context.ts +94 -293
- package/src/index.ts +5 -3
- package/src/inject-config.ts +3 -3
- package/src/inject.ts +19 -10
- package/src/interception-proxy.ts +25 -3
- package/src/interceptor-chain.ts +1 -1
- package/src/interceptor.ts +34 -8
- package/src/invocation.ts +26 -7
- package/src/keys.ts +7 -0
- package/src/resolution-session.ts +9 -5
- package/src/resolver.ts +5 -5
- package/src/value-promise.ts +1 -1
|
@@ -3,11 +3,14 @@
|
|
|
3
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
6
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
10
|
const metadata_1 = require("@loopback/metadata");
|
|
8
|
-
const
|
|
11
|
+
const debug_1 = __importDefault(require("debug"));
|
|
9
12
|
const value_promise_1 = require("./value-promise");
|
|
10
|
-
const debugSession =
|
|
13
|
+
const debugSession = debug_1.default('loopback:context:resolver:session');
|
|
11
14
|
const getTargetName = metadata_1.DecoratorFactory.getTargetName;
|
|
12
15
|
/**
|
|
13
16
|
* Type guard for binding elements
|
|
@@ -54,7 +57,7 @@ class ResolutionSession {
|
|
|
54
57
|
* @param session - The current resolution session
|
|
55
58
|
*/
|
|
56
59
|
static enterBinding(binding, session) {
|
|
57
|
-
session = session
|
|
60
|
+
session = (session !== null && session !== void 0 ? session : new ResolutionSession());
|
|
58
61
|
session.pushBinding(binding);
|
|
59
62
|
return session;
|
|
60
63
|
}
|
|
@@ -74,7 +77,7 @@ class ResolutionSession {
|
|
|
74
77
|
* @param session - The current resolution session
|
|
75
78
|
*/
|
|
76
79
|
static enterInjection(injection, session) {
|
|
77
|
-
session = session
|
|
80
|
+
session = (session !== null && session !== void 0 ? session : new ResolutionSession());
|
|
78
81
|
session.pushInjection(injection);
|
|
79
82
|
return session;
|
|
80
83
|
}
|
|
@@ -182,6 +185,7 @@ class ResolutionSession {
|
|
|
182
185
|
* Exit the resolution of a binding
|
|
183
186
|
*/
|
|
184
187
|
popBinding() {
|
|
188
|
+
var _a;
|
|
185
189
|
const top = this.stack.pop();
|
|
186
190
|
if (!isBinding(top)) {
|
|
187
191
|
throw new Error('The top element must be a binding');
|
|
@@ -189,7 +193,7 @@ class ResolutionSession {
|
|
|
189
193
|
const binding = top.value;
|
|
190
194
|
/* istanbul ignore if */
|
|
191
195
|
if (debugSession.enabled) {
|
|
192
|
-
debugSession('Exit binding:', binding
|
|
196
|
+
debugSession('Exit binding:', (_a = binding) === null || _a === void 0 ? void 0 : _a.toJSON());
|
|
193
197
|
debugSession('Resolution path:', this.getResolutionPath() || '<empty>');
|
|
194
198
|
}
|
|
195
199
|
return binding;
|
|
@@ -236,6 +240,9 @@ class ResolutionSession {
|
|
|
236
240
|
getResolutionPath() {
|
|
237
241
|
return this.stack.map(i => ResolutionSession.describe(i)).join(' --> ');
|
|
238
242
|
}
|
|
243
|
+
toString() {
|
|
244
|
+
return this.getResolutionPath();
|
|
245
|
+
}
|
|
239
246
|
}
|
|
240
247
|
exports.ResolutionSession = ResolutionSession;
|
|
241
248
|
/**
|
|
@@ -247,7 +254,7 @@ function asResolutionOptions(optionsOrSession) {
|
|
|
247
254
|
if (optionsOrSession instanceof ResolutionSession) {
|
|
248
255
|
return { session: optionsOrSession };
|
|
249
256
|
}
|
|
250
|
-
return optionsOrSession
|
|
257
|
+
return (optionsOrSession !== null && optionsOrSession !== void 0 ? optionsOrSession : {});
|
|
251
258
|
}
|
|
252
259
|
exports.asResolutionOptions = asResolutionOptions;
|
|
253
260
|
//# sourceMappingURL=resolution-session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolution-session.js","sourceRoot":"","sources":["../src/resolution-session.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,iCAAiC;AACjC,+CAA+C;AAC/C,gEAAgE
|
|
1
|
+
{"version":3,"file":"resolution-session.js","sourceRoot":"","sources":["../src/resolution-session.ts"],"names":[],"mappings":"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"}
|
package/dist/resolver.js
CHANGED
|
@@ -3,16 +3,19 @@
|
|
|
3
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
6
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
10
|
const metadata_1 = require("@loopback/metadata");
|
|
8
|
-
const
|
|
9
|
-
const
|
|
11
|
+
const assert_1 = __importDefault(require("assert"));
|
|
12
|
+
const debug_1 = __importDefault(require("debug"));
|
|
10
13
|
const binding_1 = require("./binding");
|
|
11
14
|
const binding_filter_1 = require("./binding-filter");
|
|
12
15
|
const inject_1 = require("./inject");
|
|
13
16
|
const resolution_session_1 = require("./resolution-session");
|
|
14
17
|
const value_promise_1 = require("./value-promise");
|
|
15
|
-
const debug =
|
|
18
|
+
const debug = debug_1.default('loopback:context:resolver');
|
|
16
19
|
const getTargetName = metadata_1.DecoratorFactory.getTargetName;
|
|
17
20
|
/**
|
|
18
21
|
* Create an instance of a class which constructor has arguments
|
|
@@ -29,10 +32,11 @@ const getTargetName = metadata_1.DecoratorFactory.getTargetName;
|
|
|
29
32
|
function instantiateClass(ctor, ctx, session,
|
|
30
33
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
31
34
|
nonInjectedArgs) {
|
|
35
|
+
var _a;
|
|
32
36
|
/* istanbul ignore if */
|
|
33
37
|
if (debug.enabled) {
|
|
34
38
|
debug('Instantiating %s', getTargetName(ctor));
|
|
35
|
-
if (nonInjectedArgs
|
|
39
|
+
if ((_a = nonInjectedArgs) === null || _a === void 0 ? void 0 : _a.length) {
|
|
36
40
|
debug('Non-injected arguments:', nonInjectedArgs);
|
|
37
41
|
}
|
|
38
42
|
}
|
|
@@ -61,7 +65,8 @@ exports.instantiateClass = instantiateClass;
|
|
|
61
65
|
* injection is for method (excluding constructor) parameters.
|
|
62
66
|
*/
|
|
63
67
|
function resolveContext(ctx, injection, session) {
|
|
64
|
-
|
|
68
|
+
var _a;
|
|
69
|
+
const currentBinding = (_a = session) === null || _a === void 0 ? void 0 : _a.currentBinding;
|
|
65
70
|
if (currentBinding == null ||
|
|
66
71
|
currentBinding.scope !== binding_1.BindingScope.SINGLETON) {
|
|
67
72
|
// No current binding or its scope is not `SINGLETON`
|
|
@@ -98,7 +103,7 @@ function resolve(ctx, injection, session) {
|
|
|
98
103
|
}
|
|
99
104
|
else {
|
|
100
105
|
// Default to resolve the value from the context by binding key
|
|
101
|
-
|
|
106
|
+
assert_1.default(binding_filter_1.isBindingAddress(injection.bindingSelector), 'The binding selector must be an address (string or BindingKey)');
|
|
102
107
|
const key = injection.bindingSelector;
|
|
103
108
|
const options = Object.assign({ session: s }, injection.metadata);
|
|
104
109
|
return ctx.getValueOrPromise(key, options);
|
|
@@ -131,14 +136,14 @@ nonInjectedArgs) {
|
|
|
131
136
|
}
|
|
132
137
|
const targetWithMethods = target;
|
|
133
138
|
if (method) {
|
|
134
|
-
|
|
139
|
+
assert_1.default(typeof targetWithMethods[method] === 'function', `Method ${method} not found`);
|
|
135
140
|
}
|
|
136
141
|
// NOTE: the array may be sparse, i.e.
|
|
137
142
|
// Object.keys(injectedArgs).length !== injectedArgs.length
|
|
138
143
|
// Example value:
|
|
139
144
|
// [ , 'key1', , 'key2']
|
|
140
145
|
const injectedArgs = inject_1.describeInjectedArguments(target, method);
|
|
141
|
-
const extraArgs = nonInjectedArgs
|
|
146
|
+
const extraArgs = (nonInjectedArgs !== null && nonInjectedArgs !== void 0 ? nonInjectedArgs : []);
|
|
142
147
|
let argLength = metadata_1.DecoratorFactory.getNumberOfParameters(target, method);
|
|
143
148
|
// Please note `injectedArgs` contains `undefined` for non-injected args
|
|
144
149
|
const numberOfInjected = injectedArgs.filter(i => i != null).length;
|
package/dist/resolver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,iCAAiC;AACjC,+CAA+C;AAC/C,gEAAgE
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
|
package/dist/value-promise.d.ts
CHANGED
|
@@ -17,9 +17,7 @@ export declare type BoundValue = any;
|
|
|
17
17
|
* provided by JavaScript runtime.
|
|
18
18
|
*/
|
|
19
19
|
export declare type ValueOrPromise<T> = T | PromiseLike<T>;
|
|
20
|
-
export declare type MapObject<T> =
|
|
21
|
-
[name: string]: T;
|
|
22
|
-
};
|
|
20
|
+
export declare type MapObject<T> = Record<string, T>;
|
|
23
21
|
/**
|
|
24
22
|
* Check whether a value is a Promise-like instance.
|
|
25
23
|
* Recognizes both native promises and third-party promise libraries.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loopback/context",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "LoopBack's container for Inversion of Control",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=8.9"
|
|
@@ -18,20 +18,20 @@
|
|
|
18
18
|
"copyright.owner": "IBM Corp.",
|
|
19
19
|
"license": "MIT",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@loopback/metadata": "^1.
|
|
21
|
+
"@loopback/metadata": "^1.4.0",
|
|
22
22
|
"debug": "^4.1.1",
|
|
23
23
|
"p-event": "^4.1.0",
|
|
24
|
-
"uuid": "^3.
|
|
24
|
+
"uuid": "^3.4.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@loopback/build": "^
|
|
28
|
-
"@loopback/eslint-config": "^
|
|
29
|
-
"@loopback/testlab": "^1.
|
|
27
|
+
"@loopback/build": "^3.1.0",
|
|
28
|
+
"@loopback/eslint-config": "^5.0.2",
|
|
29
|
+
"@loopback/testlab": "^1.10.2",
|
|
30
30
|
"@types/bluebird": "^3.5.29",
|
|
31
31
|
"@types/debug": "^4.1.5",
|
|
32
|
-
"@types/node": "^10.17.
|
|
32
|
+
"@types/node": "^10.17.13",
|
|
33
33
|
"@types/uuid": "^3.4.6",
|
|
34
|
-
"bluebird": "^3.7.
|
|
34
|
+
"bluebird": "^3.7.2"
|
|
35
35
|
},
|
|
36
36
|
"keywords": [
|
|
37
37
|
"LoopBack",
|
|
@@ -55,5 +55,5 @@
|
|
|
55
55
|
"url": "https://github.com/strongloop/loopback-next.git",
|
|
56
56
|
"directory": "packages/context"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "d08f135a0d1040edc61497739a8d86a866e4e29a"
|
|
59
59
|
}
|
package/src/binding-config.ts
CHANGED
|
@@ -46,7 +46,7 @@ export class DefaultConfigurationResolver implements ConfigurationResolver {
|
|
|
46
46
|
propertyPath?: string,
|
|
47
47
|
resolutionOptions?: ResolutionOptions,
|
|
48
48
|
): ValueOrPromise<ConfigValueType | undefined> {
|
|
49
|
-
propertyPath = propertyPath
|
|
49
|
+
propertyPath = propertyPath ?? '';
|
|
50
50
|
const configKey = configBindingKeyFor(key, propertyPath);
|
|
51
51
|
|
|
52
52
|
const options: ResolutionOptions = Object.assign(
|
package/src/binding-filter.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import {Binding, BindingTag} from './binding';
|
|
7
7
|
import {BindingAddress} from './binding-key';
|
|
8
|
+
import {MapObject} from './value-promise';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* A function that filters bindings. It returns `true` to select a given
|
|
@@ -59,27 +60,78 @@ export function isBindingAddress(
|
|
|
59
60
|
return typeof bindingSelector !== 'function';
|
|
60
61
|
}
|
|
61
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Binding filter function that holds a binding tag pattern. `Context.find()`
|
|
65
|
+
* uses the `bindingTagPattern` to optimize the matching of bindings by tag to
|
|
66
|
+
* avoid expensive check for all bindings.
|
|
67
|
+
*/
|
|
68
|
+
export interface BindingTagFilter extends BindingFilter<unknown> {
|
|
69
|
+
/**
|
|
70
|
+
* A special property on the filter function to provide access to the binding
|
|
71
|
+
* tag pattern which can be utilized to optimize the matching of bindings by
|
|
72
|
+
* tag in a context.
|
|
73
|
+
*/
|
|
74
|
+
bindingTagPattern: BindingTag | RegExp;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Type guard for BindingTagFilter
|
|
79
|
+
* @param filter - A BindingFilter function
|
|
80
|
+
*/
|
|
81
|
+
export function isBindingTagFilter(
|
|
82
|
+
filter?: BindingFilter,
|
|
83
|
+
): filter is BindingTagFilter {
|
|
84
|
+
if (filter == null || !('bindingTagPattern' in filter)) return false;
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
+
const tagPattern = (filter as any).bindingTagPattern;
|
|
87
|
+
return (
|
|
88
|
+
tagPattern instanceof RegExp ||
|
|
89
|
+
typeof tagPattern === 'string' ||
|
|
90
|
+
typeof tagPattern === 'object'
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
62
94
|
/**
|
|
63
95
|
* Create a binding filter for the tag pattern
|
|
64
96
|
* @param tagPattern - Binding tag name, regexp, or object
|
|
65
97
|
*/
|
|
66
|
-
export function filterByTag(tagPattern: BindingTag | RegExp):
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
98
|
+
export function filterByTag(tagPattern: BindingTag | RegExp): BindingTagFilter {
|
|
99
|
+
let filter: BindingFilter;
|
|
100
|
+
let regex: RegExp | undefined = undefined;
|
|
101
|
+
if (tagPattern instanceof RegExp) {
|
|
102
|
+
// RegExp for tag names
|
|
103
|
+
regex = tagPattern;
|
|
104
|
+
}
|
|
105
|
+
if (
|
|
106
|
+
typeof tagPattern === 'string' &&
|
|
107
|
+
(tagPattern.includes('*') || tagPattern.includes('?'))
|
|
108
|
+
) {
|
|
109
|
+
// Wildcard tag name
|
|
110
|
+
regex = wildcardToRegExp(tagPattern);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (regex != null) {
|
|
114
|
+
// RegExp or wildcard match
|
|
115
|
+
filter = b => b.tagNames.some(t => regex!.test(t));
|
|
116
|
+
} else if (typeof tagPattern === 'string') {
|
|
117
|
+
// Plain tag string match
|
|
118
|
+
filter = b => b.tagNames.includes(tagPattern);
|
|
73
119
|
} else {
|
|
74
|
-
|
|
120
|
+
// Match tag name/value pairs
|
|
121
|
+
const tagMap = tagPattern as MapObject<unknown>;
|
|
122
|
+
filter = b => {
|
|
75
123
|
for (const t in tagPattern) {
|
|
76
124
|
// One tag name/value does not match
|
|
77
|
-
if (b.tagMap[t] !==
|
|
125
|
+
if (b.tagMap[t] !== tagMap[t]) return false;
|
|
78
126
|
}
|
|
79
127
|
// All tag name/value pairs match
|
|
80
128
|
return true;
|
|
81
129
|
};
|
|
82
130
|
}
|
|
131
|
+
// Set up binding tag for the filter
|
|
132
|
+
const tagFilter = filter as BindingTagFilter;
|
|
133
|
+
tagFilter.bindingTagPattern = regex ?? tagPattern;
|
|
134
|
+
return tagFilter;
|
|
83
135
|
}
|
|
84
136
|
|
|
85
137
|
/**
|
package/src/binding-inspector.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|
|
5
5
|
|
|
6
6
|
import {MetadataAccessor, MetadataInspector} from '@loopback/metadata';
|
|
7
|
-
import
|
|
7
|
+
import debugFactory from 'debug';
|
|
8
8
|
import {Binding, BindingScope, BindingTag, BindingTemplate} from './binding';
|
|
9
9
|
import {BindingAddress} from './binding-key';
|
|
10
10
|
import {ContextTags} from './keys';
|
|
@@ -145,9 +145,7 @@ export function bindingTemplateFor<T = unknown>(
|
|
|
145
145
|
): BindingTemplate<T> {
|
|
146
146
|
const spec = getBindingMetadata(cls);
|
|
147
147
|
debug('class %s has binding metadata', cls.name, spec);
|
|
148
|
-
const templateFunctions =
|
|
149
|
-
asClassOrProvider(cls),
|
|
150
|
-
];
|
|
148
|
+
const templateFunctions = spec?.templates ?? [asClassOrProvider(cls)];
|
|
151
149
|
return function applyBindingTemplatesFromMetadata(binding) {
|
|
152
150
|
for (const t of templateFunctions) {
|
|
153
151
|
binding.apply(t);
|
|
@@ -297,7 +295,7 @@ function buildBindingKey(
|
|
|
297
295
|
if (key) return key;
|
|
298
296
|
|
|
299
297
|
let namespace =
|
|
300
|
-
options.namespace
|
|
298
|
+
options.namespace ?? bindingTemplate.tagMap[ContextTags.NAMESPACE];
|
|
301
299
|
if (!namespace) {
|
|
302
300
|
const namespaces = Object.assign(
|
|
303
301
|
{},
|
|
@@ -305,17 +303,17 @@ function buildBindingKey(
|
|
|
305
303
|
options.typeNamespaceMapping,
|
|
306
304
|
);
|
|
307
305
|
// Derive the key from type + name
|
|
308
|
-
let type = options.type
|
|
306
|
+
let type = options.type ?? bindingTemplate.tagMap[ContextTags.TYPE];
|
|
309
307
|
if (!type) {
|
|
310
308
|
type =
|
|
311
|
-
bindingTemplate.tagNames.find(t => namespaces[t] != null)
|
|
309
|
+
bindingTemplate.tagNames.find(t => namespaces[t] != null) ??
|
|
312
310
|
ContextTags.CLASS;
|
|
313
311
|
}
|
|
314
312
|
namespace = getNamespace(type, namespaces);
|
|
315
313
|
}
|
|
316
314
|
|
|
317
315
|
const name =
|
|
318
|
-
options.name
|
|
316
|
+
options.name ?? (bindingTemplate.tagMap[ContextTags.NAME] || cls.name);
|
|
319
317
|
key = `${namespace}.${name}`;
|
|
320
318
|
|
|
321
319
|
return key;
|
package/src/binding-sorter.ts
CHANGED
|
@@ -85,8 +85,8 @@ export function compareByOrder(
|
|
|
85
85
|
b: string | symbol | undefined | null,
|
|
86
86
|
order: (string | symbol)[] = [],
|
|
87
87
|
) {
|
|
88
|
-
a = a
|
|
89
|
-
b = b
|
|
88
|
+
a = a ?? '';
|
|
89
|
+
b = b ?? '';
|
|
90
90
|
const i1 = order.indexOf(a);
|
|
91
91
|
const i2 = order.indexOf(b);
|
|
92
92
|
if (i1 !== -1 || i2 !== -1) {
|
package/src/binding.ts
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
// This file is licensed under the MIT License.
|
|
4
4
|
// License text available at https://opensource.org/licenses/MIT
|
|
5
5
|
|
|
6
|
-
import
|
|
6
|
+
import debugFactory from 'debug';
|
|
7
|
+
import {EventEmitter} from 'events';
|
|
7
8
|
import {BindingAddress, BindingKey} from './binding-key';
|
|
8
9
|
import {Context} from './context';
|
|
9
10
|
import {createProxyWithInterceptors} from './interception-proxy';
|
|
@@ -139,6 +140,34 @@ export type BindingTag = TagMap | string;
|
|
|
139
140
|
*/
|
|
140
141
|
export type BindingTemplate<T = unknown> = (binding: Binding<T>) => void;
|
|
141
142
|
|
|
143
|
+
/**
|
|
144
|
+
* Information for a binding event
|
|
145
|
+
*/
|
|
146
|
+
export type BindingEvent = {
|
|
147
|
+
/**
|
|
148
|
+
* Event type
|
|
149
|
+
*/
|
|
150
|
+
type: string;
|
|
151
|
+
/**
|
|
152
|
+
* Source binding that emits the event
|
|
153
|
+
*/
|
|
154
|
+
binding: Readonly<Binding<unknown>>;
|
|
155
|
+
/**
|
|
156
|
+
* Operation that triggers the event
|
|
157
|
+
*/
|
|
158
|
+
operation: string;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Event listeners for binding events
|
|
163
|
+
*/
|
|
164
|
+
export type BindingEventListener = (
|
|
165
|
+
/**
|
|
166
|
+
* Binding event
|
|
167
|
+
*/
|
|
168
|
+
event: BindingEvent,
|
|
169
|
+
) => void;
|
|
170
|
+
|
|
142
171
|
type ValueGetter<T> = (
|
|
143
172
|
ctx: Context,
|
|
144
173
|
options: ResolutionOptions,
|
|
@@ -148,7 +177,7 @@ type ValueGetter<T> = (
|
|
|
148
177
|
* Binding represents an entry in the `Context`. Each binding has a key and a
|
|
149
178
|
* corresponding value getter.
|
|
150
179
|
*/
|
|
151
|
-
export class Binding<T = BoundValue> {
|
|
180
|
+
export class Binding<T = BoundValue> extends EventEmitter {
|
|
152
181
|
/**
|
|
153
182
|
* Key of the binding
|
|
154
183
|
*/
|
|
@@ -165,7 +194,7 @@ export class Binding<T = BoundValue> {
|
|
|
165
194
|
*/
|
|
166
195
|
public get scope(): BindingScope {
|
|
167
196
|
// Default to TRANSIENT if not set
|
|
168
|
-
return this._scope
|
|
197
|
+
return this._scope ?? BindingScope.TRANSIENT;
|
|
169
198
|
}
|
|
170
199
|
|
|
171
200
|
private _type?: BindingType;
|
|
@@ -180,15 +209,26 @@ export class Binding<T = BoundValue> {
|
|
|
180
209
|
private _getValue: ValueGetter<T>;
|
|
181
210
|
|
|
182
211
|
private _valueConstructor?: Constructor<T>;
|
|
212
|
+
private _providerConstructor?: Constructor<Provider<T>>;
|
|
213
|
+
|
|
183
214
|
/**
|
|
184
|
-
* For bindings bound via toClass
|
|
185
|
-
* function
|
|
215
|
+
* For bindings bound via `toClass()`, this property contains the constructor
|
|
216
|
+
* function of the class
|
|
186
217
|
*/
|
|
187
218
|
public get valueConstructor(): Constructor<T> | undefined {
|
|
188
219
|
return this._valueConstructor;
|
|
189
220
|
}
|
|
190
221
|
|
|
222
|
+
/**
|
|
223
|
+
* For bindings bound via `toProvider()`, this property contains the
|
|
224
|
+
* constructor function of the provider class
|
|
225
|
+
*/
|
|
226
|
+
public get providerConstructor(): Constructor<Provider<T>> | undefined {
|
|
227
|
+
return this._providerConstructor;
|
|
228
|
+
}
|
|
229
|
+
|
|
191
230
|
constructor(key: BindingAddress<T>, public isLocked: boolean = false) {
|
|
231
|
+
super();
|
|
192
232
|
BindingKey.validate(key);
|
|
193
233
|
this.key = key.toString();
|
|
194
234
|
}
|
|
@@ -314,6 +354,15 @@ export class Binding<T = BoundValue> {
|
|
|
314
354
|
return this;
|
|
315
355
|
}
|
|
316
356
|
|
|
357
|
+
/**
|
|
358
|
+
* Emit a `changed` event
|
|
359
|
+
* @param operation - Operation that makes changes
|
|
360
|
+
*/
|
|
361
|
+
private emitChangedEvent(operation: string) {
|
|
362
|
+
const event: BindingEvent = {binding: this, operation, type: 'changed'};
|
|
363
|
+
this.emit('changed', event);
|
|
364
|
+
}
|
|
365
|
+
|
|
317
366
|
/**
|
|
318
367
|
* Tag the binding with names or name/value objects. A tag has a name and
|
|
319
368
|
* an optional value. If not supplied, the tag name is used as the value.
|
|
@@ -352,6 +401,7 @@ export class Binding<T = BoundValue> {
|
|
|
352
401
|
Object.assign(this.tagMap, t);
|
|
353
402
|
}
|
|
354
403
|
}
|
|
404
|
+
this.emitChangedEvent('tag');
|
|
355
405
|
return this;
|
|
356
406
|
}
|
|
357
407
|
|
|
@@ -369,6 +419,7 @@ export class Binding<T = BoundValue> {
|
|
|
369
419
|
inScope(scope: BindingScope): this {
|
|
370
420
|
if (this._scope !== scope) this._clearCache();
|
|
371
421
|
this._scope = scope;
|
|
422
|
+
this.emitChangedEvent('scope');
|
|
372
423
|
return this;
|
|
373
424
|
}
|
|
374
425
|
|
|
@@ -399,6 +450,7 @@ export class Binding<T = BoundValue> {
|
|
|
399
450
|
}
|
|
400
451
|
return getValue(ctx, options);
|
|
401
452
|
};
|
|
453
|
+
this.emitChangedEvent('value');
|
|
402
454
|
}
|
|
403
455
|
|
|
404
456
|
/**
|
|
@@ -494,6 +546,7 @@ export class Binding<T = BoundValue> {
|
|
|
494
546
|
debug('Bind %s to provider %s', this.key, providerClass.name);
|
|
495
547
|
}
|
|
496
548
|
this._type = BindingType.PROVIDER;
|
|
549
|
+
this._providerConstructor = providerClass;
|
|
497
550
|
this._setValueGetter((ctx, options) => {
|
|
498
551
|
const providerOrPromise = instantiateClass<Provider<T>>(
|
|
499
552
|
providerClass,
|
|
@@ -521,7 +574,11 @@ export class Binding<T = BoundValue> {
|
|
|
521
574
|
this._setValueGetter((ctx, options) => {
|
|
522
575
|
const instOrPromise = instantiateClass(ctor, ctx, options.session);
|
|
523
576
|
if (!options.asProxyWithInterceptors) return instOrPromise;
|
|
524
|
-
return createInterceptionProxyFromInstance(
|
|
577
|
+
return createInterceptionProxyFromInstance(
|
|
578
|
+
instOrPromise,
|
|
579
|
+
ctx,
|
|
580
|
+
options.session,
|
|
581
|
+
);
|
|
525
582
|
});
|
|
526
583
|
this._valueConstructor = ctor;
|
|
527
584
|
return this;
|
|
@@ -576,9 +633,8 @@ export class Binding<T = BoundValue> {
|
|
|
576
633
|
/**
|
|
577
634
|
* Convert to a plain JSON object
|
|
578
635
|
*/
|
|
579
|
-
toJSON():
|
|
580
|
-
|
|
581
|
-
const json: {[name: string]: any} = {
|
|
636
|
+
toJSON(): object {
|
|
637
|
+
const json: Record<string, unknown> = {
|
|
582
638
|
key: this.key,
|
|
583
639
|
scope: this.scope,
|
|
584
640
|
tags: this.tagMap,
|
|
@@ -587,6 +643,12 @@ export class Binding<T = BoundValue> {
|
|
|
587
643
|
if (this.type != null) {
|
|
588
644
|
json.type = this.type;
|
|
589
645
|
}
|
|
646
|
+
if (this._valueConstructor != null) {
|
|
647
|
+
json.valueConstructor = this._valueConstructor.name;
|
|
648
|
+
}
|
|
649
|
+
if (this._providerConstructor != null) {
|
|
650
|
+
json.providerConstructor = this._providerConstructor.name;
|
|
651
|
+
}
|
|
590
652
|
return json;
|
|
591
653
|
}
|
|
592
654
|
|
|
@@ -624,6 +686,7 @@ export class Binding<T = BoundValue> {
|
|
|
624
686
|
function createInterceptionProxyFromInstance<T>(
|
|
625
687
|
instOrPromise: ValueOrPromise<T>,
|
|
626
688
|
context: Context,
|
|
689
|
+
session?: ResolutionSession,
|
|
627
690
|
) {
|
|
628
691
|
return transformValueOrPromise(instOrPromise, inst => {
|
|
629
692
|
if (typeof inst !== 'object') return inst;
|
|
@@ -631,6 +694,7 @@ function createInterceptionProxyFromInstance<T>(
|
|
|
631
694
|
// Cast inst from `T` to `object`
|
|
632
695
|
(inst as unknown) as object,
|
|
633
696
|
context,
|
|
697
|
+
session,
|
|
634
698
|
) as unknown) as T;
|
|
635
699
|
});
|
|
636
700
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Copyright IBM Corp. 2020. All Rights Reserved.
|
|
2
|
+
// Node module: @loopback/context
|
|
3
|
+
// This file is licensed under the MIT License.
|
|
4
|
+
// License text available at https://opensource.org/licenses/MIT
|
|
5
|
+
|
|
6
|
+
import {Binding} from './binding';
|
|
7
|
+
import {Context} from './context';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Events emitted by a context
|
|
11
|
+
*/
|
|
12
|
+
export type ContextEvent = {
|
|
13
|
+
/**
|
|
14
|
+
* Source context that emits the event
|
|
15
|
+
*/
|
|
16
|
+
context: Context;
|
|
17
|
+
/**
|
|
18
|
+
* Binding that is being added/removed/updated
|
|
19
|
+
*/
|
|
20
|
+
binding: Readonly<Binding<unknown>>;
|
|
21
|
+
/**
|
|
22
|
+
* Event type
|
|
23
|
+
*/
|
|
24
|
+
type: string; // 'bind' or 'unbind'
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Synchronous listener for context events
|
|
29
|
+
*/
|
|
30
|
+
export type ContextEventListener = (event: ContextEvent) => void;
|