ez-saga 18.0.7 → 18.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,24 @@
1
- The dy-saga project is a project that imitates dva-js
1
+ The ez-saga project is a project that imitates dva-js
2
+
3
+ # Why ez-saga?
4
+
5
+ `ez-saga` is designed to simplify Redux + Saga development, offering a modern, developer-friendly experience similar to `dva` but with significant improvements:
6
+
7
+ | Feature | ez-saga | dva | Raw Redux-Saga |
8
+ | :--- | :--- | :--- | :--- |
9
+ | **Model Architecture** | Centralized (State + Reducers + Effects) | Centralized | Scattered (Actions, Switch, Watchers separated) |
10
+ | **TypeScript Support** | **First-class**, with automatic type inference helper | Poor / Manual | Good but verbose |
11
+ | **Hot Module Replacement** | **Zero-config** (Vite & Webpack 5), supports hot-swapping reducers & effects | Broken / Unmaintained | Manual / Complex setup |
12
+ | **API Simplicity** | **High** (`createApp`, `regist`) | High | Low (High boilerplate) |
13
+ | **Build Tooling** | **Vite & Webpack 5** Support | Webpack 3/4 (Roadhog/Umi dependency) | Agnostic |
14
+ | **Maintenance** | Active | Inactive / Legacy | Active |
15
+
16
+ **Key Advantages:**
17
+ - **Zero Boilerplate**: No more action types, switch statements, or `yield take` watchers. Just write functions.
18
+ - **Modern HMR**: Built-in plugins for Vite and Webpack to keep your state and logic hot-updatable without page reloads.
19
+ - **Decoupled**: Works with any React setup, not tied to a specific framework like Umi.
20
+
21
+
2
22
 
3
23
  # how to use?
4
24
  install
@@ -2,4 +2,4 @@
2
2
  * ez-saga Webpack Loader
3
3
  * 对应 src/vite/index.ts 的逻辑,用于 Webpack 场景
4
4
  */
5
- export default function (this: any, source: string): void;
5
+ export default function (this: any, source: string, inputSourceMap?: any): void;
@@ -1,9 +1,11 @@
1
1
  import MagicString from 'magic-string';
2
+ import path from 'path';
3
+ import merge from 'merge-source-map';
2
4
  /**
3
5
  * ez-saga Webpack Loader
4
6
  * 对应 src/vite/index.ts 的逻辑,用于 Webpack 场景
5
7
  */
6
- export default function (source) {
8
+ export default function (source, inputSourceMap) {
7
9
  // 简单的特征检测
8
10
  const hasDefaultExport = /export\s+default/.test(source) || /exports\.default\s*=/.test(source) || /module\.exports\s*=/.test(source);
9
11
  // name属性检查 (宽松匹配: name: "foo" 或 name = "foo")
@@ -42,7 +44,7 @@ export default function (source) {
42
44
  }
43
45
  else {
44
46
  // 匹配失败
45
- this.callback(null, source);
47
+ this.callback(null, source, inputSourceMap);
46
48
  return;
47
49
  }
48
50
  // 注入 HMR 逻辑
@@ -59,10 +61,31 @@ if (module.hot) {
59
61
  }
60
62
  `;
61
63
  s.append(hmrCode);
62
- // 禁用 SourceMap
63
- callback(null, s.toString());
64
+ // 生成当前的 map
65
+ const intermediateFileName = path.basename(this.resourcePath) + ".intermediate.js";
66
+ const currentMap = s.generateMap({
67
+ source: intermediateFileName,
68
+ hires: true,
69
+ includeContent: true
70
+ });
71
+ // 如果有输入的 map (来自 ts-loader),则合并
72
+ let outputMap = currentMap;
73
+ if (inputSourceMap) {
74
+ try {
75
+ // merge-source-map(oldMap, newMap)
76
+ outputMap = merge(inputSourceMap, JSON.parse(currentMap.toString()));
77
+ }
78
+ catch (e) {
79
+ console.warn('[ez-saga-loader] SourceMap merge failed:', e);
80
+ outputMap = JSON.parse(currentMap.toString());
81
+ }
82
+ }
83
+ else {
84
+ outputMap = JSON.parse(currentMap.toString());
85
+ }
86
+ callback(null, s.toString(), outputMap);
64
87
  return;
65
88
  }
66
- this.callback(null, source);
89
+ this.callback(null, source, inputSourceMap);
67
90
  }
68
91
  //# sourceMappingURL=loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/webpack/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/webpack/loader.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ez-saga",
3
- "version": "18.0.7",
3
+ "version": "18.0.8",
4
4
  "description": "The ez-saga project is a project that imitates dva-js",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
@@ -46,6 +46,7 @@
46
46
  "dependencies": {
47
47
  "@reduxjs/toolkit": "^2.11.2",
48
48
  "magic-string": "^0.30.21",
49
+ "merge-source-map": "^1.1.0",
49
50
  "redux": "^5.0.1",
50
51
  "redux-saga": "^1.4.2",
51
52
  "tslib": "^2.8.1"
@@ -1,10 +1,12 @@
1
1
  import MagicString from 'magic-string';
2
+ import path from 'path';
3
+ import merge from 'merge-source-map';
2
4
 
3
5
  /**
4
6
  * ez-saga Webpack Loader
5
7
  * 对应 src/vite/index.ts 的逻辑,用于 Webpack 场景
6
8
  */
7
- export default function (this: any, source: string) {
9
+ export default function (this: any, source: string, inputSourceMap?: any) {
8
10
  // 简单的特征检测
9
11
  const hasDefaultExport = /export\s+default/.test(source) || /exports\.default\s*=/.test(source) || /module\.exports\s*=/.test(source);
10
12
  // name属性检查 (宽松匹配: name: "foo" 或 name = "foo")
@@ -44,7 +46,7 @@ export default function (this: any, source: string) {
44
46
  s.append(`\nmodule.exports = ${modelVarName};\n`);
45
47
  } else {
46
48
  // 匹配失败
47
- this.callback(null, source);
49
+ this.callback(null, source, inputSourceMap);
48
50
  return;
49
51
  }
50
52
 
@@ -63,10 +65,31 @@ if (module.hot) {
63
65
  `;
64
66
  s.append(hmrCode);
65
67
 
66
- // 禁用 SourceMap
67
- callback(null, s.toString());
68
+ // 生成当前的 map
69
+ const intermediateFileName = path.basename(this.resourcePath) + ".intermediate.js";
70
+ const currentMap = s.generateMap({
71
+ source: intermediateFileName,
72
+ hires: true,
73
+ includeContent: true
74
+ });
75
+
76
+ // 如果有输入的 map (来自 ts-loader),则合并
77
+ let outputMap = currentMap;
78
+ if (inputSourceMap) {
79
+ try {
80
+ // merge-source-map(oldMap, newMap)
81
+ outputMap = merge(inputSourceMap, JSON.parse(currentMap.toString()));
82
+ } catch (e) {
83
+ console.warn('[ez-saga-loader] SourceMap merge failed:', e);
84
+ outputMap = JSON.parse(currentMap.toString());
85
+ }
86
+ } else {
87
+ outputMap = JSON.parse(currentMap.toString());
88
+ }
89
+
90
+ callback(null, s.toString(), outputMap);
68
91
  return;
69
92
  }
70
93
 
71
- this.callback(null, source);
94
+ this.callback(null, source, inputSourceMap);
72
95
  }