react-obsidian 0.0.36 → 0.0.38
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/src/Obsidian.js +2 -2
- package/dist/src/decorators/inject/LateInject.d.ts +2 -0
- package/dist/src/decorators/inject/LateInject.d.ts.map +1 -0
- package/dist/src/decorators/inject/{LazyInject.js → LateInject.js} +5 -5
- package/dist/src/decorators/inject/{LazyInject.js.map → LateInject.js.map} +1 -1
- package/dist/src/graph/Graph.d.ts +1 -0
- package/dist/src/graph/Graph.d.ts.map +1 -1
- package/dist/src/graph/ObjectGraph.d.ts +1 -0
- package/dist/src/graph/ObjectGraph.d.ts.map +1 -1
- package/dist/src/graph/ObjectGraph.js +2 -0
- package/dist/src/graph/ObjectGraph.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +3 -3
- package/dist/src/injectors/class/ClassInjector.d.ts.map +1 -1
- package/dist/src/injectors/class/ClassInjector.js +3 -2
- package/dist/src/injectors/class/ClassInjector.js.map +1 -1
- package/dist/src/injectors/class/InjectionMetadata.d.ts +3 -3
- package/dist/src/injectors/class/InjectionMetadata.js +5 -5
- package/dist/src/injectors/class/{LazyInjector.d.ts → LateInjector.d.ts} +3 -3
- package/dist/src/injectors/class/{LazyInjector.d.ts.map → LateInjector.d.ts.map} +1 -1
- package/dist/src/injectors/class/{LazyInjector.js → LateInjector.js} +8 -8
- package/dist/src/injectors/class/{LazyInjector.js.map → LateInjector.js.map} +1 -1
- package/dist/src/injectors/components/ComponentInjector.js +1 -1
- package/dist/src/injectors/components/ComponentInjector.js.map +1 -1
- package/dist/src/injectors/components/useGraph.d.ts +1 -1
- package/dist/src/injectors/components/useGraph.d.ts.map +1 -1
- package/dist/src/injectors/components/useGraph.js +6 -2
- package/dist/src/injectors/components/useGraph.js.map +1 -1
- package/dist/src/injectors/hooks/HookInjector.js +1 -1
- package/dist/src/injectors/hooks/HookInjector.js.map +1 -1
- package/dist/src/observable/Observable.d.ts +1 -0
- package/dist/src/observable/Observable.d.ts.map +1 -1
- package/dist/src/observable/Observable.js +6 -0
- package/dist/src/observable/Observable.js.map +1 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/test/fixtures/GraphWithOnBind.d.ts +7 -0
- package/dist/test/fixtures/GraphWithOnBind.d.ts.map +1 -0
- package/dist/test/fixtures/GraphWithOnBind.js +52 -0
- package/dist/test/fixtures/GraphWithOnBind.js.map +1 -0
- package/dist/transformers/babel-plugin-obsidian/index.js +1 -1
- package/documentation/docs/documentation/usage/Classes.mdx +4 -4
- package/documentation/docs/documentation/usage/Reactivity.mdx +96 -0
- package/documentation/docs/documentation/usage/ServiceLocator.mdx +1 -1
- package/package.json +1 -1
- package/src/Obsidian.ts +2 -2
- package/src/decorators/inject/{LazyInject.ts → LateInject.ts} +2 -2
- package/src/graph/Graph.ts +1 -0
- package/src/graph/ObjectGraph.ts +4 -0
- package/src/index.ts +1 -1
- package/src/injectors/class/ClassInjector.ts +2 -1
- package/src/injectors/class/InjectionMetadata.ts +6 -6
- package/src/injectors/class/{LazyInjector.ts → LateInjector.ts} +3 -3
- package/src/injectors/components/ComponentInjector.tsx +1 -1
- package/src/injectors/components/useGraph.ts +6 -2
- package/src/injectors/hooks/HookInjector.ts +1 -1
- package/src/observable/Observable.ts +7 -0
- package/src/types/index.ts +1 -1
- package/transformers/babel-plugin-obsidian/index.ts +1 -1
- package/dist/src/decorators/inject/LazyInject.d.ts +0 -2
- package/dist/src/decorators/inject/LazyInject.d.ts.map +0 -1
package/dist/src/Obsidian.js
CHANGED
|
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
var GraphRegistry_1 = __importDefault(require("./graph/registry/GraphRegistry"));
|
|
7
|
-
var
|
|
7
|
+
var LateInjector_1 = __importDefault(require("./injectors/class/LateInjector"));
|
|
8
8
|
var ServiceLocatorFactory_1 = __importDefault(require("./graph/ServiceLocatorFactory"));
|
|
9
9
|
var Obsidian = /** @class */ (function () {
|
|
10
10
|
function Obsidian() {
|
|
@@ -13,7 +13,7 @@ var Obsidian = /** @class */ (function () {
|
|
|
13
13
|
return ServiceLocatorFactory_1.default.fromGraph(Graph, props);
|
|
14
14
|
};
|
|
15
15
|
Obsidian.prototype.inject = function (target, graph) {
|
|
16
|
-
return
|
|
16
|
+
return LateInjector_1.default.inject(target, graph);
|
|
17
17
|
};
|
|
18
18
|
Obsidian.prototype.addGraphMiddleware = function (middleware) {
|
|
19
19
|
GraphRegistry_1.default.addGraphMiddleware(middleware);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LateInject.d.ts","sourceRoot":"","sources":["../../../../src/decorators/inject/LateInject.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,CAK7C"}
|
|
@@ -3,13 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.LateInject = void 0;
|
|
7
7
|
var InjectionMetadata_1 = __importDefault(require("../../injectors/class/InjectionMetadata"));
|
|
8
|
-
function
|
|
8
|
+
function LateInject(name) {
|
|
9
9
|
return function (target) {
|
|
10
10
|
var metadata = new InjectionMetadata_1.default();
|
|
11
|
-
metadata.
|
|
11
|
+
metadata.saveLatePropertyMetadata(target.constructor, name);
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
|
-
exports.
|
|
15
|
-
//# sourceMappingURL=
|
|
14
|
+
exports.LateInject = LateInject;
|
|
15
|
+
//# sourceMappingURL=LateInject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"LateInject.js","sourceRoot":"","sources":["../../../../src/decorators/inject/LateInject.ts"],"names":[],"mappings":";;;;;;AAAA,8FAAwE;AAExE,SAAgB,UAAU,CAAC,IAAa;IACtC,OAAO,UAAC,MAAc;QACpB,IAAM,QAAQ,GAAG,IAAI,2BAAiB,EAAE,CAAC;QACzC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,CAAC,WAAW,EAAE,IAAK,CAAC,CAAC;IAC/D,CAAC,CAAC;AACJ,CAAC;AALD,gCAKC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Graph.d.ts","sourceRoot":"","sources":["../../../src/graph/Graph.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,MAAM,6BAA6B,CAAC;AAEpE,MAAM,WAAW,KAAM,SAAQ,yBAAyB;IACtD,IAAI,IAAI,IAAI,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Graph.d.ts","sourceRoot":"","sources":["../../../src/graph/Graph.ts"],"names":[],"mappings":"AAAA,OAAO,yBAAyB,MAAM,6BAA6B,CAAC;AAEpE,MAAM,WAAW,KAAM,SAAQ,yBAAyB;IACtD,IAAI,IAAI,IAAI,MAAM,CAAC;IACnB,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;CAC3B"}
|
|
@@ -6,6 +6,7 @@ export declare abstract class ObjectGraph<T = unknown> implements Graph {
|
|
|
6
6
|
get name(): string;
|
|
7
7
|
constructor(_props?: T | undefined);
|
|
8
8
|
retrieve<Dependency>(property: string, receiver?: unknown): Dependency | undefined;
|
|
9
|
+
onBind(_target: any): void;
|
|
9
10
|
}
|
|
10
11
|
export declare function isGraph(object: Constructable<ObjectGraph> | any): object is Constructable<ObjectGraph>;
|
|
11
12
|
//# sourceMappingURL=ObjectGraph.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectGraph.d.ts","sourceRoot":"","sources":["../../../src/graph/ObjectGraph.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,8BAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,KAAK;IAQjD,SAAS,CAAC,MAAM,CAAC;IAP7B,OAAO,CAAC,iBAAiB,CAA+B;IAExD,IACI,IAAI,IAAI,MAAM,CAEjB;gBAEqB,MAAM,CAAC,eAAG;IAIhC,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS;
|
|
1
|
+
{"version":3,"file":"ObjectGraph.d.ts","sourceRoot":"","sources":["../../../src/graph/ObjectGraph.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,8BAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,KAAK;IAQjD,SAAS,CAAC,MAAM,CAAC;IAP7B,OAAO,CAAC,iBAAiB,CAA+B;IAExD,IACI,IAAI,IAAI,MAAM,CAEjB;gBAEqB,MAAM,CAAC,eAAG;IAIhC,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS;IAIlF,MAAM,CAAC,OAAO,EAAE,GAAG;CAGpB;AAID,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,MAAM,IAAI,aAAa,CAAC,WAAW,CAAC,CAEtG"}
|
|
@@ -33,6 +33,8 @@ var ObjectGraph = /** @class */ (function () {
|
|
|
33
33
|
ObjectGraph.prototype.retrieve = function (property, receiver) {
|
|
34
34
|
return this.propertyRetriever.retrieve(property, receiver);
|
|
35
35
|
};
|
|
36
|
+
ObjectGraph.prototype.onBind = function (_target) {
|
|
37
|
+
};
|
|
36
38
|
__decorate([
|
|
37
39
|
(0, Memoize_1.default)(),
|
|
38
40
|
__metadata("design:type", String),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectGraph.js","sourceRoot":"","sources":["../../../src/graph/ObjectGraph.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,iCAAkC;AAClC,kEAA4C;AAC5C,mDAAiD;AAEjD,0EAAoD;AAGpD;IAQE,qBAAsB,MAAU;QAAV,WAAM,GAAN,MAAM,CAAI;QAPxB,sBAAiB,GAAG,IAAI,2BAAiB,CAAC,IAAI,CAAC,CAAC;QAQtD,IAAA,8BAAa,EAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAPD,sBACI,6BAAI;aADR;YAEE,OAAO,IAAA,iBAAQ,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;;;OAAA;IAMD,8BAAQ,GAAR,UAAqB,QAAgB,EAAE,QAAkB;QACvD,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAA2B,CAAC;IACvF,CAAC;
|
|
1
|
+
{"version":3,"file":"ObjectGraph.js","sourceRoot":"","sources":["../../../src/graph/ObjectGraph.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,iCAAkC;AAClC,kEAA4C;AAC5C,mDAAiD;AAEjD,0EAAoD;AAGpD;IAQE,qBAAsB,MAAU;QAAV,WAAM,GAAN,MAAM,CAAI;QAPxB,sBAAiB,GAAG,IAAI,2BAAiB,CAAC,IAAI,CAAC,CAAC;QAQtD,IAAA,8BAAa,EAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAPD,sBACI,6BAAI;aADR;YAEE,OAAO,IAAA,iBAAQ,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;;;OAAA;IAMD,8BAAQ,GAAR,UAAqB,QAAgB,EAAE,QAAkB;QACvD,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAA2B,CAAC;IACvF,CAAC;IAED,4BAAM,GAAN,UAAO,OAAY;IAEnB,CAAC;IAfD;QAAC,IAAA,iBAAO,GAAE;;;2CAGT;IAaH,kBAAC;CAAA,AAnBD,IAmBC;AAnBqB,kCAAW;AAqBjC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,mBAAmB,EAAE,aAAa,CAAC,CAAC;AAE7D,SAAgB,OAAO,CAAC,MAAwC;IAC9D,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,KAAK,aAAa,CAAC;AACpE,CAAC;AAFD,0BAEC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export { Graph as IGraph } from './graph/Graph';
|
|
|
7
7
|
export { Provides } from './decorators/provides/Provides';
|
|
8
8
|
export { Injectable } from './decorators/inject/Injectable';
|
|
9
9
|
export { Inject } from './decorators/inject/Inject';
|
|
10
|
-
export {
|
|
10
|
+
export { LateInject } from './decorators/inject/LateInject';
|
|
11
11
|
export { LifecycleBound } from './decorators/LifecycleBound';
|
|
12
12
|
export { GraphMiddleware } from './graph/registry/GraphMiddleware';
|
|
13
13
|
export { GraphResolveChain as ResolveChain } from './graph/registry/GraphResolveChain';
|
package/dist/src/index.js
CHANGED
|
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
17
17
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.testKit = exports.MediatorObservable = exports.Observable = exports.useObserver = exports.injectHookWithArguments = exports.injectHook = exports.injectComponent = exports.Obsidian = exports.GraphMiddleware = exports.LifecycleBound = exports.
|
|
20
|
+
exports.testKit = exports.MediatorObservable = exports.Observable = exports.useObserver = exports.injectHookWithArguments = exports.injectHook = exports.injectComponent = exports.Obsidian = exports.GraphMiddleware = exports.LifecycleBound = exports.LateInject = exports.Inject = exports.Injectable = exports.Provides = exports.ObjectGraph = exports.Singleton = exports.Graph = void 0;
|
|
21
21
|
var Obsidian_1 = __importDefault(require("./Obsidian"));
|
|
22
22
|
__exportStar(require("./types"), exports);
|
|
23
23
|
var Graph_1 = require("./decorators/Graph");
|
|
@@ -32,8 +32,8 @@ var Injectable_1 = require("./decorators/inject/Injectable");
|
|
|
32
32
|
Object.defineProperty(exports, "Injectable", { enumerable: true, get: function () { return Injectable_1.Injectable; } });
|
|
33
33
|
var Inject_1 = require("./decorators/inject/Inject");
|
|
34
34
|
Object.defineProperty(exports, "Inject", { enumerable: true, get: function () { return Inject_1.Inject; } });
|
|
35
|
-
var
|
|
36
|
-
Object.defineProperty(exports, "
|
|
35
|
+
var LateInject_1 = require("./decorators/inject/LateInject");
|
|
36
|
+
Object.defineProperty(exports, "LateInject", { enumerable: true, get: function () { return LateInject_1.LateInject; } });
|
|
37
37
|
var LifecycleBound_1 = require("./decorators/LifecycleBound");
|
|
38
38
|
Object.defineProperty(exports, "LifecycleBound", { enumerable: true, get: function () { return LifecycleBound_1.LifecycleBound; } });
|
|
39
39
|
var GraphMiddleware_1 = require("./graph/registry/GraphMiddleware");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClassInjector.d.ts","sourceRoot":"","sources":["../../../../src/injectors/class/ClassInjector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAGpD,MAAM,CAAC,OAAO,OAAO,aAAa;IAE9B,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,iBAAiB;gBADjB,aAAa,EAAE,aAAa,EAC5B,iBAAiB,GAAE,iBAA2C;IAGxE,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,YAChB,cAAc,GAAG,CAAC;IAKpC,OAAO,CAAC,kBAAkB;
|
|
1
|
+
{"version":3,"file":"ClassInjector.d.ts","sourceRoot":"","sources":["../../../../src/injectors/class/ClassInjector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAGpD,MAAM,CAAC,OAAO,OAAO,aAAa;IAE9B,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,iBAAiB;gBADjB,aAAa,EAAE,aAAa,EAC5B,iBAAiB,GAAE,iBAA2C;IAGxE,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,YAChB,cAAc,GAAG,CAAC;IAKpC,OAAO,CAAC,kBAAkB;CA+B3B"}
|
|
@@ -13,7 +13,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
var InjectionMetadata_1 = __importDefault(require("./InjectionMetadata"));
|
|
16
|
-
var
|
|
16
|
+
var LateInjector_1 = require("./LateInjector");
|
|
17
17
|
var ClassInjector = /** @class */ (function () {
|
|
18
18
|
function ClassInjector(graphRegistry, injectionMetadata) {
|
|
19
19
|
if (injectionMetadata === void 0) { injectionMetadata = new InjectionMetadata_1.default(); }
|
|
@@ -32,8 +32,9 @@ var ClassInjector = /** @class */ (function () {
|
|
|
32
32
|
}
|
|
33
33
|
Handler.prototype.construct = function (target, args, newTarget) {
|
|
34
34
|
var graph = graphRegistry.resolve(Graph);
|
|
35
|
-
Reflect.defineMetadata(
|
|
35
|
+
Reflect.defineMetadata(LateInjector_1.GRAPH_INSTANCE_NAME_KEY, graph.name, target);
|
|
36
36
|
var argsToInject = this.injectConstructorArgs(args, graph, target);
|
|
37
|
+
graph.onBind(target);
|
|
37
38
|
var createdObject = Reflect.construct(target, argsToInject, newTarget);
|
|
38
39
|
this.injectProperties(target, createdObject, graph);
|
|
39
40
|
return createdObject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClassInjector.js","sourceRoot":"","sources":["../../../../src/injectors/class/ClassInjector.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAGA,0EAAoD;AACpD,+CAAyD;AAEzD;IACE,uBACU,aAA4B,EAC5B,iBAA8D;QAA9D,kCAAA,EAAA,wBAA2C,2BAAiB,EAAE;QAD9D,kBAAa,GAAb,aAAa,CAAe;QAC5B,sBAAiB,GAAjB,iBAAiB,CAA6C;IACrE,CAAC;IAEJ,8BAAM,GAAN,UAAO,KAA2B;QAAlC,iBAIC;QAHC,OAAO,UAAC,MAA0B;YAChC,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,KAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAI,CAAC,aAAa,EAAE,KAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACvG,CAAC,CAAC;IACJ,CAAC;IAEO,0CAAkB,GAA1B,UACE,KAA2B,EAC3B,aAA4B,EAC5B,iBAAoC;QAEpC,OAAO;YAAI;
|
|
1
|
+
{"version":3,"file":"ClassInjector.js","sourceRoot":"","sources":["../../../../src/injectors/class/ClassInjector.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAGA,0EAAoD;AACpD,+CAAyD;AAEzD;IACE,uBACU,aAA4B,EAC5B,iBAA8D;QAA9D,kCAAA,EAAA,wBAA2C,2BAAiB,EAAE;QAD9D,kBAAa,GAAb,aAAa,CAAe;QAC5B,sBAAiB,GAAjB,iBAAiB,CAA6C;IACrE,CAAC;IAEJ,8BAAM,GAAN,UAAO,KAA2B;QAAlC,iBAIC;QAHC,OAAO,UAAC,MAA0B;YAChC,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,KAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAI,CAAC,aAAa,EAAE,KAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACvG,CAAC,CAAC;IACJ,CAAC;IAEO,0CAAkB,GAA1B,UACE,KAA2B,EAC3B,aAA4B,EAC5B,iBAAoC;QAEpC,OAAO;YAAI;YAwBX,CAAC;YAvBC,2BAAS,GAAT,UAAU,MAAW,EAAE,IAAW,EAAE,SAAmB;gBACrD,IAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC3C,OAAO,CAAC,cAAc,CAAC,sCAAuB,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACpE,IAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBACrE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACrB,IAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;gBACzE,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;gBACpD,OAAO,aAAa,CAAC;YACvB,CAAC;YAEO,uCAAqB,GAA7B,UAA8B,IAAW,EAAE,KAAY,EAAE,MAAW;gBAClE,IAAM,YAAY,GAAG,iBAAiB,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;gBAC1E,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;oBAAE,OAAO,IAAI,CAAC;gBACzC,OAAO,gCAAI,IAAI,SAAK,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,QAAE,GAAG,CAAC,UAAC,KAAK,EAAE,GAAG;oBACzF,OAAO,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;gBAChE,CAAC,CAAC,CAAC;YACL,CAAC;YAEO,kCAAgB,GAAxB,UAAyB,MAAW,EAAE,aAAkB,EAAE,KAAY;gBACpE,iBAAiB,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;oBAC1D,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvD,CAAC,CAAC,CAAC;YACL,CAAC;YACH,cAAC;QAAD,CAAC,AAxBU,KAwBR,CAAC;IACN,CAAC;IACH,oBAAC;AAAD,CAAC,AA3CD,IA2CC"}
|
|
@@ -2,13 +2,13 @@ import { ConstructorArgs } from './ConstructorArgs';
|
|
|
2
2
|
export default class InjectionMetadata {
|
|
3
3
|
private readonly injectionMetadataKey;
|
|
4
4
|
private readonly injectedConstructorArgsKey;
|
|
5
|
-
private readonly
|
|
5
|
+
private readonly lateInjectionMetadataKey;
|
|
6
6
|
getConstructorArgsToInject(target: any): ConstructorArgs;
|
|
7
7
|
getPropertiesToInject(target: any): Set<string>;
|
|
8
|
-
|
|
8
|
+
getLatePropertiesToInject(target: any): Set<string>;
|
|
9
9
|
saveConstructorParamMetadata(target: any, paramName: string, index: number): void;
|
|
10
10
|
savePropertyMetadata(target: any, property: string): void;
|
|
11
|
-
|
|
11
|
+
saveLatePropertyMetadata(target: any, property: string): void;
|
|
12
12
|
private saveProperties;
|
|
13
13
|
private getProperties;
|
|
14
14
|
}
|
|
@@ -5,7 +5,7 @@ var InjectionMetadata = /** @class */ (function () {
|
|
|
5
5
|
function InjectionMetadata() {
|
|
6
6
|
this.injectionMetadataKey = 'injectionMetadata';
|
|
7
7
|
this.injectedConstructorArgsKey = 'injectedConstructorArgsKey';
|
|
8
|
-
this.
|
|
8
|
+
this.lateInjectionMetadataKey = 'lateInjectionMetadataKey';
|
|
9
9
|
}
|
|
10
10
|
InjectionMetadata.prototype.getConstructorArgsToInject = function (target) {
|
|
11
11
|
var _a;
|
|
@@ -14,8 +14,8 @@ var InjectionMetadata = /** @class */ (function () {
|
|
|
14
14
|
InjectionMetadata.prototype.getPropertiesToInject = function (target) {
|
|
15
15
|
return this.getProperties(this.injectionMetadataKey, target);
|
|
16
16
|
};
|
|
17
|
-
InjectionMetadata.prototype.
|
|
18
|
-
return this.getProperties(this.
|
|
17
|
+
InjectionMetadata.prototype.getLatePropertiesToInject = function (target) {
|
|
18
|
+
return this.getProperties(this.lateInjectionMetadataKey, target);
|
|
19
19
|
};
|
|
20
20
|
InjectionMetadata.prototype.saveConstructorParamMetadata = function (target, paramName, index) {
|
|
21
21
|
var argsToInject = this.getConstructorArgsToInject(target);
|
|
@@ -25,8 +25,8 @@ var InjectionMetadata = /** @class */ (function () {
|
|
|
25
25
|
InjectionMetadata.prototype.savePropertyMetadata = function (target, property) {
|
|
26
26
|
this.saveProperties(this.injectionMetadataKey, this.getPropertiesToInject(target).add(property), target);
|
|
27
27
|
};
|
|
28
|
-
InjectionMetadata.prototype.
|
|
29
|
-
this.saveProperties(this.
|
|
28
|
+
InjectionMetadata.prototype.saveLatePropertyMetadata = function (target, property) {
|
|
29
|
+
this.saveProperties(this.lateInjectionMetadataKey, this.getLatePropertiesToInject(target).add(property), target);
|
|
30
30
|
};
|
|
31
31
|
InjectionMetadata.prototype.saveProperties = function (key, properties, target) {
|
|
32
32
|
Reflect.defineMetadata(key, properties, target);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ObjectGraph } from '../../graph/ObjectGraph';
|
|
2
2
|
export declare const GRAPH_INSTANCE_NAME_KEY = "GRAPH_INSTANCE_NAME";
|
|
3
|
-
declare class
|
|
3
|
+
declare class LateInjector<T extends object> {
|
|
4
4
|
inject(target: T, sourceGraph?: ObjectGraph): T;
|
|
5
5
|
private getGraphInstance;
|
|
6
6
|
}
|
|
7
|
-
declare const _default:
|
|
7
|
+
declare const _default: LateInjector<object>;
|
|
8
8
|
export default _default;
|
|
9
|
-
//# sourceMappingURL=
|
|
9
|
+
//# sourceMappingURL=LateInjector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"LateInjector.d.ts","sourceRoot":"","sources":["../../../../src/injectors/class/LateInjector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAItD,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAE7D,cAAM,YAAY,CAAC,CAAC,SAAS,MAAM;IACjC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,CAAC;IAU/C,OAAO,CAAC,gBAAgB;CAIzB;;AAED,wBAAkC"}
|
|
@@ -7,24 +7,24 @@ exports.GRAPH_INSTANCE_NAME_KEY = void 0;
|
|
|
7
7
|
var GraphRegistry_1 = __importDefault(require("../../graph/registry/GraphRegistry"));
|
|
8
8
|
var InjectionMetadata_1 = __importDefault(require("./InjectionMetadata"));
|
|
9
9
|
exports.GRAPH_INSTANCE_NAME_KEY = 'GRAPH_INSTANCE_NAME';
|
|
10
|
-
var
|
|
11
|
-
function
|
|
10
|
+
var LateInjector = /** @class */ (function () {
|
|
11
|
+
function LateInjector() {
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
LateInjector.prototype.inject = function (target, sourceGraph) {
|
|
14
14
|
if (sourceGraph)
|
|
15
15
|
GraphRegistry_1.default.ensureRegistered(sourceGraph);
|
|
16
16
|
var injectionMetadata = new InjectionMetadata_1.default();
|
|
17
17
|
var graph = sourceGraph !== null && sourceGraph !== void 0 ? sourceGraph : this.getGraphInstance(target);
|
|
18
|
-
injectionMetadata.
|
|
18
|
+
injectionMetadata.getLatePropertiesToInject(target.constructor).forEach(function (key) {
|
|
19
19
|
Reflect.set(target, key, graph.retrieve(key));
|
|
20
20
|
});
|
|
21
21
|
return target;
|
|
22
22
|
};
|
|
23
|
-
|
|
23
|
+
LateInjector.prototype.getGraphInstance = function (target) {
|
|
24
24
|
var graphInstanceName = Reflect.getMetadata(exports.GRAPH_INSTANCE_NAME_KEY, target.constructor);
|
|
25
25
|
return GraphRegistry_1.default.getGraphInstance(graphInstanceName);
|
|
26
26
|
};
|
|
27
|
-
return
|
|
27
|
+
return LateInjector;
|
|
28
28
|
}());
|
|
29
|
-
exports.default = new
|
|
30
|
-
//# sourceMappingURL=
|
|
29
|
+
exports.default = new LateInjector();
|
|
30
|
+
//# sourceMappingURL=LateInjector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"LateInjector.js","sourceRoot":"","sources":["../../../../src/injectors/class/LateInjector.ts"],"names":[],"mappings":";;;;;;AACA,qFAA+D;AAC/D,0EAAoD;AAEvC,QAAA,uBAAuB,GAAG,qBAAqB,CAAC;AAE7D;IAAA;IAeA,CAAC;IAdC,6BAAM,GAAN,UAAO,MAAS,EAAE,WAAyB;QACzC,IAAI,WAAW;YAAE,uBAAa,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC7D,IAAM,iBAAiB,GAAG,IAAI,2BAAiB,EAAE,CAAC;QAClD,IAAM,KAAK,GAAG,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC3D,iBAAiB,CAAC,yBAAyB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,UAAC,GAAG;YAC1E,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,uCAAgB,GAAxB,UAAyB,MAAS;QAChC,IAAM,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,+BAAuB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3F,OAAO,uBAAa,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAC3D,CAAC;IACH,mBAAC;AAAD,CAAC,AAfD,IAeC;AAED,kBAAe,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -21,7 +21,7 @@ var ComponentInjector = /** @class */ (function () {
|
|
|
21
21
|
var Target = isMemoized ? InjectionCandidate.type : InjectionCandidate;
|
|
22
22
|
var compare = isMemoized ? InjectionCandidate.compare : undefined;
|
|
23
23
|
return (0, React_1.genericMemo)(function (passedProps) {
|
|
24
|
-
var graph = (0, useGraph_1.default)(Graph, passedProps);
|
|
24
|
+
var graph = (0, useGraph_1.default)(Graph, Target, passedProps);
|
|
25
25
|
var proxiedProps = new PropsInjector_1.default(graph).inject(passedProps);
|
|
26
26
|
return react_1.default.createElement(react_1.default.Fragment, null, Target(proxiedProps));
|
|
27
27
|
}, compare);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComponentInjector.js","sourceRoot":"","sources":["../../../../src/injectors/components/ComponentInjector.tsx"],"names":[],"mappings":";;;;;AAAA,gDAAiD;AACjD,oFAA2D;AAE3D,kEAA4C;AAC5C,wDAAkC;AAElC,2CAAqE;AAErE;IAAA;IAyBA,CAAC;IAxBC,kCAAM,GAAN,UACE,MAAkC,EAClC,KAAiC;QAEjC,IAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAClD,IAAA,iCAAoB,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,yCAAa,GAArB,UACE,kBAA8C,EAC9C,KAAiC;QAEjC,IAAM,UAAU,GAAG,IAAA,2BAAmB,EAAC,kBAAkB,CAAC,CAAC;QAC3D,IAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC;QACzE,IAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpE,OAAO,IAAA,mBAAW,EAAC,UAAC,WAAc;YAChC,IAAM,KAAK,GAAG,IAAA,kBAAQ,EAAI,KAAK,EAAE,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ComponentInjector.js","sourceRoot":"","sources":["../../../../src/injectors/components/ComponentInjector.tsx"],"names":[],"mappings":";;;;;AAAA,gDAAiD;AACjD,oFAA2D;AAE3D,kEAA4C;AAC5C,wDAAkC;AAElC,2CAAqE;AAErE;IAAA;IAyBA,CAAC;IAxBC,kCAAM,GAAN,UACE,MAAkC,EAClC,KAAiC;QAEjC,IAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAClD,IAAA,iCAAoB,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,yCAAa,GAArB,UACE,kBAA8C,EAC9C,KAAiC;QAEjC,IAAM,UAAU,GAAG,IAAA,2BAAmB,EAAC,kBAAkB,CAAC,CAAC;QAC3D,IAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC;QACzE,IAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAEpE,OAAO,IAAA,mBAAW,EAAC,UAAC,WAAc;YAChC,IAAM,KAAK,GAAG,IAAA,kBAAQ,EAAI,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YACtD,IAAM,YAAY,GAAG,IAAI,uBAAa,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAElE,OAAO,8DAAG,MAAM,CAAC,YAA+C,CAAC,CAAI,CAAC;QACxE,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC;IACH,wBAAC;AAAD,CAAC,AAzBD,IAyBC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Constructable } from '../../types';
|
|
2
2
|
import { ObjectGraph } from '../../graph/ObjectGraph';
|
|
3
|
-
declare const _default: <P>(Graph: Constructable<ObjectGraph>, props?: Partial<P> | undefined) => ObjectGraph<unknown>;
|
|
3
|
+
declare const _default: <P>(Graph: Constructable<ObjectGraph>, target: any, props?: Partial<P> | undefined) => ObjectGraph<unknown>;
|
|
4
4
|
export default _default;
|
|
5
5
|
//# sourceMappingURL=useGraph.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGraph.d.ts","sourceRoot":"","sources":["../../../../src/injectors/components/useGraph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;mCAI5B,cAAc,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"useGraph.d.ts","sourceRoot":"","sources":["../../../../src/injectors/components/useGraph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;mCAI5B,cAAc,WAAW,CAAC,UAAU,GAAG;AAAjE,wBAWE"}
|
|
@@ -6,8 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
var react_1 = require("react");
|
|
7
7
|
var GraphRegistry_1 = __importDefault(require("../../graph/registry/GraphRegistry"));
|
|
8
8
|
var ReferenceCounter_1 = __importDefault(require("../../ReferenceCounter"));
|
|
9
|
-
exports.default = (function (Graph, props) {
|
|
10
|
-
var graph = (0, react_1.useState)(
|
|
9
|
+
exports.default = (function (Graph, target, props) {
|
|
10
|
+
var graph = (0, react_1.useState)(function () {
|
|
11
|
+
var resolveGraph = GraphRegistry_1.default.resolve(Graph, props);
|
|
12
|
+
resolveGraph.onBind(target);
|
|
13
|
+
return resolveGraph;
|
|
14
|
+
})[0];
|
|
11
15
|
(0, react_1.useEffect)(function () {
|
|
12
16
|
ReferenceCounter_1.default.retain(graph);
|
|
13
17
|
return function () { return ReferenceCounter_1.default.release(graph, function (g) { return GraphRegistry_1.default.clear(g); }); };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGraph.js","sourceRoot":"","sources":["../../../../src/injectors/components/useGraph.ts"],"names":[],"mappings":";;;;;AAAA,+BAA4C;AAG5C,qFAA+D;AAC/D,4EAAsD;AAEtD,mBAAe,UAAI,KAAiC,EAAE,KAAkB;
|
|
1
|
+
{"version":3,"file":"useGraph.js","sourceRoot":"","sources":["../../../../src/injectors/components/useGraph.ts"],"names":[],"mappings":";;;;;AAAA,+BAA4C;AAG5C,qFAA+D;AAC/D,4EAAsD;AAEtD,mBAAe,UAAI,KAAiC,EAAE,MAAW,EAAE,KAAkB;IAC5E,IAAA,KAAK,GAAI,IAAA,gBAAQ,EAAC;QACvB,IAAM,YAAY,GAAG,uBAAa,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzD,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC,GAJU,CAIT;IACH,IAAA,iBAAS,EAAC;QACR,0BAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,cAAM,OAAA,0BAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,UAAC,CAAC,IAAK,OAAA,uBAAa,CAAC,KAAK,CAAC,CAAC,CAAC,EAAtB,CAAsB,CAAC,EAA9D,CAA8D,CAAC;IAC9E,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,OAAO,KAAK,CAAC;AACf,CAAC,EAAC"}
|
|
@@ -9,7 +9,7 @@ var HookInjector = /** @class */ (function () {
|
|
|
9
9
|
}
|
|
10
10
|
HookInjector.prototype.inject = function (hook, Graph) {
|
|
11
11
|
return function (args) {
|
|
12
|
-
var graph = (0, useGraph_1.default)(Graph, args);
|
|
12
|
+
var graph = (0, useGraph_1.default)(Graph, hook, args);
|
|
13
13
|
return hook(new Proxy(args !== null && args !== void 0 ? args : {}, new Injector(graph)));
|
|
14
14
|
};
|
|
15
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HookInjector.js","sourceRoot":"","sources":["../../../../src/injectors/hooks/HookInjector.ts"],"names":[],"mappings":";;;;;AAEA,oEAA8C;AAG9C;IAAA;IAUA,CAAC;IATC,6BAAM,GAAN,UACE,IAA4B,EAC5B,KAAiC;QAEjC,OAAO,UAAC,IAAoB;YAC1B,IAAM,KAAK,GAAG,IAAA,kBAAQ,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"HookInjector.js","sourceRoot":"","sources":["../../../../src/injectors/hooks/HookInjector.ts"],"names":[],"mappings":";;;;;AAEA,oEAA8C;AAG9C;IAAA;IAUA,CAAC;IATC,6BAAM,GAAN,UACE,IAA4B,EAC5B,KAAiC;QAEjC,OAAO,UAAC,IAAoB;YAC1B,IAAM,KAAK,GAAG,IAAA,kBAAQ,EAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,EAAE,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC;IACJ,CAAC;IACH,mBAAC;AAAD,CAAC,AAVD,IAUC;;AAED;IACE,kBAAoB,KAAY;QAAZ,UAAK,GAAL,KAAK,CAAO;IAAG,CAAC;IAEpC,sBAAG,GAAH,UAAI,GAAQ,EAAE,QAAgB,EAAE,QAAa;QAC3C,OAAO,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnF,CAAC;IACH,eAAC;AAAD,CAAC,AAND,IAMC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Observable.d.ts","sourceRoot":"","sources":["../../../src/observable/Observable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzE,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,YAAY,CAAgB;gBAExB,YAAY,CAAC,EAAE,CAAC;IAI5B,IAAW,KAAK,IAAI,CAAC,CAEpB;IAED,IAAW,KAAK,CAAC,KAAK,EAAE,CAAC,EAGxB;IAEM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW;
|
|
1
|
+
{"version":3,"file":"Observable.d.ts","sourceRoot":"","sources":["../../../src/observable/Observable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzE,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,YAAY,CAAgB;gBAExB,YAAY,CAAC,EAAE,CAAC;IAI5B,IAAW,KAAK,IAAI,CAAC,CAEpB;IAED,IAAW,KAAK,CAAC,KAAK,EAAE,CAAC,EAGxB;IAEM,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW;IAQzC,WAAW,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC,CAAC;CAMpC"}
|
|
@@ -25,6 +25,12 @@ var Observable = /** @class */ (function () {
|
|
|
25
25
|
this.subscribers.add(onNext);
|
|
26
26
|
return function () { return _this.subscribers.delete(onNext); };
|
|
27
27
|
};
|
|
28
|
+
Observable.prototype.unsubscribe = function (onNext) {
|
|
29
|
+
if (!this.subscribers.has(onNext)) {
|
|
30
|
+
throw new Error("Can't unsubscribe, subscriber doesn't exist");
|
|
31
|
+
}
|
|
32
|
+
this.subscribers.delete(onNext);
|
|
33
|
+
};
|
|
28
34
|
return Observable;
|
|
29
35
|
}());
|
|
30
36
|
exports.Observable = Observable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Observable.js","sourceRoot":"","sources":["../../../src/observable/Observable.ts"],"names":[],"mappings":";;;AAEA;IAIE,oBAAY,YAAgB;QAHpB,gBAAW,GAAmB,IAAI,GAAG,EAAE,CAAC;QAI9C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,sBAAW,6BAAK;aAAhB;YACE,OAAO,IAAI,CAAC,YAAiB,CAAC;QAChC,CAAC;aAED,UAAiB,KAAQ;YACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAC,UAAU,IAAK,OAAA,UAAU,CAAC,KAAK,CAAC,EAAjB,CAAiB,CAAC,CAAC;QAC9D,CAAC;;;OALA;IAOM,8BAAS,GAAhB,UAAiB,MAAiB;QAAlC,iBAMC;QALC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,cAAM,OAAA,KAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAA/B,CAA+B,CAAC;IAC/C,CAAC;IACH,iBAAC;AAAD,CAAC,
|
|
1
|
+
{"version":3,"file":"Observable.js","sourceRoot":"","sources":["../../../src/observable/Observable.ts"],"names":[],"mappings":";;;AAEA;IAIE,oBAAY,YAAgB;QAHpB,gBAAW,GAAmB,IAAI,GAAG,EAAE,CAAC;QAI9C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,sBAAW,6BAAK;aAAhB;YACE,OAAO,IAAI,CAAC,YAAiB,CAAC;QAChC,CAAC;aAED,UAAiB,KAAQ;YACvB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAC,UAAU,IAAK,OAAA,UAAU,CAAC,KAAK,CAAC,EAAjB,CAAiB,CAAC,CAAC;QAC9D,CAAC;;;OALA;IAOM,8BAAS,GAAhB,UAAiB,MAAiB;QAAlC,iBAMC;QALC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,cAAM,OAAA,KAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAA/B,CAA+B,CAAC;IAC/C,CAAC;IAEM,gCAAW,GAAlB,UAAmB,MAAgB;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;SAChE;QACD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IACH,iBAAC;AAAD,CAAC,AA/BD,IA+BC;AA/BY,gCAAU"}
|
|
@@ -8,7 +8,7 @@ export type Constructor = {
|
|
|
8
8
|
export type ServiceLocator<Clazz> = {
|
|
9
9
|
[Key in keyof Clazz]: () => Clazz[Key] extends (...args: any[]) => infer R ? R : never;
|
|
10
10
|
};
|
|
11
|
-
export type GraphInternals = 'retrieve' | 'name' | 'scope';
|
|
11
|
+
export type GraphInternals = 'retrieve' | 'name' | 'scope' | 'onBind';
|
|
12
12
|
export type DependenciesOf<G, Dependencies extends keyof DependenciesOf<G> = never> = Partial<Dependencies> extends never ? DependenciesOfInternal<G> : Pick<DependenciesOfInternal<G>, Dependencies>;
|
|
13
13
|
type DependenciesOfInternal<G> = G extends Graph ? DependenciesOf1<G> : G extends any[] ? DependenciesOfN<G> : never;
|
|
14
14
|
type DependenciesOfN<Graphs extends any[]> = Graphs extends [infer G, ...infer R] ? DependenciesOf1<G> & DependenciesOfN<R> : unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAC7B,KAAI,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,cAAc,CAAC,KAAK,IAAI;KACjC,GAAG,IAAI,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;CACvF,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAC7B,KAAI,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,cAAc,CAAC,KAAK,IAAI;KACjC,GAAG,IAAI,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;CACvF,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtE,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,YAAY,SAAS,MAAM,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,IAChF,OAAO,CAAC,YAAY,CAAC,SAAS,KAAK,GACjC,sBAAsB,CAAC,CAAC,CAAC,GACzB,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AAElD,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,GAC9C,eAAe,CAAC,CAAC,CAAC,GAClB,CAAC,SAAS,GAAG,EAAE,GACb,eAAe,CAAC,CAAC,CAAC,GAClB,KAAK,CAAC;AAEV,KAAK,eAAe,CAAC,MAAM,SAAS,GAAG,EAAE,IACvC,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,GAClC,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GACvC,OAAO,CAAC;AAEZ,KAAK,eAAe,CAAC,KAAK,IAAI;KAC3B,GAAG,IAAI,MAAM,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;CACvG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphWithOnBind.d.ts","sourceRoot":"","sources":["../../../test/fixtures/GraphWithOnBind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAY,MAAM,WAAW,CAAC;AAEzD,qBACa,eAAgB,SAAQ,WAAW;IAC9C,OAAO,CAAC,MAAM,CAAO;IAEZ,MAAM,CAAC,MAAM,EAAE,GAAG;IAK3B,UAAU,IAAI,MAAM;CAGrB"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
17
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
18
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
19
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
20
|
+
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;
|
|
21
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
22
|
+
};
|
|
23
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
24
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
25
|
+
};
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.GraphWithOnBind = void 0;
|
|
28
|
+
var src_1 = require("../../src");
|
|
29
|
+
var GraphWithOnBind = /** @class */ (function (_super) {
|
|
30
|
+
__extends(GraphWithOnBind, _super);
|
|
31
|
+
function GraphWithOnBind() {
|
|
32
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
|
33
|
+
}
|
|
34
|
+
GraphWithOnBind.prototype.onBind = function (target) {
|
|
35
|
+
this.target = target;
|
|
36
|
+
};
|
|
37
|
+
GraphWithOnBind.prototype.targetName = function () {
|
|
38
|
+
return this.target.name;
|
|
39
|
+
};
|
|
40
|
+
__decorate([
|
|
41
|
+
(0, src_1.Provides)(),
|
|
42
|
+
__metadata("design:type", Function),
|
|
43
|
+
__metadata("design:paramtypes", []),
|
|
44
|
+
__metadata("design:returntype", String)
|
|
45
|
+
], GraphWithOnBind.prototype, "targetName", null);
|
|
46
|
+
GraphWithOnBind = __decorate([
|
|
47
|
+
(0, src_1.Graph)()
|
|
48
|
+
], GraphWithOnBind);
|
|
49
|
+
return GraphWithOnBind;
|
|
50
|
+
}(src_1.ObjectGraph));
|
|
51
|
+
exports.GraphWithOnBind = GraphWithOnBind;
|
|
52
|
+
//# sourceMappingURL=GraphWithOnBind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphWithOnBind.js","sourceRoot":"","sources":["../../../test/fixtures/GraphWithOnBind.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAyD;AAGzD;IAAqC,mCAAW;IAAhD;;IAWA,CAAC;IARU,gCAAM,GAAf,UAAgB,MAAW;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAGD,oCAAU,GADV;QAEE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAHD;QAAC,IAAA,cAAQ,GAAE;;;;qDAGV;IAVU,eAAe;QAD3B,IAAA,WAAK,GAAE;OACK,eAAe,CAW3B;IAAD,sBAAC;CAAA,AAXD,CAAqC,iBAAW,GAW/C;AAXY,0CAAe"}
|
|
@@ -22,7 +22,7 @@ var internalVisitor = {
|
|
|
22
22
|
enter: function (_a) {
|
|
23
23
|
var node = _a.node;
|
|
24
24
|
unmagler_1.default.saveClassProperty('Inject', node);
|
|
25
|
-
unmagler_1.default.saveClassProperty('
|
|
25
|
+
unmagler_1.default.saveClassProperty('LateInject', node);
|
|
26
26
|
},
|
|
27
27
|
},
|
|
28
28
|
Identifier: {
|
|
@@ -21,16 +21,16 @@ export class MyClass {
|
|
|
21
21
|
Constructor injection is the preferred way to inject dependencies. It is more explicit and easier to test. **Field injection should only be used when a class is not instantiated by a graph.**
|
|
22
22
|
:::
|
|
23
23
|
|
|
24
|
-
##
|
|
25
|
-
Dependencies annotated with the `@Inject` annotation are resolved immediately **after** the constructor is called. If you want to inject a class at a later point in time, you can use the `@
|
|
24
|
+
## Delayed injection
|
|
25
|
+
Dependencies annotated with the `@Inject` annotation are resolved immediately **after** the constructor is called. If you want to inject a class at a later point in time, you can use the `@LateInject` annotation instead, and inject the dependencies by manually with the `Obsidian.inject()` function.
|
|
26
26
|
|
|
27
27
|
```ts
|
|
28
|
-
import {Injectable,
|
|
28
|
+
import {Injectable, LateInject} from 'react-obsidian';
|
|
29
29
|
import {ApplicationGraph} from './ApplicationGraph';
|
|
30
30
|
|
|
31
31
|
@Injectable(ApplicationGraph)
|
|
32
32
|
export class MyClass {
|
|
33
|
-
@
|
|
33
|
+
@LateInject() private httpClient!: HttpClient;
|
|
34
34
|
|
|
35
35
|
public init() {
|
|
36
36
|
console.log(this.httpClient === undefined); // true
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
sidebar_position: 5
|
|
3
|
+
title: "Reactivity"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Obsidian is first and foremost a dependency injection library. But it also includes reactive programming features that allow you to observe changes in your data and react to them. This is useful for things like updating the UI when a value changes.
|
|
7
|
+
|
|
8
|
+
## Observable
|
|
9
|
+
Making a class field reactive is as simple as wrapping it with the `Observable` decorator. Observable is a data holder classes that also allows you to subscribe to changes in the data.
|
|
10
|
+
|
|
11
|
+
### Create observables
|
|
12
|
+
In the example below, we declare a boolean observable called `isLoggedIn`. We can then subscribe to changes in the `isLoggedIn` value and update the UI accordingly.
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { Observable } from 'react-obsidian';
|
|
16
|
+
|
|
17
|
+
class UserService {
|
|
18
|
+
public isLoggedIn = new Observable(false); // The initial value is false
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default new UserService();
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Observe changes
|
|
25
|
+
#### Observe changes in hooks or components
|
|
26
|
+
Once you have declared an observable, you can subscribe to changes in the value by using the `useObserver` hook. This hook will return the current value of the observable and subscribe to changes in the value. When the value changes, the hook will re-render the component.
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
import { useObserver } from 'react-obsidian';
|
|
30
|
+
import userService from './UserService';
|
|
31
|
+
|
|
32
|
+
const useLogin = () => {
|
|
33
|
+
const [isLoggedIn] = useObserver(userService.isLoggedIn);
|
|
34
|
+
|
|
35
|
+
return {isLoggedIn};
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
#### Observe changes imperatively
|
|
40
|
+
You can also subscribe to changes in an observable imperatively by calling the `subscribe` method on the observable. This method returns a function that can be called to unsubscribe from the observable.
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import userService from './UserService';
|
|
44
|
+
|
|
45
|
+
const unsubscribe = userService.isLoggedIn.subscribe((isLoggedIn: boolean) => {
|
|
46
|
+
// Do something with the isLoggedIn value
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Update Observables
|
|
51
|
+
Observables expose the data they hold via a `value` property. You can update the value of an observable by setting the value of the `value` property.
|
|
52
|
+
This will also trigger any subscribers to the observable.
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
import userService from './UserService';
|
|
56
|
+
|
|
57
|
+
userService.isLoggedIn.value = true; // Update the value and notify all subscribers
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
#### Update Observables from hooks or components
|
|
61
|
+
The `useObserver` hook also returns a setter function that can be used to update the value of the observable.
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import { useObserver } from 'react-obsidian';
|
|
65
|
+
import userService from './UserService';
|
|
66
|
+
|
|
67
|
+
const useLogin = () => {
|
|
68
|
+
const [isLoggedIn, setIsLoggedIn] = useObserver(userService.isLoggedIn);
|
|
69
|
+
const onLogoutButtonPress = useCallback(() => {
|
|
70
|
+
setIsLoggedIn(false);
|
|
71
|
+
}, [setIsLoggedIn]);
|
|
72
|
+
|
|
73
|
+
return {isLoggedIn, onLogoutButtonPress};
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Merge multiple observable sources
|
|
78
|
+
`MediatorObservable` is a special type of observable that allows you to merge multiple observable sources into a single observable. This is useful for creating side effect from one or more observables.
|
|
79
|
+
|
|
80
|
+
In the example below, we create a `MediatorObservable` called `downloadStatus` that will be updated when either the `networkConditions` or `batteryLevel` observables are updated. We can then subscribe to changes in the `downloadStatus` observable to update the UI or perform other side effects.
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
import { MediatorObservable, Observable } from 'react-obsidian';
|
|
84
|
+
|
|
85
|
+
const networkConditions = new Observable<'poor' | 'strong'>();
|
|
86
|
+
const batteryLevel = new Observable<'low' | 'normal'>();
|
|
87
|
+
|
|
88
|
+
const downloadStatus = new MediatorObservable<'paused' | 'active'>('active')
|
|
89
|
+
.addSource(networkConditions, (condition: 'poor' | 'strong') => {
|
|
90
|
+
this.value = condition === 'poor' ? 'paused' : 'active';
|
|
91
|
+
})
|
|
92
|
+
.addSource(batteryLevel, (level: 'low' | 'normal') => {
|
|
93
|
+
this.value = level === 'low' ? 'paused' : 'active';
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
```
|
package/package.json
CHANGED
package/src/Obsidian.ts
CHANGED
|
@@ -2,7 +2,7 @@ import graphRegistry from './graph/registry/GraphRegistry';
|
|
|
2
2
|
import { ObjectGraph } from './graph/ObjectGraph';
|
|
3
3
|
import { Constructable, GraphInternals, ServiceLocator } from './types';
|
|
4
4
|
import { GraphMiddleware } from './graph/registry/GraphMiddleware';
|
|
5
|
-
import
|
|
5
|
+
import lateInjector from './injectors/class/LateInjector';
|
|
6
6
|
import serviceLocatorFactory from './graph/ServiceLocatorFactory';
|
|
7
7
|
|
|
8
8
|
export default class Obsidian {
|
|
@@ -14,7 +14,7 @@ export default class Obsidian {
|
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
inject<T extends object>(target: T, graph?: ObjectGraph) {
|
|
17
|
-
return
|
|
17
|
+
return lateInjector.inject(target, graph);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
addGraphMiddleware(middleware: GraphMiddleware) {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import InjectionMetadata from '../../injectors/class/InjectionMetadata';
|
|
2
2
|
|
|
3
|
-
export function
|
|
3
|
+
export function LateInject(name?: string): any {
|
|
4
4
|
return (target: object) => {
|
|
5
5
|
const metadata = new InjectionMetadata();
|
|
6
|
-
metadata.
|
|
6
|
+
metadata.saveLatePropertyMetadata(target.constructor, name!);
|
|
7
7
|
};
|
|
8
8
|
}
|
package/src/graph/Graph.ts
CHANGED
package/src/graph/ObjectGraph.ts
CHANGED
|
@@ -20,6 +20,10 @@ export abstract class ObjectGraph<T = unknown> implements Graph {
|
|
|
20
20
|
retrieve<Dependency>(property: string, receiver?: unknown): Dependency | undefined {
|
|
21
21
|
return this.propertyRetriever.retrieve(property, receiver) as Dependency | undefined;
|
|
22
22
|
}
|
|
23
|
+
|
|
24
|
+
onBind(_target: any) {
|
|
25
|
+
|
|
26
|
+
}
|
|
23
27
|
}
|
|
24
28
|
|
|
25
29
|
Reflect.set(ObjectGraph, 'typeDiscriminator', 'ObjectGraph');
|
package/src/index.ts
CHANGED
|
@@ -9,7 +9,7 @@ export { Graph as IGraph } from './graph/Graph';
|
|
|
9
9
|
export { Provides } from './decorators/provides/Provides';
|
|
10
10
|
export { Injectable } from './decorators/inject/Injectable';
|
|
11
11
|
export { Inject } from './decorators/inject/Inject';
|
|
12
|
-
export {
|
|
12
|
+
export { LateInject } from './decorators/inject/LateInject';
|
|
13
13
|
export { LifecycleBound } from './decorators/LifecycleBound';
|
|
14
14
|
export { GraphMiddleware } from './graph/registry/GraphMiddleware';
|
|
15
15
|
export { GraphResolveChain as ResolveChain } from './graph/registry/GraphResolveChain';
|
|
@@ -2,7 +2,7 @@ import { Constructable } from '../../types';
|
|
|
2
2
|
import { GraphRegistry } from '../../graph/registry/GraphRegistry';
|
|
3
3
|
import { Graph } from '../../graph/Graph';
|
|
4
4
|
import InjectionMetadata from './InjectionMetadata';
|
|
5
|
-
import { GRAPH_INSTANCE_NAME_KEY } from './
|
|
5
|
+
import { GRAPH_INSTANCE_NAME_KEY } from './LateInjector';
|
|
6
6
|
|
|
7
7
|
export default class ClassInjector {
|
|
8
8
|
constructor(
|
|
@@ -26,6 +26,7 @@ export default class ClassInjector {
|
|
|
26
26
|
const graph = graphRegistry.resolve(Graph);
|
|
27
27
|
Reflect.defineMetadata(GRAPH_INSTANCE_NAME_KEY, graph.name, target);
|
|
28
28
|
const argsToInject = this.injectConstructorArgs(args, graph, target);
|
|
29
|
+
graph.onBind(target);
|
|
29
30
|
const createdObject = Reflect.construct(target, argsToInject, newTarget);
|
|
30
31
|
this.injectProperties(target, createdObject, graph);
|
|
31
32
|
return createdObject;
|
|
@@ -3,7 +3,7 @@ import { ConstructorArgs } from './ConstructorArgs';
|
|
|
3
3
|
export default class InjectionMetadata {
|
|
4
4
|
private readonly injectionMetadataKey = 'injectionMetadata';
|
|
5
5
|
private readonly injectedConstructorArgsKey = 'injectedConstructorArgsKey';
|
|
6
|
-
private readonly
|
|
6
|
+
private readonly lateInjectionMetadataKey = 'lateInjectionMetadataKey';
|
|
7
7
|
|
|
8
8
|
getConstructorArgsToInject(target: any): ConstructorArgs {
|
|
9
9
|
return Reflect.getMetadata(this.injectedConstructorArgsKey, target) ?? new ConstructorArgs();
|
|
@@ -13,8 +13,8 @@ export default class InjectionMetadata {
|
|
|
13
13
|
return this.getProperties(this.injectionMetadataKey, target);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
return this.getProperties(this.
|
|
16
|
+
getLatePropertiesToInject(target: any): Set<string> {
|
|
17
|
+
return this.getProperties(this.lateInjectionMetadataKey, target);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
saveConstructorParamMetadata(target: any, paramName: string, index: number) {
|
|
@@ -35,10 +35,10 @@ export default class InjectionMetadata {
|
|
|
35
35
|
);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
saveLatePropertyMetadata(target: any, property: string) {
|
|
39
39
|
this.saveProperties(
|
|
40
|
-
this.
|
|
41
|
-
this.
|
|
40
|
+
this.lateInjectionMetadataKey,
|
|
41
|
+
this.getLatePropertiesToInject(target).add(property),
|
|
42
42
|
target,
|
|
43
43
|
);
|
|
44
44
|
}
|
|
@@ -4,12 +4,12 @@ import InjectionMetadata from './InjectionMetadata';
|
|
|
4
4
|
|
|
5
5
|
export const GRAPH_INSTANCE_NAME_KEY = 'GRAPH_INSTANCE_NAME';
|
|
6
6
|
|
|
7
|
-
class
|
|
7
|
+
class LateInjector<T extends object> {
|
|
8
8
|
inject(target: T, sourceGraph?: ObjectGraph): T {
|
|
9
9
|
if (sourceGraph) graphRegistry.ensureRegistered(sourceGraph);
|
|
10
10
|
const injectionMetadata = new InjectionMetadata();
|
|
11
11
|
const graph = sourceGraph ?? this.getGraphInstance(target);
|
|
12
|
-
injectionMetadata.
|
|
12
|
+
injectionMetadata.getLatePropertiesToInject(target.constructor).forEach((key) => {
|
|
13
13
|
Reflect.set(target, key, graph.retrieve(key));
|
|
14
14
|
});
|
|
15
15
|
return target;
|
|
@@ -21,4 +21,4 @@ class LazyInjector<T extends object> {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
export default new
|
|
24
|
+
export default new LateInjector();
|
|
@@ -25,7 +25,7 @@ export default class ComponentInjector {
|
|
|
25
25
|
const compare = isMemoized ? InjectionCandidate.compare : undefined;
|
|
26
26
|
|
|
27
27
|
return genericMemo((passedProps: P) => {
|
|
28
|
-
const graph = useGraph<P>(Graph, passedProps);
|
|
28
|
+
const graph = useGraph<P>(Graph, Target, passedProps);
|
|
29
29
|
const proxiedProps = new PropsInjector(graph).inject(passedProps);
|
|
30
30
|
|
|
31
31
|
return <>{Target(proxiedProps as unknown as PropsWithChildren<P>)}</>;
|
|
@@ -4,8 +4,12 @@ import { ObjectGraph } from '../../graph/ObjectGraph';
|
|
|
4
4
|
import graphRegistry from '../../graph/registry/GraphRegistry';
|
|
5
5
|
import referenceCounter from '../../ReferenceCounter';
|
|
6
6
|
|
|
7
|
-
export default <P>(Graph: Constructable<ObjectGraph>, props?: Partial<P>) => {
|
|
8
|
-
const [graph] = useState(
|
|
7
|
+
export default <P>(Graph: Constructable<ObjectGraph>, target: any, props?: Partial<P>) => {
|
|
8
|
+
const [graph] = useState(() => {
|
|
9
|
+
const resolveGraph = graphRegistry.resolve(Graph, props);
|
|
10
|
+
resolveGraph.onBind(target);
|
|
11
|
+
return resolveGraph;
|
|
12
|
+
});
|
|
9
13
|
useEffect(() => {
|
|
10
14
|
referenceCounter.retain(graph);
|
|
11
15
|
return () => referenceCounter.release(graph, (g) => graphRegistry.clear(g));
|
|
@@ -9,7 +9,7 @@ export default class HookInjector {
|
|
|
9
9
|
Graph: Constructable<ObjectGraph>,
|
|
10
10
|
): (args?: Partial<Args>) => Result {
|
|
11
11
|
return (args?: Partial<Args>): Result => {
|
|
12
|
-
const graph = useGraph(Graph, args);
|
|
12
|
+
const graph = useGraph(Graph, hook, args);
|
|
13
13
|
return hook(new Proxy(args ?? {}, new Injector(graph)));
|
|
14
14
|
};
|
|
15
15
|
}
|
|
@@ -24,4 +24,11 @@ export class Observable<T> implements IObservable<T> {
|
|
|
24
24
|
this.subscribers.add(onNext);
|
|
25
25
|
return () => this.subscribers.delete(onNext);
|
|
26
26
|
}
|
|
27
|
+
|
|
28
|
+
public unsubscribe(onNext:OnNext<T>) {
|
|
29
|
+
if (!this.subscribers.has(onNext)) {
|
|
30
|
+
throw new Error(`Can't unsubscribe, subscriber doesn't exist`);
|
|
31
|
+
}
|
|
32
|
+
this.subscribers.delete(onNext);
|
|
33
|
+
}
|
|
27
34
|
}
|
package/src/types/index.ts
CHANGED
|
@@ -10,7 +10,7 @@ export type ServiceLocator<Clazz> = {
|
|
|
10
10
|
[Key in keyof Clazz]: () => Clazz[Key] extends (...args: any[]) => infer R ? R : never;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
export type GraphInternals = 'retrieve' | 'name' | 'scope';
|
|
13
|
+
export type GraphInternals = 'retrieve' | 'name' | 'scope' | 'onBind';
|
|
14
14
|
|
|
15
15
|
export type DependenciesOf<G, Dependencies extends keyof DependenciesOf<G> = never> =
|
|
16
16
|
Partial<Dependencies> extends never ?
|
|
@@ -26,7 +26,7 @@ const internalVisitor = {
|
|
|
26
26
|
ClassProperty: {
|
|
27
27
|
enter({ node }: NodePath<ClassProperty>) {
|
|
28
28
|
unmagler.saveClassProperty('Inject', node);
|
|
29
|
-
unmagler.saveClassProperty('
|
|
29
|
+
unmagler.saveClassProperty('LateInject', node);
|
|
30
30
|
},
|
|
31
31
|
},
|
|
32
32
|
Identifier: {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LazyInject.d.ts","sourceRoot":"","sources":["../../../../src/decorators/inject/LazyInject.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,CAK7C"}
|