@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.
Files changed (50) hide show
  1. package/dist/await.d.ts +2 -2
  2. package/dist/await.d.ts.map +1 -1
  3. package/dist/await.js.map +1 -1
  4. package/dist/common.d.ts +10 -0
  5. package/dist/common.d.ts.map +1 -0
  6. package/dist/{container-context.js → common.js} +6 -2
  7. package/dist/common.js.map +1 -0
  8. package/dist/index.d.ts +7 -3
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +16 -16
  11. package/dist/index.js.map +1 -1
  12. package/dist/inject-dependency.d.ts +3 -0
  13. package/dist/inject-dependency.d.ts.map +1 -0
  14. package/dist/inject-dependency.js +53 -0
  15. package/dist/inject-dependency.js.map +1 -0
  16. package/dist/provide.d.ts +14 -0
  17. package/dist/provide.d.ts.map +1 -0
  18. package/dist/provide.js +7 -0
  19. package/dist/provide.js.map +1 -0
  20. package/dist/provider.d.ts +20 -0
  21. package/dist/provider.d.ts.map +1 -0
  22. package/dist/provider.js +83 -0
  23. package/dist/provider.js.map +1 -0
  24. package/dist/store.d.ts +8 -1
  25. package/dist/store.d.ts.map +1 -1
  26. package/dist/store.js +14 -2
  27. package/dist/store.js.map +1 -1
  28. package/dist/use-dependencies.d.ts +8 -0
  29. package/dist/use-dependencies.d.ts.map +1 -0
  30. package/dist/use-dependencies.js +30 -0
  31. package/dist/use-dependencies.js.map +1 -0
  32. package/package.json +4 -4
  33. package/src/__tests__/react-ioc.test.tsx +1 -1
  34. package/src/await.tsx +2 -2
  35. package/src/common.tsx +14 -0
  36. package/src/index.ts +9 -3
  37. package/src/inject-dependency.ts +66 -0
  38. package/src/provide.tsx +25 -0
  39. package/src/provider.tsx +139 -0
  40. package/src/store.ts +14 -3
  41. package/src/use-dependencies.ts +39 -0
  42. package/dist/container-context.d.ts +0 -5
  43. package/dist/container-context.d.ts.map +0 -1
  44. package/dist/container-context.js.map +0 -1
  45. package/dist/react-ioc.d.ts +0 -41
  46. package/dist/react-ioc.d.ts.map +0 -1
  47. package/dist/react-ioc.js +0 -172
  48. package/dist/react-ioc.js.map +0 -1
  49. package/src/container-context.tsx +0 -7
  50. package/src/react-ioc.tsx +0 -279
package/dist/await.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { FC } from 'react';
1
+ import { FC, ReactNode } from 'react';
2
2
  export interface AwaitProps {
3
3
  promises: Promise<void>[];
4
- fallback?: JSX.Element;
4
+ fallback?: NonNullable<ReactNode> | null;
5
5
  }
6
6
  export declare const Await: FC<AwaitProps>;
7
7
  //# sourceMappingURL=await.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"await.d.ts","sourceRoot":"","sources":["../src/await.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAyC,MAAM,OAAO,CAAC;AAElE,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,KAAK,EAAE,EAAE,CAAC,UAAU,CAkBhC,CAAC"}
