react-obsidian
Version:
Dependency injection framework for React and React Native applications
50 lines • 2.63 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const InjectionMetadata_1 = __importDefault(require("./InjectionMetadata"));
const LateInjector_1 = require("./LateInjector");
const ReferenceCounter_1 = __importDefault(require("../../ReferenceCounter"));
const reflect_1 = require("../../utils/reflect");
class ClassInjector {
constructor(graphRegistry, injectionMetadata = new InjectionMetadata_1.default()) {
this.graphRegistry = graphRegistry;
this.injectionMetadata = injectionMetadata;
}
inject(keyOrGraph) {
return (Target) => {
return new Proxy(Target, this.createProxyHandler(keyOrGraph, this.graphRegistry, this.injectionMetadata));
};
}
createProxyHandler(keyOrGraph, graphRegistry, injectionMetadata) {
return new class Handler {
construct(target, args, newTarget) {
var _a;
const isReactClassComponent = (_a = target.prototype) === null || _a === void 0 ? void 0 : _a.isReactComponent;
const source = isReactClassComponent ? 'lifecycleOwner' : 'classInjection';
const graph = graphRegistry.resolve(keyOrGraph, source, args.length > 0 ? args[0] : undefined);
if (isReactClassComponent) {
ReferenceCounter_1.default.retain(graph);
}
reflect_1.Reflect.defineMetadata(LateInjector_1.GRAPH_INSTANCE_NAME_KEY, graph.name, target);
graph.onBind(target);
const createdObject = reflect_1.Reflect.construct(target, args, newTarget);
this.injectProperties(target, createdObject, graph);
const originalComponentWillUnmount = createdObject.componentWillUnmount;
createdObject.componentWillUnmount = () => {
originalComponentWillUnmount === null || originalComponentWillUnmount === void 0 ? void 0 : originalComponentWillUnmount();
ReferenceCounter_1.default.release(graph, (g) => graphRegistry.clear(g));
};
return createdObject;
}
injectProperties(target, createdObject, graph) {
injectionMetadata.getPropertiesToInject(target).forEach((key) => {
reflect_1.Reflect.set(createdObject, key, graph.retrieve(key));
});
}
}();
}
}
exports.default = ClassInjector;
//# sourceMappingURL=ClassInjector.js.map