react-chain-of-responsibility 0.4.0-main.feea005 → 0.4.1-main.275c1f4

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.
@@ -44,13 +44,15 @@ var import_react = __toESM(require("react"));
44
44
  // src/isReactComponent.ts
45
45
  var import_valibot = require("valibot");
46
46
  function isConsumer(component) {
47
- return component?.$$typeof?.toString() === "Symbol(react.context)";
47
+ var _a;
48
+ return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.context)";
48
49
  }
49
50
  function isProvider(component) {
50
- return component?.$$typeof?.toString() === "Symbol(react.provider)";
51
+ var _a;
52
+ return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.provider)";
51
53
  }
52
54
  function isFragment(component) {
53
- return component?.toString() === "Symbol(react.fragment)";
55
+ return (component == null ? void 0 : component.toString()) === "Symbol(react.fragment)";
54
56
  }
55
57
  function isFunctionComponent(component) {
56
58
  if (typeof component === "function") {
@@ -59,10 +61,11 @@ function isFunctionComponent(component) {
59
61
  return isPureFunctionComponent(component);
60
62
  }
61
63
  function isPureFunctionComponent(component) {
62
- return component?.$$typeof?.toString() === "Symbol(react.memo)" && isFunctionComponent(component.type);
64
+ var _a;
65
+ return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.memo)" && isFunctionComponent(component.type);
63
66
  }
64
67
  function isComponentClass(component) {
65
- return typeof component === "object" && typeof component?.["render"] === "function";
68
+ return typeof component === "object" && typeof (component == null ? void 0 : component["render"]) === "function";
66
69
  }
67
70
  function isReactComponent(component) {
68
71
  return isFunctionComponent(component) || isComponentClass(component) || isFragment(component) || isConsumer(component) || isProvider(component);
@@ -76,7 +79,7 @@ function createChainOfResponsibility(options = {}) {
76
79
  return void 0;
77
80
  },
78
81
  useBuildComponentCallback(_request, options2) {
79
- if (!options2?.fallbackComponent) {
82
+ if (!(options2 == null ? void 0 : options2.fallbackComponent)) {
80
83
  throw new Error("This component/hook cannot be used outside of its corresponding <Provider>");
81
84
  }
82
85
  return options2.fallbackComponent;
@@ -186,7 +189,7 @@ function createChainOfResponsibilityForFluentUI(options) {
186
189
  (props, defaultRender) => (
187
190
  // We no longer validate the correctness of this function.
188
191
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
189
- /* @__PURE__ */ import_react2.default.createElement(Proxy2, { ...props, fallbackComponent: defaultRender, key: getKey?.(props), request: props })
192
+ /* @__PURE__ */ import_react2.default.createElement(Proxy2, { ...props, fallbackComponent: defaultRender, key: getKey == null ? void 0 : getKey(props), request: props })
190
193
  ),
191
194
  [getKey]
192
195
  );
@@ -1 +1 @@
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
+ {"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"]}
@@ -41,13 +41,15 @@ var import_react = __toESM(require("react"));
41
41
  // src/isReactComponent.ts
42
42
  var import_valibot = require("valibot");
43
43
  function isConsumer(component) {
44
- return component?.$$typeof?.toString() === "Symbol(react.context)";
44
+ var _a;
45
+ return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.context)";
45
46
  }
46
47
  function isProvider(component) {
47
- return component?.$$typeof?.toString() === "Symbol(react.provider)";
48
+ var _a;
49
+ return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.provider)";
48
50
  }
49
51
  function isFragment(component) {
50
- return component?.toString() === "Symbol(react.fragment)";
52
+ return (component == null ? void 0 : component.toString()) === "Symbol(react.fragment)";
51
53
  }
52
54
  function isFunctionComponent(component) {
53
55
  if (typeof component === "function") {
@@ -56,10 +58,11 @@ function isFunctionComponent(component) {
56
58
  return isPureFunctionComponent(component);
57
59
  }
58
60
  function isPureFunctionComponent(component) {
59
- return component?.$$typeof?.toString() === "Symbol(react.memo)" && isFunctionComponent(component.type);
61
+ var _a;
62
+ return ((_a = component == null ? void 0 : component.$$typeof) == null ? void 0 : _a.toString()) === "Symbol(react.memo)" && isFunctionComponent(component.type);
60
63
  }
61
64
  function isComponentClass(component) {
62
- return typeof component === "object" && typeof component?.["render"] === "function";
65
+ return typeof component === "object" && typeof (component == null ? void 0 : component["render"]) === "function";
63
66
  }
64
67
  function isReactComponent(component) {
65
68
  return isFunctionComponent(component) || isComponentClass(component) || isFragment(component) || isConsumer(component) || isProvider(component);
@@ -73,7 +76,7 @@ function createChainOfResponsibility(options = {}) {
73
76
  return void 0;
74
77
  },
75
78
  useBuildComponentCallback(_request, options2) {
76
- if (!options2?.fallbackComponent) {
79
+ if (!(options2 == null ? void 0 : options2.fallbackComponent)) {
77
80
  throw new Error("This component/hook cannot be used outside of its corresponding <Provider>");
78
81
  }
79
82
  return options2.fallbackComponent;
@@ -1 +1 @@
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
+ {"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,4 +1,5 @@
1
- import { ComponentType, PropsWithChildren, ReactNode } from 'react';
1
+ import { ComponentType, PropsWithChildren, ReactElement, ReactNode } from 'react';
2
+ import { SetOptional } from 'type-fest';
2
3
 
3
4
  declare global {
4
5
  interface ArrayConstructor {
@@ -29,15 +30,26 @@ type ChainOfResponsibility<Request, Props extends BaseProps, Init> = {
29
30
  readonly useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props>;
30
31
  };
31
32
  declare const DO_NOT_CREATE_THIS_OBJECT_YOURSELF: unique symbol;
32
- type ComponentRenderer<Props> = (props: Props) => ReactNode;
33
+ type ComponentRenderer<Props> = (props: Props) => ReactElement | null;
33
34
  interface ComponentHandlerResult<Props extends BaseProps> {
34
35
  readonly [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined;
35
- readonly render: (overridingProps?: Partial<Props> | undefined) => ReactNode;
36
+ readonly render: (overridingProps?: Partial<Props> | undefined) => ReactElement | null;
36
37
  }
37
38
  type ComponentHandler<Request, Props extends BaseProps> = (request: Request) => ComponentHandlerResult<Props> | undefined;
38
39
  type ComponentEnhancer<Request, Props extends BaseProps> = (next: ComponentHandler<Request, Props>) => ComponentHandler<Request, Props>;
39
40
  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 ReactComponentInit<Props extends BaseProps, W extends (BaseProps & {
42
+ children?: ReactNode | undefined;
43
+ }) | void = void> = W extends void ? {
44
+ wrapperComponent?: undefined;
45
+ wrapperProps?: undefined;
46
+ } : {
47
+ wrapperComponent: ComponentType<W>;
48
+ wrapperProps: W | ((props: Props) => W);
49
+ };
50
+ type ReactComponentHandlerResult<Props extends BaseProps> = <P extends Props, W extends (BaseProps & {
51
+ children?: ReactNode | undefined;
52
+ }) | void = void>(component: ComponentType<P>, bindProps?: SetOptional<P, keyof Props> | ((props: Props) => SetOptional<P, keyof Props>) | undefined, init?: ReactComponentInit<Props, W>) => ComponentHandlerResult<Props>;
41
53
  type UseBuildRenderCallbackOptions<Props> = {
42
54
  readonly fallbackComponent?: ComponentType<Props> | undefined;
43
55
  };
@@ -1,4 +1,5 @@
1
- import { ComponentType, PropsWithChildren, ReactNode } from 'react';
1
+ import { ComponentType, PropsWithChildren, ReactElement, ReactNode } from 'react';
2
+ import { SetOptional } from 'type-fest';
2
3
 
3
4
  declare global {
4
5
  interface ArrayConstructor {
@@ -29,15 +30,26 @@ type ChainOfResponsibility<Request, Props extends BaseProps, Init> = {
29
30
  readonly useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props>;
30
31
  };
31
32
  declare const DO_NOT_CREATE_THIS_OBJECT_YOURSELF: unique symbol;
32
- type ComponentRenderer<Props> = (props: Props) => ReactNode;
33
+ type ComponentRenderer<Props> = (props: Props) => ReactElement | null;
33
34
  interface ComponentHandlerResult<Props extends BaseProps> {
34
35
  readonly [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined;
35
- readonly render: (overridingProps?: Partial<Props> | undefined) => ReactNode;
36
+ readonly render: (overridingProps?: Partial<Props> | undefined) => ReactElement | null;
36
37
  }
37
38
  type ComponentHandler<Request, Props extends BaseProps> = (request: Request) => ComponentHandlerResult<Props> | undefined;
38
39
  type ComponentEnhancer<Request, Props extends BaseProps> = (next: ComponentHandler<Request, Props>) => ComponentHandler<Request, Props>;
39
40
  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 ReactComponentInit<Props extends BaseProps, W extends (BaseProps & {
42
+ children?: ReactNode | undefined;
43
+ }) | void = void> = W extends void ? {
44
+ wrapperComponent?: undefined;
45
+ wrapperProps?: undefined;
46
+ } : {
47
+ wrapperComponent: ComponentType<W>;
48
+ wrapperProps: W | ((props: Props) => W);
49
+ };
50
+ type ReactComponentHandlerResult<Props extends BaseProps> = <P extends Props, W extends (BaseProps & {
51
+ children?: ReactNode | undefined;
52
+ }) | void = void>(component: ComponentType<P>, bindProps?: SetOptional<P, keyof Props> | ((props: Props) => SetOptional<P, keyof Props>) | undefined, init?: ReactComponentInit<Props, W>) => ComponentHandlerResult<Props>;
41
53
  type UseBuildRenderCallbackOptions<Props> = {
42
54
  readonly fallbackComponent?: ComponentType<Props> | undefined;
43
55
  };
@@ -36,7 +36,7 @@ module.exports = __toCommonJS(index_preview_exports);
36
36
 
37
37
  // src/preview/createChainOfResponsibilityAsRenderCallback.tsx
38
38
  var import_handler_chain = require("handler-chain");
39
- var import_react2 = __toESM(require("react"));
39
+ var import_react = __toESM(require("react"));
40
40
  var import_valibot = require("valibot");
41
41
 
42
42
  // src/preview/private/arePropsEqual.ts
@@ -58,31 +58,21 @@ function arePropsEqual(x, y) {
58
58
  return true;
59
59
  }
60
60
 
61
- // src/preview/private/useMemoValueWithEquality.ts
62
- var import_react = require("react");
63
- var NOT_INITIALIZED = Symbol();
64
- function useMemoValueWithEquality(factory, equalityFn) {
65
- const prevRef = (0, import_react.useRef)(NOT_INITIALIZED);
66
- const next = factory();
67
- const current = prevRef.current !== NOT_INITIALIZED && equalityFn(prevRef.current, next) ? prevRef.current : next;
68
- (0, import_react.useEffect)(() => {
69
- prevRef.current = current;
70
- });
71
- return current;
72
- }
73
-
74
61
  // src/preview/createChainOfResponsibilityAsRenderCallback.tsx
75
62
  var DO_NOT_CREATE_THIS_OBJECT_YOURSELF = Symbol();
76
63
  var componentHandlerResultSchema = (0, import_valibot.custom)(
77
64
  (value) => (0, import_valibot.safeParse)((0, import_valibot.object)({ render: (0, import_valibot.function_)() }), value).success && !!value && typeof value === "object" && DO_NOT_CREATE_THIS_OBJECT_YOURSELF in value,
78
65
  "react-chain-of-responsibility: middleware must return value constructed by reactComponent()"
79
66
  );
67
+ function createComponentHandlerResult(render) {
68
+ return Object.freeze({ [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: void 0, render });
69
+ }
80
70
  function createChainOfResponsibility(options = {}) {
81
71
  options = Object.freeze({ ...options });
82
- const BuildContext = (0, import_react2.createContext)(
72
+ const BuildContext = (0, import_react.createContext)(
83
73
  Object.freeze({ enhancer: (next) => (request) => next(request) })
84
74
  );
85
- const RenderContext = (0, import_react2.createContext)(
75
+ const RenderContext = (0, import_react.createContext)(
86
76
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
87
77
  new Proxy({}, {
88
78
  get() {
@@ -92,37 +82,52 @@ function createChainOfResponsibility(options = {}) {
92
82
  }
93
83
  })
94
84
  );
95
- function reactComponent(component, bindProps) {
96
- return Object.freeze({
97
- [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: void 0,
98
- render: (overridingProps) => /* @__PURE__ */ import_react2.default.createElement(
99
- ComponentWithProps,
85
+ function reactComponent(component, bindProps, init) {
86
+ const TypedWrapperComponent = WrapperComponent;
87
+ if ((init == null ? void 0 : init.wrapperComponent) && init.wrapperProps) {
88
+ return createComponentHandlerResult((overridingProps) => /* @__PURE__ */ import_react.default.createElement(
89
+ TypedWrapperComponent,
100
90
  {
101
91
  bindProps,
102
92
  component,
103
- overridingProps
93
+ overridingProps,
94
+ wrapperComponent: init.wrapperComponent,
95
+ wrapperProps: init.wrapperProps
104
96
  }
105
- )
106
- });
97
+ ));
98
+ } else {
99
+ return createComponentHandlerResult((overridingProps) => /* @__PURE__ */ import_react.default.createElement(TypedWrapperComponent, { bindProps, component, overridingProps }));
100
+ }
107
101
  }
108
- const ComponentWithProps = (0, import_react2.memo)(function ComponentWithProps2({
102
+ const WrapperComponent = (0, import_react.memo)(function WrapperComponent2({
109
103
  bindProps,
110
104
  component: Component,
111
- overridingProps
105
+ overridingProps,
106
+ wrapperComponent: WrapperComponent2,
107
+ wrapperProps
112
108
  }) {
113
109
  const { allowOverrideProps } = options;
114
- const { renderCallbackProps } = (0, import_react2.useContext)(RenderContext);
110
+ const { originalProps: renderCallbackProps } = (0, import_react.useContext)(RenderContext);
115
111
  if (overridingProps && !arePropsEqual(overridingProps, renderCallbackProps) && !allowOverrideProps) {
116
112
  console.warn('react-chain-of-responsibility: "allowOverrideProps" must be set to true to override props');
117
113
  }
118
114
  const props = Object.freeze(
119
115
  allowOverrideProps ? { ...renderCallbackProps, ...overridingProps } : { ...renderCallbackProps }
120
116
  );
121
- return /* @__PURE__ */ import_react2.default.createElement(Component, { ...props, ...typeof bindProps === "function" ? bindProps(props) : bindProps });
117
+ const child = /* @__PURE__ */ import_react.default.createElement(
118
+ Component,
119
+ {
120
+ ...{
121
+ ...props,
122
+ ...typeof bindProps === "function" ? bindProps(props) : bindProps
123
+ }
124
+ }
125
+ );
126
+ return WrapperComponent2 && wrapperProps ? /* @__PURE__ */ import_react.default.createElement(WrapperComponent2, { ...typeof wrapperProps === "function" ? wrapperProps(props) : wrapperProps }, child) : child;
122
127
  });
123
128
  const useBuildRenderCallback = () => {
124
- const { enhancer } = (0, import_react2.useContext)(BuildContext);
125
- return (0, import_react2.useCallback)(
129
+ const { enhancer } = (0, import_react.useContext)(BuildContext);
130
+ return (0, import_react.useCallback)(
126
131
  (request, buildOptions = {}) => {
127
132
  const result = (
128
133
  // Put the "fallbackComponent" as the last one in the chain.
@@ -135,34 +140,26 @@ function createChainOfResponsibility(options = {}) {
135
140
  );
136
141
  return;
137
142
  }
138
- return Object.freeze({
139
- // Convert fallback component as renderer.
140
- [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: void 0,
141
- render: () => (
142
- // Currently, there are no ways to set `bindProps` to `fallbackComponent`.
143
- // `fallbackComponent` do not need `overridingProps` because it is the last one in the chain, it would not have the next() function.
144
- /* @__PURE__ */ import_react2.default.createElement(ComponentWithProps, { component: fallbackComponent })
145
- )
146
- });
143
+ return reactComponent(fallbackComponent);
147
144
  })(request)
148
145
  );
149
- return result && ((props) => {
150
- const renderCallbackProps = useMemoValueWithEquality(() => props, arePropsEqual);
151
- const context = (0, import_react2.useMemo)(
152
- () => Object.freeze({ renderCallbackProps }),
153
- [renderCallbackProps]
154
- );
155
- return /* @__PURE__ */ import_react2.default.createElement(RenderContext.Provider, { value: context }, result.render());
156
- });
146
+ return result && ((originalProps) => (
147
+ // This is render function, we cannot call any hooks here.
148
+ /* @__PURE__ */ import_react.default.createElement(BuildRenderCallback, { originalProps, render: result.render })
149
+ ));
157
150
  },
158
151
  [enhancer]
159
152
  );
160
153
  };
154
+ function BuildRenderCallback({ originalProps, render }) {
155
+ const context = (0, import_react.useMemo)(() => Object.freeze({ originalProps }), [originalProps]);
156
+ return /* @__PURE__ */ import_react.default.createElement(RenderContext.Provider, { value: context }, render());
157
+ }
161
158
  function ChainOfResponsibilityProvider({ children, init, middleware }) {
162
159
  if (!Array.isArray(middleware) || middleware.some((middleware2) => typeof middleware2 !== "function")) {
163
160
  throw new Error('react-chain-of-responsibility: "middleware" prop must be an array of functions');
164
161
  }
165
- const fortifiedMiddleware = (0, import_react2.useMemo)(
162
+ const fortifiedMiddleware = (0, import_react.useMemo)(
166
163
  () => Object.freeze(
167
164
  middleware.map((fn) => (init2) => {
168
165
  const enhancer2 = fn(init2);
@@ -186,8 +183,8 @@ function createChainOfResponsibility(options = {}) {
186
183
  ),
187
184
  [middleware]
188
185
  );
189
- const { enhancer: parentEnhancer } = (0, import_react2.useContext)(BuildContext);
190
- const enhancer = (0, import_react2.useMemo)(
186
+ const { enhancer: parentEnhancer } = (0, import_react.useContext)(BuildContext);
187
+ const enhancer = (0, import_react.useMemo)(
191
188
  () => (
192
189
  // We are reversing because it is easier to read:
193
190
  // - With reverse, [a, b, c] will become a(b(c(fn)))
@@ -198,17 +195,18 @@ function createChainOfResponsibility(options = {}) {
198
195
  ),
199
196
  [init, fortifiedMiddleware, parentEnhancer]
200
197
  );
201
- const contextValue = (0, import_react2.useMemo)(() => Object.freeze({ enhancer }), [enhancer]);
202
- return /* @__PURE__ */ import_react2.default.createElement(BuildContext.Provider, { value: contextValue }, children);
198
+ const contextValue = (0, import_react.useMemo)(() => Object.freeze({ enhancer }), [enhancer]);
199
+ return /* @__PURE__ */ import_react.default.createElement(BuildContext.Provider, { value: contextValue }, children);
203
200
  }
204
201
  function ChainOfResponsibilityProxy({ fallbackComponent, request, ...props }) {
205
- const result = useBuildRenderCallback()(request, { fallbackComponent })?.(props);
206
- return result ? /* @__PURE__ */ import_react2.default.createElement(import_react2.Fragment, null, result) : null;
202
+ var _a;
203
+ const result = (_a = useBuildRenderCallback()(request, { fallbackComponent })) == null ? void 0 : _a(props);
204
+ return result ? /* @__PURE__ */ import_react.default.createElement(import_react.Fragment, null, result) : null;
207
205
  }
208
- const MemoizedChainOfResponsibilityProvider = (0, import_react2.memo)(ChainOfResponsibilityProvider);
206
+ const MemoizedChainOfResponsibilityProvider = (0, import_react.memo)(ChainOfResponsibilityProvider);
209
207
  return Object.freeze({
210
208
  Provider: MemoizedChainOfResponsibilityProvider,
211
- Proxy: (0, import_react2.memo)(ChainOfResponsibilityProxy),
209
+ Proxy: ChainOfResponsibilityProxy,
212
210
  reactComponent,
213
211
  useBuildRenderCallback
214
212
  // TODO: Consider adding back `asMiddleware`.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.preview.ts","../src/preview/createChainOfResponsibilityAsRenderCallback.tsx","../src/preview/private/arePropsEqual.ts","../src/preview/private/useMemoValueWithEquality.ts"],"sourcesContent":["export {\n default as createChainOfResponsibility,\n type ChainOfResponsibility,\n type ComponentEnhancer,\n type ComponentHandler,\n type ComponentHandlerResult,\n type ComponentMiddleware,\n type ComponentRenderer,\n type CreateChainOfResponsibilityOptions,\n type InferenceHelper,\n type InferInit,\n type InferMiddleware,\n type InferProps,\n type InferProviderProps,\n type InferProxyProps,\n type InferRequest,\n type ProviderProps,\n type ProxyProps,\n type ReactComponentHandlerResult,\n type UseBuildRenderCallback,\n type UseBuildRenderCallbackOptions\n} from './preview/createChainOfResponsibilityAsRenderCallback.tsx';\n","import { applyMiddleware } from 'handler-chain';\nimport React, {\n createContext,\n Fragment,\n memo,\n useCallback,\n useContext,\n useMemo,\n type ComponentType,\n type PropsWithChildren,\n type ReactNode\n} from 'react';\nimport { custom, function_, object, parse, safeParse } from 'valibot';\n\nimport arePropsEqual from './private/arePropsEqual.ts';\nimport useMemoValueWithEquality from './private/useMemoValueWithEquality.ts';\n\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.\ndeclare global {\n interface ArrayConstructor {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n isArray(arg: any): arg is readonly any[];\n }\n}\n\ntype BaseProps = object;\n\ntype CreateChainOfResponsibilityOptions = {\n /**\n * Allows one component to pass different set of props to its downstream component. Default is false.\n *\n * It is recommended to keep this settings as default to prevent newly added component from unexpectedly changing behavior of downstream components.\n */\n readonly allowOverrideProps?: boolean | undefined;\n\n /**\n * Allows a middleware to pass another request object when calling its next middleware. Default is false.\n *\n * It is recommended to keep this settings as default ot prevent newly added middleware from unexpectedly changing behavior of downstream middleware.\n *\n * To prevent upstream middleware from modifying the request, the request object should be set to be immutable through `Object.freeze`.\n */\n readonly passModifiedRequest?: boolean | undefined;\n};\n\ntype ChainOfResponsibility<Request, Props extends BaseProps, Init> = {\n readonly Provider: ComponentType<ProviderProps<Request, Props, Init>> & InferenceHelper<Request, Props, Init>;\n readonly Proxy: ComponentType<ProxyProps<Request, Props>>;\n readonly reactComponent: ReactComponentHandlerResult<Props>;\n readonly useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props>;\n};\n\n// TODO: Maybe this one should be local.\n// Verify that reactComponent() from an instance of CoR should throw error when used in another instance of CoR.\nconst DO_NOT_CREATE_THIS_OBJECT_YOURSELF = Symbol();\n\ntype ComponentRenderer<Props> = (props: Props) => ReactNode;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst componentHandlerResultSchema = custom<ComponentHandlerResult<any>>(\n value =>\n safeParse(object({ render: function_() }), value).success &&\n !!value &&\n typeof value === 'object' &&\n DO_NOT_CREATE_THIS_OBJECT_YOURSELF in value,\n 'react-chain-of-responsibility: middleware must return value constructed by reactComponent()'\n);\n\ninterface ComponentHandlerResult<Props extends BaseProps> {\n readonly [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined;\n readonly render: (overridingProps?: Partial<Props> | undefined) => ReactNode;\n}\n\ntype ComponentHandler<Request, Props extends BaseProps> = (\n request: Request\n) => ComponentHandlerResult<Props> | undefined;\n\ntype ComponentEnhancer<Request, Props extends BaseProps> = (\n next: ComponentHandler<Request, Props>\n) => ComponentHandler<Request, Props>;\n\ntype ComponentMiddleware<Request, Props extends BaseProps, Init = undefined> = (\n init: Init\n) => ComponentEnhancer<Request, Props>;\n\ntype ReactComponentHandlerResult<Props extends object> = <P extends Props>(\n component: ComponentType<P>,\n bindProps?:\n | (Partial<Props> & Omit<P, keyof Props>)\n | ((props: Props) => Partial<Props> & Omit<P, keyof Props>)\n | undefined\n) => ComponentHandlerResult<Props>;\n\ntype UseBuildRenderCallbackOptions<Props> = {\n readonly fallbackComponent?: ComponentType<Props> | undefined;\n};\n\ninterface UseBuildRenderCallback<Request, Props extends BaseProps> {\n (request: Request, options?: undefined | UseBuildRenderCallbackOptions<Props>): ComponentRenderer<Props> | undefined;\n}\n\ntype BuildContextType<Request, Props extends BaseProps> = {\n readonly enhancer: ComponentEnhancer<Request, Props>;\n};\n\ntype RenderContextType<Props> = {\n readonly renderCallbackProps: Props;\n};\n\ntype ProviderProps<Request, Props extends BaseProps, Init> = PropsWithChildren<{\n readonly 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 BaseProps> = Props & {\n readonly fallbackComponent?: ComponentType<Props> | undefined;\n readonly request: Request;\n};\n\ntype InferenceHelper<Request, Props extends BaseProps, Init> = {\n readonly '~types': {\n readonly init: Init;\n readonly middleware: ComponentMiddleware<Request, Props, Init>;\n readonly props: Props;\n readonly proxyProps: ProxyProps<Request, Props>;\n readonly providerProps: ProviderProps<Request, Props, Init>;\n readonly request: Request;\n };\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferInit<T extends InferenceHelper<any, any, any>> = T['~types']['init'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferMiddleware<T extends InferenceHelper<any, any, any>> = T['~types']['middleware'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProps<T extends InferenceHelper<any, any, any>> = T['~types']['props'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProxyProps<T extends InferenceHelper<any, any, any>> = T['~types']['proxyProps'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProviderProps<T extends InferenceHelper<any, any, any>> = T['~types']['providerProps'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferRequest<T extends InferenceHelper<any, any, any>> = T['~types']['request'];\n\nfunction createChainOfResponsibility<\n Request = void,\n Props extends BaseProps = { readonly children?: never },\n Init = void\n>(options: CreateChainOfResponsibilityOptions = {}): ChainOfResponsibility<Request, Props, Init> {\n // Freeze options to prevent accidental change.\n options = Object.freeze({ ...options });\n\n const BuildContext = createContext<BuildContextType<Request, Props>>(\n Object.freeze({ enhancer: next => request => next(request) })\n );\n\n const RenderContext = createContext<RenderContextType<Props>>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new Proxy({} as any, {\n get() {\n // The following is assertion, there is no way to hit this line.\n /* istanbul ignore next */\n throw new Error(\n 'react-chain-of-responsibility: this hook cannot be used outside of <Proxy> and useBuildRenderCallback()'\n );\n }\n })\n );\n\n function reactComponent<P extends Props>(\n component: ComponentType<P>,\n bindProps?:\n | (Partial<Props> & Omit<P, keyof Props>)\n | ((props: Props) => Partial<Props> & Omit<P, keyof Props>)\n | undefined\n ): ComponentHandlerResult<Props> {\n return Object.freeze({\n [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined,\n render: (overridingProps?: Partial<Props> | undefined) => (\n <ComponentWithProps\n bindProps={bindProps}\n component={component as ComponentType<Props>}\n overridingProps={overridingProps}\n />\n )\n });\n }\n\n const ComponentWithProps = memo(function ComponentWithProps({\n bindProps,\n component: Component,\n overridingProps\n }: {\n readonly bindProps?: Partial<Props> | ((props: Props) => Partial<Props>) | undefined;\n readonly component: ComponentType<Props>;\n readonly overridingProps?: Partial<Props> | undefined;\n }) {\n const { allowOverrideProps } = options;\n const { renderCallbackProps } = useContext(RenderContext);\n\n if (overridingProps && !arePropsEqual(overridingProps, renderCallbackProps) && !allowOverrideProps) {\n console.warn('react-chain-of-responsibility: \"allowOverrideProps\" must be set to true to override props');\n }\n\n const props = Object.freeze(\n allowOverrideProps ? { ...renderCallbackProps, ...overridingProps } : { ...renderCallbackProps }\n );\n\n return <Component {...props} {...(typeof bindProps === 'function' ? bindProps(props) : bindProps)} />;\n });\n\n const useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props> = () => {\n const { enhancer } = useContext(BuildContext);\n\n return useCallback(\n (request, buildOptions = {}) => {\n const result =\n // Put the \"fallbackComponent\" as the last one in the chain.\n enhancer(() => {\n const { fallbackComponent } = buildOptions;\n\n if (!fallbackComponent) {\n console.warn(\n 'react-chain-of-responsibility: the request has fall through all middleware, set \"fallbackComponent\" as a catchall',\n request\n );\n\n // For clarity, we are returning `undefined` instead of `() => undefined`.\n return;\n }\n\n return Object.freeze({\n // Convert fallback component as renderer.\n [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined,\n render: () => (\n // Currently, there are no ways to set `bindProps` to `fallbackComponent`.\n // `fallbackComponent` do not need `overridingProps` because it is the last one in the chain, it would not have the next() function.\n <ComponentWithProps component={fallbackComponent} />\n )\n });\n })(request);\n\n return (\n result &&\n ((props: Props) => {\n const renderCallbackProps = useMemoValueWithEquality<Props>(() => props, arePropsEqual);\n\n const context = useMemo<RenderContextType<Props>>(\n () => Object.freeze({ renderCallbackProps }),\n [renderCallbackProps]\n );\n\n return <RenderContext.Provider value={context}>{result.render()}</RenderContext.Provider>;\n })\n );\n },\n [enhancer]\n );\n };\n\n function ChainOfResponsibilityProvider({ children, init, middleware }: ProviderProps<Request, Props, Init>) {\n if (!Array.isArray(middleware) || middleware.some(middleware => typeof middleware !== 'function')) {\n throw new Error('react-chain-of-responsibility: \"middleware\" prop must be an array of functions');\n }\n\n // Remap the middleware, so all inputs/outputs are validated.\n const fortifiedMiddleware = useMemo(\n () =>\n Object.freeze(\n middleware.map<ComponentMiddleware<Request, Props, Init>>(fn => (init: Init) => {\n const enhancer = fn(init);\n\n return next => originalRequest => {\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(\n 'react-chain-of-responsibility: next() cannot be called after the function had returned synchronously'\n );\n }\n\n // We do not allow passing void/undefined to next() because it would be confusing whether to keep the original request or pass an undefined.\n !options.passModifiedRequest &&\n !Object.is(nextRequest, originalRequest) &&\n console.warn(\n 'react-chain-of-responsibility: next() must be called with the original request, otherwise, set \"options.passModifiedRequest\" to true to pass a different request object downstream'\n );\n\n return next(options.passModifiedRequest ? nextRequest : originalRequest);\n })(originalRequest);\n\n hasReturned = true;\n\n // Make sure the return value is built using our helper function for forward-compatibility reason.\n return returnValue && parse(componentHandlerResultSchema, returnValue);\n };\n })\n ),\n [middleware]\n );\n\n const { enhancer: parentEnhancer } = useContext(BuildContext);\n\n const enhancer = useMemo<ComponentEnhancer<Request, Props>>(\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<ComponentHandlerResult<Props> | undefined, Request, Init>(\n ...[...fortifiedMiddleware, ...[() => parentEnhancer]]\n )(init as Init),\n [init, fortifiedMiddleware, parentEnhancer]\n );\n\n const contextValue = useMemo<BuildContextType<Request, Props>>(() => Object.freeze({ enhancer }), [enhancer]);\n\n return <BuildContext.Provider value={contextValue}>{children}</BuildContext.Provider>;\n }\n\n function ChainOfResponsibilityProxy({ fallbackComponent, request, ...props }: ProxyProps<Request, Props>) {\n const result = useBuildRenderCallback()(request, { fallbackComponent })?.(props as Props);\n\n return result ? <Fragment>{result}</Fragment> : null;\n }\n\n const MemoizedChainOfResponsibilityProvider =\n memo<ProviderProps<Request, Props, Init>>(ChainOfResponsibilityProvider);\n\n return Object.freeze({\n Provider: MemoizedChainOfResponsibilityProvider as typeof MemoizedChainOfResponsibilityProvider &\n InferenceHelper<Request, Props, Init>,\n Proxy: memo<ProxyProps<Request, Props>>(ChainOfResponsibilityProxy),\n reactComponent,\n useBuildRenderCallback\n\n // TODO: Consider adding back `asMiddleware`.\n });\n}\n\nexport default createChainOfResponsibility;\nexport {\n type ChainOfResponsibility,\n type ComponentEnhancer,\n type ComponentHandler,\n type ComponentHandlerResult,\n type ComponentMiddleware,\n type ComponentRenderer,\n type CreateChainOfResponsibilityOptions,\n type InferenceHelper,\n type InferInit,\n type InferMiddleware,\n type InferProps,\n type InferProviderProps,\n type InferProxyProps,\n type InferRequest,\n type ProviderProps,\n type ProxyProps,\n type ReactComponentHandlerResult,\n type UseBuildRenderCallback,\n type UseBuildRenderCallbackOptions\n};\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function arePropsEqual<T extends Record<string, any>>(x: T, y: T): boolean {\n if (Object.is(x, y)) {\n return true;\n }\n\n const mapOfX = new Map(Object.entries(x));\n const mapOfY = new Map(Object.entries(y));\n\n if (mapOfX.size !== mapOfY.size) {\n return false;\n }\n\n const keys = new Set([...mapOfX.keys(), ...mapOfY.keys()]);\n\n for (const key of keys) {\n if (!Object.is(mapOfX.get(key), mapOfY.get(key))) {\n return false;\n }\n }\n\n return true;\n}\n","import { useEffect, useRef } from 'react';\n\nconst NOT_INITIALIZED = Symbol();\n\nexport default function useMemoValueWithEquality<T>(factory: () => T, equalityFn: (x: T, y: T) => boolean): T {\n const prevRef = useRef<T | typeof NOT_INITIALIZED>(NOT_INITIALIZED);\n const next: T = factory();\n const current: T = prevRef.current !== NOT_INITIALIZED && equalityFn(prevRef.current, next) ? prevRef.current : next;\n\n useEffect(() => {\n prevRef.current = current;\n });\n\n return current;\n}\n"],"mappings":"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","names":["import_react","React","ComponentWithProps","middleware","init","enhancer"]}
1
+ {"version":3,"sources":["../src/index.preview.ts","../src/preview/createChainOfResponsibilityAsRenderCallback.tsx","../src/preview/private/arePropsEqual.ts"],"sourcesContent":["export {\n default as createChainOfResponsibility,\n type ChainOfResponsibility,\n type ComponentEnhancer,\n type ComponentHandler,\n type ComponentHandlerResult,\n type ComponentMiddleware,\n type ComponentRenderer,\n type CreateChainOfResponsibilityOptions,\n type InferenceHelper,\n type InferInit,\n type InferMiddleware,\n type InferProps,\n type InferProviderProps,\n type InferProxyProps,\n type InferRequest,\n type ProviderProps,\n type ProxyProps,\n type ReactComponentHandlerResult,\n type UseBuildRenderCallback,\n type UseBuildRenderCallbackOptions\n} from './preview/createChainOfResponsibilityAsRenderCallback.tsx';\n","import { applyMiddleware } from 'handler-chain';\nimport React, {\n createContext,\n Fragment,\n memo,\n useCallback,\n useContext,\n useMemo,\n type ComponentType,\n type PropsWithChildren,\n type ReactElement,\n type ReactNode\n} from 'react';\nimport { type SetOptional } from 'type-fest';\nimport { custom, function_, object, parse, safeParse } from 'valibot';\n\nimport arePropsEqual from './private/arePropsEqual.ts';\n\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.\ndeclare global {\n interface ArrayConstructor {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n isArray(arg: any): arg is readonly any[];\n }\n}\n\ntype BaseProps = object;\n\ntype CreateChainOfResponsibilityOptions = {\n /**\n * Allows one component to pass different set of props to its downstream component. Default is false.\n *\n * It is recommended to keep this settings as default to prevent newly added component from unexpectedly changing behavior of downstream components.\n */\n readonly allowOverrideProps?: boolean | undefined;\n\n /**\n * Allows a middleware to pass another request object when calling its next middleware. Default is false.\n *\n * It is recommended to keep this settings as default ot prevent newly added middleware from unexpectedly changing behavior of downstream middleware.\n *\n * To prevent upstream middleware from modifying the request, the request object should be set to be immutable through `Object.freeze`.\n */\n readonly passModifiedRequest?: boolean | undefined;\n};\n\ntype ChainOfResponsibility<Request, Props extends BaseProps, Init> = {\n readonly Provider: ComponentType<ProviderProps<Request, Props, Init>> & InferenceHelper<Request, Props, Init>;\n readonly Proxy: ComponentType<ProxyProps<Request, Props>>;\n readonly reactComponent: ReactComponentHandlerResult<Props>;\n readonly useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props>;\n};\n\n// TODO: Maybe this one should be local.\n// Verify that reactComponent() from an instance of CoR should throw error when used in another instance of CoR.\nconst DO_NOT_CREATE_THIS_OBJECT_YOURSELF = Symbol();\n\ntype ComponentRenderer<Props> = (props: Props) => ReactElement | null;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst componentHandlerResultSchema = custom<ComponentHandlerResult<any>>(\n value =>\n safeParse(object({ render: function_() }), value).success &&\n !!value &&\n typeof value === 'object' &&\n DO_NOT_CREATE_THIS_OBJECT_YOURSELF in value,\n 'react-chain-of-responsibility: middleware must return value constructed by reactComponent()'\n);\n\ninterface ComponentHandlerResult<Props extends BaseProps> {\n readonly [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined;\n readonly render: (overridingProps?: Partial<Props> | undefined) => ReactElement | null;\n}\n\ntype ComponentHandler<Request, Props extends BaseProps> = (\n request: Request\n) => ComponentHandlerResult<Props> | undefined;\n\ntype ComponentEnhancer<Request, Props extends BaseProps> = (\n next: ComponentHandler<Request, Props>\n) => ComponentHandler<Request, Props>;\n\ntype ComponentMiddleware<Request, Props extends BaseProps, Init = undefined> = (\n init: Init\n) => ComponentEnhancer<Request, Props>;\n\ntype ReactComponentInit<\n Props extends BaseProps,\n W extends (BaseProps & { children?: ReactNode | undefined }) | void = void\n> = W extends void\n ? {\n wrapperComponent?: undefined;\n wrapperProps?: undefined;\n }\n : {\n wrapperComponent: ComponentType<W>;\n wrapperProps: W | ((props: Props) => W);\n };\n\ntype ReactComponentHandlerResult<Props extends BaseProps> = <\n P extends Props,\n W extends (BaseProps & { children?: ReactNode | undefined }) | void = void\n>(\n component: ComponentType<P>,\n bindProps?: SetOptional<P, keyof Props> | ((props: Props) => SetOptional<P, keyof Props>) | undefined,\n init?: ReactComponentInit<Props, W>\n) => ComponentHandlerResult<Props>;\n\ntype UseBuildRenderCallbackOptions<Props> = {\n readonly fallbackComponent?: ComponentType<Props> | undefined;\n};\n\ninterface UseBuildRenderCallback<Request, Props extends BaseProps> {\n (request: Request, options?: undefined | UseBuildRenderCallbackOptions<Props>): ComponentRenderer<Props> | undefined;\n}\n\ntype BuildContextType<Request, Props extends BaseProps> = {\n readonly enhancer: ComponentEnhancer<Request, Props>;\n};\n\ntype RenderContextType<Props> = {\n readonly originalProps: Props;\n};\n\ntype ProviderProps<Request, Props extends BaseProps, Init> = PropsWithChildren<{\n readonly 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 BaseProps> = Props & {\n readonly fallbackComponent?: ComponentType<Props> | undefined;\n readonly request: Request;\n};\n\ntype InferenceHelper<Request, Props extends BaseProps, Init> = {\n readonly '~types': {\n readonly init: Init;\n readonly middleware: ComponentMiddleware<Request, Props, Init>;\n readonly props: Props;\n readonly proxyProps: ProxyProps<Request, Props>;\n readonly providerProps: ProviderProps<Request, Props, Init>;\n readonly request: Request;\n };\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferInit<T extends InferenceHelper<any, any, any>> = T['~types']['init'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferMiddleware<T extends InferenceHelper<any, any, any>> = T['~types']['middleware'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProps<T extends InferenceHelper<any, any, any>> = T['~types']['props'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProxyProps<T extends InferenceHelper<any, any, any>> = T['~types']['proxyProps'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProviderProps<T extends InferenceHelper<any, any, any>> = T['~types']['providerProps'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferRequest<T extends InferenceHelper<any, any, any>> = T['~types']['request'];\n\nfunction createComponentHandlerResult<Props extends BaseProps>(\n render: (overridingProps?: Partial<Props> | undefined) => ReactElement | null\n): ComponentHandlerResult<Props> {\n return Object.freeze({ [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined, render });\n}\n\nfunction createChainOfResponsibility<\n Request = void,\n Props extends BaseProps = { readonly children?: never },\n Init = void\n>(options: CreateChainOfResponsibilityOptions = {}): ChainOfResponsibility<Request, Props, Init> {\n // Freeze options to prevent accidental change.\n options = Object.freeze({ ...options });\n\n const BuildContext = createContext<BuildContextType<Request, Props>>(\n Object.freeze({ enhancer: next => request => next(request) })\n );\n\n const RenderContext = createContext<RenderContextType<Props>>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new Proxy({} as any, {\n get() {\n // The following is assertion, there is no way to hit this line.\n /* istanbul ignore next */\n throw new Error(\n 'react-chain-of-responsibility: this hook cannot be used outside of <Proxy> and useBuildRenderCallback()'\n );\n }\n })\n );\n\n function reactComponent<P extends Props, W extends (BaseProps & { children?: ReactNode | undefined }) | void = void>(\n component: ComponentType<P>,\n // For `bindProps` of type function, do not do side-effect in it, it may not be always called in all scenarios.\n bindProps?: SetOptional<P, keyof Props> | ((props: Props) => SetOptional<P, keyof Props>) | undefined,\n init?: ReactComponentInit<Props, W> | undefined\n ): ComponentHandlerResult<Props> {\n // memo() and generic type do not play well together.\n const TypedWrapperComponent = WrapperComponent as ComponentType<WrapperComponentProps<P, W>>;\n\n if (init?.wrapperComponent && init.wrapperProps) {\n return createComponentHandlerResult((overridingProps?: Partial<Props> | undefined) => (\n <TypedWrapperComponent\n bindProps={bindProps}\n component={component}\n overridingProps={overridingProps}\n wrapperComponent={init.wrapperComponent as ComponentType<W>}\n wrapperProps={init.wrapperProps as W}\n />\n ));\n } else {\n return createComponentHandlerResult((overridingProps?: Partial<Props> | undefined) => (\n <TypedWrapperComponent bindProps={bindProps} component={component} overridingProps={overridingProps} />\n ));\n }\n }\n\n type WrapperComponentProps<\n P extends Props,\n W extends (BaseProps & { children?: ReactNode | undefined }) | void = void\n > = {\n readonly bindProps: SetOptional<P, keyof Props> | ((props: Props) => SetOptional<P, keyof Props>) | undefined;\n readonly component: ComponentType<P>;\n readonly overridingProps: Partial<Props> | undefined;\n readonly wrapperComponent?: ComponentType<W> | undefined;\n readonly wrapperProps?: W | ((props: Props) => W) | undefined;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const WrapperComponent = memo<WrapperComponentProps<any, any>>(function WrapperComponent<\n P extends Props,\n W extends BaseProps & { children?: ReactNode | undefined }\n >({\n bindProps,\n component: Component,\n overridingProps,\n wrapperComponent: WrapperComponent,\n wrapperProps\n }: WrapperComponentProps<P, W>) {\n const { allowOverrideProps } = options;\n const { originalProps: renderCallbackProps } = useContext(RenderContext);\n\n if (overridingProps && !arePropsEqual(overridingProps, renderCallbackProps) && !allowOverrideProps) {\n console.warn('react-chain-of-responsibility: \"allowOverrideProps\" must be set to true to override props');\n }\n\n const props = Object.freeze(\n allowOverrideProps ? { ...renderCallbackProps, ...overridingProps } : { ...renderCallbackProps }\n );\n\n const child = (\n <Component\n {...({\n ...props,\n ...(typeof bindProps === 'function' ? bindProps(props) : bindProps)\n } as P)}\n />\n );\n\n return WrapperComponent && wrapperProps ? (\n <WrapperComponent {...(typeof wrapperProps === 'function' ? wrapperProps(props) : wrapperProps)}>\n {child}\n </WrapperComponent>\n ) : (\n child\n );\n });\n\n const useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props> = () => {\n const { enhancer } = useContext(BuildContext);\n\n return useCallback(\n (request, buildOptions = {}) => {\n const result =\n // Put the \"fallbackComponent\" as the last one in the chain.\n enhancer(() => {\n const { fallbackComponent } = buildOptions;\n\n if (!fallbackComponent) {\n console.warn(\n 'react-chain-of-responsibility: the request has fall through all middleware, set \"fallbackComponent\" as a catchall',\n request\n );\n\n // For clarity, we are returning `undefined` instead of `() => undefined`.\n return;\n }\n\n // `fallbackComponent` do not need `overridingProps` because it is the last one in the chain, it would not have the next() function.\n return reactComponent(fallbackComponent);\n })(request);\n\n return (\n result &&\n ((originalProps: Props) => (\n // This is render function, we cannot call any hooks here.\n <BuildRenderCallback originalProps={originalProps} render={result.render} />\n ))\n );\n },\n [enhancer]\n );\n };\n\n type BuildRenderCallbackProps = {\n readonly originalProps: Props;\n readonly render: () => ReactNode;\n };\n\n // Do not memoize <BuildRenderCallback>.\n // `bindProps` may have side effect and we want to be re-rendered to capture the side-effect.\n // To prevent wasted render, web devs should memoize it themselves.\n function BuildRenderCallback({ originalProps, render }: BuildRenderCallbackProps) {\n const context = useMemo<RenderContextType<Props>>(() => Object.freeze({ originalProps }), [originalProps]);\n\n return <RenderContext.Provider value={context}>{render()}</RenderContext.Provider>;\n }\n\n function ChainOfResponsibilityProvider({ children, init, middleware }: ProviderProps<Request, Props, Init>) {\n if (!Array.isArray(middleware) || middleware.some(middleware => typeof middleware !== 'function')) {\n throw new Error('react-chain-of-responsibility: \"middleware\" prop must be an array of functions');\n }\n\n // Remap the middleware, so all inputs/outputs are validated.\n const fortifiedMiddleware = useMemo(\n () =>\n Object.freeze(\n middleware.map<ComponentMiddleware<Request, Props, Init>>(fn => (init: Init) => {\n const enhancer = fn(init);\n\n return next => originalRequest => {\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(\n 'react-chain-of-responsibility: next() cannot be called after the function had returned synchronously'\n );\n }\n\n // We do not allow passing void/undefined to next() because it would be confusing whether to keep the original request or pass an undefined.\n !options.passModifiedRequest &&\n !Object.is(nextRequest, originalRequest) &&\n console.warn(\n 'react-chain-of-responsibility: next() must be called with the original request, otherwise, set \"options.passModifiedRequest\" to true to pass a different request object downstream'\n );\n\n return next(options.passModifiedRequest ? nextRequest : originalRequest);\n })(originalRequest);\n\n hasReturned = true;\n\n // Make sure the return value is built using our helper function for forward-compatibility reason.\n return returnValue && parse(componentHandlerResultSchema, returnValue);\n };\n })\n ),\n [middleware]\n );\n\n const { enhancer: parentEnhancer } = useContext(BuildContext);\n\n const enhancer = useMemo<ComponentEnhancer<Request, Props>>(\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<ComponentHandlerResult<Props> | undefined, Request, Init>(\n ...[...fortifiedMiddleware, ...[() => parentEnhancer]]\n )(init as Init),\n [init, fortifiedMiddleware, parentEnhancer]\n );\n\n const contextValue = useMemo<BuildContextType<Request, Props>>(() => Object.freeze({ enhancer }), [enhancer]);\n\n return <BuildContext.Provider value={contextValue}>{children}</BuildContext.Provider>;\n }\n\n function ChainOfResponsibilityProxy({ fallbackComponent, request, ...props }: ProxyProps<Request, Props>) {\n const result = useBuildRenderCallback()(request, { fallbackComponent })?.(props as Props);\n\n return result ? <Fragment>{result}</Fragment> : null;\n }\n\n const MemoizedChainOfResponsibilityProvider =\n memo<ProviderProps<Request, Props, Init>>(ChainOfResponsibilityProvider);\n\n return Object.freeze({\n Provider: MemoizedChainOfResponsibilityProvider as typeof MemoizedChainOfResponsibilityProvider &\n InferenceHelper<Request, Props, Init>,\n Proxy: ChainOfResponsibilityProxy,\n reactComponent,\n useBuildRenderCallback\n\n // TODO: Consider adding back `asMiddleware`.\n });\n}\n\nexport default createChainOfResponsibility;\nexport {\n type ChainOfResponsibility,\n type ComponentEnhancer,\n type ComponentHandler,\n type ComponentHandlerResult,\n type ComponentMiddleware,\n type ComponentRenderer,\n type CreateChainOfResponsibilityOptions,\n type InferenceHelper,\n type InferInit,\n type InferMiddleware,\n type InferProps,\n type InferProviderProps,\n type InferProxyProps,\n type InferRequest,\n type ProviderProps,\n type ProxyProps,\n type ReactComponentHandlerResult,\n type UseBuildRenderCallback,\n type UseBuildRenderCallbackOptions\n};\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function arePropsEqual<T extends Record<string, any>>(x: T, y: T): boolean {\n if (Object.is(x, y)) {\n return true;\n }\n\n const mapOfX = new Map(Object.entries(x));\n const mapOfY = new Map(Object.entries(y));\n\n if (mapOfX.size !== mapOfY.size) {\n return false;\n }\n\n const keys = new Set([...mapOfX.keys(), ...mapOfY.keys()]);\n\n for (const key of keys) {\n if (!Object.is(mapOfX.get(key), mapOfY.get(key))) {\n return false;\n }\n }\n\n return true;\n}\n"],"mappings":"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","names":["React","WrapperComponent","middleware","init","enhancer"]}
@@ -29,25 +29,15 @@ function arePropsEqual(x, y) {
29
29
  return true;
30
30
  }
31
31
 
32
- // src/preview/private/useMemoValueWithEquality.ts
33
- import { useEffect, useRef } from "react";
34
- var NOT_INITIALIZED = Symbol();
35
- function useMemoValueWithEquality(factory, equalityFn) {
36
- const prevRef = useRef(NOT_INITIALIZED);
37
- const next = factory();
38
- const current = prevRef.current !== NOT_INITIALIZED && equalityFn(prevRef.current, next) ? prevRef.current : next;
39
- useEffect(() => {
40
- prevRef.current = current;
41
- });
42
- return current;
43
- }
44
-
45
32
  // src/preview/createChainOfResponsibilityAsRenderCallback.tsx
46
33
  var DO_NOT_CREATE_THIS_OBJECT_YOURSELF = Symbol();
47
34
  var componentHandlerResultSchema = custom(
48
35
  (value) => safeParse(object({ render: function_() }), value).success && !!value && typeof value === "object" && DO_NOT_CREATE_THIS_OBJECT_YOURSELF in value,
49
36
  "react-chain-of-responsibility: middleware must return value constructed by reactComponent()"
50
37
  );
38
+ function createComponentHandlerResult(render) {
39
+ return Object.freeze({ [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: void 0, render });
40
+ }
51
41
  function createChainOfResponsibility(options = {}) {
52
42
  options = Object.freeze({ ...options });
53
43
  const BuildContext = createContext(
@@ -63,33 +53,48 @@ function createChainOfResponsibility(options = {}) {
63
53
  }
64
54
  })
65
55
  );
66
- function reactComponent(component, bindProps) {
67
- return Object.freeze({
68
- [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: void 0,
69
- render: (overridingProps) => /* @__PURE__ */ React.createElement(
70
- ComponentWithProps,
56
+ function reactComponent(component, bindProps, init) {
57
+ const TypedWrapperComponent = WrapperComponent;
58
+ if (init?.wrapperComponent && init.wrapperProps) {
59
+ return createComponentHandlerResult((overridingProps) => /* @__PURE__ */ React.createElement(
60
+ TypedWrapperComponent,
71
61
  {
72
62
  bindProps,
73
63
  component,
74
- overridingProps
64
+ overridingProps,
65
+ wrapperComponent: init.wrapperComponent,
66
+ wrapperProps: init.wrapperProps
75
67
  }
76
- )
77
- });
68
+ ));
69
+ } else {
70
+ return createComponentHandlerResult((overridingProps) => /* @__PURE__ */ React.createElement(TypedWrapperComponent, { bindProps, component, overridingProps }));
71
+ }
78
72
  }
79
- const ComponentWithProps = memo(function ComponentWithProps2({
73
+ const WrapperComponent = memo(function WrapperComponent2({
80
74
  bindProps,
81
75
  component: Component,
82
- overridingProps
76
+ overridingProps,
77
+ wrapperComponent: WrapperComponent2,
78
+ wrapperProps
83
79
  }) {
84
80
  const { allowOverrideProps } = options;
85
- const { renderCallbackProps } = useContext(RenderContext);
81
+ const { originalProps: renderCallbackProps } = useContext(RenderContext);
86
82
  if (overridingProps && !arePropsEqual(overridingProps, renderCallbackProps) && !allowOverrideProps) {
87
83
  console.warn('react-chain-of-responsibility: "allowOverrideProps" must be set to true to override props');
88
84
  }
89
85
  const props = Object.freeze(
90
86
  allowOverrideProps ? { ...renderCallbackProps, ...overridingProps } : { ...renderCallbackProps }
91
87
  );
92
- return /* @__PURE__ */ React.createElement(Component, { ...props, ...typeof bindProps === "function" ? bindProps(props) : bindProps });
88
+ const child = /* @__PURE__ */ React.createElement(
89
+ Component,
90
+ {
91
+ ...{
92
+ ...props,
93
+ ...typeof bindProps === "function" ? bindProps(props) : bindProps
94
+ }
95
+ }
96
+ );
97
+ return WrapperComponent2 && wrapperProps ? /* @__PURE__ */ React.createElement(WrapperComponent2, { ...typeof wrapperProps === "function" ? wrapperProps(props) : wrapperProps }, child) : child;
93
98
  });
94
99
  const useBuildRenderCallback = () => {
95
100
  const { enhancer } = useContext(BuildContext);
@@ -106,29 +111,21 @@ function createChainOfResponsibility(options = {}) {
106
111
  );
107
112
  return;
108
113
  }
109
- return Object.freeze({
110
- // Convert fallback component as renderer.
111
- [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: void 0,
112
- render: () => (
113
- // Currently, there are no ways to set `bindProps` to `fallbackComponent`.
114
- // `fallbackComponent` do not need `overridingProps` because it is the last one in the chain, it would not have the next() function.
115
- /* @__PURE__ */ React.createElement(ComponentWithProps, { component: fallbackComponent })
116
- )
117
- });
114
+ return reactComponent(fallbackComponent);
118
115
  })(request)
119
116
  );
120
- return result && ((props) => {
121
- const renderCallbackProps = useMemoValueWithEquality(() => props, arePropsEqual);
122
- const context = useMemo(
123
- () => Object.freeze({ renderCallbackProps }),
124
- [renderCallbackProps]
125
- );
126
- return /* @__PURE__ */ React.createElement(RenderContext.Provider, { value: context }, result.render());
127
- });
117
+ return result && ((originalProps) => (
118
+ // This is render function, we cannot call any hooks here.
119
+ /* @__PURE__ */ React.createElement(BuildRenderCallback, { originalProps, render: result.render })
120
+ ));
128
121
  },
129
122
  [enhancer]
130
123
  );
131
124
  };
125
+ function BuildRenderCallback({ originalProps, render }) {
126
+ const context = useMemo(() => Object.freeze({ originalProps }), [originalProps]);
127
+ return /* @__PURE__ */ React.createElement(RenderContext.Provider, { value: context }, render());
128
+ }
132
129
  function ChainOfResponsibilityProvider({ children, init, middleware }) {
133
130
  if (!Array.isArray(middleware) || middleware.some((middleware2) => typeof middleware2 !== "function")) {
134
131
  throw new Error('react-chain-of-responsibility: "middleware" prop must be an array of functions');
@@ -179,7 +176,7 @@ function createChainOfResponsibility(options = {}) {
179
176
  const MemoizedChainOfResponsibilityProvider = memo(ChainOfResponsibilityProvider);
180
177
  return Object.freeze({
181
178
  Provider: MemoizedChainOfResponsibilityProvider,
182
- Proxy: memo(ChainOfResponsibilityProxy),
179
+ Proxy: ChainOfResponsibilityProxy,
183
180
  reactComponent,
184
181
  useBuildRenderCallback
185
182
  // TODO: Consider adding back `asMiddleware`.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/preview/createChainOfResponsibilityAsRenderCallback.tsx","../src/preview/private/arePropsEqual.ts","../src/preview/private/useMemoValueWithEquality.ts"],"sourcesContent":["import { applyMiddleware } from 'handler-chain';\nimport React, {\n createContext,\n Fragment,\n memo,\n useCallback,\n useContext,\n useMemo,\n type ComponentType,\n type PropsWithChildren,\n type ReactNode\n} from 'react';\nimport { custom, function_, object, parse, safeParse } from 'valibot';\n\nimport arePropsEqual from './private/arePropsEqual.ts';\nimport useMemoValueWithEquality from './private/useMemoValueWithEquality.ts';\n\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.\ndeclare global {\n interface ArrayConstructor {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n isArray(arg: any): arg is readonly any[];\n }\n}\n\ntype BaseProps = object;\n\ntype CreateChainOfResponsibilityOptions = {\n /**\n * Allows one component to pass different set of props to its downstream component. Default is false.\n *\n * It is recommended to keep this settings as default to prevent newly added component from unexpectedly changing behavior of downstream components.\n */\n readonly allowOverrideProps?: boolean | undefined;\n\n /**\n * Allows a middleware to pass another request object when calling its next middleware. Default is false.\n *\n * It is recommended to keep this settings as default ot prevent newly added middleware from unexpectedly changing behavior of downstream middleware.\n *\n * To prevent upstream middleware from modifying the request, the request object should be set to be immutable through `Object.freeze`.\n */\n readonly passModifiedRequest?: boolean | undefined;\n};\n\ntype ChainOfResponsibility<Request, Props extends BaseProps, Init> = {\n readonly Provider: ComponentType<ProviderProps<Request, Props, Init>> & InferenceHelper<Request, Props, Init>;\n readonly Proxy: ComponentType<ProxyProps<Request, Props>>;\n readonly reactComponent: ReactComponentHandlerResult<Props>;\n readonly useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props>;\n};\n\n// TODO: Maybe this one should be local.\n// Verify that reactComponent() from an instance of CoR should throw error when used in another instance of CoR.\nconst DO_NOT_CREATE_THIS_OBJECT_YOURSELF = Symbol();\n\ntype ComponentRenderer<Props> = (props: Props) => ReactNode;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst componentHandlerResultSchema = custom<ComponentHandlerResult<any>>(\n value =>\n safeParse(object({ render: function_() }), value).success &&\n !!value &&\n typeof value === 'object' &&\n DO_NOT_CREATE_THIS_OBJECT_YOURSELF in value,\n 'react-chain-of-responsibility: middleware must return value constructed by reactComponent()'\n);\n\ninterface ComponentHandlerResult<Props extends BaseProps> {\n readonly [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined;\n readonly render: (overridingProps?: Partial<Props> | undefined) => ReactNode;\n}\n\ntype ComponentHandler<Request, Props extends BaseProps> = (\n request: Request\n) => ComponentHandlerResult<Props> | undefined;\n\ntype ComponentEnhancer<Request, Props extends BaseProps> = (\n next: ComponentHandler<Request, Props>\n) => ComponentHandler<Request, Props>;\n\ntype ComponentMiddleware<Request, Props extends BaseProps, Init = undefined> = (\n init: Init\n) => ComponentEnhancer<Request, Props>;\n\ntype ReactComponentHandlerResult<Props extends object> = <P extends Props>(\n component: ComponentType<P>,\n bindProps?:\n | (Partial<Props> & Omit<P, keyof Props>)\n | ((props: Props) => Partial<Props> & Omit<P, keyof Props>)\n | undefined\n) => ComponentHandlerResult<Props>;\n\ntype UseBuildRenderCallbackOptions<Props> = {\n readonly fallbackComponent?: ComponentType<Props> | undefined;\n};\n\ninterface UseBuildRenderCallback<Request, Props extends BaseProps> {\n (request: Request, options?: undefined | UseBuildRenderCallbackOptions<Props>): ComponentRenderer<Props> | undefined;\n}\n\ntype BuildContextType<Request, Props extends BaseProps> = {\n readonly enhancer: ComponentEnhancer<Request, Props>;\n};\n\ntype RenderContextType<Props> = {\n readonly renderCallbackProps: Props;\n};\n\ntype ProviderProps<Request, Props extends BaseProps, Init> = PropsWithChildren<{\n readonly 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 BaseProps> = Props & {\n readonly fallbackComponent?: ComponentType<Props> | undefined;\n readonly request: Request;\n};\n\ntype InferenceHelper<Request, Props extends BaseProps, Init> = {\n readonly '~types': {\n readonly init: Init;\n readonly middleware: ComponentMiddleware<Request, Props, Init>;\n readonly props: Props;\n readonly proxyProps: ProxyProps<Request, Props>;\n readonly providerProps: ProviderProps<Request, Props, Init>;\n readonly request: Request;\n };\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferInit<T extends InferenceHelper<any, any, any>> = T['~types']['init'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferMiddleware<T extends InferenceHelper<any, any, any>> = T['~types']['middleware'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProps<T extends InferenceHelper<any, any, any>> = T['~types']['props'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProxyProps<T extends InferenceHelper<any, any, any>> = T['~types']['proxyProps'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProviderProps<T extends InferenceHelper<any, any, any>> = T['~types']['providerProps'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferRequest<T extends InferenceHelper<any, any, any>> = T['~types']['request'];\n\nfunction createChainOfResponsibility<\n Request = void,\n Props extends BaseProps = { readonly children?: never },\n Init = void\n>(options: CreateChainOfResponsibilityOptions = {}): ChainOfResponsibility<Request, Props, Init> {\n // Freeze options to prevent accidental change.\n options = Object.freeze({ ...options });\n\n const BuildContext = createContext<BuildContextType<Request, Props>>(\n Object.freeze({ enhancer: next => request => next(request) })\n );\n\n const RenderContext = createContext<RenderContextType<Props>>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new Proxy({} as any, {\n get() {\n // The following is assertion, there is no way to hit this line.\n /* istanbul ignore next */\n throw new Error(\n 'react-chain-of-responsibility: this hook cannot be used outside of <Proxy> and useBuildRenderCallback()'\n );\n }\n })\n );\n\n function reactComponent<P extends Props>(\n component: ComponentType<P>,\n bindProps?:\n | (Partial<Props> & Omit<P, keyof Props>)\n | ((props: Props) => Partial<Props> & Omit<P, keyof Props>)\n | undefined\n ): ComponentHandlerResult<Props> {\n return Object.freeze({\n [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined,\n render: (overridingProps?: Partial<Props> | undefined) => (\n <ComponentWithProps\n bindProps={bindProps}\n component={component as ComponentType<Props>}\n overridingProps={overridingProps}\n />\n )\n });\n }\n\n const ComponentWithProps = memo(function ComponentWithProps({\n bindProps,\n component: Component,\n overridingProps\n }: {\n readonly bindProps?: Partial<Props> | ((props: Props) => Partial<Props>) | undefined;\n readonly component: ComponentType<Props>;\n readonly overridingProps?: Partial<Props> | undefined;\n }) {\n const { allowOverrideProps } = options;\n const { renderCallbackProps } = useContext(RenderContext);\n\n if (overridingProps && !arePropsEqual(overridingProps, renderCallbackProps) && !allowOverrideProps) {\n console.warn('react-chain-of-responsibility: \"allowOverrideProps\" must be set to true to override props');\n }\n\n const props = Object.freeze(\n allowOverrideProps ? { ...renderCallbackProps, ...overridingProps } : { ...renderCallbackProps }\n );\n\n return <Component {...props} {...(typeof bindProps === 'function' ? bindProps(props) : bindProps)} />;\n });\n\n const useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props> = () => {\n const { enhancer } = useContext(BuildContext);\n\n return useCallback(\n (request, buildOptions = {}) => {\n const result =\n // Put the \"fallbackComponent\" as the last one in the chain.\n enhancer(() => {\n const { fallbackComponent } = buildOptions;\n\n if (!fallbackComponent) {\n console.warn(\n 'react-chain-of-responsibility: the request has fall through all middleware, set \"fallbackComponent\" as a catchall',\n request\n );\n\n // For clarity, we are returning `undefined` instead of `() => undefined`.\n return;\n }\n\n return Object.freeze({\n // Convert fallback component as renderer.\n [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined,\n render: () => (\n // Currently, there are no ways to set `bindProps` to `fallbackComponent`.\n // `fallbackComponent` do not need `overridingProps` because it is the last one in the chain, it would not have the next() function.\n <ComponentWithProps component={fallbackComponent} />\n )\n });\n })(request);\n\n return (\n result &&\n ((props: Props) => {\n const renderCallbackProps = useMemoValueWithEquality<Props>(() => props, arePropsEqual);\n\n const context = useMemo<RenderContextType<Props>>(\n () => Object.freeze({ renderCallbackProps }),\n [renderCallbackProps]\n );\n\n return <RenderContext.Provider value={context}>{result.render()}</RenderContext.Provider>;\n })\n );\n },\n [enhancer]\n );\n };\n\n function ChainOfResponsibilityProvider({ children, init, middleware }: ProviderProps<Request, Props, Init>) {\n if (!Array.isArray(middleware) || middleware.some(middleware => typeof middleware !== 'function')) {\n throw new Error('react-chain-of-responsibility: \"middleware\" prop must be an array of functions');\n }\n\n // Remap the middleware, so all inputs/outputs are validated.\n const fortifiedMiddleware = useMemo(\n () =>\n Object.freeze(\n middleware.map<ComponentMiddleware<Request, Props, Init>>(fn => (init: Init) => {\n const enhancer = fn(init);\n\n return next => originalRequest => {\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(\n 'react-chain-of-responsibility: next() cannot be called after the function had returned synchronously'\n );\n }\n\n // We do not allow passing void/undefined to next() because it would be confusing whether to keep the original request or pass an undefined.\n !options.passModifiedRequest &&\n !Object.is(nextRequest, originalRequest) &&\n console.warn(\n 'react-chain-of-responsibility: next() must be called with the original request, otherwise, set \"options.passModifiedRequest\" to true to pass a different request object downstream'\n );\n\n return next(options.passModifiedRequest ? nextRequest : originalRequest);\n })(originalRequest);\n\n hasReturned = true;\n\n // Make sure the return value is built using our helper function for forward-compatibility reason.\n return returnValue && parse(componentHandlerResultSchema, returnValue);\n };\n })\n ),\n [middleware]\n );\n\n const { enhancer: parentEnhancer } = useContext(BuildContext);\n\n const enhancer = useMemo<ComponentEnhancer<Request, Props>>(\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<ComponentHandlerResult<Props> | undefined, Request, Init>(\n ...[...fortifiedMiddleware, ...[() => parentEnhancer]]\n )(init as Init),\n [init, fortifiedMiddleware, parentEnhancer]\n );\n\n const contextValue = useMemo<BuildContextType<Request, Props>>(() => Object.freeze({ enhancer }), [enhancer]);\n\n return <BuildContext.Provider value={contextValue}>{children}</BuildContext.Provider>;\n }\n\n function ChainOfResponsibilityProxy({ fallbackComponent, request, ...props }: ProxyProps<Request, Props>) {\n const result = useBuildRenderCallback()(request, { fallbackComponent })?.(props as Props);\n\n return result ? <Fragment>{result}</Fragment> : null;\n }\n\n const MemoizedChainOfResponsibilityProvider =\n memo<ProviderProps<Request, Props, Init>>(ChainOfResponsibilityProvider);\n\n return Object.freeze({\n Provider: MemoizedChainOfResponsibilityProvider as typeof MemoizedChainOfResponsibilityProvider &\n InferenceHelper<Request, Props, Init>,\n Proxy: memo<ProxyProps<Request, Props>>(ChainOfResponsibilityProxy),\n reactComponent,\n useBuildRenderCallback\n\n // TODO: Consider adding back `asMiddleware`.\n });\n}\n\nexport default createChainOfResponsibility;\nexport {\n type ChainOfResponsibility,\n type ComponentEnhancer,\n type ComponentHandler,\n type ComponentHandlerResult,\n type ComponentMiddleware,\n type ComponentRenderer,\n type CreateChainOfResponsibilityOptions,\n type InferenceHelper,\n type InferInit,\n type InferMiddleware,\n type InferProps,\n type InferProviderProps,\n type InferProxyProps,\n type InferRequest,\n type ProviderProps,\n type ProxyProps,\n type ReactComponentHandlerResult,\n type UseBuildRenderCallback,\n type UseBuildRenderCallbackOptions\n};\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function arePropsEqual<T extends Record<string, any>>(x: T, y: T): boolean {\n if (Object.is(x, y)) {\n return true;\n }\n\n const mapOfX = new Map(Object.entries(x));\n const mapOfY = new Map(Object.entries(y));\n\n if (mapOfX.size !== mapOfY.size) {\n return false;\n }\n\n const keys = new Set([...mapOfX.keys(), ...mapOfY.keys()]);\n\n for (const key of keys) {\n if (!Object.is(mapOfX.get(key), mapOfY.get(key))) {\n return false;\n }\n }\n\n return true;\n}\n","import { useEffect, useRef } from 'react';\n\nconst NOT_INITIALIZED = Symbol();\n\nexport default function useMemoValueWithEquality<T>(factory: () => T, equalityFn: (x: T, y: T) => boolean): T {\n const prevRef = useRef<T | typeof NOT_INITIALIZED>(NOT_INITIALIZED);\n const next: T = factory();\n const current: T = prevRef.current !== NOT_INITIALIZED && equalityFn(prevRef.current, next) ? prevRef.current : next;\n\n useEffect(() => {\n prevRef.current = current;\n });\n\n return current;\n}\n"],"mappings":"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","names":["ComponentWithProps","middleware","init","enhancer"]}
1
+ {"version":3,"sources":["../src/preview/createChainOfResponsibilityAsRenderCallback.tsx","../src/preview/private/arePropsEqual.ts"],"sourcesContent":["import { applyMiddleware } from 'handler-chain';\nimport React, {\n createContext,\n Fragment,\n memo,\n useCallback,\n useContext,\n useMemo,\n type ComponentType,\n type PropsWithChildren,\n type ReactElement,\n type ReactNode\n} from 'react';\nimport { type SetOptional } from 'type-fest';\nimport { custom, function_, object, parse, safeParse } from 'valibot';\n\nimport arePropsEqual from './private/arePropsEqual.ts';\n\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.\ndeclare global {\n interface ArrayConstructor {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n isArray(arg: any): arg is readonly any[];\n }\n}\n\ntype BaseProps = object;\n\ntype CreateChainOfResponsibilityOptions = {\n /**\n * Allows one component to pass different set of props to its downstream component. Default is false.\n *\n * It is recommended to keep this settings as default to prevent newly added component from unexpectedly changing behavior of downstream components.\n */\n readonly allowOverrideProps?: boolean | undefined;\n\n /**\n * Allows a middleware to pass another request object when calling its next middleware. Default is false.\n *\n * It is recommended to keep this settings as default ot prevent newly added middleware from unexpectedly changing behavior of downstream middleware.\n *\n * To prevent upstream middleware from modifying the request, the request object should be set to be immutable through `Object.freeze`.\n */\n readonly passModifiedRequest?: boolean | undefined;\n};\n\ntype ChainOfResponsibility<Request, Props extends BaseProps, Init> = {\n readonly Provider: ComponentType<ProviderProps<Request, Props, Init>> & InferenceHelper<Request, Props, Init>;\n readonly Proxy: ComponentType<ProxyProps<Request, Props>>;\n readonly reactComponent: ReactComponentHandlerResult<Props>;\n readonly useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props>;\n};\n\n// TODO: Maybe this one should be local.\n// Verify that reactComponent() from an instance of CoR should throw error when used in another instance of CoR.\nconst DO_NOT_CREATE_THIS_OBJECT_YOURSELF = Symbol();\n\ntype ComponentRenderer<Props> = (props: Props) => ReactElement | null;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst componentHandlerResultSchema = custom<ComponentHandlerResult<any>>(\n value =>\n safeParse(object({ render: function_() }), value).success &&\n !!value &&\n typeof value === 'object' &&\n DO_NOT_CREATE_THIS_OBJECT_YOURSELF in value,\n 'react-chain-of-responsibility: middleware must return value constructed by reactComponent()'\n);\n\ninterface ComponentHandlerResult<Props extends BaseProps> {\n readonly [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined;\n readonly render: (overridingProps?: Partial<Props> | undefined) => ReactElement | null;\n}\n\ntype ComponentHandler<Request, Props extends BaseProps> = (\n request: Request\n) => ComponentHandlerResult<Props> | undefined;\n\ntype ComponentEnhancer<Request, Props extends BaseProps> = (\n next: ComponentHandler<Request, Props>\n) => ComponentHandler<Request, Props>;\n\ntype ComponentMiddleware<Request, Props extends BaseProps, Init = undefined> = (\n init: Init\n) => ComponentEnhancer<Request, Props>;\n\ntype ReactComponentInit<\n Props extends BaseProps,\n W extends (BaseProps & { children?: ReactNode | undefined }) | void = void\n> = W extends void\n ? {\n wrapperComponent?: undefined;\n wrapperProps?: undefined;\n }\n : {\n wrapperComponent: ComponentType<W>;\n wrapperProps: W | ((props: Props) => W);\n };\n\ntype ReactComponentHandlerResult<Props extends BaseProps> = <\n P extends Props,\n W extends (BaseProps & { children?: ReactNode | undefined }) | void = void\n>(\n component: ComponentType<P>,\n bindProps?: SetOptional<P, keyof Props> | ((props: Props) => SetOptional<P, keyof Props>) | undefined,\n init?: ReactComponentInit<Props, W>\n) => ComponentHandlerResult<Props>;\n\ntype UseBuildRenderCallbackOptions<Props> = {\n readonly fallbackComponent?: ComponentType<Props> | undefined;\n};\n\ninterface UseBuildRenderCallback<Request, Props extends BaseProps> {\n (request: Request, options?: undefined | UseBuildRenderCallbackOptions<Props>): ComponentRenderer<Props> | undefined;\n}\n\ntype BuildContextType<Request, Props extends BaseProps> = {\n readonly enhancer: ComponentEnhancer<Request, Props>;\n};\n\ntype RenderContextType<Props> = {\n readonly originalProps: Props;\n};\n\ntype ProviderProps<Request, Props extends BaseProps, Init> = PropsWithChildren<{\n readonly 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 BaseProps> = Props & {\n readonly fallbackComponent?: ComponentType<Props> | undefined;\n readonly request: Request;\n};\n\ntype InferenceHelper<Request, Props extends BaseProps, Init> = {\n readonly '~types': {\n readonly init: Init;\n readonly middleware: ComponentMiddleware<Request, Props, Init>;\n readonly props: Props;\n readonly proxyProps: ProxyProps<Request, Props>;\n readonly providerProps: ProviderProps<Request, Props, Init>;\n readonly request: Request;\n };\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferInit<T extends InferenceHelper<any, any, any>> = T['~types']['init'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferMiddleware<T extends InferenceHelper<any, any, any>> = T['~types']['middleware'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProps<T extends InferenceHelper<any, any, any>> = T['~types']['props'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProxyProps<T extends InferenceHelper<any, any, any>> = T['~types']['proxyProps'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferProviderProps<T extends InferenceHelper<any, any, any>> = T['~types']['providerProps'];\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InferRequest<T extends InferenceHelper<any, any, any>> = T['~types']['request'];\n\nfunction createComponentHandlerResult<Props extends BaseProps>(\n render: (overridingProps?: Partial<Props> | undefined) => ReactElement | null\n): ComponentHandlerResult<Props> {\n return Object.freeze({ [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined, render });\n}\n\nfunction createChainOfResponsibility<\n Request = void,\n Props extends BaseProps = { readonly children?: never },\n Init = void\n>(options: CreateChainOfResponsibilityOptions = {}): ChainOfResponsibility<Request, Props, Init> {\n // Freeze options to prevent accidental change.\n options = Object.freeze({ ...options });\n\n const BuildContext = createContext<BuildContextType<Request, Props>>(\n Object.freeze({ enhancer: next => request => next(request) })\n );\n\n const RenderContext = createContext<RenderContextType<Props>>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new Proxy({} as any, {\n get() {\n // The following is assertion, there is no way to hit this line.\n /* istanbul ignore next */\n throw new Error(\n 'react-chain-of-responsibility: this hook cannot be used outside of <Proxy> and useBuildRenderCallback()'\n );\n }\n })\n );\n\n function reactComponent<P extends Props, W extends (BaseProps & { children?: ReactNode | undefined }) | void = void>(\n component: ComponentType<P>,\n // For `bindProps` of type function, do not do side-effect in it, it may not be always called in all scenarios.\n bindProps?: SetOptional<P, keyof Props> | ((props: Props) => SetOptional<P, keyof Props>) | undefined,\n init?: ReactComponentInit<Props, W> | undefined\n ): ComponentHandlerResult<Props> {\n // memo() and generic type do not play well together.\n const TypedWrapperComponent = WrapperComponent as ComponentType<WrapperComponentProps<P, W>>;\n\n if (init?.wrapperComponent && init.wrapperProps) {\n return createComponentHandlerResult((overridingProps?: Partial<Props> | undefined) => (\n <TypedWrapperComponent\n bindProps={bindProps}\n component={component}\n overridingProps={overridingProps}\n wrapperComponent={init.wrapperComponent as ComponentType<W>}\n wrapperProps={init.wrapperProps as W}\n />\n ));\n } else {\n return createComponentHandlerResult((overridingProps?: Partial<Props> | undefined) => (\n <TypedWrapperComponent bindProps={bindProps} component={component} overridingProps={overridingProps} />\n ));\n }\n }\n\n type WrapperComponentProps<\n P extends Props,\n W extends (BaseProps & { children?: ReactNode | undefined }) | void = void\n > = {\n readonly bindProps: SetOptional<P, keyof Props> | ((props: Props) => SetOptional<P, keyof Props>) | undefined;\n readonly component: ComponentType<P>;\n readonly overridingProps: Partial<Props> | undefined;\n readonly wrapperComponent?: ComponentType<W> | undefined;\n readonly wrapperProps?: W | ((props: Props) => W) | undefined;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const WrapperComponent = memo<WrapperComponentProps<any, any>>(function WrapperComponent<\n P extends Props,\n W extends BaseProps & { children?: ReactNode | undefined }\n >({\n bindProps,\n component: Component,\n overridingProps,\n wrapperComponent: WrapperComponent,\n wrapperProps\n }: WrapperComponentProps<P, W>) {\n const { allowOverrideProps } = options;\n const { originalProps: renderCallbackProps } = useContext(RenderContext);\n\n if (overridingProps && !arePropsEqual(overridingProps, renderCallbackProps) && !allowOverrideProps) {\n console.warn('react-chain-of-responsibility: \"allowOverrideProps\" must be set to true to override props');\n }\n\n const props = Object.freeze(\n allowOverrideProps ? { ...renderCallbackProps, ...overridingProps } : { ...renderCallbackProps }\n );\n\n const child = (\n <Component\n {...({\n ...props,\n ...(typeof bindProps === 'function' ? bindProps(props) : bindProps)\n } as P)}\n />\n );\n\n return WrapperComponent && wrapperProps ? (\n <WrapperComponent {...(typeof wrapperProps === 'function' ? wrapperProps(props) : wrapperProps)}>\n {child}\n </WrapperComponent>\n ) : (\n child\n );\n });\n\n const useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props> = () => {\n const { enhancer } = useContext(BuildContext);\n\n return useCallback(\n (request, buildOptions = {}) => {\n const result =\n // Put the \"fallbackComponent\" as the last one in the chain.\n enhancer(() => {\n const { fallbackComponent } = buildOptions;\n\n if (!fallbackComponent) {\n console.warn(\n 'react-chain-of-responsibility: the request has fall through all middleware, set \"fallbackComponent\" as a catchall',\n request\n );\n\n // For clarity, we are returning `undefined` instead of `() => undefined`.\n return;\n }\n\n // `fallbackComponent` do not need `overridingProps` because it is the last one in the chain, it would not have the next() function.\n return reactComponent(fallbackComponent);\n })(request);\n\n return (\n result &&\n ((originalProps: Props) => (\n // This is render function, we cannot call any hooks here.\n <BuildRenderCallback originalProps={originalProps} render={result.render} />\n ))\n );\n },\n [enhancer]\n );\n };\n\n type BuildRenderCallbackProps = {\n readonly originalProps: Props;\n readonly render: () => ReactNode;\n };\n\n // Do not memoize <BuildRenderCallback>.\n // `bindProps` may have side effect and we want to be re-rendered to capture the side-effect.\n // To prevent wasted render, web devs should memoize it themselves.\n function BuildRenderCallback({ originalProps, render }: BuildRenderCallbackProps) {\n const context = useMemo<RenderContextType<Props>>(() => Object.freeze({ originalProps }), [originalProps]);\n\n return <RenderContext.Provider value={context}>{render()}</RenderContext.Provider>;\n }\n\n function ChainOfResponsibilityProvider({ children, init, middleware }: ProviderProps<Request, Props, Init>) {\n if (!Array.isArray(middleware) || middleware.some(middleware => typeof middleware !== 'function')) {\n throw new Error('react-chain-of-responsibility: \"middleware\" prop must be an array of functions');\n }\n\n // Remap the middleware, so all inputs/outputs are validated.\n const fortifiedMiddleware = useMemo(\n () =>\n Object.freeze(\n middleware.map<ComponentMiddleware<Request, Props, Init>>(fn => (init: Init) => {\n const enhancer = fn(init);\n\n return next => originalRequest => {\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(\n 'react-chain-of-responsibility: next() cannot be called after the function had returned synchronously'\n );\n }\n\n // We do not allow passing void/undefined to next() because it would be confusing whether to keep the original request or pass an undefined.\n !options.passModifiedRequest &&\n !Object.is(nextRequest, originalRequest) &&\n console.warn(\n 'react-chain-of-responsibility: next() must be called with the original request, otherwise, set \"options.passModifiedRequest\" to true to pass a different request object downstream'\n );\n\n return next(options.passModifiedRequest ? nextRequest : originalRequest);\n })(originalRequest);\n\n hasReturned = true;\n\n // Make sure the return value is built using our helper function for forward-compatibility reason.\n return returnValue && parse(componentHandlerResultSchema, returnValue);\n };\n })\n ),\n [middleware]\n );\n\n const { enhancer: parentEnhancer } = useContext(BuildContext);\n\n const enhancer = useMemo<ComponentEnhancer<Request, Props>>(\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<ComponentHandlerResult<Props> | undefined, Request, Init>(\n ...[...fortifiedMiddleware, ...[() => parentEnhancer]]\n )(init as Init),\n [init, fortifiedMiddleware, parentEnhancer]\n );\n\n const contextValue = useMemo<BuildContextType<Request, Props>>(() => Object.freeze({ enhancer }), [enhancer]);\n\n return <BuildContext.Provider value={contextValue}>{children}</BuildContext.Provider>;\n }\n\n function ChainOfResponsibilityProxy({ fallbackComponent, request, ...props }: ProxyProps<Request, Props>) {\n const result = useBuildRenderCallback()(request, { fallbackComponent })?.(props as Props);\n\n return result ? <Fragment>{result}</Fragment> : null;\n }\n\n const MemoizedChainOfResponsibilityProvider =\n memo<ProviderProps<Request, Props, Init>>(ChainOfResponsibilityProvider);\n\n return Object.freeze({\n Provider: MemoizedChainOfResponsibilityProvider as typeof MemoizedChainOfResponsibilityProvider &\n InferenceHelper<Request, Props, Init>,\n Proxy: ChainOfResponsibilityProxy,\n reactComponent,\n useBuildRenderCallback\n\n // TODO: Consider adding back `asMiddleware`.\n });\n}\n\nexport default createChainOfResponsibility;\nexport {\n type ChainOfResponsibility,\n type ComponentEnhancer,\n type ComponentHandler,\n type ComponentHandlerResult,\n type ComponentMiddleware,\n type ComponentRenderer,\n type CreateChainOfResponsibilityOptions,\n type InferenceHelper,\n type InferInit,\n type InferMiddleware,\n type InferProps,\n type InferProviderProps,\n type InferProxyProps,\n type InferRequest,\n type ProviderProps,\n type ProxyProps,\n type ReactComponentHandlerResult,\n type UseBuildRenderCallback,\n type UseBuildRenderCallbackOptions\n};\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function arePropsEqual<T extends Record<string, any>>(x: T, y: T): boolean {\n if (Object.is(x, y)) {\n return true;\n }\n\n const mapOfX = new Map(Object.entries(x));\n const mapOfY = new Map(Object.entries(y));\n\n if (mapOfX.size !== mapOfY.size) {\n return false;\n }\n\n const keys = new Set([...mapOfX.keys(), ...mapOfY.keys()]);\n\n for (const key of keys) {\n if (!Object.is(mapOfX.get(key), mapOfY.get(key))) {\n return false;\n }\n }\n\n return true;\n}\n"],"mappings":"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","names":["WrapperComponent","middleware","init","enhancer"]}
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "react-chain-of-responsibility",
3
- "version": "0.4.0-main.feea005",
3
+ "version": "0.4.1-main.275c1f4",
4
4
  "description": "Using chain of responsibility design pattern for compositing and customizing React component.",
5
5
  "files": [
6
+ "./*.js",
6
7
  "./dist/"
7
8
  ],
8
9
  "exports": {
@@ -50,6 +51,7 @@
50
51
  "precommit:typescript:production": "tsc --noEmit --project ./src/tsconfig.precommit.production.json",
51
52
  "precommit:typescript:test": "tsc --noEmit --project ./src/tsconfig.precommit.test.json",
52
53
  "prepack": "cp ../../CHANGELOG.md . && cp ../../LICENSE . && cp ../../README.md .",
54
+ "start": "npm run build -- --onSuccess \"touch ../pages/package.json\" --watch",
53
55
  "switch": "cat package.json | jq --arg SWITCH_NAME $SWITCH_NAME -r '(.[\"switch:\" + $SWITCH_NAME] // {}) as $TEMPLATE | .devDependencies += ($TEMPLATE.devDependencies // {}) | .dependencies += ($TEMPLATE.dependencies // {})' | tee ./package.json.tmp && mv ./package.json.tmp ./package.json",
54
56
  "test": "jest"
55
57
  },
@@ -73,9 +75,10 @@
73
75
  "@testing-library/react": "^12",
74
76
  "@types/react": "^16",
75
77
  "@types/react-dom": "^16",
76
- "react": "16.8.0",
77
- "react-dom": "16.8.0",
78
- "react-test-renderer": "16.8.0"
78
+ "@types/react-test-renderer": "^16",
79
+ "react": "16.8.6",
80
+ "react-dom": "16.8.6",
81
+ "react-test-renderer": "16.8.6"
79
82
  }
80
83
  },
81
84
  "switch:react-17": {
@@ -83,6 +86,7 @@
83
86
  "@testing-library/react": "^12",
84
87
  "@types/react": "^17",
85
88
  "@types/react-dom": "^17",
89
+ "@types/react-test-renderer": "^17",
86
90
  "react": "17.0.0",
87
91
  "react-dom": "17.0.0",
88
92
  "react-test-renderer": "17.0.0"
@@ -90,17 +94,34 @@
90
94
  },
91
95
  "switch:react-18": {
92
96
  "devDependencies": {
97
+ "@testing-library/react": "^16",
93
98
  "@types/react": "^18",
94
99
  "@types/react-dom": "^18",
100
+ "@types/react-test-renderer": "^18",
95
101
  "react": "18.0.0",
96
102
  "react-dom": "18.0.0",
97
103
  "react-test-renderer": "18.0.0"
98
104
  }
99
105
  },
100
106
  "pinDependencies": {
107
+ "@testduet/given-when-then": [
108
+ "main"
109
+ ],
110
+ "@testduet/wait-for": [
111
+ "main"
112
+ ],
101
113
  "@types/react": [
102
114
  "18"
103
115
  ],
116
+ "@types/react-dom": [
117
+ "18"
118
+ ],
119
+ "@types/react-test-renderer": [
120
+ "18"
121
+ ],
122
+ "escape-string-regexp": [
123
+ "4"
124
+ ],
104
125
  "react": [
105
126
  "18"
106
127
  ],
@@ -112,23 +133,26 @@
112
133
  ]
113
134
  },
114
135
  "devDependencies": {
115
- "@babel/preset-env": "^7.27.2",
136
+ "@babel/preset-env": "^7.28.0",
116
137
  "@babel/preset-react": "^7.27.1",
117
138
  "@babel/preset-typescript": "^7.27.1",
118
- "@fluentui/react": "^8.123.0",
139
+ "@fluentui/react": "^8.123.1",
119
140
  "@testduet/given-when-then": "^0.1.0-main.334801c",
141
+ "@testduet/wait-for": "^0.1.1-main.3a4f261",
120
142
  "@testing-library/dom": "^10.4.0",
121
143
  "@testing-library/react": "^16.3.0",
122
144
  "@tsconfig/recommended": "^1.0.10",
123
145
  "@tsconfig/strictest": "^2.0.5",
124
146
  "@types/jest": "^30.0.0",
125
- "@types/node": "^24.0.3",
147
+ "@types/node": "^24.0.15",
126
148
  "@types/react": "^18.3.23",
127
- "esbuild": "^0.25.5",
149
+ "@types/react-dom": "^18.3.7",
150
+ "@types/react-test-renderer": "^18.3.1",
151
+ "esbuild": "^0.25.8",
128
152
  "escape-string-regexp": "^4.0.0",
129
- "jest": "^30.0.2",
130
- "jest-environment-jsdom": "^30.0.2",
131
- "prettier": "^3.5.3",
153
+ "jest": "^30.0.4",
154
+ "jest-environment-jsdom": "^30.0.4",
155
+ "prettier": "^3.6.2",
132
156
  "publint": "^0.3.12",
133
157
  "react": "^18.3.1",
134
158
  "react-dom": "^18.3.1",
@@ -139,11 +163,11 @@
139
163
  "typescript": "^5.8.3"
140
164
  },
141
165
  "peerDependencies": {
142
- "react": ">=16.8.0"
166
+ "react": ">=16.8.6"
143
167
  },
144
168
  "dependencies": {
145
169
  "handler-chain": "^0.1.0",
146
- "react-chain-of-responsibility": "^0.4.0-main.feea005",
170
+ "react-chain-of-responsibility": "^0.4.1-main.275c1f4",
147
171
  "valibot": "^1.1.0"
148
172
  }
149
173
  }
package/preview.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/react-chain-of-responsibility.preview');