react-chain-of-responsibility 0.3.1-main.cc0a3ac → 0.4.0-main.2a72139
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 +13 -1
- package/dist/{chunk-RAUACXXD.mjs → chunk-U4UF7NZV.mjs} +24 -35
- package/dist/chunk-U4UF7NZV.mjs.map +1 -0
- package/dist/index-Dm_KqEiI.d.mts +66 -0
- package/dist/index-Dm_KqEiI.d.ts +66 -0
- package/dist/react-chain-of-responsibility.d.mts +3 -72
- package/dist/react-chain-of-responsibility.d.ts +3 -72
- package/dist/react-chain-of-responsibility.fluentUI.d.mts +6 -2
- package/dist/react-chain-of-responsibility.fluentUI.d.ts +6 -2
- package/dist/react-chain-of-responsibility.fluentUI.js +29 -36
- package/dist/react-chain-of-responsibility.fluentUI.js.map +1 -1
- package/dist/react-chain-of-responsibility.fluentUI.mjs +8 -4
- package/dist/react-chain-of-responsibility.fluentUI.mjs.map +1 -1
- package/dist/react-chain-of-responsibility.js +24 -35
- package/dist/react-chain-of-responsibility.js.map +1 -1
- package/dist/react-chain-of-responsibility.mjs +3 -3
- package/dist/react-chain-of-responsibility.preview.d.mts +80 -0
- package/dist/react-chain-of-responsibility.preview.d.ts +80 -0
- package/dist/react-chain-of-responsibility.preview.js +201 -0
- package/dist/react-chain-of-responsibility.preview.js.map +1 -0
- package/dist/react-chain-of-responsibility.preview.mjs +171 -0
- package/dist/react-chain-of-responsibility.preview.mjs.map +1 -0
- package/package.json +53 -16
- package/preview.js +1 -0
- package/dist/chunk-RAUACXXD.mjs.map +0 -1
|
@@ -38,19 +38,19 @@ module.exports = __toCommonJS(index_fluentUI_exports);
|
|
|
38
38
|
var import_react2 = __toESM(require("react"));
|
|
39
39
|
|
|
40
40
|
// src/createChainOfResponsibility.tsx
|
|
41
|
+
var import_handler_chain = require("handler-chain");
|
|
41
42
|
var import_react = __toESM(require("react"));
|
|
42
43
|
|
|
43
44
|
// src/isReactComponent.ts
|
|
45
|
+
var import_valibot = require("valibot");
|
|
44
46
|
function isConsumer(component) {
|
|
45
|
-
|
|
46
|
-
return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.context)";
|
|
47
|
+
return component?.$$typeof?.toString() === "Symbol(react.context)";
|
|
47
48
|
}
|
|
48
49
|
function isProvider(component) {
|
|
49
|
-
|
|
50
|
-
return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.provider)";
|
|
50
|
+
return component?.$$typeof?.toString() === "Symbol(react.provider)";
|
|
51
51
|
}
|
|
52
52
|
function isFragment(component) {
|
|
53
|
-
return
|
|
53
|
+
return component?.toString() === "Symbol(react.fragment)";
|
|
54
54
|
}
|
|
55
55
|
function isFunctionComponent(component) {
|
|
56
56
|
if (typeof component === "function") {
|
|
@@ -59,28 +59,15 @@ function isFunctionComponent(component) {
|
|
|
59
59
|
return isPureFunctionComponent(component);
|
|
60
60
|
}
|
|
61
61
|
function isPureFunctionComponent(component) {
|
|
62
|
-
|
|
63
|
-
return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.memo)" && isFunctionComponent(component.type);
|
|
62
|
+
return component?.$$typeof?.toString() === "Symbol(react.memo)" && isFunctionComponent(component.type);
|
|
64
63
|
}
|
|
65
64
|
function isComponentClass(component) {
|
|
66
|
-
return typeof component === "object" && typeof
|
|
65
|
+
return typeof component === "object" && typeof component?.["render"] === "function";
|
|
67
66
|
}
|
|
68
67
|
function isReactComponent(component) {
|
|
69
68
|
return isFunctionComponent(component) || isComponentClass(component) || isFragment(component) || isConsumer(component) || isProvider(component);
|
|
70
69
|
}
|
|
71
|
-
|
|
72
|
-
// src/private/compose.ts
|
|
73
|
-
function compose(...fns) {
|
|
74
|
-
return (fn) => fns.reduce((chain, fn2) => fn2(chain), fn);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// src/private/applyMiddleware.ts
|
|
78
|
-
function applyMiddleware(...arrayOfMiddleware) {
|
|
79
|
-
return (...init) => {
|
|
80
|
-
const chain = arrayOfMiddleware.map((middleware) => middleware(...init));
|
|
81
|
-
return compose(...chain);
|
|
82
|
-
};
|
|
83
|
-
}
|
|
70
|
+
var isReactComponent_default = isReactComponent;
|
|
84
71
|
|
|
85
72
|
// src/createChainOfResponsibility.tsx
|
|
86
73
|
function createChainOfResponsibility(options = {}) {
|
|
@@ -88,11 +75,11 @@ function createChainOfResponsibility(options = {}) {
|
|
|
88
75
|
get enhancer() {
|
|
89
76
|
return void 0;
|
|
90
77
|
},
|
|
91
|
-
useBuildComponentCallback(
|
|
92
|
-
if (options2
|
|
93
|
-
|
|
78
|
+
useBuildComponentCallback(_request, options2) {
|
|
79
|
+
if (!options2?.fallbackComponent) {
|
|
80
|
+
throw new Error("This component/hook cannot be used outside of its corresponding <Provider>");
|
|
94
81
|
}
|
|
95
|
-
|
|
82
|
+
return options2.fallbackComponent;
|
|
96
83
|
}
|
|
97
84
|
};
|
|
98
85
|
const context = (0, import_react.createContext)(defaultUseBuildComponentCallback);
|
|
@@ -117,7 +104,7 @@ function createChainOfResponsibility(options = {}) {
|
|
|
117
104
|
hasReturned = true;
|
|
118
105
|
if ((0, import_react.isValidElement)(returnValue)) {
|
|
119
106
|
throw new Error("middleware must not return React element directly");
|
|
120
|
-
} else if (returnValue !== false && returnValue !== null && typeof returnValue !== "undefined" && !
|
|
107
|
+
} else if (returnValue !== false && returnValue !== null && typeof returnValue !== "undefined" && !isReactComponent_default(returnValue)) {
|
|
121
108
|
throw new Error(
|
|
122
109
|
"middleware must return false, null, undefined, function component, or class component"
|
|
123
110
|
);
|
|
@@ -132,8 +119,8 @@ function createChainOfResponsibility(options = {}) {
|
|
|
132
119
|
// We are reversing because it is easier to read:
|
|
133
120
|
// - With reverse, [a, b, c] will become a(b(c(fn)))
|
|
134
121
|
// - Without reverse, [a, b, c] will become c(b(a(fn)))
|
|
135
|
-
applyMiddleware(
|
|
136
|
-
...[...patchedMiddleware, ...parentEnhancer ? [() => parentEnhancer] : []]
|
|
122
|
+
(0, import_handler_chain.applyMiddleware)(
|
|
123
|
+
...[...patchedMiddleware, ...parentEnhancer ? [() => parentEnhancer] : []]
|
|
137
124
|
)(init)
|
|
138
125
|
),
|
|
139
126
|
[init, middleware, parentEnhancer]
|
|
@@ -149,10 +136,10 @@ function createChainOfResponsibility(options = {}) {
|
|
|
149
136
|
return /* @__PURE__ */ import_react.default.createElement(context.Provider, { value: contextValue }, children);
|
|
150
137
|
}
|
|
151
138
|
const useBuildComponentCallback = () => (0, import_react.useContext)(context).useBuildComponentCallback;
|
|
152
|
-
function Proxy2({
|
|
139
|
+
function Proxy2({ fallbackComponent, request, ...props }) {
|
|
153
140
|
const enhancer = useBuildComponentCallback();
|
|
154
141
|
const Component = enhancer(request, { fallbackComponent });
|
|
155
|
-
return Component ? /* @__PURE__ */ import_react.default.createElement(Component, { ...props }
|
|
142
|
+
return Component ? /* @__PURE__ */ import_react.default.createElement(Component, { ...props }) : null;
|
|
156
143
|
}
|
|
157
144
|
const asMiddleware = (MiddlewareComponent) => (init) => (next) => (request) => {
|
|
158
145
|
const RawNextComponent = next(request);
|
|
@@ -172,29 +159,35 @@ function createChainOfResponsibility(options = {}) {
|
|
|
172
159
|
MiddlewareOf.displayName = `MiddlewareOf<${MiddlewareComponent.displayName || ""}>`;
|
|
173
160
|
return (0, import_react.memo)(MiddlewareOf);
|
|
174
161
|
};
|
|
175
|
-
return {
|
|
162
|
+
return Object.freeze({
|
|
176
163
|
asMiddleware,
|
|
177
164
|
Provider: (0, import_react.memo)(ChainOfResponsibilityProvider),
|
|
178
165
|
Proxy: (0, import_react.memo)(Proxy2),
|
|
179
|
-
types: {
|
|
166
|
+
types: Object.freeze({
|
|
180
167
|
middlewareComponentProps: void 0,
|
|
181
168
|
init: void 0,
|
|
182
169
|
middleware: void 0,
|
|
183
170
|
props: void 0,
|
|
171
|
+
proxyProps: void 0,
|
|
184
172
|
request: void 0
|
|
185
|
-
},
|
|
173
|
+
}),
|
|
186
174
|
useBuildComponentCallback
|
|
187
|
-
};
|
|
175
|
+
});
|
|
188
176
|
}
|
|
177
|
+
var createChainOfResponsibility_default = createChainOfResponsibility;
|
|
189
178
|
|
|
190
179
|
// src/createChainOfResponsibilityForFluentUI.tsx
|
|
191
180
|
function createChainOfResponsibilityForFluentUI(options) {
|
|
192
|
-
const returnValue =
|
|
181
|
+
const returnValue = createChainOfResponsibility_default(options);
|
|
193
182
|
const { Proxy: Proxy2 } = returnValue;
|
|
194
183
|
const useBuildRenderFunction = (options2 = {}) => {
|
|
195
184
|
const { getKey } = options2;
|
|
196
185
|
return (0, import_react2.useCallback)(
|
|
197
|
-
(props, defaultRender) =>
|
|
186
|
+
(props, defaultRender) => (
|
|
187
|
+
// We no longer validate the correctness of this function.
|
|
188
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
189
|
+
/* @__PURE__ */ import_react2.default.createElement(Proxy2, { ...props, fallbackComponent: defaultRender, key: getKey?.(props), request: props })
|
|
190
|
+
),
|
|
198
191
|
[getKey]
|
|
199
192
|
);
|
|
200
193
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.fluentUI.ts","../src/createChainOfResponsibilityForFluentUI.tsx","../src/createChainOfResponsibility.tsx","../src/isReactComponent.ts","../src/private/compose.ts","../src/private/applyMiddleware.ts"],"sourcesContent":["import createChainOfResponsibilityForFluentUI from './createChainOfResponsibilityForFluentUI.tsx';\n\nexport { createChainOfResponsibilityForFluentUI };\n","import { type IRenderFunction } from '@fluentui/react';\nimport React, { useCallback, type Key } from 'react';\n\nimport createChainOfResponsibility from './createChainOfResponsibility.tsx';\n\ntype UseBuildRenderFunctionOptions<Props> = { getKey?: (props: Props | undefined) => Key };\n\ntype UseBuildRenderFunction<Props> = (options?: UseBuildRenderFunctionOptions<Props>) => IRenderFunction<Props>;\n\n// We are using the props as both \"Request\" and \"Props\".\n// This should eases migration from `onRender` to chain of responsibility.\n// Downside is, web developers could accidentally pass request as props and not honoring props modified by upstreamers.\nexport default function createChainOfResponsibilityForFluentUI<Props extends object, Init = undefined>(\n options?: Parameters<typeof createChainOfResponsibility>[0]\n): ReturnType<typeof createChainOfResponsibility<Props | undefined, Props, Init>> & {\n useBuildRenderFunction: UseBuildRenderFunction<Props>;\n} {\n const returnValue = createChainOfResponsibility<Props | undefined, Props, Init>(options);\n\n const { Proxy } = returnValue;\n\n const useBuildRenderFunction: UseBuildRenderFunction<Props> = (options = {}) => {\n const { getKey } = options;\n\n return useCallback<IRenderFunction<Props>>(\n (props, defaultRender) => (\n <Proxy {...(props as Props)} fallbackComponent={defaultRender} key={getKey?.(props)} request={props} />\n ),\n [getKey]\n );\n };\n\n return { ...returnValue, useBuildRenderFunction };\n}\n","import React, {\n createContext,\n isValidElement,\n memo,\n useCallback,\n useContext,\n useMemo,\n type ComponentType,\n type PropsWithChildren\n} from 'react';\n\nimport isReactComponent from './isReactComponent.ts';\nimport applyMiddleware, { type Enhancer } from './private/applyMiddleware.ts';\nimport { type ComponentMiddleware } from './types.ts';\n\n// TODO: Simplify to ComponentType<Props> | undefined.\ntype ResultComponent<Props> = ComponentType<Props> | false | null | undefined;\n\ntype UseBuildComponentCallbackOptions<Props> = { fallbackComponent?: ResultComponent<Props> };\n\ntype UseBuildComponentCallback<Request, Props> = (\n request: Request,\n options?: UseBuildComponentCallbackOptions<Props>\n) => ComponentType<Props> | undefined;\n\ntype ProviderContext<Request, Props> = {\n get enhancer(): Enhancer<[Request], ResultComponent<Props>> | undefined;\n useBuildComponentCallback: UseBuildComponentCallback<Request, Props>;\n};\n\ntype ProviderProps<Request, Props, Init> = PropsWithChildren<{\n middleware: readonly ComponentMiddleware<Request, Props, Init>[];\n}> &\n (Init extends never | void ? { init?: undefined } : Init extends undefined ? { init?: Init } : { init: Init });\n\ntype ProxyProps<Request, Props extends object> = PropsWithChildren<\n Request extends never | void\n ? Props & { fallbackComponent?: ComponentType<Props>; request?: undefined }\n : Request extends undefined\n ? Props & { fallbackComponent?: ComponentType<Props>; request?: Request }\n : Props & { fallbackComponent?: ComponentType<Props>; request: Request }\n>;\n\ntype Options = {\n /**\n * Allows a middleware to pass another request object when calling its next middleware. Default is false.\n *\n * However, middleware could modify the request object before calling its next middleware. It is recommended\n * to use Object.freeze() to prevent middleware from modifying the request object.\n */\n passModifiedRequest?: boolean;\n};\n\ntype MiddlewareProps<Request, Props, Init> = Readonly<{\n init: Init;\n Next: ComponentType<Partial<Props>>;\n request: Request;\n}>;\n\ntype MiddlewareComponentProps<Request, Props, Init> = Props &\n Readonly<{ middleware: MiddlewareProps<Request, Props, Init> }>;\n\nexport default function createChainOfResponsibility<\n Request = undefined,\n Props extends object = Readonly<{ children?: never }>,\n Init = undefined\n>(\n options: Options = {}\n): {\n asMiddleware: (\n middlewareComponent: ComponentType<MiddlewareComponentProps<Request, Props, Init>>\n ) => ComponentMiddleware<Request, Props, Init>;\n Provider: ComponentType<ProviderProps<Request, Props, Init>>;\n Proxy: ComponentType<ProxyProps<Request, Props>>;\n types: {\n init: Init;\n middleware: ComponentMiddleware<Request, Props, Init>;\n middlewareComponentProps: MiddlewareComponentProps<Request, Props, Init>;\n props: Props;\n request: Request;\n };\n useBuildComponentCallback: () => UseBuildComponentCallback<Request, Props>;\n} {\n const defaultUseBuildComponentCallback: ProviderContext<Request, Props> = {\n get enhancer() {\n return undefined;\n },\n useBuildComponentCallback(_, options) {\n if (options?.fallbackComponent) {\n return options.fallbackComponent;\n }\n\n throw new Error('This component/hook cannot be used outside of its corresponding <Provider>');\n }\n };\n\n const context = createContext<ProviderContext<Request, Props>>(defaultUseBuildComponentCallback);\n\n function ChainOfResponsibilityProvider({ children, init, middleware }: ProviderProps<Request, Props, Init>) {\n // TODO: Related to https://github.com/microsoft/TypeScript/issues/17002.\n // typescript@5.2.2 has a bug, Array.isArray() is a type predicate but only works with mutable array, not readonly array.\n // After removing \"as unknown\", `middleware` on the next line become `any[]`.\n if (!Array.isArray(middleware as unknown) || middleware.some(middleware => typeof middleware !== 'function')) {\n throw new Error('middleware prop must be an array of functions');\n }\n\n const patchedMiddleware: readonly ComponentMiddleware<Request, Props, Init>[] = Object.freeze(\n middleware\n ? middleware.map(fn => (init: Init) => {\n const enhancer = fn(init);\n\n return (next: (request: Request) => ComponentType<Props> | false | null | undefined) =>\n (originalRequest: Request) => {\n // False positive: although we did not re-assign the variable from true, it was initialized as undefined.\n // eslint-disable-next-line prefer-const\n let hasReturned: boolean;\n\n const returnValue = enhancer(nextRequest => {\n if (hasReturned) {\n throw new Error('next() cannot be called after the function had returned synchronously');\n }\n\n !options.passModifiedRequest &&\n nextRequest !== originalRequest &&\n console.warn(\n 'react-chain-of-responsibility: \"options.passModifiedRequest\" must be set to true to pass a different request object to next().'\n );\n\n return next(options.passModifiedRequest ? nextRequest : originalRequest);\n })(originalRequest);\n\n hasReturned = true;\n\n if (isValidElement(returnValue)) {\n throw new Error('middleware must not return React element directly');\n } else if (\n returnValue !== false &&\n returnValue !== null &&\n typeof returnValue !== 'undefined' &&\n !isReactComponent(returnValue)\n ) {\n throw new Error(\n 'middleware must return false, null, undefined, function component, or class component'\n );\n }\n\n return returnValue;\n };\n })\n : []\n );\n\n const { enhancer: parentEnhancer } = useContext(context);\n\n const enhancer = useMemo(\n () =>\n // We are reversing because it is easier to read:\n // - With reverse, [a, b, c] will become a(b(c(fn)))\n // - Without reverse, [a, b, c] will become c(b(a(fn)))\n applyMiddleware<[Request], ResultComponent<Props>, [Init]>(\n ...[...patchedMiddleware, ...(parentEnhancer ? [() => parentEnhancer] : [])].reverse()\n )(init as Init),\n [init, middleware, parentEnhancer]\n );\n\n const useBuildComponentCallback = useCallback<UseBuildComponentCallback<Request, Props>>(\n (request, options = {}) => enhancer(() => options.fallbackComponent)(request) || undefined,\n [enhancer]\n );\n\n const contextValue = useMemo<ProviderContext<Request, Props>>(\n () => ({ enhancer, useBuildComponentCallback }),\n [enhancer, useBuildComponentCallback]\n );\n\n return <context.Provider value={contextValue}>{children}</context.Provider>;\n }\n\n const useBuildComponentCallback = () => useContext(context).useBuildComponentCallback;\n\n function Proxy({ children, fallbackComponent, request, ...props }: ProxyProps<Request, Props>) {\n const enhancer = useBuildComponentCallback();\n const Component = enhancer(request as Request, { fallbackComponent });\n\n return Component ? <Component {...(props as Props)}>{children}</Component> : null;\n }\n\n const asMiddleware: (\n middlewareComponent: ComponentType<MiddlewareComponentProps<Request, Props, Init>>\n ) => ComponentMiddleware<Request, Props, Init> =\n (\n MiddlewareComponent: ComponentType<MiddlewareComponentProps<Request, Props, Init>>\n ): ComponentMiddleware<Request, Props, Init> =>\n init =>\n next =>\n request => {\n const RawNextComponent = next(request);\n\n // TODO: Can we pre-build this component during init?\n const MiddlewareOf = (props: Props) => {\n const middleware = useMemo(\n () =>\n Object.freeze({\n init,\n Next: memo<Partial<Props>>(\n RawNextComponent\n ? (overridingProps: Partial<Props>) => <RawNextComponent {...props} {...overridingProps} />\n : () => null\n ),\n request\n }),\n []\n );\n\n return <MiddlewareComponent {...props} middleware={middleware} />;\n };\n\n MiddlewareOf.displayName = `MiddlewareOf<${MiddlewareComponent.displayName || ''}>`;\n\n return memo<Props>(MiddlewareOf);\n };\n\n return {\n asMiddleware,\n Provider: memo<ProviderProps<Request, Props, Init>>(ChainOfResponsibilityProvider),\n Proxy: memo<ProxyProps<Request, Props>>(Proxy),\n types: {\n middlewareComponentProps: undefined as unknown as MiddlewareComponentProps<Request, Props, Init>,\n init: undefined as unknown as Init,\n middleware: undefined as unknown as ComponentMiddleware<Request, Props, Init>,\n props: undefined as unknown as Props,\n request: undefined as unknown as Request\n },\n useBuildComponentCallback\n };\n}\n","import {\n type ComponentClass,\n type ComponentType,\n type Consumer,\n type Fragment,\n type FunctionComponent,\n type Provider\n} from 'react';\n\nfunction isConsumer(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is Consumer<unknown> {\n return component?.$$typeof?.toString() === 'Symbol(react.context)';\n}\n\nfunction isProvider(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is Provider<unknown> {\n return component?.$$typeof?.toString() === 'Symbol(react.provider)';\n}\n\nfunction isFragment(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is typeof Fragment {\n return component?.toString() === 'Symbol(react.fragment)';\n}\n\nfunction isFunctionComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is FunctionComponent {\n if (typeof component === 'function') {\n return true;\n }\n\n return isPureFunctionComponent(component);\n}\n\nfunction isPureFunctionComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is FunctionComponent {\n return component?.$$typeof?.toString() === 'Symbol(react.memo)' && isFunctionComponent(component.type);\n}\n\nfunction isComponentClass(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is ComponentClass {\n return typeof component === 'object' && typeof component?.['render'] === 'function';\n}\n\n// There are no definitive ways to check if an object is a React component or not.\n// We are checking if the object has a render function (classic component).\n// Note: \"forwardRef()\" returns plain object, not class instance.\nexport default function isReactComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is ComponentType {\n return (\n isFunctionComponent(component) ||\n isComponentClass(component) ||\n isFragment(component) ||\n isConsumer(component) ||\n isProvider(component)\n );\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Fn<P extends any[], R> = (...args: P) => R;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Enhancer<P extends any[], R> = (next: Fn<P, R>) => Fn<P, R>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function compose<P extends any[], R>(...fns: Enhancer<P, R>[]): Enhancer<P, R> {\n return (fn: Fn<P, R>): Fn<P, R> => fns.reduce((chain, fn) => fn(chain), fn);\n}\n","import compose from './compose.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Fn<P extends any[], R> = (...args: P) => R;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Enhancer<P extends any[], R> = (next: Fn<P, R>) => Fn<P, R>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Middleware<P extends any[], R, S extends any[]> = (...init: S) => Enhancer<P, R>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function applyMiddleware<P extends any[], R, S extends any[]>(\n ...arrayOfMiddleware: Middleware<P, R, S>[]\n) {\n return (...init: S) => {\n const chain = arrayOfMiddleware.map(middleware => middleware(...init));\n\n return compose(...chain);\n };\n}\n"],"mappings":"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","names":["import_react","fn","options","middleware","init","enhancer","useBuildComponentCallback","React","Proxy","Proxy","options","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.fluentUI.ts","../src/createChainOfResponsibilityForFluentUI.tsx","../src/createChainOfResponsibility.tsx","../src/isReactComponent.ts"],"sourcesContent":["// eslint-disable-next-line import/no-deprecated\nimport createChainOfResponsibilityForFluentUI from './createChainOfResponsibilityForFluentUI.tsx';\n\n// eslint-disable-next-line import/no-deprecated\nexport { createChainOfResponsibilityForFluentUI };\n","import { type IRenderFunction } from '@fluentui/react';\nimport React, { useCallback, type Key } from 'react';\n\nimport createChainOfResponsibility, {\n type CreateChainOfResponsibilityOptions\n} from './createChainOfResponsibility.tsx';\n\ntype UseBuildRenderFunctionOptions<Props> = { getKey?: (props: Props | undefined) => Key };\n\ntype UseBuildRenderFunction<Props> = (options?: UseBuildRenderFunctionOptions<Props>) => IRenderFunction<Props>;\n\n// We are using the props as both \"Request\" and \"Props\".\n// This should eases migration from `onRender` to chain of responsibility.\n// Downside is, web developers could accidentally pass request as props and not honoring props modified by upstreamers.\n\n/**\n * @deprecated Fluent UI v9 no longer use `IRenderFunction` for custom render. We no longer validate the correctness of this function.\n */\nexport default function createChainOfResponsibilityForFluentUI<Props extends object, Init = undefined>(\n options?: CreateChainOfResponsibilityOptions\n): ReturnType<typeof createChainOfResponsibility<Props | undefined, Props, Init>> & {\n useBuildRenderFunction: UseBuildRenderFunction<Props>;\n} {\n // We no longer validate the correctness of this function.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const returnValue = createChainOfResponsibility<Props | undefined, Props, Init>(options as any);\n\n const { Proxy } = returnValue;\n\n const useBuildRenderFunction: UseBuildRenderFunction<Props> = (options = {}) => {\n const { getKey } = options;\n\n return useCallback<IRenderFunction<Props>>(\n (props, defaultRender) => (\n // We no longer validate the correctness of this function.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n <Proxy {...(props as Props)} fallbackComponent={defaultRender as any} key={getKey?.(props)} request={props} />\n ),\n [getKey]\n );\n };\n\n // We no longer validate the correctness of this function.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...returnValue, useBuildRenderFunction } as any;\n}\n","import { applyMiddleware } from 'handler-chain';\nimport React, {\n createContext,\n isValidElement,\n memo,\n useCallback,\n useContext,\n useMemo,\n type ComponentType,\n type PropsWithChildren\n} from 'react';\n\nimport isReactComponent from './isReactComponent.ts';\nimport { type ComponentEnhancer, type ComponentMiddleware } from './types.ts';\n\n// TODO: Simplify to ComponentType<Props> | undefined.\ntype ResultComponent<Props> = ComponentType<Props> | false | null | undefined;\n\ntype UseBuildComponentCallbackOptions<Props> = {\n fallbackComponent?: ResultComponent<Props> | undefined;\n};\n\ninterface UseBuildComponentCallback<Request, Props> {\n (request: Request, options?: undefined | UseBuildComponentCallbackOptions<Props>): ComponentType<Props> | undefined;\n}\n\ntype ProviderContext<Request, Props> = {\n get enhancer(): ComponentEnhancer<Request, Props> | undefined;\n useBuildComponentCallback: UseBuildComponentCallback<Request, Props>;\n};\n\ntype ProviderProps<Request, Props, Init> = PropsWithChildren<{\n middleware: readonly ComponentMiddleware<Request, Props, Init>[];\n}> &\n (Init extends never | void\n ? { readonly init?: undefined }\n : Init extends undefined | void\n ? { readonly init?: Init }\n : { readonly init: Init });\n\ntype ProxyProps<Request, Props extends object> = Props & {\n readonly fallbackComponent?: ComponentType<Props> | undefined;\n readonly request: Request;\n};\n\ntype CreateChainOfResponsibilityOptions = {\n /**\n * Allows a middleware to pass another request object when calling its next middleware. Default is false.\n *\n * However, middleware could modify the request object before calling its next middleware. It is recommended\n * to use Object.freeze() to prevent middleware from modifying the request object.\n */\n readonly passModifiedRequest?: boolean | undefined;\n};\n\ntype AsMiddlewareProps<Request, Props, Init> = {\n readonly init: Init;\n readonly Next: ComponentType<Partial<Props>>;\n readonly request: Request;\n};\n\ntype AsMiddlewareComponentProps<Request, Props, Init> = Props & {\n readonly middleware: AsMiddlewareProps<Request, Props, Init>;\n};\n\ntype ChainOfResponsibility<Request, Props extends object, Init> = {\n readonly asMiddleware: (\n middlewareComponent: ComponentType<AsMiddlewareComponentProps<Request, Props, Init>>\n ) => ComponentMiddleware<Request, Props, Init>;\n readonly Provider: ComponentType<ProviderProps<Request, Props, Init>>;\n readonly Proxy: ComponentType<ProxyProps<Request, Props>>;\n readonly types: {\n readonly init: Init;\n readonly middleware: ComponentMiddleware<Request, Props, Init>;\n readonly middlewareComponentProps: AsMiddlewareComponentProps<Request, Props, Init>;\n readonly props: Props;\n readonly proxyProps: ProxyProps<Request, Props>;\n readonly request: Request;\n };\n readonly useBuildComponentCallback: () => UseBuildComponentCallback<Request, Props>;\n};\n\nfunction createChainOfResponsibility<Request = void, Props extends object = { readonly children?: never }, Init = void>(\n options: CreateChainOfResponsibilityOptions = {}\n): ChainOfResponsibility<Request, Props, Init> {\n const defaultUseBuildComponentCallback: ProviderContext<Request, Props> = {\n get enhancer() {\n return undefined;\n },\n useBuildComponentCallback(_request, options): ComponentType<Props> {\n if (!options?.fallbackComponent) {\n throw new Error('This component/hook cannot be used outside of its corresponding <Provider>');\n }\n\n return options.fallbackComponent;\n }\n };\n\n const context = createContext<ProviderContext<Request, Props>>(defaultUseBuildComponentCallback);\n\n function ChainOfResponsibilityProvider({ children, init, middleware }: ProviderProps<Request, Props, Init>) {\n // TODO: Related to https://github.com/microsoft/TypeScript/issues/17002.\n // typescript@5.2.2 has a bug, Array.isArray() is a type predicate but only works with mutable array, not readonly array.\n // After removing \"as unknown\", `middleware` on the next line become `any[]`.\n if (!Array.isArray(middleware as unknown) || middleware.some(middleware => typeof middleware !== 'function')) {\n throw new Error('middleware prop must be an array of functions');\n }\n\n const patchedMiddleware: readonly ComponentMiddleware<Request, Props, Init>[] = Object.freeze(\n middleware\n ? middleware.map(fn => (init: Init) => {\n const enhancer = fn(init);\n\n return (next: (request: Request) => ComponentType<Props> | false | null | undefined) =>\n (originalRequest: Request) => {\n // False positive: although we did not re-assign the variable from true, it was initialized as undefined.\n // eslint-disable-next-line prefer-const\n let hasReturned: boolean;\n\n const returnValue = enhancer(nextRequest => {\n if (hasReturned) {\n throw new Error('next() cannot be called after the function had returned synchronously');\n }\n\n !options.passModifiedRequest &&\n nextRequest !== originalRequest &&\n console.warn(\n 'react-chain-of-responsibility: \"options.passModifiedRequest\" must be set to true to pass a different request object to next().'\n );\n\n return next(options.passModifiedRequest ? nextRequest : originalRequest);\n })(originalRequest);\n\n hasReturned = true;\n\n if (isValidElement(returnValue)) {\n throw new Error('middleware must not return React element directly');\n } else if (\n returnValue !== false &&\n returnValue !== null &&\n typeof returnValue !== 'undefined' &&\n !isReactComponent(returnValue)\n ) {\n throw new Error(\n 'middleware must return false, null, undefined, function component, or class component'\n );\n }\n\n return returnValue;\n };\n })\n : []\n );\n\n const { enhancer: parentEnhancer } = useContext(context);\n\n const enhancer = useMemo(\n () =>\n // We are reversing because it is easier to read:\n // - With reverse, [a, b, c] will become a(b(c(fn)))\n // - Without reverse, [a, b, c] will become c(b(a(fn)))\n applyMiddleware<ResultComponent<Props>, Request, Init>(\n ...[...patchedMiddleware, ...(parentEnhancer ? [() => parentEnhancer] : [])]\n )(init as Init),\n [init, middleware, parentEnhancer]\n );\n\n const useBuildComponentCallback = useCallback<UseBuildComponentCallback<Request, Props>>(\n (request, options = {}) => enhancer(() => options.fallbackComponent)(request) || undefined,\n [enhancer]\n );\n\n const contextValue = useMemo<ProviderContext<Request, Props>>(\n () => ({ enhancer, useBuildComponentCallback }),\n [enhancer, useBuildComponentCallback]\n );\n\n return <context.Provider value={contextValue}>{children}</context.Provider>;\n }\n\n const useBuildComponentCallback = () => useContext(context).useBuildComponentCallback;\n\n function Proxy({ fallbackComponent, request, ...props }: ProxyProps<Request, Props>) {\n const enhancer = useBuildComponentCallback();\n\n const Component = enhancer(request as Request, { fallbackComponent });\n\n return Component ? <Component {...(props as Props)} /> : null;\n }\n\n const asMiddleware: (\n middlewareComponent: ComponentType<AsMiddlewareComponentProps<Request, Props, Init>>\n ) => ComponentMiddleware<Request, Props, Init> =\n (\n MiddlewareComponent: ComponentType<AsMiddlewareComponentProps<Request, Props, Init>>\n ): ComponentMiddleware<Request, Props, Init> =>\n init =>\n next =>\n request => {\n const RawNextComponent = next(request);\n\n // TODO: Can we pre-build this component during init?\n const MiddlewareOf = (props: Props) => {\n const middleware = useMemo(\n () =>\n Object.freeze({\n init,\n Next: memo<Partial<Props>>(\n RawNextComponent\n ? (overridingProps: Partial<Props>) => <RawNextComponent {...props} {...overridingProps} />\n : () => null\n ),\n request\n }),\n []\n );\n\n return <MiddlewareComponent {...props} middleware={middleware} />;\n };\n\n MiddlewareOf.displayName = `MiddlewareOf<${MiddlewareComponent.displayName || ''}>`;\n\n return memo<Props>(MiddlewareOf);\n };\n\n return Object.freeze({\n asMiddleware,\n Provider: memo<ProviderProps<Request, Props, Init>>(ChainOfResponsibilityProvider),\n Proxy: memo<ProxyProps<Request, Props>>(Proxy),\n types: Object.freeze({\n middlewareComponentProps: undefined as unknown as AsMiddlewareComponentProps<Request, Props, Init>,\n init: undefined as unknown as Init,\n middleware: undefined as unknown as ComponentMiddleware<Request, Props, Init>,\n props: undefined as unknown as Props,\n proxyProps: undefined as unknown as ProxyProps<Request, Props>,\n request: undefined as unknown as Request\n }),\n useBuildComponentCallback\n });\n}\n\nexport default createChainOfResponsibility;\nexport {\n type ChainOfResponsibility,\n type CreateChainOfResponsibilityOptions,\n type ProxyProps,\n type UseBuildComponentCallback\n};\n","import {\n type ComponentClass,\n type ComponentType,\n type Consumer,\n type Fragment,\n type FunctionComponent,\n type Provider\n} from 'react';\nimport { custom } from 'valibot';\n\nfunction isConsumer(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is Consumer<unknown> {\n return component?.$$typeof?.toString() === 'Symbol(react.context)';\n}\n\nfunction isProvider(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is Provider<unknown> {\n return component?.$$typeof?.toString() === 'Symbol(react.provider)';\n}\n\nfunction isFragment(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is typeof Fragment {\n return component?.toString() === 'Symbol(react.fragment)';\n}\n\nfunction isFunctionComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is FunctionComponent {\n if (typeof component === 'function') {\n return true;\n }\n\n return isPureFunctionComponent(component);\n}\n\nfunction isPureFunctionComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is FunctionComponent {\n return component?.$$typeof?.toString() === 'Symbol(react.memo)' && isFunctionComponent(component.type);\n}\n\nfunction isComponentClass(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is ComponentClass {\n return typeof component === 'object' && typeof component?.['render'] === 'function';\n}\n\n// There are no definitive ways to check if an object is a React component or not.\n// We are checking if the object has a render function (classic component).\n// Note: \"forwardRef()\" returns plain object, not class instance.\nfunction isReactComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is ComponentType {\n return (\n isFunctionComponent(component) ||\n isComponentClass(component) ||\n isFragment(component) ||\n isConsumer(component) ||\n isProvider(component)\n );\n}\n\nconst reactComponent = () =>\n custom<ComponentType<unknown>>(value => isReactComponent(value), 'not a valid React component');\n\nexport default isReactComponent;\nexport { reactComponent };\n"],"mappings":"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","names":["import_react","options","middleware","init","enhancer","useBuildComponentCallback","React","Proxy","Proxy","options","React"]}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-
|
|
2
|
+
createChainOfResponsibility_default
|
|
3
|
+
} from "./chunk-U4UF7NZV.mjs";
|
|
4
4
|
|
|
5
5
|
// src/createChainOfResponsibilityForFluentUI.tsx
|
|
6
6
|
import React, { useCallback } from "react";
|
|
7
7
|
function createChainOfResponsibilityForFluentUI(options) {
|
|
8
|
-
const returnValue =
|
|
8
|
+
const returnValue = createChainOfResponsibility_default(options);
|
|
9
9
|
const { Proxy } = returnValue;
|
|
10
10
|
const useBuildRenderFunction = (options2 = {}) => {
|
|
11
11
|
const { getKey } = options2;
|
|
12
12
|
return useCallback(
|
|
13
|
-
(props, defaultRender) =>
|
|
13
|
+
(props, defaultRender) => (
|
|
14
|
+
// We no longer validate the correctness of this function.
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
|
+
/* @__PURE__ */ React.createElement(Proxy, { ...props, fallbackComponent: defaultRender, key: getKey?.(props), request: props })
|
|
17
|
+
),
|
|
14
18
|
[getKey]
|
|
15
19
|
);
|
|
16
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createChainOfResponsibilityForFluentUI.tsx"],"sourcesContent":["import { type IRenderFunction } from '@fluentui/react';\nimport React, { useCallback, type Key } from 'react';\n\nimport createChainOfResponsibility from './createChainOfResponsibility.tsx';\n\ntype UseBuildRenderFunctionOptions<Props> = { getKey?: (props: Props | undefined) => Key };\n\ntype UseBuildRenderFunction<Props> = (options?: UseBuildRenderFunctionOptions<Props>) => IRenderFunction<Props>;\n\n// We are using the props as both \"Request\" and \"Props\".\n// This should eases migration from `onRender` to chain of responsibility.\n// Downside is, web developers could accidentally pass request as props and not honoring props modified by upstreamers.\nexport default function createChainOfResponsibilityForFluentUI<Props extends object, Init = undefined>(\n options?:
|
|
1
|
+
{"version":3,"sources":["../src/createChainOfResponsibilityForFluentUI.tsx"],"sourcesContent":["import { type IRenderFunction } from '@fluentui/react';\nimport React, { useCallback, type Key } from 'react';\n\nimport createChainOfResponsibility, {\n type CreateChainOfResponsibilityOptions\n} from './createChainOfResponsibility.tsx';\n\ntype UseBuildRenderFunctionOptions<Props> = { getKey?: (props: Props | undefined) => Key };\n\ntype UseBuildRenderFunction<Props> = (options?: UseBuildRenderFunctionOptions<Props>) => IRenderFunction<Props>;\n\n// We are using the props as both \"Request\" and \"Props\".\n// This should eases migration from `onRender` to chain of responsibility.\n// Downside is, web developers could accidentally pass request as props and not honoring props modified by upstreamers.\n\n/**\n * @deprecated Fluent UI v9 no longer use `IRenderFunction` for custom render. We no longer validate the correctness of this function.\n */\nexport default function createChainOfResponsibilityForFluentUI<Props extends object, Init = undefined>(\n options?: CreateChainOfResponsibilityOptions\n): ReturnType<typeof createChainOfResponsibility<Props | undefined, Props, Init>> & {\n useBuildRenderFunction: UseBuildRenderFunction<Props>;\n} {\n // We no longer validate the correctness of this function.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const returnValue = createChainOfResponsibility<Props | undefined, Props, Init>(options as any);\n\n const { Proxy } = returnValue;\n\n const useBuildRenderFunction: UseBuildRenderFunction<Props> = (options = {}) => {\n const { getKey } = options;\n\n return useCallback<IRenderFunction<Props>>(\n (props, defaultRender) => (\n // We no longer validate the correctness of this function.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n <Proxy {...(props as Props)} fallbackComponent={defaultRender as any} key={getKey?.(props)} request={props} />\n ),\n [getKey]\n );\n };\n\n // We no longer validate the correctness of this function.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { ...returnValue, useBuildRenderFunction } as any;\n}\n"],"mappings":";;;;;AACA,OAAO,SAAS,mBAA6B;AAiB9B,SAAR,uCACL,SAGA;AAGA,QAAM,cAAc,oCAA4D,OAAc;AAE9F,QAAM,EAAE,MAAM,IAAI;AAElB,QAAM,yBAAwD,CAACA,WAAU,CAAC,MAAM;AAC9E,UAAM,EAAE,OAAO,IAAIA;AAEnB,WAAO;AAAA,MACL,CAAC,OAAO;AAAA;AAAA;AAAA,QAGN,oCAAC,SAAO,GAAI,OAAiB,mBAAmB,eAAsB,KAAK,SAAS,KAAK,GAAG,SAAS,OAAO;AAAA;AAAA,MAE9G,CAAC,MAAM;AAAA,IACT;AAAA,EACF;AAIA,SAAO,EAAE,GAAG,aAAa,uBAAuB;AAClD;","names":["options"]}
|
|
@@ -30,24 +30,24 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.ts
|
|
31
31
|
var src_exports = {};
|
|
32
32
|
__export(src_exports, {
|
|
33
|
-
createChainOfResponsibility: () =>
|
|
33
|
+
createChainOfResponsibility: () => createChainOfResponsibility_default
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(src_exports);
|
|
36
36
|
|
|
37
37
|
// src/createChainOfResponsibility.tsx
|
|
38
|
+
var import_handler_chain = require("handler-chain");
|
|
38
39
|
var import_react = __toESM(require("react"));
|
|
39
40
|
|
|
40
41
|
// src/isReactComponent.ts
|
|
42
|
+
var import_valibot = require("valibot");
|
|
41
43
|
function isConsumer(component) {
|
|
42
|
-
|
|
43
|
-
return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.context)";
|
|
44
|
+
return component?.$$typeof?.toString() === "Symbol(react.context)";
|
|
44
45
|
}
|
|
45
46
|
function isProvider(component) {
|
|
46
|
-
|
|
47
|
-
return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.provider)";
|
|
47
|
+
return component?.$$typeof?.toString() === "Symbol(react.provider)";
|
|
48
48
|
}
|
|
49
49
|
function isFragment(component) {
|
|
50
|
-
return
|
|
50
|
+
return component?.toString() === "Symbol(react.fragment)";
|
|
51
51
|
}
|
|
52
52
|
function isFunctionComponent(component) {
|
|
53
53
|
if (typeof component === "function") {
|
|
@@ -56,28 +56,15 @@ function isFunctionComponent(component) {
|
|
|
56
56
|
return isPureFunctionComponent(component);
|
|
57
57
|
}
|
|
58
58
|
function isPureFunctionComponent(component) {
|
|
59
|
-
|
|
60
|
-
return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.memo)" && isFunctionComponent(component.type);
|
|
59
|
+
return component?.$$typeof?.toString() === "Symbol(react.memo)" && isFunctionComponent(component.type);
|
|
61
60
|
}
|
|
62
61
|
function isComponentClass(component) {
|
|
63
|
-
return typeof component === "object" && typeof
|
|
62
|
+
return typeof component === "object" && typeof component?.["render"] === "function";
|
|
64
63
|
}
|
|
65
64
|
function isReactComponent(component) {
|
|
66
65
|
return isFunctionComponent(component) || isComponentClass(component) || isFragment(component) || isConsumer(component) || isProvider(component);
|
|
67
66
|
}
|
|
68
|
-
|
|
69
|
-
// src/private/compose.ts
|
|
70
|
-
function compose(...fns) {
|
|
71
|
-
return (fn) => fns.reduce((chain, fn2) => fn2(chain), fn);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// src/private/applyMiddleware.ts
|
|
75
|
-
function applyMiddleware(...arrayOfMiddleware) {
|
|
76
|
-
return (...init) => {
|
|
77
|
-
const chain = arrayOfMiddleware.map((middleware) => middleware(...init));
|
|
78
|
-
return compose(...chain);
|
|
79
|
-
};
|
|
80
|
-
}
|
|
67
|
+
var isReactComponent_default = isReactComponent;
|
|
81
68
|
|
|
82
69
|
// src/createChainOfResponsibility.tsx
|
|
83
70
|
function createChainOfResponsibility(options = {}) {
|
|
@@ -85,11 +72,11 @@ function createChainOfResponsibility(options = {}) {
|
|
|
85
72
|
get enhancer() {
|
|
86
73
|
return void 0;
|
|
87
74
|
},
|
|
88
|
-
useBuildComponentCallback(
|
|
89
|
-
if (options2
|
|
90
|
-
|
|
75
|
+
useBuildComponentCallback(_request, options2) {
|
|
76
|
+
if (!options2?.fallbackComponent) {
|
|
77
|
+
throw new Error("This component/hook cannot be used outside of its corresponding <Provider>");
|
|
91
78
|
}
|
|
92
|
-
|
|
79
|
+
return options2.fallbackComponent;
|
|
93
80
|
}
|
|
94
81
|
};
|
|
95
82
|
const context = (0, import_react.createContext)(defaultUseBuildComponentCallback);
|
|
@@ -114,7 +101,7 @@ function createChainOfResponsibility(options = {}) {
|
|
|
114
101
|
hasReturned = true;
|
|
115
102
|
if ((0, import_react.isValidElement)(returnValue)) {
|
|
116
103
|
throw new Error("middleware must not return React element directly");
|
|
117
|
-
} else if (returnValue !== false && returnValue !== null && typeof returnValue !== "undefined" && !
|
|
104
|
+
} else if (returnValue !== false && returnValue !== null && typeof returnValue !== "undefined" && !isReactComponent_default(returnValue)) {
|
|
118
105
|
throw new Error(
|
|
119
106
|
"middleware must return false, null, undefined, function component, or class component"
|
|
120
107
|
);
|
|
@@ -129,8 +116,8 @@ function createChainOfResponsibility(options = {}) {
|
|
|
129
116
|
// We are reversing because it is easier to read:
|
|
130
117
|
// - With reverse, [a, b, c] will become a(b(c(fn)))
|
|
131
118
|
// - Without reverse, [a, b, c] will become c(b(a(fn)))
|
|
132
|
-
applyMiddleware(
|
|
133
|
-
...[...patchedMiddleware, ...parentEnhancer ? [() => parentEnhancer] : []]
|
|
119
|
+
(0, import_handler_chain.applyMiddleware)(
|
|
120
|
+
...[...patchedMiddleware, ...parentEnhancer ? [() => parentEnhancer] : []]
|
|
134
121
|
)(init)
|
|
135
122
|
),
|
|
136
123
|
[init, middleware, parentEnhancer]
|
|
@@ -146,10 +133,10 @@ function createChainOfResponsibility(options = {}) {
|
|
|
146
133
|
return /* @__PURE__ */ import_react.default.createElement(context.Provider, { value: contextValue }, children);
|
|
147
134
|
}
|
|
148
135
|
const useBuildComponentCallback = () => (0, import_react.useContext)(context).useBuildComponentCallback;
|
|
149
|
-
function Proxy2({
|
|
136
|
+
function Proxy2({ fallbackComponent, request, ...props }) {
|
|
150
137
|
const enhancer = useBuildComponentCallback();
|
|
151
138
|
const Component = enhancer(request, { fallbackComponent });
|
|
152
|
-
return Component ? /* @__PURE__ */ import_react.default.createElement(Component, { ...props }
|
|
139
|
+
return Component ? /* @__PURE__ */ import_react.default.createElement(Component, { ...props }) : null;
|
|
153
140
|
}
|
|
154
141
|
const asMiddleware = (MiddlewareComponent) => (init) => (next) => (request) => {
|
|
155
142
|
const RawNextComponent = next(request);
|
|
@@ -169,20 +156,22 @@ function createChainOfResponsibility(options = {}) {
|
|
|
169
156
|
MiddlewareOf.displayName = `MiddlewareOf<${MiddlewareComponent.displayName || ""}>`;
|
|
170
157
|
return (0, import_react.memo)(MiddlewareOf);
|
|
171
158
|
};
|
|
172
|
-
return {
|
|
159
|
+
return Object.freeze({
|
|
173
160
|
asMiddleware,
|
|
174
161
|
Provider: (0, import_react.memo)(ChainOfResponsibilityProvider),
|
|
175
162
|
Proxy: (0, import_react.memo)(Proxy2),
|
|
176
|
-
types: {
|
|
163
|
+
types: Object.freeze({
|
|
177
164
|
middlewareComponentProps: void 0,
|
|
178
165
|
init: void 0,
|
|
179
166
|
middleware: void 0,
|
|
180
167
|
props: void 0,
|
|
168
|
+
proxyProps: void 0,
|
|
181
169
|
request: void 0
|
|
182
|
-
},
|
|
170
|
+
}),
|
|
183
171
|
useBuildComponentCallback
|
|
184
|
-
};
|
|
172
|
+
});
|
|
185
173
|
}
|
|
174
|
+
var createChainOfResponsibility_default = createChainOfResponsibility;
|
|
186
175
|
// Annotate the CommonJS export names for ESM import in node:
|
|
187
176
|
0 && (module.exports = {
|
|
188
177
|
createChainOfResponsibility
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/createChainOfResponsibility.tsx","../src/isReactComponent.ts","../src/private/compose.ts","../src/private/applyMiddleware.ts"],"sourcesContent":["export { default as createChainOfResponsibility } from './createChainOfResponsibility.tsx';\nexport { type ComponentMiddleware } from './types.ts';\n","import React, {\n createContext,\n isValidElement,\n memo,\n useCallback,\n useContext,\n useMemo,\n type ComponentType,\n type PropsWithChildren\n} from 'react';\n\nimport isReactComponent from './isReactComponent.ts';\nimport applyMiddleware, { type Enhancer } from './private/applyMiddleware.ts';\nimport { type ComponentMiddleware } from './types.ts';\n\n// TODO: Simplify to ComponentType<Props> | undefined.\ntype ResultComponent<Props> = ComponentType<Props> | false | null | undefined;\n\ntype UseBuildComponentCallbackOptions<Props> = { fallbackComponent?: ResultComponent<Props> };\n\ntype UseBuildComponentCallback<Request, Props> = (\n request: Request,\n options?: UseBuildComponentCallbackOptions<Props>\n) => ComponentType<Props> | undefined;\n\ntype ProviderContext<Request, Props> = {\n get enhancer(): Enhancer<[Request], ResultComponent<Props>> | undefined;\n useBuildComponentCallback: UseBuildComponentCallback<Request, Props>;\n};\n\ntype ProviderProps<Request, Props, Init> = PropsWithChildren<{\n middleware: readonly ComponentMiddleware<Request, Props, Init>[];\n}> &\n (Init extends never | void ? { init?: undefined } : Init extends undefined ? { init?: Init } : { init: Init });\n\ntype ProxyProps<Request, Props extends object> = PropsWithChildren<\n Request extends never | void\n ? Props & { fallbackComponent?: ComponentType<Props>; request?: undefined }\n : Request extends undefined\n ? Props & { fallbackComponent?: ComponentType<Props>; request?: Request }\n : Props & { fallbackComponent?: ComponentType<Props>; request: Request }\n>;\n\ntype Options = {\n /**\n * Allows a middleware to pass another request object when calling its next middleware. Default is false.\n *\n * However, middleware could modify the request object before calling its next middleware. It is recommended\n * to use Object.freeze() to prevent middleware from modifying the request object.\n */\n passModifiedRequest?: boolean;\n};\n\ntype MiddlewareProps<Request, Props, Init> = Readonly<{\n init: Init;\n Next: ComponentType<Partial<Props>>;\n request: Request;\n}>;\n\ntype MiddlewareComponentProps<Request, Props, Init> = Props &\n Readonly<{ middleware: MiddlewareProps<Request, Props, Init> }>;\n\nexport default function createChainOfResponsibility<\n Request = undefined,\n Props extends object = Readonly<{ children?: never }>,\n Init = undefined\n>(\n options: Options = {}\n): {\n asMiddleware: (\n middlewareComponent: ComponentType<MiddlewareComponentProps<Request, Props, Init>>\n ) => ComponentMiddleware<Request, Props, Init>;\n Provider: ComponentType<ProviderProps<Request, Props, Init>>;\n Proxy: ComponentType<ProxyProps<Request, Props>>;\n types: {\n init: Init;\n middleware: ComponentMiddleware<Request, Props, Init>;\n middlewareComponentProps: MiddlewareComponentProps<Request, Props, Init>;\n props: Props;\n request: Request;\n };\n useBuildComponentCallback: () => UseBuildComponentCallback<Request, Props>;\n} {\n const defaultUseBuildComponentCallback: ProviderContext<Request, Props> = {\n get enhancer() {\n return undefined;\n },\n useBuildComponentCallback(_, options) {\n if (options?.fallbackComponent) {\n return options.fallbackComponent;\n }\n\n throw new Error('This component/hook cannot be used outside of its corresponding <Provider>');\n }\n };\n\n const context = createContext<ProviderContext<Request, Props>>(defaultUseBuildComponentCallback);\n\n function ChainOfResponsibilityProvider({ children, init, middleware }: ProviderProps<Request, Props, Init>) {\n // TODO: Related to https://github.com/microsoft/TypeScript/issues/17002.\n // typescript@5.2.2 has a bug, Array.isArray() is a type predicate but only works with mutable array, not readonly array.\n // After removing \"as unknown\", `middleware` on the next line become `any[]`.\n if (!Array.isArray(middleware as unknown) || middleware.some(middleware => typeof middleware !== 'function')) {\n throw new Error('middleware prop must be an array of functions');\n }\n\n const patchedMiddleware: readonly ComponentMiddleware<Request, Props, Init>[] = Object.freeze(\n middleware\n ? middleware.map(fn => (init: Init) => {\n const enhancer = fn(init);\n\n return (next: (request: Request) => ComponentType<Props> | false | null | undefined) =>\n (originalRequest: Request) => {\n // False positive: although we did not re-assign the variable from true, it was initialized as undefined.\n // eslint-disable-next-line prefer-const\n let hasReturned: boolean;\n\n const returnValue = enhancer(nextRequest => {\n if (hasReturned) {\n throw new Error('next() cannot be called after the function had returned synchronously');\n }\n\n !options.passModifiedRequest &&\n nextRequest !== originalRequest &&\n console.warn(\n 'react-chain-of-responsibility: \"options.passModifiedRequest\" must be set to true to pass a different request object to next().'\n );\n\n return next(options.passModifiedRequest ? nextRequest : originalRequest);\n })(originalRequest);\n\n hasReturned = true;\n\n if (isValidElement(returnValue)) {\n throw new Error('middleware must not return React element directly');\n } else if (\n returnValue !== false &&\n returnValue !== null &&\n typeof returnValue !== 'undefined' &&\n !isReactComponent(returnValue)\n ) {\n throw new Error(\n 'middleware must return false, null, undefined, function component, or class component'\n );\n }\n\n return returnValue;\n };\n })\n : []\n );\n\n const { enhancer: parentEnhancer } = useContext(context);\n\n const enhancer = useMemo(\n () =>\n // We are reversing because it is easier to read:\n // - With reverse, [a, b, c] will become a(b(c(fn)))\n // - Without reverse, [a, b, c] will become c(b(a(fn)))\n applyMiddleware<[Request], ResultComponent<Props>, [Init]>(\n ...[...patchedMiddleware, ...(parentEnhancer ? [() => parentEnhancer] : [])].reverse()\n )(init as Init),\n [init, middleware, parentEnhancer]\n );\n\n const useBuildComponentCallback = useCallback<UseBuildComponentCallback<Request, Props>>(\n (request, options = {}) => enhancer(() => options.fallbackComponent)(request) || undefined,\n [enhancer]\n );\n\n const contextValue = useMemo<ProviderContext<Request, Props>>(\n () => ({ enhancer, useBuildComponentCallback }),\n [enhancer, useBuildComponentCallback]\n );\n\n return <context.Provider value={contextValue}>{children}</context.Provider>;\n }\n\n const useBuildComponentCallback = () => useContext(context).useBuildComponentCallback;\n\n function Proxy({ children, fallbackComponent, request, ...props }: ProxyProps<Request, Props>) {\n const enhancer = useBuildComponentCallback();\n const Component = enhancer(request as Request, { fallbackComponent });\n\n return Component ? <Component {...(props as Props)}>{children}</Component> : null;\n }\n\n const asMiddleware: (\n middlewareComponent: ComponentType<MiddlewareComponentProps<Request, Props, Init>>\n ) => ComponentMiddleware<Request, Props, Init> =\n (\n MiddlewareComponent: ComponentType<MiddlewareComponentProps<Request, Props, Init>>\n ): ComponentMiddleware<Request, Props, Init> =>\n init =>\n next =>\n request => {\n const RawNextComponent = next(request);\n\n // TODO: Can we pre-build this component during init?\n const MiddlewareOf = (props: Props) => {\n const middleware = useMemo(\n () =>\n Object.freeze({\n init,\n Next: memo<Partial<Props>>(\n RawNextComponent\n ? (overridingProps: Partial<Props>) => <RawNextComponent {...props} {...overridingProps} />\n : () => null\n ),\n request\n }),\n []\n );\n\n return <MiddlewareComponent {...props} middleware={middleware} />;\n };\n\n MiddlewareOf.displayName = `MiddlewareOf<${MiddlewareComponent.displayName || ''}>`;\n\n return memo<Props>(MiddlewareOf);\n };\n\n return {\n asMiddleware,\n Provider: memo<ProviderProps<Request, Props, Init>>(ChainOfResponsibilityProvider),\n Proxy: memo<ProxyProps<Request, Props>>(Proxy),\n types: {\n middlewareComponentProps: undefined as unknown as MiddlewareComponentProps<Request, Props, Init>,\n init: undefined as unknown as Init,\n middleware: undefined as unknown as ComponentMiddleware<Request, Props, Init>,\n props: undefined as unknown as Props,\n request: undefined as unknown as Request\n },\n useBuildComponentCallback\n };\n}\n","import {\n type ComponentClass,\n type ComponentType,\n type Consumer,\n type Fragment,\n type FunctionComponent,\n type Provider\n} from 'react';\n\nfunction isConsumer(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is Consumer<unknown> {\n return component?.$$typeof?.toString() === 'Symbol(react.context)';\n}\n\nfunction isProvider(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is Provider<unknown> {\n return component?.$$typeof?.toString() === 'Symbol(react.provider)';\n}\n\nfunction isFragment(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is typeof Fragment {\n return component?.toString() === 'Symbol(react.fragment)';\n}\n\nfunction isFunctionComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is FunctionComponent {\n if (typeof component === 'function') {\n return true;\n }\n\n return isPureFunctionComponent(component);\n}\n\nfunction isPureFunctionComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is FunctionComponent {\n return component?.$$typeof?.toString() === 'Symbol(react.memo)' && isFunctionComponent(component.type);\n}\n\nfunction isComponentClass(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is ComponentClass {\n return typeof component === 'object' && typeof component?.['render'] === 'function';\n}\n\n// There are no definitive ways to check if an object is a React component or not.\n// We are checking if the object has a render function (classic component).\n// Note: \"forwardRef()\" returns plain object, not class instance.\nexport default function isReactComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is ComponentType {\n return (\n isFunctionComponent(component) ||\n isComponentClass(component) ||\n isFragment(component) ||\n isConsumer(component) ||\n isProvider(component)\n );\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Fn<P extends any[], R> = (...args: P) => R;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Enhancer<P extends any[], R> = (next: Fn<P, R>) => Fn<P, R>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function compose<P extends any[], R>(...fns: Enhancer<P, R>[]): Enhancer<P, R> {\n return (fn: Fn<P, R>): Fn<P, R> => fns.reduce((chain, fn) => fn(chain), fn);\n}\n","import compose from './compose.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Fn<P extends any[], R> = (...args: P) => R;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Enhancer<P extends any[], R> = (next: Fn<P, R>) => Fn<P, R>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Middleware<P extends any[], R, S extends any[]> = (...init: S) => Enhancer<P, R>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function applyMiddleware<P extends any[], R, S extends any[]>(\n ...arrayOfMiddleware: Middleware<P, R, S>[]\n) {\n return (...init: S) => {\n const chain = arrayOfMiddleware.map(middleware => middleware(...init));\n\n return compose(...chain);\n };\n}\n"],"mappings":"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","names":["fn","options","middleware","init","enhancer","useBuildComponentCallback","React","Proxy"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/createChainOfResponsibility.tsx","../src/isReactComponent.ts"],"sourcesContent":["export { default as createChainOfResponsibility } from './createChainOfResponsibility.tsx';\nexport { type ComponentMiddleware } from './types.ts';\n","import { applyMiddleware } from 'handler-chain';\nimport React, {\n createContext,\n isValidElement,\n memo,\n useCallback,\n useContext,\n useMemo,\n type ComponentType,\n type PropsWithChildren\n} from 'react';\n\nimport isReactComponent from './isReactComponent.ts';\nimport { type ComponentEnhancer, type ComponentMiddleware } from './types.ts';\n\n// TODO: Simplify to ComponentType<Props> | undefined.\ntype ResultComponent<Props> = ComponentType<Props> | false | null | undefined;\n\ntype UseBuildComponentCallbackOptions<Props> = {\n fallbackComponent?: ResultComponent<Props> | undefined;\n};\n\ninterface UseBuildComponentCallback<Request, Props> {\n (request: Request, options?: undefined | UseBuildComponentCallbackOptions<Props>): ComponentType<Props> | undefined;\n}\n\ntype ProviderContext<Request, Props> = {\n get enhancer(): ComponentEnhancer<Request, Props> | undefined;\n useBuildComponentCallback: UseBuildComponentCallback<Request, Props>;\n};\n\ntype ProviderProps<Request, Props, Init> = PropsWithChildren<{\n middleware: readonly ComponentMiddleware<Request, Props, Init>[];\n}> &\n (Init extends never | void\n ? { readonly init?: undefined }\n : Init extends undefined | void\n ? { readonly init?: Init }\n : { readonly init: Init });\n\ntype ProxyProps<Request, Props extends object> = Props & {\n readonly fallbackComponent?: ComponentType<Props> | undefined;\n readonly request: Request;\n};\n\ntype CreateChainOfResponsibilityOptions = {\n /**\n * Allows a middleware to pass another request object when calling its next middleware. Default is false.\n *\n * However, middleware could modify the request object before calling its next middleware. It is recommended\n * to use Object.freeze() to prevent middleware from modifying the request object.\n */\n readonly passModifiedRequest?: boolean | undefined;\n};\n\ntype AsMiddlewareProps<Request, Props, Init> = {\n readonly init: Init;\n readonly Next: ComponentType<Partial<Props>>;\n readonly request: Request;\n};\n\ntype AsMiddlewareComponentProps<Request, Props, Init> = Props & {\n readonly middleware: AsMiddlewareProps<Request, Props, Init>;\n};\n\ntype ChainOfResponsibility<Request, Props extends object, Init> = {\n readonly asMiddleware: (\n middlewareComponent: ComponentType<AsMiddlewareComponentProps<Request, Props, Init>>\n ) => ComponentMiddleware<Request, Props, Init>;\n readonly Provider: ComponentType<ProviderProps<Request, Props, Init>>;\n readonly Proxy: ComponentType<ProxyProps<Request, Props>>;\n readonly types: {\n readonly init: Init;\n readonly middleware: ComponentMiddleware<Request, Props, Init>;\n readonly middlewareComponentProps: AsMiddlewareComponentProps<Request, Props, Init>;\n readonly props: Props;\n readonly proxyProps: ProxyProps<Request, Props>;\n readonly request: Request;\n };\n readonly useBuildComponentCallback: () => UseBuildComponentCallback<Request, Props>;\n};\n\nfunction createChainOfResponsibility<Request = void, Props extends object = { readonly children?: never }, Init = void>(\n options: CreateChainOfResponsibilityOptions = {}\n): ChainOfResponsibility<Request, Props, Init> {\n const defaultUseBuildComponentCallback: ProviderContext<Request, Props> = {\n get enhancer() {\n return undefined;\n },\n useBuildComponentCallback(_request, options): ComponentType<Props> {\n if (!options?.fallbackComponent) {\n throw new Error('This component/hook cannot be used outside of its corresponding <Provider>');\n }\n\n return options.fallbackComponent;\n }\n };\n\n const context = createContext<ProviderContext<Request, Props>>(defaultUseBuildComponentCallback);\n\n function ChainOfResponsibilityProvider({ children, init, middleware }: ProviderProps<Request, Props, Init>) {\n // TODO: Related to https://github.com/microsoft/TypeScript/issues/17002.\n // typescript@5.2.2 has a bug, Array.isArray() is a type predicate but only works with mutable array, not readonly array.\n // After removing \"as unknown\", `middleware` on the next line become `any[]`.\n if (!Array.isArray(middleware as unknown) || middleware.some(middleware => typeof middleware !== 'function')) {\n throw new Error('middleware prop must be an array of functions');\n }\n\n const patchedMiddleware: readonly ComponentMiddleware<Request, Props, Init>[] = Object.freeze(\n middleware\n ? middleware.map(fn => (init: Init) => {\n const enhancer = fn(init);\n\n return (next: (request: Request) => ComponentType<Props> | false | null | undefined) =>\n (originalRequest: Request) => {\n // False positive: although we did not re-assign the variable from true, it was initialized as undefined.\n // eslint-disable-next-line prefer-const\n let hasReturned: boolean;\n\n const returnValue = enhancer(nextRequest => {\n if (hasReturned) {\n throw new Error('next() cannot be called after the function had returned synchronously');\n }\n\n !options.passModifiedRequest &&\n nextRequest !== originalRequest &&\n console.warn(\n 'react-chain-of-responsibility: \"options.passModifiedRequest\" must be set to true to pass a different request object to next().'\n );\n\n return next(options.passModifiedRequest ? nextRequest : originalRequest);\n })(originalRequest);\n\n hasReturned = true;\n\n if (isValidElement(returnValue)) {\n throw new Error('middleware must not return React element directly');\n } else if (\n returnValue !== false &&\n returnValue !== null &&\n typeof returnValue !== 'undefined' &&\n !isReactComponent(returnValue)\n ) {\n throw new Error(\n 'middleware must return false, null, undefined, function component, or class component'\n );\n }\n\n return returnValue;\n };\n })\n : []\n );\n\n const { enhancer: parentEnhancer } = useContext(context);\n\n const enhancer = useMemo(\n () =>\n // We are reversing because it is easier to read:\n // - With reverse, [a, b, c] will become a(b(c(fn)))\n // - Without reverse, [a, b, c] will become c(b(a(fn)))\n applyMiddleware<ResultComponent<Props>, Request, Init>(\n ...[...patchedMiddleware, ...(parentEnhancer ? [() => parentEnhancer] : [])]\n )(init as Init),\n [init, middleware, parentEnhancer]\n );\n\n const useBuildComponentCallback = useCallback<UseBuildComponentCallback<Request, Props>>(\n (request, options = {}) => enhancer(() => options.fallbackComponent)(request) || undefined,\n [enhancer]\n );\n\n const contextValue = useMemo<ProviderContext<Request, Props>>(\n () => ({ enhancer, useBuildComponentCallback }),\n [enhancer, useBuildComponentCallback]\n );\n\n return <context.Provider value={contextValue}>{children}</context.Provider>;\n }\n\n const useBuildComponentCallback = () => useContext(context).useBuildComponentCallback;\n\n function Proxy({ fallbackComponent, request, ...props }: ProxyProps<Request, Props>) {\n const enhancer = useBuildComponentCallback();\n\n const Component = enhancer(request as Request, { fallbackComponent });\n\n return Component ? <Component {...(props as Props)} /> : null;\n }\n\n const asMiddleware: (\n middlewareComponent: ComponentType<AsMiddlewareComponentProps<Request, Props, Init>>\n ) => ComponentMiddleware<Request, Props, Init> =\n (\n MiddlewareComponent: ComponentType<AsMiddlewareComponentProps<Request, Props, Init>>\n ): ComponentMiddleware<Request, Props, Init> =>\n init =>\n next =>\n request => {\n const RawNextComponent = next(request);\n\n // TODO: Can we pre-build this component during init?\n const MiddlewareOf = (props: Props) => {\n const middleware = useMemo(\n () =>\n Object.freeze({\n init,\n Next: memo<Partial<Props>>(\n RawNextComponent\n ? (overridingProps: Partial<Props>) => <RawNextComponent {...props} {...overridingProps} />\n : () => null\n ),\n request\n }),\n []\n );\n\n return <MiddlewareComponent {...props} middleware={middleware} />;\n };\n\n MiddlewareOf.displayName = `MiddlewareOf<${MiddlewareComponent.displayName || ''}>`;\n\n return memo<Props>(MiddlewareOf);\n };\n\n return Object.freeze({\n asMiddleware,\n Provider: memo<ProviderProps<Request, Props, Init>>(ChainOfResponsibilityProvider),\n Proxy: memo<ProxyProps<Request, Props>>(Proxy),\n types: Object.freeze({\n middlewareComponentProps: undefined as unknown as AsMiddlewareComponentProps<Request, Props, Init>,\n init: undefined as unknown as Init,\n middleware: undefined as unknown as ComponentMiddleware<Request, Props, Init>,\n props: undefined as unknown as Props,\n proxyProps: undefined as unknown as ProxyProps<Request, Props>,\n request: undefined as unknown as Request\n }),\n useBuildComponentCallback\n });\n}\n\nexport default createChainOfResponsibility;\nexport {\n type ChainOfResponsibility,\n type CreateChainOfResponsibilityOptions,\n type ProxyProps,\n type UseBuildComponentCallback\n};\n","import {\n type ComponentClass,\n type ComponentType,\n type Consumer,\n type Fragment,\n type FunctionComponent,\n type Provider\n} from 'react';\nimport { custom } from 'valibot';\n\nfunction isConsumer(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is Consumer<unknown> {\n return component?.$$typeof?.toString() === 'Symbol(react.context)';\n}\n\nfunction isProvider(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is Provider<unknown> {\n return component?.$$typeof?.toString() === 'Symbol(react.provider)';\n}\n\nfunction isFragment(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is typeof Fragment {\n return component?.toString() === 'Symbol(react.fragment)';\n}\n\nfunction isFunctionComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is FunctionComponent {\n if (typeof component === 'function') {\n return true;\n }\n\n return isPureFunctionComponent(component);\n}\n\nfunction isPureFunctionComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is FunctionComponent {\n return component?.$$typeof?.toString() === 'Symbol(react.memo)' && isFunctionComponent(component.type);\n}\n\nfunction isComponentClass(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is ComponentClass {\n return typeof component === 'object' && typeof component?.['render'] === 'function';\n}\n\n// There are no definitive ways to check if an object is a React component or not.\n// We are checking if the object has a render function (classic component).\n// Note: \"forwardRef()\" returns plain object, not class instance.\nfunction isReactComponent(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n component: any\n): component is ComponentType {\n return (\n isFunctionComponent(component) ||\n isComponentClass(component) ||\n isFragment(component) ||\n isConsumer(component) ||\n isProvider(component)\n );\n}\n\nconst reactComponent = () =>\n custom<ComponentType<unknown>>(value => isReactComponent(value), 'not a valid React component');\n\nexport default isReactComponent;\nexport { reactComponent };\n"],"mappings":"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","names":["options","middleware","init","enhancer","useBuildComponentCallback","React","Proxy"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "./chunk-
|
|
2
|
+
createChainOfResponsibility_default
|
|
3
|
+
} from "./chunk-U4UF7NZV.mjs";
|
|
4
4
|
export {
|
|
5
|
-
createChainOfResponsibility
|
|
5
|
+
createChainOfResponsibility_default as createChainOfResponsibility
|
|
6
6
|
};
|
|
7
7
|
//# sourceMappingURL=react-chain-of-responsibility.mjs.map
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { ComponentType, PropsWithChildren, ReactElement } from 'react';
|
|
2
|
+
|
|
3
|
+
declare global {
|
|
4
|
+
interface ArrayConstructor {
|
|
5
|
+
isArray(arg: any): arg is readonly any[];
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
type BaseProps = object;
|
|
9
|
+
type CreateChainOfResponsibilityOptions = {
|
|
10
|
+
/**
|
|
11
|
+
* Allows one component to pass different set of props to its downstream component. Default is false.
|
|
12
|
+
*
|
|
13
|
+
* It is recommended to keep this settings as default to prevent newly added component from unexpectedly changing behavior of downstream components.
|
|
14
|
+
*/
|
|
15
|
+
readonly allowOverrideProps?: boolean | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Allows a middleware to pass another request object when calling its next middleware. Default is false.
|
|
18
|
+
*
|
|
19
|
+
* It is recommended to keep this settings as default ot prevent newly added middleware from unexpectedly changing behavior of downstream middleware.
|
|
20
|
+
*
|
|
21
|
+
* To prevent upstream middleware from modifying the request, the request object should be set to be immutable through `Object.freeze`.
|
|
22
|
+
*/
|
|
23
|
+
readonly passModifiedRequest?: boolean | undefined;
|
|
24
|
+
};
|
|
25
|
+
type ChainOfResponsibility<Request, Props extends BaseProps, Init> = {
|
|
26
|
+
readonly Provider: ComponentType<ProviderProps<Request, Props, Init>> & InferenceHelper<Request, Props, Init>;
|
|
27
|
+
readonly Proxy: ComponentType<ProxyProps<Request, Props>>;
|
|
28
|
+
readonly reactComponent: ReactComponentHandlerResult<Props>;
|
|
29
|
+
readonly useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props>;
|
|
30
|
+
};
|
|
31
|
+
declare const DO_NOT_CREATE_THIS_OBJECT_YOURSELF: unique symbol;
|
|
32
|
+
type ComponentRenderer<Props> = (props: Props) => ReactElement | null;
|
|
33
|
+
interface ComponentHandlerResult<Props extends BaseProps> {
|
|
34
|
+
readonly [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined;
|
|
35
|
+
readonly render: (overridingProps?: Partial<Props> | undefined) => ReactElement | null;
|
|
36
|
+
}
|
|
37
|
+
type ComponentHandler<Request, Props extends BaseProps> = (request: Request) => ComponentHandlerResult<Props> | undefined;
|
|
38
|
+
type ComponentEnhancer<Request, Props extends BaseProps> = (next: ComponentHandler<Request, Props>) => ComponentHandler<Request, Props>;
|
|
39
|
+
type ComponentMiddleware<Request, Props extends BaseProps, Init = undefined> = (init: Init) => ComponentEnhancer<Request, Props>;
|
|
40
|
+
type ReactComponentHandlerResult<Props extends object> = <P extends Props>(component: ComponentType<P>, bindProps?: (Partial<Props> & Omit<P, keyof Props>) | ((props: Props) => Partial<Props> & Omit<P, keyof Props>) | undefined) => ComponentHandlerResult<Props>;
|
|
41
|
+
type UseBuildRenderCallbackOptions<Props> = {
|
|
42
|
+
readonly fallbackComponent?: ComponentType<Props> | undefined;
|
|
43
|
+
};
|
|
44
|
+
interface UseBuildRenderCallback<Request, Props extends BaseProps> {
|
|
45
|
+
(request: Request, options?: undefined | UseBuildRenderCallbackOptions<Props>): ComponentRenderer<Props> | undefined;
|
|
46
|
+
}
|
|
47
|
+
type ProviderProps<Request, Props extends BaseProps, Init> = PropsWithChildren<{
|
|
48
|
+
readonly middleware: readonly ComponentMiddleware<Request, Props, Init>[];
|
|
49
|
+
}> & (Init extends never | void ? {
|
|
50
|
+
readonly init?: undefined;
|
|
51
|
+
} : Init extends undefined | void ? {
|
|
52
|
+
readonly init?: Init;
|
|
53
|
+
} : {
|
|
54
|
+
readonly init: Init;
|
|
55
|
+
});
|
|
56
|
+
type ProxyProps<Request, Props extends BaseProps> = Props & {
|
|
57
|
+
readonly fallbackComponent?: ComponentType<Props> | undefined;
|
|
58
|
+
readonly request: Request;
|
|
59
|
+
};
|
|
60
|
+
type InferenceHelper<Request, Props extends BaseProps, Init> = {
|
|
61
|
+
readonly '~types': {
|
|
62
|
+
readonly init: Init;
|
|
63
|
+
readonly middleware: ComponentMiddleware<Request, Props, Init>;
|
|
64
|
+
readonly props: Props;
|
|
65
|
+
readonly proxyProps: ProxyProps<Request, Props>;
|
|
66
|
+
readonly providerProps: ProviderProps<Request, Props, Init>;
|
|
67
|
+
readonly request: Request;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
type InferInit<T extends InferenceHelper<any, any, any>> = T['~types']['init'];
|
|
71
|
+
type InferMiddleware<T extends InferenceHelper<any, any, any>> = T['~types']['middleware'];
|
|
72
|
+
type InferProps<T extends InferenceHelper<any, any, any>> = T['~types']['props'];
|
|
73
|
+
type InferProxyProps<T extends InferenceHelper<any, any, any>> = T['~types']['proxyProps'];
|
|
74
|
+
type InferProviderProps<T extends InferenceHelper<any, any, any>> = T['~types']['providerProps'];
|
|
75
|
+
type InferRequest<T extends InferenceHelper<any, any, any>> = T['~types']['request'];
|
|
76
|
+
declare function createChainOfResponsibility<Request = void, Props extends BaseProps = {
|
|
77
|
+
readonly children?: never;
|
|
78
|
+
}, Init = void>(options?: CreateChainOfResponsibilityOptions): ChainOfResponsibility<Request, Props, Init>;
|
|
79
|
+
|
|
80
|
+
export { type ChainOfResponsibility, type ComponentEnhancer, type ComponentHandler, type ComponentHandlerResult, type ComponentMiddleware, type ComponentRenderer, type CreateChainOfResponsibilityOptions, type InferInit, type InferMiddleware, type InferProps, type InferProviderProps, type InferProxyProps, type InferRequest, type InferenceHelper, type ProviderProps, type ProxyProps, type ReactComponentHandlerResult, type UseBuildRenderCallback, type UseBuildRenderCallbackOptions, createChainOfResponsibility };
|