lcd-router-webpack-plugin 9.2.10 → 9.2.11-alpha.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/babel/index.ts"],"names":[],"mappings":";AAGA,wBA8BG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/babel/index.ts"],"names":[],"mappings":";AAGA,wBA+BG"}
@@ -19,7 +19,7 @@ var _default = (0, _helperPluginUtils.declare)((api, options) => {
19
19
  }], [require.resolve("./plugins/enhance-reducer"), {
20
20
  pageRootAbs: pathService.getPageRootAbs(),
21
21
  reducerName: options.reducerName
22
- }]]
22
+ }], options.isRspack && options.detectStateYieldAssignment ? require.resolve("./plugins/detect-state-yield-assignment") : null].filter(Boolean)
23
23
  };
24
24
  });
25
25
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_helperPluginUtils","require","_utils","_default","declare","api","options","assertVersion","pathService","PathService","plugins","resolve","srcAbs","getSrcRootAbs","disableBuiltInRoute","pageRootAbs","getPageRootAbs","externals","reducerName","exports","default"],"sources":["../../index.ts"],"sourcesContent":["import { declare } from '@babel/helper-plugin-utils';\nimport { PathService, Options } from '../utils';\n\nexport default declare((api, options: Options) => {\n api.assertVersion(7);\n\n const pathService = new PathService(options);\n\n return {\n plugins: [\n [\n require.resolve('./plugins/replace-source'),\n {\n srcAbs: pathService.getSrcRootAbs(),\n disableBuiltInRoute: options.disableBuiltInRoute,\n },\n ],\n [\n require.resolve('./plugins/external-wrap'),\n {\n pageRootAbs: pathService.getPageRootAbs(),\n externals: options.externals,\n },\n ],\n [\n require.resolve('./plugins/enhance-reducer'),\n {\n pageRootAbs: pathService.getPageRootAbs(),\n reducerName: options.reducerName,\n },\n ],\n ],\n };\n});\n"],"mappings":";;;;;;AAAA,IAAAA,kBAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAAgD,IAAAE,QAAA,GAEjC,IAAAC,0BAAO,EAAC,CAACC,GAAG,EAAEC,OAAgB,KAAK;EAChDD,GAAG,CAACE,aAAa,CAAC,CAAC,CAAC;EAEpB,MAAMC,WAAW,GAAG,IAAIC,kBAAW,CAACH,OAAO,CAAC;EAE5C,OAAO;IACLI,OAAO,EAAE,CACP,CACET,OAAO,CAACU,OAAO,4BAA4B,EAC3C;MACEC,MAAM,EAAEJ,WAAW,CAACK,aAAa,EAAE;MACnCC,mBAAmB,EAAER,OAAO,CAACQ;IAC/B,CAAC,CACF,EACD,CACEb,OAAO,CAACU,OAAO,2BAA2B,EAC1C;MACEI,WAAW,EAAEP,WAAW,CAACQ,cAAc,EAAE;MACzCC,SAAS,EAAEX,OAAO,CAACW;IACrB,CAAC,CACF,EACD,CACEhB,OAAO,CAACU,OAAO,6BAA6B,EAC5C;MACEI,WAAW,EAAEP,WAAW,CAACQ,cAAc,EAAE;MACzCE,WAAW,EAAEZ,OAAO,CAACY;IACvB,CAAC,CACF;EAEL,CAAC;AACH,CAAC,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAAjB,QAAA"}
1
+ {"version":3,"file":"index.js","names":["_helperPluginUtils","require","_utils","_default","declare","api","options","assertVersion","pathService","PathService","plugins","resolve","srcAbs","getSrcRootAbs","disableBuiltInRoute","pageRootAbs","getPageRootAbs","externals","reducerName","isRspack","detectStateYieldAssignment","filter","Boolean","exports","default"],"sources":["../../index.ts"],"sourcesContent":["import { declare } from '@babel/helper-plugin-utils';\nimport { PathService, Options } from '../utils';\n\nexport default declare((api, options: Options & { isRspack: boolean }) => {\n api.assertVersion(7);\n\n const pathService = new PathService(options);\n\n return {\n plugins: [\n [\n require.resolve('./plugins/replace-source'),\n {\n srcAbs: pathService.getSrcRootAbs(),\n disableBuiltInRoute: options.disableBuiltInRoute,\n },\n ],\n [\n require.resolve('./plugins/external-wrap'),\n {\n pageRootAbs: pathService.getPageRootAbs(),\n externals: options.externals,\n },\n ],\n [\n require.resolve('./plugins/enhance-reducer'),\n {\n pageRootAbs: pathService.getPageRootAbs(),\n reducerName: options.reducerName,\n },\n ],\n options.isRspack && options.detectStateYieldAssignment ? require.resolve('./plugins/detect-state-yield-assignment') : null,\n ].filter(Boolean),\n };\n});\n"],"mappings":";;;;;;AAAA,IAAAA,kBAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAAgD,IAAAE,QAAA,GAEjC,IAAAC,0BAAO,EAAC,CAACC,GAAG,EAAEC,OAAwC,KAAK;EACxED,GAAG,CAACE,aAAa,CAAC,CAAC,CAAC;EAEpB,MAAMC,WAAW,GAAG,IAAIC,kBAAW,CAACH,OAAO,CAAC;EAE5C,OAAO;IACLI,OAAO,EAAE,CACP,CACET,OAAO,CAACU,OAAO,4BAA4B,EAC3C;MACEC,MAAM,EAAEJ,WAAW,CAACK,aAAa,EAAE;MACnCC,mBAAmB,EAAER,OAAO,CAACQ;IAC/B,CAAC,CACF,EACD,CACEb,OAAO,CAACU,OAAO,2BAA2B,EAC1C;MACEI,WAAW,EAAEP,WAAW,CAACQ,cAAc,EAAE;MACzCC,SAAS,EAAEX,OAAO,CAACW;IACrB,CAAC,CACF,EACD,CACEhB,OAAO,CAACU,OAAO,6BAA6B,EAC5C;MACEI,WAAW,EAAEP,WAAW,CAACQ,cAAc,EAAE;MACzCE,WAAW,EAAEZ,OAAO,CAACY;IACvB,CAAC,CACF,EACDZ,OAAO,CAACa,QAAQ,IAAIb,OAAO,CAACc,0BAA0B,GAAGnB,OAAO,CAACU,OAAO,2CAA2C,GAAG,IAAI,CAC3H,CAACU,MAAM,CAACC,OAAO;EAClB,CAAC;AACH,CAAC,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAArB,QAAA"}
@@ -0,0 +1,3 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ //# sourceMappingURL=detect-state-yield-assignment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-state-yield-assignment.d.ts","sourceRoot":"","sources":["../../../src/babel/plugins/detect-state-yield-assignment.ts"],"names":[],"mappings":";AAGA,wBA4KG"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _helperPluginUtils = require("@babel/helper-plugin-utils");
8
+ var _default = (0, _helperPluginUtils.declare)(api => {
9
+ const {
10
+ assertVersion,
11
+ types: t
12
+ } = api;
13
+ assertVersion(7);
14
+
15
+ /**
16
+ * 检查节点是否是 this.state 的成员表达式
17
+ * 包括: this.state.xxx, this.state.xx1.xx2 等
18
+ */
19
+ function isThisStateMemberExpression(node) {
20
+ if (!t.isMemberExpression(node)) {
21
+ return false;
22
+ }
23
+
24
+ // 找到最顶层的对象
25
+ let current = node;
26
+ while (t.isMemberExpression(current.object)) {
27
+ current = current.object;
28
+ }
29
+
30
+ // 检查最顶层是否是 this.state
31
+ // 此时 current 应该是类似 this.state 的结构
32
+ if (t.isMemberExpression(current) && t.isThisExpression(current.object) && t.isIdentifier(current.property, {
33
+ name: 'state'
34
+ })) {
35
+ return true;
36
+ }
37
+ return false;
38
+ }
39
+
40
+ /**
41
+ * 检查表达式中是否包含 yield
42
+ */
43
+ function containsYieldExpression(node) {
44
+ if (!node) return false;
45
+ if (t.isYieldExpression(node)) {
46
+ return true;
47
+ }
48
+
49
+ // 检查二元表达式 (例如: yield fn() || [])
50
+ if (t.isLogicalExpression(node) || t.isBinaryExpression(node)) {
51
+ return containsYieldExpression(node.left) || containsYieldExpression(node.right);
52
+ }
53
+
54
+ // 检查条件表达式 (例如: (yield fn()) ? a : b)
55
+ if (t.isConditionalExpression(node)) {
56
+ return containsYieldExpression(node.test) || containsYieldExpression(node.consequent) || containsYieldExpression(node.alternate);
57
+ }
58
+
59
+ // 检查序列表达式 (例如: (a, yield fn()))
60
+ if (t.isSequenceExpression(node)) {
61
+ return node.expressions.some(expr => containsYieldExpression(expr));
62
+ }
63
+
64
+ // 检查括号表达式
65
+ if (t.isParenthesizedExpression(node)) {
66
+ return containsYieldExpression(node.expression);
67
+ }
68
+
69
+ // 检查 await 表达式
70
+ if (t.isAwaitExpression(node)) {
71
+ return containsYieldExpression(node.argument);
72
+ }
73
+
74
+ // 检查一元表达式 (例如: !yield fn())
75
+ if (t.isUnaryExpression(node)) {
76
+ return containsYieldExpression(node.argument);
77
+ }
78
+ return false;
79
+ }
80
+
81
+ /**
82
+ * 检查对象属性中是否有 this.state 赋值包含 yield
83
+ */
84
+ function checkObjectProperties(properties, path, filename) {
85
+ properties.forEach(prop => {
86
+ if (t.isObjectProperty(prop) && containsYieldExpression(prop.value)) {
87
+ // 检查是否在对象展开后的属性中
88
+ throw path.buildCodeFrameError(`[lcd-router-webpack-plugin] 检测到不安全的语法: 在 generator 函数中不能使用 "this.state.xxx = yield fn()" 形式的赋值。\n` + `这种写法可能导致状态更新不生效。\n` + `文件: ${filename}\n` + `建议修改为: const result = yield fn(); this.state.xxx = result;`);
89
+ }
90
+ // 递归检查嵌套对象
91
+ if (t.isObjectProperty(prop) && t.isObjectExpression(prop.value)) {
92
+ checkObjectProperties(prop.value.properties, path, filename);
93
+ }
94
+ });
95
+ }
96
+ return {
97
+ name: 'babel-plugin-detect-state-yield-assignment',
98
+ visitor: {
99
+ // 检测赋值表达式
100
+ AssignmentExpression(path, state) {
101
+ const filename = state.filename || 'unknown';
102
+
103
+ // 检查是否在 generator 函数内
104
+ const generatorParent = path.findParent(p => p.isFunctionDeclaration({
105
+ generator: true
106
+ }) || p.isFunctionExpression({
107
+ generator: true
108
+ }) || p.isObjectMethod({
109
+ generator: true
110
+ }) || p.isClassMethod({
111
+ generator: true
112
+ }));
113
+ if (!generatorParent) {
114
+ return;
115
+ }
116
+ const {
117
+ left,
118
+ right
119
+ } = path.node;
120
+
121
+ // 情况1: 直接赋值 this.state.xxx = yield fn()
122
+ // 情况2: 嵌套赋值 this.state.xx1.xx2 = (yield fn222()) || []
123
+ if (isThisStateMemberExpression(left) && containsYieldExpression(right)) {
124
+ throw path.buildCodeFrameError(`[lcd-router-webpack-plugin] 检测到不安全的语法: 在 generator 函数中不能使用 "this.state.xxx = yield fn()" 形式的赋值。\n` + `这种写法可能导致状态更新不生效。\n` + `文件: ${filename}\n` + `建议修改为: const result = yield fn(); this.state.xxx = result;`);
125
+ }
126
+
127
+ // 情况3: 对象赋值 this.state.f2 = { ...this.state.f2, [xx1]: yield fn() }
128
+ if (isThisStateMemberExpression(left) && t.isObjectExpression(right)) {
129
+ checkObjectProperties(right.properties, path, filename);
130
+ }
131
+ },
132
+ // 检测变量声明中的对象属性
133
+ VariableDeclarator(path, state) {
134
+ const filename = state.filename || 'unknown';
135
+
136
+ // 检查是否在 generator 函数内
137
+ const generatorParent = path.findParent(p => p.isFunctionDeclaration({
138
+ generator: true
139
+ }) || p.isFunctionExpression({
140
+ generator: true
141
+ }) || p.isObjectMethod({
142
+ generator: true
143
+ }) || p.isClassMethod({
144
+ generator: true
145
+ }));
146
+ if (!generatorParent) {
147
+ return;
148
+ }
149
+ const {
150
+ init
151
+ } = path.node;
152
+
153
+ // 检查对象表达式中的属性
154
+ if (t.isObjectExpression(init)) {
155
+ init.properties.forEach(prop => {
156
+ if (t.isObjectProperty(prop)) {
157
+ // 检查属性值是否包含对 this.state 的赋值
158
+ if (t.isAssignmentExpression(prop.value)) {
159
+ const {
160
+ left,
161
+ right
162
+ } = prop.value;
163
+ if (isThisStateMemberExpression(left) && containsYieldExpression(right)) {
164
+ throw path.buildCodeFrameError(`[lcd-router-webpack-plugin] 检测到不安全的语法: 在 generator 函数中不能使用 "this.state.xxx = yield fn()" 形式的赋值。\n` + `这种写法可能导致状态更新不生效。\n` + `文件: ${filename}\n` + `建议修改为: const result = yield fn(); this.state.xxx = result;`);
165
+ }
166
+ }
167
+ }
168
+ });
169
+ }
170
+ }
171
+ }
172
+ };
173
+ });
174
+ exports.default = _default;
175
+ //# sourceMappingURL=detect-state-yield-assignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-state-yield-assignment.js","names":["_helperPluginUtils","require","_default","declare","api","assertVersion","types","t","isThisStateMemberExpression","node","isMemberExpression","current","object","isThisExpression","isIdentifier","property","name","containsYieldExpression","isYieldExpression","isLogicalExpression","isBinaryExpression","left","right","isConditionalExpression","test","consequent","alternate","isSequenceExpression","expressions","some","expr","isParenthesizedExpression","expression","isAwaitExpression","argument","isUnaryExpression","checkObjectProperties","properties","path","filename","forEach","prop","isObjectProperty","value","buildCodeFrameError","isObjectExpression","visitor","AssignmentExpression","state","generatorParent","findParent","p","isFunctionDeclaration","generator","isFunctionExpression","isObjectMethod","isClassMethod","VariableDeclarator","init","isAssignmentExpression","exports","default"],"sources":["../../../detect-state-yield-assignment.ts"],"sourcesContent":["import type * as __babel__core from '@babel/core';\nimport { declare } from '@babel/helper-plugin-utils';\n\nexport default declare((api) => {\n const { assertVersion, types: t } = api;\n assertVersion(7);\n\n /**\n * 检查节点是否是 this.state 的成员表达式\n * 包括: this.state.xxx, this.state.xx1.xx2 等\n */\n function isThisStateMemberExpression(node: any): boolean {\n if (!t.isMemberExpression(node)) {\n return false;\n }\n\n // 找到最顶层的对象\n let current = node;\n while (t.isMemberExpression(current.object)) {\n current = current.object;\n }\n\n // 检查最顶层是否是 this.state\n // 此时 current 应该是类似 this.state 的结构\n if (t.isMemberExpression(current) && t.isThisExpression(current.object) && t.isIdentifier(current.property, { name: 'state' })) {\n return true;\n }\n\n return false;\n }\n\n /**\n * 检查表达式中是否包含 yield\n */\n function containsYieldExpression(node: any): boolean {\n if (!node) return false;\n\n if (t.isYieldExpression(node)) {\n return true;\n }\n\n // 检查二元表达式 (例如: yield fn() || [])\n if (t.isLogicalExpression(node) || t.isBinaryExpression(node)) {\n return containsYieldExpression(node.left) || containsYieldExpression(node.right);\n }\n\n // 检查条件表达式 (例如: (yield fn()) ? a : b)\n if (t.isConditionalExpression(node)) {\n return containsYieldExpression(node.test) || containsYieldExpression(node.consequent) || containsYieldExpression(node.alternate);\n }\n\n // 检查序列表达式 (例如: (a, yield fn()))\n if (t.isSequenceExpression(node)) {\n return node.expressions.some((expr: any) => containsYieldExpression(expr));\n }\n\n // 检查括号表达式\n if (t.isParenthesizedExpression(node)) {\n return containsYieldExpression(node.expression);\n }\n\n // 检查 await 表达式\n if (t.isAwaitExpression(node)) {\n return containsYieldExpression(node.argument);\n }\n\n // 检查一元表达式 (例如: !yield fn())\n if (t.isUnaryExpression(node)) {\n return containsYieldExpression(node.argument);\n }\n\n return false;\n }\n\n /**\n * 检查对象属性中是否有 this.state 赋值包含 yield\n */\n function checkObjectProperties(properties: any[], path: any, filename: string) {\n properties.forEach((prop) => {\n if (t.isObjectProperty(prop) && containsYieldExpression(prop.value)) {\n // 检查是否在对象展开后的属性中\n throw path.buildCodeFrameError(\n `[lcd-router-webpack-plugin] 检测到不安全的语法: 在 generator 函数中不能使用 \"this.state.xxx = yield fn()\" 形式的赋值。\\n` +\n `这种写法可能导致状态更新不生效。\\n` +\n `文件: ${filename}\\n` +\n `建议修改为: const result = yield fn(); this.state.xxx = result;`,\n );\n }\n // 递归检查嵌套对象\n if (t.isObjectProperty(prop) && t.isObjectExpression(prop.value)) {\n checkObjectProperties(prop.value.properties, path, filename);\n }\n });\n }\n\n return {\n name: 'babel-plugin-detect-state-yield-assignment',\n visitor: {\n // 检测赋值表达式\n AssignmentExpression(path, state) {\n const filename = state.filename || 'unknown';\n\n // 检查是否在 generator 函数内\n const generatorParent = path.findParent(\n (p) =>\n p.isFunctionDeclaration({ generator: true }) ||\n p.isFunctionExpression({ generator: true }) ||\n p.isObjectMethod({ generator: true }) ||\n p.isClassMethod({ generator: true }),\n );\n\n if (!generatorParent) {\n return;\n }\n\n const { left, right } = path.node;\n\n // 情况1: 直接赋值 this.state.xxx = yield fn()\n // 情况2: 嵌套赋值 this.state.xx1.xx2 = (yield fn222()) || []\n if (isThisStateMemberExpression(left) && containsYieldExpression(right)) {\n throw path.buildCodeFrameError(\n `[lcd-router-webpack-plugin] 检测到不安全的语法: 在 generator 函数中不能使用 \"this.state.xxx = yield fn()\" 形式的赋值。\\n` +\n `这种写法可能导致状态更新不生效。\\n` +\n `文件: ${filename}\\n` +\n `建议修改为: const result = yield fn(); this.state.xxx = result;`,\n );\n }\n\n // 情况3: 对象赋值 this.state.f2 = { ...this.state.f2, [xx1]: yield fn() }\n if (isThisStateMemberExpression(left) && t.isObjectExpression(right)) {\n checkObjectProperties(right.properties, path, filename);\n }\n },\n\n // 检测变量声明中的对象属性\n VariableDeclarator(path, state) {\n const filename = state.filename || 'unknown';\n\n // 检查是否在 generator 函数内\n const generatorParent = path.findParent(\n (p) =>\n p.isFunctionDeclaration({ generator: true }) ||\n p.isFunctionExpression({ generator: true }) ||\n p.isObjectMethod({ generator: true }) ||\n p.isClassMethod({ generator: true }),\n );\n\n if (!generatorParent) {\n return;\n }\n\n const { init } = path.node;\n\n // 检查对象表达式中的属性\n if (t.isObjectExpression(init)) {\n init.properties.forEach((prop) => {\n if (t.isObjectProperty(prop)) {\n // 检查属性值是否包含对 this.state 的赋值\n if (t.isAssignmentExpression(prop.value)) {\n const { left, right } = prop.value;\n if (isThisStateMemberExpression(left) && containsYieldExpression(right)) {\n throw path.buildCodeFrameError(\n `[lcd-router-webpack-plugin] 检测到不安全的语法: 在 generator 函数中不能使用 \"this.state.xxx = yield fn()\" 形式的赋值。\\n` +\n `这种写法可能导致状态更新不生效。\\n` +\n `文件: ${filename}\\n` +\n `建议修改为: const result = yield fn(); this.state.xxx = result;`,\n );\n }\n }\n }\n });\n }\n },\n },\n };\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAI/D,OAAO,EAAyB,KAAK,OAAO,EAAe,MAAM,SAAS,CAAC;AAO3E,OAAO,EAAE,OAAO,EAAE,CAAC;AAEnB,MAAM,CAAC,OAAO,OAAO,sBAAuB,YAAW,qBAAqB;IAC1E,OAAO,EAAE,OAAO,CAAC;gBACL,OAAO,EAAE,OAAO;IAI5B,KAAK,CAAC,QAAQ,EAAE,QAAQ;IA4OxB,YAAY,CAAC,QAAQ,EAAE,QAAQ;CAYhC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAI/D,OAAO,EAAyB,KAAK,OAAO,EAAe,MAAM,SAAS,CAAC;AAO3E,OAAO,EAAE,OAAO,EAAE,CAAC;AAEnB,MAAM,CAAC,OAAO,OAAO,sBAAuB,YAAW,qBAAqB;IAC1E,OAAO,EAAE,OAAO,CAAC;gBACL,OAAO,EAAE,OAAO;IAI5B,KAAK,CAAC,QAAQ,EAAE,QAAQ;IA8OxB,YAAY,CAAC,QAAQ,EAAE,QAAQ;CAahC"}
package/lib/index.js CHANGED
@@ -198,13 +198,18 @@ class LcdRouterWebpackPlugin {
198
198
  // lcd 中包含一些语法转换处理
199
199
  compiler.hooks.environment.tap('lcd-preset', () => {
200
200
  if (this.options.disableBabelLoaderRule) return;
201
+ // @ts-expect-error rspackVersion 类型缺失
202
+ const isRspack = compiler.webpack?.rspackVersion;
201
203
  compiler.options.module.rules.push({
202
204
  test: /\.(js|ts)x?$/,
203
205
  exclude: /node_modules/,
204
206
  use: [{
205
207
  loader: require.resolve('babel-loader'),
206
208
  options: {
207
- presets: [[require.resolve("./babel/index"), this.options]],
209
+ presets: [[require.resolve("./babel/index"), {
210
+ ...this.options,
211
+ isRspack
212
+ }]],
208
213
  babelrc: false,
209
214
  // 需要支持语法解析, 但不需要做转换
210
215
  parserOpts: {
@@ -223,7 +228,8 @@ class LcdRouterWebpackPlugin {
223
228
  externals: [],
224
229
  pageDir: 'component',
225
230
  reducerName: 'reducer',
226
- disableBuiltInRoute: false
231
+ disableBuiltInRoute: false,
232
+ detectStateYieldAssignment: true
227
233
  };
228
234
  this.options = (0, _deepmerge.default)(defaultOptions, this.options);
229
235
  }
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_globby","_interopRequireDefault","require","_chokidar","_deepmerge","_utils","_ReducersGenerator","_SagasGenerator","_RoutersGenerator","_nodePath","obj","__esModule","default","LcdRouterWebpackPlugin","options","constructor","apply","compiler","mergeOptions","hooks","afterPlugins","tap","pathService","PathService","resolver","Resolver","fileService","FileService","reducersGenerator","ReducersGenerator","sagasGenerator","SagasGenerator","routersGenerator","RoutersGenerator","isDev","mode","process","env","NODE_ENV","writeCode","writeCodeToFile","getReducersCacheFileAbs","getSagasCacheFileAbs","getRoutersCacheFileAbs","resolveFile","filepath","absFilePath","getCurrentFileAbs","currentDir","path","dirname","absCurrentDir","isExternal","externals","some","x","chunkCode","meJSON","readJSONSync","reducerPath","getReducerFile","getReducerPath","push","e","mobx","Error","viewPath","getViewPath","theme","hash","sagaPath","getSagaFile","getSagaPath","errorComponent","getErrorComFile","themePath","getThemePath","writeThemeFile","meJSONPath","getMeJSONCacheFileAbs","meJSONRelativePath","getMeJSONRelativePath","writeMeJSONFile","hasChildStore","globby","sync","reducerName","cwd","length","set","namespace","page","exact","RegExp","index","test","_key","replace","list","ignore","getPageRootAbs","console","warn","sortedList","map","sort","a","b","startsWith","localeCompare","dir","forEach","watcher","chokidar","watch","ignoreInitial","fn","on","environment","disableBabelLoaderRule","module","rules","exclude","use","loader","resolve","presets","babelrc","parserOpts","plugins","defaultOptions","context","enablePreFetch","pageDir","disableBuiltInRoute","deepmerge","exports"],"sources":["../index.ts"],"sourcesContent":["import type { Compiler, WebpackPluginInstance } from 'webpack';\nimport globby from 'globby';\nimport chokidar from 'chokidar';\nimport deepmerge from 'deepmerge';\nimport { PathService, Resolver, type Options, FileService } from './utils';\nimport { ReducersGenerator } from './ReducersGenerator';\nimport { SagasGenerator } from './SagasGenerator';\nimport { RoutersGenerator } from './RoutersGenerator';\n\nimport path from 'node:path';\n\nexport { Options };\n\nexport default class LcdRouterWebpackPlugin implements WebpackPluginInstance {\n options: Options;\n constructor(options: Options) {\n this.options = options;\n }\n\n apply(compiler: Compiler) {\n this.mergeOptions(compiler);\n\n // 处理 lcd 中的路由体系\n compiler.hooks.afterPlugins.tap('LcdRouterWebpackPlugin', (compiler) => {\n const options = this.options;\n\n const pathService = new PathService(options);\n const resolver = new Resolver(compiler, options);\n const fileService = new FileService(pathService);\n\n const reducersGenerator = new ReducersGenerator();\n const sagasGenerator = new SagasGenerator();\n const routersGenerator = new RoutersGenerator(options, pathService);\n\n function isDev(compiler) {\n if (compiler.options.mode === 'production' || process.env.NODE_ENV === 'production') return false;\n return true;\n }\n\n function writeCode() {\n reducersGenerator.writeCodeToFile(pathService.getReducersCacheFileAbs());\n sagasGenerator.writeCodeToFile(pathService.getSagasCacheFileAbs());\n routersGenerator.writeCodeToFile(pathService.getRoutersCacheFileAbs());\n }\n\n function resolveFile(filepath: string) {\n const absFilePath = pathService.getCurrentFileAbs(filepath);\n const currentDir = path.dirname(filepath);\n const absCurrentDir = path.dirname(absFilePath);\n const isExternal = options.externals?.some?.((x) => x === path.dirname(filepath)) ?? false;\n const chunkCode = [] as string[];\n const meJSON = fileService.readJSONSync(absFilePath);\n let reducerPath = '';\n try {\n resolver.getReducerFile(absCurrentDir);\n reducerPath = pathService.getReducerPath(filepath);\n chunkCode.push(`export { default as reducer } from '${reducerPath}';`);\n } catch (e) {\n // feat: reducers 可以不存在, 方便结合reactive 和 ak,默认创建一个reducers\n if (meJSON.mobx) {\n /**\n * mobx 模式下, 需要垫一个被 mobx-adapter 包裹的 reducer 函数\n * 如果存在reducer文件,是默认会被 babel-plugin-enhance-reducer 处理的\n *\n * import storeHoc from 'rrc-loader-helper/lib/mobx-adapter';\n * export const reducer = storeHoc({\n * state: {},\n * }, 'report/other-table')\n *\n * 不太方便去垫一个 reducer 函数,reducer 的路径计算比较复杂, 所以直接报错\n * 同时,从逻辑上讲,如果开启了 mobx,那么必须要有 reducer 文件\n */\n throw Error(`开启 mobx 后,reducer 文件必须存在 ${absFilePath}`);\n }\n chunkCode.push(`export function reducer(){ return {} }`);\n }\n\n if (!isExternal) {\n const viewPath = pathService.getViewPath(filepath);\n chunkCode.push(`export { default as view } from '${viewPath}';`);\n }\n\n if (meJSON.theme && !options.theme?.hash) {\n throw Error(`开启页面级主题之前,请优先开启全局主题 ${absFilePath}`);\n }\n\n let sagaPath = '';\n if (!meJSON.mobx) {\n try {\n resolver.getSagaFile(absCurrentDir);\n sagaPath = pathService.getSagaPath(filepath);\n chunkCode.push(`export { default as saga } from '${sagaPath}';`);\n } catch (e) {\n // feat: saga 也可以不存在, 方便结合reactive 和 ak,默认创建一个reducers\n chunkCode.push(`export function* saga(){ return {} }`);\n }\n }\n\n if (meJSON.errorComponent) {\n resolver.getErrorComFile(absCurrentDir, meJSON.errorComponent);\n chunkCode.push(`export { default as ErrorComponent } from '${meJSON.errorComponent}';`);\n }\n\n if (options.theme?.hash) {\n const themePath = pathService.getThemePath(options.theme.hash);\n chunkCode.push(`export * from '${themePath}';`);\n }\n\n if (meJSON.theme) {\n fileService.writeThemeFile(meJSON.theme, 'toGlobalTheme');\n const themePath = pathService.getThemePath(meJSON.theme);\n chunkCode.push(`export * from '${themePath}';`);\n }\n\n const meJSONPath = pathService.getMeJSONCacheFileAbs(filepath);\n const meJSONRelativePath = pathService.getMeJSONRelativePath(filepath);\n\n fileService.writeMeJSONFile(meJSONPath, chunkCode);\n\n // 处理是否存在多store的场景\n const hasChildStore = globby.sync(`**/*.${options.reducerName}.{t,j}s`, { cwd: absCurrentDir }).length > 0;\n if (hasChildStore && (meJSON.sync || isExternal)) {\n throw Error(`如果开启了Sync模式或当前页面存在于LCD的external中,那么则不支持多Store功能,${absCurrentDir}`);\n }\n\n /** reducers.js */\n reducersGenerator.set(filepath, {\n meJSON,\n isExternal,\n namespace: currentDir,\n reducerPath,\n });\n\n /** saga.js */\n sagasGenerator.set(currentDir, {\n meJSON,\n isExternal,\n namespace: currentDir,\n reducerPath,\n sagaPath,\n });\n\n /** router */\n routersGenerator.set(currentDir, {\n meJSON,\n isExternal,\n page: currentDir,\n path: currentDir,\n exact: false,\n meJSONRelativePath,\n });\n\n /** 处理 /list 的路由 */\n if (new RegExp(`\\/${options.index}$`).test(currentDir)) {\n const _key = currentDir.replace(new RegExp(`\\/${options.index}$`), '');\n routersGenerator.set(_key, {\n meJSON,\n isExternal,\n page: currentDir,\n path: _key,\n exact: true,\n meJSONRelativePath,\n });\n }\n }\n\n if (options.theme?.hash) {\n fileService.writeThemeFile(options.theme.hash, 'toGlobalTheme');\n }\n\n const list = globby.sync('**/me.json', {\n ignore: options.ignore ?? [],\n cwd: pathService.getPageRootAbs(),\n });\n\n if (list.length === 0) {\n console.warn('没有找到me.json文件');\n }\n\n /**\n * glob 的排序 是包含文件名 me.json 的完整路径,存在问题\n * 比如 会将 /xx/ss/me.json 排到 /xx/ss/zz/me.json 前面\n * glob 的 noSort option 会将 文件夹排到前面, 因此需要手动排序, 并且统一成 globby, 速度更快\n */\n const sortedList = list\n .map((filepath) => filepath?.replace(/me.json$/, ''))\n .sort((a, b) => {\n if (a?.startsWith(b)) return -1;\n return a.localeCompare(b, 'en');\n })\n .map((dir) => `${dir}me.json`);\n\n sortedList.forEach((filepath) => {\n resolveFile(filepath);\n });\n\n writeCode();\n\n if (isDev(compiler)) {\n const watcher = chokidar.watch('**/me.json', {\n cwd: pathService.getPageRootAbs(),\n ignoreInitial: true,\n });\n const fn = async (filepath) => {\n await resolveFile(filepath);\n writeCode();\n };\n watcher.on('add', fn);\n watcher.on('addDir', fn);\n watcher.on('change', fn);\n watcher.on('unlink', fn);\n watcher.on('unlinkDir', fn);\n watcher.on('error', fn);\n }\n });\n\n // lcd 中包含一些语法转换处理\n compiler.hooks.environment.tap('lcd-preset', () => {\n if (this.options.disableBabelLoaderRule) return;\n compiler.options.module.rules.push({\n test: /\\.(js|ts)x?$/,\n exclude: /node_modules/,\n use: [\n {\n loader: require.resolve('babel-loader'),\n options: {\n presets: [[require.resolve('./babel/index'), this.options]],\n babelrc: false,\n // 需要支持语法解析, 但不需要做转换\n parserOpts: {\n plugins: [\n 'jsx',\n 'typescript',\n 'asyncDoExpressions',\n 'decimal',\n 'decorators-legacy',\n 'decoratorAutoAccessors',\n 'destructuringPrivate',\n 'doExpressions',\n 'exportDefaultFrom',\n 'functionBind',\n 'functionSent',\n 'importAssertions',\n 'moduleBlocks',\n 'partialApplication',\n 'throwExpressions',\n ],\n },\n },\n },\n ],\n });\n });\n }\n\n mergeOptions(compiler: Compiler) {\n const defaultOptions = {\n context: compiler.context,\n enablePreFetch: false,\n index: 'list',\n externals: [],\n pageDir: 'component',\n reducerName: 'reducer',\n disableBuiltInRoute: false,\n };\n this.options = deepmerge(defaultOptions, this.options);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["_globby","_interopRequireDefault","require","_chokidar","_deepmerge","_utils","_ReducersGenerator","_SagasGenerator","_RoutersGenerator","_nodePath","obj","__esModule","default","LcdRouterWebpackPlugin","options","constructor","apply","compiler","mergeOptions","hooks","afterPlugins","tap","pathService","PathService","resolver","Resolver","fileService","FileService","reducersGenerator","ReducersGenerator","sagasGenerator","SagasGenerator","routersGenerator","RoutersGenerator","isDev","mode","process","env","NODE_ENV","writeCode","writeCodeToFile","getReducersCacheFileAbs","getSagasCacheFileAbs","getRoutersCacheFileAbs","resolveFile","filepath","absFilePath","getCurrentFileAbs","currentDir","path","dirname","absCurrentDir","isExternal","externals","some","x","chunkCode","meJSON","readJSONSync","reducerPath","getReducerFile","getReducerPath","push","e","mobx","Error","viewPath","getViewPath","theme","hash","sagaPath","getSagaFile","getSagaPath","errorComponent","getErrorComFile","themePath","getThemePath","writeThemeFile","meJSONPath","getMeJSONCacheFileAbs","meJSONRelativePath","getMeJSONRelativePath","writeMeJSONFile","hasChildStore","globby","sync","reducerName","cwd","length","set","namespace","page","exact","RegExp","index","test","_key","replace","list","ignore","getPageRootAbs","console","warn","sortedList","map","sort","a","b","startsWith","localeCompare","dir","forEach","watcher","chokidar","watch","ignoreInitial","fn","on","environment","disableBabelLoaderRule","isRspack","webpack","rspackVersion","module","rules","exclude","use","loader","resolve","presets","babelrc","parserOpts","plugins","defaultOptions","context","enablePreFetch","pageDir","disableBuiltInRoute","detectStateYieldAssignment","deepmerge","exports"],"sources":["../index.ts"],"sourcesContent":["import type { Compiler, WebpackPluginInstance } from 'webpack';\nimport globby from 'globby';\nimport chokidar from 'chokidar';\nimport deepmerge from 'deepmerge';\nimport { PathService, Resolver, type Options, FileService } from './utils';\nimport { ReducersGenerator } from './ReducersGenerator';\nimport { SagasGenerator } from './SagasGenerator';\nimport { RoutersGenerator } from './RoutersGenerator';\n\nimport path from 'node:path';\n\nexport { Options };\n\nexport default class LcdRouterWebpackPlugin implements WebpackPluginInstance {\n options: Options;\n constructor(options: Options) {\n this.options = options;\n }\n\n apply(compiler: Compiler) {\n this.mergeOptions(compiler);\n\n // 处理 lcd 中的路由体系\n compiler.hooks.afterPlugins.tap('LcdRouterWebpackPlugin', (compiler) => {\n const options = this.options;\n\n const pathService = new PathService(options);\n const resolver = new Resolver(compiler, options);\n const fileService = new FileService(pathService);\n\n const reducersGenerator = new ReducersGenerator();\n const sagasGenerator = new SagasGenerator();\n const routersGenerator = new RoutersGenerator(options, pathService);\n\n function isDev(compiler) {\n if (compiler.options.mode === 'production' || process.env.NODE_ENV === 'production') return false;\n return true;\n }\n\n function writeCode() {\n reducersGenerator.writeCodeToFile(pathService.getReducersCacheFileAbs());\n sagasGenerator.writeCodeToFile(pathService.getSagasCacheFileAbs());\n routersGenerator.writeCodeToFile(pathService.getRoutersCacheFileAbs());\n }\n\n function resolveFile(filepath: string) {\n const absFilePath = pathService.getCurrentFileAbs(filepath);\n const currentDir = path.dirname(filepath);\n const absCurrentDir = path.dirname(absFilePath);\n const isExternal = options.externals?.some?.((x) => x === path.dirname(filepath)) ?? false;\n const chunkCode = [] as string[];\n const meJSON = fileService.readJSONSync(absFilePath);\n let reducerPath = '';\n try {\n resolver.getReducerFile(absCurrentDir);\n reducerPath = pathService.getReducerPath(filepath);\n chunkCode.push(`export { default as reducer } from '${reducerPath}';`);\n } catch (e) {\n // feat: reducers 可以不存在, 方便结合reactive 和 ak,默认创建一个reducers\n if (meJSON.mobx) {\n /**\n * mobx 模式下, 需要垫一个被 mobx-adapter 包裹的 reducer 函数\n * 如果存在reducer文件,是默认会被 babel-plugin-enhance-reducer 处理的\n *\n * import storeHoc from 'rrc-loader-helper/lib/mobx-adapter';\n * export const reducer = storeHoc({\n * state: {},\n * }, 'report/other-table')\n *\n * 不太方便去垫一个 reducer 函数,reducer 的路径计算比较复杂, 所以直接报错\n * 同时,从逻辑上讲,如果开启了 mobx,那么必须要有 reducer 文件\n */\n throw Error(`开启 mobx 后,reducer 文件必须存在 ${absFilePath}`);\n }\n chunkCode.push(`export function reducer(){ return {} }`);\n }\n\n if (!isExternal) {\n const viewPath = pathService.getViewPath(filepath);\n chunkCode.push(`export { default as view } from '${viewPath}';`);\n }\n\n if (meJSON.theme && !options.theme?.hash) {\n throw Error(`开启页面级主题之前,请优先开启全局主题 ${absFilePath}`);\n }\n\n let sagaPath = '';\n if (!meJSON.mobx) {\n try {\n resolver.getSagaFile(absCurrentDir);\n sagaPath = pathService.getSagaPath(filepath);\n chunkCode.push(`export { default as saga } from '${sagaPath}';`);\n } catch (e) {\n // feat: saga 也可以不存在, 方便结合reactive 和 ak,默认创建一个reducers\n chunkCode.push(`export function* saga(){ return {} }`);\n }\n }\n\n if (meJSON.errorComponent) {\n resolver.getErrorComFile(absCurrentDir, meJSON.errorComponent);\n chunkCode.push(`export { default as ErrorComponent } from '${meJSON.errorComponent}';`);\n }\n\n if (options.theme?.hash) {\n const themePath = pathService.getThemePath(options.theme.hash);\n chunkCode.push(`export * from '${themePath}';`);\n }\n\n if (meJSON.theme) {\n fileService.writeThemeFile(meJSON.theme, 'toGlobalTheme');\n const themePath = pathService.getThemePath(meJSON.theme);\n chunkCode.push(`export * from '${themePath}';`);\n }\n\n const meJSONPath = pathService.getMeJSONCacheFileAbs(filepath);\n const meJSONRelativePath = pathService.getMeJSONRelativePath(filepath);\n\n fileService.writeMeJSONFile(meJSONPath, chunkCode);\n\n // 处理是否存在多store的场景\n const hasChildStore = globby.sync(`**/*.${options.reducerName}.{t,j}s`, { cwd: absCurrentDir }).length > 0;\n if (hasChildStore && (meJSON.sync || isExternal)) {\n throw Error(`如果开启了Sync模式或当前页面存在于LCD的external中,那么则不支持多Store功能,${absCurrentDir}`);\n }\n\n /** reducers.js */\n reducersGenerator.set(filepath, {\n meJSON,\n isExternal,\n namespace: currentDir,\n reducerPath,\n });\n\n /** saga.js */\n sagasGenerator.set(currentDir, {\n meJSON,\n isExternal,\n namespace: currentDir,\n reducerPath,\n sagaPath,\n });\n\n /** router */\n routersGenerator.set(currentDir, {\n meJSON,\n isExternal,\n page: currentDir,\n path: currentDir,\n exact: false,\n meJSONRelativePath,\n });\n\n /** 处理 /list 的路由 */\n if (new RegExp(`\\/${options.index}$`).test(currentDir)) {\n const _key = currentDir.replace(new RegExp(`\\/${options.index}$`), '');\n routersGenerator.set(_key, {\n meJSON,\n isExternal,\n page: currentDir,\n path: _key,\n exact: true,\n meJSONRelativePath,\n });\n }\n }\n\n if (options.theme?.hash) {\n fileService.writeThemeFile(options.theme.hash, 'toGlobalTheme');\n }\n\n const list = globby.sync('**/me.json', {\n ignore: options.ignore ?? [],\n cwd: pathService.getPageRootAbs(),\n });\n\n if (list.length === 0) {\n console.warn('没有找到me.json文件');\n }\n\n /**\n * glob 的排序 是包含文件名 me.json 的完整路径,存在问题\n * 比如 会将 /xx/ss/me.json 排到 /xx/ss/zz/me.json 前面\n * glob 的 noSort option 会将 文件夹排到前面, 因此需要手动排序, 并且统一成 globby, 速度更快\n */\n const sortedList = list\n .map((filepath) => filepath?.replace(/me.json$/, ''))\n .sort((a, b) => {\n if (a?.startsWith(b)) return -1;\n return a.localeCompare(b, 'en');\n })\n .map((dir) => `${dir}me.json`);\n\n sortedList.forEach((filepath) => {\n resolveFile(filepath);\n });\n\n writeCode();\n\n if (isDev(compiler)) {\n const watcher = chokidar.watch('**/me.json', {\n cwd: pathService.getPageRootAbs(),\n ignoreInitial: true,\n });\n const fn = async (filepath) => {\n await resolveFile(filepath);\n writeCode();\n };\n watcher.on('add', fn);\n watcher.on('addDir', fn);\n watcher.on('change', fn);\n watcher.on('unlink', fn);\n watcher.on('unlinkDir', fn);\n watcher.on('error', fn);\n }\n });\n\n // lcd 中包含一些语法转换处理\n compiler.hooks.environment.tap('lcd-preset', () => {\n if (this.options.disableBabelLoaderRule) return;\n // @ts-expect-error rspackVersion 类型缺失\n const isRspack = compiler.webpack?.rspackVersion;\n compiler.options.module.rules.push({\n test: /\\.(js|ts)x?$/,\n exclude: /node_modules/,\n use: [\n {\n loader: require.resolve('babel-loader'),\n options: {\n presets: [[require.resolve('./babel/index'), { ...this.options, isRspack }]],\n babelrc: false,\n // 需要支持语法解析, 但不需要做转换\n parserOpts: {\n plugins: [\n 'jsx',\n 'typescript',\n 'asyncDoExpressions',\n 'decimal',\n 'decorators-legacy',\n 'decoratorAutoAccessors',\n 'destructuringPrivate',\n 'doExpressions',\n 'exportDefaultFrom',\n 'functionBind',\n 'functionSent',\n 'importAssertions',\n 'moduleBlocks',\n 'partialApplication',\n 'throwExpressions',\n ],\n },\n },\n },\n ],\n });\n });\n }\n\n mergeOptions(compiler: Compiler) {\n const defaultOptions = {\n context: compiler.context,\n enablePreFetch: false,\n index: 'list',\n externals: [],\n pageDir: 'component',\n reducerName: 'reducer',\n disableBuiltInRoute: false,\n detectStateYieldAssignment: true,\n };\n this.options = deepmerge(defaultOptions, this.options);\n }\n}\n"],"mappings":"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"}
@@ -75,6 +75,11 @@ export interface Options {
75
75
  */
76
76
  ignore?: string[];
77
77
  keepAlive?: boolean;
78
+ /**
79
+ * 开启 swc 下 state yield 校验, rspack 下生效并默认开启,
80
+ * 用于检测 this.state.xxx = yield xxx 这种不合法的写法,swc 下存在问题会导致状态不更新
81
+ */
82
+ detectStateYieldAssignment?: boolean;
78
83
  }
79
84
  export interface MeJSON {
80
85
  theme?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../types.ts"],"sourcesContent":["export interface Options {\n /**\n * 组件上下文, 默认取 compiler.context\n * @default compiler.context\n */\n context?: string;\n /**\n * 是否禁用内置路由\n * 默认会将 react-router-dom 转换到 rrc-loader-helper/router\n * 如果你是新项目,建议将该配置配置为true,因为内置路由针对react-router做了大量的改动,可能会引起一些无法预测的故障\n * @default false\n */\n disableBuiltInRoute?: boolean;\n /**\n * 是否开启 webpack prefetch预加载\n * @default false\n */\n enablePreFetch?: boolean;\n /**\n * 指定页面路径 不进行注册路由\n * @default []\n */\n externals?: string[];\n /**\n * 页面目录\n * @default component\n */\n pageDir?: string;\n /**\n * shineout 主题\n */\n theme?: {\n hash: string;\n };\n /**\n * reducer 文件名称\n * @default reducer\n */\n reducerName?: string;\n /**\n * loading 组件路径\n */\n loading?: string;\n /**\n * 一个神奇的属性,用于处理 /xxx/order/list 这种路由过长的问题\n * 也可以用来作为父路由的默认路由目录\n * 会生成一个新路由 /xxx/order,实际目录指向为 /xxx/order/list\n * @default list\n */\n index?: string;\n /**\n * 渲染出错时的组件地址\n */\n errorComponent?: string;\n\n /**\n * 是否允许页面内生成自定义路由\n * 例如在 component/order/detail/me.json 中 配置 route: '/:id',此时会生成动态路由 /order/detail/:id\n * 非常不推荐使用的一个属性,因为此功能受 me.json 中 exact 属性影响, 仅当 exact: true 时候,才不会拼接路由\n * 当开启 dangerousRoute 后, 不再受 exact 影响, 都会生成 拼接路由 /order/detail/:id\n * @default false\n */\n dangerousRoute?: boolean;\n\n /**\n * 是否禁用 babel-loader 处理, 默认开启,因为需要 babel-loader 会对 reducer 进行处理\n * 但考虑到新增 rule 会导致打包速度变慢,所以提供了这个配置。\n * @default false\n */\n disableBabelLoaderRule?: boolean;\n\n /**\n * 是否保留 params 和 query 作为 reducer 的 key,通常用于同一个路由同时打开的场景,例如 keep-alive,谨慎使用\n */\n retain?: boolean;\n\n /**\n * 排除掉某些文件不生成路由,规则请参考 fast-glob ignore https://github.com/mrmlnc/fast-glob?tab=readme-ov-file#ignore\n */\n ignore?: string[];\n\n keepAlive?: boolean;\n}\n\nexport interface MeJSON {\n theme?: string;\n sync?: boolean;\n /**\n * mobx 模式\n * 未开启时, reducer 文件导出为纯函数,用来处理状态修改。 saga 文件用来处理副作用逻辑。\n * 开启后,reducer 文件导出为对象,包含 state 以及方法, 普通函数作为reducer修改状态, generator 函数处理副作用逻辑。\n * @default false\n */\n mobx?: boolean;\n keepAlive?: boolean;\n\n /**\n * 是否保留 params 和 query 作为 reducer 的 key,通常用于同一个路由同时打开的场景,例如 keep-alive,谨慎使用\n */\n retain?: boolean;\n\n title?: string;\n /**\n * @description 为了兼容同一个页面多次打开 动态拓展 redux 的reducer 节点\n * @description 在路由配置中添加 /:id?,不推荐使用, 仅极少场景需要\n * @default false\n */\n linkExtendable?: boolean;\n injectStore?: boolean | string;\n route?: string;\n /**\n * 默认是以 url 作为page的key, 但是有些场景下,会在 url 中动态添加 query,导致页面进行重绘\n * 当然,这个配置开启后,究竟会引发什么问题,我不清楚,但是我知道,这个配置是有风险的,所以我给了一个 UNSAFE 的前缀\n */\n UNSAFE_pathAsKey?: boolean;\n\n enablePreFetch?: boolean;\n\n /**\n * 自定义 webpackChunkName,对于指定页面的预加载可能有效\n */\n webpackChunkName?: string;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../types.ts"],"sourcesContent":["export interface Options {\n /**\n * 组件上下文, 默认取 compiler.context\n * @default compiler.context\n */\n context?: string;\n /**\n * 是否禁用内置路由\n * 默认会将 react-router-dom 转换到 rrc-loader-helper/router\n * 如果你是新项目,建议将该配置配置为true,因为内置路由针对react-router做了大量的改动,可能会引起一些无法预测的故障\n * @default false\n */\n disableBuiltInRoute?: boolean;\n /**\n * 是否开启 webpack prefetch预加载\n * @default false\n */\n enablePreFetch?: boolean;\n /**\n * 指定页面路径 不进行注册路由\n * @default []\n */\n externals?: string[];\n /**\n * 页面目录\n * @default component\n */\n pageDir?: string;\n /**\n * shineout 主题\n */\n theme?: {\n hash: string;\n };\n /**\n * reducer 文件名称\n * @default reducer\n */\n reducerName?: string;\n /**\n * loading 组件路径\n */\n loading?: string;\n /**\n * 一个神奇的属性,用于处理 /xxx/order/list 这种路由过长的问题\n * 也可以用来作为父路由的默认路由目录\n * 会生成一个新路由 /xxx/order,实际目录指向为 /xxx/order/list\n * @default list\n */\n index?: string;\n /**\n * 渲染出错时的组件地址\n */\n errorComponent?: string;\n\n /**\n * 是否允许页面内生成自定义路由\n * 例如在 component/order/detail/me.json 中 配置 route: '/:id',此时会生成动态路由 /order/detail/:id\n * 非常不推荐使用的一个属性,因为此功能受 me.json 中 exact 属性影响, 仅当 exact: true 时候,才不会拼接路由\n * 当开启 dangerousRoute 后, 不再受 exact 影响, 都会生成 拼接路由 /order/detail/:id\n * @default false\n */\n dangerousRoute?: boolean;\n\n /**\n * 是否禁用 babel-loader 处理, 默认开启,因为需要 babel-loader 会对 reducer 进行处理\n * 但考虑到新增 rule 会导致打包速度变慢,所以提供了这个配置。\n * @default false\n */\n disableBabelLoaderRule?: boolean;\n\n /**\n * 是否保留 params 和 query 作为 reducer 的 key,通常用于同一个路由同时打开的场景,例如 keep-alive,谨慎使用\n */\n retain?: boolean;\n\n /**\n * 排除掉某些文件不生成路由,规则请参考 fast-glob ignore https://github.com/mrmlnc/fast-glob?tab=readme-ov-file#ignore\n */\n ignore?: string[];\n\n keepAlive?: boolean;\n\n /**\n * 开启 swc 下 state yield 校验, rspack 下生效并默认开启,\n * 用于检测 this.state.xxx = yield xxx 这种不合法的写法,swc 下存在问题会导致状态不更新\n */\n detectStateYieldAssignment?: boolean;\n}\n\nexport interface MeJSON {\n theme?: string;\n sync?: boolean;\n /**\n * mobx 模式\n * 未开启时, reducer 文件导出为纯函数,用来处理状态修改。 saga 文件用来处理副作用逻辑。\n * 开启后,reducer 文件导出为对象,包含 state 以及方法, 普通函数作为reducer修改状态, generator 函数处理副作用逻辑。\n * @default false\n */\n mobx?: boolean;\n keepAlive?: boolean;\n\n /**\n * 是否保留 params 和 query 作为 reducer 的 key,通常用于同一个路由同时打开的场景,例如 keep-alive,谨慎使用\n */\n retain?: boolean;\n\n title?: string;\n /**\n * @description 为了兼容同一个页面多次打开 动态拓展 redux 的reducer 节点\n * @description 在路由配置中添加 /:id?,不推荐使用, 仅极少场景需要\n * @default false\n */\n linkExtendable?: boolean;\n injectStore?: boolean | string;\n route?: string;\n /**\n * 默认是以 url 作为page的key, 但是有些场景下,会在 url 中动态添加 query,导致页面进行重绘\n * 当然,这个配置开启后,究竟会引发什么问题,我不清楚,但是我知道,这个配置是有风险的,所以我给了一个 UNSAFE 的前缀\n */\n UNSAFE_pathAsKey?: boolean;\n\n enablePreFetch?: boolean;\n\n /**\n * 自定义 webpackChunkName,对于指定页面的预加载可能有效\n */\n webpackChunkName?: string;\n}\n"],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lcd-router-webpack-plugin",
3
- "version": "9.2.10",
3
+ "version": "9.2.11-alpha.1",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "files": [