@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/README.md +197 -123
- package/dist/index.cjs +84 -150
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +97 -133
- package/dist/index.d.ts +97 -133
- package/dist/index.js +63 -129
- package/dist/index.js.map +1 -1
- package/package.json +13 -13
package/dist/index.js
CHANGED
|
@@ -1,186 +1,120 @@
|
|
|
1
|
-
var e = Object.defineProperty,
|
|
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
|
|
8
|
+
import { createContext as t } from "react";
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var n, i = t(o);
|
|
11
11
|
|
|
12
|
-
import { useContext as
|
|
12
|
+
import { useContext as c } from "react";
|
|
13
13
|
|
|
14
|
-
function
|
|
15
|
-
return i
|
|
14
|
+
function u() {
|
|
15
|
+
return c(i);
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
function
|
|
19
|
-
return
|
|
18
|
+
function m(e, r) {
|
|
19
|
+
return u().get(e, r?.isOptional, r?.asList);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
function
|
|
23
|
-
return
|
|
22
|
+
function a(...e) {
|
|
23
|
+
return u().getMany(...e);
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
r(u, "useComponentModule"), r(m, "useInject"), r(a, "useInjectMany");
|
|
27
27
|
|
|
28
|
-
import
|
|
28
|
+
import p from "react";
|
|
29
29
|
|
|
30
|
-
|
|
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
|
|
32
|
+
import { useMemo as l } from "react";
|
|
90
33
|
|
|
91
|
-
import {
|
|
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
|
|
97
|
-
o.current && (
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
104
|
-
const o =
|
|
105
|
-
const o = (
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
})
|
|
55
|
+
}), o;
|
|
111
56
|
}
|
|
112
57
|
|
|
113
|
-
|
|
58
|
+
r(M, "useEffectOnce"), r(y, "useMakeOrGetComponentModule");
|
|
114
59
|
|
|
115
|
-
import { isFunction as
|
|
60
|
+
import { isFunction as P } from "@adimm/x-injection";
|
|
116
61
|
|
|
117
62
|
!function(e) {
|
|
118
|
-
function o(e,
|
|
119
|
-
const
|
|
120
|
-
...
|
|
63
|
+
function o(e, r, o) {
|
|
64
|
+
const t = {
|
|
65
|
+
...r
|
|
121
66
|
};
|
|
122
|
-
return ("object" == typeof e && "type" in e &&
|
|
123
|
-
|
|
67
|
+
return ("object" == typeof e && "type" in e && P(e.type) || P(e)) && (t.module = o),
|
|
68
|
+
t;
|
|
124
69
|
}
|
|
125
|
-
|
|
126
|
-
}(
|
|
70
|
+
r(o, "forwardPropsWithModule"), e.forwardPropsWithModule = o;
|
|
71
|
+
}(n || (n = {}));
|
|
127
72
|
|
|
128
|
-
var
|
|
73
|
+
var g = p.memo(b);
|
|
129
74
|
|
|
130
|
-
function
|
|
75
|
+
function w(e, r) {
|
|
131
76
|
return o => {
|
|
132
|
-
const
|
|
133
|
-
return
|
|
134
|
-
value:
|
|
135
|
-
},
|
|
136
|
-
module:
|
|
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:
|
|
83
|
+
component: r
|
|
139
84
|
}));
|
|
140
85
|
};
|
|
141
86
|
}
|
|
142
87
|
|
|
143
|
-
function
|
|
144
|
-
return
|
|
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
|
-
|
|
92
|
+
r(w, "provideModuleToComponent"), r(b, "_ComponentRenderer");
|
|
159
93
|
|
|
160
|
-
import { useMemo as
|
|
94
|
+
import { useMemo as E } from "react";
|
|
161
95
|
|
|
162
|
-
import { InjectionProviderModuleError as
|
|
96
|
+
import { InjectionProviderModuleError as x } from "@adimm/x-injection";
|
|
163
97
|
|
|
164
|
-
var
|
|
98
|
+
var T = class e extends x {
|
|
165
99
|
static {
|
|
166
|
-
|
|
100
|
+
r(this, "InjectionHookFactoryError");
|
|
167
101
|
}
|
|
168
102
|
name=e.name;
|
|
169
103
|
};
|
|
170
104
|
|
|
171
|
-
function
|
|
105
|
+
function I({use: e, inject: r}) {
|
|
172
106
|
return o => {
|
|
173
|
-
const
|
|
174
|
-
if (0 ===
|
|
175
|
-
return
|
|
176
|
-
}
|
|
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: [ ...
|
|
113
|
+
deps: [ ...n ]
|
|
180
114
|
});
|
|
181
115
|
};
|
|
182
116
|
}
|
|
183
117
|
|
|
184
|
-
|
|
118
|
+
r(I, "hookFactory");
|
|
185
119
|
|
|
186
|
-
export {
|
|
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":";;;;AAAA,SAASA,iBAAiB;AAC1B,SAASC,qBAAqB;AAIvB,IAAMC,4CAA4CD,cAAwCD,SAAAA;;;ACLjG,SAASG,kBAAkB;AAMpB,SAASC,qBAAAA;AACd,SAAOC,WAAWC,yCAAAA;AACpB;AAFgBF;;;ACST,SAASG,UAAaC,UAA4BC,SAA0B;AACjF,QAAMC,kBAAkBC,mBAAAA;AAExB,SAAOD,gBAAgBE,IAAIJ,UAAUC,SAASI,UAAAA;AAChD;AAJgBN;;;ACDT,SAASO,iBACXC,MAAmB;AAEtB,QAAMC,kBAAkBC,mBAAAA;AAExB,SAAOD,gBAAgBE,QAAO,GAAIH,IAAAA;AACpC;AANgBD;;;ACdhB,SACEK,gBACAC,gBACAC,6BAIK;AAKA,IAAMC,0BAAN,MAAMA,iCAAgCC,eAAAA;EAZ7C,OAY6CA;;;EACxBC;EACAC;EACAC;EAEnBC,YAAYC,SAAyC;AACnD,UAAMC,aAAaC,OAAO,YAAYF,QAAQC,WAAWE,WAAW,EAAE;AACtE,UAAMC,uBAAuBJ,QAAQK,eAAe,QAAQL,QAAQI,wBAAwB;AAC5F,UAAME,6BAAuEF,uBACzE,oBAAIG,IAAAA,IACJC;AAEJ,UACEC,sBAAsBC,+BAA+B;MACnD,GAAGV;MACHW,cAAcX,QAAQW,gBAAgBC,eAAeC;MACrDZ;MACAa,SAAS,CAACV,uBACNJ,QAAQc,UACRd,QAAQc,SAASC,IAAI,CAACC,QAAAA;AACpB,cAAMC,SAAU,OAAOD,QAAQ,aAAaA,IAAAA,IAAQA;AAEpD,YAAI,CAACZ,qBAAsB,QAAOa;AAElC,eAAO,MAAA;AACL,gBAAMC,YAAYD,OAAOE,uCAAuClB,UAAAA;AAEhEK,qCAA4Bc,IAAIH,OAAOrB,mBAAmByB,SAAQ,GAAIH,SAAAA;AAEtE,iBAAOA;QACT;MACF,CAAA;MACJI,gBAAgB,wBAACC,GAAGC,YAAAA;AAClB,YAAI,CAACpB,qBAAsB,QAAOoB;AAElC,eAAOA,QAAQT,IAAI,CAACU,QAAAA;AAClB,cAAI,EAAEA,eAAe9B,gBAAiB,QAAO8B;AAE7C,gBAAMC,kBAAkBpB,2BAA4BqB,IACjDF,IAAiD7B,mBAAmByB,SAAQ,CAAA;AAG/E,iBAAOK;QACT,CAAA;MACF,GAZgB;IAalB,CAAA,CAAA;AAGF,SAAK9B,qBAAqBI,QAAQC;AAClC,SAAKJ,2BAA2BO;AAChC,SAAKN,2BAA2B;EAClC;EAES8B,UAAgE;AACvE,WAAO;EACT;;EAGSC,MAAM7B,SAA6E;AAC1F,UAAM8B,WAAW9B;AAEjB,UAAM+B,eAAe,IAAIrC,yBACvBe,sBAAsBC,+BAA+B;MACnDsB,aAAa,KAAKA;MAClB3B,cAAc,KAAK4B;MACnBhC,YAAYC,OAAO,KAAKD,WAAWE,YAAa+B,QAAQ,aAAa,EAAA,CAAA;MACrEvB,cAAc,KAAKA,aAAawB;MAChCb,gBAAgB,KAAKA;MACrBc,SAAS,KAAKA;MACdC,WAAW,KAAKA;MAChBjC,sBAAsB,KAAKP;MAC3ByC,sBAAsB,KAAKA;MAC3BxB,SAAS;WAAI,KAAKA;;MAClByB,WAAW;WAAI,KAAKA;;MACpBf,SAAS;WAAI,KAAKA;;MAClB,GAAGM;IACL,CAAA,CAAA;AAIFC,iBAAajC,2BAA2B,KAAKA;AAE7C,WAAOiC;EACT;;EAGA,MAAeS,UAAyB;AACtC,UAAM,MAAMA,QAAAA;EACd;;;;;;;EASUrB,uCAAuCsB,kBAAqD;AACpG,QAAI,KAAK3C,yBAA0B,QAAO;AAE1C,UAAMoB,YAAY,KAAKW,MAAK,EAAGD,QAAO;AAItCV,cAAUjB,aAAaC,OACrB,GAAGuC,mBAAmB,WAAWA,iBAAiBtC,eAAe,SAAA,MAAe,EAAA,iBAAmBe,UAAUjB,WAAWE,WAAW,EAAE;AAEvIe,cAAUpB,2BAA2B;AAErC,WAAOoB;EACT;AAGF;;;AC7HA,OAAOwB,WAAW;;;ACAlB,SAASC,eAAe;;;ACAxB,SAASC,WAAWC,QAAQC,gBAAgB;AAKrC,SAASC,cAAcC,QAAkC;AAC9D,QAAMC,cAAcC,OAA6BC,MAAAA;AACjD,QAAMC,eAAeF,OAAO,KAAA;AAC5B,QAAMG,oBAAoBH,OAAO,KAAA;AACjC,QAAM,CAAA,EAAGI,aAAAA,IAAiBC,SAAS,CAAA;AAEnC,MAAIH,aAAaI,QAASH,mBAAkBG,UAAU;AAEtDC,YAAU,MAAA;AAER,QAAI,CAACL,aAAaI,SAAS;AACzBP,kBAAYO,UAAUR,OAAAA;AACtBI,mBAAaI,UAAU;IACzB;AAGAF,kBAAc,CAACI,MAAMA,IAAI,CAAA;AAEzB,WAAO,MAAA;AAGL,UAAI,CAACL,kBAAkBG,QAAS;AAEhCP,kBAAYO,UAAO;IACrB;EACF,GAAG,CAAA,CAAE;AACP;AA1BgBT;;;ADAT,SAASY,wBACdC,gBACAC,iBAA0C;AAE1C,QAAMC,YAAYC,QAAQ,MAAA;AACxB,UAAMC,UAAUH,mBAAmBD,gBAAgBK,QAAO;AAE1D,QAAID,OAAOE,iBAAkB,QAAOF;AAEpC,WAAOA,OAAOG,uCAAsC;EACtD,GAAG;IAACP;IAAgBC;GAAgB;AAEpCO,gBAAc,MAAA;AACZ,WAAO,MAAA;AACLN,gBAAUO,QAAO;IACnB;EACF,CAAA;AAEA,SAAOP;AACT;AAnBgBH;;;AELhB,SAASW,kBAAkB;UAKVC,iCAAAA;AACR,WAASC,uBACdC,WACAC,OACAC,QAAgC;AAEhC,UAAMC,iBAAiB,OAAOH,cAAc,YAAY,UAAUA;AAElE,UAAMI,SAAS;MACb,GAAGH;IACL;AAEA,QAAKE,kBAAkBE,WAAWL,UAAUM,IAAI,KAAMD,WAAWL,SAAAA,GAAY;AAC3EI,aAAO,QAAA,IAAYF;IACrB;AAEA,WAAOE;EACT;AAhBgBL;kCAAAA,yBAAAA;AAiBlB,GAlBiBD,mCAAAA,iCAAAA,CAAAA,EAAAA;;;;AHCjB,IAAMS,oBAAoBC,sBAAMC,KAAKC,kBAAAA;AA6B9B,SAASC,yBAGdC,QAAkCC,WAA4C;AAC9E,SAAQ,CAACC,mBAAAA;AACP,UAAMC,YAAYC,wBAAwBJ,QAAQE,eAAeF,MAAM;AAEvE,WACE,sBAAA,cAACK,0CAA0CC,UAAQ;MAACC,OAAOJ;OACzD,sBAAA,cAACR,mBAAAA;MAAkBK,QAAQG;MAAWD;MAAgCD;;EAG5E;AACF;AAbgBF;AAehB,SAASD,mBAAkD,EACzDE,QACAC,WACAC,eAAc,GAKf;AACC,SAAO,sBAAA,cAAA,MAAA,UAAA,MAAGD,UAAUO,+BAA+BC,uBAAuBR,WAAWC,gBAAgBF,MAAAA,CAAAA,CAAAA;AACvG;AAVSF;;;AIlDT,OAAOY,UAASC,WAAAA,gBAAe;AAkCxB,SAASC,cAAc,EAAEC,QAAQC,SAAQ,GAA+B;AAE7E,QAAMC,iBAAkBD,SAASE,SAAS,CAAC;AAC3C,QAAMC,YAAYC,wBAAwBL,QAAQE,eAAeF,MAAM;AACvE,QAAMM,YAAYC,SAChB,MACEC,gBAAAA,OAAMC,aACJR,UACAS,+BAA+BC,uBAAuBV,UAAUC,gBAAgBE,SAAAA,CAAAA,GAEpF;IAACF;IAAgBE;GAAU;AAG7B,SACE,gBAAAI,OAAA,cAACI,0CAA0CC,UAAQ;IAACC,OAAOV;KACxDE,SAAAA;AAGP;AAlBgBP;;;ACjChB,SAASgB,WAAAA,gBAAe;;;ACDxB,SAASC,oCAAoC;AAEtC,IAAMC,4BAAN,MAAMA,mCAAkCC,6BAAAA;EAF/C,OAE+CA;;;EACpCC,OAAOF,2BAA0BE;AAC5C;;;ADEO,SAASC,YAAsD,EACpEC,KAAKC,MACLC,OAAM,GACqB;AAC3B,SAAO,CAACC,MAAAA;AACN,UAAMC,kBAAkBC,mBAAAA;AAExB,UAAMC,OAAOC,SAAQ,MAAA;AACnB,UAAIL,OAAOM,WAAW,GAAG;AACvB,cAAM,IAAIC,0BAA0BL,iBAAiB,uCAAuC;MAC9F;AAEA,aAAOA,gBAAgBM,QAAO,GAAIR,MAAAA;IACpC,GAAG;MAACA;KAAO;AAEX,WAAOD,KAAK;MAAE,GAAGE;MAAGG,MAAM;WAAIA;;IAAM,CAAA;EACtC;AACF;AAjBgBP;","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.
|
|
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": "^
|
|
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.
|
|
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/
|
|
50
|
-
"@types/jest": "^
|
|
49
|
+
"@tsconfig/node22": "^22.0.2",
|
|
50
|
+
"@types/jest": "^30.0.0",
|
|
51
51
|
"@types/react": "^19.1.2",
|
|
52
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
52
|
+
"@typescript-eslint/eslint-plugin": "^8.34.1",
|
|
53
53
|
"eslint": "^8.57.1",
|
|
54
|
-
"eslint-config-prettier": "^
|
|
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": "^
|
|
60
|
-
"jest-environment-jsdom": "^
|
|
59
|
+
"jest": "^30.0.0",
|
|
60
|
+
"jest-environment-jsdom": "^30.0.0",
|
|
61
61
|
"node-notifier": "^10.0.1",
|
|
62
|
-
"prettier": "3.
|
|
63
|
-
"rimraf": "^
|
|
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.
|
|
74
|
+
"@rollup/rollup-linux-x64-gnu": "^4.43.0"
|
|
75
75
|
},
|
|
76
76
|
"engines": {
|
|
77
|
-
"node": ">=
|
|
77
|
+
"node": ">=22.0.0"
|
|
78
78
|
},
|
|
79
79
|
"files": [
|
|
80
80
|
"dist"
|