react-obsidian
Version:
Dependency injection framework for React and React Native applications
46 lines • 2.44 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");
const reflect_1 = require("../utils/reflect");
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_1.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(' -> ')}`);
}
return this.getFromSubgraphs(property, circularDependenciesDetector, receiver);
}
getFromSubgraphs(property, circularDependenciesDetector, receiver) {
for (const subgraph of GraphRegistry_1.default.getSubgraphs(this.graph)) {
const result = subgraph.retrieve(property, receiver, circularDependenciesDetector);
if (result)
return result;
}
return undefined;
}
}
exports.default = PropertyRetriever;
//# sourceMappingURL=PropertyRetriever.js.map