react-chain-of-responsibility 0.2.0-main.7f3fe00 → 0.2.0-main.9d496d9

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 CHANGED
@@ -31,8 +31,8 @@ const Plain = ({ children }) => <>{children}</>;
31
31
 
32
32
  // Constructs an array of middleware to handle the request and return corresponding subcomponents.
33
33
  const middleware = [
34
- () => next => request => request === 'bold' ? Bold : next(request),
35
- () => next => request => request === 'italic' ? Italic : next(request),
34
+ () => next => request => (request === 'bold' ? Bold : next(request)),
35
+ () => next => request => (request === 'italic' ? Italic : next(request)),
36
36
  () => () => () => Plain
37
37
  ];
38
38
 
@@ -49,6 +49,12 @@ This sample will render:
49
49
 
50
50
  > **This is bold.** _This is italic._ This is plain.
51
51
 
52
+ ```jsx
53
+ <strong>This is bold.</strong>
54
+ <i>This is italic.</i>
55
+ <>This is plain.</>
56
+ ```
57
+
52
58
  ### Using with Fluent UI as `IRenderFunction`
53
59
 
54
60
  The chain of responsibility design pattern can be used in Fluent UI.
@@ -58,7 +64,7 @@ After calling `createChainOfResponsibilityForFluentUI`, it will return `useBuild
58
64
  #### Sample code
59
65
 
60
66
  ```jsx
61
- import { createChainOfResponsibilityForFluentUI } from 'react-chain-of-responsibility';
67
+ import { createChainOfResponsibilityForFluentUI } from 'react-chain-of-responsibility/fluentUI';
62
68
 
63
69
  // Creates a <Provider> providing the chain of responsibility service.
64
70
  const { Provider, Proxy } = createChainOfResponsibilityForFluentUI();
@@ -69,8 +75,8 @@ const Orange = () => <>🍊</>;
69
75
 
70
76
  // Constructs an array of middleware to handle the request and return corresponding subcomponents.
71
77
  const middleware = [
72
- () => next => props => props?.iconProps?.iconName === 'Banana' ? Banana : next(props),
73
- () => next => props => props?.iconProps?.iconName === 'Orange' ? Orange : next(props)
78
+ () => next => props => (props?.iconProps?.iconName === 'Banana' ? Banana : next(props)),
79
+ () => next => props => (props?.iconProps?.iconName === 'Orange' ? Orange : next(props))
74
80
  // Fallback to `defaultRender` of `IRenderFunction` is automatically injected.
75
81
  ];
76
82
 
