@lark-apaas/coding-vite-preset 1.0.7-alpha.26 → 1.0.7-alpha.28

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 (28) hide show
  1. package/lib/preset.d.ts.map +1 -1
  2. package/lib/preset.js +64 -176
  3. package/lib/preset.js.map +1 -1
  4. package/lib/vite-plugins/runtime-injection-plugin.d.ts.map +1 -1
  5. package/lib/vite-plugins/runtime-injection-plugin.js +2 -5
  6. package/lib/vite-plugins/runtime-injection-plugin.js.map +1 -1
  7. package/lib/vite-plugins/view-context-plugin.d.ts +1 -25
  8. package/lib/vite-plugins/view-context-plugin.d.ts.map +1 -1
  9. package/lib/vite-plugins/view-context-plugin.js +16 -35
  10. package/lib/vite-plugins/view-context-plugin.js.map +1 -1
  11. package/package.json +4 -5
  12. package/lib/vite-plugins/capabilities-bundle-plugin.d.ts +0 -9
  13. package/lib/vite-plugins/capabilities-bundle-plugin.d.ts.map +0 -1
  14. package/lib/vite-plugins/capabilities-bundle-plugin.js +0 -170
  15. package/lib/vite-plugins/capabilities-bundle-plugin.js.map +0 -1
  16. package/lib/vite-plugins/health-middleware-plugin.d.ts +0 -43
  17. package/lib/vite-plugins/health-middleware-plugin.d.ts.map +0 -1
  18. package/lib/vite-plugins/health-middleware-plugin.js +0 -66
  19. package/lib/vite-plugins/health-middleware-plugin.js.map +0 -1
  20. package/lib/vite-plugins/miaoda-fonts-mirror-plugin.d.ts +0 -14
  21. package/lib/vite-plugins/miaoda-fonts-mirror-plugin.d.ts.map +0 -1
  22. package/lib/vite-plugins/miaoda-fonts-mirror-plugin.js +0 -99
  23. package/lib/vite-plugins/miaoda-fonts-mirror-plugin.js.map +0 -1
  24. package/lib/vite-plugins/ws-watchdog-plugin.d.ts +0 -19
  25. package/lib/vite-plugins/ws-watchdog-plugin.d.ts.map +0 -1
  26. package/lib/vite-plugins/ws-watchdog-plugin.js +0 -86
  27. package/lib/vite-plugins/ws-watchdog-plugin.js.map +0 -1
  28. package/src/runtime/ws-watchdog-client.mjs +0 -148
