@lark-apaas/fullstack-rspack-preset 1.0.58-alpha.1 → 1.0.58-beta.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.
package/lib/preset.js CHANGED
@@ -23,6 +23,7 @@ const static_assets_plugin_1 = __importDefault(require("./rspack-plugins/static-
23
23
  const source_map_upload_plugin_1 = __importDefault(require("./rspack-plugins/source-map-upload-plugin"));
24
24
  const capabilities_plugin_1 = require("./rspack-plugins/capabilities-plugin");
25
25
  const dev_server_snapdom_proxy_1 = require("./utils/dev-server-snapdom-proxy");
26
+ const dev_server_health_1 = require("./utils/dev-server-health");
26
27
  function sendBackendUnavailable502(_err, _req, res) {
27
28
  if (res.headersSent)
28
29
  return;
@@ -518,6 +519,7 @@ function createRecommendRspackConfig(options) {
518
519
  // 开发环境下提供 shared/static 文件服务,对齐 Vite preset 的 configureServer 中间件
519
520
  devServer.app.use(staticAssetsPlugin.createDevMiddleware());
520
521
  (0, dev_server_snapdom_proxy_1.registerSnapDomProxyMiddleware)(devServer.app, { baseUrl: clientBasePath });
522
+ (0, dev_server_health_1.registerHealthCheckMiddleware)(devServer.app, { httpServer: devServer.server });
521
523
  (0, devtool_kits_1.registerMiddlewares)(devServer.app, [
522
524
  (0, devtool_kits_1.createDevLogsMiddleware)({ logDir: process.env.LOG_DIR || './logs' }),
523
525
  (0, devtool_kits_1.createOpenapiMiddleware)({
@@ -10,7 +10,6 @@
10
10
  * 替换后的字符串里没有 process.env.X 形式,DefinePlugin 不会再二次替换。
11
11
  */
12
12
  module.exports = function basenameInjectionLoader(source) {
13
- console.log(`[BasenameInjectionLoader] processing: ${this.resourcePath}`);
14
13
  const options = (typeof this.getOptions === 'function' ? this.getOptions() : this.query) || {};
15
14
  const envBasePath = options.envBasePath || '';
16
15
  if (typeof source !== 'string' || !source.includes('process.env.CLIENT_BASE_PATH')) {
@@ -83,17 +83,14 @@ class BasenameInjectionPlugin {
83
83
  apply(compiler) {
84
84
  const loaderPath = path_1.default.resolve(__dirname, './basename-injection-loader.js');
85
85
  const envBasePath = this.envBasePath;
86
- // afterEnvironment hook:所有配置(包括 extends、merge)已完成,
87
- // compiler.options.entry compiler.options.module 都是最终值。
88
- compiler.hooks.afterEnvironment.tap(PLUGIN_NAME, () => {
89
- const context = compiler.options.context || process.cwd();
90
- const entry = compiler.options.entry;
91
- // 从已解析的 entry 提取业务入口文件路径
86
+ // entryOption hook:配置已完全解析合并(包括异步 entry 函数的返回值),
87
+ // 是读 entry 最安全的时机。参考 RuntimeInjectionPlugin 的做法。
88
+ compiler.hooks.entryOption.tap(PLUGIN_NAME, (context, entry) => {
89
+ // 动态 entry(函数形式)无法在此阶段解析,兜底到默认正则
92
90
  const entryFiles = (typeof entry !== 'function')
93
91
  ? resolveEntryFiles(entry, context)
94
92
  : [];
95
93
  const entryTest = buildEntryTest(entryFiles);
96
- console.log(`[${PLUGIN_NAME}] entryTest: ${entryTest}, entryFiles: ${JSON.stringify(entryFiles)}, loaderPath: ${loaderPath}`);
97
94
  if (!compiler.options.module) {
98
95
  compiler.options.module = { rules: [] };
99
96
  }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * 给妙搭沙箱外壳提供统一的 health endpoint。
3
+ *
4
+ * 协议(飞书文档 - 妙搭应用 Health Check 接口规范,对齐
5
+ * `@lark-apaas/coding-preset-vite-react` 的 healthMiddlewarePlugin):
6
+ * - HTTP connection refused / timeout → dev server 没起来 → 外壳重启沙箱
7
+ * - 200 + { ready: true } → 应用已就绪
8
+ * - 200 + { ready: false } → 还在启动
9
+ *
10
+ * 不归本接口管:
11
+ * - compile error / runtime error / 资源加载失败 → 浏览器侧自己上报
12
+ */
13
+ export declare const HEALTH_ENDPOINT = "/dev/health";
14
+ /**
15
+ * dev server 底层 http(s) server 的最小结构(http.Server / https.Server 均满足)
16
+ */
17
+ export interface ListenableServer {
18
+ listening: boolean;
19
+ once(event: 'listening', listener: () => void): unknown;
20
+ }
21
+ interface HealthCheckMiddlewareOptions {
22
+ /**
23
+ * dev server 的 http server;不传视为已就绪。
24
+ *
25
+ * 外部假设:@rspack/dev-server(webpack-dev-server v5 系排序)在
26
+ * setupMiddlewares 回调时 createServer() 已执行,devServer.server 可用且未
27
+ * listening。若宿主 dev-server 实现排序不同导致拿不到 server,则退化为
28
+ * ready 恒 true——请求只有 listen 后才进得来,协议语义仍成立。
29
+ */
30
+ httpServer?: ListenableServer | null;
31
+ }
32
+ export declare function registerHealthCheckMiddleware(serverApp: any, options?: HealthCheckMiddlewareOptions): void;
33
+ export {};
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.HEALTH_ENDPOINT = void 0;
5
+ exports.registerHealthCheckMiddleware = registerHealthCheckMiddleware;
6
+ /**
7
+ * 给妙搭沙箱外壳提供统一的 health endpoint。
8
+ *
9
+ * 协议(飞书文档 - 妙搭应用 Health Check 接口规范,对齐
10
+ * `@lark-apaas/coding-preset-vite-react` 的 healthMiddlewarePlugin):
11
+ * - HTTP connection refused / timeout → dev server 没起来 → 外壳重启沙箱
12
+ * - 200 + { ready: true } → 应用已就绪
13
+ * - 200 + { ready: false } → 还在启动
14
+ *
15
+ * 不归本接口管:
16
+ * - compile error / runtime error / 资源加载失败 → 浏览器侧自己上报
17
+ */
18
+ exports.HEALTH_ENDPOINT = '/dev/health';
19
+ function registerHealthCheckMiddleware(serverApp, options = {}) {
20
+ const { httpServer } = options;
21
+ let ready = false;
22
+ // 三种状态:
23
+ // - 无 httpServer → 认为已就绪
24
+ // - httpServer.listening 已 true → 已就绪
25
+ // - 否则注册一次 listening 回调
26
+ if (!httpServer || httpServer.listening) {
27
+ ready = true;
28
+ }
29
+ else {
30
+ httpServer.once('listening', () => {
31
+ ready = true;
32
+ });
33
+ }
34
+ // 沙箱外壳探测的是固定根路径 /dev/health,不跟 clientBasePath 走
35
+ // req: import('express').Request
36
+ // res: import('express').Response
37
+ serverApp.get(exports.HEALTH_ENDPOINT, (_req, res) => {
38
+ res.setHeader('Cache-Control', 'no-store');
39
+ res.status(200).json({ ready });
40
+ });
41
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/fullstack-rspack-preset",
3
- "version": "1.0.58-alpha.1",
3
+ "version": "1.0.58-beta.1",
4
4
  "files": [
5
5
  "lib",
6
6
  "patches",