@portento/core 0.2.0
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/LICENSE +21 -0
- package/README.md +475 -0
- package/dist/index.d.mts +93 -0
- package/dist/index.d.ts +93 -0
- package/dist/index.js +774 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +732 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/DependencyManagement.ts","../src/decorators/Component.ts","../src/decorators/Injectable.ts","../src/decorators/Router.ts","../src/index.ts"],"sourcesContent":["import type {DependencyContainer} from 'tsyringe';\nimport {container as tsyringe, Lifecycle} from 'tsyringe';\nimport {configure} from 'mobx';\nimport type {Ctor} from './types';\n\n/**\n * Singleton class to manage dependency injection with single container and Symbol-based scoping.\n * Supports root, router, and component-level scopes with automatic fallback resolution.\n * Can be injected into components/services for dependency resolution.\n */\nexport class DependencyManagement {\n private static instance: DependencyManagement | undefined;\n\n // Single global container for all registrations\n private container: DependencyContainer = tsyringe.createChildContainer();\n\n // Scope tracking maps: className -> Symbol token\n private rootScope: Map<string, symbol> = new Map<string, symbol>();\n\n // Router scopes: routerSelector -> (className -> Symbol token)\n private routerScopes: Map<string, Map<string, symbol>> = new Map<\n string,\n Map<string, symbol>\n >();\n\n // Component scopes: componentSelector -> (className -> Symbol token)\n private componentScopes: Map<string, Map<string, symbol>> = new Map<\n string,\n Map<string, symbol>\n >();\n\n // Current component/router selector context (for constructor injection)\n private currentSelector: string | undefined;\n private currentRouterSelector: string | undefined;\n\n // Component-to-Router membership tracking\n private componentToRouter: Map<string, string> = new Map<string, string>();\n\n // Store class references for re-registration after reset\n private rootClasses: Map<string, Ctor<unknown>> = new Map<\n string,\n Ctor<unknown>\n >();\n private routerClasses: Map<string, Map<string, Ctor<unknown>>> = new Map<\n string,\n Map<string, Ctor<unknown>>\n >();\n private componentClasses: Map<string, Map<string, Ctor<unknown>>> = new Map<\n string,\n Map<string, Ctor<unknown>>\n >();\n\n private constructor() {\n configure({useProxies: 'always'});\n // Register DependencyManagement using a value provider to work around private constructor\n // This allows constructor injection: constructor(private dm: DependencyManagement)\n this.container.register('DependencyManagement' as never, {\n useValue: this,\n });\n }\n\n public static getInstance(): DependencyManagement {\n if (!DependencyManagement.instance) {\n DependencyManagement.instance = new DependencyManagement();\n }\n return DependencyManagement.instance;\n }\n\n /**\n * Set the current resolution context (used during component instantiation)\n */\n public setContext(\n selector: string | undefined,\n routerSelector: string | undefined,\n ): void {\n this.currentSelector = selector;\n this.currentRouterSelector = routerSelector;\n }\n\n /**\n * Clear the current resolution context\n */\n public clearContext(): void {\n this.currentSelector = undefined;\n this.currentRouterSelector = undefined;\n }\n\n /**\n * Get current component selector context\n */\n public getCurrentSelector(): string | undefined {\n return this.currentSelector;\n }\n\n /**\n * Get current router selector context\n */\n public getCurrentRouterSelector(): string | undefined {\n return this.currentRouterSelector;\n }\n\n /**\n * Generate a unique Symbol token for a class in a specific scope\n */\n private getToken(className: string, scope: string): symbol {\n return Symbol.for(`${scope}:${className}`);\n }\n\n /**\n * Setup and register a provider in the root scope\n */\n public setupRootContainer(Entity: Function): void {\n const className: string = Entity.name;\n\n if (!this.rootScope.has(className)) {\n const scopedToken: symbol = this.getToken(className, 'root');\n this.rootScope.set(className, scopedToken);\n this.rootClasses.set(className, Entity as Ctor<unknown>);\n\n if (!this.container.isRegistered(scopedToken)) {\n this.container.register(\n scopedToken,\n {useClass: Entity as Ctor<unknown>},\n {lifecycle: Lifecycle.Singleton},\n );\n }\n }\n }\n\n /**\n * Get the root container (for backward compatibility)\n */\n public getRootContainer(): DependencyContainer {\n return this.container;\n }\n\n /**\n * Legacy property accessor for backward compatibility\n */\n public get root(): DependencyContainer {\n return this.container;\n }\n\n /**\n * Setup and register providers in a component scope\n */\n public setupComponentContainer(\n selector: string,\n Providers: ReadonlyArray<Function> = [],\n ): void {\n if (!this.componentScopes.has(selector)) {\n this.componentScopes.set(selector, new Map());\n this.componentClasses.set(selector, new Map());\n }\n\n const scopeMap: Map<string, symbol> | undefined =\n this.componentScopes.get(selector);\n const classMap: Map<string, Ctor<unknown>> | undefined =\n this.componentClasses.get(selector);\n if (!scopeMap || !classMap) {\n throw new Error(\n `Failed to create component scope for selector: ${selector}`,\n );\n }\n\n // Register all providers in the component scope\n for (const Provider of Providers) {\n const className: string = Provider.name;\n\n if (!scopeMap.has(className)) {\n const scopedToken: symbol = this.getToken(\n className,\n `component:${selector}`,\n );\n scopeMap.set(className, scopedToken);\n classMap.set(className, Provider as Ctor<unknown>);\n\n if (!this.container.isRegistered(scopedToken)) {\n this.container.register(\n scopedToken,\n {useClass: Provider as Ctor<unknown>},\n {lifecycle: Lifecycle.Singleton},\n );\n }\n }\n }\n }\n\n /**\n * Get a component-level container by selector (backward compatibility)\n */\n public getComponentContainer(\n selector: string,\n ): DependencyContainer | undefined {\n if (!this.componentScopes.has(selector)) {\n return undefined;\n }\n return this.container;\n }\n\n /**\n * Legacy property accessor for backward compatibility\n */\n public get component(): Map<string, DependencyContainer> {\n const legacyMap: Map<string, DependencyContainer> = new Map<\n string,\n DependencyContainer\n >();\n for (const selector of this.componentScopes.keys()) {\n legacyMap.set(selector, this.container);\n }\n return legacyMap;\n }\n\n /**\n * Setup and register providers in a router scope, tracking component membership\n */\n public setupRouterContainer(\n Components: ReadonlyArray<Function> | ReadonlyArray<string>,\n Providers: ReadonlyArray<Function>,\n selector: string,\n ): void {\n if (!this.routerScopes.has(selector)) {\n this.routerScopes.set(selector, new Map());\n this.routerClasses.set(selector, new Map());\n }\n\n const scopeMap: Map<string, symbol> | undefined =\n this.routerScopes.get(selector);\n const classMap: Map<string, Ctor<unknown>> | undefined =\n this.routerClasses.get(selector);\n if (!scopeMap || !classMap) {\n throw new Error(\n `Failed to create router scope for selector: ${selector}`,\n );\n }\n\n // Track component membership (accept both class names and class constructors)\n for (const Component of Components) {\n const componentName: string =\n typeof Component === 'string' ? Component : Component.name;\n this.componentToRouter.set(componentName, selector);\n }\n\n // Register all providers in the router scope\n for (const Provider of Providers) {\n const className: string = Provider.name;\n\n if (!scopeMap.has(className)) {\n const scopedToken: symbol = this.getToken(\n className,\n `router:${selector}`,\n );\n scopeMap.set(className, scopedToken);\n classMap.set(className, Provider as Ctor<unknown>);\n\n if (!this.container.isRegistered(scopedToken)) {\n this.container.register(\n scopedToken,\n {useClass: Provider as Ctor<unknown>},\n {lifecycle: Lifecycle.Singleton},\n );\n }\n }\n }\n }\n\n /**\n * Get the router selector for a component (if registered in a router)\n */\n public getRouterForComponent(componentName: string): string | undefined {\n return this.componentToRouter.get(componentName);\n }\n\n /**\n * Fetch a provider from the router container associated with an entity (backward compatibility)\n */\n public fetchFromRouterContainer(\n Entity: Function,\n ): DependencyContainer | undefined {\n const routerSelector: string | undefined = this.getRouterForComponent(\n Entity.name,\n );\n if (routerSelector && this.routerScopes.has(routerSelector)) {\n return this.container;\n }\n return undefined;\n }\n\n /**\n * Get a router-level container by selector (backward compatibility)\n */\n public getRouterContainer(selector: string): DependencyContainer | undefined {\n if (!this.routerScopes.has(selector)) {\n return undefined;\n }\n return this.container;\n }\n\n /**\n * Legacy property accessor for backward compatibility\n */\n public get router(): Map<string, DependencyContainer> {\n const legacyMap: Map<string, DependencyContainer> = new Map<\n string,\n DependencyContainer\n >();\n for (const selector of this.routerScopes.keys()) {\n legacyMap.set(selector, this.container);\n }\n return legacyMap;\n }\n\n /**\n * Check if a class is a MobX store by looking for MobX symbols\n */\n public isMobxStore(instance: unknown): boolean {\n const mobxSymbol: string = 'mobx-stored-annotations';\n const symbols: Array<symbol> = Object.getOwnPropertySymbols(instance);\n return symbols.some((s: symbol) => s.description === mobxSymbol);\n }\n\n /**\n * Resolve a dependency with strict scope isolation:\n * 1. Component scope (if component explicitly registered the provider)\n * 2. Router scope (ONLY if component is part of that router's components array)\n * 3. Root scope (for @Injectable({ providedIn: 'root' }) services)\n *\n * Scope override behavior:\n * - If a root service is re-registered at router/component level, that scope gets a NEW instance\n * - Router-scoped services are ONLY accessible to components within that router\n * - Parent components cannot access child router services\n *\n * Returns undefined if no provider is found in accessible scopes\n */\n public resolve<T>(\n className: string,\n componentSelector?: string,\n routerSelector?: string,\n componentClassName?: string,\n ): T | undefined {\n // Special case: DependencyManagement is always available via factory token\n if (className === 'DependencyManagement') {\n return this.container.resolve<T>('DependencyManagement' as never);\n }\n\n // 1. Try component scope first (highest priority - creates isolated instance)\n if (componentSelector) {\n const componentScope: Map<string, symbol> | undefined =\n this.componentScopes.get(componentSelector);\n const componentToken: symbol | undefined = componentScope?.get(className);\n\n if (componentToken && this.container.isRegistered(componentToken)) {\n return this.container.resolve<T>(componentToken);\n }\n }\n\n // 2. Try router scope - check own router first, then parent router\n // For routers: routerSelector = own scope, componentClassName can find parent router\n // For components: componentClassName finds their router scope\n\n // Try own router scope first (if routerSelector provided)\n if (routerSelector) {\n const routerScope: Map<string, symbol> | undefined =\n this.routerScopes.get(routerSelector);\n const routerToken: symbol | undefined = routerScope?.get(className);\n\n if (routerToken && this.container.isRegistered(routerToken)) {\n return this.container.resolve<T>(routerToken);\n }\n }\n\n // Try parent router scope (if this entity is registered as a component of another router)\n const parentRouterSelector: string | undefined = componentClassName\n ? this.getRouterForComponent(componentClassName)\n : undefined;\n\n if (parentRouterSelector && parentRouterSelector !== routerSelector) {\n const parentRouterScope: Map<string, symbol> | undefined =\n this.routerScopes.get(parentRouterSelector);\n const parentRouterToken: symbol | undefined =\n parentRouterScope?.get(className);\n\n if (parentRouterToken && this.container.isRegistered(parentRouterToken)) {\n return this.container.resolve<T>(parentRouterToken);\n }\n }\n\n // 3. Fall back to root scope (global services with @Injectable({ providedIn: 'root' }))\n // This is ONLY accessible if the service wasn't found in component or router scope\n const rootToken: symbol | undefined = this.rootScope.get(className);\n if (rootToken && this.container.isRegistered(rootToken)) {\n return this.container.resolve<T>(rootToken);\n }\n\n // Return undefined if no provider found in any accessible scope\n return undefined;\n }\n\n /**\n * Convenience method for resolving dependencies using current context.\n * Use this in component constructors when DependencyManagement is injected.\n *\n * @example\n * constructor(private dm: DependencyManagement) {\n * this.myService = dm.get<MyService>('MyService');\n * }\n */\n public get<T>(className: string): T | undefined {\n return this.resolve<T>(\n className,\n this.currentSelector,\n this.currentRouterSelector,\n );\n }\n\n /**\n * Resolve a dependency from component, router, or root scope (backward compatibility)\n */\n public resolveFromScopes(\n EntityName: string,\n componentContainer?: DependencyContainer,\n routerContainer?: DependencyContainer,\n ): unknown {\n // Extract selectors from containers (legacy support)\n let componentSelector: string | undefined;\n let routerSelector: string | undefined;\n\n if (componentContainer) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [selector, _scopeMap] of this.componentScopes.entries()) {\n componentSelector = selector;\n break; // Use first match for backward compatibility\n }\n }\n\n if (routerContainer) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [selector, _scopeMap] of this.routerScopes.entries()) {\n routerSelector = selector;\n break; // Use first match for backward compatibility\n }\n }\n\n return this.resolve(EntityName, componentSelector, routerSelector);\n }\n\n /**\n * Re-register all providers (helper for reset operations)\n */\n private reregisterAll(): void {\n // Re-register root scope\n for (const [className, token] of this.rootScope.entries()) {\n const Provider: Ctor<unknown> | undefined =\n this.rootClasses.get(className);\n if (Provider) {\n this.container.register(\n token,\n {useClass: Provider},\n {lifecycle: Lifecycle.Singleton},\n );\n }\n }\n\n // Re-register all router scopes\n for (const [selector, routerScope] of this.routerScopes.entries()) {\n const routerClassMap: Map<string, Ctor<unknown>> | undefined =\n this.routerClasses.get(selector);\n if (routerClassMap) {\n for (const [className, token] of routerScope.entries()) {\n const Provider: Ctor<unknown> | undefined =\n routerClassMap.get(className);\n if (Provider) {\n this.container.register(\n token,\n {useClass: Provider},\n {lifecycle: Lifecycle.Singleton},\n );\n }\n }\n }\n }\n\n // Re-register all component scopes\n for (const [selector, componentScope] of this.componentScopes.entries()) {\n const componentClassMap: Map<string, Ctor<unknown>> | undefined =\n this.componentClasses.get(selector);\n if (componentClassMap) {\n for (const [className, token] of componentScope.entries()) {\n const Provider: Ctor<unknown> | undefined =\n componentClassMap.get(className);\n if (Provider) {\n this.container.register(\n token,\n {useClass: Provider},\n {lifecycle: Lifecycle.Singleton},\n );\n }\n }\n }\n }\n }\n\n /**\n * Reset all instances in a specific scope\n * Creates fresh container and re-registers all providers\n * Note: Due to tsyringe limitations, this resets ALL scopes but is still useful for cleanup\n */\n public resetScope(\n _scope: 'root' | 'router' | 'component',\n _selector?: string,\n ): void {\n // Reset entire container and re-register everything\n this.container.reset();\n this.container = tsyringe.createChildContainer();\n this.reregisterAll();\n }\n\n /**\n * Reset a specific class across all scopes\n * Creates fresh container and re-registers all providers\n * Note: Due to tsyringe limitations, this resets ALL instances\n */\n public resetClass(_className: string): void {\n // Reset entire container and re-register everything\n this.container.reset();\n this.container = tsyringe.createChildContainer();\n this.reregisterAll();\n }\n\n /**\n * Reset all instances in all scopes\n * This clears all cached singletons but keeps registrations\n */\n public resetAll(): void {\n this.container.clearInstances();\n }\n}\n","import React from 'react';\nimport {observer} from 'mobx-react';\nimport {injectable} from 'tsyringe';\nimport type {DependencyContainer} from 'tsyringe';\nimport {DependencyManagement} from '../DependencyManagement';\nimport type {\n ComponentParams,\n Ctor,\n IoComponent,\n Controller,\n ComponentWrapperProps,\n ComponentWrapperState,\n} from '../types';\n\n// Store React.FC components by class name\nconst componentRegistry: Map<string, React.FC> = new Map<string, React.FC>();\n// Store reverse mapping: React.FC -> class name\nconst componentReverseRegistry: Map<React.FC, string> = new Map<\n React.FC,\n string\n>();\n\ntype ComponentDecoratorFunction = {\n <T extends Ctor<IoComponent>>(Entity: T): T;\n $provider: <T extends Ctor<IoComponent>>(Entity: T) => React.FC;\n};\n\nexport function Component(params: ComponentParams): ComponentDecoratorFunction {\n const decorator: ComponentDecoratorFunction = function <\n T extends Ctor<IoComponent>,\n >(Entity: T): T {\n // Apply @injectable to Entity\n injectable()(Entity);\n\n // Create wrapper component\n class ComponentWrapper extends React.Component<\n ComponentWrapperProps,\n ComponentWrapperState\n > {\n private entityInstance: IoComponent | null = null;\n private dependencyManagement: DependencyManagement;\n\n public constructor(props: ComponentWrapperProps) {\n super(props);\n const initialState: ComponentWrapperState = {};\n this.state = initialState;\n\n this.dependencyManagement = DependencyManagement.getInstance();\n\n // Setup component container and register the Entity class itself\n this.dependencyManagement.setupComponentContainer(params.selector, [\n ...(params.providers || []),\n Entity,\n ]);\n\n // Get component container for Controller registration\n const componentContainer: DependencyContainer | undefined =\n this.dependencyManagement.getComponentContainer(params.selector);\n\n // Auto-discover router membership\n const routerSelector: string | undefined =\n this.dependencyManagement.getRouterForComponent(Entity.name);\n\n // Register Controller before instantiating Entity\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self: ComponentWrapper = this;\n const controller: Controller<\n ComponentWrapperProps,\n ComponentWrapperState\n > = {\n props: props,\n get state(): ComponentWrapperState {\n return self.state;\n },\n setState: <S = ComponentWrapperState>(\n state: S | ((prevState: S) => S),\n ): void => {\n if (typeof state === 'function') {\n this.setState((prevState: ComponentWrapperState) => {\n const newState: ComponentWrapperState = (\n state as (prevState: S) => S\n )(prevState as S) as ComponentWrapperState;\n\n return newState;\n });\n } else {\n this.setState((prevState: ComponentWrapperState) => {\n const newState: ComponentWrapperState = {\n ...prevState,\n ...(state as ComponentWrapperState),\n };\n\n return newState;\n });\n }\n },\n forceUpdate: this.forceUpdate.bind(this),\n };\n\n componentContainer?.register('Controller', {useValue: controller});\n\n // Get constructor parameter types using reflect-metadata\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const paramTypes: Array<Function> | undefined = Reflect.getMetadata(\n 'design:paramtypes',\n Entity,\n );\n\n // Resolve constructor dependencies automatically\n const constructorArgs: Array<unknown> = [];\n if (paramTypes && paramTypes.length > 0) {\n for (const ParamType of paramTypes) {\n let dependency: unknown = this.dependencyManagement.resolve(\n ParamType.name,\n params.selector,\n routerSelector,\n Entity.name,\n );\n\n // Fallback: If dependency is undefined and ParamType is Object,\n // try resolving 'Controller' (TypeScript type erasure for Controller<T>)\n if (dependency === undefined && ParamType.name === 'Object') {\n dependency = componentContainer?.resolve('Controller');\n }\n\n constructorArgs.push(dependency);\n }\n }\n\n // Instantiate Entity with resolved dependencies\n this.entityInstance =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n (new Entity(...constructorArgs) as IoComponent) ?? null;\n\n // Capture initial state from Entity BEFORE replacing with getter\n if (\n this.entityInstance?.state !== undefined &&\n this.entityInstance?.state !== null\n ) {\n const entityState: ComponentWrapperState = Object.assign(\n {},\n this.entityInstance.state as Record<string, unknown>,\n );\n Object.assign(this.state, entityState);\n }\n\n // Auto-bind all methods to maintain 'this' context\n if (this.entityInstance) {\n const prototype: Record<string, unknown> = Object.getPrototypeOf(\n this.entityInstance,\n ) as Record<string, unknown>;\n Object.getOwnPropertyNames(prototype).forEach((key: string) => {\n const descriptor: PropertyDescriptor | undefined =\n Object.getOwnPropertyDescriptor(prototype, key);\n if (\n key !== 'constructor' &&\n descriptor &&\n typeof descriptor.value === 'function'\n ) {\n // Bind method and assign to instance (not prototype)\n // This ensures each method has stable reference per entity instance\n (this.entityInstance as unknown as Record<string, unknown>)[key] =\n descriptor.value.bind(this.entityInstance);\n }\n });\n\n // Replace entity's state property with a getter that always returns controller state\n if ('state' in this.entityInstance) {\n Object.defineProperty(this.entityInstance, 'state', {\n get: () => controller.state,\n configurable: true,\n enumerable: true,\n });\n }\n }\n }\n\n public componentDidMount(): void {\n if (\n this.entityInstance &&\n typeof this.entityInstance.componentDidMount === 'function'\n ) {\n this.entityInstance.componentDidMount.call(this.entityInstance);\n }\n }\n\n public componentDidUpdate(\n prevProps: ComponentWrapperProps,\n prevState: ComponentWrapperState,\n ): void {\n if (\n this.entityInstance &&\n typeof this.entityInstance.componentDidUpdate === 'function'\n ) {\n this.entityInstance.componentDidUpdate.call(\n this.entityInstance,\n prevProps,\n prevState,\n );\n }\n }\n\n public componentWillUnmount(): void {\n if (\n this.entityInstance &&\n typeof this.entityInstance.componentWillUnmount === 'function'\n ) {\n this.entityInstance.componentWillUnmount.call(this.entityInstance);\n }\n }\n\n public render(): React.ReactNode {\n if (!this.entityInstance) {\n return null;\n }\n return this.entityInstance.render.call(this.entityInstance);\n }\n }\n\n // Check if Entity instance has MobX stores and wrap with observer\n // Observer handles reactivity - component re-renders when observables change\n const wrappedComponent: React.ComponentType<ComponentWrapperProps> =\n observer(ComponentWrapper);\n\n // Store the React.FC in registry\n const reactComponent: React.FC = wrappedComponent as unknown as React.FC;\n componentRegistry.set(Entity.name, reactComponent);\n componentReverseRegistry.set(reactComponent, Entity.name);\n\n // Return the original class for TypeScript decorator compatibility\n return Entity;\n } as ComponentDecoratorFunction;\n\n // $provider retrieves the stored React.FC\n decorator.$provider = <T extends Ctor<IoComponent>>(Entity: T): React.FC => {\n const component: React.FC | undefined = componentRegistry.get(Entity.name);\n if (!component) {\n throw new Error(\n `Component ${Entity.name} not found. Make sure to apply @Component decorator first.`,\n );\n }\n return component;\n };\n\n return decorator as ComponentDecoratorFunction;\n}\n\n// Helper to get class name from React.FC\nexport function getComponentClassName(component: React.FC): string | undefined {\n return componentReverseRegistry.get(component);\n}\n\n// Add static $provider method to Component function itself\nComponent.$provider = <T extends Ctor<IoComponent>>(Entity: T): React.FC => {\n const component: React.FC | undefined = componentRegistry.get(Entity.name);\n if (!component) {\n throw new Error(\n `Component ${Entity.name} not found. Make sure to apply @Component decorator first.`,\n );\n }\n return component;\n};\n","import {injectable} from 'tsyringe';\nimport {DependencyManagement} from '../DependencyManagement';\nimport type {InjectableParams} from '../types';\nimport type {constructor} from 'tsyringe/dist/typings/types';\n\nexport function Injectable(params?: InjectableParams): ClassDecorator {\n return function <T extends Function>(Entity: T): T {\n // Apply tsyringe's @injectable\n injectable()(Entity as unknown as constructor<unknown>);\n\n // Register in root scope if providedIn: 'root'\n if (params?.providedIn === 'root') {\n const dependencyManagement: DependencyManagement =\n DependencyManagement.getInstance();\n dependencyManagement.setupRootContainer(Entity);\n }\n\n return Entity;\n };\n}\n","import React from 'react';\nimport {observer} from 'mobx-react';\nimport {injectable} from 'tsyringe';\nimport type {DependencyContainer} from 'tsyringe';\nimport {DependencyManagement} from '../DependencyManagement';\nimport {getComponentClassName} from './Component';\nimport type {\n RouterParams,\n Ctor,\n IoComponent,\n Controller,\n RouterWrapperProps,\n RouterWrapperState,\n} from '../types';\n\n// Store React.FC routers by class name\nconst routerRegistry: Map<string, React.FC> = new Map<string, React.FC>();\n// Store reverse mapping: React.FC -> class name\nconst routerReverseRegistry: Map<React.FC, string> = new Map<\n React.FC,\n string\n>();\n\ntype RouterDecoratorFunction = <T extends Ctor<IoComponent>>(Entity: T) => T;\n\n// Helper to get router class name from React.FC\nfunction getRouterClassName(router: React.FC): string | undefined {\n return routerReverseRegistry.get(router);\n}\n\nexport function Router(params: RouterParams): RouterDecoratorFunction {\n const decorator: RouterDecoratorFunction = function <\n T extends Ctor<IoComponent>,\n >(Entity: T): T {\n // Apply @injectable to Entity\n injectable()(Entity);\n\n const dependencyManagement: DependencyManagement =\n DependencyManagement.getInstance();\n\n // Extract class names from components (both class constructors and React.FC)\n const componentClassNames: Array<string> = params.components\n .map((comp: Ctor<unknown> | React.FC): string | undefined => {\n // Check if it's a React.FC component\n const componentClassName: string | undefined = getComponentClassName(\n comp as React.FC,\n ) as string | undefined;\n if (componentClassName) {\n return componentClassName;\n }\n // Check if it's a React.FC router\n const routerClassName: string | undefined = getRouterClassName(\n comp as React.FC,\n );\n if (routerClassName) {\n return routerClassName;\n }\n // It's a class constructor, use its name property\n const classComp: Ctor<unknown> = comp as Ctor<unknown>;\n return classComp.name || undefined;\n })\n .filter((name: string | undefined): name is string => name !== undefined);\n\n // Setup router container with all components and providers\n // This makes providers and components accessible to all components in this router scope\n // Include the Router entity itself as a provider in its own scope\n dependencyManagement.setupRouterContainer(\n componentClassNames,\n [...(params.providers || []), Entity],\n params.selector,\n );\n\n // Create wrapper component (similar to Component decorator)\n class RouterWrapper extends React.Component<\n RouterWrapperProps,\n RouterWrapperState\n > {\n private entityInstance: IoComponent | null = null;\n private dependencyManagement: DependencyManagement;\n\n public constructor(props: RouterWrapperProps) {\n super(props);\n const initialState: RouterWrapperState = {};\n this.state = initialState;\n\n this.dependencyManagement = DependencyManagement.getInstance();\n\n // Get router container\n const routerContainerInstance: DependencyContainer | undefined =\n this.dependencyManagement.getRouterContainer(params.selector);\n\n // Register Controller before instantiating Entity\n // Store reference to wrapper instance for state getter\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const wrapperInstance: RouterWrapper = this;\n const controller: Controller<RouterWrapperProps, RouterWrapperState> = {\n props: props,\n get state(): RouterWrapperState {\n return wrapperInstance.state;\n },\n setState: <S = RouterWrapperState>(\n state: S | ((prevState: S) => S),\n ): void => {\n if (typeof state === 'function') {\n this.setState((prevState: RouterWrapperState) => {\n const newState: RouterWrapperState = (\n state as (prevState: S) => S\n )(prevState as S) as RouterWrapperState;\n\n // Sync with entity instance state if it exists\n if (this.entityInstance?.state) {\n Object.assign(this.entityInstance.state, newState);\n }\n\n return newState;\n });\n } else {\n this.setState((prevState: RouterWrapperState) => {\n const newState: RouterWrapperState = {\n ...prevState,\n ...(state as RouterWrapperState),\n };\n\n // Sync with entity instance state if it exists\n if (this.entityInstance?.state) {\n Object.assign(this.entityInstance.state, newState);\n }\n\n return newState;\n });\n }\n },\n forceUpdate: this.forceUpdate.bind(this),\n };\n\n routerContainerInstance?.register('Controller', {useValue: controller});\n\n // Get constructor parameter types using reflect-metadata\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const paramTypes: Array<Function> | undefined = Reflect.getMetadata(\n 'design:paramtypes',\n Entity,\n );\n\n // Resolve constructor dependencies automatically\n const constructorArgs: Array<unknown> = [];\n if (paramTypes && paramTypes.length > 0) {\n for (const ParamType of paramTypes) {\n let dependency: unknown = this.dependencyManagement.resolve(\n ParamType.name,\n undefined, // No component selector - this is a router\n params.selector, // Own router scope\n Entity.name, // Pass class name to find parent router if needed\n );\n\n // Fallback: If dependency is undefined and ParamType is Object,\n // try resolving 'Controller' (TypeScript type erasure for Controller<T>)\n if (dependency === undefined && ParamType.name === 'Object') {\n dependency = routerContainerInstance?.resolve('Controller');\n }\n\n constructorArgs.push(dependency);\n }\n }\n\n // Instantiate Entity with resolved dependencies\n this.entityInstance =\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n (new Entity(...constructorArgs) as IoComponent) ?? null;\n\n // Capture initial state from Entity BEFORE replacing with getter\n if (\n this.entityInstance?.state !== undefined &&\n this.entityInstance?.state !== null\n ) {\n const entityState: RouterWrapperState = Object.assign(\n {},\n this.entityInstance.state as Record<string, unknown>,\n );\n Object.assign(this.state, entityState);\n }\n\n // Auto-bind all methods to maintain 'this' context\n if (this.entityInstance) {\n const prototype: Record<string, unknown> = Object.getPrototypeOf(\n this.entityInstance,\n ) as Record<string, unknown>;\n Object.getOwnPropertyNames(prototype).forEach((key: string) => {\n const descriptor: PropertyDescriptor | undefined =\n Object.getOwnPropertyDescriptor(prototype, key);\n if (\n key !== 'constructor' &&\n descriptor &&\n typeof descriptor.value === 'function'\n ) {\n // Bind method and assign to instance\n (this.entityInstance as unknown as Record<string, unknown>)[key] =\n descriptor.value.bind(this.entityInstance);\n }\n });\n\n // Replace entity's state property with a getter that always returns controller state\n if ('state' in this.entityInstance) {\n Object.defineProperty(this.entityInstance, 'state', {\n get: () => controller.state,\n configurable: true,\n enumerable: true,\n });\n }\n }\n }\n\n public componentDidMount(): void {\n if (\n this.entityInstance &&\n typeof this.entityInstance.componentDidMount === 'function'\n ) {\n this.entityInstance.componentDidMount.call(this.entityInstance);\n }\n }\n\n public componentDidUpdate(\n prevProps: RouterWrapperProps,\n prevState: RouterWrapperState,\n ): void {\n if (\n this.entityInstance &&\n typeof this.entityInstance.componentDidUpdate === 'function'\n ) {\n this.entityInstance.componentDidUpdate.call(\n this.entityInstance,\n prevProps,\n prevState,\n );\n }\n }\n\n public componentWillUnmount(): void {\n if (\n this.entityInstance &&\n typeof this.entityInstance.componentWillUnmount === 'function'\n ) {\n this.entityInstance.componentWillUnmount.call(this.entityInstance);\n }\n }\n\n public render(): React.ReactNode {\n if (!this.entityInstance) {\n return null;\n }\n return this.entityInstance.render.call(this.entityInstance);\n }\n }\n\n // Wrap with MobX observer for reactive updates\n const wrappedComponent: React.ComponentType<RouterWrapperProps> =\n observer(RouterWrapper);\n\n // Store the React.FC in registry\n const reactComponent: React.FC = wrappedComponent as unknown as React.FC;\n routerRegistry.set(Entity.name, reactComponent);\n routerReverseRegistry.set(reactComponent, Entity.name);\n\n // Return the original class for TypeScript decorator compatibility\n return Entity;\n };\n\n return decorator;\n}\n\n// Add static $provider method to Router function itself\nRouter.$provider = <T extends Ctor<IoComponent>>(Entity: T): React.FC => {\n const component: React.FC | undefined = routerRegistry.get(Entity.name);\n if (!component) {\n throw new Error(\n `Router ${Entity.name} not found. Make sure to apply @Router decorator first.`,\n );\n }\n return component;\n};\n","import { DependencyManagement } from \"./DependencyManagement\";\n\n// Re-export decorators\nexport { Component } from \"./decorators/Component\";\nexport { Injectable } from \"./decorators/Injectable\";\nexport { Router } from \"./decorators/Router\";\n\n// Re-export types\nexport type {\n Ctor,\n Controller,\n InjectableParams,\n ComponentParams,\n RouterParams,\n IoComponent,\n ComponentWrapperProps,\n ComponentWrapperState,\n RouterWrapperProps,\n RouterWrapperState,\n} from \"./types\";\n\n/**\n * Reset all dependency instances in a specific scope\n * Note: Due to tsyringe limitations, this resets ALL scopes.\n * Useful for cleanup after logout, between tests, or when navigating away from features.\n * All providers are automatically re-registered and will be re-instantiated on next access.\n *\n * @param _scope - Scope type (for API compatibility, currently resets all)\n * @param _selector - Scope selector (for API compatibility, currently resets all)\n *\n * @example\n * // Clean up on logout\n * resetScope('root');\n *\n * // Clean up when unmounting router\n * resetScope('router', 'main-nav-router');\n *\n * // Clean up component scope\n * resetScope('component', 'home-screen');\n */\nexport function resetScope(\n _scope: \"root\" | \"router\" | \"component\",\n _selector?: string\n): void {\n DependencyManagement.getInstance().resetScope(_scope, _selector);\n}\n\n/**\n * Reset all dependency instances\n * Note: Due to tsyringe limitations, this resets ALL instances, not just the specified class.\n * Useful for targeted cleanup scenarios. All providers are automatically re-registered.\n *\n * @param _className - Class name (for API compatibility, currently resets all)\n *\n * @example\n * // Conceptually reset SharedNavStore\n * resetClass('SharedNavStore');\n */\nexport function resetClass(_className: string): void {\n DependencyManagement.getInstance().resetClass(_className);\n}\n\n/**\n * Reset all instances in all scopes\n * Warning: This will clear all cached singletons\n *\n * @example\n * // Clear everything (useful between tests)\n * resetAll();\n */\nexport function resetAll(): void {\n DependencyManagement.getInstance().resetAll();\n}\n"],"mappings":"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","names":["Component","injectable","injectable","React","observer","injectable","injectable","React","observer"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@portento/core",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Lightweight dependency injection framework for React with MobX integration",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"module": "./dist/index.mjs",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"README.md",
|
|
11
|
+
"LICENSE"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsup src/index.ts --format cjs,esm --dts --clean",
|
|
15
|
+
"prepublishOnly": "yarn build"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "github:luca-leone/portento-core"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"react",
|
|
23
|
+
"react-native",
|
|
24
|
+
"angular",
|
|
25
|
+
"dependency injection",
|
|
26
|
+
"decorators",
|
|
27
|
+
"ioc",
|
|
28
|
+
"inversion of control",
|
|
29
|
+
"mobx",
|
|
30
|
+
"typescript"
|
|
31
|
+
],
|
|
32
|
+
"author": "Luca Leone",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"mobx": "^6.0.0",
|
|
36
|
+
"mobx-react": "^7.0.0 || ^9.0.0",
|
|
37
|
+
"react": ">=16.8.0",
|
|
38
|
+
"reflect-metadata": "^0.1.13",
|
|
39
|
+
"tsyringe": "^4.0.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/react": "^18.0.0",
|
|
43
|
+
"mobx": "^6.15.0",
|
|
44
|
+
"mobx-react": "^9.2.1",
|
|
45
|
+
"reflect-metadata": "^0.2.2",
|
|
46
|
+
"tsup": "^8.0.0",
|
|
47
|
+
"tsyringe": "^4.10.0",
|
|
48
|
+
"typescript": "^5.0.0"
|
|
49
|
+
}
|
|
50
|
+
}
|