react-chain-of-responsibility 0.3.1-main.cc0a3ac → 0.4.0-main.235b355

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.
@@ -0,0 +1,80 @@
1
+ import { ComponentType, PropsWithChildren, ReactNode } from 'react';
2
+
3
+ declare global {
4
+ interface ArrayConstructor {
5
+ isArray(arg: any): arg is readonly any[];
6
+ }
7
+ }
8
+ type BaseProps = object;
9
+ type CreateChainOfResponsibilityOptions = {
10
+ /**
11
+ * Allows one component to pass different set of props to its downstream component. Default is false.
12
+ *
13
+ * It is recommended to keep this settings as default to prevent newly added component from unexpectedly changing behavior of downstream components.
14
+ */
15
+ readonly allowOverrideProps?: boolean | undefined;
16
+ /**
17
+ * Allows a middleware to pass another request object when calling its next middleware. Default is false.
18
+ *
19
+ * It is recommended to keep this settings as default ot prevent newly added middleware from unexpectedly changing behavior of downstream middleware.
20
+ *
21
+ * To prevent upstream middleware from modifying the request, the request object should be set to be immutable through `Object.freeze`.
22
+ */
23
+ readonly passModifiedRequest?: boolean | undefined;
24
+ };
25
+ type ChainOfResponsibility<Request, Props extends BaseProps, Init> = {
26
+ readonly Provider: ComponentType<ProviderProps<Request, Props, Init>> & InferenceHelper<Request, Props, Init>;
27
+ readonly Proxy: ComponentType<ProxyProps<Request, Props>>;
28
+ readonly reactComponent: ReactComponentHandlerResult<Props>;
29
+ readonly useBuildRenderCallback: () => UseBuildRenderCallback<Request, Props>;
30
+ };
31
+ declare const DO_NOT_CREATE_THIS_OBJECT_YOURSELF: unique symbol;
32
+ type ComponentRenderer<Props> = (props: Props) => ReactNode;
33
+ interface ComponentHandlerResult<Props extends BaseProps> {
34
+ readonly [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: undefined;
35
+ readonly render: (overridingProps?: Partial<Props> | undefined) => ReactNode;
36
+ }
37
+ type ComponentHandler<Request, Props extends BaseProps> = (request: Request) => ComponentHandlerResult<Props> | undefined;
38
+ type ComponentEnhancer<Request, Props extends BaseProps> = (next: ComponentHandler<Request, Props>) => ComponentHandler<Request, Props>;
39
+ type ComponentMiddleware<Request, Props extends BaseProps, Init = undefined> = (init: Init) => ComponentEnhancer<Request, Props>;
40
+ type ReactComponentHandlerResult<Props extends object> = <P extends Props>(component: ComponentType<P>, bindProps?: (Partial<Props> & Omit<P, keyof Props>) | ((props: Props) => Partial<Props> & Omit<P, keyof Props>) | undefined) => ComponentHandlerResult<Props>;
41
+ type UseBuildRenderCallbackOptions<Props> = {
42
+ readonly fallbackComponent?: ComponentType<Props> | undefined;
43
+ };
44
+ interface UseBuildRenderCallback<Request, Props extends BaseProps> {
45
+ (request: Request, options?: undefined | UseBuildRenderCallbackOptions<Props>): ComponentRenderer<Props> | undefined;
46
+ }
47
+ type ProviderProps<Request, Props extends BaseProps, Init> = PropsWithChildren<{
48
+ readonly middleware: readonly ComponentMiddleware<Request, Props, Init>[];
49
+ }> & (Init extends never | void ? {
50
+ readonly init?: undefined;
51
+ } : Init extends undefined | void ? {
52
+ readonly init?: Init;
53
+ } : {
54
+ readonly init: Init;
55
+ });
56
+ type ProxyProps<Request, Props extends BaseProps> = Props & {
57
+ readonly fallbackComponent?: ComponentType<Props> | undefined;
58
+ readonly request: Request;
59
+ };
60
+ type InferenceHelper<Request, Props extends BaseProps, Init> = {
61
+ readonly '~types': {
62
+ readonly init: Init;
63
+ readonly middleware: ComponentMiddleware<Request, Props, Init>;
64
+ readonly props: Props;
65
+ readonly proxyProps: ProxyProps<Request, Props>;
66
+ readonly providerProps: ProviderProps<Request, Props, Init>;
67
+ readonly request: Request;
68
+ };
69
+ };
70
+ type InferInit<T extends InferenceHelper<any, any, any>> = T['~types']['init'];
71
+ type InferMiddleware<T extends InferenceHelper<any, any, any>> = T['~types']['middleware'];
72
+ type InferProps<T extends InferenceHelper<any, any, any>> = T['~types']['props'];
73
+ type InferProxyProps<T extends InferenceHelper<any, any, any>> = T['~types']['proxyProps'];
74
+ type InferProviderProps<T extends InferenceHelper<any, any, any>> = T['~types']['providerProps'];
75
+ type InferRequest<T extends InferenceHelper<any, any, any>> = T['~types']['request'];
76
+ declare function createChainOfResponsibility<Request = void, Props extends BaseProps = {
77
+ readonly children?: never;
78
+ }, Init = void>(options?: CreateChainOfResponsibilityOptions): ChainOfResponsibility<Request, Props, Init>;
79
+
80
+ export { type ChainOfResponsibility, type ComponentEnhancer, type ComponentHandler, type ComponentHandlerResult, type ComponentMiddleware, type ComponentRenderer, type CreateChainOfResponsibilityOptions, type InferInit, type InferMiddleware, type InferProps, type InferProviderProps, type InferProxyProps, type InferRequest, type InferenceHelper, type ProviderProps, type ProxyProps, type ReactComponentHandlerResult, type UseBuildRenderCallback, type UseBuildRenderCallbackOptions, createChainOfResponsibility };
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.preview.ts
31
+ var index_preview_exports = {};
32
+ __export(index_preview_exports, {
33
+ createChainOfResponsibility: () => createChainOfResponsibilityAsRenderCallback_default
34
+ });
35
+ module.exports = __toCommonJS(index_preview_exports);
36
+
37
+ // src/createChainOfResponsibilityAsRenderCallback.tsx
38
+ var import_react2 = __toESM(require("react"));
39
+ var import_valibot = require("valibot");
40
+
41
+ // src/private/compose.ts
42
+ function compose(...fns) {
43
+ return (fn) => fns.reduce((chain, fn2) => fn2(chain), fn);
44
+ }
45
+
46
+ // src/private/applyMiddleware.ts
47
+ function applyMiddleware(...arrayOfMiddleware) {
48
+ return (...init) => {
49
+ const chain = arrayOfMiddleware.map((middleware) => middleware(...init));
50
+ return compose(...chain);
51
+ };
52
+ }
53
+
54
+ // src/private/arePropsEqual.ts
55
+ function arePropsEqual(x, y) {
56
+ if (Object.is(x, y)) {
57
+ return true;
58
+ }
59
+ const mapOfX = new Map(Object.entries(x));
60
+ const mapOfY = new Map(Object.entries(y));
61
+ if (mapOfX.size !== mapOfY.size) {
62
+ return false;
63
+ }
64
+ const keys = /* @__PURE__ */ new Set([...mapOfX.keys(), ...mapOfY.keys()]);
65
+ for (const key of keys) {
66
+ if (!Object.is(mapOfX.get(key), mapOfY.get(key))) {
67
+ return false;
68
+ }
69
+ }
70
+ return true;
71
+ }
72
+
73
+ // src/private/useMemoValueWithEquality.ts
74
+ var import_react = require("react");
75
+ var NOT_INITIALIZED = Symbol();
76
+ function useMemoValueWithEquality(factory, equalityFn) {
77
+ const prevRef = (0, import_react.useRef)(NOT_INITIALIZED);
78
+ const next = factory();
79
+ const current = prevRef.current !== NOT_INITIALIZED && equalityFn(prevRef.current, next) ? prevRef.current : next;
80
+ (0, import_react.useEffect)(() => {
81
+ prevRef.current = current;
82
+ });
83
+ return current;
84
+ }
85
+
86
+ // src/createChainOfResponsibilityAsRenderCallback.tsx
87
+ var DO_NOT_CREATE_THIS_OBJECT_YOURSELF = Symbol();
88
+ var componentHandlerResultSchema = (0, import_valibot.custom)(
89
+ (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,
90
+ "react-chain-of-responsibility: middleware must return value constructed by reactComponent()"
91
+ );
92
+ function createChainOfResponsibility(options = {}) {
93
+ options = Object.freeze({ ...options });
94
+ const BuildContext = (0, import_react2.createContext)(
95
+ Object.freeze({ enhancer: (next) => (request) => next(request) })
96
+ );
97
+ const RenderContext = (0, import_react2.createContext)(
98
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
99
+ new Proxy({}, {
100
+ get() {
101
+ throw new Error(
102
+ "react-chain-of-responsibility: this hook cannot be used outside of <Proxy> and useBuildRenderCallback()"
103
+ );
104
+ }
105
+ })
106
+ );
107
+ function reactComponent(component, bindProps) {
108
+ return Object.freeze({
109
+ [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: void 0,
110
+ render: (overridingProps) => /* @__PURE__ */ import_react2.default.createElement(
111
+ ComponentWithProps,
112
+ {
113
+ bindProps,
114
+ component,
115
+ overridingProps
116
+ }
117
+ )
118
+ });
119
+ }
120
+ const ComponentWithProps = (0, import_react2.memo)(function ComponentWithProps2({
121
+ bindProps,
122
+ component: Component,
123
+ overridingProps
124
+ }) {
125
+ const { allowOverrideProps } = options;
126
+ const { renderCallbackProps } = (0, import_react2.useContext)(RenderContext);
127
+ if (overridingProps && !arePropsEqual(overridingProps, renderCallbackProps) && !allowOverrideProps) {
128
+ console.warn('react-chain-of-responsibility: "allowOverrideProps" must be set to true to override props');
129
+ }
130
+ const props = Object.freeze(
131
+ allowOverrideProps ? { ...renderCallbackProps, ...overridingProps } : { ...renderCallbackProps }
132
+ );
133
+ return /* @__PURE__ */ import_react2.default.createElement(Component, { ...props, ...typeof bindProps === "function" ? bindProps(props) : bindProps });
134
+ });
135
+ const useBuildRenderCallback = () => {
136
+ const { enhancer } = (0, import_react2.useContext)(BuildContext);
137
+ return (0, import_react2.useCallback)(
138
+ (request, buildOptions = {}) => {
139
+ const result = (
140
+ // Put the "fallbackComponent" as the last one in the chain.
141
+ enhancer(() => {
142
+ const { fallbackComponent } = buildOptions;
143
+ if (!fallbackComponent) {
144
+ console.warn(
145
+ 'react-chain-of-responsibility: the request has fall through all middleware, set "fallbackComponent" as a catchall',
146
+ request
147
+ );
148
+ return;
149
+ }
150
+ return Object.freeze({
151
+ // Convert fallback component as renderer.
152
+ [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: void 0,
153
+ render: () => (
154
+ // Currently, there are no ways to set `bindProps` to `fallbackComponent`.
155
+ // `fallbackComponent` do not need `overridingProps` because it is the last one in the chain, it would not have the next() function.
156
+ /* @__PURE__ */ import_react2.default.createElement(ComponentWithProps, { component: fallbackComponent })
157
+ )
158
+ });
159
+ })(request)
160
+ );
161
+ return result && ((props) => {
162
+ const renderCallbackProps = useMemoValueWithEquality(() => props, arePropsEqual);
163
+ const context = (0, import_react2.useMemo)(
164
+ () => Object.freeze({ renderCallbackProps }),
165
+ [renderCallbackProps]
166
+ );
167
+ return /* @__PURE__ */ import_react2.default.createElement(RenderContext.Provider, { value: context }, result.render());
168
+ });
169
+ },
170
+ [enhancer]
171
+ );
172
+ };
173
+ function ChainOfResponsibilityProvider({ children, init, middleware }) {
174
+ if (!Array.isArray(middleware) || middleware.some((middleware2) => typeof middleware2 !== "function")) {
175
+ throw new Error('react-chain-of-responsibility: "middleware" prop must be an array of functions');
176
+ }
177
+ const fortifiedMiddleware = (0, import_react2.useMemo)(
178
+ () => Object.freeze(
179
+ middleware.map((fn) => (init2) => {
180
+ const enhancer2 = fn(init2);
181
+ return (next) => (originalRequest) => {
182
+ let hasReturned;
183
+ const returnValue = enhancer2((nextRequest) => {
184
+ if (hasReturned) {
185
+ throw new Error(
186
+ "react-chain-of-responsibility: next() cannot be called after the function had returned synchronously"
187
+ );
188
+ }
189
+ !options.passModifiedRequest && !Object.is(nextRequest, originalRequest) && console.warn(
190
+ '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'
191
+ );
192
+ return next(options.passModifiedRequest ? nextRequest : originalRequest);
193
+ })(originalRequest);
194
+ hasReturned = true;
195
+ return returnValue && (0, import_valibot.parse)(componentHandlerResultSchema, returnValue);
196
+ };
197
+ })
198
+ ),
199
+ [middleware]
200
+ );
201
+ const { enhancer: parentEnhancer } = (0, import_react2.useContext)(BuildContext);
202
+ const enhancer = (0, import_react2.useMemo)(
203
+ () => (
204
+ // We are reversing because it is easier to read:
205
+ // - With reverse, [a, b, c] will become a(b(c(fn)))
206
+ // - Without reverse, [a, b, c] will become c(b(a(fn)))
207
+ applyMiddleware(
208
+ ...[...fortifiedMiddleware, ...[() => parentEnhancer]].reverse()
209
+ )(init)
210
+ ),
211
+ [init, fortifiedMiddleware, parentEnhancer]
212
+ );
213
+ const contextValue = (0, import_react2.useMemo)(() => Object.freeze({ enhancer }), [enhancer]);
214
+ return /* @__PURE__ */ import_react2.default.createElement(BuildContext.Provider, { value: contextValue }, children);
215
+ }
216
+ function ChainOfResponsibilityProxy({ fallbackComponent, request, ...props }) {
217
+ const result = useBuildRenderCallback()(request, { fallbackComponent })?.(props);
218
+ return result ? /* @__PURE__ */ import_react2.default.createElement(import_react2.Fragment, null, result) : null;
219
+ }
220
+ const MemoizedChainOfResponsibilityProvider = (0, import_react2.memo)(ChainOfResponsibilityProvider);
221
+ return Object.freeze({
222
+ Provider: MemoizedChainOfResponsibilityProvider,
223
+ Proxy: (0, import_react2.memo)(ChainOfResponsibilityProxy),
224
+ reactComponent,
225
+ useBuildRenderCallback
226
+ // TODO: Consider adding back `asMiddleware`.
227
+ });
228
+ }
229
+ var createChainOfResponsibilityAsRenderCallback_default = createChainOfResponsibility;
230
+ // Annotate the CommonJS export names for ESM import in node:
231
+ 0 && (module.exports = {
232
+ createChainOfResponsibility
233
+ });
234
+ //# sourceMappingURL=react-chain-of-responsibility.preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.preview.ts","../src/createChainOfResponsibilityAsRenderCallback.tsx","../src/private/compose.ts","../src/private/applyMiddleware.ts","../src/private/arePropsEqual.ts","../src/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 './createChainOfResponsibilityAsRenderCallback.tsx';\n","import 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 applyMiddleware from './private/applyMiddleware.ts';\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<[Request], ComponentHandlerResult<Props> | undefined, [Init]>(\n ...[...fortifiedMiddleware, ...[() => parentEnhancer]].reverse()\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\ntype Fn<P extends any[], R> = (...args: P) => R;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Enhancer<P extends any[], R> = (next: Fn<P, R>) => Fn<P, R>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function compose<P extends any[], R>(...fns: Enhancer<P, R>[]): Enhancer<P, R> {\n return (fn: Fn<P, R>): Fn<P, R> => fns.reduce((chain, fn) => fn(chain), fn);\n}\n","import compose from './compose.ts';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Fn<P extends any[], R> = (...args: P) => R;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Enhancer<P extends any[], R> = (next: Fn<P, R>) => Fn<P, R>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Middleware<P extends any[], R, S extends any[]> = (...init: S) => Enhancer<P, R>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function applyMiddleware<P extends any[], R, S extends any[]>(\n ...arrayOfMiddleware: Middleware<P, R, S>[]\n) {\n return (...init: S) => {\n const chain = arrayOfMiddleware.map(middleware => middleware(...init));\n\n return compose(...chain);\n };\n}\n","// 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","fn","React","ComponentWithProps","middleware","init","enhancer"]}
@@ -0,0 +1,195 @@
1
+ import {
2
+ applyMiddleware
3
+ } from "./chunk-TNTIZJJ5.mjs";
4
+
5
+ // src/createChainOfResponsibilityAsRenderCallback.tsx
6
+ import React, {
7
+ createContext,
8
+ Fragment,
9
+ memo,
10
+ useCallback,
11
+ useContext,
12
+ useMemo
13
+ } from "react";
14
+ import { custom, function_, object, parse, safeParse } from "valibot";
15
+
16
+ // src/private/arePropsEqual.ts
17
+ function arePropsEqual(x, y) {
18
+ if (Object.is(x, y)) {
19
+ return true;
20
+ }
21
+ const mapOfX = new Map(Object.entries(x));
22
+ const mapOfY = new Map(Object.entries(y));
23
+ if (mapOfX.size !== mapOfY.size) {
24
+ return false;
25
+ }
26
+ const keys = /* @__PURE__ */ new Set([...mapOfX.keys(), ...mapOfY.keys()]);
27
+ for (const key of keys) {
28
+ if (!Object.is(mapOfX.get(key), mapOfY.get(key))) {
29
+ return false;
30
+ }
31
+ }
32
+ return true;
33
+ }
34
+
35
+ // src/private/useMemoValueWithEquality.ts
36
+ import { useEffect, useRef } from "react";
37
+ var NOT_INITIALIZED = Symbol();
38
+ function useMemoValueWithEquality(factory, equalityFn) {
39
+ const prevRef = useRef(NOT_INITIALIZED);
40
+ const next = factory();
41
+ const current = prevRef.current !== NOT_INITIALIZED && equalityFn(prevRef.current, next) ? prevRef.current : next;
42
+ useEffect(() => {
43
+ prevRef.current = current;
44
+ });
45
+ return current;
46
+ }
47
+
48
+ // src/createChainOfResponsibilityAsRenderCallback.tsx
49
+ var DO_NOT_CREATE_THIS_OBJECT_YOURSELF = Symbol();
50
+ var componentHandlerResultSchema = custom(
51
+ (value) => safeParse(object({ render: function_() }), value).success && !!value && typeof value === "object" && DO_NOT_CREATE_THIS_OBJECT_YOURSELF in value,
52
+ "react-chain-of-responsibility: middleware must return value constructed by reactComponent()"
53
+ );
54
+ function createChainOfResponsibility(options = {}) {
55
+ options = Object.freeze({ ...options });
56
+ const BuildContext = createContext(
57
+ Object.freeze({ enhancer: (next) => (request) => next(request) })
58
+ );
59
+ const RenderContext = createContext(
60
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
+ new Proxy({}, {
62
+ get() {
63
+ throw new Error(
64
+ "react-chain-of-responsibility: this hook cannot be used outside of <Proxy> and useBuildRenderCallback()"
65
+ );
66
+ }
67
+ })
68
+ );
69
+ function reactComponent(component, bindProps) {
70
+ return Object.freeze({
71
+ [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: void 0,
72
+ render: (overridingProps) => /* @__PURE__ */ React.createElement(
73
+ ComponentWithProps,
74
+ {
75
+ bindProps,
76
+ component,
77
+ overridingProps
78
+ }
79
+ )
80
+ });
81
+ }
82
+ const ComponentWithProps = memo(function ComponentWithProps2({
83
+ bindProps,
84
+ component: Component,
85
+ overridingProps
86
+ }) {
87
+ const { allowOverrideProps } = options;
88
+ const { renderCallbackProps } = useContext(RenderContext);
89
+ if (overridingProps && !arePropsEqual(overridingProps, renderCallbackProps) && !allowOverrideProps) {
90
+ console.warn('react-chain-of-responsibility: "allowOverrideProps" must be set to true to override props');
91
+ }
92
+ const props = Object.freeze(
93
+ allowOverrideProps ? { ...renderCallbackProps, ...overridingProps } : { ...renderCallbackProps }
94
+ );
95
+ return /* @__PURE__ */ React.createElement(Component, { ...props, ...typeof bindProps === "function" ? bindProps(props) : bindProps });
96
+ });
97
+ const useBuildRenderCallback = () => {
98
+ const { enhancer } = useContext(BuildContext);
99
+ return useCallback(
100
+ (request, buildOptions = {}) => {
101
+ const result = (
102
+ // Put the "fallbackComponent" as the last one in the chain.
103
+ enhancer(() => {
104
+ const { fallbackComponent } = buildOptions;
105
+ if (!fallbackComponent) {
106
+ console.warn(
107
+ 'react-chain-of-responsibility: the request has fall through all middleware, set "fallbackComponent" as a catchall',
108
+ request
109
+ );
110
+ return;
111
+ }
112
+ return Object.freeze({
113
+ // Convert fallback component as renderer.
114
+ [DO_NOT_CREATE_THIS_OBJECT_YOURSELF]: void 0,
115
+ render: () => (
116
+ // Currently, there are no ways to set `bindProps` to `fallbackComponent`.
117
+ // `fallbackComponent` do not need `overridingProps` because it is the last one in the chain, it would not have the next() function.
118
+ /* @__PURE__ */ React.createElement(ComponentWithProps, { component: fallbackComponent })
119
+ )
120
+ });
121
+ })(request)
122
+ );
123
+ return result && ((props) => {
124
+ const renderCallbackProps = useMemoValueWithEquality(() => props, arePropsEqual);
125
+ const context = useMemo(
126
+ () => Object.freeze({ renderCallbackProps }),
127
+ [renderCallbackProps]
128
+ );
129
+ return /* @__PURE__ */ React.createElement(RenderContext.Provider, { value: context }, result.render());
130
+ });
131
+ },
132
+ [enhancer]
133
+ );
134
+ };
135
+ function ChainOfResponsibilityProvider({ children, init, middleware }) {
136
+ if (!Array.isArray(middleware) || middleware.some((middleware2) => typeof middleware2 !== "function")) {
137
+ throw new Error('react-chain-of-responsibility: "middleware" prop must be an array of functions');
138
+ }
139
+ const fortifiedMiddleware = useMemo(
140
+ () => Object.freeze(
141
+ middleware.map((fn) => (init2) => {
142
+ const enhancer2 = fn(init2);
143
+ return (next) => (originalRequest) => {
144
+ let hasReturned;
145
+ const returnValue = enhancer2((nextRequest) => {
146
+ if (hasReturned) {
147
+ throw new Error(
148
+ "react-chain-of-responsibility: next() cannot be called after the function had returned synchronously"
149
+ );
150
+ }
151
+ !options.passModifiedRequest && !Object.is(nextRequest, originalRequest) && console.warn(
152
+ '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'
153
+ );
154
+ return next(options.passModifiedRequest ? nextRequest : originalRequest);
155
+ })(originalRequest);
156
+ hasReturned = true;
157
+ return returnValue && parse(componentHandlerResultSchema, returnValue);
158
+ };
159
+ })
160
+ ),
161
+ [middleware]
162
+ );
163
+ const { enhancer: parentEnhancer } = useContext(BuildContext);
164
+ const enhancer = useMemo(
165
+ () => (
166
+ // We are reversing because it is easier to read:
167
+ // - With reverse, [a, b, c] will become a(b(c(fn)))
168
+ // - Without reverse, [a, b, c] will become c(b(a(fn)))
169
+ applyMiddleware(
170
+ ...[...fortifiedMiddleware, ...[() => parentEnhancer]].reverse()
171
+ )(init)
172
+ ),
173
+ [init, fortifiedMiddleware, parentEnhancer]
174
+ );
175
+ const contextValue = useMemo(() => Object.freeze({ enhancer }), [enhancer]);
176
+ return /* @__PURE__ */ React.createElement(BuildContext.Provider, { value: contextValue }, children);
177
+ }
178
+ function ChainOfResponsibilityProxy({ fallbackComponent, request, ...props }) {
179
+ const result = useBuildRenderCallback()(request, { fallbackComponent })?.(props);
180
+ return result ? /* @__PURE__ */ React.createElement(Fragment, null, result) : null;
181
+ }
182
+ const MemoizedChainOfResponsibilityProvider = memo(ChainOfResponsibilityProvider);
183
+ return Object.freeze({
184
+ Provider: MemoizedChainOfResponsibilityProvider,
185
+ Proxy: memo(ChainOfResponsibilityProxy),
186
+ reactComponent,
187
+ useBuildRenderCallback
188
+ // TODO: Consider adding back `asMiddleware`.
189
+ });
190
+ }
191
+ var createChainOfResponsibilityAsRenderCallback_default = createChainOfResponsibility;
192
+ export {
193
+ createChainOfResponsibilityAsRenderCallback_default as createChainOfResponsibility
194
+ };
195
+ //# sourceMappingURL=react-chain-of-responsibility.preview.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/createChainOfResponsibilityAsRenderCallback.tsx","../src/private/arePropsEqual.ts","../src/private/useMemoValueWithEquality.ts"],"sourcesContent":["import 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 applyMiddleware from './private/applyMiddleware.ts';\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<[Request], ComponentHandlerResult<Props> | undefined, [Init]>(\n ...[...fortifiedMiddleware, ...[() => parentEnhancer]].reverse()\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"]}