saga-toolkit 2.2.1 → 2.2.3

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.
Files changed (50) hide show
  1. package/README.md +21 -0
  2. package/dist/index.d.mts +28 -0
  3. package/dist/index.d.ts +28 -0
  4. package/dist/index.js +214 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.mjs +185 -0
  7. package/dist/index.mjs.map +1 -0
  8. package/package.json +7 -2
  9. package/coverage/base.css +0 -224
  10. package/coverage/block-navigation.js +0 -87
  11. package/coverage/clover.xml +0 -255
  12. package/coverage/coverage-final.json +0 -5
  13. package/coverage/effects.ts.html +0 -406
  14. package/coverage/favicon.png +0 -0
  15. package/coverage/index.html +0 -161
  16. package/coverage/index.ts.html +0 -190
  17. package/coverage/prettify.css +0 -1
  18. package/coverage/prettify.js +0 -2
  19. package/coverage/sort-arrow-sprite.png +0 -0
  20. package/coverage/sorter.js +0 -210
  21. package/coverage/types.ts.html +0 -139
  22. package/coverage/utils.ts.html +0 -316
  23. package/eslint.config.mjs +0 -20
  24. package/example/.env +0 -1
  25. package/example/README.md +0 -70
  26. package/example/package-lock.json +0 -33787
  27. package/example/package.json +0 -43
  28. package/example/public/favicon.ico +0 -0
  29. package/example/public/index.html +0 -43
  30. package/example/public/logo192.png +0 -0
  31. package/example/public/logo512.png +0 -0
  32. package/example/public/manifest.json +0 -25
  33. package/example/public/robots.txt +0 -3
  34. package/example/src/App.css +0 -38
  35. package/example/src/App.js +0 -61
  36. package/example/src/hooks.js +0 -19
  37. package/example/src/index.css +0 -13
  38. package/example/src/index.js +0 -28
  39. package/example/src/logo.svg +0 -1
  40. package/example/src/reportWebVitals.js +0 -13
  41. package/example/src/sagas.js +0 -91
  42. package/example/src/setupTests.js +0 -5
  43. package/example/src/slice.js +0 -32
  44. package/example/src/store/createStore.js +0 -34
  45. package/example/src/store/index.js +0 -1
  46. package/example/src/store/reducers.js +0 -11
  47. package/test/sagaToolkit.test.ts +0 -126
  48. package/tsconfig.json +0 -32
  49. package/tsup.config.ts +0 -11
  50. package/vitest.config.ts +0 -8
package/README.md CHANGED
@@ -13,6 +13,27 @@ If you love the "fire-and-forget" nature of Sagas for complex flows but miss the
13
13
  - ⚡ **Reduce Boilerplate**: Easily handle loading/success/error states in slices using standard RTK patterns.
14
14
  - 🛑 **Cancellation**: Propagates cancellation from the promise to the Saga.
15
15
 
