@adimm/x-injection-reactjs 0.3.0 → 1.0.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/dist/index.js CHANGED
@@ -1,186 +1,120 @@
1
- var e = Object.defineProperty, t = (t, o) => e(t, "name", {
1
+ var e = Object.defineProperty, r = (r, o) => e(r, "name", {
2
2
  value: o,
3
3
  configurable: !0
4
4
  });
5
5
 
6
6
  import { AppModule as o } from "@adimm/x-injection";
7
7
 
8
- import { createContext as n } from "react";
8
+ import { createContext as t } from "react";
9
9
 
10
- var r = n(o);
10
+ var n, i = t(o);
11
11
 
12
- import { useContext as i } from "react";
12
+ import { useContext as c } from "react";
13
13
 
14
- function s() {
15
- return i(r);
14
+ function u() {
15
+ return c(i);
16
16
  }
17
17
 
18
- function a(e, t) {
19
- return s().get(e, t?.isOptional);
18
+ function m(e, r) {
19
+ return u().get(e, r?.isOptional, r?.asList);
20
20
  }
21
21
 
22
- function m(...e) {
23
- return s().getMany(...e);
22
+ function a(...e) {
23
+ return u().getMany(...e);
24
24
  }
25
25
 
26
- t(s, "useComponentModule"), t(a, "useInject"), t(m, "useInjectMany");
26
+ r(u, "useComponentModule"), r(m, "useInject"), r(a, "useInjectMany");
27
27
 
28
- import { InjectionScope as c, ProviderModule as p, ProviderModuleHelpers as d } from "@adimm/x-injection";
28
+ import p from "react";
29
29
 
30
- var u, l = class e extends p {
31
- static {
32
- t(this, "ComponentProviderModule");
33
- }
34
- originalIdentifier;
35
- hasContextualizedImports;
36
- initializedFromComponent;
37
- constructor(e) {
38
- const o = Symbol(`Component${e.identifier.description}`), n = !e.markAsGlobal && (e.contextualizeImports ?? !0), r = n ? new Map : void 0;
39
- super(d.buildInternalConstructorParams({
40
- ...e,
41
- defaultScope: e.defaultScope ?? c.Singleton,
42
- identifier: o,
43
- imports: n ? e.imports?.map((e => {
44
- const t = "function" == typeof e ? e() : e;
45
- return n ? () => {
46
- const e = t._createContextualizedComponentInstance(o);
47
- return r.set(t.originalIdentifier.toString(), e), e;
48
- } : t;
49
- })) : e.imports,
50
- dynamicExports: t(((e, t) => n ? t.map((e => {
51
- if (!(e instanceof p)) return e;
52
- return r.get(e.originalIdentifier.toString());
53
- })) : t), "dynamicExports")
54
- })), this.originalIdentifier = e.identifier, this.hasContextualizedImports = n,
55
- this.initializedFromComponent = !1;
56
- }
57
- toNaked() {
58
- return this;
59
- }
60
- clone(t) {
61
- const o = t, n = new e(d.buildInternalConstructorParams({
62
- isAppModule: this.isAppModule,
63
- markAsGlobal: this.isMarkedAsGlobal,
64
- identifier: Symbol(this.identifier.description.replace("Component", "")),
65
- defaultScope: this.defaultScope.native,
66
- dynamicExports: this.dynamicExports,
67
- onReady: this.onReady,
68
- onDispose: this.onDispose,
69
- contextualizeImports: this.hasContextualizedImports,
70
- importedProvidersMap: this.importedProvidersMap,
71
- imports: [ ...this.imports ],
72
- providers: [ ...this.providers ],
73
- exports: [ ...this.exports ],
74
- ...o
75
- }));
76
- return n.initializedFromComponent = this.initializedFromComponent, n;
77
- }
78
- async dispose() {
79
- await super.dispose();
80
- }
81
- _createContextualizedComponentInstance(e) {
82
- if (this.initializedFromComponent) return this;
83
- const t = this.clone().toNaked();
84
- return t.identifier = Symbol(`${e ? `[Parent:${e.description ?? "Unknown"}]` : ""}Contextualized${t.identifier.description}`),
85
- t.initializedFromComponent = !0, t;
86
- }
87
- };
30
+ import { InjectionProviderModuleError as d, ProviderModuleHelpers as s, ProviderTokenHelpers as f } from "@adimm/x-injection";
88
31
 
89
- import f from "react";
32
+ import { useMemo as l } from "react";
90
33
 
91
- import { useMemo as h } from "react";
92
-
93
- import { useEffect as C, useRef as x, useState as y } from "react";
34
+ import { useEffect as v, useRef as h, useState as j } from "react";
94
35
 
95
36
  function M(e) {
96
- const t = x(void 0), o = x(!1), n = x(!1), [, r] = y(0);
97
- o.current && (n.current = !0), C((() => (o.current || (t.current = e(), o.current = !0),
98
- r((e => e + 1)), () => {
99
- n.current && t.current?.();
100
- })), []);
37
+ const r = h(void 0), o = h(!1), t = h(!1), [, n] = j(0);
38
+ o.current && (t.current = !0), v(() => (o.current || (r.current = e(), o.current = !0),
39
+ n(e => e + 1), () => {
40
+ t.current && r.current?.();
41
+ }), []);
101
42
  }
102
43
 
103
- function v(e, t) {
104
- const o = h((() => {
105
- const o = (t ?? e).toNaked();
106
- return o.isMarkedAsGlobal ? o : o._createContextualizedComponentInstance();
107
- }), [ e, t ]);
108
- return M((() => () => {
44
+ function y(e, r) {
45
+ const o = l(() => {
46
+ const {module: o, inject: t} = r ?? {}, n = s.tryBlueprintToModule(o ?? e);
47
+ if (n.options.isGlobal) throw new d(n, "A 'global' module can't be supplied to a component!");
48
+ return t?.forEach(e => {
49
+ if (!n.hasProvider(e)) throw new d(n, `The [${f.providerTokenToString(e)}] provider can't be replaced because it is not part of the component module!`);
50
+ n.update.removeProvider(f.toProviderIdentifier(e)), n.update.addProvider(e);
51
+ }), n;
52
+ }, [ e, r?.inject ]);
53
+ return M(() => () => {
109
54
  o.dispose();
110
- })), o;
55
+ }), o;
111
56
  }
112
57
 
113
- t(M, "useEffectOnce"), t(v, "useContextualizedModule");
58
+ r(M, "useEffectOnce"), r(y, "useMakeOrGetComponentModule");
114
59
 
115
- import { isFunction as I } from "@adimm/x-injection";
60
+ import { isFunction as P } from "@adimm/x-injection";
116
61
 
117
62
  !function(e) {
118
- function o(e, t, o) {
119
- const n = {
120
- ...t
63
+ function o(e, r, o) {
64
+ const t = {
65
+ ...r
121
66
  };
122
- return ("object" == typeof e && "type" in e && I(e.type) || I(e)) && (n.module = o),
123
- n;
67
+ return ("object" == typeof e && "type" in e && P(e.type) || P(e)) && (t.module = o),
68
+ t;
124
69
  }
125
- t(o, "forwardPropsWithModule"), e.forwardPropsWithModule = o;
126
- }(u || (u = {}));
70
+ r(o, "forwardPropsWithModule"), e.forwardPropsWithModule = o;
71
+ }(n || (n = {}));
127
72
 
128
- var z = f.memo(g);
73
+ var g = p.memo(b);
129
74
 
130
- function P(e, t) {
75
+ function w(e, r) {
131
76
  return o => {
132
- const n = v(e, o.module);
133
- return f.createElement(r.Provider, {
134
- value: n
135
- }, f.createElement(z, {
136
- module: n,
77
+ const t = y(e, o);
78
+ return p.createElement(i.Provider, {
79
+ value: t
80
+ }, p.createElement(g, {
81
+ module: t,
137
82
  componentProps: o,
138
- component: t
83
+ component: r
139
84
  }));
140
85
  };
141
86
  }
142
87
 
143
- function g({module: e, component: t, componentProps: o}) {
144
- return f.createElement(f.Fragment, null, t(u.forwardPropsWithModule(t, o, e)));
145
- }
146
-
147
- t(P, "provideModuleToComponent"), t(g, "_ComponentRenderer");
148
-
149
- import b, { useMemo as E } from "react";
150
-
151
- function j({module: e, children: t}) {
152
- const o = t.props ?? {}, n = v(e, o.module), i = E((() => b.cloneElement(t, u.forwardPropsWithModule(t, o, n))), [ o, n ]);
153
- return b.createElement(r.Provider, {
154
- value: n
155
- }, i);
88
+ function b({module: e, component: r, componentProps: o}) {
89
+ return p.createElement(p.Fragment, null, r(n.forwardPropsWithModule(r, o, e)));
156
90
  }
157
91
 
158
- t(j, "ProvideModule");
92
+ r(w, "provideModuleToComponent"), r(b, "_ComponentRenderer");
159
93
 
160
- import { useMemo as k } from "react";
94
+ import { useMemo as E } from "react";
161
95
 
162
- import { InjectionProviderModuleError as w } from "@adimm/x-injection";
96
+ import { InjectionProviderModuleError as x } from "@adimm/x-injection";
163
97
 
164
- var S = class e extends w {
98
+ var T = class e extends x {
165
99
  static {
166
- t(this, "InjectionHookFactoryError");
100
+ r(this, "InjectionHookFactoryError");
167
101
  }
168
102
  name=e.name;
169
103
  };
170
104
 
171
- function F({use: e, inject: t}) {
105
+ function I({use: e, inject: r}) {
172
106
  return o => {
173
- const n = s(), r = k((() => {
174
- if (0 === t.length) throw new S(n, "The 'deps' property array is missing!");
175
- return n.getMany(...t);
176
- }), [ t ]);
107
+ const t = u(), n = E(() => {
108
+ if (0 === r.length) throw new T(t, "The 'deps' property array is missing!");
109
+ return t.getMany(...r);
110
+ }, [ r ]);
177
111
  return e({
178
112
  ...o,
179
- deps: [ ...r ]
113
+ deps: [ ...n ]
180
114
  });
181
115
  };
182
116
  }
183
117
 
184
- t(F, "hookFactory");
118
+ r(I, "hookFactory");
185
119
 
186
- export { l as ComponentProviderModule, j as ProvideModule, r as REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT, F as hookFactory, P as provideModuleToComponent, s as useComponentModule, a as useInject, m as useInjectMany };//# sourceMappingURL=index.js.map
120
+ export { i as REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT, I as hookFactory, w as provideModuleToComponent, u as useComponentModule, m as useInject, a as useInjectMany };//# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/react-context.ts","../src/core/hooks/use-component-module.ts","../src/core/hooks/use-inject.ts","../src/core/hooks/use-inject-many.ts","../src/core/component-provider-module.ts","../src/core/provide-module/provide-module.arrow-function.tsx","../src/helpers/hooks/use-contextualized-module.ts","../src/helpers/hooks/use-effect-once.ts","../src/helpers/component-provider-module.ts","../src/core/provide-module/provide-module.provider.tsx","../src/core/hook-factory.ts","../src/errors/hook-factory.ts"],"sourcesContent":["import { AppModule } from '@adimm/x-injection';\nimport { createContext } from 'react';\n\nimport type { IComponentProviderModule } from '../types';\n\nexport const REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT = createContext<IComponentProviderModule>(AppModule as any);\n","import { useContext } from 'react';\n\nimport type { IComponentProviderModule } from '../../types';\nimport { REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT } from '../react-context';\n\n/** Can be used to retrieve the {@link IComponentProviderModule} from the current context. */\nexport function useComponentModule(): IComponentProviderModule {\n return useContext(REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT);\n}\n","import type { ProviderToken } from '@adimm/x-injection';\n\nimport { useComponentModule } from './use-component-module';\n\n/**\n * Low-level hook which can be used to resolve a single dependency from the current\n * context module.\n *\n * **Note:** _In order to better modularize your code-base, you should strive to create custom hooks by using the_\n * _`hookFactory` method to compose a custom hook._\n *\n * @param provider The {@link ProviderToken}.\n * @param options See {@link UseInjectOptions}.\n * @returns The resolved {@link T | dependency}.\n */\nexport function useInject<T>(provider: ProviderToken<T>, options?: UseInjectOptions): T {\n const componentModule = useComponentModule();\n\n return componentModule.get(provider, options?.isOptional);\n}\n\nexport type UseInjectOptions = {\n /** When set to `false` _(default)_ an exception will be thrown when the `providerOrIdentifier` isn't bound. */\n isOptional?: boolean;\n};\n","import type { ProviderModuleGetManyParam, ProviderModuleGetManySignature, ProviderToken } from '@adimm/x-injection';\n\nimport { useComponentModule } from './use-component-module';\n\n/**\n * Low-level hook which can be used to resolve multiple dependencies at once from the current\n * context module.\n *\n * **Note:** _In order to better modularize your code-base, you should strive to create custom hooks by using the_\n * _`hookFactory` method to compose a custom hook._\n *\n * @param deps Either one or more {@link ProviderToken}.\n * @returns Tuple containing the {@link D | dependencies}.\n */\nexport function useInjectMany<D extends (ProviderModuleGetManyParam<any> | ProviderToken)[]>(\n ...deps: D | unknown[]\n): ProviderModuleGetManySignature<D> {\n const componentModule = useComponentModule();\n\n return componentModule.getMany(...deps);\n}\n","import {\n InjectionScope,\n ProviderModule,\n ProviderModuleHelpers,\n type IProviderModule,\n type IProviderModuleNaked,\n type ProviderModuleOptionsInternal,\n} from '@adimm/x-injection';\n\nimport type { ComponentProviderModuleOptions, IComponentProviderModule, IComponentProviderModuleNaked } from '../types';\n\n/** A superset of the {@link ProviderModule} used to integrate within a `React` component. */\nexport class ComponentProviderModule extends ProviderModule implements IComponentProviderModule {\n protected readonly originalIdentifier: symbol;\n protected readonly hasContextualizedImports: IComponentProviderModuleNaked['hasContextualizedImports'];\n protected readonly initializedFromComponent: IComponentProviderModuleNaked['initializedFromComponent'];\n\n constructor(options: ComponentProviderModuleOptions) {\n const identifier = Symbol(`Component${options.identifier.description}`);\n const contextualizeImports = options.markAsGlobal ? false : options.contextualizeImports ?? true;\n const contextualizedImportsCache: Map<string, IProviderModule> | undefined = contextualizeImports\n ? new Map()\n : undefined;\n\n super(\n ProviderModuleHelpers.buildInternalConstructorParams({\n ...options,\n defaultScope: options.defaultScope ?? InjectionScope.Singleton,\n identifier: identifier,\n imports: !contextualizeImports\n ? options.imports\n : options.imports?.map((imp) => {\n const module = (typeof imp === 'function' ? imp() : imp) as IComponentProviderModuleNaked;\n /* istanbul ignore next */\n if (!contextualizeImports) return module;\n\n return () => {\n const ctxModule = module._createContextualizedComponentInstance(identifier);\n\n contextualizedImportsCache!.set(module.originalIdentifier.toString(), ctxModule);\n\n return ctxModule;\n };\n }),\n dynamicExports: (_, exports) => {\n if (!contextualizeImports) return exports;\n\n return exports.map((exp) => {\n if (!(exp instanceof ProviderModule)) return exp;\n\n const cachedCtxModule = contextualizedImportsCache!.get(\n (exp as unknown as IComponentProviderModuleNaked).originalIdentifier.toString()\n )!;\n\n return cachedCtxModule;\n });\n },\n })\n );\n\n this.originalIdentifier = options.identifier;\n this.hasContextualizedImports = contextualizeImports;\n this.initializedFromComponent = false;\n }\n\n override toNaked(): IComponentProviderModuleNaked & IProviderModuleNaked {\n return this as any;\n }\n\n /* istanbul ignore next */\n override clone(options?: Partial<ComponentProviderModuleOptions>): IComponentProviderModule {\n const _options = options as ProviderModuleOptionsInternal;\n\n const clonedModule = new ComponentProviderModule(\n ProviderModuleHelpers.buildInternalConstructorParams({\n isAppModule: this.isAppModule,\n markAsGlobal: this.isMarkedAsGlobal,\n identifier: Symbol(this.identifier.description!.replace('Component', '')),\n defaultScope: this.defaultScope.native,\n dynamicExports: this.dynamicExports,\n onReady: this.onReady,\n onDispose: this.onDispose,\n contextualizeImports: this.hasContextualizedImports,\n importedProvidersMap: this.importedProvidersMap,\n imports: [...this.imports],\n providers: [...this.providers],\n exports: [...this.exports],\n ..._options,\n } as ComponentProviderModuleOptions)\n );\n\n //@ts-expect-error Read-only method.\n clonedModule.initializedFromComponent = this.initializedFromComponent;\n\n return clonedModule;\n }\n\n /* istanbul ignore next */\n override async dispose(): Promise<void> {\n await super.dispose();\n }\n\n //#region IComponentProviderModuleNaked methods\n\n /**\n * **Publicly visible when the instance is casted to {@link IComponentProviderModuleNaked}.**\n *\n * See {@link IComponentProviderModuleNaked._createContextualizedComponentInstance}.\n */\n protected _createContextualizedComponentInstance(parentIdentifier?: symbol): IComponentProviderModule {\n if (this.initializedFromComponent) return this;\n\n const ctxModule = this.clone().toNaked();\n\n /* istanbul ignore next */\n //@ts-expect-error Read-only property\n ctxModule.identifier = Symbol(\n `${parentIdentifier ? `[Parent:${parentIdentifier.description ?? 'Unknown'}]` : ''}Contextualized${ctxModule.identifier.description}`\n );\n ctxModule.initializedFromComponent = true;\n\n return ctxModule;\n }\n\n //#endregion\n}\n","import React from 'react';\n\nimport { ComponentProviderModuleHelpers, useContextualizedModule } from '../../helpers';\nimport type { IComponentProviderModule, PropsWithModule } from '../../types';\nimport { REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT } from '../react-context';\n\nconst ComponentRenderer = React.memo(_ComponentRenderer);\n\n/**\n * Can be used to easily provide a {@link module} to any component.\n *\n * @example\n * ```tsx\n * interface MyComponentProps {\n * firstName: string;\n * lastName: string;\n * }\n *\n * export const MyComponent = provideModuleToComponent<MyComponentProps>(\n * MyComponentModule,\n * ({ firstName, lastName }) => {\n * const service = useInject(MyComponentService);\n *\n * return <h1>Hello {service.computeUserName(firstName, lastName)}!</h1>\n * }\n * );\n *\n * function App() {\n * return <MyComponent firstName={'John'} lastName={'Doe'} />;\n * }\n * ```\n *\n * @param module The {@link IComponentProviderModule | Module} which should be consumed by the {@link component}.\n * @returns The provided {@link toComponent | Component}.\n */\nexport function provideModuleToComponent<\n P extends Record<string, any>,\n C extends ReactElementWithProviderModule<P> = ReactElementWithProviderModule<P>,\n>(module: IComponentProviderModule, component: ReactElementWithProviderModule<P>): C {\n return ((componentProps: PropsWithModule<P>) => {\n const moduleCtx = useContextualizedModule(module, componentProps.module);\n\n return (\n <REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT.Provider value={moduleCtx}>\n <ComponentRenderer module={moduleCtx} componentProps={componentProps} component={component as any} />\n </REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT.Provider>\n );\n }) as any;\n}\n\nfunction _ComponentRenderer<P extends Record<string, any>>({\n module,\n component,\n componentProps,\n}: {\n module: IComponentProviderModule;\n component: ReactElementWithProviderModule<P>;\n componentProps: P;\n}) {\n return <>{component(ComponentProviderModuleHelpers.forwardPropsWithModule(component, componentProps, module))}</>;\n}\n\nexport type ReactElementWithProviderModule<P extends Record<string, any>> = (p: PropsWithModule<P>) => React.ReactNode;\n","import { useMemo } from 'react';\n\nimport type { IComponentProviderModule } from '../../types';\nimport { useEffectOnce } from './use-effect-once';\n\nexport function useContextualizedModule(\n originalModule: IComponentProviderModule,\n forwardedModule?: IComponentProviderModule\n): IComponentProviderModule {\n const ctxModule = useMemo(() => {\n const module = (forwardedModule ?? originalModule).toNaked();\n\n if (module.isMarkedAsGlobal) return module;\n\n return module._createContextualizedComponentInstance();\n }, [originalModule, forwardedModule]);\n\n useEffectOnce(() => {\n return () => {\n ctxModule.dispose();\n };\n });\n\n return ctxModule;\n}\n","import { useEffect, useRef, useState } from 'react';\n\n// Credits: https://stackoverflow.com/a/74000921\n\n/** Custom {@link useEffect} hook which will be run once. _(In `StrictMode` as well)_ */\nexport function useEffectOnce(effect: () => React.EffectCallback) {\n const destroyFunc = useRef<React.EffectCallback>(undefined);\n const effectCalled = useRef(false);\n const renderAfterCalled = useRef(false);\n const [, forceRerender] = useState(0);\n\n if (effectCalled.current) renderAfterCalled.current = true;\n\n useEffect(() => {\n // only execute the effect first time around\n if (!effectCalled.current) {\n destroyFunc.current = effect();\n effectCalled.current = true;\n }\n\n // this forces one render after the effect is run\n forceRerender((x) => x + 1);\n\n return () => {\n // if the comp didn't render since the useEffect was called,\n // we know it's the dummy React cycle\n if (!renderAfterCalled.current) return;\n\n destroyFunc.current?.();\n };\n }, []);\n}\n","import { isFunction } from '@adimm/x-injection';\n\nimport type { ReactElementWithProviderModule } from '../core';\nimport type { IComponentProviderModule, PropsWithModule } from '../types';\n\nexport namespace ComponentProviderModuleHelpers {\n export function forwardPropsWithModule<P extends Record<string, any>>(\n component: ReactElementWithProviderModule<P> | React.ReactElement,\n props: Record<string, any>,\n module: IComponentProviderModule\n ): PropsWithModule<P> {\n const isReactElement = typeof component === 'object' && 'type' in component;\n\n const result = {\n ...props,\n } as any;\n\n if ((isReactElement && isFunction(component.type)) || isFunction(component)) {\n result['module'] = module;\n }\n\n return result;\n }\n}\n","import React, { useMemo } from 'react';\n\nimport { ComponentProviderModuleHelpers, useContextualizedModule } from '../../helpers';\nimport type { IComponentProviderModule } from '../../types';\nimport { REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT } from '../react-context';\n\n/**\n * Can be used to easily provide a {@link module} to any component.\n *\n * @example\n * ```tsx\n * interface MyComponentProps {\n * firstName: string;\n * lastName: string;\n * }\n *\n * function MyComponent({ firstName, lastName }: MyComponentProps) {\n * const service = useInject(MyComponentService);\n *\n * return <h1>Hello {service.computeUserName(firstName, lastName)}!</h1>\n * }\n *\n * function App() {\n * return (\n * <ProvideModule module={MyComponentModule}>\n * <MyComponent firstName={'John'} lastName={'Doe'} />\n * </ProvideModule>\n * );\n * }\n * ```\n *\n * @param param0 See {@link ProvideModuleFunctionParams}.\n * @returns The provided {@link toComponent | Component}.\n */\nexport function ProvideModule({ module, children }: ProvideModuleFunctionParams) {\n /* istanbul ignore next */\n const componentProps = (children.props ?? {}) as any;\n const moduleCtx = useContextualizedModule(module, componentProps.module);\n const component = useMemo(\n () =>\n React.cloneElement(\n children,\n ComponentProviderModuleHelpers.forwardPropsWithModule(children, componentProps, moduleCtx)\n ),\n [componentProps, moduleCtx]\n );\n\n return (\n <REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT.Provider value={moduleCtx}>\n {component}\n </REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT.Provider>\n );\n}\n\nexport interface ProvideModuleFunctionParams {\n /** The {@link IComponentProviderModule | Module} which should be consumed by the {@link children | component}. */\n module: IComponentProviderModule;\n\n children: React.ReactElement;\n}\n","import type { ProviderToken } from '@adimm/x-injection';\nimport { useMemo } from 'react';\n\nimport { InjectionHookFactoryError } from '../errors';\nimport { useComponentModule } from './hooks';\n\nexport function hookFactory<P extends HookParams, D extends any[], T>({\n use: hook,\n inject,\n}: HookFactoryParams<P, D, T>): (p: P) => T {\n return (p: P) => {\n const componentModule = useComponentModule();\n\n const deps = useMemo(() => {\n if (inject.length === 0) {\n throw new InjectionHookFactoryError(componentModule, `The 'deps' property array is missing!`);\n }\n\n return componentModule.getMany(...inject);\n }, [inject]);\n\n return hook({ ...p, deps: [...deps] } as any);\n };\n}\n\nexport interface HookFactoryParams<P extends HookParams, D extends any[], T> {\n use: HookWithProviderModuleDependencies<P, D, T>;\n inject: ProviderToken[];\n}\n\nexport type HookWithProviderModuleDependencies<P extends HookParams, D extends any[], T> = (p: HookWithDeps<P, D>) => T;\n\nexport type HookWithDeps<P extends HookParams, D extends any[]> = P & {\n /** Array containing the resolved dependencies from the component context. */\n deps: D;\n};\n\ntype HookParams = Record<string, any> | void;\n","import { InjectionProviderModuleError } from '@adimm/x-injection';\n\nexport class InjectionHookFactoryError extends InjectionProviderModuleError {\n override name = InjectionHookFactoryError.name;\n}\n"],"mappings":"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","names":["AppModule","createContext","REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT","useContext","useComponentModule","useContext","REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT","useInject","provider","options","componentModule","useComponentModule","get","isOptional","useInjectMany","deps","componentModule","useComponentModule","getMany","InjectionScope","ProviderModule","ProviderModuleHelpers","ComponentProviderModule","ProviderModule","originalIdentifier","hasContextualizedImports","initializedFromComponent","constructor","options","identifier","Symbol","description","contextualizeImports","markAsGlobal","contextualizedImportsCache","Map","undefined","ProviderModuleHelpers","buildInternalConstructorParams","defaultScope","InjectionScope","Singleton","imports","map","imp","module","ctxModule","_createContextualizedComponentInstance","set","toString","dynamicExports","_","exports","exp","cachedCtxModule","get","toNaked","clone","_options","clonedModule","isAppModule","isMarkedAsGlobal","replace","native","onReady","onDispose","importedProvidersMap","providers","dispose","parentIdentifier","React","useMemo","useEffect","useRef","useState","useEffectOnce","effect","destroyFunc","useRef","undefined","effectCalled","renderAfterCalled","forceRerender","useState","current","useEffect","x","useContextualizedModule","originalModule","forwardedModule","ctxModule","useMemo","module","toNaked","isMarkedAsGlobal","_createContextualizedComponentInstance","useEffectOnce","dispose","isFunction","ComponentProviderModuleHelpers","forwardPropsWithModule","component","props","module","isReactElement","result","isFunction","type","ComponentRenderer","React","memo","_ComponentRenderer","provideModuleToComponent","module","component","componentProps","moduleCtx","useContextualizedModule","REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT","Provider","value","ComponentProviderModuleHelpers","forwardPropsWithModule","React","useMemo","ProvideModule","module","children","componentProps","props","moduleCtx","useContextualizedModule","component","useMemo","React","cloneElement","ComponentProviderModuleHelpers","forwardPropsWithModule","REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT","Provider","value","useMemo","InjectionProviderModuleError","InjectionHookFactoryError","InjectionProviderModuleError","name","hookFactory","use","hook","inject","p","componentModule","useComponentModule","deps","useMemo","length","InjectionHookFactoryError","getMany"]}
1
+ {"version":3,"sources":["../src/core/react-context.ts","../src/core/hooks/use-component-module.ts","../src/core/hooks/use-inject.ts","../src/core/hooks/use-inject-many.ts","../src/core/provide-module-to-component.hoc.tsx","../src/helpers/hooks/use-make-or-get-component-module.ts","../src/helpers/hooks/use-effect-once.ts","../src/helpers/component-provider-module.ts","../src/core/hook-factory.ts","../src/errors/hook-factory.ts"],"sourcesContent":["import { AppModule, IProviderModule } from '@adimm/x-injection';\nimport { createContext } from 'react';\n\nexport const REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT = createContext<IProviderModule>(AppModule);\n","import type { IProviderModule } from '@adimm/x-injection';\nimport { useContext } from 'react';\n\nimport { REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT } from '../react-context';\n\n/** Can be used to retrieve the {@link IProviderModule | Module} from the current context. */\nexport function useComponentModule(): IProviderModule {\n return useContext(REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT);\n}\n","import type { ProviderToken } from '@adimm/x-injection';\n\nimport { useComponentModule } from './use-component-module';\n\n/**\n * Low-level hook which can be used to resolve a single dependency.\n *\n * **Note:** _In order to better modularize your code-base, you should strive to create custom hooks by using the_\n * _`hookFactory` method to compose a custom hook._\n *\n * @param provider The {@link ProviderToken}.\n * @param options See {@link UseInjectOptions}.\n * @returns The resolved {@link T | dependency}.\n */\nexport function useInject<\n T,\n IsOptional extends boolean | undefined = undefined,\n AsList extends boolean | undefined = undefined,\n>(provider: ProviderToken<T>, options?: UseInjectOptions<IsOptional, AsList>) {\n const componentModule = useComponentModule();\n\n return componentModule.get<T, IsOptional, AsList>(provider, options?.isOptional, options?.asList);\n}\n\nexport type UseInjectOptions<\n IsOptional extends boolean | undefined = undefined,\n AsList extends boolean | undefined = undefined,\n> = {\n /**\n * When set to `false` an exception will be thrown when the supplied `ProviderToken` isn't bound.\n *\n * Defaults to `false`.\n */\n isOptional?: IsOptional;\n\n /**\n * Set to `true` if you need to retrieve _all_ the bound identifiers of the supplied `ProviderToken`.\n *\n * Defaults to `false`.\n */\n asList?: AsList;\n};\n","import type { ProviderIdentifier, ProviderModuleGetManyParam, ProviderToken } from '@adimm/x-injection';\n\nimport { useComponentModule } from './use-component-module';\n\n/**\n * Low-level hook which can be used to resolve multiple dependencies at once.\n *\n * **Note:** _In order to better modularize your code-base, you should strive to create custom hooks by using the_\n * _`hookFactory` method to compose a custom hook._\n *\n * @param deps Either one or more {@link ProviderToken}.\n * @returns Tuple containing the {@link D | dependencies}.\n */\nexport function useInjectMany<D extends (ProviderModuleGetManyParam<any> | ProviderToken | ProviderIdentifier)[]>(\n ...deps: D\n) {\n const componentModule = useComponentModule();\n\n return componentModule.getMany<D>(...deps);\n}\n","import type { IProviderModule, ModuleOrBlueprint } from '@adimm/x-injection';\nimport React from 'react';\n\nimport { ComponentProviderModuleHelpers, useMakeOrGetComponentModule } from '../helpers';\nimport type { PropsWithModule } from '../types';\nimport { REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT } from './react-context';\n\nconst ComponentRenderer = React.memo(_ComponentRenderer);\n\n/**\n * Can be used to easily provide a {@link module} to a component.\n *\n * **Note:** _An error will be thrown if a `global` module is provided._\n *\n * @example\n * ```tsx\n * interface MyComponentProps {\n * firstName: string;\n * lastName: string;\n * }\n *\n * export const MyComponent = provideModuleToComponent<MyComponentProps>(\n * MyComponentModule,\n * ({ firstName, lastName }) => {\n * const service = useInject(MyComponentService);\n *\n * return <h1>Hello {service.computeUserName(firstName, lastName)}!</h1>\n * }\n * );\n *\n * function App() {\n * return <MyComponent firstName={'John'} lastName={'Doe'} />;\n * }\n * ```\n *\n * @param module The {@link ModuleOrBlueprint} which should be consumed by the {@link component}.\n * @returns The provided {@link toComponent | Component}.\n */\nexport function provideModuleToComponent<\n P extends Record<string, any>,\n C extends ReactElementWithProviderModule<P> = ReactElementWithProviderModule<P>,\n>(module: ModuleOrBlueprint, component: ReactElementWithProviderModule<P>): C {\n return ((componentProps: PropsWithModule<P>) => {\n const moduleCtx = useMakeOrGetComponentModule(module, componentProps);\n\n return (\n <REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT.Provider value={moduleCtx}>\n <ComponentRenderer module={moduleCtx} componentProps={componentProps} component={component as any} />\n </REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT.Provider>\n );\n }) as any;\n}\n\nfunction _ComponentRenderer<P extends Record<string, any>>({\n module,\n component,\n componentProps,\n}: {\n module: IProviderModule;\n component: ReactElementWithProviderModule<P>;\n componentProps: P;\n}) {\n return <>{component(ComponentProviderModuleHelpers.forwardPropsWithModule(component, componentProps, module))}</>;\n}\n\nexport type ReactElementWithProviderModule<P extends Record<string, any>> = (p: PropsWithModule<P>) => React.ReactNode;\n","import {\n InjectionProviderModuleError,\n ProviderModuleHelpers,\n ProviderTokenHelpers,\n type IProviderModule,\n type ModuleOrBlueprint,\n type ProviderModule,\n} from '@adimm/x-injection';\nimport { useMemo } from 'react';\n\nimport type { PropsWithModule } from '../../types';\nimport { useEffectOnce } from './use-effect-once';\n\nexport function useMakeOrGetComponentModule(\n originalModule: ModuleOrBlueprint,\n componentProps?: PropsWithModule<object>\n): IProviderModule {\n const componentModule = useMemo(() => {\n /* istanbul ignore next */\n const { module: forwardedModule, inject } = componentProps ?? {};\n const module = ProviderModuleHelpers.tryBlueprintToModule(forwardedModule ?? originalModule) as ProviderModule;\n\n if (module.options.isGlobal) {\n throw new InjectionProviderModuleError(module, `A 'global' module can't be supplied to a component!`);\n }\n\n inject?.forEach((provider) => {\n if (!module.hasProvider(provider)) {\n throw new InjectionProviderModuleError(\n module,\n `The [${ProviderTokenHelpers.providerTokenToString(provider)}] provider can't be replaced because it is not part of the component module!`\n );\n }\n\n module.update.removeProvider(ProviderTokenHelpers.toProviderIdentifier(provider));\n module.update.addProvider(provider);\n });\n\n return module;\n }, [originalModule, componentProps?.inject]);\n\n useEffectOnce(() => {\n return () => {\n componentModule.dispose();\n };\n });\n\n return componentModule;\n}\n","import { useEffect, useRef, useState } from 'react';\n\n// Credits: https://stackoverflow.com/a/74000921\n\n/** Custom {@link useEffect} hook which will be run once. _(In `StrictMode` as well)_ */\nexport function useEffectOnce(effect: () => React.EffectCallback) {\n const destroyFunc = useRef<React.EffectCallback>(undefined);\n const effectCalled = useRef(false);\n const renderAfterCalled = useRef(false);\n const [, forceRerender] = useState(0);\n\n if (effectCalled.current) renderAfterCalled.current = true;\n\n useEffect(() => {\n // only execute the effect first time around\n if (!effectCalled.current) {\n destroyFunc.current = effect();\n effectCalled.current = true;\n }\n\n // this forces one render after the effect is run\n forceRerender((x) => x + 1);\n\n return () => {\n // if the comp didn't render since the useEffect was called,\n // we know it's the dummy React cycle\n if (!renderAfterCalled.current) return;\n\n destroyFunc.current?.();\n };\n }, []);\n}\n","import { isFunction, type ModuleOrBlueprint } from '@adimm/x-injection';\n\nimport type { ReactElementWithProviderModule } from '../core';\nimport type { PropsWithModule } from '../types';\n\nexport namespace ComponentProviderModuleHelpers {\n export function forwardPropsWithModule<P extends Record<string, any>>(\n component: ReactElementWithProviderModule<P> | React.ReactElement,\n props: Record<string, any>,\n module: ModuleOrBlueprint\n ): PropsWithModule<P> {\n const isReactElement = typeof component === 'object' && 'type' in component;\n\n const result = {\n ...props,\n } as any;\n\n if ((isReactElement && isFunction(component.type)) || isFunction(component)) {\n result['module'] = module;\n }\n\n return result;\n }\n}\n","import type { ProviderToken } from '@adimm/x-injection';\nimport { useMemo } from 'react';\n\nimport { InjectionHookFactoryError } from '../errors';\nimport { useComponentModule } from './hooks';\n\nexport function hookFactory<P extends HookParams, D extends any[], T>({\n use: hook,\n inject,\n}: HookFactoryParams<P, D, T>): (p: P) => T {\n return (p: P) => {\n const componentModule = useComponentModule();\n\n const deps = useMemo(() => {\n if (inject.length === 0) {\n throw new InjectionHookFactoryError(componentModule, `The 'deps' property array is missing!`);\n }\n\n return componentModule.getMany(...inject);\n }, [inject]);\n\n return hook({ ...p, deps: [...deps] } as any);\n };\n}\n\nexport interface HookFactoryParams<P extends HookParams, D extends any[], T> {\n use: (p: HookWithDeps<P, D>) => T;\n inject: ProviderToken[];\n}\n\nexport type HookWithDeps<P extends HookParams, D extends any[]> = P & {\n /** Array containing the resolved dependencies. */\n deps: D;\n};\n\ntype HookParams = Record<string, any> | void;\n","import { InjectionProviderModuleError } from '@adimm/x-injection';\n\nexport class InjectionHookFactoryError extends InjectionProviderModuleError {\n override name = InjectionHookFactoryError.name;\n}\n"],"mappings":"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","names":["AppModule","createContext","REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT","useContext","useComponentModule","useContext","REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT","useInject","provider","options","componentModule","useComponentModule","get","isOptional","asList","useInjectMany","deps","componentModule","useComponentModule","getMany","React","InjectionProviderModuleError","ProviderModuleHelpers","ProviderTokenHelpers","useMemo","useEffect","useRef","useState","useEffectOnce","effect","destroyFunc","useRef","undefined","effectCalled","renderAfterCalled","forceRerender","useState","current","useEffect","x","useMakeOrGetComponentModule","originalModule","componentProps","componentModule","useMemo","module","forwardedModule","inject","ProviderModuleHelpers","tryBlueprintToModule","options","isGlobal","InjectionProviderModuleError","forEach","provider","hasProvider","ProviderTokenHelpers","providerTokenToString","update","removeProvider","toProviderIdentifier","addProvider","useEffectOnce","dispose","isFunction","ComponentProviderModuleHelpers","forwardPropsWithModule","component","props","module","isReactElement","result","isFunction","type","ComponentRenderer","React","memo","_ComponentRenderer","provideModuleToComponent","module","component","componentProps","moduleCtx","useMakeOrGetComponentModule","REACT_X_INJECTION_PROVIDER_MODULE_CONTEXT","Provider","value","ComponentProviderModuleHelpers","forwardPropsWithModule","useMemo","InjectionProviderModuleError","InjectionHookFactoryError","InjectionProviderModuleError","name","hookFactory","use","hook","inject","p","componentModule","useComponentModule","deps","useMemo","length","InjectionHookFactoryError","getMany"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@adimm/x-injection-reactjs",
3
3
  "description": "ReactJS integration of the `xInjection` library.",
4
- "version": "0.3.0",
4
+ "version": "1.0.0",
5
5
  "author": "Adi-Marian Mutu",
6
6
  "homepage": "https://github.com/AdiMarianMutu/x-injection-reactjs#readme",
7
7
  "bugs": "https://github.com/AdiMarianMutu/x-injection-reactjs/issues",
@@ -38,29 +38,29 @@
38
38
  "v:bump-major": "npm version major -m \"chore: update lib major version %s\""
39
39
  },
40
40
  "dependencies": {
41
- "@adimm/x-injection": "^0.7.0",
41
+ "@adimm/x-injection": "^2.1.0",
42
42
  "react": ">=18.0.0"
43
43
  },
44
44
  "devDependencies": {
45
- "@ianvs/prettier-plugin-sort-imports": "^4.4.1",
45
+ "@ianvs/prettier-plugin-sort-imports": "^4.4.2",
46
46
  "@swc/core": "^1.11.24",
47
47
  "@testing-library/jest-dom": "^6.6.3",
48
48
  "@testing-library/react": "^16.3.0",
49
- "@tsconfig/node18": "^18.2.4",
50
- "@types/jest": "^29.5.14",
49
+ "@tsconfig/node22": "^22.0.2",
50
+ "@types/jest": "^30.0.0",
51
51
  "@types/react": "^19.1.2",
52
- "@typescript-eslint/eslint-plugin": "^6.21.0",
52
+ "@typescript-eslint/eslint-plugin": "^8.34.1",
53
53
  "eslint": "^8.57.1",
54
- "eslint-config-prettier": "^9.1.0",
54
+ "eslint-config-prettier": "^10.1.5",
55
55
  "eslint-plugin-import": "^2.31.0",
56
56
  "eslint-plugin-prettier": "^5.3.1",
57
57
  "http-server": "^14.1.1",
58
58
  "husky": "^9.1.7",
59
- "jest": "^29.7.0",
60
- "jest-environment-jsdom": "^29.7.0",
59
+ "jest": "^30.0.0",
60
+ "jest-environment-jsdom": "^30.0.0",
61
61
  "node-notifier": "^10.0.1",
62
- "prettier": "3.2.4",
63
- "rimraf": "^5.0.10",
62
+ "prettier": "^3.5.3",
63
+ "rimraf": "^6.0.1",
64
64
  "terser": "^5.39.0",
65
65
  "ts-jest": "^29.3.2",
66
66
  "ts-node": "^10.9.2",
@@ -71,10 +71,10 @@
71
71
  "typescript": "^5.8.3"
72
72
  },
73
73
  "optionalDependencies": {
74
- "@rollup/rollup-linux-x64-gnu": "4.40.2"
74
+ "@rollup/rollup-linux-x64-gnu": "^4.43.0"
75
75
  },
76
76
  "engines": {
77
- "node": ">=18.0.0"
77
+ "node": ">=22.0.0"
78
78
  },
79
79
  "files": [
80
80
  "dist"