@@ -1,9 +0,0 @@
1
- import type { Plugin } from 'vite';
2
- export interface CapabilitiesBundlePluginOptions {
3
- /**
4
- * 覆盖默认扫描目录。不传时按方案默认:老路径存在则用老路径,否则用新路径。
5
- */
6
- dir?: string;
7
- }
8
- export declare function capabilitiesBundlePlugin(opts?: CapabilitiesBundlePluginOptions): Plugin;
9
- //# sourceMappingURL=capabilities-bundle-plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capabilities-bundle-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/capabilities-bundle-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAiC,MAAM,MAAM,CAAC;AAuBlE,MAAM,WAAW,+BAA+B;IAC9C;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,wBAAwB,CAAC,IAAI,CAAC,EAAE,+BAA+B,GAAG,MAAM,CAuJvF"}
@@ -1,170 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.capabilitiesBundlePlugin = capabilitiesBundlePlugin;
7
- const fs_1 = __importDefault(require("fs"));
8
- const path_1 = __importDefault(require("path"));
9
- /**
10
- * 把业务工程 capability JSON 打包成 `virtual:capabilities` 虚拟模块。
11
- * SDK (`client-capability`) 通过 `import map from 'virtual:capabilities'` 拿到完整
12
- * config map,喂给 plugin_server 预览态 body。
13
- *
14
- * 目录约定(方案文档 § 配置目录迁移):
15
- * - 新约定:`shared/capabilities/*.json`
16
- * - 旧路径:`server/capabilities/*.json`
17
- * - 兜底规则:**老路径存在则读老路径,否则读新路径**(方案原话:"旧路径存在
18
- * 则读旧路径,否则读新路径"),便于策略层 / agent_tool 渐进迁移
19
- *
20
- * dev 态 watch 两个目录,文件变更触发 full-reload 让虚拟模块重 load。
21
- *
22
- * 方案文档: https://bytedance.larkoffice.com/wiki/WtW5wJ7wli9BImkExyJcjR5znfx
23
- */
24
- const VIRTUAL_ID = 'virtual:capabilities';
25
- const RESOLVED_VIRTUAL_ID = '\0' + VIRTUAL_ID;
26
- const OLD_DIR = 'server/capabilities';
27
- const NEW_DIR = 'shared/capabilities';
28
- function capabilitiesBundlePlugin(opts) {
29
- /**
30
- * 业务工程根目录。Vite `configResolved` 后用 `config.root`;之前(含 `config()` /
31
- * `optimizeDeps.esbuildOptions.plugins` 注册阶段)回退 `process.cwd()`。
32
- *
33
- * 不能直接用 `process.cwd()`:Vite depOptimizer 把 esbuild 的 `absWorkingDir`
34
- * 设为 `config.root`,但我们的 onLoad 回调里 Node 视角的 `process.cwd()` 还是
35
- * 启动进程的 cwd —— 妙搭沙箱里 vite 通常从父进程起、靠 vite config 的 `root`
36
- * 指向业务工程,两者不一致 → loadAll() 扫错目录 → 注入空 map → SDK load() 抛
37
- * CapabilityNotFoundError。
38
- */
39
- let projectRoot = process.cwd();
40
- function resolveDir() {
41
- if (opts?.dir)
42
- return path_1.default.resolve(projectRoot, opts.dir);
43
- const oldAbs = path_1.default.resolve(projectRoot, OLD_DIR);
44
- if (fs_1.default.existsSync(oldAbs))
45
- return oldAbs;
46
- return path_1.default.resolve(projectRoot, NEW_DIR);
47
- }
48
- function loadAll() {
49
- const map = {};
50
- const abs = resolveDir();
51
- if (!fs_1.default.existsSync(abs))
52
- return map;
53
- for (const f of fs_1.default.readdirSync(abs)) {
54
- if (!f.endsWith('.json'))
55
- continue;
56
- try {
57
- const cfg = JSON.parse(fs_1.default.readFileSync(path_1.default.join(abs, f), 'utf-8'));
58
- if (cfg?.id)
59
- map[cfg.id] = cfg;
60
- }
61
- catch (e) {
62
- // eslint-disable-next-line no-console
63
- console.warn(`[capabilities-bundle] skip invalid json: ${path_1.default.join(abs, f)}: ${e instanceof Error ? e.message : String(e)}`);
64
- }
65
- }
66
- return map;
67
- }
68
- return {
69
- name: 'lark-apaas:capabilities-bundle',
70
- configResolved(config) {
71
- projectRoot = config.root;
72
- },
73
- /**
74
- * 把 `virtual:capabilities` 的解析塞进 depOptimizer 的 esbuild plugin。
75
- *
76
- * 历史:早期方案是把 client-capability/toolkit/toolkit-lite 整个 exclude,
77
- * 强制走 Vite 主 pipeline。但实际这几个包的 dist 根本没 `import 'virtual:capabilities'`
78
- * (只是源码注释提到,没落地),exclude 是死设计;副作用是 lite 被 exclude 后
79
- * 它所有 CJS 子依赖(observable-web 这种 `exports.X = ...` 形态的包)也失去
80
- * pre-bundle,浏览器以 ESM 形态 `import { AppEnv } from '@lark-apaas/observable-web'`
81
- * 直接拉原始 CJS 文件 → "does not provide an export named 'AppEnv'" 白屏。
82
- *
83
- * 现状:删 exclude,让 Vite 正常 pre-bundle 所有依赖(CJS 自动转 ESM);
84
- * esbuild 兜底 plugin 处理 client-capability 被 inline 进 lite pre-bundle 产物
85
- * 时的 `import virtual:capabilities`。注意 onLoad 回调里 `loadAll()` 用闭包
86
- * 里的 `projectRoot`,`configResolved` 已经把它从 `process.cwd()` 升级到
87
- * `config.root`,扫到的就是业务工程实际目录。
88
- */
89
- config() {
90
- return {
91
- optimizeDeps: {
92
- esbuildOptions: {
93
- plugins: [
94
- {
95
- name: 'lark-apaas:capabilities-bundle-esbuild',
96
- setup(build) {
97
- build.onResolve({ filter: /^virtual:capabilities$/ }, (args) => ({
98
- path: args.path,
99
- namespace: 'lark-apaas-virtual-capabilities',
100
- }));
101
- build.onLoad({ filter: /.*/, namespace: 'lark-apaas-virtual-capabilities' }, () => ({
102
- contents: `export default ${JSON.stringify(loadAll())};`,
103
- loader: 'js',
104
- }));
105
- },
106
- },
107
- ],
108
- },
109
- },
110
- };
111
- },
112
- resolveId(id) {
113
- if (id === VIRTUAL_ID)
114
- return RESOLVED_VIRTUAL_ID;
115
- return null;
116
- },
117
- load(id) {
118
- if (id !== RESOLVED_VIRTUAL_ID)
119
- return null;
120
- return `export default ${JSON.stringify(loadAll())};`;
121
- },
122
- configureServer(server) {
123
- // 两个目录都 watch:用户从老路径迁到新路径中间态,新增 / 删除文件都能感知
124
- const watchDirs = opts?.dir
125
- ? [path_1.default.resolve(projectRoot, opts.dir)]
126
- : [path_1.default.resolve(projectRoot, OLD_DIR), path_1.default.resolve(projectRoot, NEW_DIR)];
127
- for (const d of watchDirs) {
128
- if (fs_1.default.existsSync(d))
129
- server.watcher.add(d);
130
- }
131
- /**
132
- * capability JSON 变更后必须触发**完整 depOptimizer 重跑**,不能只 invalidate
133
- * 虚拟模块 + full-reload。原因:业务代码 `import 'virtual:capabilities'` 走 Vite
134
- * 主 pipeline,invalidate 就能更新;但 client-capability SDK 的 `import virtual:
135
- * capabilities` 是被 esbuild 内联进 `.vite/deps/@lark-apaas_client-toolkit-lite.js`
136
- * 的 pre-bundle 产物里,仅在 dev server 启动 / depOptimizer 触发时执行一次。
137
- * 新增 capability JSON 不重 bundle 的话,lite 产物里的 map 字面值永远停留在
138
- * 启动那一刻,SDK load() 检查 not-found 抛 CapabilityNotFoundError。
139
- *
140
- * `server.restart(true)` 重启 dev server 且强制 re-optimize(等同 `--force`),
141
- * 让 esbuild 重新跑、re-trigger 我们的 onLoad、注入最新 map。debounce 100ms 是
142
- * 防止 agent 批量写 capability JSON 时短时间多次 restart 把开发态搞挂。
143
- */
144
- let restartTimer = null;
145
- const handle = (file) => {
146
- if (!file.endsWith('.json'))
147
- return;
148
- if (!watchDirs.some((d) => file.startsWith(d)))
149
- return;
150
- const mod = server.moduleGraph.getModuleById(RESOLVED_VIRTUAL_ID);
151
- if (mod)
152
- server.moduleGraph.invalidateModule(mod);
153
- if (restartTimer)
154
- clearTimeout(restartTimer);
155
- restartTimer = setTimeout(() => {
156
- restartTimer = null;
157
- server.config.logger.info(`[capabilities-bundle] capability changed (${path_1.default.basename(file)}), re-optimizing deps...`, { timestamp: true });
158
- server.restart(true).catch((e) => {
159
- server.config.logger.warn(`[capabilities-bundle] restart failed, fallback to full-reload: ${e instanceof Error ? e.message : String(e)}`);
160
- server.ws.send({ type: 'full-reload', path: '*' });
161
- });
162
- }, 100);
163
- };
164
- server.watcher.on('add', handle);
165
- server.watcher.on('change', handle);
166
- server.watcher.on('unlink', handle);
167
- },
168
- };
169
- }
170
- //# sourceMappingURL=capabilities-bundle-plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"capabilities-bundle-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/capabilities-bundle-plugin.ts"],"names":[],"mappings":"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"}
@@ -1,43 +0,0 @@
1
- import type { Plugin } from 'vite';
2
- /**
3
- * Health Check Middleware Plugin
4
- *
5
- * 给妙搭外壳提供统一的 health endpoint,让外壳能判断"应用是否就绪"。
6
- * 接口规范见飞书文档 - 妙搭应用 Health Check 接口规范。
7
- *
8
- * Response shape:
9
- * { ready: true } // dev server 已就绪
10
- * { ready: false, error: 'starting' } // dev server 还在启动
11
- *
12
- * 外壳判断逻辑:
13
- * - HTTP connection refused / timeout → Case ① dev server 没拉起来 → 重启沙箱
14
- * - 200 OK + ready: true → 正常进入应用
15
- * - 200 OK + ready: false → 还在启动,按 error 描述判断,必要时 poll 重试
16
- *
17
- * 不归本接口管:
18
- * - Case ②a vite compile error
19
- * → 浏览器侧通过 vite-client 的 vite:error overlay + iframe postMessage 上报
20
- * - Case ②b runtime error(React 渲染 throw 等)
21
- * → 浏览器侧 ErrorBoundary 接住 → submitPostMessage RenderError / SELECTED_LOG
22
- * - Case ③ 资源加载失败(网络/CDN 问题)
23
- * → 浏览器侧 fetch / script onerror 独立上报
24
- *
25
- * 设计取舍:放弃 server 侧的 compile error 监听(需要 monkey-patch
26
- * server.ws.send / server.hot.send 拦截 vite 内部 broadcast,太脏)。
27
- * 编译错误状态由浏览器侧自己感知 + 上报,更直接。
28
- */
29
- interface HealthMiddlewarePluginOptions {
30
- /** 项目根目录,用于 detectAppType(preset 侧仍在使用) */
31
- rootDir: string;
32
- /** Health endpoint 路径,默认 /dev/health */
33
- endpoint?: string;
34
- }
35
- export type AppType = 'client' | 'fullstack' | 'server';
36
- /**
37
- * 从 package.json mclaw.features 推导应用类型(client / fullstack / server)。
38
- * 仅供 preset 内部判断是否注入 server proxy,不再出现在 health 返回里。
39
- */
40
- export declare function detectAppType(rootDir: string): AppType;
41
- export declare function healthMiddlewarePlugin(options: HealthMiddlewarePluginOptions): Plugin;
42
- export default healthMiddlewarePlugin;
43
- //# sourceMappingURL=health-middleware-plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"health-middleware-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/health-middleware-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,UAAU,6BAA6B;IACrC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AAExD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAgBtD;AAMD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,6BAA6B,GACrC,MAAM,CAqCR;AAED,eAAe,sBAAsB,CAAC"}
@@ -1,66 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.detectAppType = detectAppType;
7
- exports.healthMiddlewarePlugin = healthMiddlewarePlugin;
8
- const fs_1 = __importDefault(require("fs"));
9
- const path_1 = __importDefault(require("path"));
10
- /**
11
- * 从 package.json mclaw.features 推导应用类型(client / fullstack / server)。
12
- * 仅供 preset 内部判断是否注入 server proxy,不再出现在 health 返回里。
13
- */
14
- function detectAppType(rootDir) {
15
- try {
16
- const pkg = JSON.parse(fs_1.default.readFileSync(path_1.default.join(rootDir, 'package.json'), 'utf-8'));
17
- const features = Array.isArray(pkg?.mclaw?.features)
18
- ? pkg.mclaw.features
19
- : ['client'];
20
- const hasClient = features.includes('client');
21
- const hasServer = features.includes('server');
22
- if (hasClient && hasServer)
23
- return 'fullstack';
24
- if (hasServer)
25
- return 'server';
26
- return 'client';
27
- }
28
- catch {
29
- return 'client';
30
- }
31
- }
32
- function healthMiddlewarePlugin(options) {
33
- const endpoint = options.endpoint ?? '/dev/health';
34
- let viteReady = false;
35
- return {
36
- name: 'fullstack-health-middleware',
37
- apply: 'serve',
38
- configureServer(server) {
39
- // 探测 vite ready 信号:
40
- // - httpServer 不存在 → middleware mode(被宿主 server 接管),认为已就绪
41
- // - httpServer.listening 已为 true → 已经在 listen
42
- // - 否则注册一次性 'listening' 回调,等 Node http.Server emit 时翻成 ready
43
- const httpServer = server.httpServer;
44
- if (!httpServer || httpServer.listening) {
45
- viteReady = true;
46
- }
47
- else {
48
- httpServer.once('listening', () => {
49
- viteReady = true;
50
- });
51
- }
52
- server.middlewares.use(endpoint, (req, res, next) => {
53
- if (req.method && req.method !== 'GET') {
54
- return next();
55
- }
56
- const payload = { ready: viteReady };
57
- res.setHeader('Content-Type', 'application/json');
58
- res.setHeader('Cache-Control', 'no-store');
59
- res.statusCode = 200;
60
- res.end(JSON.stringify(payload));
61
- });
62
- },
63
- };
64
- }
65
- exports.default = healthMiddlewarePlugin;
66
- //# sourceMappingURL=health-middleware-plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"health-middleware-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/health-middleware-plugin.ts"],"names":[],"mappings":";;;;;AA6CA,sCAgBC;AAMD,wDAuCC;AA1GD,4CAAoB;AACpB,gDAAwB;AAwCxB;;;GAGG;AACH,SAAgB,aAAa,CAAC,OAAe;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAC7D,CAAC;QACF,MAAM,QAAQ,GAAa,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC;YAC5D,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ;YACpB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACf,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,SAAS,IAAI,SAAS;YAAE,OAAO,WAAW,CAAC;QAC/C,IAAI,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAMD,SAAgB,sBAAsB,CACpC,OAAsC;IAEtC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC;IAEnD,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,KAAK,EAAE,OAAO;QAEd,eAAe,CAAC,MAAqB;YACnC,oBAAoB;YACpB,4DAA4D;YAC5D,gDAAgD;YAChD,+DAA+D;YAC/D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YACrC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBACxC,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;oBAChC,SAAS,GAAG,IAAI,CAAC;gBACnB,CAAC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBAClD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;oBACvC,OAAO,IAAI,EAAE,CAAC;gBAChB,CAAC;gBAED,MAAM,OAAO,GAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;gBAEpD,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,OAAO,CAAC,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,sBAAsB,CAAC"}
@@ -1,14 +0,0 @@
1
- import type { Plugin } from 'vite';
2
- export interface MiaodaFontsMirrorOptions {
3
- /** Mirror 完整基址,默认 `https://miaoda.feishu.cn/fonts` */
4
- mirror?: string;
5
- /** 关闭(调试时兜底) */
6
- disabled?: boolean;
7
- /** 命中时打 warning(便于找出源码里的旧引用) */
8
- warnOnMatch?: boolean;
9
- /** 排除 id 子串或正则 */
10
- exclude?: (string | RegExp)[];
11
- }
12
- export declare function miaodaFontsMirrorPlugin(options?: MiaodaFontsMirrorOptions): Plugin | false;
13
- export default miaodaFontsMirrorPlugin;
14
- //# sourceMappingURL=miaoda-fonts-mirror-plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"miaoda-fonts-mirror-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/miaoda-fonts-mirror-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAiCnC,MAAM,WAAW,wBAAwB;IACvC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB;IAClB,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CAC/B;AAED,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B,GACrC,MAAM,GAAG,KAAK,CAuEhB;AAED,eAAe,uBAAuB,CAAC"}
@@ -1,99 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.miaodaFontsMirrorPlugin = miaodaFontsMirrorPlugin;
4
- /**
5
- * miaoda-fonts-mirror-plugin
6
- *
7
- * 编译时把 Google Fonts 公共源替换为妙搭字体代理,屏蔽网络不可达问题。
8
- *
9
- * 背景(章小川 @ 2026-04-17 妙搭 CR 群):
10
- * - 原方案(miaoda-skills MR 311)在 skill PE 里教模型使用 miaoda.feishu.cn/fonts
11
- * - 问题:占 token + 增加模型学习成本;存量应用无法追溯修复
12
- * - 方案:在 fullstack-vite-preset 层做编译时字符串替换
13
- * · pathname 与 Google Fonts 完全一致(`/css` / `/css2?family=...&wght=...&display=swap`)
14
- * · 只换域名,任何模型输出都能被正确代理
15
- * · 存量应用只需重新编译发布即可修复
16
- * · 单点收敛,所有用 preset 的应用(包括 template、其他应用)一致受益
17
- *
18
- * 覆盖范围:
19
- * - index.html(含 <link> / <style>)
20
- * - 所有 CSS / SCSS / LESS(@import url / url(...))
21
- * - JS / TS / TSX / Vue / Svelte(字符串字面量,保险兜底)
22
- * - fonts.googleapis.com(CSS 加载 API)和 fonts.gstatic.com(字体文件存储)
23
- *
24
- * 关闭方式:传 `{ disabled: true }` 或设置环境变量 MIAODA_FONTS_MIRROR_OFF=1
25
- */
26
- const DEFAULT_MIRROR = 'https://miaoda.feishu.cn/fonts';
27
- // 同时覆盖 googleapis.com(CSS 加载 API)和 gstatic.com(字体文件 CDN)
28
- const GOOGLE_FONTS_RE = /https?:\/\/fonts\.(googleapis|gstatic)\.com/g;
29
- // 不带 g 标志,用于快速检测(避免 lastIndex 副作用)
30
- const HAS_GOOGLE_FONTS = /fonts\.(googleapis|gstatic)\.com/;
31
- const TRANSFORM_EXT = /\.(html|css|scss|sass|less|styl|js|jsx|ts|tsx|mjs|cjs|vue|svelte)(\?|$)/;
32
- function miaodaFontsMirrorPlugin(options = {}) {
33
- const envDisabled = process.env.MIAODA_FONTS_MIRROR_OFF === '1';
34
- if (options.disabled || envDisabled)
35
- return false;
36
- const mirror = options.mirror ?? DEFAULT_MIRROR;
37
- const warn = options.warnOnMatch ?? false;
38
- const exclude = options.exclude ?? [];
39
- const shouldExclude = (id) => {
40
- for (const pat of exclude) {
41
- if (typeof pat === 'string' && id.includes(pat))
42
- return true;
43
- if (pat instanceof RegExp && pat.test(id))
44
- return true;
45
- }
46
- return false;
47
- };
48
- const stats = { files: 0, occurrences: 0 };
49
- return {
50
- name: 'miaoda-fonts-mirror',
51
- enforce: 'pre',
52
- buildStart() {
53
- stats.files = 0;
54
- stats.occurrences = 0;
55
- },
56
- transformIndexHtml(html) {
57
- if (!HAS_GOOGLE_FONTS.test(html))
58
- return html;
59
- const matches = html.match(GOOGLE_FONTS_RE);
60
- const replaced = html.replace(GOOGLE_FONTS_RE, mirror);
61
- stats.files += 1;
62
- stats.occurrences += matches?.length ?? 0;
63
- if (warn) {
64
- // eslint-disable-next-line no-console
65
- console.warn(`[miaoda-fonts-mirror] rewrote ${matches?.length ?? 0} occurrence(s) in index.html`);
66
- }
67
- return replaced;
68
- },
69
- transform(code, id) {
70
- if (!TRANSFORM_EXT.test(id))
71
- return null;
72
- if (shouldExclude(id))
73
- return null;
74
- if (!HAS_GOOGLE_FONTS.test(code))
75
- return null;
76
- const matches = code.match(GOOGLE_FONTS_RE);
77
- if (!matches)
78
- return null;
79
- stats.files += 1;
80
- stats.occurrences += matches.length;
81
- if (warn) {
82
- // eslint-disable-next-line no-console
83
- console.warn(`[miaoda-fonts-mirror] rewrote ${matches.length} occurrence(s) in ${id}`);
84
- }
85
- return {
86
- code: code.replace(GOOGLE_FONTS_RE, mirror),
87
- map: null,
88
- };
89
- },
90
- closeBundle() {
91
- if (stats.files > 0) {
92
- // eslint-disable-next-line no-console
93
- console.log(`[miaoda-fonts-mirror] ✓ rewrote ${stats.occurrences} occurrence(s) across ${stats.files} file(s) → ${mirror}`);
94
- }
95
- },
96
- };
97
- }
98
- exports.default = miaodaFontsMirrorPlugin;
99
- //# sourceMappingURL=miaoda-fonts-mirror-plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"miaoda-fonts-mirror-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/miaoda-fonts-mirror-plugin.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * 检测沙箱代理链路下的 WebSocket 僵尸连接:客户端每 5s 发 ping,
3
- * 连续 2 次拿不到 pong 即判死,向 parent 发 disconnected 通知。
4
- *
5
- * 设计 spec: docs/superpowers/specs/2026-04-27-sandbox-ws-watchdog-design.md
6
- */
7
- import type { Plugin } from 'vite';
8
- export interface WsWatchdogPluginOptions {
9
- pingEvent?: string;
10
- pongEvent?: string;
11
- /**
12
- * 客户端 base 路径(如 `/app/app_xxx`)。aiforce 等网关把完整路径透传给 Vite,
13
- * middleware 匹配和注入的 <script src> 都必须带 base;空串退化为本地裸路径。
14
- */
15
- clientBasePath?: string;
16
- }
17
- export declare function createWsWatchdogPlugin(options?: WsWatchdogPluginOptions): Plugin;
18
- export default createWsWatchdogPlugin;
19
- //# sourceMappingURL=ws-watchdog-plugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ws-watchdog-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/ws-watchdog-plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,MAAM,CAAC;AAqBtD,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,MAAM,CAwER;AAED,eAAe,sBAAsB,CAAC"}
@@ -1,86 +0,0 @@
1
- "use strict";
2
- /**
3
- * 检测沙箱代理链路下的 WebSocket 僵尸连接:客户端每 5s 发 ping,
4
- * 连续 2 次拿不到 pong 即判死,向 parent 发 disconnected 通知。
5
- *
6
- * 设计 spec: docs/superpowers/specs/2026-04-27-sandbox-ws-watchdog-design.md
7
- */
8
- var __importDefault = (this && this.__importDefault) || function (mod) {
9
- return (mod && mod.__esModule) ? mod : { "default": mod };
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.createWsWatchdogPlugin = createWsWatchdogPlugin;
13
- const node_fs_1 = __importDefault(require("node:fs"));
14
- const node_path_1 = __importDefault(require("node:path"));
15
- const CLIENT_RUNTIME_PATH = '/@ws-watchdog.js';
16
- // 本包是 CommonJS,所以走 __dirname;编译后/源码两种布局各一套候选。
17
- const CLIENT_RUNTIME_CANDIDATES = [
18
- node_path_1.default.resolve(__dirname, '../../src/runtime/ws-watchdog-client.mjs'),
19
- node_path_1.default.resolve(__dirname, '../runtime/ws-watchdog-client.mjs'),
20
- ];
21
- function getClientRuntimePath() {
22
- for (const p of CLIENT_RUNTIME_CANDIDATES) {
23
- if (node_fs_1.default.existsSync(p))
24
- return p;
25
- }
26
- console.error('[fullstack-ws-watchdog] runtime client not found:', CLIENT_RUNTIME_CANDIDATES);
27
- return null;
28
- }
29
- function createWsWatchdogPlugin(options = {}) {
30
- const { pingEvent = 'ws-watchdog:ping', pongEvent = 'ws-watchdog:pong', clientBasePath = '', } = options;
31
- const watchdogPath = clientBasePath + CLIENT_RUNTIME_PATH;
32
- return {
33
- name: 'fullstack-ws-watchdog',
34
- apply: 'serve',
35
- configureServer(server) {
36
- console.info('[fullstack-ws-watchdog] active');
37
- server.ws.on(pingEvent, (data, client) => {
38
- if (typeof data?.t !== 'number')
39
- return;
40
- client.send(pongEvent, { echo: data.t });
41
- });
42
- // 直出 plain .mjs,跳过 server.transformRequest;no-cache 让 npm 版本升降级
43
- // 时浏览器立刻拉新脚本,避免"旧 client + 新 server"的 stale 窗口。
44
- server.middlewares.use((req, res, next) => {
45
- if (req.url !== watchdogPath)
46
- return next();
47
- const clientPath = getClientRuntimePath();
48
- if (!clientPath) {
49
- res.statusCode = 500;
50
- res.end('// watchdog client not found');
51
- return;
52
- }
53
- try {
54
- let code = node_fs_1.default.readFileSync(clientPath, 'utf-8');
55
- const replacements = {
56
- 'process.env.FORCE_FRAMEWORK_DOMAIN_MAIN': JSON.stringify(process.env.FORCE_FRAMEWORK_DOMAIN_MAIN ?? ''),
57
- 'process.env.CLIENT_BASE_PATH': JSON.stringify(clientBasePath),
58
- };
59
- for (const [key, value] of Object.entries(replacements)) {
60
- code = code.replace(new RegExp(key.replace(/\./g, '\\.'), 'g'), value);
61
- }
62
- res.setHeader('Content-Type', 'application/javascript');
63
- res.setHeader('Cache-Control', 'no-cache');
64
- res.end(code);
65
- }
66
- catch (e) {
67
- console.error('[fullstack-ws-watchdog] failed to serve client:', e);
68
- res.statusCode = 500;
69
- res.end(`// Error: ${e}`);
70
- }
71
- });
72
- },
73
- transformIndexHtml() {
74
- const tags = [
75
- {
76
- tag: 'script',
77
- attrs: { type: 'module', src: watchdogPath },
78
- injectTo: 'head-prepend',
79
- },
80
- ];
81
- return tags;
82
- },
83
- };
84
- }
85
- exports.default = createWsWatchdogPlugin;
86
- //# sourceMappingURL=ws-watchdog-plugin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ws-watchdog-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/ws-watchdog-plugin.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAmCH,wDA0EC;AA3GD,sDAAyB;AACzB,0DAA6B;AAG7B,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAE/C,8CAA8C;AAC9C,MAAM,yBAAyB,GAAG;IAChC,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,0CAA0C,CAAC;IACnE,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,mCAAmC,CAAC;CAC7D,CAAC;AAEF,SAAS,oBAAoB;IAC3B,KAAK,MAAM,CAAC,IAAI,yBAAyB,EAAE,CAAC;QAC1C,IAAI,iBAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,KAAK,CACX,mDAAmD,EACnD,yBAAyB,CAC1B,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAYD,SAAgB,sBAAsB,CACpC,UAAmC,EAAE;IAErC,MAAM,EACJ,SAAS,GAAG,kBAAkB,EAC9B,SAAS,GAAG,kBAAkB,EAC9B,cAAc,GAAG,EAAE,GACpB,GAAG,OAAO,CAAC;IACZ,MAAM,YAAY,GAAG,cAAc,GAAG,mBAAmB,CAAC;IAE1D,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,OAAO;QAEd,eAAe,CAAC,MAAM;YACpB,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAE/C,MAAM,CAAC,EAAE,CAAC,EAAE,CACV,SAAS,EACT,CAAC,IAAgC,EAAE,MAAM,EAAE,EAAE;gBAC3C,IAAI,OAAO,IAAI,EAAE,CAAC,KAAK,QAAQ;oBAAE,OAAO;gBACxC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C,CAAC,CACF,CAAC;YAEF,gEAAgE;YAChE,gDAAgD;YAChD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxC,IAAI,GAAG,CAAC,GAAG,KAAK,YAAY;oBAAE,OAAO,IAAI,EAAE,CAAC;gBAC5C,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;gBAC1C,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;oBACxC,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC;oBACH,IAAI,IAAI,GAAG,iBAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAChD,MAAM,YAAY,GAA2B;wBAC3C,yCAAyC,EAAE,IAAI,CAAC,SAAS,CACvD,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAC9C;wBACD,8BAA8B,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;qBAC/D,CAAC;oBACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;wBACxD,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,EAC1C,KAAK,CACN,CAAC;oBACJ,CAAC;oBACD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;oBACxD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;oBAC3C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CACX,iDAAiD,EACjD,CAAC,CACF,CAAC;oBACF,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,kBAAkB;YAChB,MAAM,IAAI,GAAwB;gBAChC;oBACE,GAAG,EAAE,QAAQ;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE;oBAC5C,QAAQ,EAAE,cAAc;iBACzB;aACF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,sBAAsB,CAAC"}