react-obsidian
Version:
Dependency injection framework for React and React Native applications
50 lines • 2.72 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const GraphRegistry_1 = __importDefault(require("./registry/GraphRegistry"));
const ProvidedPropertiesStore_1 = __importDefault(require("../ProvidedPropertiesStore"));
const CircularDependenciesDetector_1 = require("./CircularDependenciesDetector");
class PropertyRetriever {
constructor(graph) {
this.graph = graph;
}
retrieve(property, receiver, maybeDetector) {
const mangledPropertyKey = ProvidedPropertiesStore_1.default.getMangledProperty(this.graph, property);
const circularDependenciesDetector = maybeDetector !== null && maybeDetector !== void 0 ? maybeDetector : new CircularDependenciesDetector_1.CircularDependenciesDetector(this.graph.name);
if (mangledPropertyKey
&& mangledPropertyKey in this.graph
&& circularDependenciesDetector.visit(this.graph.name, property)) {
const proxiedGraph = new Proxy(this.graph, {
get(graph, dependencyName) {
return graph.retrieve(dependencyName, receiver, circularDependenciesDetector);
},
});
const resolved = Reflect.get(this.graph, mangledPropertyKey, receiver)(proxiedGraph);
circularDependenciesDetector.clear();
return resolved;
}
if (circularDependenciesDetector.hasCircularDependencies()) {
throw new Error(`Could not resolve ${circularDependenciesDetector.firstDependencyName}`
+ ` from ${circularDependenciesDetector.graphName} because of a circular dependency:`
+ ` ${circularDependenciesDetector.getDependencies().join(' -> ')}`);
}
const results = this.getFromSubgraphs(property, circularDependenciesDetector, receiver);
if (results.length === 1)
return results[0];
if (results.length > 1) {
throw new Error(`Multiple subgraphs provide the property ${property}.`
+ 'You should probably provide a unique name to one of the providers: @Provide({name: \'uniqueName\')})');
}
return undefined;
}
getFromSubgraphs(property, circularDependenciesDetector, receiver) {
const subgraphs = GraphRegistry_1.default.getSubgraphs(this.graph);
return subgraphs
.map((subgraph) => subgraph.retrieve(property, receiver, circularDependenciesDetector))
.filter((result) => result !== undefined);
}
}
exports.default = PropertyRetriever;
//# sourceMappingURL=PropertyRetriever.js.map
;