16
+ ## 🎮 Try the Example App
17
+
18
+ This project includes a fully functional **Todo App** built with **Vite**, **React 18**, and **TypeScript** to demonstrate:
19
+ * `createSagaAction` (AsyncThunk bridge)
20
+ * `takeEveryAsync` (Awaitable actions)
21
+ * `takeLatestAsync` (Cancellable search)
22
+ * `putAsync` (Saga composition)
23
+
24
+ ### Run Locally
25
+
26
+ ```bash
27
+ cd example
28
+ npm install
29
+ npm run dev
30
+ ```
31
+
32
+ ### Try Online (StackBlitz)
33
+ > Note: Requires the package to be published to npm.
34
+
35
+ [![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/janoist1/saga-toolkit/tree/master/example)
36
+
16
37
  ## Installation
17
38
 
18
39
  ```bash
@@ -0,0 +1,28 @@
1
+ import { AsyncThunk, AsyncThunkAction } from '@reduxjs/toolkit';
2
+ import * as redux_saga_effects from 'redux-saga/effects';
3
+ import { ActionPattern, PutEffect } from 'redux-saga/effects';
4
+ import { Channel } from 'redux-saga';
5
+ import { Action } from 'redux';
6
+
7
+ type SagaWorker = (...args: unknown[]) => unknown;
8
+ interface Deferred<T = unknown> {
9
+ resolve: (value: T) => void;
10
+ reject: (error: unknown) => void;
11
+ promise: Promise<T>;
12
+ }
13
+ interface Request {
14
+ requestId?: string;
15
+ deferred?: Deferred;
16
+ onAdd?: (request: Request) => void;
17
+ abort?: () => void;
18
+ }
19
+ type SagaAction<Returned, ThunkArg = void> = AsyncThunk<Returned, ThunkArg, object>;
20
+
21
+ declare function takeEveryAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]): redux_saga_effects.ForkEffect<never>;
22
+ declare function takeLatestAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]): redux_saga_effects.ForkEffect<Generator<unknown, void, unknown>>;
23
+ declare function takeAggregateAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]): redux_saga_effects.ForkEffect<never>;
24
+ declare function putAsync(action: Action | PutEffect | AsyncThunkAction<unknown, unknown, object>): Generator<PutEffect | Promise<unknown>, unknown, unknown>;
25
+
26
+ declare const createSagaAction: <Returned, ThunkArg = void>(type: string) => SagaAction<Returned, ThunkArg>;
27
+
28
+ export { type Deferred, type Request, type SagaAction, type SagaWorker, createSagaAction, putAsync, takeAggregateAsync, takeEveryAsync, takeLatestAsync };
@@ -0,0 +1,28 @@
1
+ import { AsyncThunk, AsyncThunkAction } from '@reduxjs/toolkit';
2
+ import * as redux_saga_effects from 'redux-saga/effects';
3
+ import { ActionPattern, PutEffect } from 'redux-saga/effects';
4
+ import { Channel } from 'redux-saga';
5
+ import { Action } from 'redux';
6
+
7
+ type SagaWorker = (...args: unknown[]) => unknown;
8
+ interface Deferred<T = unknown> {
9
+ resolve: (value: T) => void;
10
+ reject: (error: unknown) => void;
11
+ promise: Promise<T>;
12
+ }
13
+ interface Request {
14
+ requestId?: string;
15
+ deferred?: Deferred;
16
+ onAdd?: (request: Request) => void;
17
+ abort?: () => void;
18
+ }
19
+ type SagaAction<Returned, ThunkArg = void> = AsyncThunk<Returned, ThunkArg, object>;
20
+
21
+ declare function takeEveryAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]): redux_saga_effects.ForkEffect<never>;
22
+ declare function takeLatestAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]): redux_saga_effects.ForkEffect<Generator<unknown, void, unknown>>;
23
+ declare function takeAggregateAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]): redux_saga_effects.ForkEffect<never>;
24
+ declare function putAsync(action: Action | PutEffect | AsyncThunkAction<unknown, unknown, object>): Generator<PutEffect | Promise<unknown>, unknown, unknown>;
25
+
26
+ declare const createSagaAction: <Returned, ThunkArg = void>(type: string) => SagaAction<Returned, ThunkArg>;
27
+
28
+ export { type Deferred, type Request, type SagaAction, type SagaWorker, createSagaAction, putAsync, takeAggregateAsync, takeEveryAsync, takeLatestAsync };
package/dist/index.js ADDED
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ createSagaAction: () => createSagaAction,
24
+ putAsync: () => putAsync,
25
+ takeAggregateAsync: () => takeAggregateAsync,
26
+ takeEveryAsync: () => takeEveryAsync,
27
+ takeLatestAsync: () => takeLatestAsync
28
+ });
29
+ module.exports = __toCommonJS(index_exports);
30
+ var import_toolkit2 = require("@reduxjs/toolkit");
31
+
32
+ // node_modules/@redux-saga/deferred/dist/redux-saga-deferred.esm.js
33
+ function deferred() {
34
+ var def = {};
35
+ def.promise = new Promise(function(resolve, reject) {
36
+ def.resolve = resolve;
37
+ def.reject = reject;
38
+ });
39
+ return def;
40
+ }
41
+
42
+ // src/utils.ts
43
+ var requests = {};
44
+ var addRequest = (requestId) => {
45
+ const deferred2 = deferred();
46
+ const request = {
47
+ ...requests[requestId],
48
+ requestId,
49
+ deferred: deferred2
50
+ };
51
+ if (requests[requestId]) {
52
+ requests[requestId].deferred = deferred2;
53
+ if (requests[requestId].onAdd) {
54
+ requests[requestId].onAdd(request);
55
+ }
56
+ } else {
57
+ requests[requestId] = request;
58
+ }
59
+ return deferred2.promise;
60
+ };
61
+ var cleanup = (requestId) => {
62
+ delete requests[requestId];
63
+ };
64
+ var setRequestAbort = (requestId, abort) => {
65
+ if (requests[requestId]) {
66
+ requests[requestId].abort = abort;
67
+ }
68
+ };
69
+ function* getRequest(requestId) {
70
+ const request = requests[requestId];
71
+ if (!request) {
72
+ const result = yield new Promise((onAdd) => {
73
+ requests[requestId] = {
74
+ onAdd: (req) => onAdd(req)
75
+ };
76
+ });
77
+ return result;
78
+ }
79
+ return request;
80
+ }
81
+ var wrap = (saga) => function* (action, ...rest) {
82
+ const { requestId } = action.meta;
83
+ const request = yield getRequest(requestId);
84
+ if (!request.deferred) return;
85
+ const deferred2 = request.deferred;
86
+ let isFinished = false;
87
+ try {
88
+ const result = yield saga(action, ...rest);
89
+ deferred2.resolve(result);
90
+ isFinished = true;
91
+ } catch (error) {
92
+ deferred2.reject(error);
93
+ isFinished = true;
94
+ } finally {
95
+ if (!isFinished) {
96
+ deferred2.reject(new Error("Aborted"));
97
+ const currentRequest = requests[requestId];
98
+ if (currentRequest && currentRequest.abort) {
99
+ currentRequest.abort();
100
+ }
101
+ }
102
+ cleanup(requestId);
103
+ }
104
+ };
105
+
106
+ // src/effects.ts
107
+ var import_effects = require("redux-saga/effects");
108
+ var import_toolkit = require("@reduxjs/toolkit");
109
+ var takeEveryHelper = (patternOrChannel, worker, ...args) => (0, import_effects.fork)(function* () {
110
+ while (true) {
111
+ const action = yield (0, import_effects.take)(patternOrChannel);
112
+ yield (0, import_effects.fork)(worker, ...args.concat(action));
113
+ }
114
+ });
115
+ function takeEveryAsync(pattern, saga, ...args) {
116
+ return takeEveryHelper(pattern, wrap(saga), ...args);
117
+ }
118
+ function takeLatestAsync(pattern, saga, ...args) {
119
+ const tasks = {};
120
+ let deferred2;
121
+ function* wrapper(action, ...rest) {
122
+ if (deferred2) {
123
+ const lastRequestId = yield deferred2.promise;
124
+ const request = yield getRequest(lastRequestId);
125
+ if (request.abort) {
126
+ request.abort();
127
+ }
128
+ const task = yield tasks[lastRequestId].promise;
129
+ yield (0, import_effects.cancel)(task);
130
+ }
131
+ deferred2 = deferred();
132
+ const { requestId } = action.meta;
133
+ yield getRequest(requestId);
134
+ if (deferred2) {
135
+ deferred2.resolve(requestId);
136
+ }
137
+ yield wrap(saga)(action, ...rest);
138
+ deferred2 = null;
139
+ }
140
+ const customTakeEvery = (patternOrChannel, saga2, ...args2) => (0, import_effects.fork)(function* () {
141
+ while (true) {
142
+ const action = yield (0, import_effects.take)(patternOrChannel);
143
+ const { requestId } = action.meta;
144
+ tasks[requestId] = deferred();
145
+ const task = yield (0, import_effects.fork)(saga2, ...args2.concat(action));
146
+ tasks[requestId].resolve(task);
147
+ }
148
+ });
149
+ return customTakeEvery(pattern, wrapper, ...args);
150
+ }
151
+ function takeAggregateAsync(pattern, saga, ...args) {
152
+ let deferred2;
153
+ function* wrapper(action, ...rest) {
154
+ const { requestId } = action.meta;
155
+ if (deferred2) {
156
+ const request = yield getRequest(requestId);
157
+ if (request.deferred) {
158
+ const { resolve, reject } = request.deferred;
159
+ const { promise } = yield deferred2.promise;
160
+ promise.then(resolve, reject).finally(() => cleanup(requestId)).catch(() => {
161
+ });
162
+ }
163
+ } else {
164
+ deferred2 = deferred();
165
+ const request = yield getRequest(requestId);
166
+ if (request.deferred) {
167
+ const { promise } = request.deferred;
168
+ yield wrap(saga)(action, ...rest);
169
+ if (deferred2) {
170
+ deferred2.resolve({ promise });
171
+ }
172
+ deferred2 = null;
173
+ }
174
+ }
175
+ }
176
+ return takeEveryHelper(pattern, wrapper, ...args);
177
+ }
178
+ function* putAsync(action) {
179
+ const promise = yield (0, import_effects.put)(action);
180
+ const result = yield promise;
181
+ return (0, import_toolkit.unwrapResult)(result);
182
+ }
183
+
184
+ // src/index.ts
185
+ var createSagaAction = (type) => {
186
+ const thunk = (0, import_toolkit2.createAsyncThunk)(type, (_, { requestId }) => addRequest(requestId));
187
+ function actionCreator(arg) {
188
+ const originalActionCreator = thunk(arg);
189
+ return (dispatch, getState, extra) => {
190
+ const promise = originalActionCreator(dispatch, getState, extra);
191
+ if (promise.requestId) {
192
+ setRequestAbort(promise.requestId, promise.abort);
193
+ }
194
+ return promise;
195
+ };
196
+ }
197
+ Object.assign(actionCreator, {
198
+ pending: thunk.pending,
199
+ rejected: thunk.rejected,
200
+ fulfilled: thunk.fulfilled,
201
+ typePrefix: thunk.typePrefix,
202
+ type: thunk.pending.type
203
+ });
204
+ return actionCreator;
205
+ };
206
+ // Annotate the CommonJS export names for ESM import in node:
207
+ 0 && (module.exports = {
208
+ createSagaAction,
209
+ putAsync,
210
+ takeAggregateAsync,
211
+ takeEveryAsync,
212
+ takeLatestAsync
213
+ });
214
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../node_modules/@redux-saga/deferred/dist/redux-saga-deferred.esm.js","../src/utils.ts","../src/effects.ts"],"sourcesContent":["import { createAsyncThunk } from '@reduxjs/toolkit'\nimport type { ThunkDispatch } from '@reduxjs/toolkit'\nimport type { Action } from 'redux'\nimport { addRequest, setRequestAbort } from './utils'\nimport { SagaAction } from './types'\n\nexport * from './types'\nexport * from './effects'\n\nexport const createSagaAction = <Returned, ThunkArg = void>(type: string): SagaAction<Returned, ThunkArg> => {\n const thunk = createAsyncThunk<Returned, ThunkArg>(type, (_, { requestId }) => addRequest(requestId) as Promise<Returned>)\n\n function actionCreator(arg: ThunkArg) {\n const originalActionCreator = thunk(arg)\n\n return (dispatch: ThunkDispatch<unknown, unknown, Action>, getState: () => unknown, extra: unknown) => {\n const promise = originalActionCreator(dispatch, getState, extra)\n if (promise.requestId) {\n setRequestAbort(promise.requestId, promise.abort)\n }\n\n return promise\n }\n }\n\n Object.assign(actionCreator, {\n pending: thunk.pending,\n rejected: thunk.rejected,\n fulfilled: thunk.fulfilled,\n typePrefix: thunk.typePrefix,\n type: (thunk.pending as unknown as { type: string }).type,\n })\n\n return actionCreator as unknown as SagaAction<Returned, ThunkArg>\n}\n","function deferred() {\n var def = {};\n def.promise = new Promise(function (resolve, reject) {\n def.resolve = resolve;\n def.reject = reject;\n });\n return def;\n}\nfunction arrayOfDeferred(length) {\n var arr = [];\n for (var i = 0; i < length; i++) {\n arr.push(deferred());\n }\n return arr;\n}\n\nexport { arrayOfDeferred, deferred as default };\n","import createDeferred from '@redux-saga/deferred'\nimport { Request, SagaWorker } from './types'\n\nconst requests: Record<string, Request> = {}\n\nexport const addRequest = (requestId: string) => {\n const deferred = createDeferred()\n const request: Request = {\n ...requests[requestId],\n requestId,\n deferred,\n }\n\n if (requests[requestId]) {\n requests[requestId].deferred = deferred\n if (requests[requestId].onAdd) {\n requests[requestId].onAdd(request)\n }\n } else {\n requests[requestId] = request\n }\n\n return deferred.promise\n}\n\nexport const cleanup = (requestId: string) => {\n delete requests[requestId]\n}\n\nexport const setRequestAbort = (requestId: string, abort: () => void) => {\n if (requests[requestId]) {\n requests[requestId].abort = abort\n }\n}\n\nexport function* getRequest(requestId: string): Generator<unknown, Request, unknown> {\n const request = requests[requestId]\n\n if (!request) {\n const result = yield (new Promise(onAdd => {\n requests[requestId] = {\n onAdd: (req: Request) => onAdd(req)\n }\n }))\n return result as Request\n }\n\n return request\n}\n\nexport const wrap = (saga: SagaWorker) => function* (action: unknown, ...rest: unknown[]): Generator<unknown, void, unknown> {\n const { requestId } = (action as { meta: { requestId: string } }).meta\n const request = (yield getRequest(requestId)) as Request\n\n if (!request.deferred) return\n\n const deferred = request.deferred\n let isFinished = false\n\n try {\n const result = yield saga(action, ...rest)\n deferred.resolve(result)\n isFinished = true\n } catch (error) {\n deferred.reject(error)\n isFinished = true\n } finally {\n if (!isFinished) {\n deferred.reject(new Error('Aborted'))\n const currentRequest = requests[requestId]\n if (currentRequest && currentRequest.abort) {\n currentRequest.abort()\n }\n }\n cleanup(requestId)\n }\n}\n","import { put, take, fork, cancel } from 'redux-saga/effects'\nimport type { PutEffect, ActionPattern } from 'redux-saga/effects'\nimport type { Task, Channel } from 'redux-saga'\nimport type { Action } from 'redux'\nimport createDeferred from '@redux-saga/deferred'\nimport { AsyncThunkAction, unwrapResult } from '@reduxjs/toolkit'\nimport { SagaWorker, Deferred, Request } from './types'\nimport { wrap, getRequest, cleanup } from './utils'\n\n// Helper to avoid 'takeEvery' overload issues with spread arguments\nconst takeEveryHelper = (patternOrChannel: ActionPattern | Channel<Action>, worker: SagaWorker, ...args: unknown[]) => fork(function* () {\n while (true) {\n const action = (yield take(patternOrChannel as unknown as ActionPattern)) as Action\n yield fork(worker, ...args.concat(action))\n }\n})\n\nexport function takeEveryAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]) {\n return takeEveryHelper(pattern as ActionPattern | Channel<Action>, wrap(saga as unknown as SagaWorker), ...args)\n}\n\nexport function takeLatestAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]) {\n const tasks: Record<string, Deferred> = {}\n let deferred: Deferred | null\n\n function* wrapper(action: unknown, ...rest: unknown[]): Generator<unknown, void, unknown> {\n if (deferred) {\n const lastRequestId = (yield deferred.promise) as string\n const request = (yield getRequest(lastRequestId)) as Request\n\n if (request.abort) {\n request.abort()\n }\n\n const task = (yield tasks[lastRequestId].promise) as Task\n\n yield cancel(task)\n }\n\n deferred = createDeferred()\n const { requestId } = (action as { meta: { requestId: string } }).meta\n\n yield getRequest(requestId) // Ensure request is registered/ready if needed\n\n if (deferred) {\n deferred.resolve(requestId)\n }\n\n yield wrap(saga as unknown as SagaWorker)(action, ...rest)\n\n deferred = null\n }\n\n const customTakeEvery = (patternOrChannel: ActionPattern | Channel<Action>, saga: SagaWorker, ...args: unknown[]) => fork(function* (): Generator<unknown, void, unknown> {\n while (true) {\n const action = (yield take(patternOrChannel as unknown as ActionPattern)) as { meta: { requestId: string } }\n const { requestId } = action.meta\n tasks[requestId] = createDeferred()\n const task = (yield fork(saga, ...args.concat(action))) as Task\n tasks[requestId].resolve(task)\n }\n })\n\n return customTakeEvery(pattern as ActionPattern | Channel<Action>, wrapper, ...args)\n}\n\nexport function takeAggregateAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]) {\n let deferred: Deferred | null\n\n function* wrapper(action: unknown, ...rest: unknown[]): Generator<unknown, void, unknown> {\n const { requestId } = (action as { meta: { requestId: string } }).meta\n\n if (deferred) {\n const request = (yield getRequest(requestId)) as Request\n if (request.deferred) {\n const { resolve, reject } = request.deferred\n const { promise } = (yield deferred.promise) as { promise: Promise<unknown> }\n\n promise\n .then(resolve, reject)\n .finally(() => cleanup(requestId))\n .catch(() => { })\n }\n } else {\n deferred = createDeferred()\n const request = (yield getRequest(requestId)) as Request\n if (request.deferred) {\n const { promise } = request.deferred\n\n yield wrap(saga as unknown as SagaWorker)(action, ...rest)\n\n if (deferred) {\n deferred.resolve({ promise })\n }\n deferred = null\n }\n }\n }\n\n return takeEveryHelper(pattern as ActionPattern | Channel<Action>, wrapper, ...args)\n}\n\nexport function* putAsync(action: Action | PutEffect | AsyncThunkAction<unknown, unknown, object>): Generator<PutEffect | Promise<unknown>, unknown, unknown> {\n const promise = yield put(action as Action)\n const result = yield (promise as Promise<unknown>)\n return unwrapResult(result as { payload: unknown, error?: unknown, meta?: unknown })\n}\n"],"mappings":"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","names":["import_toolkit","deferred","deferred","saga","args"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,185 @@
1
+ // src/index.ts
2
+ import { createAsyncThunk } from "@reduxjs/toolkit";
3
+
4
+ // node_modules/@redux-saga/deferred/dist/redux-saga-deferred.esm.js
5
+ function deferred() {
6
+ var def = {};
7
+ def.promise = new Promise(function(resolve, reject) {
8
+ def.resolve = resolve;
9
+ def.reject = reject;
10
+ });
11
+ return def;
12
+ }
13
+
14
+ // src/utils.ts
15
+ var requests = {};
16
+ var addRequest = (requestId) => {
17
+ const deferred2 = deferred();
18
+ const request = {
19
+ ...requests[requestId],
20
+ requestId,
21
+ deferred: deferred2
22
+ };
23
+ if (requests[requestId]) {
24
+ requests[requestId].deferred = deferred2;
25
+ if (requests[requestId].onAdd) {
26
+ requests[requestId].onAdd(request);
27
+ }
28
+ } else {
29
+ requests[requestId] = request;
30
+ }
31
+ return deferred2.promise;
32
+ };
33
+ var cleanup = (requestId) => {
34
+ delete requests[requestId];
35
+ };
36
+ var setRequestAbort = (requestId, abort) => {
37
+ if (requests[requestId]) {
38
+ requests[requestId].abort = abort;
39
+ }
40
+ };
41
+ function* getRequest(requestId) {
42
+ const request = requests[requestId];
43
+ if (!request) {
44
+ const result = yield new Promise((onAdd) => {
45
+ requests[requestId] = {
46
+ onAdd: (req) => onAdd(req)
47
+ };
48
+ });
49
+ return result;
50
+ }
51
+ return request;
52
+ }
53
+ var wrap = (saga) => function* (action, ...rest) {
54
+ const { requestId } = action.meta;
55
+ const request = yield getRequest(requestId);
56
+ if (!request.deferred) return;
57
+ const deferred2 = request.deferred;
58
+ let isFinished = false;
59
+ try {
60
+ const result = yield saga(action, ...rest);
61
+ deferred2.resolve(result);
62
+ isFinished = true;
63
+ } catch (error) {
64
+ deferred2.reject(error);
65
+ isFinished = true;
66
+ } finally {
67
+ if (!isFinished) {
68
+ deferred2.reject(new Error("Aborted"));
69
+ const currentRequest = requests[requestId];
70
+ if (currentRequest && currentRequest.abort) {
71
+ currentRequest.abort();
72
+ }
73
+ }
74
+ cleanup(requestId);
75
+ }
76
+ };
77
+
78
+ // src/effects.ts
79
+ import { put, take, fork, cancel } from "redux-saga/effects";
80
+ import { unwrapResult } from "@reduxjs/toolkit";
81
+ var takeEveryHelper = (patternOrChannel, worker, ...args) => fork(function* () {
82
+ while (true) {
83
+ const action = yield take(patternOrChannel);
84
+ yield fork(worker, ...args.concat(action));
85
+ }
86
+ });
87
+ function takeEveryAsync(pattern, saga, ...args) {
88
+ return takeEveryHelper(pattern, wrap(saga), ...args);
89
+ }
90
+ function takeLatestAsync(pattern, saga, ...args) {
91
+ const tasks = {};
92
+ let deferred2;
93
+ function* wrapper(action, ...rest) {
94
+ if (deferred2) {
95
+ const lastRequestId = yield deferred2.promise;
96
+ const request = yield getRequest(lastRequestId);
97
+ if (request.abort) {
98
+ request.abort();
99
+ }
100
+ const task = yield tasks[lastRequestId].promise;
101
+ yield cancel(task);
102
+ }
103
+ deferred2 = deferred();
104
+ const { requestId } = action.meta;
105
+ yield getRequest(requestId);
106
+ if (deferred2) {
107
+ deferred2.resolve(requestId);
108
+ }
109
+ yield wrap(saga)(action, ...rest);
110
+ deferred2 = null;
111
+ }
112
+ const customTakeEvery = (patternOrChannel, saga2, ...args2) => fork(function* () {
113
+ while (true) {
114
+ const action = yield take(patternOrChannel);
115
+ const { requestId } = action.meta;
116
+ tasks[requestId] = deferred();
117
+ const task = yield fork(saga2, ...args2.concat(action));
118
+ tasks[requestId].resolve(task);
119
+ }
120
+ });
121
+ return customTakeEvery(pattern, wrapper, ...args);
122
+ }
123
+ function takeAggregateAsync(pattern, saga, ...args) {
124
+ let deferred2;
125
+ function* wrapper(action, ...rest) {
126
+ const { requestId } = action.meta;
127
+ if (deferred2) {
128
+ const request = yield getRequest(requestId);
129
+ if (request.deferred) {
130
+ const { resolve, reject } = request.deferred;
131
+ const { promise } = yield deferred2.promise;
132
+ promise.then(resolve, reject).finally(() => cleanup(requestId)).catch(() => {
133
+ });
134
+ }
135
+ } else {
136
+ deferred2 = deferred();
137
+ const request = yield getRequest(requestId);
138
+ if (request.deferred) {
139
+ const { promise } = request.deferred;
140
+ yield wrap(saga)(action, ...rest);
141
+ if (deferred2) {
142
+ deferred2.resolve({ promise });
143
+ }
144
+ deferred2 = null;
145
+ }
146
+ }
147
+ }
148
+ return takeEveryHelper(pattern, wrapper, ...args);
149
+ }
150
+ function* putAsync(action) {
151
+ const promise = yield put(action);
152
+ const result = yield promise;
153
+ return unwrapResult(result);
154
+ }
155
+
156
+ // src/index.ts
157
+ var createSagaAction = (type) => {
158
+ const thunk = createAsyncThunk(type, (_, { requestId }) => addRequest(requestId));
159
+ function actionCreator(arg) {
160
+ const originalActionCreator = thunk(arg);
161
+ return (dispatch, getState, extra) => {
162
+ const promise = originalActionCreator(dispatch, getState, extra);
163
+ if (promise.requestId) {
164
+ setRequestAbort(promise.requestId, promise.abort);
165
+ }
166
+ return promise;
167
+ };
168
+ }
169
+ Object.assign(actionCreator, {
170
+ pending: thunk.pending,
171
+ rejected: thunk.rejected,
172
+ fulfilled: thunk.fulfilled,
173
+ typePrefix: thunk.typePrefix,
174
+ type: thunk.pending.type
175
+ });
176
+ return actionCreator;
177
+ };
178
+ export {
179
+ createSagaAction,
180
+ putAsync,
181
+ takeAggregateAsync,
182
+ takeEveryAsync,
183
+ takeLatestAsync
184
+ };
185
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../node_modules/@redux-saga/deferred/dist/redux-saga-deferred.esm.js","../src/utils.ts","../src/effects.ts"],"sourcesContent":["import { createAsyncThunk } from '@reduxjs/toolkit'\nimport type { ThunkDispatch } from '@reduxjs/toolkit'\nimport type { Action } from 'redux'\nimport { addRequest, setRequestAbort } from './utils'\nimport { SagaAction } from './types'\n\nexport * from './types'\nexport * from './effects'\n\nexport const createSagaAction = <Returned, ThunkArg = void>(type: string): SagaAction<Returned, ThunkArg> => {\n const thunk = createAsyncThunk<Returned, ThunkArg>(type, (_, { requestId }) => addRequest(requestId) as Promise<Returned>)\n\n function actionCreator(arg: ThunkArg) {\n const originalActionCreator = thunk(arg)\n\n return (dispatch: ThunkDispatch<unknown, unknown, Action>, getState: () => unknown, extra: unknown) => {\n const promise = originalActionCreator(dispatch, getState, extra)\n if (promise.requestId) {\n setRequestAbort(promise.requestId, promise.abort)\n }\n\n return promise\n }\n }\n\n Object.assign(actionCreator, {\n pending: thunk.pending,\n rejected: thunk.rejected,\n fulfilled: thunk.fulfilled,\n typePrefix: thunk.typePrefix,\n type: (thunk.pending as unknown as { type: string }).type,\n })\n\n return actionCreator as unknown as SagaAction<Returned, ThunkArg>\n}\n","function deferred() {\n var def = {};\n def.promise = new Promise(function (resolve, reject) {\n def.resolve = resolve;\n def.reject = reject;\n });\n return def;\n}\nfunction arrayOfDeferred(length) {\n var arr = [];\n for (var i = 0; i < length; i++) {\n arr.push(deferred());\n }\n return arr;\n}\n\nexport { arrayOfDeferred, deferred as default };\n","import createDeferred from '@redux-saga/deferred'\nimport { Request, SagaWorker } from './types'\n\nconst requests: Record<string, Request> = {}\n\nexport const addRequest = (requestId: string) => {\n const deferred = createDeferred()\n const request: Request = {\n ...requests[requestId],\n requestId,\n deferred,\n }\n\n if (requests[requestId]) {\n requests[requestId].deferred = deferred\n if (requests[requestId].onAdd) {\n requests[requestId].onAdd(request)\n }\n } else {\n requests[requestId] = request\n }\n\n return deferred.promise\n}\n\nexport const cleanup = (requestId: string) => {\n delete requests[requestId]\n}\n\nexport const setRequestAbort = (requestId: string, abort: () => void) => {\n if (requests[requestId]) {\n requests[requestId].abort = abort\n }\n}\n\nexport function* getRequest(requestId: string): Generator<unknown, Request, unknown> {\n const request = requests[requestId]\n\n if (!request) {\n const result = yield (new Promise(onAdd => {\n requests[requestId] = {\n onAdd: (req: Request) => onAdd(req)\n }\n }))\n return result as Request\n }\n\n return request\n}\n\nexport const wrap = (saga: SagaWorker) => function* (action: unknown, ...rest: unknown[]): Generator<unknown, void, unknown> {\n const { requestId } = (action as { meta: { requestId: string } }).meta\n const request = (yield getRequest(requestId)) as Request\n\n if (!request.deferred) return\n\n const deferred = request.deferred\n let isFinished = false\n\n try {\n const result = yield saga(action, ...rest)\n deferred.resolve(result)\n isFinished = true\n } catch (error) {\n deferred.reject(error)\n isFinished = true\n } finally {\n if (!isFinished) {\n deferred.reject(new Error('Aborted'))\n const currentRequest = requests[requestId]\n if (currentRequest && currentRequest.abort) {\n currentRequest.abort()\n }\n }\n cleanup(requestId)\n }\n}\n","import { put, take, fork, cancel } from 'redux-saga/effects'\nimport type { PutEffect, ActionPattern } from 'redux-saga/effects'\nimport type { Task, Channel } from 'redux-saga'\nimport type { Action } from 'redux'\nimport createDeferred from '@redux-saga/deferred'\nimport { AsyncThunkAction, unwrapResult } from '@reduxjs/toolkit'\nimport { SagaWorker, Deferred, Request } from './types'\nimport { wrap, getRequest, cleanup } from './utils'\n\n// Helper to avoid 'takeEvery' overload issues with spread arguments\nconst takeEveryHelper = (patternOrChannel: ActionPattern | Channel<Action>, worker: SagaWorker, ...args: unknown[]) => fork(function* () {\n while (true) {\n const action = (yield take(patternOrChannel as unknown as ActionPattern)) as Action\n yield fork(worker, ...args.concat(action))\n }\n})\n\nexport function takeEveryAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]) {\n return takeEveryHelper(pattern as ActionPattern | Channel<Action>, wrap(saga as unknown as SagaWorker), ...args)\n}\n\nexport function takeLatestAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]) {\n const tasks: Record<string, Deferred> = {}\n let deferred: Deferred | null\n\n function* wrapper(action: unknown, ...rest: unknown[]): Generator<unknown, void, unknown> {\n if (deferred) {\n const lastRequestId = (yield deferred.promise) as string\n const request = (yield getRequest(lastRequestId)) as Request\n\n if (request.abort) {\n request.abort()\n }\n\n const task = (yield tasks[lastRequestId].promise) as Task\n\n yield cancel(task)\n }\n\n deferred = createDeferred()\n const { requestId } = (action as { meta: { requestId: string } }).meta\n\n yield getRequest(requestId) // Ensure request is registered/ready if needed\n\n if (deferred) {\n deferred.resolve(requestId)\n }\n\n yield wrap(saga as unknown as SagaWorker)(action, ...rest)\n\n deferred = null\n }\n\n const customTakeEvery = (patternOrChannel: ActionPattern | Channel<Action>, saga: SagaWorker, ...args: unknown[]) => fork(function* (): Generator<unknown, void, unknown> {\n while (true) {\n const action = (yield take(patternOrChannel as unknown as ActionPattern)) as { meta: { requestId: string } }\n const { requestId } = action.meta\n tasks[requestId] = createDeferred()\n const task = (yield fork(saga, ...args.concat(action))) as Task\n tasks[requestId].resolve(task)\n }\n })\n\n return customTakeEvery(pattern as ActionPattern | Channel<Action>, wrapper, ...args)\n}\n\nexport function takeAggregateAsync<A extends Action = Action>(pattern: ActionPattern<A> | Channel<A>, saga: (action: A, ...args: unknown[]) => unknown, ...args: unknown[]) {\n let deferred: Deferred | null\n\n function* wrapper(action: unknown, ...rest: unknown[]): Generator<unknown, void, unknown> {\n const { requestId } = (action as { meta: { requestId: string } }).meta\n\n if (deferred) {\n const request = (yield getRequest(requestId)) as Request\n if (request.deferred) {\n const { resolve, reject } = request.deferred\n const { promise } = (yield deferred.promise) as { promise: Promise<unknown> }\n\n promise\n .then(resolve, reject)\n .finally(() => cleanup(requestId))\n .catch(() => { })\n }\n } else {\n deferred = createDeferred()\n const request = (yield getRequest(requestId)) as Request\n if (request.deferred) {\n const { promise } = request.deferred\n\n yield wrap(saga as unknown as SagaWorker)(action, ...rest)\n\n if (deferred) {\n deferred.resolve({ promise })\n }\n deferred = null\n }\n }\n }\n\n return takeEveryHelper(pattern as ActionPattern | Channel<Action>, wrapper, ...args)\n}\n\nexport function* putAsync(action: Action | PutEffect | AsyncThunkAction<unknown, unknown, object>): Generator<PutEffect | Promise<unknown>, unknown, unknown> {\n const promise = yield put(action as Action)\n const result = yield (promise as Promise<unknown>)\n return unwrapResult(result as { payload: unknown, error?: unknown, meta?: unknown })\n}\n"],"mappings":"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","names":["deferred","deferred","saga","args"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "saga-toolkit",
3
- "version": "2.2.1",
3
+ "version": "2.2.3",
4
4
  "description": "An extension for redux-toolkit that allows sagas to resolve async thunk actions.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -12,6 +12,11 @@
12
12
  "require": "./dist/index.js"
13
13
  }
14
14
  },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "src"
19
+ ],
15
20
  "scripts": {
16
21
  "build": "tsup",
17
22
  "dev": "tsup --watch",
@@ -56,4 +61,4 @@
56
61
  "@reduxjs/toolkit": "^1.9.5",
57
62
  "redux-saga": "^1.0.0"
58
63
  }
59
- }
64
+ }