@4399ywkf/core 4.0.84 → 5.0.0

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 (81) hide show
  1. package/dist/cli/index.js +2180 -0
  2. package/dist/cli/index.js.map +1 -0
  3. package/dist/config/index.d.ts +37 -0
  4. package/dist/config/index.js +143 -0
  5. package/dist/config/index.js.map +1 -0
  6. package/dist/index.d.ts +496 -6
  7. package/dist/index.js +3671 -49
  8. package/dist/index.js.map +1 -0
  9. package/dist/plugin/index.d.ts +110 -0
  10. package/dist/plugin/index.js +277 -0
  11. package/dist/plugin/index.js.map +1 -0
  12. package/dist/router/index.d.ts +126 -0
  13. package/dist/router/index.js +390 -0
  14. package/dist/router/index.js.map +1 -0
  15. package/dist/rspack/index.d.ts +29 -0
  16. package/dist/rspack/index.js +1574 -0
  17. package/dist/rspack/index.js.map +1 -0
  18. package/dist/runtime/index.d.ts +120 -0
  19. package/dist/runtime/index.js +406 -0
  20. package/dist/runtime/index.js.map +1 -0
  21. package/dist/schema-BuqmN_ra.d.ts +390 -0
  22. package/dist/types-BZV_2QtD.d.ts +97 -0
  23. package/package.json +88 -37
  24. package/README.md +0 -3
  25. package/compiled/dotenv/LICENSE +0 -23
  26. package/compiled/dotenv/index.js +0 -1
  27. package/compiled/dotenv/lib/main.d.ts +0 -73
  28. package/compiled/dotenv/package.json +0 -1
  29. package/compiled/dotenv/types/index.d.ts +0 -59
  30. package/compiled/dotenv-expand/LICENSE +0 -24
  31. package/compiled/dotenv-expand/index.js +0 -1
  32. package/compiled/dotenv-expand/lib/main.d.ts +0 -29
  33. package/compiled/dotenv-expand/package.json +0 -1
  34. package/compiled/just-diff/LICENSE +0 -21
  35. package/compiled/just-diff/index.d.ts +0 -20
  36. package/compiled/just-diff/index.js +0 -1
  37. package/compiled/just-diff/package.json +0 -1
  38. package/dist/config/config.d.ts +0 -62
  39. package/dist/config/config.js +0 -240
  40. package/dist/config/utils.d.ts +0 -8
  41. package/dist/config/utils.js +0 -40
  42. package/dist/constants.d.ts +0 -9
  43. package/dist/constants.js +0 -45
  44. package/dist/route/defineRoutes.d.ts +0 -1
  45. package/dist/route/defineRoutes.js +0 -61
  46. package/dist/route/route.d.ts +0 -3
  47. package/dist/route/route.js +0 -27
  48. package/dist/route/routeUtils.d.ts +0 -8
  49. package/dist/route/routeUtils.js +0 -46
  50. package/dist/route/routesConfig.d.ts +0 -6
  51. package/dist/route/routesConfig.js +0 -125
  52. package/dist/route/routesConvention.d.ts +0 -5
  53. package/dist/route/routesConvention.js +0 -88
  54. package/dist/route/utils.d.ts +0 -8
  55. package/dist/route/utils.js +0 -59
  56. package/dist/service/command.d.ts +0 -30
  57. package/dist/service/command.js +0 -39
  58. package/dist/service/env.d.ts +0 -4
  59. package/dist/service/env.js +0 -47
  60. package/dist/service/generatePlugin.d.ts +0 -4
  61. package/dist/service/generatePlugin.js +0 -102
  62. package/dist/service/generator.d.ts +0 -71
  63. package/dist/service/generator.js +0 -40
  64. package/dist/service/hook.d.ts +0 -16
  65. package/dist/service/hook.js +0 -52
  66. package/dist/service/path.d.ts +0 -15
  67. package/dist/service/path.js +0 -55
  68. package/dist/service/plugin.d.ts +0 -61
  69. package/dist/service/plugin.js +0 -174
  70. package/dist/service/pluginAPI.d.ts +0 -49
  71. package/dist/service/pluginAPI.js +0 -233
  72. package/dist/service/service.d.ts +0 -147
  73. package/dist/service/service.js +0 -544
  74. package/dist/service/servicePlugin.d.ts +0 -3
  75. package/dist/service/servicePlugin.js +0 -37
  76. package/dist/service/telemetry.d.ts +0 -32
  77. package/dist/service/telemetry.js +0 -127
  78. package/dist/service/utils.d.ts +0 -2
  79. package/dist/service/utils.js +0 -36
  80. package/dist/types.d.ts +0 -116
  81. package/dist/types.js +0 -77
