UNPKG

react-obsidian

Version:

Dependency injection framework for React and React Native applications

50 lines 2.63 kB
"use strict"; 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