@@ -95,7 +101,7 @@ render(
95
101
 
96
102
  There are subtle differences between the standard version and the Fluent UI version:
97
103
 
98
- - Entrypoint is `createChainOfResponsibilityForFluentUI()`
104
+ - Entrypoint is `createChainOfResponsibilityForFluentUI()` and imported from 'react-chain-of-responsibility/fluentUI'
99
105
  - Request and props are always of same type
100
106
  - They are optional too, as defined in [`IRenderFunction`](https://github.com/microsoft/fluentui/blob/master/packages/utilities/src/IRenderFunction.ts)
101
107
  - Automatic fallback to `defaultRender`
@@ -135,6 +141,41 @@ This sample will render:
135
141
 
136
142
  > **This is bold.** _This is italic._ **_This is bold and italic._** This is plain.
137
143
 
144
+ ```jsx
145
+ <Bold>This is bold.</Bold>
146
+ <Italic>This is italic.</Italic>
147
+ <Bold><Italic>This is bold and italic.</Italic></Bold>
148
+ <Plain>This is plain.</Plain>
149
+ ```
150
+
151
+ ### Nesting `<Provider>`
152
+
153
+ If the `<Provider>` from the same chain appears nested in the tree, the `<Proxy>` will render using the middleware from the closest `<Provider>` and fallback up the chain. The following code snippet will render "Second First".
154
+
155
+ ```jsx
156
+ const { Provider, Proxy } = createChainOfResponsibility();
157
+
158
+ const firstMiddleware = () => next => request => {
159
+ const NextComponent = next(request);
160
+
161
+ return () => <Fragment>First {NextComponent && <NextComponent />}</Fragment>;
162
+ };
163
+
164
+ const secondMiddleware = () => next => request => {
165
+ const NextComponent = next(request);
166
+
167
+ return () => <Fragment>Second {NextComponent && <NextComponent />}</Fragment>;
168
+ };
169
+
170
+ render(
171
+ <Provider middleware={[firstMiddleware]}>
172
+ <Provider middleware={[secondMiddleware]}>
173
+ <Proxy /> <!-- Renders "Second First" -->
174
+ </Provider>
175
+ </Provider>
176
+ );
177
+ ```
178
+
138
179
  ## API
139
180
 
140
181
  ```ts
@@ -155,12 +196,12 @@ function createChainOfResponsibility<Request = undefined, Props = { children?: n
155
196
 
156
197
  ### Return value
157
198
 
158
- | Name | Type | Description |
159
- | --------------------------- | ------------------------------------------------- | ------------------------------------------------------------------------------------- |
160
- | `Provider` | `React.ComponentType` | Entrypoint component, must wraps all usage of customizations |
161
- | `Proxy` | `React.ComponentType` | Proxy component, process the `request` from props and morph into the result component |
162
- | `types` | `{ init, middleware, props, request }` | TypeScript: shorthand types, all objects are `undefined` intentionally |
163
- | `useBuildComponentCallback` | `() => (request, options) => React.ComponentType` | Callback hook which return a function to build the component for rendering the result |
199
+ | Name | Type | Description |
200
+ | --------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
201
+ | `Provider` | `React.ComponentType` | Entrypoint component, must wraps all usage of customizations |
202
+ | `Proxy` | `React.ComponentType` | Proxy component, process the `request` from props and morph into the result component |
203
+ | `types` | `{ init, middleware, props, request }` | TypeScript: shorthand types, all objects are `undefined` intentionally |
204
+ | `useBuildComponentCallback` | `() => (request, options) => React.ComponentType \| false \| null \| undefined` | Callback hook which return a function to build the component for rendering the result |
164
205
 
165
206
  ### Options
166
207
 
@@ -188,7 +229,7 @@ type UseBuildComponentCallback<Request, Props> = (
188
229
  ) => ComponentType<Props> | false | null | undefined;
189
230
  ```
190
231
 
191
- The `fallbackComponent` is a component which all unhandled requests will sink into.
232
+ The `fallbackComponent` is a component which all unhandled requests will sink into, including calls without ancestral `<Provider>`.
192
233
 
193
234
  ### API for Fluent UI
194
235
 
@@ -53,11 +53,18 @@ function applyMiddleware(...arrayOfMiddleware) {
53
53
 
54
54
  // src/createChainOfResponsibility.tsx
55
55
  function createChainOfResponsibility(options = {}) {
56
- const context = createContext({
57
- get useBuildComponentCallback() {
58
- throw new Error("useBuildComponentCallback() hook cannot be used outside of its corresponding <Provider>");
56
+ const defaultUseBuildComponentCallback = {
57
+ get enhancer() {
58
+ return void 0;
59
+ },
60
+ useBuildComponentCallback(_, options2) {
61
+ if (options2 == null ? void 0 : options2.fallbackComponent) {
62
+ return options2.fallbackComponent;
63
+ }
64
+ throw new Error("This component/hook cannot be used outside of its corresponding <Provider>");
59
65
  }
60
- });
66
+ };
67
+ const context = createContext(defaultUseBuildComponentCallback);
61
68
  const Provider = ({ children, init, middleware }) => {
62
69
  if (!Array.isArray(middleware) || middleware.some((middleware2) => typeof middleware2 !== "function")) {
63
70
  throw new Error("middleware prop must be an array of functions");
@@ -88,24 +95,25 @@ function createChainOfResponsibility(options = {}) {
88
95
  };
89
96
  }) : []
90
97
  );
98
+ const { enhancer: parentEnhancer } = useContext(context);
91
99
  const enhancer = useMemo(
92
100
  () => (
93
101
  // We are reversing because it is easier to read:
94
102
  // - With reverse, [a, b, c] will become a(b(c(fn)))
95
103
  // - Without reverse, [a, b, c] will become c(b(a(fn)))
96
104
  applyMiddleware(
97
- ...[...patchedMiddleware].reverse()
105
+ ...[...patchedMiddleware, ...parentEnhancer ? [() => parentEnhancer] : []].reverse()
98
106
  )(init)
99
107
  ),
100
- [init, middleware]
108
+ [init, middleware, parentEnhancer]
101
109
  );
102
110
  const useBuildComponentCallback2 = useCallback(
103
111
  (request, options2 = {}) => enhancer(() => options2.fallbackComponent)(request),
104
112
  [enhancer]
105
113
  );
106
114
  const contextValue = useMemo(
107
- () => ({ useBuildComponentCallback: useBuildComponentCallback2 }),
108
- [useBuildComponentCallback2]
115
+ () => ({ enhancer, useBuildComponentCallback: useBuildComponentCallback2 }),
116
+ [enhancer, useBuildComponentCallback2]
109
117
  );
110
118
  return /* @__PURE__ */ React.createElement(context.Provider, { value: contextValue }, children);
111
119
  };
@@ -120,12 +128,7 @@ function createChainOfResponsibility(options = {}) {
120
128
  // False positive: "children" is not a prop.
121
129
  // eslint-disable-next-line react/prop-types
122
130
  ({ children, fallbackComponent, request, ...props }) => {
123
- let enhancer;
124
- try {
125
- enhancer = useBuildComponentCallback();
126
- } catch {
127
- throw new Error("<Proxy> cannot be used outside of its corresponding <Provider>");
128
- }
131
+ const enhancer = useBuildComponentCallback();
129
132
  const Component = enhancer(request, { fallbackComponent });
130
133
  return Component ? /* @__PURE__ */ React.createElement(Component, { ...props }, children) : null;
131
134
  }
@@ -151,4 +154,4 @@ function createChainOfResponsibility(options = {}) {
151
154
  export {
152
155
  createChainOfResponsibility
153
156
  };
154
- //# sourceMappingURL=chunk-5DXRTBGF.mjs.map
157
+ //# sourceMappingURL=chunk-K3CG46EL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/createChainOfResponsibility.tsx","../src/isReactComponent.ts","../src/private/compose.ts","../src/private/applyMiddleware.ts"],"sourcesContent":["import PropTypes from 'prop-types';\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';\nimport applyMiddleware, { type Enhancer } from './private/applyMiddleware';\nimport { type ComponentMiddleware } from './types';\n\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) => ResultComponent<Props>;\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> = 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\nexport default function createChainOfResponsibility<\n Request = undefined,\n Props = { children?: never },\n Init = undefined\n>(\n options: Options = {}\n): {\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 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 const Provider: ComponentType<ProviderProps<Request, Props, Init>> = ({ children, init, middleware }) => {\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: UseBuildComponentCallback<Request, Props>) => (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),\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 Provider.displayName = 'ChainOfResponsibilityProvider';\n Provider.propTypes = {\n children: PropTypes.any,\n init: PropTypes.any,\n middleware: PropTypes.any\n };\n\n const useBuildComponentCallback = () => useContext(context).useBuildComponentCallback;\n\n const Proxy: ComponentType<ProxyProps<Request, Props>> = memo(\n // False positive: \"children\" is not a prop.\n // eslint-disable-next-line react/prop-types\n ({ children, fallbackComponent, 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\n Proxy.displayName = 'Proxy';\n Proxy.propTypes = {\n fallbackComponent: PropTypes.any,\n request: PropTypes.any\n };\n\n return {\n Provider,\n Proxy,\n types: {\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';\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"]}
@@ -12,18 +12,24 @@ type ComponentMiddleware<Request, Props = {
12
12
  Init
13
13
  ]>;
14
14
 
15
+ type ResultComponent<Props> = ComponentType<Props> | false | null | undefined;
15
16
  type UseBuildComponentCallbackOptions<Props> = {
16
- fallbackComponent?: ComponentType<Props> | false | null | undefined;
17
+ fallbackComponent?: ResultComponent<Props>;
17
18
  };
18
- type UseBuildComponentCallback<Request, Props> = (request: Request, options?: UseBuildComponentCallbackOptions<Props>) => ComponentType<Props> | false | null | undefined;
19
+ type UseBuildComponentCallback<Request, Props> = (request: Request, options?: UseBuildComponentCallbackOptions<Props>) => ResultComponent<Props>;
19
20
  type ProviderProps<Request, Props, Init> = PropsWithChildren<{
20
21
  middleware: readonly ComponentMiddleware<Request, Props, Init>[];
21
- }> & (Init extends never | undefined ? {
22
+ }> & (Init extends never | void ? {
23
+ init?: undefined;
24
+ } : Init extends undefined ? {
22
25
  init?: Init;
23
26
  } : {
24
27
  init: Init;
25
28
  });
26
- type ProxyProps<Request, Props> = PropsWithChildren<Request extends never | undefined ? Props & {
29
+ type ProxyProps<Request, Props> = PropsWithChildren<Request extends never | void ? Props & {
30
+ fallbackComponent?: ComponentType<Props>;
31
+ request?: undefined;
32
+ } : Request extends undefined ? Props & {
27
33
  fallbackComponent?: ComponentType<Props>;
28
34
  request?: Request;
29
35
  } : Props & {
@@ -12,18 +12,24 @@ type ComponentMiddleware<Request, Props = {
12
12
  Init
13
13
  ]>;
14
14
 
15
+ type ResultComponent<Props> = ComponentType<Props> | false | null | undefined;
15
16
  type UseBuildComponentCallbackOptions<Props> = {
16
- fallbackComponent?: ComponentType<Props> | false | null | undefined;
17
+ fallbackComponent?: ResultComponent<Props>;
17
18
  };
18
- type UseBuildComponentCallback<Request, Props> = (request: Request, options?: UseBuildComponentCallbackOptions<Props>) => ComponentType<Props> | false | null | undefined;
19
+ type UseBuildComponentCallback<Request, Props> = (request: Request, options?: UseBuildComponentCallbackOptions<Props>) => ResultComponent<Props>;
19
20
  type ProviderProps<Request, Props, Init> = PropsWithChildren<{
20
21
  middleware: readonly ComponentMiddleware<Request, Props, Init>[];
21
- }> & (Init extends never | undefined ? {
22
+ }> & (Init extends never | void ? {
23
+ init?: undefined;
24
+ } : Init extends undefined ? {
22
25
  init?: Init;
23
26
  } : {
24
27
  init: Init;
25
28
  });
26
- type ProxyProps<Request, Props> = PropsWithChildren<Request extends never | undefined ? Props & {
29
+ type ProxyProps<Request, Props> = PropsWithChildren<Request extends never | void ? Props & {
30
+ fallbackComponent?: ComponentType<Props>;
31
+ request?: undefined;
32
+ } : Request extends undefined ? Props & {
27
33
  fallbackComponent?: ComponentType<Props>;
28
34
  request?: Request;
29
35
  } : Props & {
@@ -85,11 +85,18 @@ function applyMiddleware(...arrayOfMiddleware) {
85
85
 
86
86
  // src/createChainOfResponsibility.tsx
87
87
  function createChainOfResponsibility(options = {}) {
88
- const context = (0, import_react.createContext)({
89
- get useBuildComponentCallback() {
90
- throw new Error("useBuildComponentCallback() hook cannot be used outside of its corresponding <Provider>");
88
+ const defaultUseBuildComponentCallback = {
89
+ get enhancer() {
90
+ return void 0;
91
+ },
92
+ useBuildComponentCallback(_, options2) {
93
+ if (options2 == null ? void 0 : options2.fallbackComponent) {
94
+ return options2.fallbackComponent;
95
+ }
96
+ throw new Error("This component/hook cannot be used outside of its corresponding <Provider>");
91
97
  }
92
- });
98
+ };
99
+ const context = (0, import_react.createContext)(defaultUseBuildComponentCallback);
93
100
  const Provider = ({ children, init, middleware }) => {
94
101
  if (!Array.isArray(middleware) || middleware.some((middleware2) => typeof middleware2 !== "function")) {
95
102
  throw new Error("middleware prop must be an array of functions");
@@ -120,24 +127,25 @@ function createChainOfResponsibility(options = {}) {
120
127
  };
121
128
  }) : []
122
129
  );
130
+ const { enhancer: parentEnhancer } = (0, import_react.useContext)(context);
123
131
  const enhancer = (0, import_react.useMemo)(
124
132
  () => (
125
133
  // We are reversing because it is easier to read:
126
134
  // - With reverse, [a, b, c] will become a(b(c(fn)))
127
135
  // - Without reverse, [a, b, c] will become c(b(a(fn)))
128
136
  applyMiddleware(
129
- ...[...patchedMiddleware].reverse()
137
+ ...[...patchedMiddleware, ...parentEnhancer ? [() => parentEnhancer] : []].reverse()
130
138
  )(init)
131
139
  ),
132
- [init, middleware]
140
+ [init, middleware, parentEnhancer]
133
141
  );
134
142
  const useBuildComponentCallback2 = (0, import_react.useCallback)(
135
143
  (request, options2 = {}) => enhancer(() => options2.fallbackComponent)(request),
136
144
  [enhancer]
137
145
  );
138
146
  const contextValue = (0, import_react.useMemo)(
139
- () => ({ useBuildComponentCallback: useBuildComponentCallback2 }),
140
- [useBuildComponentCallback2]
147
+ () => ({ enhancer, useBuildComponentCallback: useBuildComponentCallback2 }),
148
+ [enhancer, useBuildComponentCallback2]
141
149
  );
142
150
  return /* @__PURE__ */ import_react.default.createElement(context.Provider, { value: contextValue }, children);
143
151
  };
@@ -152,12 +160,7 @@ function createChainOfResponsibility(options = {}) {
152
160
  // False positive: "children" is not a prop.
153
161
  // eslint-disable-next-line react/prop-types
154
162
  ({ children, fallbackComponent, request, ...props }) => {
155
- let enhancer;
156
- try {
157
- enhancer = useBuildComponentCallback();
158
- } catch {
159
- throw new Error("<Proxy> cannot be used outside of its corresponding <Provider>");
160
- }
163
+ const enhancer = useBuildComponentCallback();
161
164
  const Component = enhancer(request, { fallbackComponent });
162
165
  return Component ? /* @__PURE__ */ import_react.default.createElement(Component, { ...props }, children) : null;
163
166
  }
@@ -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';\n\nexport { createChainOfResponsibilityForFluentUI };\n","import { type IRenderFunction } from '@fluentui/react';\nimport React, { useCallback, type Key } from 'react';\n\nimport createChainOfResponsibility from './createChainOfResponsibility';\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 PropTypes from 'prop-types';\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';\nimport applyMiddleware from './private/applyMiddleware';\nimport { type ComponentMiddleware } from './types';\n\ntype UseBuildComponentCallbackOptions<Props> = { fallbackComponent?: ComponentType<Props> | false | null | undefined };\n\ntype UseBuildComponentCallback<Request, Props> = (\n request: Request,\n options?: UseBuildComponentCallbackOptions<Props>\n) => ComponentType<Props> | false | null | undefined;\n\ntype ProviderContext<Request, Props> = {\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 | undefined ? { init?: Init } : { init: Init });\n\ntype ProxyProps<Request, Props> = PropsWithChildren<\n Request extends never | 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\nexport default function createChainOfResponsibility<\n Request = undefined,\n Props = { children?: never },\n Init = undefined\n>(\n options: Options = {}\n): {\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 props: Props;\n request: Request;\n };\n useBuildComponentCallback: () => UseBuildComponentCallback<Request, Props>;\n} {\n const context = createContext<ProviderContext<Request, Props>>({\n get useBuildComponentCallback(): ProviderContext<Request, Props>['useBuildComponentCallback'] {\n throw new Error('useBuildComponentCallback() hook cannot be used outside of its corresponding <Provider>');\n }\n });\n\n const Provider: ComponentType<ProviderProps<Request, Props, Init>> = ({ children, init, middleware }) => {\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: UseBuildComponentCallback<Request, Props>) => (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 = 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], ComponentType<Props> | false | null | undefined, [Init]>(\n ...[...patchedMiddleware].reverse()\n )(init as Init),\n [init, middleware]\n );\n\n const useBuildComponentCallback = useCallback<UseBuildComponentCallback<Request, Props>>(\n (request, options = {}) => enhancer(() => options.fallbackComponent)(request),\n [enhancer]\n );\n\n const contextValue = useMemo<ProviderContext<Request, Props>>(\n () => ({ useBuildComponentCallback }),\n [useBuildComponentCallback]\n );\n\n return <context.Provider value={contextValue}>{children}</context.Provider>;\n };\n\n Provider.displayName = 'ChainOfResponsibilityProvider';\n Provider.propTypes = {\n children: PropTypes.any,\n init: PropTypes.any,\n middleware: PropTypes.any\n };\n\n const useBuildComponentCallback = () => useContext(context).useBuildComponentCallback;\n\n const Proxy: ComponentType<ProxyProps<Request, Props>> = memo(\n // False positive: \"children\" is not a prop.\n // eslint-disable-next-line react/prop-types\n ({ children, fallbackComponent, request, ...props }) => {\n let enhancer: ReturnType<typeof useBuildComponentCallback>;\n\n try {\n enhancer = useBuildComponentCallback();\n } catch {\n throw new Error('<Proxy> cannot be used outside of its corresponding <Provider>');\n }\n\n const Component = enhancer(request as Request, { fallbackComponent });\n\n return Component ? <Component {...(props as Props)}>{children}</Component> : null;\n }\n );\n\n Proxy.displayName = 'Proxy';\n Proxy.propTypes = {\n fallbackComponent: PropTypes.any,\n request: PropTypes.any\n };\n\n return {\n Provider,\n Proxy,\n types: {\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';\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","middleware","init","enhancer","useBuildComponentCallback","options","React","PropTypes","Proxy","Proxy","options","React"]}
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';\n\nexport { createChainOfResponsibilityForFluentUI };\n","import { type IRenderFunction } from '@fluentui/react';\nimport React, { useCallback, type Key } from 'react';\n\nimport createChainOfResponsibility from './createChainOfResponsibility';\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 PropTypes from 'prop-types';\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';\nimport applyMiddleware, { type Enhancer } from './private/applyMiddleware';\nimport { type ComponentMiddleware } from './types';\n\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) => ResultComponent<Props>;\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> = 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\nexport default function createChainOfResponsibility<\n Request = undefined,\n Props = { children?: never },\n Init = undefined\n>(\n options: Options = {}\n): {\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 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 const Provider: ComponentType<ProviderProps<Request, Props, Init>> = ({ children, init, middleware }) => {\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: UseBuildComponentCallback<Request, Props>) => (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),\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 Provider.displayName = 'ChainOfResponsibilityProvider';\n Provider.propTypes = {\n children: PropTypes.any,\n init: PropTypes.any,\n middleware: PropTypes.any\n };\n\n const useBuildComponentCallback = () => useContext(context).useBuildComponentCallback;\n\n const Proxy: ComponentType<ProxyProps<Request, Props>> = memo(\n // False positive: \"children\" is not a prop.\n // eslint-disable-next-line react/prop-types\n ({ children, fallbackComponent, 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\n Proxy.displayName = 'Proxy';\n Proxy.propTypes = {\n fallbackComponent: PropTypes.any,\n request: PropTypes.any\n };\n\n return {\n Provider,\n Proxy,\n types: {\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';\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","PropTypes","Proxy","Proxy","options","React"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createChainOfResponsibility
3
- } from "./chunk-5DXRTBGF.mjs";
3
+ } from "./chunk-K3CG46EL.mjs";
4
4
 
5
5
  // src/createChainOfResponsibilityForFluentUI.tsx
6
6
  import React, { useCallback } from "react";
@@ -82,11 +82,18 @@ function applyMiddleware(...arrayOfMiddleware) {
82
82
 
83
83
  // src/createChainOfResponsibility.tsx
84
84
  function createChainOfResponsibility(options = {}) {
85
- const context = (0, import_react.createContext)({
86
- get useBuildComponentCallback() {
87
- throw new Error("useBuildComponentCallback() hook cannot be used outside of its corresponding <Provider>");
85
+ const defaultUseBuildComponentCallback = {
86
+ get enhancer() {
87
+ return void 0;
88
+ },
89
+ useBuildComponentCallback(_, options2) {
90
+ if (options2 == null ? void 0 : options2.fallbackComponent) {
91
+ return options2.fallbackComponent;
92
+ }
93
+ throw new Error("This component/hook cannot be used outside of its corresponding <Provider>");
88
94
  }
89
- });
95
+ };
96
+ const context = (0, import_react.createContext)(defaultUseBuildComponentCallback);
90
97
  const Provider = ({ children, init, middleware }) => {
91
98
  if (!Array.isArray(middleware) || middleware.some((middleware2) => typeof middleware2 !== "function")) {
92
99
  throw new Error("middleware prop must be an array of functions");
@@ -117,24 +124,25 @@ function createChainOfResponsibility(options = {}) {
117
124
  };
118
125
  }) : []
119
126
  );
127
+ const { enhancer: parentEnhancer } = (0, import_react.useContext)(context);
120
128
  const enhancer = (0, import_react.useMemo)(
121
129
  () => (
122
130
  // We are reversing because it is easier to read:
123
131
  // - With reverse, [a, b, c] will become a(b(c(fn)))
124
132
  // - Without reverse, [a, b, c] will become c(b(a(fn)))
125
133
  applyMiddleware(
126
- ...[...patchedMiddleware].reverse()
134
+ ...[...patchedMiddleware, ...parentEnhancer ? [() => parentEnhancer] : []].reverse()
127
135
  )(init)
128
136
  ),
129
- [init, middleware]
137
+ [init, middleware, parentEnhancer]
130
138
  );
131
139
  const useBuildComponentCallback2 = (0, import_react.useCallback)(
132
140
  (request, options2 = {}) => enhancer(() => options2.fallbackComponent)(request),
133
141
  [enhancer]
134
142
  );
135
143
  const contextValue = (0, import_react.useMemo)(
136
- () => ({ useBuildComponentCallback: useBuildComponentCallback2 }),
137
- [useBuildComponentCallback2]
144
+ () => ({ enhancer, useBuildComponentCallback: useBuildComponentCallback2 }),
145
+ [enhancer, useBuildComponentCallback2]
138
146
  );
139
147
  return /* @__PURE__ */ import_react.default.createElement(context.Provider, { value: contextValue }, children);
140
148
  };
@@ -149,12 +157,7 @@ function createChainOfResponsibility(options = {}) {
149
157
  // False positive: "children" is not a prop.
150
158
  // eslint-disable-next-line react/prop-types
151
159
  ({ children, fallbackComponent, request, ...props }) => {
152
- let enhancer;
153
- try {
154
- enhancer = useBuildComponentCallback();
155
- } catch {
156
- throw new Error("<Proxy> cannot be used outside of its corresponding <Provider>");
157
- }
160
+ const enhancer = useBuildComponentCallback();
158
161
  const Component = enhancer(request, { fallbackComponent });
159
162
  return Component ? /* @__PURE__ */ import_react.default.createElement(Component, { ...props }, children) : null;
160
163
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/createChainOfResponsibility.tsx","../src/isReactComponent.ts","../src/private/compose.ts","../src/private/applyMiddleware.ts"],"sourcesContent":["import createChainOfResponsibility from './createChainOfResponsibility';\n\nimport type { ComponentMiddleware } from './types';\n\nexport { createChainOfResponsibility };\n\nexport type { ComponentMiddleware };\n","import PropTypes from 'prop-types';\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';\nimport applyMiddleware from './private/applyMiddleware';\nimport { type ComponentMiddleware } from './types';\n\ntype UseBuildComponentCallbackOptions<Props> = { fallbackComponent?: ComponentType<Props> | false | null | undefined };\n\ntype UseBuildComponentCallback<Request, Props> = (\n request: Request,\n options?: UseBuildComponentCallbackOptions<Props>\n) => ComponentType<Props> | false | null | undefined;\n\ntype ProviderContext<Request, Props> = {\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 | undefined ? { init?: Init } : { init: Init });\n\ntype ProxyProps<Request, Props> = PropsWithChildren<\n Request extends never | 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\nexport default function createChainOfResponsibility<\n Request = undefined,\n Props = { children?: never },\n Init = undefined\n>(\n options: Options = {}\n): {\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 props: Props;\n request: Request;\n };\n useBuildComponentCallback: () => UseBuildComponentCallback<Request, Props>;\n} {\n const context = createContext<ProviderContext<Request, Props>>({\n get useBuildComponentCallback(): ProviderContext<Request, Props>['useBuildComponentCallback'] {\n throw new Error('useBuildComponentCallback() hook cannot be used outside of its corresponding <Provider>');\n }\n });\n\n const Provider: ComponentType<ProviderProps<Request, Props, Init>> = ({ children, init, middleware }) => {\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: UseBuildComponentCallback<Request, Props>) => (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 = 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], ComponentType<Props> | false | null | undefined, [Init]>(\n ...[...patchedMiddleware].reverse()\n )(init as Init),\n [init, middleware]\n );\n\n const useBuildComponentCallback = useCallback<UseBuildComponentCallback<Request, Props>>(\n (request, options = {}) => enhancer(() => options.fallbackComponent)(request),\n [enhancer]\n );\n\n const contextValue = useMemo<ProviderContext<Request, Props>>(\n () => ({ useBuildComponentCallback }),\n [useBuildComponentCallback]\n );\n\n return <context.Provider value={contextValue}>{children}</context.Provider>;\n };\n\n Provider.displayName = 'ChainOfResponsibilityProvider';\n Provider.propTypes = {\n children: PropTypes.any,\n init: PropTypes.any,\n middleware: PropTypes.any\n };\n\n const useBuildComponentCallback = () => useContext(context).useBuildComponentCallback;\n\n const Proxy: ComponentType<ProxyProps<Request, Props>> = memo(\n // False positive: \"children\" is not a prop.\n // eslint-disable-next-line react/prop-types\n ({ children, fallbackComponent, request, ...props }) => {\n let enhancer: ReturnType<typeof useBuildComponentCallback>;\n\n try {\n enhancer = useBuildComponentCallback();\n } catch {\n throw new Error('<Proxy> cannot be used outside of its corresponding <Provider>');\n }\n\n const Component = enhancer(request as Request, { fallbackComponent });\n\n return Component ? <Component {...(props as Props)}>{children}</Component> : null;\n }\n );\n\n Proxy.displayName = 'Proxy';\n Proxy.propTypes = {\n fallbackComponent: PropTypes.any,\n request: PropTypes.any\n };\n\n return {\n Provider,\n Proxy,\n types: {\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';\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","middleware","init","enhancer","useBuildComponentCallback","options","React","PropTypes","Proxy"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/createChainOfResponsibility.tsx","../src/isReactComponent.ts","../src/private/compose.ts","../src/private/applyMiddleware.ts"],"sourcesContent":["import createChainOfResponsibility from './createChainOfResponsibility';\n\nimport type { ComponentMiddleware } from './types';\n\nexport { createChainOfResponsibility };\n\nexport type { ComponentMiddleware };\n","import PropTypes from 'prop-types';\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';\nimport applyMiddleware, { type Enhancer } from './private/applyMiddleware';\nimport { type ComponentMiddleware } from './types';\n\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) => ResultComponent<Props>;\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> = 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\nexport default function createChainOfResponsibility<\n Request = undefined,\n Props = { children?: never },\n Init = undefined\n>(\n options: Options = {}\n): {\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 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 const Provider: ComponentType<ProviderProps<Request, Props, Init>> = ({ children, init, middleware }) => {\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: UseBuildComponentCallback<Request, Props>) => (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),\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 Provider.displayName = 'ChainOfResponsibilityProvider';\n Provider.propTypes = {\n children: PropTypes.any,\n init: PropTypes.any,\n middleware: PropTypes.any\n };\n\n const useBuildComponentCallback = () => useContext(context).useBuildComponentCallback;\n\n const Proxy: ComponentType<ProxyProps<Request, Props>> = memo(\n // False positive: \"children\" is not a prop.\n // eslint-disable-next-line react/prop-types\n ({ children, fallbackComponent, 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\n Proxy.displayName = 'Proxy';\n Proxy.propTypes = {\n fallbackComponent: PropTypes.any,\n request: PropTypes.any\n };\n\n return {\n Provider,\n Proxy,\n types: {\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';\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","PropTypes","Proxy"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createChainOfResponsibility
3
- } from "./chunk-5DXRTBGF.mjs";
3
+ } from "./chunk-K3CG46EL.mjs";
4
4
  export {
5
5
  createChainOfResponsibility
6
6
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-chain-of-responsibility",
3
- "version": "0.2.0-main.7f3fe00",
3
+ "version": "0.2.0-main.9d496d9",
4
4
  "description": "Using chain of responsibility design pattern for React component customization.",
5
5
  "files": [
6
6
  "./dist/"
@@ -85,26 +85,27 @@
85
85
  }
86
86
  },
87
87
  "devDependencies": {
88
- "@babel/preset-env": "^7.24.6",
89
- "@babel/preset-react": "^7.24.6",
90
- "@babel/preset-typescript": "^7.24.6",
91
- "@fluentui/react": "^8.118.6",
92
- "@testing-library/react": "^15.0.7",
88
+ "@babel/preset-env": "^7.24.7",
89
+ "@babel/preset-react": "^7.24.7",
90
+ "@babel/preset-typescript": "^7.24.7",
91
+ "@fluentui/react": "^8.118.7",
92
+ "@testing-library/dom": "^10.1.0",
93
+ "@testing-library/react": "^16.0.0",
93
94
  "@tsconfig/recommended": "^1.0.6",
94
95
  "@tsconfig/strictest": "^2.0.5",
95
96
  "@types/jest": "^29.5.12",
96
- "@types/node": "^20.12.13",
97
+ "@types/node": "^20.14.2",
97
98
  "@types/react": "^18.3.3",
98
- "esbuild": "^0.21.4",
99
+ "esbuild": "^0.21.5",
99
100
  "escape-string-regexp": "^5.0.0",
100
101
  "jest": "^29.7.0",
101
102
  "jest-environment-jsdom": "^29.7.0",
102
- "prettier": "^3.2.5",
103
+ "prettier": "^3.3.2",
103
104
  "react": "^18.3.1",
104
105
  "react-dom": "^18.3.1",
105
106
  "react-test-renderer": "^18.3.1",
106
107
  "react-wrap-with": "^0.1.0",
107
- "tsup": "^8.0.2",
108
+ "tsup": "^8.1.0",
108
109
  "typescript": "^5.4.5"
109
110
  },
110
111
  "peerDependencies": {
@@ -112,6 +113,6 @@
112
113
  },
113
114
  "dependencies": {
114
115
  "prop-types": "^15.8.1",
115
- "react-chain-of-responsibility": "^0.2.0-main.7f3fe00"
116
+ "react-chain-of-responsibility": "^0.2.0-main.9d496d9"
116
117
  }
117
118
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/createChainOfResponsibility.tsx","../src/isReactComponent.ts","../src/private/compose.ts","../src/private/applyMiddleware.ts"],"sourcesContent":["import PropTypes from 'prop-types';\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';\nimport applyMiddleware from './private/applyMiddleware';\nimport { type ComponentMiddleware } from './types';\n\ntype UseBuildComponentCallbackOptions<Props> = { fallbackComponent?: ComponentType<Props> | false | null | undefined };\n\ntype UseBuildComponentCallback<Request, Props> = (\n request: Request,\n options?: UseBuildComponentCallbackOptions<Props>\n) => ComponentType<Props> | false | null | undefined;\n\ntype ProviderContext<Request, Props> = {\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 | undefined ? { init?: Init } : { init: Init });\n\ntype ProxyProps<Request, Props> = PropsWithChildren<\n Request extends never | 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\nexport default function createChainOfResponsibility<\n Request = undefined,\n Props = { children?: never },\n Init = undefined\n>(\n options: Options = {}\n): {\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 props: Props;\n request: Request;\n };\n useBuildComponentCallback: () => UseBuildComponentCallback<Request, Props>;\n} {\n const context = createContext<ProviderContext<Request, Props>>({\n get useBuildComponentCallback(): ProviderContext<Request, Props>['useBuildComponentCallback'] {\n throw new Error('useBuildComponentCallback() hook cannot be used outside of its corresponding <Provider>');\n }\n });\n\n const Provider: ComponentType<ProviderProps<Request, Props, Init>> = ({ children, init, middleware }) => {\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: UseBuildComponentCallback<Request, Props>) => (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 = 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], ComponentType<Props> | false | null | undefined, [Init]>(\n ...[...patchedMiddleware].reverse()\n )(init as Init),\n [init, middleware]\n );\n\n const useBuildComponentCallback = useCallback<UseBuildComponentCallback<Request, Props>>(\n (request, options = {}) => enhancer(() => options.fallbackComponent)(request),\n [enhancer]\n );\n\n const contextValue = useMemo<ProviderContext<Request, Props>>(\n () => ({ useBuildComponentCallback }),\n [useBuildComponentCallback]\n );\n\n return <context.Provider value={contextValue}>{children}</context.Provider>;\n };\n\n Provider.displayName = 'ChainOfResponsibilityProvider';\n Provider.propTypes = {\n children: PropTypes.any,\n init: PropTypes.any,\n middleware: PropTypes.any\n };\n\n const useBuildComponentCallback = () => useContext(context).useBuildComponentCallback;\n\n const Proxy: ComponentType<ProxyProps<Request, Props>> = memo(\n // False positive: \"children\" is not a prop.\n // eslint-disable-next-line react/prop-types\n ({ children, fallbackComponent, request, ...props }) => {\n let enhancer: ReturnType<typeof useBuildComponentCallback>;\n\n try {\n enhancer = useBuildComponentCallback();\n } catch {\n throw new Error('<Proxy> cannot be used outside of its corresponding <Provider>');\n }\n\n const Component = enhancer(request as Request, { fallbackComponent });\n\n return Component ? <Component {...(props as Props)}>{children}</Component> : null;\n }\n );\n\n Proxy.displayName = 'Proxy';\n Proxy.propTypes = {\n fallbackComponent: PropTypes.any,\n request: PropTypes.any\n };\n\n return {\n Provider,\n Proxy,\n types: {\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';\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","middleware","init","enhancer","useBuildComponentCallback","options"]}