@lark-apaas/coding-html-devserver 0.1.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 (73) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +54 -0
  3. package/bin/coding-html-devserver.js +2 -0
  4. package/lib/build.d.ts +23 -0
  5. package/lib/build.d.ts.map +1 -0
  6. package/lib/build.js +50 -0
  7. package/lib/build.js.map +1 -0
  8. package/lib/cli.d.ts +2 -0
  9. package/lib/cli.d.ts.map +1 -0
  10. package/lib/cli.js +46 -0
  11. package/lib/cli.js.map +1 -0
  12. package/lib/dev.d.ts +8 -0
  13. package/lib/dev.d.ts.map +1 -0
  14. package/lib/dev.js +23 -0
  15. package/lib/dev.js.map +1 -0
  16. package/lib/flags.d.ts +10 -0
  17. package/lib/flags.d.ts.map +1 -0
  18. package/lib/flags.js +31 -0
  19. package/lib/flags.js.map +1 -0
  20. package/lib/html-tags.d.ts +25 -0
  21. package/lib/html-tags.d.ts.map +1 -0
  22. package/lib/html-tags.js +122 -0
  23. package/lib/html-tags.js.map +1 -0
  24. package/lib/index.d.ts +24 -0
  25. package/lib/index.d.ts.map +1 -0
  26. package/lib/index.js +37 -0
  27. package/lib/index.js.map +1 -0
  28. package/lib/minify.d.ts +11 -0
  29. package/lib/minify.d.ts.map +1 -0
  30. package/lib/minify.js +32 -0
  31. package/lib/minify.js.map +1 -0
  32. package/lib/plugins/health.d.ts +10 -0
  33. package/lib/plugins/health.d.ts.map +1 -0
  34. package/lib/plugins/health.js +38 -0
  35. package/lib/plugins/health.js.map +1 -0
  36. package/lib/plugins/inject.d.ts +15 -0
  37. package/lib/plugins/inject.d.ts.map +1 -0
  38. package/lib/plugins/inject.js +34 -0
  39. package/lib/plugins/inject.js.map +1 -0
  40. package/lib/plugins/vite-client-patch.d.ts +4 -0
  41. package/lib/plugins/vite-client-patch.d.ts.map +1 -0
  42. package/lib/plugins/vite-client-patch.js +55 -0
  43. package/lib/plugins/vite-client-patch.js.map +1 -0
  44. package/lib/plugins/ws-watchdog.d.ts +25 -0
  45. package/lib/plugins/ws-watchdog.d.ts.map +1 -0
  46. package/lib/plugins/ws-watchdog.js +103 -0
  47. package/lib/plugins/ws-watchdog.js.map +1 -0
  48. package/lib/transform/index.d.ts +38 -0
  49. package/lib/transform/index.d.ts.map +1 -0
  50. package/lib/transform/index.js +45 -0
  51. package/lib/transform/index.js.map +1 -0
  52. package/lib/transform/og-meta.d.ts +18 -0
  53. package/lib/transform/og-meta.d.ts.map +1 -0
  54. package/lib/transform/og-meta.js +54 -0
  55. package/lib/transform/og-meta.js.map +1 -0
  56. package/lib/transform/preview-bridge.d.ts +11 -0
  57. package/lib/transform/preview-bridge.d.ts.map +1 -0
  58. package/lib/transform/preview-bridge.js +16 -0
  59. package/lib/transform/preview-bridge.js.map +1 -0
  60. package/lib/transform/slardar.d.ts +17 -0
  61. package/lib/transform/slardar.d.ts.map +1 -0
  62. package/lib/transform/slardar.js +116 -0
  63. package/lib/transform/slardar.js.map +1 -0
  64. package/lib/transform/view-context.d.ts +27 -0
  65. package/lib/transform/view-context.d.ts.map +1 -0
  66. package/lib/transform/view-context.js +120 -0
  67. package/lib/transform/view-context.js.map +1 -0
  68. package/lib/vite-config.d.ts +24 -0
  69. package/lib/vite-config.d.ts.map +1 -0
  70. package/lib/vite-config.js +74 -0
  71. package/lib/vite-config.js.map +1 -0
  72. package/package.json +46 -0
  73. package/src/runtime/ws-watchdog-client.mjs +148 -0
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HEALTH_ENDPOINT = void 0;
4
+ exports.healthPlugin = healthPlugin;
5
+ /**
6
+ * 妙搭沙箱外壳探活接口。协议对齐 `@lark-apaas/coding-preset-vite-react`:
7
+ * - connection refused / timeout → dev server 没起来 → 外壳重启沙箱
8
+ * - 200 + { ready: true } → 应用已就绪
9
+ * - 200 + { ready: false } → 还在启动
10
+ */
11
+ exports.HEALTH_ENDPOINT = '/dev/health';
12
+ function healthPlugin() {
13
+ let ready = false;
14
+ return {
15
+ name: 'miaoda-html-health',
16
+ apply: 'serve',
17
+ configureServer(server) {
18
+ const httpServer = server.httpServer;
19
+ if (!httpServer || httpServer.listening) {
20
+ ready = true;
21
+ }
22
+ else {
23
+ httpServer.once('listening', () => {
24
+ ready = true;
25
+ });
26
+ }
27
+ server.middlewares.use(exports.HEALTH_ENDPOINT, (req, res, next) => {
28
+ if (req.method && req.method !== 'GET')
29
+ return next();
30
+ res.setHeader('Content-Type', 'application/json');
31
+ res.setHeader('Cache-Control', 'no-store');
32
+ res.statusCode = 200;
33
+ res.end(JSON.stringify({ ready }));
34
+ });
35
+ },
36
+ };
37
+ }
38
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/plugins/health.ts"],"names":[],"mappings":";;;AAUA,oCAuBC;AA/BD;;;;;GAKG;AACU,QAAA,eAAe,GAAG,aAAa,CAAC;AAE7C,SAAgB,YAAY;IAC1B,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,OAAO;QACd,eAAe,CAAC,MAAqB;YACnC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YACrC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBACxC,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;oBAChC,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,uBAAe,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACzD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK;oBAAE,OAAO,IAAI,EAAE,CAAC;gBACtD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;gBAC3C,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Plugin } from 'vite';
2
+ export interface PlatformInjectPluginOptions {
3
+ /** appId override,透传给 view-context(dev 拼真值字面量)。 */
4
+ appId?: string;
5
+ }
6
+ /**
7
+ * dev 阶段的平台注入:走 vite 原生 `transformIndexHtml`,调用与 build 共享的
8
+ * `injectPlatformTags`(唯一注入实现)。用户不感知;源 `index.html` 保持纯净。
9
+ *
10
+ * 另挂前置 middleware:每个请求把 view-context(解析 suda-webuser header / cookie)
11
+ * 绑到 AsyncLocalStorage,`transformIndexHtml` 在同一异步链里读出,dev 预览拿到真实
12
+ * 租户/用户上下文(沙箱网关把 `x-larkgw-suda-webuser` 透传给 devserver)。
13
+ */
14
+ export declare function platformInjectPlugin(options?: PlatformInjectPluginOptions): Plugin;
15
+ //# sourceMappingURL=inject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.d.ts","sourceRoot":"","sources":["../../src/plugins/inject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,MAAM,WAAW,2BAA2B;IAC1C,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,2BAAgC,GAAG,MAAM,CAqBtF"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.platformInjectPlugin = platformInjectPlugin;
4
+ const transform_1 = require("../transform");
5
+ const view_context_1 = require("../transform/view-context");
6
+ /**
7
+ * dev 阶段的平台注入:走 vite 原生 `transformIndexHtml`,调用与 build 共享的
8
+ * `injectPlatformTags`(唯一注入实现)。用户不感知;源 `index.html` 保持纯净。
9
+ *
10
+ * 另挂前置 middleware:每个请求把 view-context(解析 suda-webuser header / cookie)
11
+ * 绑到 AsyncLocalStorage,`transformIndexHtml` 在同一异步链里读出,dev 预览拿到真实
12
+ * 租户/用户上下文(沙箱网关把 `x-larkgw-suda-webuser` 透传给 devserver)。
13
+ */
14
+ function platformInjectPlugin(options = {}) {
15
+ return {
16
+ name: 'miaoda-html-platform-inject',
17
+ apply: 'serve',
18
+ configureServer(server) {
19
+ server.middlewares.use((req, _res, next) => {
20
+ const ctx = (0, view_context_1.buildRenderContext)(req);
21
+ view_context_1.requestContext.run(ctx, () => next());
22
+ });
23
+ },
24
+ transformIndexHtml(html) {
25
+ // dev:用请求上下文(无则 fallback);build 不走本插件,由 buildStatic 默认 build 模式注入。
26
+ return (0, transform_1.injectPlatformTags)(html, {
27
+ mode: 'dev',
28
+ viewCtx: view_context_1.requestContext.getStore(),
29
+ appId: options.appId,
30
+ });
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=inject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.js","sourceRoot":"","sources":["../../src/plugins/inject.ts"],"names":[],"mappings":";;AAiBA,oDAqBC;AArCD,4CAAkD;AAClD,4DAA+E;AAO/E;;;;;;;GAOG;AACH,SAAgB,oBAAoB,CAAC,UAAuC,EAAE;IAC5E,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,KAAK,EAAE,OAAO;QAEd,eAAe,CAAC,MAAM;YACpB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;gBACzC,MAAM,GAAG,GAAG,IAAA,iCAAkB,EAAC,GAAG,CAAC,CAAC;gBACpC,6BAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,kBAAkB,CAAC,IAAY;YAC7B,mEAAmE;YACnE,OAAO,IAAA,8BAAkB,EAAC,IAAI,EAAE;gBAC9B,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,6BAAc,CAAC,QAAQ,EAAE;gBAClC,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from 'vite';
2
+ export declare function viteClientPatchPlugin(): Plugin;
3
+ export default viteClientPatchPlugin;
4
+ //# sourceMappingURL=vite-client-patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-client-patch.d.ts","sourceRoot":"","sources":["../../src/plugins/vite-client-patch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAqBnC,wBAAgB,qBAAqB,IAAI,MAAM,CAyC9C;AAED,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.viteClientPatchPlugin = viteClientPatchPlugin;
4
+ /**
5
+ * 抑制 `@vite/client` 在 HMR WS 重连成功后的 `location.reload()`。
6
+ *
7
+ * 背景(沙箱反向代理场景):电脑休眠唤醒后 WS 断连重连。Vite 客户端走
8
+ * `waitForSuccessfulPing()` 用新 TCP 连接握手成功,立刻发 `location.reload()`;
9
+ * 但 reload 用的是浏览器 HTTP/2 连接池里复用的休眠前死连接,
10
+ * 导致 ~18s `ERR_CONNECTION_TIMED_OUT` 白屏。
11
+ *
12
+ * 解:transform 拦截 `vite/dist/client/client.mjs`,直接删掉 reload 那一行。
13
+ * 用户需要新代码时手动刷新。
14
+ *
15
+ * 仅 dev(`apply: 'serve'`)。
16
+ *
17
+ * 行为对齐 `@lark-apaas/coding-preset-vite-react` 的同名插件 —— html stack 跑在
18
+ * 同一套沙箱反代链路里,重连白屏与 WS 鉴权两个问题同样成立。
19
+ */
20
+ const RECONNECT_RELOAD_PATTERN = /(await waitForSuccessfulPing\(url\.href\);)\r?\n(\s*)location\.reload\(\);/;
21
+ function viteClientPatchPlugin() {
22
+ return {
23
+ name: 'miaoda-html-vite-client-patch',
24
+ enforce: 'post',
25
+ apply: 'serve',
26
+ transform(code, id) {
27
+ if (!id.includes('vite/dist/client/client.mjs'))
28
+ return;
29
+ let patched = code;
30
+ // patch 1: 删掉 WS 重连后的 location.reload()
31
+ if (RECONNECT_RELOAD_PATTERN.test(patched)) {
32
+ patched = patched.replace(RECONNECT_RELOAD_PATTERN, (_, pingLine) => pingLine);
33
+ }
34
+ else {
35
+ console.warn('[miaoda-html-vite-client-patch] reconnect-reload pattern not found in @vite/client. ' +
36
+ 'patch NOT applied — Vite client.mjs may have changed.');
37
+ }
38
+ // patch 2: HMR 长链追加沙箱鉴权 token(gated on MIAODA_HMR_WS_TOKEN)
39
+ const wsAuthToken = process.env.MIAODA_HMR_WS_TOKEN;
40
+ if (wsAuthToken) {
41
+ if (patched.includes('?token=${wsToken}')) {
42
+ const encoded = encodeURIComponent(wsAuthToken);
43
+ patched = patched.replace(/\?token=\$\{wsToken\}/g, () => `?token=\${wsToken}&sandbox_token=${encoded}`);
44
+ }
45
+ else {
46
+ console.warn('[miaoda-html-vite-client-patch] WS url pattern `?token=${wsToken}` not found; ' +
47
+ 'sandbox_token NOT injected — Vite client.mjs may have changed.');
48
+ }
49
+ }
50
+ return patched === code ? undefined : { code: patched };
51
+ },
52
+ };
53
+ }
54
+ exports.default = viteClientPatchPlugin;
55
+ //# sourceMappingURL=vite-client-patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite-client-patch.js","sourceRoot":"","sources":["../../src/plugins/vite-client-patch.ts"],"names":[],"mappings":";;AAqBA,sDAyCC;AA5DD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,wBAAwB,GAC5B,4EAA4E,CAAC;AAE/E,SAAgB,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,+BAA+B;QACrC,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,OAAO;QAEd,SAAS,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;gBAAE,OAAO;YAExD,IAAI,OAAO,GAAG,IAAI,CAAC;YAEnB,wCAAwC;YACxC,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,sFAAsF;oBACpF,uDAAuD,CAC1D,CAAC;YACJ,CAAC;YAED,4DAA4D;YAC5D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YACpD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAC1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;oBAChD,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,wBAAwB,EACxB,GAAG,EAAE,CAAC,oCAAoC,OAAO,EAAE,CACpD,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CACV,gFAAgF;wBAC9E,gEAAgE,CACnE,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,qBAAqB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { Plugin } from 'vite';
2
+ /**
3
+ * 检测沙箱代理链路下的 WebSocket 僵尸连接。
4
+ *
5
+ * 客户端 5s ping 一次(通过 vite hot.send),连续 2 次拿不到 pong 判死,
6
+ * 向 parent window 发 `postMessage({ type: 'disconnected' })` 通知沙箱外壳。
7
+ *
8
+ * 仅 dev 期生效(`apply: 'serve'`);本地裸 dev 也开,不会有副作用——
9
+ * parent 不是沙箱时 postMessage 无消费者,自然丢弃。
10
+ *
11
+ * 行为对齐 `@lark-apaas/coding-preset-vite-react` 的同名插件。
12
+ */
13
+ export interface WsWatchdogPluginOptions {
14
+ pingEvent?: string;
15
+ pongEvent?: string;
16
+ /**
17
+ * 客户端 base path(如 `/app/app_xxx`)。沙箱网关把完整路径透传给 Vite,
18
+ * middleware 匹配和注入的 `<script src>` 都必须带 base;空串退化到裸路径。
19
+ * html stack 默认不设 base(网关剥前缀),所以通常留空。
20
+ */
21
+ clientBasePath?: string;
22
+ }
23
+ export declare function wsWatchdogPlugin(options?: WsWatchdogPluginOptions): Plugin;
24
+ export default wsWatchdogPlugin;
25
+ //# sourceMappingURL=ws-watchdog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-watchdog.d.ts","sourceRoot":"","sources":["../../src/plugins/ws-watchdog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,MAAM,CAAC;AAItD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAUD,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,MAAM,CA6D9E;AAED,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.wsWatchdogPlugin = wsWatchdogPlugin;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const CLIENT_RUNTIME_PATH = '/@ws-watchdog.js';
40
+ function resolveClientRuntimePath() {
41
+ const candidates = [
42
+ path.resolve(__dirname, '../../src/runtime/ws-watchdog-client.mjs'), // lib/plugins → src/runtime
43
+ path.resolve(__dirname, '../runtime/ws-watchdog-client.mjs'), // src/plugins → src/runtime
44
+ ];
45
+ return candidates.find((p) => fs.existsSync(p)) ?? null;
46
+ }
47
+ function wsWatchdogPlugin(options = {}) {
48
+ const { pingEvent = 'ws-watchdog:ping', pongEvent = 'ws-watchdog:pong', clientBasePath = '', } = options;
49
+ const watchdogPath = clientBasePath + CLIENT_RUNTIME_PATH;
50
+ return {
51
+ name: 'miaoda-html-ws-watchdog',
52
+ apply: 'serve',
53
+ configureServer(server) {
54
+ server.ws.on(pingEvent, (data, client) => {
55
+ if (typeof data?.t !== 'number')
56
+ return;
57
+ client.send(pongEvent, { echo: data.t });
58
+ });
59
+ // 直出 plain .mjs,跳过 server.transformRequest;no-cache 让升降级即时生效
60
+ server.middlewares.use((req, res, next) => {
61
+ if (req.url !== watchdogPath)
62
+ return next();
63
+ const clientPath = resolveClientRuntimePath();
64
+ if (!clientPath) {
65
+ res.statusCode = 500;
66
+ res.end('// ws-watchdog client not found');
67
+ return;
68
+ }
69
+ try {
70
+ let code = fs.readFileSync(clientPath, 'utf-8');
71
+ const env = {
72
+ 'process.env.FORCE_FRAMEWORK_DOMAIN_MAIN': JSON.stringify(process.env.FORCE_FRAMEWORK_DOMAIN_MAIN ?? ''),
73
+ 'process.env.CLIENT_BASE_PATH': JSON.stringify(clientBasePath),
74
+ };
75
+ for (const [k, v] of Object.entries(env)) {
76
+ code = code.replace(new RegExp(k.replace(/\./g, '\\.'), 'g'), v);
77
+ }
78
+ res.setHeader('Content-Type', 'application/javascript');
79
+ res.setHeader('Cache-Control', 'no-cache');
80
+ res.end(code);
81
+ }
82
+ catch (e) {
83
+ console.error('[miaoda-html-ws-watchdog] serve failed:', e);
84
+ res.statusCode = 500;
85
+ res.end(`// error: ${e instanceof Error ? e.message : String(e)}`);
86
+ }
87
+ });
88
+ },
89
+ transformIndexHtml() {
90
+ const tags = [
91
+ {
92
+ tag: 'script',
93
+ attrs: { type: 'module', src: watchdogPath },
94
+ // head-prepend:尽早注入,避免业务代码先和外壳完成握手才出 watchdog
95
+ injectTo: 'head-prepend',
96
+ },
97
+ ];
98
+ return tags;
99
+ },
100
+ };
101
+ }
102
+ exports.default = wsWatchdogPlugin;
103
+ //# sourceMappingURL=ws-watchdog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-watchdog.js","sourceRoot":"","sources":["../../src/plugins/ws-watchdog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type HtmlTagDescriptor } from '../html-tags';
2
+ import { type RequestRenderContext } from './view-context';
3
+ import { type SlardarOptions } from './slardar';
4
+ import { type OgMetaOptions } from './og-meta';
5
+ /**
6
+ * 平台 HTML 注入的唯一真相(编排者)。dev(vite transformIndexHtml 插件)与 build
7
+ * (纯拷贝步骤)共用本模块。各功能域拆分在同级文件:
8
+ * - view-context.ts:window 上下文(HBS 占位符 / 请求真值)
9
+ * - slardar.ts:Slardar + Performance + Tea 监控埋点
10
+ * - preview-bridge.ts:妙搭预览桥(**仅 dev**)
11
+ * - og-meta.ts:title / og / description / favicon 原地改写
12
+ *
13
+ * 约束:用户不感知、`src` 源文件保持纯净,注入只发生在 serve/build 瞬间。
14
+ */
15
+ /**
16
+ * 额外平台脚本清单 —— 烧进 SDK,随版本走。view-context / slardar / preview-bridge 之外的
17
+ * 扩展位,当前为空。填入真实 tag 后 dev 与 build 都会注入,对 API 无影响。
18
+ */
19
+ export declare const PLATFORM_TAGS: HtmlTagDescriptor[];
20
+ export interface InjectPlatformOptions {
21
+ /** view-context 渲染模式:build emit HBS 占位符(默认);dev 用请求上下文真值/兜底。 */
22
+ mode?: 'build' | 'dev';
23
+ /** dev 模式下从请求解析出的上下文(无则走 dev fallback)。 */
24
+ viewCtx?: RequestRenderContext;
25
+ /** appId override(透传给 view-context)。 */
26
+ appId?: string;
27
+ slardar?: SlardarOptions;
28
+ ogMeta?: OgMetaOptions;
29
+ }
30
+ /**
31
+ * 对一份 HTML 注入全部平台能力(view-context + slardar + 额外清单 + og-meta)。
32
+ * dev 插件与 build 步骤共用,唯一真相。默认 build 模式(emit HBS 占位符)。
33
+ *
34
+ * head-prepend 顺序(injectTags 按数组序 = 文档序):view-context 在最前,slardar 其后,
35
+ * 保证 slardar 读 window.tenantId 时已就绪。预览桥仅 dev 注入。
36
+ */
37
+ export declare function injectPlatformTags(html: string, opts?: InjectPlatformOptions): string;
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAc,MAAM,cAAc,CAAC;AAClE,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAE7D;;;;;;;;;GASG;AAEH;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,iBAAiB,EAAO,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,gEAAgE;IAChE,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACvB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,MAAM,CAYzF"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PLATFORM_TAGS = void 0;
4
+ exports.injectPlatformTags = injectPlatformTags;
5
+ const html_tags_1 = require("../html-tags");
6
+ const view_context_1 = require("./view-context");
7
+ const slardar_1 = require("./slardar");
8
+ const preview_bridge_1 = require("./preview-bridge");
9
+ const og_meta_1 = require("./og-meta");
10
+ /**
11
+ * 平台 HTML 注入的唯一真相(编排者)。dev(vite transformIndexHtml 插件)与 build
12
+ * (纯拷贝步骤)共用本模块。各功能域拆分在同级文件:
13
+ * - view-context.ts:window 上下文(HBS 占位符 / 请求真值)
14
+ * - slardar.ts:Slardar + Performance + Tea 监控埋点
15
+ * - preview-bridge.ts:妙搭预览桥(**仅 dev**)
16
+ * - og-meta.ts:title / og / description / favicon 原地改写
17
+ *
18
+ * 约束:用户不感知、`src` 源文件保持纯净,注入只发生在 serve/build 瞬间。
19
+ */
20
+ /**
21
+ * 额外平台脚本清单 —— 烧进 SDK,随版本走。view-context / slardar / preview-bridge 之外的
22
+ * 扩展位,当前为空。填入真实 tag 后 dev 与 build 都会注入,对 API 无影响。
23
+ */
24
+ exports.PLATFORM_TAGS = [];
25
+ /**
26
+ * 对一份 HTML 注入全部平台能力(view-context + slardar + 额外清单 + og-meta)。
27
+ * dev 插件与 build 步骤共用,唯一真相。默认 build 模式(emit HBS 占位符)。
28
+ *
29
+ * head-prepend 顺序(injectTags 按数组序 = 文档序):view-context 在最前,slardar 其后,
30
+ * 保证 slardar 读 window.tenantId 时已就绪。预览桥仅 dev 注入。
31
+ */
32
+ function injectPlatformTags(html, opts = {}) {
33
+ const mode = opts.mode ?? 'build';
34
+ const tags = [
35
+ (0, view_context_1.viewContextTag)(mode, { appId: opts.appId }, opts.viewCtx),
36
+ ...(0, slardar_1.slardarTags)(opts.slardar),
37
+ // 预览桥仅开发环境注入,build 产物不带(线上不经预览外壳)
38
+ ...(mode === 'dev' ? (0, preview_bridge_1.previewBridgeTags)() : []),
39
+ ...exports.PLATFORM_TAGS,
40
+ ];
41
+ let out = (0, html_tags_1.injectTags)(html, tags);
42
+ out = (0, og_meta_1.injectOgMeta)(out, opts.ogMeta);
43
+ return out;
44
+ }
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transform/index.ts"],"names":[],"mappings":";;;AAyCA,gDAYC;AArDD,4CAAkE;AAClE,iDAA2E;AAC3E,uCAA6D;AAC7D,qDAAqD;AACrD,uCAA6D;AAE7D;;;;;;;;;GASG;AAEH;;;GAGG;AACU,QAAA,aAAa,GAAwB,EAAE,CAAC;AAarD;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,IAAY,EAAE,OAA8B,EAAE;IAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC;IAClC,MAAM,IAAI,GAAwB;QAChC,IAAA,6BAAc,EAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC;QACzD,GAAG,IAAA,qBAAW,EAAC,IAAI,CAAC,OAAO,CAAC;QAC5B,kCAAkC;QAClC,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAA,kCAAiB,GAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,GAAG,qBAAa;KACjB,CAAC;IACF,IAAI,GAAG,GAAG,IAAA,sBAAU,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,GAAG,GAAG,IAAA,sBAAY,EAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 注入 / 改写 OG meta、title、description meta、favicon(全用 HBS 占位符,vefaas 替真值)。
3
+ * 能力对齐 `@lark-apaas/coding-preset-vite-react` 的 og-meta 插件。
4
+ *
5
+ * 既存 tag 原地改写(保留其它属性),缺失则插到 `</head>` 之前。og-meta 是改写而非
6
+ * append,injectTags 表达不了,故单列字符串改写函数,由 injectPlatformTags 在 tag 注入后调用。
7
+ */
8
+ export interface OgMetaOptions {
9
+ customTags?: Array<{
10
+ property: string;
11
+ placeholder: string;
12
+ }>;
13
+ titlePlaceholder?: string;
14
+ descriptionPlaceholder?: string;
15
+ faviconPlaceholder?: string;
16
+ }
17
+ export declare function injectOgMeta(html: string, options?: OgMetaOptions): string;
18
+ //# sourceMappingURL=og-meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"og-meta.d.ts","sourceRoot":"","sources":["../../src/transform/og-meta.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAQD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAqE9E"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.injectOgMeta = injectOgMeta;
4
+ const DEFAULT_OG_TAGS = [
5
+ { property: 'og:title', placeholder: '{{appName}}' },
6
+ { property: 'og:description', placeholder: '{{appDescription}}' },
7
+ { property: 'og:image', placeholder: '{{appAvatar}}' },
8
+ ];
9
+ function injectOgMeta(html, options = {}) {
10
+ const { customTags, titlePlaceholder = '{{appName}}', descriptionPlaceholder = '{{appDescription}}', faviconPlaceholder = '{{appAvatar}}', } = options;
11
+ const tags = customTags || DEFAULT_OG_TAGS;
12
+ let result = html;
13
+ // 1. OG meta tags
14
+ for (const { property, placeholder } of tags) {
15
+ const esc = property.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
16
+ const exists = new RegExp(`<meta\\s+[^>]*property=["']?${esc}["']?[^>]*>`, 'i').test(result);
17
+ if (exists) {
18
+ result = result.replace(new RegExp(`(<meta\\s+[^>]*property=["']?${esc}["']?[^>]*content=)["'][^"']*["']([^>]*>)`, 'gi'), `$1"${placeholder}"$2`);
19
+ }
20
+ else {
21
+ result = result.replace('</head>', `\n <meta property="${property}" content="${placeholder}">\n </head>`);
22
+ }
23
+ }
24
+ // 2. <title>
25
+ if (/<title>[^<]*<\/title>/i.test(result)) {
26
+ result = result.replace(/<title>[^<]*<\/title>/gi, `<title>${titlePlaceholder}</title>`);
27
+ }
28
+ else {
29
+ result = result.replace('</head>', `\n <title>${titlePlaceholder}</title>\n </head>`);
30
+ }
31
+ // 2.1 <meta name="description">
32
+ const descRe = /<meta\b[^>]*\bname=["']description["'][^>]*>/i;
33
+ if (descRe.test(result)) {
34
+ result = result.replace(/<meta\b[^>]*\bname=["']description["'][^>]*>/gi, (tag) => {
35
+ if (/\bcontent=/.test(tag)) {
36
+ return tag.replace(/\bcontent=(["'])([\s\S]*?)\1/i, `content="${descriptionPlaceholder}"`);
37
+ }
38
+ return tag.replace(/>$/, ` content="${descriptionPlaceholder}">`);
39
+ });
40
+ }
41
+ else {
42
+ result = result.replace('</head>', `\n <meta name="description" content="${descriptionPlaceholder}">\n </head>`);
43
+ }
44
+ // 3. <link rel="icon">
45
+ const iconRe = /<link\s+[^>]*rel=["']?(?:icon|shortcut icon)["']?[^>]*>/i;
46
+ if (iconRe.test(result)) {
47
+ result = result.replace(/(<link\s+[^>]*rel=["']?(?:icon|shortcut icon)["']?[^>]*href=)["'][^"']*["']([^>]*>)/gi, `$1"${faviconPlaceholder}"$2`);
48
+ }
49
+ else {
50
+ result = result.replace('</head>', `\n <link rel="icon" href="${faviconPlaceholder}">\n </head>`);
51
+ }
52
+ return result;
53
+ }
54
+ //# sourceMappingURL=og-meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"og-meta.js","sourceRoot":"","sources":["../../src/transform/og-meta.ts"],"names":[],"mappings":";;AAoBA,oCAqEC;AA3ED,MAAM,eAAe,GAAG;IACtB,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE;IACpD,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,oBAAoB,EAAE;IACjE,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE;CACvD,CAAC;AAEF,SAAgB,YAAY,CAAC,IAAY,EAAE,UAAyB,EAAE;IACpE,MAAM,EACJ,UAAU,EACV,gBAAgB,GAAG,aAAa,EAChC,sBAAsB,GAAG,oBAAoB,EAC7C,kBAAkB,GAAG,eAAe,GACrC,GAAG,OAAO,CAAC;IACZ,MAAM,IAAI,GAAG,UAAU,IAAI,eAAe,CAAC;IAE3C,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,kBAAkB;IAClB,KAAK,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,+BAA+B,GAAG,aAAa,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7F,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,IAAI,MAAM,CACR,gCAAgC,GAAG,2CAA2C,EAC9E,IAAI,CACL,EACD,MAAM,WAAW,KAAK,CACvB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,SAAS,EACT,yBAAyB,QAAQ,cAAc,WAAW,eAAe,CAC1E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,aAAa;IACb,IAAI,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,EAAE,UAAU,gBAAgB,UAAU,CAAC,CAAC;IAC3F,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,gBAAgB,gBAAgB,qBAAqB,CAAC,CAAC;IAC5F,CAAC;IAED,gCAAgC;IAChC,MAAM,MAAM,GAAG,+CAA+C,CAAC;IAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gDAAgD,EAAE,CAAC,GAAG,EAAE,EAAE;YAChF,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,GAAG,CAAC,OAAO,CAAC,+BAA+B,EAAE,YAAY,sBAAsB,GAAG,CAAC,CAAC;YAC7F,CAAC;YACD,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,sBAAsB,IAAI,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,SAAS,EACT,2CAA2C,sBAAsB,eAAe,CACjF,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,MAAM,MAAM,GAAG,0DAA0D,CAAC;IAC1E,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,uFAAuF,EACvF,MAAM,kBAAkB,KAAK,CAC9B,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,SAAS,EACT,gCAAgC,kBAAkB,eAAe,CAClE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { HtmlTagDescriptor } from '../html-tags';
2
+ /**
3
+ * 妙搭预览桥(preview bridge)—— **仅开发环境**注入。
4
+ *
5
+ * 沙箱预览外壳与页面之间的通信桥,build 产物不需要(线上不经预览外壳)。
6
+ * 由 `injectPlatformTags` 在 `mode === 'dev'` 时注入,buildStatic(build 模式)不注入。
7
+ */
8
+ export declare const MIAODA_PREVIEW_BRIDGE_URL = "https://sf1-scmcdn-cn.feishucdn.com/obj/feishu-static/apaas/miaoda-preview-bridge/1.0.0.5/miaoda-preview-bridge.iife.min.js";
9
+ /** 预览桥 script 清单(head-prepend,尽早建立与外壳的通信)。 */
10
+ export declare function previewBridgeTags(): HtmlTagDescriptor[];
11
+ //# sourceMappingURL=preview-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-bridge.d.ts","sourceRoot":"","sources":["../../src/transform/preview-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,gIACyF,CAAC;AAEhI,8CAA8C;AAC9C,wBAAgB,iBAAiB,IAAI,iBAAiB,EAAE,CAEvD"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MIAODA_PREVIEW_BRIDGE_URL = void 0;
4
+ exports.previewBridgeTags = previewBridgeTags;
5
+ /**
6
+ * 妙搭预览桥(preview bridge)—— **仅开发环境**注入。
7
+ *
8
+ * 沙箱预览外壳与页面之间的通信桥,build 产物不需要(线上不经预览外壳)。
9
+ * 由 `injectPlatformTags` 在 `mode === 'dev'` 时注入,buildStatic(build 模式)不注入。
10
+ */
11
+ exports.MIAODA_PREVIEW_BRIDGE_URL = 'https://sf1-scmcdn-cn.feishucdn.com/obj/feishu-static/apaas/miaoda-preview-bridge/1.0.0.5/miaoda-preview-bridge.iife.min.js';
12
+ /** 预览桥 script 清单(head-prepend,尽早建立与外壳的通信)。 */
13
+ function previewBridgeTags() {
14
+ return [{ tag: 'script', attrs: { src: exports.MIAODA_PREVIEW_BRIDGE_URL }, injectTo: 'head-prepend' }];
15
+ }
16
+ //# sourceMappingURL=preview-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-bridge.js","sourceRoot":"","sources":["../../src/transform/preview-bridge.ts"],"names":[],"mappings":";;;AAYA,8CAEC;AAZD;;;;;GAKG;AACU,QAAA,yBAAyB,GACpC,6HAA6H,CAAC;AAEhI,8CAA8C;AAC9C,SAAgB,iBAAiB;IAC/B,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,iCAAyB,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;AAClG,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { HtmlTagDescriptor } from '../html-tags';
2
+ /**
3
+ * Slardar + Performance + Tea 监控埋点的 head-prepend script 清单。
4
+ * 能力对齐 `@lark-apaas/coding-preset-vite-react` 的 slardar 插件。
5
+ *
6
+ * 依赖 view-context 提前注入 `window.tenantId/appId/userId/ENVIRONMENT`(值带 `?? ''`
7
+ * 兜底,缺失不崩,只是埋点维度为空)。
8
+ */
9
+ export interface SlardarOptions {
10
+ /** Business ID。默认 `apaas_miaoda`。 */
11
+ bid?: string;
12
+ /** SDK 暴露在 window 上的全局名。默认 `KSlardarWeb`。 */
13
+ globalName?: string;
14
+ }
15
+ /** Slardar + Performance + Tea 监控埋点的 head-prepend script 清单。 */
16
+ export declare function slardarTags(options?: SlardarOptions): HtmlTagDescriptor[];
17
+ //# sourceMappingURL=slardar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slardar.d.ts","sourceRoot":"","sources":["../../src/transform/slardar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAkGD,gEAAgE;AAChE,wBAAgB,WAAW,CAAC,OAAO,GAAE,cAAmB,GAAG,iBAAiB,EAAE,CAiB7E"}