-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
/
registry_proxy.ts
62 lines (53 loc) · 1.85 KB
/
registry_proxy.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**
@module ember
*/
import type { Registry } from '@ember/-internals/container';
import type { RegistryProxy } from '@ember/-internals/owner';
import type { AnyFn } from '@ember/-internals/utility-types';
import { assert } from '@ember/debug';
import Mixin from '@ember/object/mixin';
/**
RegistryProxyMixin is used to provide public access to specific
registry functionality.
@class RegistryProxyMixin
@extends RegistryProxy
@private
*/
interface RegistryProxyMixin extends RegistryProxy {
/** @internal */
__registry__: Registry;
}
const RegistryProxyMixin = Mixin.create({
__registry__: null,
resolveRegistration(fullName: string) {
assert('fullName must be a proper full name', this.__registry__.isValidFullName(fullName));
return this.__registry__.resolve(fullName);
},
register: registryAlias('register'),
unregister: registryAlias('unregister'),
hasRegistration: registryAlias('has'),
registeredOption: registryAlias('getOption'),
registerOptions: registryAlias('options'),
registeredOptions: registryAlias('getOptions'),
registerOptionsForType: registryAlias('optionsForType'),
registeredOptionsForType: registryAlias('getOptionsForType'),
});
type AliasMethods =
| 'register'
| 'unregister'
| 'has'
| 'getOption'
| 'options'
| 'getOptions'
| 'optionsForType'
| 'getOptionsForType';
function registryAlias<N extends AliasMethods>(name: N) {
return function (this: RegistryProxyMixin, ...args: Parameters<Registry[N]>) {
// We need this cast because `Parameters` is deferred so that it is not
// possible for TS to see it will always produce the right type. However,
// since `AnyFn` has a rest type, it is allowed. See discussion on [this
// issue](https://github.com/microsoft/TypeScript/issues/47615).
return (this.__registry__[name] as AnyFn)(...args);
};
}
export default RegistryProxyMixin;