@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.
- package/dist/cli/index.js +2180 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/index.d.ts +37 -0
- package/dist/config/index.js +143 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +496 -6
- package/dist/index.js +3671 -49
- package/dist/index.js.map +1 -0
- package/dist/plugin/index.d.ts +110 -0
- package/dist/plugin/index.js +277 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/router/index.d.ts +126 -0
- package/dist/router/index.js +390 -0
- package/dist/router/index.js.map +1 -0
- package/dist/rspack/index.d.ts +29 -0
- package/dist/rspack/index.js +1574 -0
- package/dist/rspack/index.js.map +1 -0
- package/dist/runtime/index.d.ts +120 -0
- package/dist/runtime/index.js +406 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/schema-BuqmN_ra.d.ts +390 -0
- package/dist/types-BZV_2QtD.d.ts +97 -0
- package/package.json +88 -37
- package/README.md +0 -3
- package/compiled/dotenv/LICENSE +0 -23
- package/compiled/dotenv/index.js +0 -1
- package/compiled/dotenv/lib/main.d.ts +0 -73
- package/compiled/dotenv/package.json +0 -1
- package/compiled/dotenv/types/index.d.ts +0 -59
- package/compiled/dotenv-expand/LICENSE +0 -24
- package/compiled/dotenv-expand/index.js +0 -1
- package/compiled/dotenv-expand/lib/main.d.ts +0 -29
- package/compiled/dotenv-expand/package.json +0 -1
- package/compiled/just-diff/LICENSE +0 -21
- package/compiled/just-diff/index.d.ts +0 -20
- package/compiled/just-diff/index.js +0 -1
- package/compiled/just-diff/package.json +0 -1
- package/dist/config/config.d.ts +0 -62
- package/dist/config/config.js +0 -240
- package/dist/config/utils.d.ts +0 -8
- package/dist/config/utils.js +0 -40
- package/dist/constants.d.ts +0 -9
- package/dist/constants.js +0 -45
- package/dist/route/defineRoutes.d.ts +0 -1
- package/dist/route/defineRoutes.js +0 -61
- package/dist/route/route.d.ts +0 -3
- package/dist/route/route.js +0 -27
- package/dist/route/routeUtils.d.ts +0 -8
- package/dist/route/routeUtils.js +0 -46
- package/dist/route/routesConfig.d.ts +0 -6
- package/dist/route/routesConfig.js +0 -125
- package/dist/route/routesConvention.d.ts +0 -5
- package/dist/route/routesConvention.js +0 -88
- package/dist/route/utils.d.ts +0 -8
- package/dist/route/utils.js +0 -59
- package/dist/service/command.d.ts +0 -30
- package/dist/service/command.js +0 -39
- package/dist/service/env.d.ts +0 -4
- package/dist/service/env.js +0 -47
- package/dist/service/generatePlugin.d.ts +0 -4
- package/dist/service/generatePlugin.js +0 -102
- package/dist/service/generator.d.ts +0 -71
- package/dist/service/generator.js +0 -40
- package/dist/service/hook.d.ts +0 -16
- package/dist/service/hook.js +0 -52
- package/dist/service/path.d.ts +0 -15
- package/dist/service/path.js +0 -55
- package/dist/service/plugin.d.ts +0 -61
- package/dist/service/plugin.js +0 -174
- package/dist/service/pluginAPI.d.ts +0 -49
- package/dist/service/pluginAPI.js +0 -233
- package/dist/service/service.d.ts +0 -147
- package/dist/service/service.js +0 -544
- package/dist/service/servicePlugin.d.ts +0 -3
- package/dist/service/servicePlugin.js +0 -37
- package/dist/service/telemetry.d.ts +0 -32
- package/dist/service/telemetry.js +0 -127
- package/dist/service/utils.d.ts +0 -2
- package/dist/service/utils.js +0 -36
- package/dist/types.d.ts +0 -116
- 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 };
|