@@ -0,0 +1,110 @@
1
+ import { e as YwkfPlugin, b as PluginHooks, Y as YwkfConfig, c as PluginConfig, k as RouteItem } from '../schema-BuqmN_ra.js';
2
+ export { B as BuildHooks, C as CodeInjection, n as DefinePlugin, j as GeneratedFile, G as GeneratorContext, i as GeneratorHooks, m as PluginAPI, f as PluginContext, l as PluginLogger, g as RouterHooks, h as RuntimeHooks } from '../schema-BuqmN_ra.js';
3
+ import { Configuration } from '@rspack/core';
4
+ import { A as AppConfig, P as ProviderConfig } from '../types-BZV_2QtD.js';
5
+ import 'react';
6
+ import 'react-router';
7
+
8
+ /**
9
+ * 定义插件的辅助函数
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * export default definePlugin({
14
+ * name: "my-plugin",
15
+ * setup(context) {
16
+ * return {
17
+ * modifyRspackConfig(config) {
18
+ * // 修改配置
19
+ * return config;
20
+ * },
21
+ * };
22
+ * },
23
+ * });
24
+ * ```
25
+ */
26
+ declare function definePlugin(plugin: YwkfPlugin): YwkfPlugin;
27
+ /**
28
+ * 创建带配置的插件工厂
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * export default createPlugin<{ apiUrl: string }>((options) => ({
33
+ * name: "api-plugin",
34
+ * setup(context) {
35
+ * console.log("API URL:", options?.apiUrl);
36
+ * return {};
37
+ * },
38
+ * }));
39
+ * ```
40
+ */
41
+ declare function createPlugin<T = Record<string, unknown>>(factory: (options?: T) => YwkfPlugin): (options?: T) => YwkfPlugin;
42
+ /**
43
+ * 组合多个插件钩子
44
+ */
45
+ declare function composeHooks(...hooksList: PluginHooks[]): PluginHooks;
46
+
47
+ /**
48
+ * 插件管理器
49
+ */
50
+ declare class PluginManager {
51
+ private plugins;
52
+ private context;
53
+ constructor(config: Required<YwkfConfig>, cwd: string, isDev: boolean);
54
+ /**
55
+ * 加载并初始化所有插件
56
+ */
57
+ loadPlugins(pluginConfigs: PluginConfig[]): Promise<void>;
58
+ /**
59
+ * 执行 modifyRspackConfig 钩子
60
+ */
61
+ applyRspackConfigHooks(config: Configuration): Promise<Configuration>;
62
+ /**
63
+ * 执行 modifyRoutes 钩子
64
+ */
65
+ applyRoutesHooks(routes: RouteItem[]): Promise<RouteItem[]>;
66
+ /**
67
+ * 执行 modifyAppConfig 钩子
68
+ */
69
+ applyAppConfigHooks(appConfig: AppConfig): AppConfig;
70
+ /**
71
+ * 收集所有插件的 Provider
72
+ */
73
+ collectProviders(): ProviderConfig[];
74
+ /**
75
+ * 执行 beforeBuild 钩子
76
+ */
77
+ runBeforeBuild(): Promise<void>;
78
+ /**
79
+ * 执行 afterBuild 钩子
80
+ */
81
+ runAfterBuild(stats: {
82
+ success: boolean;
83
+ errors?: string[];
84
+ }): Promise<void>;
85
+ /**
86
+ * 执行 beforeDevServer 钩子
87
+ */
88
+ runBeforeDevServer(): Promise<void>;
89
+ /**
90
+ * 执行 afterDevServer 钩子
91
+ */
92
+ runAfterDevServer(server: {
93
+ port: number;
94
+ host: string;
95
+ }): Promise<void>;
96
+ /**
97
+ * 获取所有已加载的插件名称
98
+ */
99
+ getPluginNames(): string[];
100
+ /**
101
+ * 获取所有已加载的插件
102
+ */
103
+ getPlugins(): YwkfPlugin[];
104
+ /**
105
+ * 获取所有已加载的插件钩子
106
+ */
107
+ getPluginHooks(): PluginHooks[];
108
+ }
109
+
110
+ export { PluginConfig, PluginHooks, PluginManager, YwkfPlugin, composeHooks, createPlugin, definePlugin };
@@ -0,0 +1,277 @@
1
+ // src/plugin/define.ts
2
+ function definePlugin(plugin) {
3
+ return plugin;
4
+ }
5
+ function createPlugin(factory) {
6
+ return factory;
7
+ }
8
+ function composeHooks(...hooksList) {
9
+ const composed = {};
10
+ for (const hooks of hooksList) {
11
+ for (const [key, value] of Object.entries(hooks)) {
12
+ if (value) {
13
+ const existing = composed[key];
14
+ if (existing) {
15
+ composed[key] = async (...args) => {
16
+ await existing(...args);
17
+ return value(...args);
18
+ };
19
+ } else {
20
+ composed[key] = value;
21
+ }
22
+ }
23
+ }
24
+ }
25
+ return composed;
26
+ }
27
+
28
+ // src/plugin/manager.ts
29
+ function createLogger(pluginName) {
30
+ const prefix = `[${pluginName}]`;
31
+ return {
32
+ info: (msg) => console.log(`${prefix} ${msg}`),
33
+ warn: (msg) => console.warn(`${prefix} ${msg}`),
34
+ error: (msg) => console.error(`${prefix} ${msg}`),
35
+ debug: (msg) => {
36
+ if (process.env.DEBUG) {
37
+ console.debug(`${prefix} ${msg}`);
38
+ }
39
+ }
40
+ };
41
+ }
42
+ async function resolvePlugin(pluginConfig, cwd) {
43
+ let plugin;
44
+ let options = {};
45
+ if (typeof pluginConfig === "string") {
46
+ const module = await import(pluginConfig);
47
+ plugin = module.default || module;
48
+ } else if (Array.isArray(pluginConfig)) {
49
+ const [pluginOrName, pluginOptions] = pluginConfig;
50
+ options = pluginOptions;
51
+ if (typeof pluginOrName === "string") {
52
+ const module = await import(pluginOrName);
53
+ plugin = module.default || module;
54
+ } else {
55
+ plugin = pluginOrName;
56
+ }
57
+ } else {
58
+ plugin = pluginConfig;
59
+ }
60
+ if (typeof plugin === "function") {
61
+ plugin = plugin(options);
62
+ }
63
+ return { plugin, options };
64
+ }
65
+ var PluginManager = class {
66
+ plugins = /* @__PURE__ */ new Map();
67
+ context;
68
+ constructor(config, cwd, isDev) {
69
+ this.context = {
70
+ cwd,
71
+ isDev,
72
+ isProd: !isDev,
73
+ config,
74
+ logger: createLogger("PluginManager")
75
+ };
76
+ }
77
+ /**
78
+ * 加载并初始化所有插件
79
+ */
80
+ async loadPlugins(pluginConfigs) {
81
+ for (const pluginConfig of pluginConfigs) {
82
+ try {
83
+ const { plugin } = await resolvePlugin(pluginConfig, this.context.cwd);
84
+ if (this.plugins.has(plugin.name)) {
85
+ this.context.logger.warn(`\u63D2\u4EF6 ${plugin.name} \u5DF2\u52A0\u8F7D\uFF0C\u8DF3\u8FC7\u91CD\u590D\u52A0\u8F7D`);
86
+ continue;
87
+ }
88
+ const pluginContext = {
89
+ ...this.context,
90
+ logger: createLogger(plugin.name)
91
+ };
92
+ const hooks = await plugin.setup(pluginContext);
93
+ this.plugins.set(plugin.name, { plugin, hooks });
94
+ this.context.logger.info(`\u5DF2\u52A0\u8F7D\u63D2\u4EF6: ${plugin.name}`);
95
+ } catch (error) {
96
+ this.context.logger.error(
97
+ `\u52A0\u8F7D\u63D2\u4EF6\u5931\u8D25: ${String(pluginConfig)} - ${error}`
98
+ );
99
+ }
100
+ }
101
+ }
102
+ /**
103
+ * 执行 modifyRspackConfig 钩子
104
+ */
105
+ async applyRspackConfigHooks(config) {
106
+ let result = config;
107
+ for (const [name, { hooks }] of this.plugins) {
108
+ if (hooks.modifyRspackConfig) {
109
+ try {
110
+ const modified = await hooks.modifyRspackConfig(result, this.context);
111
+ if (modified) {
112
+ result = modified;
113
+ }
114
+ } catch (error) {
115
+ this.context.logger.error(
116
+ `\u63D2\u4EF6 ${name} modifyRspackConfig \u6267\u884C\u5931\u8D25: ${error}`
117
+ );
118
+ }
119
+ }
120
+ }
121
+ return result;
122
+ }
123
+ /**
124
+ * 执行 modifyRoutes 钩子
125
+ */
126
+ async applyRoutesHooks(routes) {
127
+ let result = routes;
128
+ for (const [name, { hooks }] of this.plugins) {
129
+ if (hooks.modifyRoutes) {
130
+ try {
131
+ const modified = await hooks.modifyRoutes(result, this.context);
132
+ if (modified) {
133
+ result = modified;
134
+ }
135
+ } catch (error) {
136
+ this.context.logger.error(
137
+ `\u63D2\u4EF6 ${name} modifyRoutes \u6267\u884C\u5931\u8D25: ${error}`
138
+ );
139
+ }
140
+ }
141
+ }
142
+ return result;
143
+ }
144
+ /**
145
+ * 执行 modifyAppConfig 钩子
146
+ */
147
+ applyAppConfigHooks(appConfig) {
148
+ let result = appConfig;
149
+ for (const [name, { hooks }] of this.plugins) {
150
+ if (hooks.modifyAppConfig) {
151
+ try {
152
+ const modified = hooks.modifyAppConfig(result, this.context);
153
+ if (modified) {
154
+ result = modified;
155
+ }
156
+ } catch (error) {
157
+ this.context.logger.error(
158
+ `\u63D2\u4EF6 ${name} modifyAppConfig \u6267\u884C\u5931\u8D25: ${error}`
159
+ );
160
+ }
161
+ }
162
+ }
163
+ return result;
164
+ }
165
+ /**
166
+ * 收集所有插件的 Provider
167
+ */
168
+ collectProviders() {
169
+ const providers = [];
170
+ for (const [name, { hooks }] of this.plugins) {
171
+ if (hooks.addProvider) {
172
+ try {
173
+ const result = hooks.addProvider(this.context);
174
+ if (Array.isArray(result)) {
175
+ providers.push(...result);
176
+ } else if (result) {
177
+ providers.push(result);
178
+ }
179
+ } catch (error) {
180
+ this.context.logger.error(
181
+ `\u63D2\u4EF6 ${name} addProvider \u6267\u884C\u5931\u8D25: ${error}`
182
+ );
183
+ }
184
+ }
185
+ }
186
+ return providers;
187
+ }
188
+ /**
189
+ * 执行 beforeBuild 钩子
190
+ */
191
+ async runBeforeBuild() {
192
+ for (const [name, { hooks }] of this.plugins) {
193
+ if (hooks.beforeBuild) {
194
+ try {
195
+ await hooks.beforeBuild(this.context);
196
+ } catch (error) {
197
+ this.context.logger.error(
198
+ `\u63D2\u4EF6 ${name} beforeBuild \u6267\u884C\u5931\u8D25: ${error}`
199
+ );
200
+ }
201
+ }
202
+ }
203
+ }
204
+ /**
205
+ * 执行 afterBuild 钩子
206
+ */
207
+ async runAfterBuild(stats) {
208
+ for (const [name, { hooks }] of this.plugins) {
209
+ if (hooks.afterBuild) {
210
+ try {
211
+ await hooks.afterBuild(this.context, stats);
212
+ } catch (error) {
213
+ this.context.logger.error(
214
+ `\u63D2\u4EF6 ${name} afterBuild \u6267\u884C\u5931\u8D25: ${error}`
215
+ );
216
+ }
217
+ }
218
+ }
219
+ }
220
+ /**
221
+ * 执行 beforeDevServer 钩子
222
+ */
223
+ async runBeforeDevServer() {
224
+ for (const [name, { hooks }] of this.plugins) {
225
+ if (hooks.beforeDevServer) {
226
+ try {
227
+ await hooks.beforeDevServer(this.context);
228
+ } catch (error) {
229
+ this.context.logger.error(
230
+ `\u63D2\u4EF6 ${name} beforeDevServer \u6267\u884C\u5931\u8D25: ${error}`
231
+ );
232
+ }
233
+ }
234
+ }
235
+ }
236
+ /**
237
+ * 执行 afterDevServer 钩子
238
+ */
239
+ async runAfterDevServer(server) {
240
+ for (const [name, { hooks }] of this.plugins) {
241
+ if (hooks.afterDevServer) {
242
+ try {
243
+ await hooks.afterDevServer(this.context, server);
244
+ } catch (error) {
245
+ this.context.logger.error(
246
+ `\u63D2\u4EF6 ${name} afterDevServer \u6267\u884C\u5931\u8D25: ${error}`
247
+ );
248
+ }
249
+ }
250
+ }
251
+ }
252
+ /**
253
+ * 获取所有已加载的插件名称
254
+ */
255
+ getPluginNames() {
256
+ return Array.from(this.plugins.keys());
257
+ }
258
+ /**
259
+ * 获取所有已加载的插件
260
+ */
261
+ getPlugins() {
262
+ return Array.from(this.plugins.values()).map((p) => p.plugin);
263
+ }
264
+ /**
265
+ * 获取所有已加载的插件钩子
266
+ */
267
+ getPluginHooks() {
268
+ return Array.from(this.plugins.values()).map((p) => p.hooks);
269
+ }
270
+ };
271
+ export {
272
+ PluginManager,
273
+ composeHooks,
274
+ createPlugin,
275
+ definePlugin
276
+ };
277
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/plugin/define.ts","../../src/plugin/manager.ts"],"sourcesContent":["import type { YwkfPlugin, PluginHooks, PluginContext } from \"./types.js\";\n\n/**\n * 定义插件的辅助函数\n * \n * @example\n * ```ts\n * export default definePlugin({\n * name: \"my-plugin\",\n * setup(context) {\n * return {\n * modifyRspackConfig(config) {\n * // 修改配置\n * return config;\n * },\n * };\n * },\n * });\n * ```\n */\nexport function definePlugin(plugin: YwkfPlugin): YwkfPlugin {\n return plugin;\n}\n\n/**\n * 创建带配置的插件工厂\n * \n * @example\n * ```ts\n * export default createPlugin<{ apiUrl: string }>((options) => ({\n * name: \"api-plugin\",\n * setup(context) {\n * console.log(\"API URL:\", options?.apiUrl);\n * return {};\n * },\n * }));\n * ```\n */\nexport function createPlugin<T = Record<string, unknown>>(\n factory: (options?: T) => YwkfPlugin\n): (options?: T) => YwkfPlugin {\n return factory;\n}\n\n/**\n * 组合多个插件钩子\n */\nexport function composeHooks(...hooksList: PluginHooks[]): PluginHooks {\n const composed: Record<string, Function> = {};\n\n for (const hooks of hooksList) {\n for (const [key, value] of Object.entries(hooks)) {\n if (value) {\n const existing = composed[key];\n if (existing) {\n composed[key] = async (...args: unknown[]) => {\n await existing(...args);\n return (value as Function)(...args);\n };\n } else {\n composed[key] = value as Function;\n }\n }\n }\n }\n\n return composed as PluginHooks;\n}\n","import type { Configuration as RspackConfig } from \"@rspack/core\";\nimport type { YwkfConfig } from \"../config/schema.js\";\nimport type { AppConfig, ProviderConfig } from \"../runtime/types.js\";\nimport type { RouteItem } from \"../router/types.js\";\nimport type {\n YwkfPlugin,\n PluginConfig,\n PluginContext,\n PluginHooks,\n PluginLogger,\n} from \"./types.js\";\n\n/**\n * 创建插件日志工具\n */\nfunction createLogger(pluginName: string): PluginLogger {\n const prefix = `[${pluginName}]`;\n\n return {\n info: (msg) => console.log(`${prefix} ${msg}`),\n warn: (msg) => console.warn(`${prefix} ${msg}`),\n error: (msg) => console.error(`${prefix} ${msg}`),\n debug: (msg) => {\n if (process.env.DEBUG) {\n console.debug(`${prefix} ${msg}`);\n }\n },\n };\n}\n\n/**\n * 解析插件配置\n */\nasync function resolvePlugin(\n pluginConfig: PluginConfig,\n cwd: string\n): Promise<{ plugin: YwkfPlugin; options: Record<string, unknown> }> {\n let plugin: YwkfPlugin;\n let options: Record<string, unknown> = {};\n\n if (typeof pluginConfig === \"string\") {\n // 字符串:插件包名\n const module = await import(pluginConfig);\n plugin = module.default || module;\n } else if (Array.isArray(pluginConfig)) {\n // 数组:[插件, 配置]\n const [pluginOrName, pluginOptions] = pluginConfig;\n options = pluginOptions;\n\n if (typeof pluginOrName === \"string\") {\n const module = await import(pluginOrName);\n plugin = module.default || module;\n } else {\n plugin = pluginOrName;\n }\n } else {\n // 插件对象\n plugin = pluginConfig;\n }\n\n // 如果是工厂函数,调用它\n if (typeof plugin === \"function\") {\n plugin = (plugin as (opts?: Record<string, unknown>) => YwkfPlugin)(options);\n }\n\n return { plugin, options };\n}\n\n/**\n * 插件管理器\n */\nexport class PluginManager {\n private plugins: Map<string, { plugin: YwkfPlugin; hooks: PluginHooks }> =\n new Map();\n private context: PluginContext;\n\n constructor(\n config: Required<YwkfConfig>,\n cwd: string,\n isDev: boolean\n ) {\n this.context = {\n cwd,\n isDev,\n isProd: !isDev,\n config,\n logger: createLogger(\"PluginManager\"),\n };\n }\n\n /**\n * 加载并初始化所有插件\n */\n async loadPlugins(pluginConfigs: PluginConfig[]): Promise<void> {\n for (const pluginConfig of pluginConfigs) {\n try {\n const { plugin } = await resolvePlugin(pluginConfig, this.context.cwd);\n\n if (this.plugins.has(plugin.name)) {\n this.context.logger.warn(`插件 ${plugin.name} 已加载,跳过重复加载`);\n continue;\n }\n\n // 创建插件专属 logger\n const pluginContext: PluginContext = {\n ...this.context,\n logger: createLogger(plugin.name),\n };\n\n // 调用插件 setup\n const hooks = await plugin.setup(pluginContext);\n\n this.plugins.set(plugin.name, { plugin, hooks });\n this.context.logger.info(`已加载插件: ${plugin.name}`);\n } catch (error) {\n this.context.logger.error(\n `加载插件失败: ${String(pluginConfig)} - ${error}`\n );\n }\n }\n }\n\n /**\n * 执行 modifyRspackConfig 钩子\n */\n async applyRspackConfigHooks(config: RspackConfig): Promise<RspackConfig> {\n let result = config;\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.modifyRspackConfig) {\n try {\n const modified = await hooks.modifyRspackConfig(result, this.context);\n if (modified) {\n result = modified;\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} modifyRspackConfig 执行失败: ${error}`\n );\n }\n }\n }\n\n return result;\n }\n\n /**\n * 执行 modifyRoutes 钩子\n */\n async applyRoutesHooks(routes: RouteItem[]): Promise<RouteItem[]> {\n let result = routes;\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.modifyRoutes) {\n try {\n const modified = await hooks.modifyRoutes(result, this.context);\n if (modified) {\n result = modified;\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} modifyRoutes 执行失败: ${error}`\n );\n }\n }\n }\n\n return result;\n }\n\n /**\n * 执行 modifyAppConfig 钩子\n */\n applyAppConfigHooks(appConfig: AppConfig): AppConfig {\n let result = appConfig;\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.modifyAppConfig) {\n try {\n const modified = hooks.modifyAppConfig(result, this.context);\n if (modified) {\n result = modified;\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} modifyAppConfig 执行失败: ${error}`\n );\n }\n }\n }\n\n return result;\n }\n\n /**\n * 收集所有插件的 Provider\n */\n collectProviders(): ProviderConfig[] {\n const providers: ProviderConfig[] = [];\n\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.addProvider) {\n try {\n const result = hooks.addProvider(this.context);\n if (Array.isArray(result)) {\n providers.push(...result);\n } else if (result) {\n providers.push(result);\n }\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} addProvider 执行失败: ${error}`\n );\n }\n }\n }\n\n return providers;\n }\n\n /**\n * 执行 beforeBuild 钩子\n */\n async runBeforeBuild(): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.beforeBuild) {\n try {\n await hooks.beforeBuild(this.context);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} beforeBuild 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 执行 afterBuild 钩子\n */\n async runAfterBuild(stats: {\n success: boolean;\n errors?: string[];\n }): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.afterBuild) {\n try {\n await hooks.afterBuild(this.context, stats);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} afterBuild 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 执行 beforeDevServer 钩子\n */\n async runBeforeDevServer(): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.beforeDevServer) {\n try {\n await hooks.beforeDevServer(this.context);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} beforeDevServer 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 执行 afterDevServer 钩子\n */\n async runAfterDevServer(server: {\n port: number;\n host: string;\n }): Promise<void> {\n for (const [name, { hooks }] of this.plugins) {\n if (hooks.afterDevServer) {\n try {\n await hooks.afterDevServer(this.context, server);\n } catch (error) {\n this.context.logger.error(\n `插件 ${name} afterDevServer 执行失败: ${error}`\n );\n }\n }\n }\n }\n\n /**\n * 获取所有已加载的插件名称\n */\n getPluginNames(): string[] {\n return Array.from(this.plugins.keys());\n }\n\n /**\n * 获取所有已加载的插件\n */\n getPlugins(): YwkfPlugin[] {\n return Array.from(this.plugins.values()).map((p) => p.plugin);\n }\n\n /**\n * 获取所有已加载的插件钩子\n */\n getPluginHooks(): PluginHooks[] {\n return Array.from(this.plugins.values()).map((p) => p.hooks);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,126 @@
1
+ import { Compiler } from '@rspack/core';
2
+
3
+ /**
4
+ * 路由节点配置
5
+ */
6
+ interface RouteConfig {
7
+ /** 路由路径 */
8
+ path: string;
9
+ /** 页面文件(page.tsx)相对路径 */
10
+ file?: string;
11
+ /** 布局文件(layout.tsx)相对路径 */
12
+ layoutFile?: string;
13
+ /** 错误边界文件(error.tsx)相对路径 */
14
+ errorFile?: string;
15
+ /** 加载状态文件(loading.tsx)相对路径 */
16
+ loadingFile?: string;
17
+ /** 通配路由文件($.tsx)相对路径 */
18
+ catchAllFile?: string;
19
+ /** 组件名称 */
20
+ name: string;
21
+ /** 子路由 */
22
+ children?: RouteConfig[];
23
+ /** 是否为 index 路由 */
24
+ index?: boolean;
25
+ /** 是否为布局路由 */
26
+ isLayout?: boolean;
27
+ /** 是否为无路径布局(__prefix) */
28
+ pathless?: boolean;
29
+ }
30
+ interface GeneratorOptions {
31
+ /** 页面目录 */
32
+ pagesDir: string;
33
+ /** 输出目录 */
34
+ outputDir: string;
35
+ /** 路由 basename */
36
+ basename?: string;
37
+ }
38
+ /**
39
+ * Modern.js 风格约定式路由生成器
40
+ *
41
+ * 文件约定:
42
+ * - page.tsx — 页面内容(叶子组件)
43
+ * - layout.tsx — 布局组件(使用 <Outlet> 渲染子路由)
44
+ * - error.tsx — 错误边界组件
45
+ * - loading.tsx — 加载状态组件
46
+ * - $.tsx — 通配/404 路由
47
+ *
48
+ * 目录约定:
49
+ * - [id]/ — 动态路由 → /:id
50
+ * - [id$]/ — 可选动态路由 → /:id?
51
+ * - [...slug]/ — 全匹配路由 → /*
52
+ * - __auth/ — 无路径布局(不生成 URL 片段)
53
+ * - user.profile/ — 扁平路由(. 分隔 → /user/profile)
54
+ */
55
+ declare class ConventionalRouteGenerator {
56
+ private options;
57
+ constructor(options: GeneratorOptions);
58
+ generate(): RouteConfig[];
59
+ /**
60
+ * 扫描目录,生成路由树
61
+ */
62
+ private scanDirectory;
63
+ /**
64
+ * 解析目录名到路由路径
65
+ *
66
+ * - [id] → :id
67
+ * - [id$] → :id?
68
+ * - [...slug] → *
69
+ * - user.profile → user/profile
70
+ */
71
+ private resolveRoutePath;
72
+ /**
73
+ * 生成有效的 JS 标识符名称
74
+ */
75
+ private generateRouteName;
76
+ generateCode(): string;
77
+ private collectImports;
78
+ private emitRouteArray;
79
+ private emitRouteObject;
80
+ /**
81
+ * 写入路由文件
82
+ */
83
+ write(): void;
84
+ }
85
+ /**
86
+ * 生成约定式路由
87
+ */
88
+ declare function generateConventionalRoutes(options: GeneratorOptions): void;
89
+
90
+ interface ConventionalRoutePluginOptions {
91
+ /** 页面目录 */
92
+ pagesDir: string;
93
+ /** 输出目录 */
94
+ outputDir: string;
95
+ /** 路由 basename */
96
+ basename?: string;
97
+ /** 是否监听文件变化(开发模式) */
98
+ watch?: boolean;
99
+ }
100
+ /**
101
+ * 约定式路由 Rspack 插件
102
+ *
103
+ * 在编译开始前扫描 src/pages 目录,生成 .ywkf/routes.tsx
104
+ */
105
+ declare class ConventionalRoutePlugin {
106
+ private options;
107
+ private isWatching;
108
+ private hasGenerated;
109
+ private lastGeneratedContent;
110
+ constructor(options: ConventionalRoutePluginOptions);
111
+ apply(compiler: Compiler): void;
112
+ /**
113
+ * 生成路由文件(带内容比对,避免不必要的重复生成)
114
+ */
115
+ private generateRoutes;
116
+ /**
117
+ * 标准化内容(去掉时间戳等动态部分)
118
+ */
119
+ private normalizeContent;
120
+ /**
121
+ * 监听页面目录变化
122
+ */
123
+ private watchPages;
124
+ }
125
+
126
+ export { ConventionalRouteGenerator, ConventionalRoutePlugin, type ConventionalRoutePluginOptions, type GeneratorOptions, type RouteConfig, generateConventionalRoutes };