@servicetitan/react-ioc 17.1.0 → 17.3.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/dist/await.d.ts +2 -2
- package/dist/await.d.ts.map +1 -1
- package/dist/await.js.map +1 -1
- package/dist/common.d.ts +10 -0
- package/dist/common.d.ts.map +1 -0
- package/dist/{container-context.js → common.js} +6 -2
- package/dist/common.js.map +1 -0
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -16
- package/dist/index.js.map +1 -1
- package/dist/inject-dependency.d.ts +3 -0
- package/dist/inject-dependency.d.ts.map +1 -0
- package/dist/inject-dependency.js +53 -0
- package/dist/inject-dependency.js.map +1 -0
- package/dist/provide.d.ts +14 -0
- package/dist/provide.d.ts.map +1 -0
- package/dist/provide.js +7 -0
- package/dist/provide.js.map +1 -0
- package/dist/provider.d.ts +20 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +83 -0
- package/dist/provider.js.map +1 -0
- package/dist/store.d.ts +8 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +14 -2
- package/dist/store.js.map +1 -1
- package/dist/use-dependencies.d.ts +8 -0
- package/dist/use-dependencies.d.ts.map +1 -0
- package/dist/use-dependencies.js +30 -0
- package/dist/use-dependencies.js.map +1 -0
- package/package.json +4 -4
- package/src/__tests__/react-ioc.test.tsx +1 -1
- package/src/await.tsx +2 -2
- package/src/common.tsx +14 -0
- package/src/index.ts +9 -3
- package/src/inject-dependency.ts +66 -0
- package/src/provide.tsx +25 -0
- package/src/provider.tsx +139 -0
- package/src/store.ts +14 -3
- package/src/use-dependencies.ts +39 -0
- package/dist/container-context.d.ts +0 -5
- package/dist/container-context.d.ts.map +0 -1
- package/dist/container-context.js.map +0 -1
- package/dist/react-ioc.d.ts +0 -41
- package/dist/react-ioc.d.ts.map +0 -1
- package/dist/react-ioc.js +0 -172
- package/dist/react-ioc.js.map +0 -1
- package/src/container-context.tsx +0 -7
- package/src/react-ioc.tsx +0 -279
package/src/provider.tsx
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { FC, useState, useContext, useLayoutEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
import { Container, interfaces } from 'inversify';
|
|
4
|
+
|
|
5
|
+
import { Await } from './await';
|
|
6
|
+
import { ContainerContext, Token, SymbolToken } from './common';
|
|
7
|
+
import { isStore } from './store';
|
|
8
|
+
|
|
9
|
+
export type ProviderConfigEntry<T> =
|
|
10
|
+
| interfaces.Newable<T>
|
|
11
|
+
| ClassProviderConfigEntry<T>
|
|
12
|
+
| ValueProviderConfigEntry<T>;
|
|
13
|
+
|
|
14
|
+
interface ClassProviderConfigEntry<T> {
|
|
15
|
+
provide: Token<T>;
|
|
16
|
+
useClass: interfaces.Newable<T>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface ValueProviderConfigEntry<T> {
|
|
20
|
+
provide: SymbolToken<T> | interfaces.Abstract<T>;
|
|
21
|
+
useValue: T;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function isClassProviderConfigEntry<T>(
|
|
25
|
+
entry: ProviderConfigEntry<T>
|
|
26
|
+
): entry is ClassProviderConfigEntry<T> {
|
|
27
|
+
return (
|
|
28
|
+
Object.prototype.hasOwnProperty.call(entry, 'provide') &&
|
|
29
|
+
Object.prototype.hasOwnProperty.call(entry, 'useClass')
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function isValueProviderConfigEntry<T>(
|
|
34
|
+
entry: ProviderConfigEntry<T>
|
|
35
|
+
): entry is ValueProviderConfigEntry<T> {
|
|
36
|
+
return (
|
|
37
|
+
Object.prototype.hasOwnProperty.call(entry, 'provide') &&
|
|
38
|
+
Object.prototype.hasOwnProperty.call(entry, 'useValue')
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface ProviderProps {
|
|
43
|
+
singletons?: ProviderConfigEntry<any>[];
|
|
44
|
+
instances?: ProviderConfigEntry<any>[];
|
|
45
|
+
fallback?: JSX.Element;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const Provider: FC<ProviderProps> = ({ singletons, instances, fallback, children }) => {
|
|
49
|
+
const parentContainer = useContext(ContainerContext);
|
|
50
|
+
|
|
51
|
+
const [container, setContainer] = useState<Container>();
|
|
52
|
+
const [promises, setPromises] = useState<Promise<void>[]>();
|
|
53
|
+
|
|
54
|
+
useLayoutEffect(() => {
|
|
55
|
+
const container = new Container();
|
|
56
|
+
container.parent = parentContainer;
|
|
57
|
+
|
|
58
|
+
const bind = (entry: ProviderConfigEntry<any>) => {
|
|
59
|
+
if (isClassProviderConfigEntry(entry)) {
|
|
60
|
+
return container.bind(entry.provide).to(entry.useClass);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (isValueProviderConfigEntry(entry)) {
|
|
64
|
+
// using toDynamicValue to return BindingInSyntax
|
|
65
|
+
return container.bind(entry.provide).toDynamicValue(() => entry.useValue);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return container.bind(entry).to(entry);
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
singletons?.map(bind).forEach(binding => {
|
|
72
|
+
binding.inSingletonScope();
|
|
73
|
+
});
|
|
74
|
+
instances?.forEach(bind);
|
|
75
|
+
|
|
76
|
+
const storeInstances = [...(singletons ?? []), ...(instances ?? [])]
|
|
77
|
+
.map(entry => {
|
|
78
|
+
if (isValueProviderConfigEntry(entry)) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const { provide, useClass } = isClassProviderConfigEntry(entry)
|
|
83
|
+
? entry
|
|
84
|
+
: { provide: entry, useClass: entry };
|
|
85
|
+
|
|
86
|
+
if (isStore(useClass)) {
|
|
87
|
+
return container.get(provide);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return undefined;
|
|
91
|
+
})
|
|
92
|
+
.filter(Boolean);
|
|
93
|
+
|
|
94
|
+
const promises: Promise<void>[] = [];
|
|
95
|
+
for (const instance of storeInstances) {
|
|
96
|
+
if (instance.initialize) {
|
|
97
|
+
promises.push(instance.initialize());
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
setContainer(container);
|
|
102
|
+
setPromises(promises);
|
|
103
|
+
|
|
104
|
+
return () => {
|
|
105
|
+
const unbind = (entry: ProviderConfigEntry<any>) => {
|
|
106
|
+
if (isClassProviderConfigEntry(entry) || isValueProviderConfigEntry(entry)) {
|
|
107
|
+
return container.unbind(entry.provide);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return container.unbind(entry);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
singletons?.forEach(unbind);
|
|
114
|
+
instances?.forEach(unbind);
|
|
115
|
+
|
|
116
|
+
for (const instance of storeInstances) {
|
|
117
|
+
if (instance.dispose) {
|
|
118
|
+
instance.dispose();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
}, [parentContainer, singletons, instances]);
|
|
123
|
+
|
|
124
|
+
if (!container) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return (
|
|
129
|
+
<ContainerContext.Provider value={container}>
|
|
130
|
+
{promises?.length ? (
|
|
131
|
+
<Await promises={promises} fallback={fallback}>
|
|
132
|
+
{children}
|
|
133
|
+
</Await>
|
|
134
|
+
) : (
|
|
135
|
+
children
|
|
136
|
+
)}
|
|
137
|
+
</ContainerContext.Provider>
|
|
138
|
+
);
|
|
139
|
+
};
|
package/src/store.ts
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
|
-
import { injectable } from 'inversify';
|
|
2
|
-
|
|
1
|
+
import { injectable, interfaces } from 'inversify';
|
|
2
|
+
|
|
3
|
+
const symbol = Symbol('Inheritor Of The Store');
|
|
4
|
+
|
|
5
|
+
interface Identifier<T> extends interfaces.Newable<T> {
|
|
6
|
+
[symbol]?: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function isStore<T>(identifier: Identifier<T>) {
|
|
10
|
+
return identifier[symbol];
|
|
11
|
+
}
|
|
3
12
|
|
|
4
13
|
@injectable()
|
|
5
|
-
export abstract class Store {
|
|
14
|
+
export abstract class Store {
|
|
15
|
+
static [symbol] = true;
|
|
16
|
+
}
|
|
6
17
|
|
|
7
18
|
export interface Store {
|
|
8
19
|
initialize?(): Promise<void>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useRef, useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
import { ContainerContext, Token } from './common';
|
|
4
|
+
|
|
5
|
+
type Tokens<T> = {
|
|
6
|
+
[P in keyof T]: Token<T[P]>;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
function useDependenciesInternal<T extends any[], P extends boolean>(
|
|
10
|
+
tokens: Tokens<T>,
|
|
11
|
+
optional: P
|
|
12
|
+
) {
|
|
13
|
+
const ref = useRef<T | Partial<T> | null>(null);
|
|
14
|
+
const container = useContext(ContainerContext);
|
|
15
|
+
|
|
16
|
+
if (!ref.current) {
|
|
17
|
+
ref.current = tokens.map(s => {
|
|
18
|
+
if (optional) {
|
|
19
|
+
if (container.isBound(s)) {
|
|
20
|
+
return container.get(s);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return container.get(s);
|
|
27
|
+
}) as T;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return ref.current as P extends true ? Partial<T> : T;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function useDependencies<T extends any[]>(...tokens: Tokens<T>) {
|
|
34
|
+
return useDependenciesInternal(tokens, false);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function useOptionalDependencies<T extends any[]>(...tokens: Tokens<T>) {
|
|
38
|
+
return useDependenciesInternal(tokens, true);
|
|
39
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"container-context.d.ts","sourceRoot":"","sources":["../src/container-context.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,eAAO,MAAM,aAAa,WAAkB,CAAC;AAE7C,eAAO,MAAM,gBAAgB,oCAA+B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"container-context.js","sourceRoot":"","sources":["../src/container-context.tsx"],"names":[],"mappings":";;;AAAA,iCAAsC;AAEtC,yCAAsC;AAEzB,QAAA,aAAa,GAAG,IAAI,qBAAS,EAAE,CAAC;AAEhC,QAAA,gBAAgB,GAAG,IAAA,qBAAa,EAAC,qBAAa,CAAC,CAAC"}
|
package/dist/react-ioc.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { ReactInstance, StatelessComponent, ComponentClass, ClassicComponentClass, FC } from 'react';
|
|
2
|
-
import { Container, interfaces } from 'inversify';
|
|
3
|
-
import 'reflect-metadata';
|
|
4
|
-
export declare type Token<T> = SymbolToken<T> | interfaces.Newable<T> | interfaces.Abstract<T>;
|
|
5
|
-
export declare type SymbolToken<T> = symbol & {
|
|
6
|
-
typeRef?: T;
|
|
7
|
-
};
|
|
8
|
-
export declare function symbolToken<T>(key: string, global?: boolean): SymbolToken<T>;
|
|
9
|
-
declare type ProviderConfigEntry<T> = interfaces.Newable<T> | ClassProviderConfigEntry<T> | ValueProviderConfigEntry<T>;
|
|
10
|
-
interface ClassProviderConfigEntry<T> {
|
|
11
|
-
provide: Token<T>;
|
|
12
|
-
useClass: interfaces.Newable<T>;
|
|
13
|
-
}
|
|
14
|
-
interface ValueProviderConfigEntry<T> {
|
|
15
|
-
provide: SymbolToken<T> | interfaces.Abstract<T>;
|
|
16
|
-
useValue: T;
|
|
17
|
-
}
|
|
18
|
-
export interface ProviderInterface {
|
|
19
|
-
singletons?: ProviderConfigEntry<any>[];
|
|
20
|
-
instances?: ProviderConfigEntry<any>[];
|
|
21
|
-
fallback?: JSX.Element;
|
|
22
|
-
}
|
|
23
|
-
export interface ProviderComponentInterface extends ProviderInterface {
|
|
24
|
-
parentContainer: Container;
|
|
25
|
-
}
|
|
26
|
-
export interface WrappedComponent<P> {
|
|
27
|
-
wrappedComponent: ReactComponent<P>;
|
|
28
|
-
wrappedInstance: ReactInstance | undefined;
|
|
29
|
-
}
|
|
30
|
-
declare type ReactComponent<P = any> = StatelessComponent<P> | ComponentClass<P> | ClassicComponentClass<P>;
|
|
31
|
-
declare type ProvideDecorator = (stores: ProviderInterface) => <T extends ReactComponent>(target: T) => T & WrappedComponent<T>;
|
|
32
|
-
export declare const provide: ProvideDecorator;
|
|
33
|
-
export declare const Provider: FC<ProviderInterface>;
|
|
34
|
-
export declare function injectDependency(serviceIdentifier: interfaces.ServiceIdentifier<any>): (proto: any, key: string) => void;
|
|
35
|
-
declare type Tokens<T> = {
|
|
36
|
-
[P in keyof T]: Token<T[P]>;
|
|
37
|
-
};
|
|
38
|
-
export declare function useDependencies<T extends any[]>(...tokens: Tokens<T>): T;
|
|
39
|
-
export declare function useOptionalDependencies<T extends any[]>(...tokens: Tokens<T>): Partial<T>;
|
|
40
|
-
export {};
|
|
41
|
-
//# sourceMappingURL=react-ioc.d.ts.map
|
package/dist/react-ioc.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"react-ioc.d.ts","sourceRoot":"","sources":["../src/react-ioc.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIH,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,EAAE,EACL,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,UAAU,EAAgB,MAAM,WAAW,CAAC;AAIhE,OAAO,kBAAkB,CAAC;AAE1B,oBAAY,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEvF,oBAAY,WAAW,CAAC,CAAC,IAAI,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC;AACtD,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,UAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAEzE;AAED,aAAK,mBAAmB,CAAC,CAAC,IACpB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GACrB,wBAAwB,CAAC,CAAC,CAAC,GAC3B,wBAAwB,CAAC,CAAC,CAAC,CAAC;AAElC,UAAU,wBAAwB,CAAC,CAAC;IAChC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CACnC;AAED,UAAU,wBAAwB,CAAC,CAAC;IAChC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACjD,QAAQ,EAAE,CAAC,CAAC;CACf;AAoBD,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;IACxC,SAAS,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;IACvC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACjE,eAAe,EAAE,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IAC/B,gBAAgB,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IACpC,eAAe,EAAE,aAAa,GAAG,SAAS,CAAC;CAC9C;AAED,aAAK,cAAc,CAAC,CAAC,GAAG,GAAG,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAEpG,aAAK,gBAAgB,GAAG,CACpB,MAAM,EAAE,iBAAiB,KACxB,CAAC,CAAC,SAAS,cAAc,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAEtE,eAAO,MAAM,OAAO,kBASM,CAAC;AAE3B,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,iBAAiB,CAQ1C,CAAC;AAiHF,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,WACzD,GAAG,OAAO,MAAM,KAAG,IAAI,CAgClD;AAED,aAAK,MAAM,CAAC,CAAC,IAAI;KACZ,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC9B,CAAC;AA0BF,wBAAgB,eAAe,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAEpE;AAED,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,cAE5E"}
|
package/dist/react-ioc.js
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useOptionalDependencies = exports.useDependencies = exports.injectDependency = exports.Provider = exports.provide = exports.symbolToken = void 0;
|
|
4
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
-
const react_1 = require("react");
|
|
6
|
-
const inversify_1 = require("inversify");
|
|
7
|
-
const container_context_1 = require("./container-context");
|
|
8
|
-
const store_1 = require("./store");
|
|
9
|
-
const await_1 = require("./await");
|
|
10
|
-
require("reflect-metadata");
|
|
11
|
-
function symbolToken(key, global = true) {
|
|
12
|
-
return global ? Symbol.for(key) : Symbol(key);
|
|
13
|
-
}
|
|
14
|
-
exports.symbolToken = symbolToken;
|
|
15
|
-
function isClassProviderConfigEntry(entry) {
|
|
16
|
-
return (Object.prototype.hasOwnProperty.call(entry, 'provide') &&
|
|
17
|
-
Object.prototype.hasOwnProperty.call(entry, 'useClass'));
|
|
18
|
-
}
|
|
19
|
-
function isValueProviderConfigEntry(entry) {
|
|
20
|
-
return (Object.prototype.hasOwnProperty.call(entry, 'provide') &&
|
|
21
|
-
Object.prototype.hasOwnProperty.call(entry, 'useValue'));
|
|
22
|
-
}
|
|
23
|
-
exports.provide = (stores => (Component) => props => ((0, jsx_runtime_1.jsx)(container_context_1.ContainerContext.Consumer, { children: container => ((0, jsx_runtime_1.jsx)(ProviderComponent, Object.assign({}, stores, { parentContainer: container }, { children: (0, jsx_runtime_1.jsx)(Component, Object.assign({}, props), void 0) }), void 0)) }, void 0)));
|
|
24
|
-
const Provider = props => ((0, jsx_runtime_1.jsx)(container_context_1.ContainerContext.Consumer, { children: container => ((0, jsx_runtime_1.jsx)(ProviderComponent, Object.assign({}, props, { parentContainer: container }, { children: props.children }), void 0)) }, void 0));
|
|
25
|
-
exports.Provider = Provider;
|
|
26
|
-
class ProviderComponent extends react_1.Component {
|
|
27
|
-
constructor(props) {
|
|
28
|
-
super(props);
|
|
29
|
-
Object.defineProperty(this, "container", {
|
|
30
|
-
enumerable: true,
|
|
31
|
-
configurable: true,
|
|
32
|
-
writable: true,
|
|
33
|
-
value: void 0
|
|
34
|
-
});
|
|
35
|
-
Object.defineProperty(this, "promises", {
|
|
36
|
-
enumerable: true,
|
|
37
|
-
configurable: true,
|
|
38
|
-
writable: true,
|
|
39
|
-
value: []
|
|
40
|
-
});
|
|
41
|
-
Object.defineProperty(this, "bind", {
|
|
42
|
-
enumerable: true,
|
|
43
|
-
configurable: true,
|
|
44
|
-
writable: true,
|
|
45
|
-
value: (entry) => {
|
|
46
|
-
if (isClassProviderConfigEntry(entry)) {
|
|
47
|
-
return this.container.bind(entry.provide).to(entry.useClass);
|
|
48
|
-
}
|
|
49
|
-
if (isValueProviderConfigEntry(entry)) {
|
|
50
|
-
// using toDynamicValue to return BindingInSyntax
|
|
51
|
-
return this.container.bind(entry.provide).toDynamicValue(() => entry.useValue);
|
|
52
|
-
}
|
|
53
|
-
return this.container.bind(entry).to(entry);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
Object.defineProperty(this, "unbind", {
|
|
57
|
-
enumerable: true,
|
|
58
|
-
configurable: true,
|
|
59
|
-
writable: true,
|
|
60
|
-
value: (entry) => {
|
|
61
|
-
if (isValueProviderConfigEntry(entry)) {
|
|
62
|
-
return this.container.unbind(entry.provide);
|
|
63
|
-
}
|
|
64
|
-
const identifier = isClassProviderConfigEntry(entry) ? entry.provide : entry;
|
|
65
|
-
const instance = this.container.get(identifier);
|
|
66
|
-
if (instance instanceof store_1.Store && instance.dispose) {
|
|
67
|
-
instance.dispose();
|
|
68
|
-
}
|
|
69
|
-
return this.container.unbind(identifier);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
const { parentContainer, singletons = [], instances = [] } = props;
|
|
73
|
-
this.container = new inversify_1.Container();
|
|
74
|
-
this.container.parent = parentContainer;
|
|
75
|
-
singletons.map(this.bind).forEach(binding => {
|
|
76
|
-
binding.inSingletonScope();
|
|
77
|
-
});
|
|
78
|
-
instances.forEach(this.bind);
|
|
79
|
-
for (const entry of [...singletons, ...instances]) {
|
|
80
|
-
if (isValueProviderConfigEntry(entry)) {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
const identifier = isClassProviderConfigEntry(entry) ? entry.provide : entry;
|
|
84
|
-
const instance = this.container.get(identifier);
|
|
85
|
-
if (instance instanceof store_1.Store && instance.initialize) {
|
|
86
|
-
this.promises.push(instance.initialize());
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
componentWillUnmount() {
|
|
91
|
-
const { singletons = [], instances = [] } = this.props;
|
|
92
|
-
for (const entry of [...singletons, ...instances]) {
|
|
93
|
-
this.unbind(entry);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
render() {
|
|
97
|
-
const { fallback, children } = this.props;
|
|
98
|
-
return ((0, jsx_runtime_1.jsx)(container_context_1.ContainerContext.Provider, Object.assign({ value: this.container }, { children: this.promises.length ? ((0, jsx_runtime_1.jsx)(await_1.Await, Object.assign({ promises: this.promises, fallback: fallback }, { children: children }), void 0)) : (children) }), void 0));
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
const INJECTION = Symbol.for('INJECTION');
|
|
102
|
-
function proxyGetter(proto, key, resolve, doCache) {
|
|
103
|
-
function getter() {
|
|
104
|
-
if (doCache && !Reflect.hasMetadata(INJECTION, this, key)) {
|
|
105
|
-
Reflect.defineMetadata(INJECTION, resolve(this), this, key);
|
|
106
|
-
}
|
|
107
|
-
if (Reflect.hasMetadata(INJECTION, this, key)) {
|
|
108
|
-
return Reflect.getMetadata(INJECTION, this, key);
|
|
109
|
-
}
|
|
110
|
-
return resolve(this);
|
|
111
|
-
}
|
|
112
|
-
function setter(newVal) {
|
|
113
|
-
Reflect.defineMetadata(INJECTION, newVal, this, key);
|
|
114
|
-
}
|
|
115
|
-
Object.defineProperty(proto, key, {
|
|
116
|
-
configurable: true,
|
|
117
|
-
enumerable: true,
|
|
118
|
-
get: getter,
|
|
119
|
-
set: setter,
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
function injectDependency(serviceIdentifier) {
|
|
123
|
-
return function (proto, key) {
|
|
124
|
-
const resolve = (componentInstance) => {
|
|
125
|
-
var _a;
|
|
126
|
-
if (!componentInstance.context) {
|
|
127
|
-
throw new Error("Context doesn't exist on a target class. " +
|
|
128
|
-
'Please make sure to pass context object to super method if you access injectable stores in constructor.');
|
|
129
|
-
}
|
|
130
|
-
const metadata = Reflect.getMetadata(inversify_1.METADATA_KEY.TAGGED_PROP, proto.constructor) || {};
|
|
131
|
-
if ((_a = metadata[key]) === null || _a === void 0 ? void 0 : _a.some(({ key, value }) => key === inversify_1.METADATA_KEY.OPTIONAL_TAG && value)) {
|
|
132
|
-
if (componentInstance.context.isBound(serviceIdentifier)) {
|
|
133
|
-
return componentInstance.context.get(serviceIdentifier);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
return componentInstance.context.get(serviceIdentifier);
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
if (proto.constructor.contextType && proto.constructor.contextType !== container_context_1.ContainerContext) {
|
|
141
|
-
throw new Error("injectDependency can't be used together with contextType static property");
|
|
142
|
-
}
|
|
143
|
-
proto.constructor.contextType = container_context_1.ContainerContext;
|
|
144
|
-
proxyGetter(proto, key, resolve, true);
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
exports.injectDependency = injectDependency;
|
|
148
|
-
function useDependenciesInternal(tokens, optional) {
|
|
149
|
-
const ref = (0, react_1.useRef)(null);
|
|
150
|
-
const container = (0, react_1.useContext)(container_context_1.ContainerContext);
|
|
151
|
-
if (!ref.current) {
|
|
152
|
-
ref.current = tokens.map(s => {
|
|
153
|
-
if (optional) {
|
|
154
|
-
if (container.isBound(s)) {
|
|
155
|
-
return container.get(s);
|
|
156
|
-
}
|
|
157
|
-
return undefined;
|
|
158
|
-
}
|
|
159
|
-
return container.get(s);
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
return ref.current;
|
|
163
|
-
}
|
|
164
|
-
function useDependencies(...tokens) {
|
|
165
|
-
return useDependenciesInternal(tokens, false);
|
|
166
|
-
}
|
|
167
|
-
exports.useDependencies = useDependencies;
|
|
168
|
-
function useOptionalDependencies(...tokens) {
|
|
169
|
-
return useDependenciesInternal(tokens, true);
|
|
170
|
-
}
|
|
171
|
-
exports.useOptionalDependencies = useOptionalDependencies;
|
|
172
|
-
//# sourceMappingURL=react-ioc.js.map
|
package/dist/react-ioc.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"react-ioc.js","sourceRoot":"","sources":["../src/react-ioc.tsx"],"names":[],"mappings":"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"}
|