1
+ {"version":3,"file":"await.d.ts","sourceRoot":"","sources":["../src/await.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAsB,SAAS,EAAqB,MAAM,OAAO,CAAC;AAE7E,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;CAC5C;AAED,eAAO,MAAM,KAAK,EAAE,EAAE,CAAC,UAAU,CAkBhC,CAAC"}
package/dist/await.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"await.js","sourceRoot":"","sources":["../src/await.tsx"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,iCAAkE;AAO3D,MAAM,KAAK,GAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,gEAAmB,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC5F,MAAM,IAAI,GAAG,IAAA,eAAO,EAChB,GAAG,EAAE,CACD,IAAA,YAAI,EAAK,GAAS,EAAE;QAChB,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE5B,OAAO;YACH,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAwB;SACtD,CAAC;IACN,CAAC,CAAA,CAAC,EACN,CAAC,QAAQ,CAAC,CACb,CAAC;IAEF,OAAO,CACH,uBAAC,gBAAQ,kBAAC,QAAQ,EAAE,QAAQ,gBACxB,uBAAC,IAAI,cAAE,QAAQ,WAAQ,YAChB,CACd,CAAC;AACN,CAAC,CAAC;AAlBW,QAAA,KAAK,SAkBhB"}
1
+ {"version":3,"file":"await.js","sourceRoot":"","sources":["../src/await.tsx"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,iCAA6E;AAOtE,MAAM,KAAK,GAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,gEAAmB,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC5F,MAAM,IAAI,GAAG,IAAA,eAAO,EAChB,GAAG,EAAE,CACD,IAAA,YAAI,EAAK,GAAS,EAAE;QAChB,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE5B,OAAO;YACH,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAwB;SACtD,CAAC;IACN,CAAC,CAAA,CAAC,EACN,CAAC,QAAQ,CAAC,CACb,CAAC;IAEF,OAAO,CACH,uBAAC,gBAAQ,kBAAC,QAAQ,EAAE,QAAQ,gBACxB,uBAAC,IAAI,cAAE,QAAQ,WAAQ,YAChB,CACd,CAAC;AACN,CAAC,CAAC;AAlBW,QAAA,KAAK,SAkBhB"}
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ import { Container, interfaces } from 'inversify';
3
+ export declare const rootContainer: Container;
4
+ export declare const ContainerContext: import("react").Context<Container>;
5
+ export declare type Token<T> = SymbolToken<T> | interfaces.Newable<T> | interfaces.Abstract<T>;
6
+ export declare type SymbolToken<T> = symbol & {
7
+ typeRef?: T;
8
+ };
9
+ export declare function symbolToken<T>(key: string, global?: boolean): SymbolToken<T>;
10
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAElD,eAAO,MAAM,aAAa,WAAkB,CAAC;AAE7C,eAAO,MAAM,gBAAgB,oCAA+B,CAAC;AAE7D,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"}
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ContainerContext = exports.rootContainer = void 0;
3
+ exports.symbolToken = exports.ContainerContext = exports.rootContainer = void 0;
4
4
  const react_1 = require("react");
5
5
  const inversify_1 = require("inversify");
6
6
  exports.rootContainer = new inversify_1.Container();
7
7
  exports.ContainerContext = (0, react_1.createContext)(exports.rootContainer);
8
- //# sourceMappingURL=container-context.js.map
8
+ function symbolToken(key, global = true) {
9
+ return global ? Symbol.for(key) : Symbol(key);
10
+ }
11
+ exports.symbolToken = symbolToken;
12
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.tsx"],"names":[],"mappings":";;;AAAA,iCAAsC;AAEtC,yCAAkD;AAErC,QAAA,aAAa,GAAG,IAAI,qBAAS,EAAE,CAAC;AAEhC,QAAA,gBAAgB,GAAG,IAAA,qBAAa,EAAC,qBAAa,CAAC,CAAC;AAK7D,SAAgB,WAAW,CAAI,GAAW,EAAE,MAAM,GAAG,IAAI;IACrD,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAFD,kCAEC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,9 @@
1
- export * from './react-ioc';
2
- export { rootContainer } from './container-context';
3
- export { Container, interfaces, injectable, inject, optional } from 'inversify';
1
+ import 'reflect-metadata';
2
+ export { rootContainer, Token, SymbolToken, symbolToken } from './common';
3
+ export { injectDependency } from './inject-dependency';
4
+ export { provide } from './provide';
5
+ export { Provider, ProviderProps } from './provider';
4
6
  export { Store } from './store';
7
+ export { useDependencies, useOptionalDependencies } from './use-dependencies';
8
+ export { Container, interfaces, injectable, inject, optional } from 'inversify';
5
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -1,24 +1,24 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
- };
12
2
  Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.Store = exports.optional = exports.inject = exports.injectable = exports.Container = exports.rootContainer = void 0;
14
- __exportStar(require("./react-ioc"), exports);
15
- var container_context_1 = require("./container-context");
16
- Object.defineProperty(exports, "rootContainer", { enumerable: true, get: function () { return container_context_1.rootContainer; } });
3
+ exports.optional = exports.inject = exports.injectable = exports.Container = exports.useOptionalDependencies = exports.useDependencies = exports.Store = exports.Provider = exports.provide = exports.injectDependency = exports.symbolToken = exports.rootContainer = void 0;
4
+ require("reflect-metadata");
5
+ var common_1 = require("./common");
6
+ Object.defineProperty(exports, "rootContainer", { enumerable: true, get: function () { return common_1.rootContainer; } });
7
+ Object.defineProperty(exports, "symbolToken", { enumerable: true, get: function () { return common_1.symbolToken; } });
8
+ var inject_dependency_1 = require("./inject-dependency");
9
+ Object.defineProperty(exports, "injectDependency", { enumerable: true, get: function () { return inject_dependency_1.injectDependency; } });
10
+ var provide_1 = require("./provide");
11
+ Object.defineProperty(exports, "provide", { enumerable: true, get: function () { return provide_1.provide; } });
12
+ var provider_1 = require("./provider");
13
+ Object.defineProperty(exports, "Provider", { enumerable: true, get: function () { return provider_1.Provider; } });
14
+ var store_1 = require("./store");
15
+ Object.defineProperty(exports, "Store", { enumerable: true, get: function () { return store_1.Store; } });
16
+ var use_dependencies_1 = require("./use-dependencies");
17
+ Object.defineProperty(exports, "useDependencies", { enumerable: true, get: function () { return use_dependencies_1.useDependencies; } });
18
+ Object.defineProperty(exports, "useOptionalDependencies", { enumerable: true, get: function () { return use_dependencies_1.useOptionalDependencies; } });
17
19
  var inversify_1 = require("inversify");
18
20
  Object.defineProperty(exports, "Container", { enumerable: true, get: function () { return inversify_1.Container; } });
19
21
  Object.defineProperty(exports, "injectable", { enumerable: true, get: function () { return inversify_1.injectable; } });
20
22
  Object.defineProperty(exports, "inject", { enumerable: true, get: function () { return inversify_1.inject; } });
21
23
  Object.defineProperty(exports, "optional", { enumerable: true, get: function () { return inversify_1.optional; } });
22
- var store_1 = require("./store");
23
- Object.defineProperty(exports, "Store", { enumerable: true, get: function () { return store_1.Store; } });
24
24
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,yDAAoD;AAA3C,kHAAA,aAAa,OAAA;AACtB,uCAAgF;AAAvE,sGAAA,SAAS,OAAA;AAAc,uGAAA,UAAU,OAAA;AAAE,mGAAA,MAAM,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAC5D,iCAAgC;AAAvB,8FAAA,KAAK,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAE1B,mCAA0E;AAAjE,uGAAA,aAAa,OAAA;AAAsB,qGAAA,WAAW,OAAA;AACvD,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AACzB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,uCAAqD;AAA5C,oGAAA,QAAQ,OAAA;AACjB,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,uDAA8E;AAArE,mHAAA,eAAe,OAAA;AAAE,2HAAA,uBAAuB,OAAA;AAEjD,uCAAgF;AAAvE,sGAAA,SAAS,OAAA;AAAc,uGAAA,UAAU,OAAA;AAAE,mGAAA,MAAM,OAAA;AAAE,qGAAA,QAAQ,OAAA"}
@@ -0,0 +1,3 @@
1
+ import { interfaces } from 'inversify';
2
+ export declare function injectDependency(serviceIdentifier: interfaces.ServiceIdentifier<any>): (proto: any, key: string) => void;
3
+ //# sourceMappingURL=inject-dependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-dependency.d.ts","sourceRoot":"","sources":["../src/inject-dependency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,WAAW,CAAC;AAgCrD,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,WACzD,GAAG,OAAO,MAAM,KAAG,IAAI,CAgClD"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.injectDependency = void 0;
4
+ const inversify_1 = require("inversify");
5
+ const common_1 = require("./common");
6
+ const INJECTION = Symbol.for('INJECTION');
7
+ function proxyGetter(proto, key, resolve, doCache) {
8
+ function getter() {
9
+ if (doCache && !Reflect.hasMetadata(INJECTION, this, key)) {
10
+ Reflect.defineMetadata(INJECTION, resolve(this), this, key);
11
+ }
12
+ if (Reflect.hasMetadata(INJECTION, this, key)) {
13
+ return Reflect.getMetadata(INJECTION, this, key);
14
+ }
15
+ return resolve(this);
16
+ }
17
+ function setter(newVal) {
18
+ Reflect.defineMetadata(INJECTION, newVal, this, key);
19
+ }
20
+ Object.defineProperty(proto, key, {
21
+ configurable: true,
22
+ enumerable: true,
23
+ get: getter,
24
+ set: setter,
25
+ });
26
+ }
27
+ function injectDependency(serviceIdentifier) {
28
+ return function (proto, key) {
29
+ const resolve = (componentInstance) => {
30
+ var _a;
31
+ if (!componentInstance.context) {
32
+ throw new Error("Context doesn't exist on a target class. " +
33
+ 'Please make sure to pass context object to super method if you access injectable stores in constructor.');
34
+ }
35
+ const metadata = Reflect.getMetadata(inversify_1.METADATA_KEY.TAGGED_PROP, proto.constructor) || {};
36
+ if ((_a = metadata[key]) === null || _a === void 0 ? void 0 : _a.some(({ key, value }) => key === inversify_1.METADATA_KEY.OPTIONAL_TAG && value)) {
37
+ if (componentInstance.context.isBound(serviceIdentifier)) {
38
+ return componentInstance.context.get(serviceIdentifier);
39
+ }
40
+ }
41
+ else {
42
+ return componentInstance.context.get(serviceIdentifier);
43
+ }
44
+ };
45
+ if (proto.constructor.contextType && proto.constructor.contextType !== common_1.ContainerContext) {
46
+ throw new Error("injectDependency can't be used together with contextType static property");
47
+ }
48
+ proto.constructor.contextType = common_1.ContainerContext;
49
+ proxyGetter(proto, key, resolve, true);
50
+ };
51
+ }
52
+ exports.injectDependency = injectDependency;
53
+ //# sourceMappingURL=inject-dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-dependency.js","sourceRoot":"","sources":["../src/inject-dependency.ts"],"names":[],"mappings":";;;AAAA,yCAAqD;AAErD,qCAA4C;AAE5C,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAE1C,SAAS,WAAW,CAChB,KAAU,EACV,GAAW,EACX,OAAwC,EACxC,OAAgB;IAEhB,SAAS,MAAM;QACX,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE;YACvD,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;SAC/D;QACD,IAAI,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE;YAC3C,OAAO,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;SACpD;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,SAAS,MAAM,CAAY,MAAW;QAClC,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE;QAC9B,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,IAAI;QAChB,GAAG,EAAE,MAAM;QACX,GAAG,EAAE,MAAM;KACd,CAAC,CAAC;AACP,CAAC;AAED,SAAgB,gBAAgB,CAAC,iBAAoD;IACjF,OAAO,UAAU,KAAU,EAAE,GAAW;QACpC,MAAM,OAAO,GAAG,CAAC,iBAAsB,EAAE,EAAE;;YACvC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE;gBAC5B,MAAM,IAAI,KAAK,CACX,2CAA2C;oBACvC,yGAAyG,CAChH,CAAC;aACL;YAED,MAAM,QAAQ,GACV,OAAO,CAAC,WAAW,CAAC,wBAAY,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YAE3E,IACI,MAAA,QAAQ,CAAC,GAAG,CAAC,0CAAE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,wBAAY,CAAC,YAAY,IAAI,KAAK,CAAC,EACrF;gBACE,IAAI,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;oBACtD,OAAO,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;iBAC3D;aACJ;iBAAM;gBACH,OAAO,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;aAC3D;QACL,CAAC,CAAC;QAEF,IAAI,KAAK,CAAC,WAAW,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,WAAW,KAAK,yBAAgB,EAAE;YACrF,MAAM,IAAI,KAAK,CACX,0EAA0E,CAC7E,CAAC;SACL;QAED,KAAK,CAAC,WAAW,CAAC,WAAW,GAAG,yBAAgB,CAAC;QACjD,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC;AACN,CAAC;AAjCD,4CAiCC"}
@@ -0,0 +1,14 @@
1
+ import { ReactInstance, StatelessComponent, ComponentClass, ClassicComponentClass } from 'react';
2
+ import { ProviderConfigEntry } from './provider';
3
+ export interface WrappedComponent<P> {
4
+ wrappedComponent: ReactComponent<P>;
5
+ wrappedInstance: ReactInstance | undefined;
6
+ }
7
+ declare type ReactComponent<P = any> = StatelessComponent<P> | ComponentClass<P> | ClassicComponentClass<P>;
8
+ declare type ProvideDecorator = (stores: {
9
+ singletons?: ProviderConfigEntry<any>[];
10
+ instances?: ProviderConfigEntry<any>[];
11
+ }, fallback?: JSX.Element) => <T extends ReactComponent>(target: T) => T & WrappedComponent<T>;
12
+ export declare const provide: ProvideDecorator;
13
+ export {};
14
+ //# sourceMappingURL=provide.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provide.d.ts","sourceRoot":"","sources":["../src/provide.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEjG,OAAO,EAAY,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE3D,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;IACJ,UAAU,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;IACxC,SAAS,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;CAC1C,EACD,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,KACrB,CAAC,CAAC,SAAS,cAAc,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAEtE,eAAO,MAAM,OAAO,kBAKM,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.provide = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const provider_1 = require("./provider");
6
+ exports.provide = ((stores, fallback) => (Component) => props => ((0, jsx_runtime_1.jsx)(provider_1.Provider, Object.assign({}, stores, { fallback: fallback }, { children: (0, jsx_runtime_1.jsx)(Component, Object.assign({}, props), void 0) }), void 0)));
7
+ //# sourceMappingURL=provide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provide.js","sourceRoot":"","sources":["../src/provide.tsx"],"names":[],"mappings":";;;;AAEA,yCAA2D;AAiB9C,QAAA,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,SAAyB,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CACjF,CACI,uBAAC,mBAAQ,oBAAK,MAAM,IAAE,QAAQ,EAAE,QAAQ,gBACpC,uBAAC,SAAS,oBAAK,KAAK,UAAI,YACjB,CACd,CAAqB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { FC } from 'react';
2
+ import { interfaces } from 'inversify';
3
+ import { Token, SymbolToken } from './common';
4
+ export declare type ProviderConfigEntry<T> = interfaces.Newable<T> | ClassProviderConfigEntry<T> | ValueProviderConfigEntry<T>;
5
+ interface ClassProviderConfigEntry<T> {
6
+ provide: Token<T>;
7
+ useClass: interfaces.Newable<T>;
8
+ }
9
+ interface ValueProviderConfigEntry<T> {
10
+ provide: SymbolToken<T> | interfaces.Abstract<T>;
11
+ useValue: T;
12
+ }
13
+ export interface ProviderProps {
14
+ singletons?: ProviderConfigEntry<any>[];
15
+ instances?: ProviderConfigEntry<any>[];
16
+ fallback?: JSX.Element;
17
+ }
18
+ export declare const Provider: FC<ProviderProps>;
19
+ export {};
20
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAyC,MAAM,OAAO,CAAC;AAElE,OAAO,EAAa,UAAU,EAAE,MAAM,WAAW,CAAC;AAGlD,OAAO,EAAoB,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGhE,oBAAY,mBAAmB,CAAC,CAAC,IAC3B,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,aAAa;IAC1B,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,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CA2FtC,CAAC"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Provider = 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 await_1 = require("./await");
8
+ const common_1 = require("./common");
9
+ const store_1 = require("./store");
10
+ function isClassProviderConfigEntry(entry) {
11
+ return (Object.prototype.hasOwnProperty.call(entry, 'provide') &&
12
+ Object.prototype.hasOwnProperty.call(entry, 'useClass'));
13
+ }
14
+ function isValueProviderConfigEntry(entry) {
15
+ return (Object.prototype.hasOwnProperty.call(entry, 'provide') &&
16
+ Object.prototype.hasOwnProperty.call(entry, 'useValue'));
17
+ }
18
+ const Provider = ({ singletons, instances, fallback, children }) => {
19
+ const parentContainer = (0, react_1.useContext)(common_1.ContainerContext);
20
+ const [container, setContainer] = (0, react_1.useState)();
21
+ const [promises, setPromises] = (0, react_1.useState)();
22
+ (0, react_1.useLayoutEffect)(() => {
23
+ const container = new inversify_1.Container();
24
+ container.parent = parentContainer;
25
+ const bind = (entry) => {
26
+ if (isClassProviderConfigEntry(entry)) {
27
+ return container.bind(entry.provide).to(entry.useClass);
28
+ }
29
+ if (isValueProviderConfigEntry(entry)) {
30
+ // using toDynamicValue to return BindingInSyntax
31
+ return container.bind(entry.provide).toDynamicValue(() => entry.useValue);
32
+ }
33
+ return container.bind(entry).to(entry);
34
+ };
35
+ singletons === null || singletons === void 0 ? void 0 : singletons.map(bind).forEach(binding => {
36
+ binding.inSingletonScope();
37
+ });
38
+ instances === null || instances === void 0 ? void 0 : instances.forEach(bind);
39
+ const storeInstances = [...(singletons !== null && singletons !== void 0 ? singletons : []), ...(instances !== null && instances !== void 0 ? instances : [])]
40
+ .map(entry => {
41
+ if (isValueProviderConfigEntry(entry)) {
42
+ return undefined;
43
+ }
44
+ const { provide, useClass } = isClassProviderConfigEntry(entry)
45
+ ? entry
46
+ : { provide: entry, useClass: entry };
47
+ if ((0, store_1.isStore)(useClass)) {
48
+ return container.get(provide);
49
+ }
50
+ return undefined;
51
+ })
52
+ .filter(Boolean);
53
+ const promises = [];
54
+ for (const instance of storeInstances) {
55
+ if (instance.initialize) {
56
+ promises.push(instance.initialize());
57
+ }
58
+ }
59
+ setContainer(container);
60
+ setPromises(promises);
61
+ return () => {
62
+ const unbind = (entry) => {
63
+ if (isClassProviderConfigEntry(entry) || isValueProviderConfigEntry(entry)) {
64
+ return container.unbind(entry.provide);
65
+ }
66
+ return container.unbind(entry);
67
+ };
68
+ singletons === null || singletons === void 0 ? void 0 : singletons.forEach(unbind);
69
+ instances === null || instances === void 0 ? void 0 : instances.forEach(unbind);
70
+ for (const instance of storeInstances) {
71
+ if (instance.dispose) {
72
+ instance.dispose();
73
+ }
74
+ }
75
+ };
76
+ }, [parentContainer, singletons, instances]);
77
+ if (!container) {
78
+ return null;
79
+ }
80
+ return ((0, jsx_runtime_1.jsx)(common_1.ContainerContext.Provider, Object.assign({ value: container }, { children: (promises === null || promises === void 0 ? void 0 : promises.length) ? ((0, jsx_runtime_1.jsx)(await_1.Await, Object.assign({ promises: promises, fallback: fallback }, { children: children }), void 0)) : (children) }), void 0));
81
+ };
82
+ exports.Provider = Provider;
83
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
package/dist/store.d.ts CHANGED
@@ -1,8 +1,15 @@
1
- import 'reflect-metadata';
1
+ import { interfaces } from 'inversify';
2
+ declare const symbol: unique symbol;
3
+ interface Identifier<T> extends interfaces.Newable<T> {
4
+ [symbol]?: boolean;
5
+ }
6
+ export declare function isStore<T>(identifier: Identifier<T>): boolean | undefined;
2
7
  export declare abstract class Store {
8
+ static [symbol]: boolean;
3
9
  }
4
10
  export interface Store {
5
11
  initialize?(): Promise<void>;
6
12
  dispose?(): void;
7
13
  }
14
+ export {};
8
15
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC;AAE1B,8BACsB,KAAK;CAAG;AAE9B,MAAM,WAAW,KAAK;IAClB,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,IAAI,CAAC;CACpB"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,UAAU,EAAE,MAAM,WAAW,CAAC;AAEnD,QAAA,MAAM,MAAM,eAAmC,CAAC;AAEhD,UAAU,UAAU,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,uBAEnD;AAED,8BACsB,KAAK;IACvB,MAAM,CAAC,CAAC,MAAM,CAAC,UAAQ;CAC1B;AAED,MAAM,WAAW,KAAK;IAClB,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,IAAI,CAAC;CACpB"}
package/dist/store.js CHANGED
@@ -5,12 +5,24 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var _a;
8
9
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.Store = void 0;
10
+ exports.Store = exports.isStore = void 0;
10
11
  const inversify_1 = require("inversify");
11
- require("reflect-metadata");
12
+ const symbol = Symbol('Inheritor Of The Store');
13
+ function isStore(identifier) {
14
+ return identifier[symbol];
15
+ }
16
+ exports.isStore = isStore;
12
17
  let Store = class Store {
13
18
  };
19
+ _a = symbol;
20
+ Object.defineProperty(Store, _a, {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: true
25
+ });
14
26
  Store = __decorate([
15
27
  (0, inversify_1.injectable)()
16
28
  ], Store);
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":";;;;;;;;;AAAA,yCAAuC;AACvC,4BAA0B;AAG1B,IAAsB,KAAK,GAA3B,MAAsB,KAAK;CAAG,CAAA;AAAR,KAAK;IAD1B,IAAA,sBAAU,GAAE;GACS,KAAK,CAAG;AAAR,sBAAK"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,yCAAmD;AAEnD,MAAM,MAAM,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAMhD,SAAgB,OAAO,CAAI,UAAyB;IAChD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAFD,0BAEC;AAGD,IAAsB,KAAK,GAA3B,MAAsB,KAAK;CAE1B,CAAA;KADW,MAAM;AAAP;;;;WAAW,IAAI;GAAC;AADL,KAAK;IAD1B,IAAA,sBAAU,GAAE;GACS,KAAK,CAE1B;AAFqB,sBAAK"}
@@ -0,0 +1,8 @@
1
+ import { Token } from './common';
2
+ declare type Tokens<T> = {
3
+ [P in keyof T]: Token<T[P]>;
4
+ };
5
+ export declare function useDependencies<T extends any[]>(...tokens: Tokens<T>): T;
6
+ export declare function useOptionalDependencies<T extends any[]>(...tokens: Tokens<T>): Partial<T>;
7
+ export {};
8
+ //# sourceMappingURL=use-dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-dependencies.d.ts","sourceRoot":"","sources":["../src/use-dependencies.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,EAAE,MAAM,UAAU,CAAC;AAEnD,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"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useOptionalDependencies = exports.useDependencies = void 0;
4
+ const react_1 = require("react");
5
+ const common_1 = require("./common");
6
+ function useDependenciesInternal(tokens, optional) {
7
+ const ref = (0, react_1.useRef)(null);
8
+ const container = (0, react_1.useContext)(common_1.ContainerContext);
9
+ if (!ref.current) {
10
+ ref.current = tokens.map(s => {
11
+ if (optional) {
12
+ if (container.isBound(s)) {
13
+ return container.get(s);
14
+ }
15
+ return undefined;
16
+ }
17
+ return container.get(s);
18
+ });
19
+ }
20
+ return ref.current;
21
+ }
22
+ function useDependencies(...tokens) {
23
+ return useDependenciesInternal(tokens, false);
24
+ }
25
+ exports.useDependencies = useDependencies;
26
+ function useOptionalDependencies(...tokens) {
27
+ return useDependenciesInternal(tokens, true);
28
+ }
29
+ exports.useOptionalDependencies = useOptionalDependencies;
30
+ //# sourceMappingURL=use-dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-dependencies.js","sourceRoot":"","sources":["../src/use-dependencies.ts"],"names":[],"mappings":";;;AAAA,iCAA2C;AAE3C,qCAAmD;AAMnD,SAAS,uBAAuB,CAC5B,MAAiB,EACjB,QAAW;IAEX,MAAM,GAAG,GAAG,IAAA,cAAM,EAAwB,IAAI,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,IAAA,kBAAU,EAAC,yBAAgB,CAAC,CAAC;IAE/C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;QACd,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACzB,IAAI,QAAQ,EAAE;gBACV,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACtB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBAC3B;gBAED,OAAO,SAAS,CAAC;aACpB;YAED,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAM,CAAC;KACX;IAED,OAAO,GAAG,CAAC,OAA0C,CAAC;AAC1D,CAAC;AAED,SAAgB,eAAe,CAAkB,GAAG,MAAiB;IACjE,OAAO,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAFD,0CAEC;AAED,SAAgB,uBAAuB,CAAkB,GAAG,MAAiB;IACzE,OAAO,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAFD,0DAEC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/react-ioc",
3
- "version": "17.1.0",
3
+ "version": "17.3.0",
4
4
  "description": "",
5
5
  "homepage": "https://docs.st.dev/docs/frontend/react-ioc",
6
6
  "repository": {
@@ -15,11 +15,11 @@
15
15
  "src"
16
16
  ],
17
17
  "dependencies": {
18
- "inversify": "~5.1.1",
18
+ "inversify": "~6.0.1",
19
19
  "reflect-metadata": "~0.1.13"
20
20
  },
21
21
  "devDependencies": {
22
- "@types/react": "~17.0.26",
22
+ "@types/react": "~17.0.33",
23
23
  "react": "~17.0.2"
24
24
  },
25
25
  "peerDependencies": {
@@ -31,5 +31,5 @@
31
31
  "cli": {
32
32
  "webpack": false
33
33
  },
34
- "gitHead": "212b3ade787b7bc0fb6aaacb60ca422bc7bbbd70"
34
+ "gitHead": "c46d6edf5601d2d12e05c27d94cf6239c7514616"
35
35
  }
@@ -8,7 +8,7 @@ import {
8
8
  useDependencies,
9
9
  symbolToken,
10
10
  } from '..';
11
- import { ContainerContext } from '../container-context';
11
+ import { ContainerContext } from '../common';
12
12
  import TestRenderer from 'react-test-renderer';
13
13
 
14
14
  @injectable()
package/src/await.tsx CHANGED
@@ -1,8 +1,8 @@
1
- import { FC, lazy, ReactElement, Suspense, useMemo } from 'react';
1
+ import { FC, lazy, ReactElement, ReactNode, Suspense, useMemo } from 'react';
2
2
 
3
3
  export interface AwaitProps {
4
4
  promises: Promise<void>[];
5
- fallback?: JSX.Element;
5
+ fallback?: NonNullable<ReactNode> | null;
6
6
  }
7
7
 
8
8
  export const Await: FC<AwaitProps> = ({ promises, fallback = <h2>Loading...</h2>, children }) => {
package/src/common.tsx ADDED
@@ -0,0 +1,14 @@
1
+ import { createContext } from 'react';
2
+
3
+ import { Container, interfaces } from 'inversify';
4
+
5
+ export const rootContainer = new Container();
6
+
7
+ export const ContainerContext = createContext(rootContainer);
8
+
9
+ export type Token<T> = SymbolToken<T> | interfaces.Newable<T> | interfaces.Abstract<T>;
10
+
11
+ export type SymbolToken<T> = symbol & { typeRef?: T };
12
+ export function symbolToken<T>(key: string, global = true): SymbolToken<T> {
13
+ return global ? Symbol.for(key) : Symbol(key);
14
+ }
package/src/index.ts CHANGED
@@ -1,4 +1,10 @@
1
- export * from './react-ioc';
2
- export { rootContainer } from './container-context';
3
- export { Container, interfaces, injectable, inject, optional } from 'inversify';
1
+ import 'reflect-metadata';
2
+
3
+ export { rootContainer, Token, SymbolToken, symbolToken } from './common';
4
+ export { injectDependency } from './inject-dependency';
5
+ export { provide } from './provide';
6
+ export { Provider, ProviderProps } from './provider';
4
7
  export { Store } from './store';
8
+ export { useDependencies, useOptionalDependencies } from './use-dependencies';
9
+
10
+ export { Container, interfaces, injectable, inject, optional } from 'inversify';
@@ -0,0 +1,66 @@
1
+ import { interfaces, METADATA_KEY } from 'inversify';
2
+
3
+ import { ContainerContext } from './common';
4
+
5
+ const INJECTION = Symbol.for('INJECTION');
6
+
7
+ function proxyGetter(
8
+ proto: any,
9
+ key: string,
10
+ resolve: (componentInstance: any) => any,
11
+ doCache: boolean
12
+ ) {
13
+ function getter(this: any) {
14
+ if (doCache && !Reflect.hasMetadata(INJECTION, this, key)) {
15
+ Reflect.defineMetadata(INJECTION, resolve(this), this, key);
16
+ }
17
+ if (Reflect.hasMetadata(INJECTION, this, key)) {
18
+ return Reflect.getMetadata(INJECTION, this, key);
19
+ }
20
+ return resolve(this);
21
+ }
22
+ function setter(this: any, newVal: any) {
23
+ Reflect.defineMetadata(INJECTION, newVal, this, key);
24
+ }
25
+ Object.defineProperty(proto, key, {
26
+ configurable: true,
27
+ enumerable: true,
28
+ get: getter,
29
+ set: setter,
30
+ });
31
+ }
32
+
33
+ export function injectDependency(serviceIdentifier: interfaces.ServiceIdentifier<any>) {
34
+ return function (proto: any, key: string): void {
35
+ const resolve = (componentInstance: any) => {
36
+ if (!componentInstance.context) {
37
+ throw new Error(
38
+ "Context doesn't exist on a target class. " +
39
+ 'Please make sure to pass context object to super method if you access injectable stores in constructor.'
40
+ );
41
+ }
42
+
43
+ const metadata: Partial<interfaces.MetadataMap> =
44
+ Reflect.getMetadata(METADATA_KEY.TAGGED_PROP, proto.constructor) || {};
45
+
46
+ if (
47
+ metadata[key]?.some(({ key, value }) => key === METADATA_KEY.OPTIONAL_TAG && value)
48
+ ) {
49
+ if (componentInstance.context.isBound(serviceIdentifier)) {
50
+ return componentInstance.context.get(serviceIdentifier);
51
+ }
52
+ } else {
53
+ return componentInstance.context.get(serviceIdentifier);
54
+ }
55
+ };
56
+
57
+ if (proto.constructor.contextType && proto.constructor.contextType !== ContainerContext) {
58
+ throw new Error(
59
+ "injectDependency can't be used together with contextType static property"
60
+ );
61
+ }
62
+
63
+ proto.constructor.contextType = ContainerContext;
64
+ proxyGetter(proto, key, resolve, true);
65
+ };
66
+ }
@@ -0,0 +1,25 @@
1
+ import { ReactInstance, StatelessComponent, ComponentClass, ClassicComponentClass } from 'react';
2
+
3
+ import { Provider, ProviderConfigEntry } from './provider';
4
+
5
+ export interface WrappedComponent<P> {
6
+ wrappedComponent: ReactComponent<P>;
7
+ wrappedInstance: ReactInstance | undefined;
8
+ }
9
+
10
+ type ReactComponent<P = any> = StatelessComponent<P> | ComponentClass<P> | ClassicComponentClass<P>;
11
+
12
+ type ProvideDecorator = (
13
+ stores: {
14
+ singletons?: ProviderConfigEntry<any>[];
15
+ instances?: ProviderConfigEntry<any>[];
16
+ },
17
+ fallback?: JSX.Element
18
+ ) => <T extends ReactComponent>(target: T) => T & WrappedComponent<T>;
19
+
20
+ export const provide = ((stores, fallback) => (Component: ReactComponent) => props =>
21
+ (
22
+ <Provider {...stores} fallback={fallback}>
23
+ <Component {...props} />
24
+ </Provider>
25
+ )) as ProvideDecorator;