source: node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.mjs@ a762898

Last change on this file since a762898 was a762898, checked in by istevanoska <ilinastevanoska@…>, 5 months ago

Added visualizations

  • Property mode set to 100644
File size: 78.0 KB
RevLine 
[a762898]1// src/index.ts
2export * from "redux";
3import { freeze, original as original2 } from "immer";
4
5// src/immerImports.ts
6import { current, isDraft, produce, isDraftable, setUseStrictIteration } from "immer";
7
8// src/index.ts
9import { createSelector, lruMemoize } from "reselect";
10
11// src/reselectImports.ts
12import { createSelectorCreator, weakMapMemoize } from "reselect";
13
14// src/createDraftSafeSelector.ts
15var createDraftSafeSelectorCreator = (...args) => {
16 const createSelector2 = createSelectorCreator(...args);
17 const createDraftSafeSelector2 = Object.assign((...args2) => {
18 const selector = createSelector2(...args2);
19 const wrappedSelector = (value, ...rest) => selector(isDraft(value) ? current(value) : value, ...rest);
20 Object.assign(wrappedSelector, selector);
21 return wrappedSelector;
22 }, {
23 withTypes: () => createDraftSafeSelector2
24 });
25 return createDraftSafeSelector2;
26};
27var createDraftSafeSelector = /* @__PURE__ */ createDraftSafeSelectorCreator(weakMapMemoize);
28
29// src/reduxImports.ts
30import { createStore, combineReducers, applyMiddleware, compose, isPlainObject, isAction } from "redux";
31
32// src/devtoolsExtension.ts
33var composeWithDevTools = typeof window !== "undefined" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function() {
34 if (arguments.length === 0) return void 0;
35 if (typeof arguments[0] === "object") return compose;
36 return compose.apply(null, arguments);
37};
38var devToolsEnhancer = typeof window !== "undefined" && window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__ : function() {
39 return function(noop3) {
40 return noop3;
41 };
42};
43
44// src/getDefaultMiddleware.ts
45import { thunk as thunkMiddleware, withExtraArgument } from "redux-thunk";
46
47// src/tsHelpers.ts
48var hasMatchFunction = (v) => {
49 return v && typeof v.match === "function";
50};
51
52// src/createAction.ts
53function createAction(type, prepareAction) {
54 function actionCreator(...args) {
55 if (prepareAction) {
56 let prepared = prepareAction(...args);
57 if (!prepared) {
58 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(0) : "prepareAction did not return an object");
59 }
60 return {
61 type,
62 payload: prepared.payload,
63 ..."meta" in prepared && {
64 meta: prepared.meta
65 },
66 ..."error" in prepared && {
67 error: prepared.error
68 }
69 };
70 }
71 return {
72 type,
73 payload: args[0]
74 };
75 }
76 actionCreator.toString = () => `${type}`;
77 actionCreator.type = type;
78 actionCreator.match = (action) => isAction(action) && action.type === type;
79 return actionCreator;
80}
81function isActionCreator(action) {
82 return typeof action === "function" && "type" in action && // hasMatchFunction only wants Matchers but I don't see the point in rewriting it
83 hasMatchFunction(action);
84}
85function isFSA(action) {
86 return isAction(action) && Object.keys(action).every(isValidKey);
87}
88function isValidKey(key) {
89 return ["type", "payload", "error", "meta"].indexOf(key) > -1;
90}
91
92// src/actionCreatorInvariantMiddleware.ts
93function getMessage(type) {
94 const splitType = type ? `${type}`.split("/") : [];
95 const actionName = splitType[splitType.length - 1] || "actionCreator";
96 return `Detected an action creator with type "${type || "unknown"}" being dispatched.
97Make sure you're calling the action creator before dispatching, i.e. \`dispatch(${actionName}())\` instead of \`dispatch(${actionName})\`. This is necessary even if the action has no payload.`;
98}
99function createActionCreatorInvariantMiddleware(options = {}) {
100 if (process.env.NODE_ENV === "production") {
101 return () => (next) => (action) => next(action);
102 }
103 const {
104 isActionCreator: isActionCreator2 = isActionCreator
105 } = options;
106 return () => (next) => (action) => {
107 if (isActionCreator2(action)) {
108 console.warn(getMessage(action.type));
109 }
110 return next(action);
111 };
112}
113
114// src/utils.ts
115function getTimeMeasureUtils(maxDelay, fnName) {
116 let elapsed = 0;
117 return {
118 measureTime(fn) {
119 const started = Date.now();
120 try {
121 return fn();
122 } finally {
123 const finished = Date.now();
124 elapsed += finished - started;
125 }
126 },
127 warnIfExceeded() {
128 if (elapsed > maxDelay) {
129 console.warn(`${fnName} took ${elapsed}ms, which is more than the warning threshold of ${maxDelay}ms.
130If your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions.
131It is disabled in production builds, so you don't need to worry about that.`);
132 }
133 }
134 };
135}
136var Tuple = class _Tuple extends Array {
137 constructor(...items) {
138 super(...items);
139 Object.setPrototypeOf(this, _Tuple.prototype);
140 }
141 static get [Symbol.species]() {
142 return _Tuple;
143 }
144 concat(...arr) {
145 return super.concat.apply(this, arr);
146 }
147 prepend(...arr) {
148 if (arr.length === 1 && Array.isArray(arr[0])) {
149 return new _Tuple(...arr[0].concat(this));
150 }
151 return new _Tuple(...arr.concat(this));
152 }
153};
154function freezeDraftable(val) {
155 return isDraftable(val) ? produce(val, () => {
156 }) : val;
157}
158function getOrInsertComputed(map, key, compute) {
159 if (map.has(key)) return map.get(key);
160 return map.set(key, compute(key)).get(key);
161}
162
163// src/immutableStateInvariantMiddleware.ts
164function isImmutableDefault(value) {
165 return typeof value !== "object" || value == null || Object.isFrozen(value);
166}
167function trackForMutations(isImmutable, ignoredPaths, obj) {
168 const trackedProperties = trackProperties(isImmutable, ignoredPaths, obj);
169 return {
170 detectMutations() {
171 return detectMutations(isImmutable, ignoredPaths, trackedProperties, obj);
172 }
173 };
174}
175function trackProperties(isImmutable, ignoredPaths = [], obj, path = "", checkedObjects = /* @__PURE__ */ new Set()) {
176 const tracked = {
177 value: obj
178 };
179 if (!isImmutable(obj) && !checkedObjects.has(obj)) {
180 checkedObjects.add(obj);
181 tracked.children = {};
182 const hasIgnoredPaths = ignoredPaths.length > 0;
183 for (const key in obj) {
184 const nestedPath = path ? path + "." + key : key;
185 if (hasIgnoredPaths) {
186 const hasMatches = ignoredPaths.some((ignored) => {
187 if (ignored instanceof RegExp) {
188 return ignored.test(nestedPath);
189 }
190 return nestedPath === ignored;
191 });
192 if (hasMatches) {
193 continue;
194 }
195 }
196 tracked.children[key] = trackProperties(isImmutable, ignoredPaths, obj[key], nestedPath);
197 }
198 }
199 return tracked;
200}
201function detectMutations(isImmutable, ignoredPaths = [], trackedProperty, obj, sameParentRef = false, path = "") {
202 const prevObj = trackedProperty ? trackedProperty.value : void 0;
203 const sameRef = prevObj === obj;
204 if (sameParentRef && !sameRef && !Number.isNaN(obj)) {
205 return {
206 wasMutated: true,
207 path
208 };
209 }
210 if (isImmutable(prevObj) || isImmutable(obj)) {
211 return {
212 wasMutated: false
213 };
214 }
215 const keysToDetect = {};
216 for (let key in trackedProperty.children) {
217 keysToDetect[key] = true;
218 }
219 for (let key in obj) {
220 keysToDetect[key] = true;
221 }
222 const hasIgnoredPaths = ignoredPaths.length > 0;
223 for (let key in keysToDetect) {
224 const nestedPath = path ? path + "." + key : key;
225 if (hasIgnoredPaths) {
226 const hasMatches = ignoredPaths.some((ignored) => {
227 if (ignored instanceof RegExp) {
228 return ignored.test(nestedPath);
229 }
230 return nestedPath === ignored;
231 });
232 if (hasMatches) {
233 continue;
234 }
235 }
236 const result = detectMutations(isImmutable, ignoredPaths, trackedProperty.children[key], obj[key], sameRef, nestedPath);
237 if (result.wasMutated) {
238 return result;
239 }
240 }
241 return {
242 wasMutated: false
243 };
244}
245function createImmutableStateInvariantMiddleware(options = {}) {
246 if (process.env.NODE_ENV === "production") {
247 return () => (next) => (action) => next(action);
248 } else {
249 let stringify2 = function(obj, serializer, indent, decycler) {
250 return JSON.stringify(obj, getSerialize2(serializer, decycler), indent);
251 }, getSerialize2 = function(serializer, decycler) {
252 let stack = [], keys = [];
253 if (!decycler) decycler = function(_, value) {
254 if (stack[0] === value) return "[Circular ~]";
255 return "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]";
256 };
257 return function(key, value) {
258 if (stack.length > 0) {
259 var thisPos = stack.indexOf(this);
260 ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);
261 ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);
262 if (~stack.indexOf(value)) value = decycler.call(this, key, value);
263 } else stack.push(value);
264 return serializer == null ? value : serializer.call(this, key, value);
265 };
266 };
267 var stringify = stringify2, getSerialize = getSerialize2;
268 let {
269 isImmutable = isImmutableDefault,
270 ignoredPaths,
271 warnAfter = 32
272 } = options;
273 const track = trackForMutations.bind(null, isImmutable, ignoredPaths);
274 return ({
275 getState
276 }) => {
277 let state = getState();
278 let tracker = track(state);
279 let result;
280 return (next) => (action) => {
281 const measureUtils = getTimeMeasureUtils(warnAfter, "ImmutableStateInvariantMiddleware");
282 measureUtils.measureTime(() => {
283 state = getState();
284 result = tracker.detectMutations();
285 tracker = track(state);
286 if (result.wasMutated) {
287 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(19) : `A state mutation was detected between dispatches, in the path '${result.path || ""}'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`);
288 }
289 });
290 const dispatchedAction = next(action);
291 measureUtils.measureTime(() => {
292 state = getState();
293 result = tracker.detectMutations();
294 tracker = track(state);
295 if (result.wasMutated) {
296 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(20) : `A state mutation was detected inside a dispatch, in the path: ${result.path || ""}. Take a look at the reducer(s) handling the action ${stringify2(action)}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`);
297 }
298 });
299 measureUtils.warnIfExceeded();
300 return dispatchedAction;
301 };
302 };
303 }
304}
305
306// src/serializableStateInvariantMiddleware.ts
307function isPlain(val) {
308 const type = typeof val;
309 return val == null || type === "string" || type === "boolean" || type === "number" || Array.isArray(val) || isPlainObject(val);
310}
311function findNonSerializableValue(value, path = "", isSerializable = isPlain, getEntries, ignoredPaths = [], cache) {
312 let foundNestedSerializable;
313 if (!isSerializable(value)) {
314 return {
315 keyPath: path || "<root>",
316 value
317 };
318 }
319 if (typeof value !== "object" || value === null) {
320 return false;
321 }
322 if (cache?.has(value)) return false;
323 const entries = getEntries != null ? getEntries(value) : Object.entries(value);
324 const hasIgnoredPaths = ignoredPaths.length > 0;
325 for (const [key, nestedValue] of entries) {
326 const nestedPath = path ? path + "." + key : key;
327 if (hasIgnoredPaths) {
328 const hasMatches = ignoredPaths.some((ignored) => {
329 if (ignored instanceof RegExp) {
330 return ignored.test(nestedPath);
331 }
332 return nestedPath === ignored;
333 });
334 if (hasMatches) {
335 continue;
336 }
337 }
338 if (!isSerializable(nestedValue)) {
339 return {
340 keyPath: nestedPath,
341 value: nestedValue
342 };
343 }
344 if (typeof nestedValue === "object") {
345 foundNestedSerializable = findNonSerializableValue(nestedValue, nestedPath, isSerializable, getEntries, ignoredPaths, cache);
346 if (foundNestedSerializable) {
347 return foundNestedSerializable;
348 }
349 }
350 }
351 if (cache && isNestedFrozen(value)) cache.add(value);
352 return false;
353}
354function isNestedFrozen(value) {
355 if (!Object.isFrozen(value)) return false;
356 for (const nestedValue of Object.values(value)) {
357 if (typeof nestedValue !== "object" || nestedValue === null) continue;
358 if (!isNestedFrozen(nestedValue)) return false;
359 }
360 return true;
361}
362function createSerializableStateInvariantMiddleware(options = {}) {
363 if (process.env.NODE_ENV === "production") {
364 return () => (next) => (action) => next(action);
365 } else {
366 const {
367 isSerializable = isPlain,
368 getEntries,
369 ignoredActions = [],
370 ignoredActionPaths = ["meta.arg", "meta.baseQueryMeta"],
371 ignoredPaths = [],
372 warnAfter = 32,
373 ignoreState = false,
374 ignoreActions = false,
375 disableCache = false
376 } = options;
377 const cache = !disableCache && WeakSet ? /* @__PURE__ */ new WeakSet() : void 0;
378 return (storeAPI) => (next) => (action) => {
379 if (!isAction(action)) {
380 return next(action);
381 }
382 const result = next(action);
383 const measureUtils = getTimeMeasureUtils(warnAfter, "SerializableStateInvariantMiddleware");
384 if (!ignoreActions && !(ignoredActions.length && ignoredActions.indexOf(action.type) !== -1)) {
385 measureUtils.measureTime(() => {
386 const foundActionNonSerializableValue = findNonSerializableValue(action, "", isSerializable, getEntries, ignoredActionPaths, cache);
387 if (foundActionNonSerializableValue) {
388 const {
389 keyPath,
390 value
391 } = foundActionNonSerializableValue;
392 console.error(`A non-serializable value was detected in an action, in the path: \`${keyPath}\`. Value:`, value, "\nTake a look at the logic that dispatched this action: ", action, "\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants)", "\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)");
393 }
394 });
395 }
396 if (!ignoreState) {
397 measureUtils.measureTime(() => {
398 const state = storeAPI.getState();
399 const foundStateNonSerializableValue = findNonSerializableValue(state, "", isSerializable, getEntries, ignoredPaths, cache);
400 if (foundStateNonSerializableValue) {
401 const {
402 keyPath,
403 value
404 } = foundStateNonSerializableValue;
405 console.error(`A non-serializable value was detected in the state, in the path: \`${keyPath}\`. Value:`, value, `
406Take a look at the reducer(s) handling this action type: ${action.type}.
407(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)`);
408 }
409 });
410 measureUtils.warnIfExceeded();
411 }
412 return result;
413 };
414 }
415}
416
417// src/getDefaultMiddleware.ts
418function isBoolean(x) {
419 return typeof x === "boolean";
420}
421var buildGetDefaultMiddleware = () => function getDefaultMiddleware(options) {
422 const {
423 thunk = true,
424 immutableCheck = true,
425 serializableCheck = true,
426 actionCreatorCheck = true
427 } = options ?? {};
428 let middlewareArray = new Tuple();
429 if (thunk) {
430 if (isBoolean(thunk)) {
431 middlewareArray.push(thunkMiddleware);
432 } else {
433 middlewareArray.push(withExtraArgument(thunk.extraArgument));
434 }
435 }
436 if (process.env.NODE_ENV !== "production") {
437 if (immutableCheck) {
438 let immutableOptions = {};
439 if (!isBoolean(immutableCheck)) {
440 immutableOptions = immutableCheck;
441 }
442 middlewareArray.unshift(createImmutableStateInvariantMiddleware(immutableOptions));
443 }
444 if (serializableCheck) {
445 let serializableOptions = {};
446 if (!isBoolean(serializableCheck)) {
447 serializableOptions = serializableCheck;
448 }
449 middlewareArray.push(createSerializableStateInvariantMiddleware(serializableOptions));
450 }
451 if (actionCreatorCheck) {
452 let actionCreatorOptions = {};
453 if (!isBoolean(actionCreatorCheck)) {
454 actionCreatorOptions = actionCreatorCheck;
455 }
456 middlewareArray.unshift(createActionCreatorInvariantMiddleware(actionCreatorOptions));
457 }
458 }
459 return middlewareArray;
460};
461
462// src/autoBatchEnhancer.ts
463var SHOULD_AUTOBATCH = "RTK_autoBatch";
464var prepareAutoBatched = () => (payload) => ({
465 payload,
466 meta: {
467 [SHOULD_AUTOBATCH]: true
468 }
469});
470var createQueueWithTimer = (timeout) => {
471 return (notify) => {
472 setTimeout(notify, timeout);
473 };
474};
475var autoBatchEnhancer = (options = {
476 type: "raf"
477}) => (next) => (...args) => {
478 const store = next(...args);
479 let notifying = true;
480 let shouldNotifyAtEndOfTick = false;
481 let notificationQueued = false;
482 const listeners = /* @__PURE__ */ new Set();
483 const queueCallback = options.type === "tick" ? queueMicrotask : options.type === "raf" ? (
484 // requestAnimationFrame won't exist in SSR environments. Fall back to a vague approximation just to keep from erroring.
485 typeof window !== "undefined" && window.requestAnimationFrame ? window.requestAnimationFrame : createQueueWithTimer(10)
486 ) : options.type === "callback" ? options.queueNotification : createQueueWithTimer(options.timeout);
487 const notifyListeners = () => {
488 notificationQueued = false;
489 if (shouldNotifyAtEndOfTick) {
490 shouldNotifyAtEndOfTick = false;
491 listeners.forEach((l) => l());
492 }
493 };
494 return Object.assign({}, store, {
495 // Override the base `store.subscribe` method to keep original listeners
496 // from running if we're delaying notifications
497 subscribe(listener2) {
498 const wrappedListener = () => notifying && listener2();
499 const unsubscribe = store.subscribe(wrappedListener);
500 listeners.add(listener2);
501 return () => {
502 unsubscribe();
503 listeners.delete(listener2);
504 };
505 },
506 // Override the base `store.dispatch` method so that we can check actions
507 // for the `shouldAutoBatch` flag and determine if batching is active
508 dispatch(action) {
509 try {
510 notifying = !action?.meta?.[SHOULD_AUTOBATCH];
511 shouldNotifyAtEndOfTick = !notifying;
512 if (shouldNotifyAtEndOfTick) {
513 if (!notificationQueued) {
514 notificationQueued = true;
515 queueCallback(notifyListeners);
516 }
517 }
518 return store.dispatch(action);
519 } finally {
520 notifying = true;
521 }
522 }
523 });
524};
525
526// src/getDefaultEnhancers.ts
527var buildGetDefaultEnhancers = (middlewareEnhancer) => function getDefaultEnhancers(options) {
528 const {
529 autoBatch = true
530 } = options ?? {};
531 let enhancerArray = new Tuple(middlewareEnhancer);
532 if (autoBatch) {
533 enhancerArray.push(autoBatchEnhancer(typeof autoBatch === "object" ? autoBatch : void 0));
534 }
535 return enhancerArray;
536};
537
538// src/configureStore.ts
539function configureStore(options) {
540 const getDefaultMiddleware = buildGetDefaultMiddleware();
541 const {
542 reducer = void 0,
543 middleware,
544 devTools = true,
545 duplicateMiddlewareCheck = true,
546 preloadedState = void 0,
547 enhancers = void 0
548 } = options || {};
549 let rootReducer;
550 if (typeof reducer === "function") {
551 rootReducer = reducer;
552 } else if (isPlainObject(reducer)) {
553 rootReducer = combineReducers(reducer);
554 } else {
555 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(1) : "`reducer` is a required argument, and must be a function or an object of functions that can be passed to combineReducers");
556 }
557 if (process.env.NODE_ENV !== "production" && middleware && typeof middleware !== "function") {
558 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(2) : "`middleware` field must be a callback");
559 }
560 let finalMiddleware;
561 if (typeof middleware === "function") {
562 finalMiddleware = middleware(getDefaultMiddleware);
563 if (process.env.NODE_ENV !== "production" && !Array.isArray(finalMiddleware)) {
564 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(3) : "when using a middleware builder function, an array of middleware must be returned");
565 }
566 } else {
567 finalMiddleware = getDefaultMiddleware();
568 }
569 if (process.env.NODE_ENV !== "production" && finalMiddleware.some((item) => typeof item !== "function")) {
570 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(4) : "each middleware provided to configureStore must be a function");
571 }
572 if (process.env.NODE_ENV !== "production" && duplicateMiddlewareCheck) {
573 let middlewareReferences = /* @__PURE__ */ new Set();
574 finalMiddleware.forEach((middleware2) => {
575 if (middlewareReferences.has(middleware2)) {
576 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(42) : "Duplicate middleware references found when creating the store. Ensure that each middleware is only included once.");
577 }
578 middlewareReferences.add(middleware2);
579 });
580 }
581 let finalCompose = compose;
582 if (devTools) {
583 finalCompose = composeWithDevTools({
584 // Enable capture of stack traces for dispatched Redux actions
585 trace: process.env.NODE_ENV !== "production",
586 ...typeof devTools === "object" && devTools
587 });
588 }
589 const middlewareEnhancer = applyMiddleware(...finalMiddleware);
590 const getDefaultEnhancers = buildGetDefaultEnhancers(middlewareEnhancer);
591 if (process.env.NODE_ENV !== "production" && enhancers && typeof enhancers !== "function") {
592 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(5) : "`enhancers` field must be a callback");
593 }
594 let storeEnhancers = typeof enhancers === "function" ? enhancers(getDefaultEnhancers) : getDefaultEnhancers();
595 if (process.env.NODE_ENV !== "production" && !Array.isArray(storeEnhancers)) {
596 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(6) : "`enhancers` callback must return an array");
597 }
598 if (process.env.NODE_ENV !== "production" && storeEnhancers.some((item) => typeof item !== "function")) {
599 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(7) : "each enhancer provided to configureStore must be a function");
600 }
601 if (process.env.NODE_ENV !== "production" && finalMiddleware.length && !storeEnhancers.includes(middlewareEnhancer)) {
602 console.error("middlewares were provided, but middleware enhancer was not included in final enhancers - make sure to call `getDefaultEnhancers`");
603 }
604 const composedEnhancer = finalCompose(...storeEnhancers);
605 return createStore(rootReducer, preloadedState, composedEnhancer);
606}
607
608// src/mapBuilders.ts
609function executeReducerBuilderCallback(builderCallback) {
610 const actionsMap = {};
611 const actionMatchers = [];
612 let defaultCaseReducer;
613 const builder = {
614 addCase(typeOrActionCreator, reducer) {
615 if (process.env.NODE_ENV !== "production") {
616 if (actionMatchers.length > 0) {
617 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(26) : "`builder.addCase` should only be called before calling `builder.addMatcher`");
618 }
619 if (defaultCaseReducer) {
620 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(27) : "`builder.addCase` should only be called before calling `builder.addDefaultCase`");
621 }
622 }
623 const type = typeof typeOrActionCreator === "string" ? typeOrActionCreator : typeOrActionCreator.type;
624 if (!type) {
625 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(28) : "`builder.addCase` cannot be called with an empty action type");
626 }
627 if (type in actionsMap) {
628 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(29) : `\`builder.addCase\` cannot be called with two reducers for the same action type '${type}'`);
629 }
630 actionsMap[type] = reducer;
631 return builder;
632 },
633 addAsyncThunk(asyncThunk, reducers) {
634 if (process.env.NODE_ENV !== "production") {
635 if (defaultCaseReducer) {
636 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(43) : "`builder.addAsyncThunk` should only be called before calling `builder.addDefaultCase`");
637 }
638 }
639 if (reducers.pending) actionsMap[asyncThunk.pending.type] = reducers.pending;
640 if (reducers.rejected) actionsMap[asyncThunk.rejected.type] = reducers.rejected;
641 if (reducers.fulfilled) actionsMap[asyncThunk.fulfilled.type] = reducers.fulfilled;
642 if (reducers.settled) actionMatchers.push({
643 matcher: asyncThunk.settled,
644 reducer: reducers.settled
645 });
646 return builder;
647 },
648 addMatcher(matcher, reducer) {
649 if (process.env.NODE_ENV !== "production") {
650 if (defaultCaseReducer) {
651 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(30) : "`builder.addMatcher` should only be called before calling `builder.addDefaultCase`");
652 }
653 }
654 actionMatchers.push({
655 matcher,
656 reducer
657 });
658 return builder;
659 },
660 addDefaultCase(reducer) {
661 if (process.env.NODE_ENV !== "production") {
662 if (defaultCaseReducer) {
663 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(31) : "`builder.addDefaultCase` can only be called once");
664 }
665 }
666 defaultCaseReducer = reducer;
667 return builder;
668 }
669 };
670 builderCallback(builder);
671 return [actionsMap, actionMatchers, defaultCaseReducer];
672}
673
674// src/createReducer.ts
675function isStateFunction(x) {
676 return typeof x === "function";
677}
678function createReducer(initialState, mapOrBuilderCallback) {
679 if (process.env.NODE_ENV !== "production") {
680 if (typeof mapOrBuilderCallback === "object") {
681 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(8) : "The object notation for `createReducer` has been removed. Please use the 'builder callback' notation instead: https://redux-toolkit.js.org/api/createReducer");
682 }
683 }
684 let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] = executeReducerBuilderCallback(mapOrBuilderCallback);
685 let getInitialState;
686 if (isStateFunction(initialState)) {
687 getInitialState = () => freezeDraftable(initialState());
688 } else {
689 const frozenInitialState = freezeDraftable(initialState);
690 getInitialState = () => frozenInitialState;
691 }
692 function reducer(state = getInitialState(), action) {
693 let caseReducers = [actionsMap[action.type], ...finalActionMatchers.filter(({
694 matcher
695 }) => matcher(action)).map(({
696 reducer: reducer2
697 }) => reducer2)];
698 if (caseReducers.filter((cr) => !!cr).length === 0) {
699 caseReducers = [finalDefaultCaseReducer];
700 }
701 return caseReducers.reduce((previousState, caseReducer) => {
702 if (caseReducer) {
703 if (isDraft(previousState)) {
704 const draft = previousState;
705 const result = caseReducer(draft, action);
706 if (result === void 0) {
707 return previousState;
708 }
709 return result;
710 } else if (!isDraftable(previousState)) {
711 const result = caseReducer(previousState, action);
712 if (result === void 0) {
713 if (previousState === null) {
714 return previousState;
715 }
716 throw Error("A case reducer on a non-draftable value must not return undefined");
717 }
718 return result;
719 } else {
720 return produce(previousState, (draft) => {
721 return caseReducer(draft, action);
722 });
723 }
724 }
725 return previousState;
726 }, state);
727 }
728 reducer.getInitialState = getInitialState;
729 return reducer;
730}
731
732// src/matchers.ts
733var matches = (matcher, action) => {
734 if (hasMatchFunction(matcher)) {
735 return matcher.match(action);
736 } else {
737 return matcher(action);
738 }
739};
740function isAnyOf(...matchers) {
741 return (action) => {
742 return matchers.some((matcher) => matches(matcher, action));
743 };
744}
745function isAllOf(...matchers) {
746 return (action) => {
747 return matchers.every((matcher) => matches(matcher, action));
748 };
749}
750function hasExpectedRequestMetadata(action, validStatus) {
751 if (!action || !action.meta) return false;
752 const hasValidRequestId = typeof action.meta.requestId === "string";
753 const hasValidRequestStatus = validStatus.indexOf(action.meta.requestStatus) > -1;
754 return hasValidRequestId && hasValidRequestStatus;
755}
756function isAsyncThunkArray(a) {
757 return typeof a[0] === "function" && "pending" in a[0] && "fulfilled" in a[0] && "rejected" in a[0];
758}
759function isPending(...asyncThunks) {
760 if (asyncThunks.length === 0) {
761 return (action) => hasExpectedRequestMetadata(action, ["pending"]);
762 }
763 if (!isAsyncThunkArray(asyncThunks)) {
764 return isPending()(asyncThunks[0]);
765 }
766 return isAnyOf(...asyncThunks.map((asyncThunk) => asyncThunk.pending));
767}
768function isRejected(...asyncThunks) {
769 if (asyncThunks.length === 0) {
770 return (action) => hasExpectedRequestMetadata(action, ["rejected"]);
771 }
772 if (!isAsyncThunkArray(asyncThunks)) {
773 return isRejected()(asyncThunks[0]);
774 }
775 return isAnyOf(...asyncThunks.map((asyncThunk) => asyncThunk.rejected));
776}
777function isRejectedWithValue(...asyncThunks) {
778 const hasFlag = (action) => {
779 return action && action.meta && action.meta.rejectedWithValue;
780 };
781 if (asyncThunks.length === 0) {
782 return isAllOf(isRejected(...asyncThunks), hasFlag);
783 }
784 if (!isAsyncThunkArray(asyncThunks)) {
785 return isRejectedWithValue()(asyncThunks[0]);
786 }
787 return isAllOf(isRejected(...asyncThunks), hasFlag);
788}
789function isFulfilled(...asyncThunks) {
790 if (asyncThunks.length === 0) {
791 return (action) => hasExpectedRequestMetadata(action, ["fulfilled"]);
792 }
793 if (!isAsyncThunkArray(asyncThunks)) {
794 return isFulfilled()(asyncThunks[0]);
795 }
796 return isAnyOf(...asyncThunks.map((asyncThunk) => asyncThunk.fulfilled));
797}
798function isAsyncThunkAction(...asyncThunks) {
799 if (asyncThunks.length === 0) {
800 return (action) => hasExpectedRequestMetadata(action, ["pending", "fulfilled", "rejected"]);
801 }
802 if (!isAsyncThunkArray(asyncThunks)) {
803 return isAsyncThunkAction()(asyncThunks[0]);
804 }
805 return isAnyOf(...asyncThunks.flatMap((asyncThunk) => [asyncThunk.pending, asyncThunk.rejected, asyncThunk.fulfilled]));
806}
807
808// src/nanoid.ts
809var urlAlphabet = "ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW";
810var nanoid = (size = 21) => {
811 let id = "";
812 let i = size;
813 while (i--) {
814 id += urlAlphabet[Math.random() * 64 | 0];
815 }
816 return id;
817};
818
819// src/createAsyncThunk.ts
820var commonProperties = ["name", "message", "stack", "code"];
821var RejectWithValue = class {
822 constructor(payload, meta) {
823 this.payload = payload;
824 this.meta = meta;
825 }
826 /*
827 type-only property to distinguish between RejectWithValue and FulfillWithMeta
828 does not exist at runtime
829 */
830 _type;
831};
832var FulfillWithMeta = class {
833 constructor(payload, meta) {
834 this.payload = payload;
835 this.meta = meta;
836 }
837 /*
838 type-only property to distinguish between RejectWithValue and FulfillWithMeta
839 does not exist at runtime
840 */
841 _type;
842};
843var miniSerializeError = (value) => {
844 if (typeof value === "object" && value !== null) {
845 const simpleError = {};
846 for (const property of commonProperties) {
847 if (typeof value[property] === "string") {
848 simpleError[property] = value[property];
849 }
850 }
851 return simpleError;
852 }
853 return {
854 message: String(value)
855 };
856};
857var externalAbortMessage = "External signal was aborted";
858var createAsyncThunk = /* @__PURE__ */ (() => {
859 function createAsyncThunk2(typePrefix, payloadCreator, options) {
860 const fulfilled = createAction(typePrefix + "/fulfilled", (payload, requestId, arg, meta) => ({
861 payload,
862 meta: {
863 ...meta || {},
864 arg,
865 requestId,
866 requestStatus: "fulfilled"
867 }
868 }));
869 const pending = createAction(typePrefix + "/pending", (requestId, arg, meta) => ({
870 payload: void 0,
871 meta: {
872 ...meta || {},
873 arg,
874 requestId,
875 requestStatus: "pending"
876 }
877 }));
878 const rejected = createAction(typePrefix + "/rejected", (error, requestId, arg, payload, meta) => ({
879 payload,
880 error: (options && options.serializeError || miniSerializeError)(error || "Rejected"),
881 meta: {
882 ...meta || {},
883 arg,
884 requestId,
885 rejectedWithValue: !!payload,
886 requestStatus: "rejected",
887 aborted: error?.name === "AbortError",
888 condition: error?.name === "ConditionError"
889 }
890 }));
891 function actionCreator(arg, {
892 signal
893 } = {}) {
894 return (dispatch, getState, extra) => {
895 const requestId = options?.idGenerator ? options.idGenerator(arg) : nanoid();
896 const abortController = new AbortController();
897 let abortHandler;
898 let abortReason;
899 function abort(reason) {
900 abortReason = reason;
901 abortController.abort();
902 }
903 if (signal) {
904 if (signal.aborted) {
905 abort(externalAbortMessage);
906 } else {
907 signal.addEventListener("abort", () => abort(externalAbortMessage), {
908 once: true
909 });
910 }
911 }
912 const promise = async function() {
913 let finalAction;
914 try {
915 let conditionResult = options?.condition?.(arg, {
916 getState,
917 extra
918 });
919 if (isThenable(conditionResult)) {
920 conditionResult = await conditionResult;
921 }
922 if (conditionResult === false || abortController.signal.aborted) {
923 throw {
924 name: "ConditionError",
925 message: "Aborted due to condition callback returning false."
926 };
927 }
928 const abortedPromise = new Promise((_, reject) => {
929 abortHandler = () => {
930 reject({
931 name: "AbortError",
932 message: abortReason || "Aborted"
933 });
934 };
935 abortController.signal.addEventListener("abort", abortHandler, {
936 once: true
937 });
938 });
939 dispatch(pending(requestId, arg, options?.getPendingMeta?.({
940 requestId,
941 arg
942 }, {
943 getState,
944 extra
945 })));
946 finalAction = await Promise.race([abortedPromise, Promise.resolve(payloadCreator(arg, {
947 dispatch,
948 getState,
949 extra,
950 requestId,
951 signal: abortController.signal,
952 abort,
953 rejectWithValue: (value, meta) => {
954 return new RejectWithValue(value, meta);
955 },
956 fulfillWithValue: (value, meta) => {
957 return new FulfillWithMeta(value, meta);
958 }
959 })).then((result) => {
960 if (result instanceof RejectWithValue) {
961 throw result;
962 }
963 if (result instanceof FulfillWithMeta) {
964 return fulfilled(result.payload, requestId, arg, result.meta);
965 }
966 return fulfilled(result, requestId, arg);
967 })]);
968 } catch (err) {
969 finalAction = err instanceof RejectWithValue ? rejected(null, requestId, arg, err.payload, err.meta) : rejected(err, requestId, arg);
970 } finally {
971 if (abortHandler) {
972 abortController.signal.removeEventListener("abort", abortHandler);
973 }
974 }
975 const skipDispatch = options && !options.dispatchConditionRejection && rejected.match(finalAction) && finalAction.meta.condition;
976 if (!skipDispatch) {
977 dispatch(finalAction);
978 }
979 return finalAction;
980 }();
981 return Object.assign(promise, {
982 abort,
983 requestId,
984 arg,
985 unwrap() {
986 return promise.then(unwrapResult);
987 }
988 });
989 };
990 }
991 return Object.assign(actionCreator, {
992 pending,
993 rejected,
994 fulfilled,
995 settled: isAnyOf(rejected, fulfilled),
996 typePrefix
997 });
998 }
999 createAsyncThunk2.withTypes = () => createAsyncThunk2;
1000 return createAsyncThunk2;
1001})();
1002function unwrapResult(action) {
1003 if (action.meta && action.meta.rejectedWithValue) {
1004 throw action.payload;
1005 }
1006 if (action.error) {
1007 throw action.error;
1008 }
1009 return action.payload;
1010}
1011function isThenable(value) {
1012 return value !== null && typeof value === "object" && typeof value.then === "function";
1013}
1014
1015// src/createSlice.ts
1016var asyncThunkSymbol = /* @__PURE__ */ Symbol.for("rtk-slice-createasyncthunk");
1017var asyncThunkCreator = {
1018 [asyncThunkSymbol]: createAsyncThunk
1019};
1020var ReducerType = /* @__PURE__ */ ((ReducerType2) => {
1021 ReducerType2["reducer"] = "reducer";
1022 ReducerType2["reducerWithPrepare"] = "reducerWithPrepare";
1023 ReducerType2["asyncThunk"] = "asyncThunk";
1024 return ReducerType2;
1025})(ReducerType || {});
1026function getType(slice, actionKey) {
1027 return `${slice}/${actionKey}`;
1028}
1029function buildCreateSlice({
1030 creators
1031} = {}) {
1032 const cAT = creators?.asyncThunk?.[asyncThunkSymbol];
1033 return function createSlice2(options) {
1034 const {
1035 name,
1036 reducerPath = name
1037 } = options;
1038 if (!name) {
1039 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(11) : "`name` is a required option for createSlice");
1040 }
1041 if (typeof process !== "undefined" && process.env.NODE_ENV === "development") {
1042 if (options.initialState === void 0) {
1043 console.error("You must provide an `initialState` value that is not `undefined`. You may have misspelled `initialState`");
1044 }
1045 }
1046 const reducers = (typeof options.reducers === "function" ? options.reducers(buildReducerCreators()) : options.reducers) || {};
1047 const reducerNames = Object.keys(reducers);
1048 const context = {
1049 sliceCaseReducersByName: {},
1050 sliceCaseReducersByType: {},
1051 actionCreators: {},
1052 sliceMatchers: []
1053 };
1054 const contextMethods = {
1055 addCase(typeOrActionCreator, reducer2) {
1056 const type = typeof typeOrActionCreator === "string" ? typeOrActionCreator : typeOrActionCreator.type;
1057 if (!type) {
1058 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(12) : "`context.addCase` cannot be called with an empty action type");
1059 }
1060 if (type in context.sliceCaseReducersByType) {
1061 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(13) : "`context.addCase` cannot be called with two reducers for the same action type: " + type);
1062 }
1063 context.sliceCaseReducersByType[type] = reducer2;
1064 return contextMethods;
1065 },
1066 addMatcher(matcher, reducer2) {
1067 context.sliceMatchers.push({
1068 matcher,
1069 reducer: reducer2
1070 });
1071 return contextMethods;
1072 },
1073 exposeAction(name2, actionCreator) {
1074 context.actionCreators[name2] = actionCreator;
1075 return contextMethods;
1076 },
1077 exposeCaseReducer(name2, reducer2) {
1078 context.sliceCaseReducersByName[name2] = reducer2;
1079 return contextMethods;
1080 }
1081 };
1082 reducerNames.forEach((reducerName) => {
1083 const reducerDefinition = reducers[reducerName];
1084 const reducerDetails = {
1085 reducerName,
1086 type: getType(name, reducerName),
1087 createNotation: typeof options.reducers === "function"
1088 };
1089 if (isAsyncThunkSliceReducerDefinition(reducerDefinition)) {
1090 handleThunkCaseReducerDefinition(reducerDetails, reducerDefinition, contextMethods, cAT);
1091 } else {
1092 handleNormalReducerDefinition(reducerDetails, reducerDefinition, contextMethods);
1093 }
1094 });
1095 function buildReducer() {
1096 if (process.env.NODE_ENV !== "production") {
1097 if (typeof options.extraReducers === "object") {
1098 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(14) : "The object notation for `createSlice.extraReducers` has been removed. Please use the 'builder callback' notation instead: https://redux-toolkit.js.org/api/createSlice");
1099 }
1100 }
1101 const [extraReducers = {}, actionMatchers = [], defaultCaseReducer = void 0] = typeof options.extraReducers === "function" ? executeReducerBuilderCallback(options.extraReducers) : [options.extraReducers];
1102 const finalCaseReducers = {
1103 ...extraReducers,
1104 ...context.sliceCaseReducersByType
1105 };
1106 return createReducer(options.initialState, (builder) => {
1107 for (let key in finalCaseReducers) {
1108 builder.addCase(key, finalCaseReducers[key]);
1109 }
1110 for (let sM of context.sliceMatchers) {
1111 builder.addMatcher(sM.matcher, sM.reducer);
1112 }
1113 for (let m of actionMatchers) {
1114 builder.addMatcher(m.matcher, m.reducer);
1115 }
1116 if (defaultCaseReducer) {
1117 builder.addDefaultCase(defaultCaseReducer);
1118 }
1119 });
1120 }
1121 const selectSelf = (state) => state;
1122 const injectedSelectorCache = /* @__PURE__ */ new Map();
1123 const injectedStateCache = /* @__PURE__ */ new WeakMap();
1124 let _reducer;
1125 function reducer(state, action) {
1126 if (!_reducer) _reducer = buildReducer();
1127 return _reducer(state, action);
1128 }
1129 function getInitialState() {
1130 if (!_reducer) _reducer = buildReducer();
1131 return _reducer.getInitialState();
1132 }
1133 function makeSelectorProps(reducerPath2, injected = false) {
1134 function selectSlice(state) {
1135 let sliceState = state[reducerPath2];
1136 if (typeof sliceState === "undefined") {
1137 if (injected) {
1138 sliceState = getOrInsertComputed(injectedStateCache, selectSlice, getInitialState);
1139 } else if (process.env.NODE_ENV !== "production") {
1140 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(15) : "selectSlice returned undefined for an uninjected slice reducer");
1141 }
1142 }
1143 return sliceState;
1144 }
1145 function getSelectors(selectState = selectSelf) {
1146 const selectorCache = getOrInsertComputed(injectedSelectorCache, injected, () => /* @__PURE__ */ new WeakMap());
1147 return getOrInsertComputed(selectorCache, selectState, () => {
1148 const map = {};
1149 for (const [name2, selector] of Object.entries(options.selectors ?? {})) {
1150 map[name2] = wrapSelector(selector, selectState, () => getOrInsertComputed(injectedStateCache, selectState, getInitialState), injected);
1151 }
1152 return map;
1153 });
1154 }
1155 return {
1156 reducerPath: reducerPath2,
1157 getSelectors,
1158 get selectors() {
1159 return getSelectors(selectSlice);
1160 },
1161 selectSlice
1162 };
1163 }
1164 const slice = {
1165 name,
1166 reducer,
1167 actions: context.actionCreators,
1168 caseReducers: context.sliceCaseReducersByName,
1169 getInitialState,
1170 ...makeSelectorProps(reducerPath),
1171 injectInto(injectable, {
1172 reducerPath: pathOpt,
1173 ...config
1174 } = {}) {
1175 const newReducerPath = pathOpt ?? reducerPath;
1176 injectable.inject({
1177 reducerPath: newReducerPath,
1178 reducer
1179 }, config);
1180 return {
1181 ...slice,
1182 ...makeSelectorProps(newReducerPath, true)
1183 };
1184 }
1185 };
1186 return slice;
1187 };
1188}
1189function wrapSelector(selector, selectState, getInitialState, injected) {
1190 function wrapper(rootState, ...args) {
1191 let sliceState = selectState(rootState);
1192 if (typeof sliceState === "undefined") {
1193 if (injected) {
1194 sliceState = getInitialState();
1195 } else if (process.env.NODE_ENV !== "production") {
1196 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(16) : "selectState returned undefined for an uninjected slice reducer");
1197 }
1198 }
1199 return selector(sliceState, ...args);
1200 }
1201 wrapper.unwrapped = selector;
1202 return wrapper;
1203}
1204var createSlice = /* @__PURE__ */ buildCreateSlice();
1205function buildReducerCreators() {
1206 function asyncThunk(payloadCreator, config) {
1207 return {
1208 _reducerDefinitionType: "asyncThunk" /* asyncThunk */,
1209 payloadCreator,
1210 ...config
1211 };
1212 }
1213 asyncThunk.withTypes = () => asyncThunk;
1214 return {
1215 reducer(caseReducer) {
1216 return Object.assign({
1217 // hack so the wrapping function has the same name as the original
1218 // we need to create a wrapper so the `reducerDefinitionType` is not assigned to the original
1219 [caseReducer.name](...args) {
1220 return caseReducer(...args);
1221 }
1222 }[caseReducer.name], {
1223 _reducerDefinitionType: "reducer" /* reducer */
1224 });
1225 },
1226 preparedReducer(prepare, reducer) {
1227 return {
1228 _reducerDefinitionType: "reducerWithPrepare" /* reducerWithPrepare */,
1229 prepare,
1230 reducer
1231 };
1232 },
1233 asyncThunk
1234 };
1235}
1236function handleNormalReducerDefinition({
1237 type,
1238 reducerName,
1239 createNotation
1240}, maybeReducerWithPrepare, context) {
1241 let caseReducer;
1242 let prepareCallback;
1243 if ("reducer" in maybeReducerWithPrepare) {
1244 if (createNotation && !isCaseReducerWithPrepareDefinition(maybeReducerWithPrepare)) {
1245 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(17) : "Please use the `create.preparedReducer` notation for prepared action creators with the `create` notation.");
1246 }
1247 caseReducer = maybeReducerWithPrepare.reducer;
1248 prepareCallback = maybeReducerWithPrepare.prepare;
1249 } else {
1250 caseReducer = maybeReducerWithPrepare;
1251 }
1252 context.addCase(type, caseReducer).exposeCaseReducer(reducerName, caseReducer).exposeAction(reducerName, prepareCallback ? createAction(type, prepareCallback) : createAction(type));
1253}
1254function isAsyncThunkSliceReducerDefinition(reducerDefinition) {
1255 return reducerDefinition._reducerDefinitionType === "asyncThunk" /* asyncThunk */;
1256}
1257function isCaseReducerWithPrepareDefinition(reducerDefinition) {
1258 return reducerDefinition._reducerDefinitionType === "reducerWithPrepare" /* reducerWithPrepare */;
1259}
1260function handleThunkCaseReducerDefinition({
1261 type,
1262 reducerName
1263}, reducerDefinition, context, cAT) {
1264 if (!cAT) {
1265 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(18) : "Cannot use `create.asyncThunk` in the built-in `createSlice`. Use `buildCreateSlice({ creators: { asyncThunk: asyncThunkCreator } })` to create a customised version of `createSlice`.");
1266 }
1267 const {
1268 payloadCreator,
1269 fulfilled,
1270 pending,
1271 rejected,
1272 settled,
1273 options
1274 } = reducerDefinition;
1275 const thunk = cAT(type, payloadCreator, options);
1276 context.exposeAction(reducerName, thunk);
1277 if (fulfilled) {
1278 context.addCase(thunk.fulfilled, fulfilled);
1279 }
1280 if (pending) {
1281 context.addCase(thunk.pending, pending);
1282 }
1283 if (rejected) {
1284 context.addCase(thunk.rejected, rejected);
1285 }
1286 if (settled) {
1287 context.addMatcher(thunk.settled, settled);
1288 }
1289 context.exposeCaseReducer(reducerName, {
1290 fulfilled: fulfilled || noop,
1291 pending: pending || noop,
1292 rejected: rejected || noop,
1293 settled: settled || noop
1294 });
1295}
1296function noop() {
1297}
1298
1299// src/entities/entity_state.ts
1300function getInitialEntityState() {
1301 return {
1302 ids: [],
1303 entities: {}
1304 };
1305}
1306function createInitialStateFactory(stateAdapter) {
1307 function getInitialState(additionalState = {}, entities) {
1308 const state = Object.assign(getInitialEntityState(), additionalState);
1309 return entities ? stateAdapter.setAll(state, entities) : state;
1310 }
1311 return {
1312 getInitialState
1313 };
1314}
1315
1316// src/entities/state_selectors.ts
1317function createSelectorsFactory() {
1318 function getSelectors(selectState, options = {}) {
1319 const {
1320 createSelector: createSelector2 = createDraftSafeSelector
1321 } = options;
1322 const selectIds = (state) => state.ids;
1323 const selectEntities = (state) => state.entities;
1324 const selectAll = createSelector2(selectIds, selectEntities, (ids, entities) => ids.map((id) => entities[id]));
1325 const selectId = (_, id) => id;
1326 const selectById = (entities, id) => entities[id];
1327 const selectTotal = createSelector2(selectIds, (ids) => ids.length);
1328 if (!selectState) {
1329 return {
1330 selectIds,
1331 selectEntities,
1332 selectAll,
1333 selectTotal,
1334 selectById: createSelector2(selectEntities, selectId, selectById)
1335 };
1336 }
1337 const selectGlobalizedEntities = createSelector2(selectState, selectEntities);
1338 return {
1339 selectIds: createSelector2(selectState, selectIds),
1340 selectEntities: selectGlobalizedEntities,
1341 selectAll: createSelector2(selectState, selectAll),
1342 selectTotal: createSelector2(selectState, selectTotal),
1343 selectById: createSelector2(selectGlobalizedEntities, selectId, selectById)
1344 };
1345 }
1346 return {
1347 getSelectors
1348 };
1349}
1350
1351// src/entities/state_adapter.ts
1352var isDraftTyped = isDraft;
1353function createSingleArgumentStateOperator(mutator) {
1354 const operator = createStateOperator((_, state) => mutator(state));
1355 return function operation(state) {
1356 return operator(state, void 0);
1357 };
1358}
1359function createStateOperator(mutator) {
1360 return function operation(state, arg) {
1361 function isPayloadActionArgument(arg2) {
1362 return isFSA(arg2);
1363 }
1364 const runMutator = (draft) => {
1365 if (isPayloadActionArgument(arg)) {
1366 mutator(arg.payload, draft);
1367 } else {
1368 mutator(arg, draft);
1369 }
1370 };
1371 if (isDraftTyped(state)) {
1372 runMutator(state);
1373 return state;
1374 }
1375 return produce(state, runMutator);
1376 };
1377}
1378
1379// src/entities/utils.ts
1380function selectIdValue(entity, selectId) {
1381 const key = selectId(entity);
1382 if (process.env.NODE_ENV !== "production" && key === void 0) {
1383 console.warn("The entity passed to the `selectId` implementation returned undefined.", "You should probably provide your own `selectId` implementation.", "The entity that was passed:", entity, "The `selectId` implementation:", selectId.toString());
1384 }
1385 return key;
1386}
1387function ensureEntitiesArray(entities) {
1388 if (!Array.isArray(entities)) {
1389 entities = Object.values(entities);
1390 }
1391 return entities;
1392}
1393function getCurrent(value) {
1394 return isDraft(value) ? current(value) : value;
1395}
1396function splitAddedUpdatedEntities(newEntities, selectId, state) {
1397 newEntities = ensureEntitiesArray(newEntities);
1398 const existingIdsArray = getCurrent(state.ids);
1399 const existingIds = new Set(existingIdsArray);
1400 const added = [];
1401 const addedIds = /* @__PURE__ */ new Set([]);
1402 const updated = [];
1403 for (const entity of newEntities) {
1404 const id = selectIdValue(entity, selectId);
1405 if (existingIds.has(id) || addedIds.has(id)) {
1406 updated.push({
1407 id,
1408 changes: entity
1409 });
1410 } else {
1411 addedIds.add(id);
1412 added.push(entity);
1413 }
1414 }
1415 return [added, updated, existingIdsArray];
1416}
1417
1418// src/entities/unsorted_state_adapter.ts
1419function createUnsortedStateAdapter(selectId) {
1420 function addOneMutably(entity, state) {
1421 const key = selectIdValue(entity, selectId);
1422 if (key in state.entities) {
1423 return;
1424 }
1425 state.ids.push(key);
1426 state.entities[key] = entity;
1427 }
1428 function addManyMutably(newEntities, state) {
1429 newEntities = ensureEntitiesArray(newEntities);
1430 for (const entity of newEntities) {
1431 addOneMutably(entity, state);
1432 }
1433 }
1434 function setOneMutably(entity, state) {
1435 const key = selectIdValue(entity, selectId);
1436 if (!(key in state.entities)) {
1437 state.ids.push(key);
1438 }
1439 ;
1440 state.entities[key] = entity;
1441 }
1442 function setManyMutably(newEntities, state) {
1443 newEntities = ensureEntitiesArray(newEntities);
1444 for (const entity of newEntities) {
1445 setOneMutably(entity, state);
1446 }
1447 }
1448 function setAllMutably(newEntities, state) {
1449 newEntities = ensureEntitiesArray(newEntities);
1450 state.ids = [];
1451 state.entities = {};
1452 addManyMutably(newEntities, state);
1453 }
1454 function removeOneMutably(key, state) {
1455 return removeManyMutably([key], state);
1456 }
1457 function removeManyMutably(keys, state) {
1458 let didMutate = false;
1459 keys.forEach((key) => {
1460 if (key in state.entities) {
1461 delete state.entities[key];
1462 didMutate = true;
1463 }
1464 });
1465 if (didMutate) {
1466 state.ids = state.ids.filter((id) => id in state.entities);
1467 }
1468 }
1469 function removeAllMutably(state) {
1470 Object.assign(state, {
1471 ids: [],
1472 entities: {}
1473 });
1474 }
1475 function takeNewKey(keys, update, state) {
1476 const original3 = state.entities[update.id];
1477 if (original3 === void 0) {
1478 return false;
1479 }
1480 const updated = Object.assign({}, original3, update.changes);
1481 const newKey = selectIdValue(updated, selectId);
1482 const hasNewKey = newKey !== update.id;
1483 if (hasNewKey) {
1484 keys[update.id] = newKey;
1485 delete state.entities[update.id];
1486 }
1487 ;
1488 state.entities[newKey] = updated;
1489 return hasNewKey;
1490 }
1491 function updateOneMutably(update, state) {
1492 return updateManyMutably([update], state);
1493 }
1494 function updateManyMutably(updates, state) {
1495 const newKeys = {};
1496 const updatesPerEntity = {};
1497 updates.forEach((update) => {
1498 if (update.id in state.entities) {
1499 updatesPerEntity[update.id] = {
1500 id: update.id,
1501 // Spreads ignore falsy values, so this works even if there isn't
1502 // an existing update already at this key
1503 changes: {
1504 ...updatesPerEntity[update.id]?.changes,
1505 ...update.changes
1506 }
1507 };
1508 }
1509 });
1510 updates = Object.values(updatesPerEntity);
1511 const didMutateEntities = updates.length > 0;
1512 if (didMutateEntities) {
1513 const didMutateIds = updates.filter((update) => takeNewKey(newKeys, update, state)).length > 0;
1514 if (didMutateIds) {
1515 state.ids = Object.values(state.entities).map((e) => selectIdValue(e, selectId));
1516 }
1517 }
1518 }
1519 function upsertOneMutably(entity, state) {
1520 return upsertManyMutably([entity], state);
1521 }
1522 function upsertManyMutably(newEntities, state) {
1523 const [added, updated] = splitAddedUpdatedEntities(newEntities, selectId, state);
1524 addManyMutably(added, state);
1525 updateManyMutably(updated, state);
1526 }
1527 return {
1528 removeAll: createSingleArgumentStateOperator(removeAllMutably),
1529 addOne: createStateOperator(addOneMutably),
1530 addMany: createStateOperator(addManyMutably),
1531 setOne: createStateOperator(setOneMutably),
1532 setMany: createStateOperator(setManyMutably),
1533 setAll: createStateOperator(setAllMutably),
1534 updateOne: createStateOperator(updateOneMutably),
1535 updateMany: createStateOperator(updateManyMutably),
1536 upsertOne: createStateOperator(upsertOneMutably),
1537 upsertMany: createStateOperator(upsertManyMutably),
1538 removeOne: createStateOperator(removeOneMutably),
1539 removeMany: createStateOperator(removeManyMutably)
1540 };
1541}
1542
1543// src/entities/sorted_state_adapter.ts
1544function findInsertIndex(sortedItems, item, comparisonFunction) {
1545 let lowIndex = 0;
1546 let highIndex = sortedItems.length;
1547 while (lowIndex < highIndex) {
1548 let middleIndex = lowIndex + highIndex >>> 1;
1549 const currentItem = sortedItems[middleIndex];
1550 const res = comparisonFunction(item, currentItem);
1551 if (res >= 0) {
1552 lowIndex = middleIndex + 1;
1553 } else {
1554 highIndex = middleIndex;
1555 }
1556 }
1557 return lowIndex;
1558}
1559function insert(sortedItems, item, comparisonFunction) {
1560 const insertAtIndex = findInsertIndex(sortedItems, item, comparisonFunction);
1561 sortedItems.splice(insertAtIndex, 0, item);
1562 return sortedItems;
1563}
1564function createSortedStateAdapter(selectId, comparer) {
1565 const {
1566 removeOne,
1567 removeMany,
1568 removeAll
1569 } = createUnsortedStateAdapter(selectId);
1570 function addOneMutably(entity, state) {
1571 return addManyMutably([entity], state);
1572 }
1573 function addManyMutably(newEntities, state, existingIds) {
1574 newEntities = ensureEntitiesArray(newEntities);
1575 const existingKeys = new Set(existingIds ?? getCurrent(state.ids));
1576 const addedKeys = /* @__PURE__ */ new Set();
1577 const models = newEntities.filter((model) => {
1578 const modelId = selectIdValue(model, selectId);
1579 const notAdded = !addedKeys.has(modelId);
1580 if (notAdded) addedKeys.add(modelId);
1581 return !existingKeys.has(modelId) && notAdded;
1582 });
1583 if (models.length !== 0) {
1584 mergeFunction(state, models);
1585 }
1586 }
1587 function setOneMutably(entity, state) {
1588 return setManyMutably([entity], state);
1589 }
1590 function setManyMutably(newEntities, state) {
1591 let deduplicatedEntities = {};
1592 newEntities = ensureEntitiesArray(newEntities);
1593 if (newEntities.length !== 0) {
1594 for (const item of newEntities) {
1595 const entityId = selectId(item);
1596 deduplicatedEntities[entityId] = item;
1597 delete state.entities[entityId];
1598 }
1599 newEntities = ensureEntitiesArray(deduplicatedEntities);
1600 mergeFunction(state, newEntities);
1601 }
1602 }
1603 function setAllMutably(newEntities, state) {
1604 newEntities = ensureEntitiesArray(newEntities);
1605 state.entities = {};
1606 state.ids = [];
1607 addManyMutably(newEntities, state, []);
1608 }
1609 function updateOneMutably(update, state) {
1610 return updateManyMutably([update], state);
1611 }
1612 function updateManyMutably(updates, state) {
1613 let appliedUpdates = false;
1614 let replacedIds = false;
1615 for (let update of updates) {
1616 const entity = state.entities[update.id];
1617 if (!entity) {
1618 continue;
1619 }
1620 appliedUpdates = true;
1621 Object.assign(entity, update.changes);
1622 const newId = selectId(entity);
1623 if (update.id !== newId) {
1624 replacedIds = true;
1625 delete state.entities[update.id];
1626 const oldIndex = state.ids.indexOf(update.id);
1627 state.ids[oldIndex] = newId;
1628 state.entities[newId] = entity;
1629 }
1630 }
1631 if (appliedUpdates) {
1632 mergeFunction(state, [], appliedUpdates, replacedIds);
1633 }
1634 }
1635 function upsertOneMutably(entity, state) {
1636 return upsertManyMutably([entity], state);
1637 }
1638 function upsertManyMutably(newEntities, state) {
1639 const [added, updated, existingIdsArray] = splitAddedUpdatedEntities(newEntities, selectId, state);
1640 if (added.length) {
1641 addManyMutably(added, state, existingIdsArray);
1642 }
1643 if (updated.length) {
1644 updateManyMutably(updated, state);
1645 }
1646 }
1647 function areArraysEqual(a, b) {
1648 if (a.length !== b.length) {
1649 return false;
1650 }
1651 for (let i = 0; i < a.length; i++) {
1652 if (a[i] === b[i]) {
1653 continue;
1654 }
1655 return false;
1656 }
1657 return true;
1658 }
1659 const mergeFunction = (state, addedItems, appliedUpdates, replacedIds) => {
1660 const currentEntities = getCurrent(state.entities);
1661 const currentIds = getCurrent(state.ids);
1662 const stateEntities = state.entities;
1663 let ids = currentIds;
1664 if (replacedIds) {
1665 ids = new Set(currentIds);
1666 }
1667 let sortedEntities = [];
1668 for (const id of ids) {
1669 const entity = currentEntities[id];
1670 if (entity) {
1671 sortedEntities.push(entity);
1672 }
1673 }
1674 const wasPreviouslyEmpty = sortedEntities.length === 0;
1675 for (const item of addedItems) {
1676 stateEntities[selectId(item)] = item;
1677 if (!wasPreviouslyEmpty) {
1678 insert(sortedEntities, item, comparer);
1679 }
1680 }
1681 if (wasPreviouslyEmpty) {
1682 sortedEntities = addedItems.slice().sort(comparer);
1683 } else if (appliedUpdates) {
1684 sortedEntities.sort(comparer);
1685 }
1686 const newSortedIds = sortedEntities.map(selectId);
1687 if (!areArraysEqual(currentIds, newSortedIds)) {
1688 state.ids = newSortedIds;
1689 }
1690 };
1691 return {
1692 removeOne,
1693 removeMany,
1694 removeAll,
1695 addOne: createStateOperator(addOneMutably),
1696 updateOne: createStateOperator(updateOneMutably),
1697 upsertOne: createStateOperator(upsertOneMutably),
1698 setOne: createStateOperator(setOneMutably),
1699 setMany: createStateOperator(setManyMutably),
1700 setAll: createStateOperator(setAllMutably),
1701 addMany: createStateOperator(addManyMutably),
1702 updateMany: createStateOperator(updateManyMutably),
1703 upsertMany: createStateOperator(upsertManyMutably)
1704 };
1705}
1706
1707// src/entities/create_adapter.ts
1708function createEntityAdapter(options = {}) {
1709 const {
1710 selectId,
1711 sortComparer
1712 } = {
1713 sortComparer: false,
1714 selectId: (instance) => instance.id,
1715 ...options
1716 };
1717 const stateAdapter = sortComparer ? createSortedStateAdapter(selectId, sortComparer) : createUnsortedStateAdapter(selectId);
1718 const stateFactory = createInitialStateFactory(stateAdapter);
1719 const selectorsFactory = createSelectorsFactory();
1720 return {
1721 selectId,
1722 sortComparer,
1723 ...stateFactory,
1724 ...selectorsFactory,
1725 ...stateAdapter
1726 };
1727}
1728
1729// src/listenerMiddleware/exceptions.ts
1730var task = "task";
1731var listener = "listener";
1732var completed = "completed";
1733var cancelled = "cancelled";
1734var taskCancelled = `task-${cancelled}`;
1735var taskCompleted = `task-${completed}`;
1736var listenerCancelled = `${listener}-${cancelled}`;
1737var listenerCompleted = `${listener}-${completed}`;
1738var TaskAbortError = class {
1739 constructor(code) {
1740 this.code = code;
1741 this.message = `${task} ${cancelled} (reason: ${code})`;
1742 }
1743 name = "TaskAbortError";
1744 message;
1745};
1746
1747// src/listenerMiddleware/utils.ts
1748var assertFunction = (func, expected) => {
1749 if (typeof func !== "function") {
1750 throw new TypeError(process.env.NODE_ENV === "production" ? formatProdErrorMessage(32) : `${expected} is not a function`);
1751 }
1752};
1753var noop2 = () => {
1754};
1755var catchRejection = (promise, onError = noop2) => {
1756 promise.catch(onError);
1757 return promise;
1758};
1759var addAbortSignalListener = (abortSignal, callback) => {
1760 abortSignal.addEventListener("abort", callback, {
1761 once: true
1762 });
1763 return () => abortSignal.removeEventListener("abort", callback);
1764};
1765
1766// src/listenerMiddleware/task.ts
1767var validateActive = (signal) => {
1768 if (signal.aborted) {
1769 throw new TaskAbortError(signal.reason);
1770 }
1771};
1772function raceWithSignal(signal, promise) {
1773 let cleanup = noop2;
1774 return new Promise((resolve, reject) => {
1775 const notifyRejection = () => reject(new TaskAbortError(signal.reason));
1776 if (signal.aborted) {
1777 notifyRejection();
1778 return;
1779 }
1780 cleanup = addAbortSignalListener(signal, notifyRejection);
1781 promise.finally(() => cleanup()).then(resolve, reject);
1782 }).finally(() => {
1783 cleanup = noop2;
1784 });
1785}
1786var runTask = async (task2, cleanUp) => {
1787 try {
1788 await Promise.resolve();
1789 const value = await task2();
1790 return {
1791 status: "ok",
1792 value
1793 };
1794 } catch (error) {
1795 return {
1796 status: error instanceof TaskAbortError ? "cancelled" : "rejected",
1797 error
1798 };
1799 } finally {
1800 cleanUp?.();
1801 }
1802};
1803var createPause = (signal) => {
1804 return (promise) => {
1805 return catchRejection(raceWithSignal(signal, promise).then((output) => {
1806 validateActive(signal);
1807 return output;
1808 }));
1809 };
1810};
1811var createDelay = (signal) => {
1812 const pause = createPause(signal);
1813 return (timeoutMs) => {
1814 return pause(new Promise((resolve) => setTimeout(resolve, timeoutMs)));
1815 };
1816};
1817
1818// src/listenerMiddleware/index.ts
1819var {
1820 assign
1821} = Object;
1822var INTERNAL_NIL_TOKEN = {};
1823var alm = "listenerMiddleware";
1824var createFork = (parentAbortSignal, parentBlockingPromises) => {
1825 const linkControllers = (controller) => addAbortSignalListener(parentAbortSignal, () => controller.abort(parentAbortSignal.reason));
1826 return (taskExecutor, opts) => {
1827 assertFunction(taskExecutor, "taskExecutor");
1828 const childAbortController = new AbortController();
1829 linkControllers(childAbortController);
1830 const result = runTask(async () => {
1831 validateActive(parentAbortSignal);
1832 validateActive(childAbortController.signal);
1833 const result2 = await taskExecutor({
1834 pause: createPause(childAbortController.signal),
1835 delay: createDelay(childAbortController.signal),
1836 signal: childAbortController.signal
1837 });
1838 validateActive(childAbortController.signal);
1839 return result2;
1840 }, () => childAbortController.abort(taskCompleted));
1841 if (opts?.autoJoin) {
1842 parentBlockingPromises.push(result.catch(noop2));
1843 }
1844 return {
1845 result: createPause(parentAbortSignal)(result),
1846 cancel() {
1847 childAbortController.abort(taskCancelled);
1848 }
1849 };
1850 };
1851};
1852var createTakePattern = (startListening, signal) => {
1853 const take = async (predicate, timeout) => {
1854 validateActive(signal);
1855 let unsubscribe = () => {
1856 };
1857 const tuplePromise = new Promise((resolve, reject) => {
1858 let stopListening = startListening({
1859 predicate,
1860 effect: (action, listenerApi) => {
1861 listenerApi.unsubscribe();
1862 resolve([action, listenerApi.getState(), listenerApi.getOriginalState()]);
1863 }
1864 });
1865 unsubscribe = () => {
1866 stopListening();
1867 reject();
1868 };
1869 });
1870 const promises = [tuplePromise];
1871 if (timeout != null) {
1872 promises.push(new Promise((resolve) => setTimeout(resolve, timeout, null)));
1873 }
1874 try {
1875 const output = await raceWithSignal(signal, Promise.race(promises));
1876 validateActive(signal);
1877 return output;
1878 } finally {
1879 unsubscribe();
1880 }
1881 };
1882 return (predicate, timeout) => catchRejection(take(predicate, timeout));
1883};
1884var getListenerEntryPropsFrom = (options) => {
1885 let {
1886 type,
1887 actionCreator,
1888 matcher,
1889 predicate,
1890 effect
1891 } = options;
1892 if (type) {
1893 predicate = createAction(type).match;
1894 } else if (actionCreator) {
1895 type = actionCreator.type;
1896 predicate = actionCreator.match;
1897 } else if (matcher) {
1898 predicate = matcher;
1899 } else if (predicate) {
1900 } else {
1901 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(21) : "Creating or removing a listener requires one of the known fields for matching an action");
1902 }
1903 assertFunction(effect, "options.listener");
1904 return {
1905 predicate,
1906 type,
1907 effect
1908 };
1909};
1910var createListenerEntry = /* @__PURE__ */ assign((options) => {
1911 const {
1912 type,
1913 predicate,
1914 effect
1915 } = getListenerEntryPropsFrom(options);
1916 const entry = {
1917 id: nanoid(),
1918 effect,
1919 type,
1920 predicate,
1921 pending: /* @__PURE__ */ new Set(),
1922 unsubscribe: () => {
1923 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(22) : "Unsubscribe not initialized");
1924 }
1925 };
1926 return entry;
1927}, {
1928 withTypes: () => createListenerEntry
1929});
1930var findListenerEntry = (listenerMap, options) => {
1931 const {
1932 type,
1933 effect,
1934 predicate
1935 } = getListenerEntryPropsFrom(options);
1936 return Array.from(listenerMap.values()).find((entry) => {
1937 const matchPredicateOrType = typeof type === "string" ? entry.type === type : entry.predicate === predicate;
1938 return matchPredicateOrType && entry.effect === effect;
1939 });
1940};
1941var cancelActiveListeners = (entry) => {
1942 entry.pending.forEach((controller) => {
1943 controller.abort(listenerCancelled);
1944 });
1945};
1946var createClearListenerMiddleware = (listenerMap, executingListeners) => {
1947 return () => {
1948 for (const listener2 of executingListeners.keys()) {
1949 cancelActiveListeners(listener2);
1950 }
1951 listenerMap.clear();
1952 };
1953};
1954var safelyNotifyError = (errorHandler, errorToNotify, errorInfo) => {
1955 try {
1956 errorHandler(errorToNotify, errorInfo);
1957 } catch (errorHandlerError) {
1958 setTimeout(() => {
1959 throw errorHandlerError;
1960 }, 0);
1961 }
1962};
1963var addListener = /* @__PURE__ */ assign(/* @__PURE__ */ createAction(`${alm}/add`), {
1964 withTypes: () => addListener
1965});
1966var clearAllListeners = /* @__PURE__ */ createAction(`${alm}/removeAll`);
1967var removeListener = /* @__PURE__ */ assign(/* @__PURE__ */ createAction(`${alm}/remove`), {
1968 withTypes: () => removeListener
1969});
1970var defaultErrorHandler = (...args) => {
1971 console.error(`${alm}/error`, ...args);
1972};
1973var createListenerMiddleware = (middlewareOptions = {}) => {
1974 const listenerMap = /* @__PURE__ */ new Map();
1975 const executingListeners = /* @__PURE__ */ new Map();
1976 const trackExecutingListener = (entry) => {
1977 const count = executingListeners.get(entry) ?? 0;
1978 executingListeners.set(entry, count + 1);
1979 };
1980 const untrackExecutingListener = (entry) => {
1981 const count = executingListeners.get(entry) ?? 1;
1982 if (count === 1) {
1983 executingListeners.delete(entry);
1984 } else {
1985 executingListeners.set(entry, count - 1);
1986 }
1987 };
1988 const {
1989 extra,
1990 onError = defaultErrorHandler
1991 } = middlewareOptions;
1992 assertFunction(onError, "onError");
1993 const insertEntry = (entry) => {
1994 entry.unsubscribe = () => listenerMap.delete(entry.id);
1995 listenerMap.set(entry.id, entry);
1996 return (cancelOptions) => {
1997 entry.unsubscribe();
1998 if (cancelOptions?.cancelActive) {
1999 cancelActiveListeners(entry);
2000 }
2001 };
2002 };
2003 const startListening = (options) => {
2004 const entry = findListenerEntry(listenerMap, options) ?? createListenerEntry(options);
2005 return insertEntry(entry);
2006 };
2007 assign(startListening, {
2008 withTypes: () => startListening
2009 });
2010 const stopListening = (options) => {
2011 const entry = findListenerEntry(listenerMap, options);
2012 if (entry) {
2013 entry.unsubscribe();
2014 if (options.cancelActive) {
2015 cancelActiveListeners(entry);
2016 }
2017 }
2018 return !!entry;
2019 };
2020 assign(stopListening, {
2021 withTypes: () => stopListening
2022 });
2023 const notifyListener = async (entry, action, api, getOriginalState) => {
2024 const internalTaskController = new AbortController();
2025 const take = createTakePattern(startListening, internalTaskController.signal);
2026 const autoJoinPromises = [];
2027 try {
2028 entry.pending.add(internalTaskController);
2029 trackExecutingListener(entry);
2030 await Promise.resolve(entry.effect(
2031 action,
2032 // Use assign() rather than ... to avoid extra helper functions added to bundle
2033 assign({}, api, {
2034 getOriginalState,
2035 condition: (predicate, timeout) => take(predicate, timeout).then(Boolean),
2036 take,
2037 delay: createDelay(internalTaskController.signal),
2038 pause: createPause(internalTaskController.signal),
2039 extra,
2040 signal: internalTaskController.signal,
2041 fork: createFork(internalTaskController.signal, autoJoinPromises),
2042 unsubscribe: entry.unsubscribe,
2043 subscribe: () => {
2044 listenerMap.set(entry.id, entry);
2045 },
2046 cancelActiveListeners: () => {
2047 entry.pending.forEach((controller, _, set) => {
2048 if (controller !== internalTaskController) {
2049 controller.abort(listenerCancelled);
2050 set.delete(controller);
2051 }
2052 });
2053 },
2054 cancel: () => {
2055 internalTaskController.abort(listenerCancelled);
2056 entry.pending.delete(internalTaskController);
2057 },
2058 throwIfCancelled: () => {
2059 validateActive(internalTaskController.signal);
2060 }
2061 })
2062 ));
2063 } catch (listenerError) {
2064 if (!(listenerError instanceof TaskAbortError)) {
2065 safelyNotifyError(onError, listenerError, {
2066 raisedBy: "effect"
2067 });
2068 }
2069 } finally {
2070 await Promise.all(autoJoinPromises);
2071 internalTaskController.abort(listenerCompleted);
2072 untrackExecutingListener(entry);
2073 entry.pending.delete(internalTaskController);
2074 }
2075 };
2076 const clearListenerMiddleware = createClearListenerMiddleware(listenerMap, executingListeners);
2077 const middleware = (api) => (next) => (action) => {
2078 if (!isAction(action)) {
2079 return next(action);
2080 }
2081 if (addListener.match(action)) {
2082 return startListening(action.payload);
2083 }
2084 if (clearAllListeners.match(action)) {
2085 clearListenerMiddleware();
2086 return;
2087 }
2088 if (removeListener.match(action)) {
2089 return stopListening(action.payload);
2090 }
2091 let originalState = api.getState();
2092 const getOriginalState = () => {
2093 if (originalState === INTERNAL_NIL_TOKEN) {
2094 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(23) : `${alm}: getOriginalState can only be called synchronously`);
2095 }
2096 return originalState;
2097 };
2098 let result;
2099 try {
2100 result = next(action);
2101 if (listenerMap.size > 0) {
2102 const currentState = api.getState();
2103 const listenerEntries = Array.from(listenerMap.values());
2104 for (const entry of listenerEntries) {
2105 let runListener = false;
2106 try {
2107 runListener = entry.predicate(action, currentState, originalState);
2108 } catch (predicateError) {
2109 runListener = false;
2110 safelyNotifyError(onError, predicateError, {
2111 raisedBy: "predicate"
2112 });
2113 }
2114 if (!runListener) {
2115 continue;
2116 }
2117 notifyListener(entry, action, api, getOriginalState);
2118 }
2119 }
2120 } finally {
2121 originalState = INTERNAL_NIL_TOKEN;
2122 }
2123 return result;
2124 };
2125 return {
2126 middleware,
2127 startListening,
2128 stopListening,
2129 clearListeners: clearListenerMiddleware
2130 };
2131};
2132
2133// src/dynamicMiddleware/index.ts
2134var createMiddlewareEntry = (middleware) => ({
2135 middleware,
2136 applied: /* @__PURE__ */ new Map()
2137});
2138var matchInstance = (instanceId) => (action) => action?.meta?.instanceId === instanceId;
2139var createDynamicMiddleware = () => {
2140 const instanceId = nanoid();
2141 const middlewareMap = /* @__PURE__ */ new Map();
2142 const withMiddleware = Object.assign(createAction("dynamicMiddleware/add", (...middlewares) => ({
2143 payload: middlewares,
2144 meta: {
2145 instanceId
2146 }
2147 })), {
2148 withTypes: () => withMiddleware
2149 });
2150 const addMiddleware = Object.assign(function addMiddleware2(...middlewares) {
2151 middlewares.forEach((middleware2) => {
2152 getOrInsertComputed(middlewareMap, middleware2, createMiddlewareEntry);
2153 });
2154 }, {
2155 withTypes: () => addMiddleware
2156 });
2157 const getFinalMiddleware = (api) => {
2158 const appliedMiddleware = Array.from(middlewareMap.values()).map((entry) => getOrInsertComputed(entry.applied, api, entry.middleware));
2159 return compose(...appliedMiddleware);
2160 };
2161 const isWithMiddleware = isAllOf(withMiddleware, matchInstance(instanceId));
2162 const middleware = (api) => (next) => (action) => {
2163 if (isWithMiddleware(action)) {
2164 addMiddleware(...action.payload);
2165 return api.dispatch;
2166 }
2167 return getFinalMiddleware(api)(next)(action);
2168 };
2169 return {
2170 middleware,
2171 addMiddleware,
2172 withMiddleware,
2173 instanceId
2174 };
2175};
2176
2177// src/combineSlices.ts
2178import { combineReducers as combineReducers2 } from "redux";
2179var isSliceLike = (maybeSliceLike) => "reducerPath" in maybeSliceLike && typeof maybeSliceLike.reducerPath === "string";
2180var getReducers = (slices) => slices.flatMap((sliceOrMap) => isSliceLike(sliceOrMap) ? [[sliceOrMap.reducerPath, sliceOrMap.reducer]] : Object.entries(sliceOrMap));
2181var ORIGINAL_STATE = Symbol.for("rtk-state-proxy-original");
2182var isStateProxy = (value) => !!value && !!value[ORIGINAL_STATE];
2183var stateProxyMap = /* @__PURE__ */ new WeakMap();
2184var createStateProxy = (state, reducerMap, initialStateCache) => getOrInsertComputed(stateProxyMap, state, () => new Proxy(state, {
2185 get: (target, prop, receiver) => {
2186 if (prop === ORIGINAL_STATE) return target;
2187 const result = Reflect.get(target, prop, receiver);
2188 if (typeof result === "undefined") {
2189 const cached = initialStateCache[prop];
2190 if (typeof cached !== "undefined") return cached;
2191 const reducer = reducerMap[prop];
2192 if (reducer) {
2193 const reducerResult = reducer(void 0, {
2194 type: nanoid()
2195 });
2196 if (typeof reducerResult === "undefined") {
2197 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(24) : `The slice reducer for key "${prop.toString()}" returned undefined when called for selector(). If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.`);
2198 }
2199 initialStateCache[prop] = reducerResult;
2200 return reducerResult;
2201 }
2202 }
2203 return result;
2204 }
2205}));
2206var original = (state) => {
2207 if (!isStateProxy(state)) {
2208 throw new Error(process.env.NODE_ENV === "production" ? formatProdErrorMessage(25) : "original must be used on state Proxy");
2209 }
2210 return state[ORIGINAL_STATE];
2211};
2212var emptyObject = {};
2213var noopReducer = (state = emptyObject) => state;
2214function combineSlices(...slices) {
2215 const reducerMap = Object.fromEntries(getReducers(slices));
2216 const getReducer = () => Object.keys(reducerMap).length ? combineReducers2(reducerMap) : noopReducer;
2217 let reducer = getReducer();
2218 function combinedReducer(state, action) {
2219 return reducer(state, action);
2220 }
2221 combinedReducer.withLazyLoadedSlices = () => combinedReducer;
2222 const initialStateCache = {};
2223 const inject = (slice, config = {}) => {
2224 const {
2225 reducerPath,
2226 reducer: reducerToInject
2227 } = slice;
2228 const currentReducer = reducerMap[reducerPath];
2229 if (!config.overrideExisting && currentReducer && currentReducer !== reducerToInject) {
2230 if (typeof process !== "undefined" && process.env.NODE_ENV === "development") {
2231 console.error(`called \`inject\` to override already-existing reducer ${reducerPath} without specifying \`overrideExisting: true\``);
2232 }
2233 return combinedReducer;
2234 }
2235 if (config.overrideExisting && currentReducer !== reducerToInject) {
2236 delete initialStateCache[reducerPath];
2237 }
2238 reducerMap[reducerPath] = reducerToInject;
2239 reducer = getReducer();
2240 return combinedReducer;
2241 };
2242 const selector = Object.assign(function makeSelector(selectorFn, selectState) {
2243 return function selector2(state, ...args) {
2244 return selectorFn(createStateProxy(selectState ? selectState(state, ...args) : state, reducerMap, initialStateCache), ...args);
2245 };
2246 }, {
2247 original
2248 });
2249 return Object.assign(combinedReducer, {
2250 inject,
2251 selector
2252 });
2253}
2254
2255// src/formatProdErrorMessage.ts
2256function formatProdErrorMessage(code) {
2257 return `Minified Redux Toolkit error #${code}; visit https://redux-toolkit.js.org/Errors?code=${code} for the full message or use the non-minified dev environment for full errors. `;
2258}
2259export {
2260 ReducerType,
2261 SHOULD_AUTOBATCH,
2262 TaskAbortError,
2263 Tuple,
2264 addListener,
2265 asyncThunkCreator,
2266 autoBatchEnhancer,
2267 buildCreateSlice,
2268 clearAllListeners,
2269 combineSlices,
2270 configureStore,
2271 createAction,
2272 createActionCreatorInvariantMiddleware,
2273 createAsyncThunk,
2274 createDraftSafeSelector,
2275 createDraftSafeSelectorCreator,
2276 createDynamicMiddleware,
2277 createEntityAdapter,
2278 createImmutableStateInvariantMiddleware,
2279 createListenerMiddleware,
2280 produce as createNextState,
2281 createReducer,
2282 createSelector,
2283 createSelectorCreator,
2284 createSerializableStateInvariantMiddleware,
2285 createSlice,
2286 current,
2287 findNonSerializableValue,
2288 formatProdErrorMessage,
2289 freeze,
2290 isActionCreator,
2291 isAllOf,
2292 isAnyOf,
2293 isAsyncThunkAction,
2294 isDraft,
2295 isFSA as isFluxStandardAction,
2296 isFulfilled,
2297 isImmutableDefault,
2298 isPending,
2299 isPlain,
2300 isRejected,
2301 isRejectedWithValue,
2302 lruMemoize,
2303 miniSerializeError,
2304 nanoid,
2305 original2 as original,
2306 prepareAutoBatched,
2307 removeListener,
2308 unwrapResult,
2309 weakMapMemoize
2310};
2311//# sourceMappingURL=redux-toolkit.modern.mjs.map
Note: See TracBrowser for help on using the repository browser.