@lark-apaas/coding-preset-vite-react 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.
- package/LICENSE +13 -0
- package/lib/index.d.ts +52 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +410 -0
- package/lib/index.js.map +1 -0
- package/lib/plugins/capabilities.d.ts +23 -0
- package/lib/plugins/capabilities.d.ts.map +1 -0
- package/lib/plugins/capabilities.js +151 -0
- package/lib/plugins/capabilities.js.map +1 -0
- package/lib/plugins/dev-logs.d.ts +44 -0
- package/lib/plugins/dev-logs.d.ts.map +1 -0
- package/lib/plugins/dev-logs.js +544 -0
- package/lib/plugins/dev-logs.js.map +1 -0
- package/lib/plugins/error-overlay.d.ts +19 -0
- package/lib/plugins/error-overlay.d.ts.map +1 -0
- package/lib/plugins/error-overlay.js +136 -0
- package/lib/plugins/error-overlay.js.map +1 -0
- package/lib/plugins/fonts-mirror.d.ts +14 -0
- package/lib/plugins/fonts-mirror.d.ts.map +1 -0
- package/lib/plugins/fonts-mirror.js +70 -0
- package/lib/plugins/fonts-mirror.js.map +1 -0
- package/lib/plugins/health.d.ts +19 -0
- package/lib/plugins/health.d.ts.map +1 -0
- package/lib/plugins/health.js +36 -0
- package/lib/plugins/health.js.map +1 -0
- package/lib/plugins/hmr-timing.d.ts +13 -0
- package/lib/plugins/hmr-timing.d.ts.map +1 -0
- package/lib/plugins/hmr-timing.js +93 -0
- package/lib/plugins/hmr-timing.js.map +1 -0
- package/lib/plugins/html-minify.d.ts +18 -0
- package/lib/plugins/html-minify.d.ts.map +1 -0
- package/lib/plugins/html-minify.js +100 -0
- package/lib/plugins/html-minify.js.map +1 -0
- package/lib/plugins/module-alias.d.ts +12 -0
- package/lib/plugins/module-alias.d.ts.map +1 -0
- package/lib/plugins/module-alias.js +78 -0
- package/lib/plugins/module-alias.js.map +1 -0
- package/lib/plugins/og-meta.d.ts +21 -0
- package/lib/plugins/og-meta.d.ts.map +1 -0
- package/lib/plugins/og-meta.js +60 -0
- package/lib/plugins/og-meta.js.map +1 -0
- package/lib/plugins/polyfill.d.ts +11 -0
- package/lib/plugins/polyfill.d.ts.map +1 -0
- package/lib/plugins/polyfill.js +140 -0
- package/lib/plugins/polyfill.js.map +1 -0
- package/lib/plugins/routes.d.ts +26 -0
- package/lib/plugins/routes.d.ts.map +1 -0
- package/lib/plugins/routes.js +265 -0
- package/lib/plugins/routes.js.map +1 -0
- package/lib/plugins/slardar.d.ts +24 -0
- package/lib/plugins/slardar.d.ts.map +1 -0
- package/lib/plugins/slardar.js +74 -0
- package/lib/plugins/slardar.js.map +1 -0
- package/lib/plugins/static-assets.d.ts +10 -0
- package/lib/plugins/static-assets.d.ts.map +1 -0
- package/lib/plugins/static-assets.js +297 -0
- package/lib/plugins/static-assets.js.map +1 -0
- package/lib/plugins/view-context.d.ts +22 -0
- package/lib/plugins/view-context.d.ts.map +1 -0
- package/lib/plugins/view-context.js +132 -0
- package/lib/plugins/view-context.js.map +1 -0
- package/lib/plugins/vite-client-patch.d.ts +4 -0
- package/lib/plugins/vite-client-patch.d.ts.map +1 -0
- package/lib/plugins/vite-client-patch.js +37 -0
- package/lib/plugins/vite-client-patch.js.map +1 -0
- package/lib/plugins/ws-watchdog.d.ts +22 -0
- package/lib/plugins/ws-watchdog.d.ts.map +1 -0
- package/lib/plugins/ws-watchdog.js +103 -0
- package/lib/plugins/ws-watchdog.js.map +1 -0
- package/lib/polyfills/index.d.ts +15 -0
- package/lib/polyfills/index.d.ts.map +1 -0
- package/lib/polyfills/index.js +36 -0
- package/lib/polyfills/index.js.map +1 -0
- package/lib/utils/normalize-base-path.d.ts +37 -0
- package/lib/utils/normalize-base-path.d.ts.map +1 -0
- package/lib/utils/normalize-base-path.js +57 -0
- package/lib/utils/normalize-base-path.js.map +1 -0
- package/lib/utils/snapdom-proxy.d.ts +12 -0
- package/lib/utils/snapdom-proxy.d.ts.map +1 -0
- package/lib/utils/snapdom-proxy.js +75 -0
- package/lib/utils/snapdom-proxy.js.map +1 -0
- package/package.json +63 -0
- package/src/empty.css +1 -0
- package/src/inspector-stub.js +6 -0
- package/src/module-alias/clsx.mjs +8 -0
- package/src/module-alias/echarts-for-react.mjs +130 -0
- package/src/module-alias/echarts.mjs +43 -0
- package/src/module-alias/registry_echarts_theme.mjs +390 -0
- package/src/overlay/components.js +94 -0
- package/src/overlay/index.js +443 -0
- package/src/overlay/vite-client.js +555 -0
- package/src/polyfills/index.ts +35 -0
- package/src/runtime/ws-watchdog-client.mjs +148 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.slardarPlugin = slardarPlugin;
|
|
4
|
+
function buildSlardarScript(bid, globalName) {
|
|
5
|
+
return `
|
|
6
|
+
const slardarScript = document.createElement('script');
|
|
7
|
+
slardarScript.src = 'https://lf3-short.ibytedapm.com/slardar/fe/sdk-web/browser.cn.js?bid=${bid}&globalName=${globalName}';
|
|
8
|
+
slardarScript.crossOrigin = 'anonymous';
|
|
9
|
+
slardarScript.onload = function() {
|
|
10
|
+
if (window.${globalName}) {
|
|
11
|
+
window.${globalName}('context.merge', {
|
|
12
|
+
tenantId: window.tenantId ?? '',
|
|
13
|
+
appId: window.appId ?? '',
|
|
14
|
+
});
|
|
15
|
+
window.${globalName}('init', {
|
|
16
|
+
bid: '${bid}',
|
|
17
|
+
env: window.ENVIRONMENT || 'online',
|
|
18
|
+
userId: window.userId ?? '',
|
|
19
|
+
});
|
|
20
|
+
window.${globalName}('start');
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
slardarScript.onerror = function() {
|
|
24
|
+
console.warn('Failed to load Slardar script');
|
|
25
|
+
};
|
|
26
|
+
document.head.appendChild(slardarScript);
|
|
27
|
+
`;
|
|
28
|
+
}
|
|
29
|
+
function buildTeaScript() {
|
|
30
|
+
return `
|
|
31
|
+
(function (win, export_obj) {
|
|
32
|
+
win['LogAnalyticsObject'] = export_obj;
|
|
33
|
+
if (!win[export_obj]) {
|
|
34
|
+
function _collect() { _collect.q.push(arguments); }
|
|
35
|
+
_collect.q = _collect.q || [];
|
|
36
|
+
win[export_obj] = _collect;
|
|
37
|
+
}
|
|
38
|
+
win[export_obj].l = +new Date();
|
|
39
|
+
})(window, 'collectEvent');
|
|
40
|
+
|
|
41
|
+
const teaScript = document.createElement('script');
|
|
42
|
+
teaScript.src = 'https://lf3-cdn-tos.bytescm.com/obj/static/log-sdk/collect/5.1/collect.js';
|
|
43
|
+
teaScript.crossOrigin = 'anonymous';
|
|
44
|
+
teaScript.async = true;
|
|
45
|
+
teaScript.onerror = function() {
|
|
46
|
+
console.warn('Failed to load Tea script');
|
|
47
|
+
};
|
|
48
|
+
document.head.appendChild(teaScript);
|
|
49
|
+
`;
|
|
50
|
+
}
|
|
51
|
+
function slardarPlugin(options = {}) {
|
|
52
|
+
const { bid = 'apaas_miaoda', globalName = 'KSlardarWeb' } = options;
|
|
53
|
+
return {
|
|
54
|
+
name: 'miaoda-slardar',
|
|
55
|
+
transformIndexHtml(html) {
|
|
56
|
+
const tags = [
|
|
57
|
+
{ tag: 'script', children: buildSlardarScript(bid, globalName), injectTo: 'head-prepend' },
|
|
58
|
+
{
|
|
59
|
+
tag: 'script',
|
|
60
|
+
attrs: {
|
|
61
|
+
src: 'https://sf3-scmcdn-cn.feishucdn.com/obj/unpkg/byted/performance/0.1.2/dist/performance.iife.js',
|
|
62
|
+
crossorigin: 'anonymous',
|
|
63
|
+
defer: true,
|
|
64
|
+
},
|
|
65
|
+
injectTo: 'head-prepend',
|
|
66
|
+
},
|
|
67
|
+
{ tag: 'script', children: buildTeaScript(), injectTo: 'head-prepend' },
|
|
68
|
+
];
|
|
69
|
+
return { html, tags };
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
exports.default = slardarPlugin;
|
|
74
|
+
//# sourceMappingURL=slardar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slardar.js","sourceRoot":"","sources":["../../src/plugins/slardar.ts"],"names":[],"mappings":";;AAwEA,sCAuBC;AAxED,SAAS,kBAAkB,CAAC,GAAW,EAAE,UAAkB;IACzD,OAAO;;gGAEuF,GAAG,eAAe,UAAU;;;mBAGzG,UAAU;iBACZ,UAAU;;;;iBAIV,UAAU;kBACT,GAAG;;;;iBAIJ,UAAU;;;;;;;GAOxB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc;IACrB,OAAO;;;;;;;;;;;;;;;;;;;GAmBN,CAAC;AACJ,CAAC;AAED,SAAgB,aAAa,CAAC,UAAgC,EAAE;IAC9D,MAAM,EAAE,GAAG,GAAG,cAAc,EAAE,UAAU,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC;IAErE,OAAO;QACL,IAAI,EAAE,gBAAgB;QAEtB,kBAAkB,CAAC,IAAI;YACrB,MAAM,IAAI,GAAwB;gBAChC,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE;gBAC1F;oBACE,GAAG,EAAE,QAAQ;oBACb,KAAK,EAAE;wBACL,GAAG,EAAE,gGAAgG;wBACrG,WAAW,EAAE,WAAW;wBACxB,KAAK,EAAE,IAAI;qBACZ;oBACD,QAAQ,EAAE,cAAc;iBACzB;gBACD,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;aACxE,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
export interface StaticAssetsPluginOptions {
|
|
3
|
+
/** Client base path prefix for routes. */
|
|
4
|
+
clientBasePath?: string;
|
|
5
|
+
/** Project root directory. Defaults to `process.cwd()`. */
|
|
6
|
+
rootDir?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function staticAssetsPlugin(options?: StaticAssetsPluginOptions): Plugin;
|
|
9
|
+
export default staticAssetsPlugin;
|
|
10
|
+
//# sourceMappingURL=static-assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-assets.d.ts","sourceRoot":"","sources":["../../src/plugins/static-assets.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAqB,MAAM,EAAiB,MAAM,MAAM,CAAC;AAqErE,MAAM,WAAW,yBAAyB;IACxC,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,yBAA8B,GAAG,MAAM,CAwLlF;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,297 @@
|
|
|
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.staticAssetsPlugin = staticAssetsPlugin;
|
|
37
|
+
/**
|
|
38
|
+
* 业务工程 `shared/static/*` 静态资源解析。
|
|
39
|
+
*
|
|
40
|
+
* - JSON:dev 内联展开成 `export default {...}`;prod 走 `window.__STATIC_JSON__['key']`
|
|
41
|
+
* (prod HTML 注入 inline script 一次性塞所有 json)
|
|
42
|
+
* - 其它文件:返回 URL 字符串 `${publicPrefix}/<rel>`(默认 `${clientBasePath}/static/<rel>`)
|
|
43
|
+
* - 脚本扩展(.ts/.tsx/.js/.jsx/.mts/.cts/.mjs/.cjs):fallback 到真实路径,让 Vite 当普通模块打
|
|
44
|
+
* - 带 query 的 import(`?raw`/`?url` 等):返回真实路径 + query,让 Vite 内置处理
|
|
45
|
+
*
|
|
46
|
+
* 算法移植自 `@lark-apaas/coding-vite-preset/static-assets-plugin`,
|
|
47
|
+
* 把 `glob` 依赖换成 `fs.readdirSync` 递归遍历,去掉额外 dep。
|
|
48
|
+
*/
|
|
49
|
+
const fs = __importStar(require("node:fs"));
|
|
50
|
+
const path = __importStar(require("node:path"));
|
|
51
|
+
const PREFIX = '@shared/static/';
|
|
52
|
+
const VIRTUAL_PREFIX = '\0@shared/static/';
|
|
53
|
+
const SCRIPT_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mts', '.cts', '.mjs', '.cjs'];
|
|
54
|
+
const MIME = {
|
|
55
|
+
'.json': 'application/json',
|
|
56
|
+
'.png': 'image/png',
|
|
57
|
+
'.jpg': 'image/jpeg',
|
|
58
|
+
'.jpeg': 'image/jpeg',
|
|
59
|
+
'.gif': 'image/gif',
|
|
60
|
+
'.svg': 'image/svg+xml',
|
|
61
|
+
'.webp': 'image/webp',
|
|
62
|
+
'.ico': 'image/x-icon',
|
|
63
|
+
'.woff': 'font/woff',
|
|
64
|
+
'.woff2': 'font/woff2',
|
|
65
|
+
'.ttf': 'font/ttf',
|
|
66
|
+
'.eot': 'application/vnd.ms-fontobject',
|
|
67
|
+
'.otf': 'font/otf',
|
|
68
|
+
'.css': 'text/css',
|
|
69
|
+
'.js': 'application/javascript',
|
|
70
|
+
'.txt': 'text/plain',
|
|
71
|
+
'.html': 'text/html',
|
|
72
|
+
'.xml': 'application/xml',
|
|
73
|
+
'.pdf': 'application/pdf',
|
|
74
|
+
'.mp3': 'audio/mpeg',
|
|
75
|
+
'.mp4': 'video/mp4',
|
|
76
|
+
'.webm': 'video/webm',
|
|
77
|
+
};
|
|
78
|
+
function splitQuery(rel) {
|
|
79
|
+
const i = rel.indexOf('?');
|
|
80
|
+
return i === -1 ? [rel, ''] : [rel.slice(0, i), rel.slice(i)];
|
|
81
|
+
}
|
|
82
|
+
function resolveScriptFile(staticDir, cleanPath) {
|
|
83
|
+
const ext = path.extname(cleanPath).toLowerCase();
|
|
84
|
+
if (ext && SCRIPT_EXTENSIONS.includes(ext)) {
|
|
85
|
+
return path.join(staticDir, cleanPath);
|
|
86
|
+
}
|
|
87
|
+
if (!ext) {
|
|
88
|
+
for (const e of SCRIPT_EXTENSIONS) {
|
|
89
|
+
const p = path.join(staticDir, cleanPath + e);
|
|
90
|
+
if (fs.existsSync(p))
|
|
91
|
+
return p;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
function walkJson(dir, out, prefix = '') {
|
|
97
|
+
if (!fs.existsSync(dir))
|
|
98
|
+
return;
|
|
99
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
100
|
+
const full = path.join(dir, entry.name);
|
|
101
|
+
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
102
|
+
if (entry.isDirectory()) {
|
|
103
|
+
walkJson(full, out, rel);
|
|
104
|
+
}
|
|
105
|
+
else if (entry.isFile() && entry.name.endsWith('.json')) {
|
|
106
|
+
try {
|
|
107
|
+
const key = rel.replace(/\.json$/, '');
|
|
108
|
+
out[key] = JSON.parse(fs.readFileSync(full, 'utf-8'));
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
console.warn(`[miaoda-static-assets] skip invalid json: ${rel}: ${e instanceof Error ? e.message : String(e)}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function staticAssetsPlugin(options = {}) {
|
|
117
|
+
const { clientBasePath = '', rootDir = process.cwd() } = options;
|
|
118
|
+
const staticDir = path.resolve(rootDir, 'shared/static');
|
|
119
|
+
let isDev = true;
|
|
120
|
+
let jsonCache = null;
|
|
121
|
+
function getJson() {
|
|
122
|
+
if (!isDev && jsonCache)
|
|
123
|
+
return jsonCache;
|
|
124
|
+
const data = {};
|
|
125
|
+
walkJson(staticDir, data);
|
|
126
|
+
if (!isDev)
|
|
127
|
+
jsonCache = data;
|
|
128
|
+
return data;
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
name: 'miaoda-static-assets',
|
|
132
|
+
// 必须 enforce:'pre':早于 tsconfig paths 和 vite:json transform
|
|
133
|
+
enforce: 'pre',
|
|
134
|
+
config(_config, { command }) {
|
|
135
|
+
isDev = command === 'serve';
|
|
136
|
+
},
|
|
137
|
+
resolveId: {
|
|
138
|
+
filter: { id: /^@shared\/static\// },
|
|
139
|
+
handler(id) {
|
|
140
|
+
if (!id.startsWith(PREFIX))
|
|
141
|
+
return null;
|
|
142
|
+
const rel = id.slice(PREFIX.length);
|
|
143
|
+
const [cleanPath, query] = splitQuery(rel);
|
|
144
|
+
// ?raw / ?url 等:返回真实路径 + query,交给 Vite 内置处理
|
|
145
|
+
if (query)
|
|
146
|
+
return path.join(staticDir, cleanPath) + query;
|
|
147
|
+
// 脚本:解析到真实文件,让 vite 当普通模块打
|
|
148
|
+
const scriptPath = resolveScriptFile(staticDir, cleanPath);
|
|
149
|
+
if (scriptPath)
|
|
150
|
+
return scriptPath;
|
|
151
|
+
const virtualId = VIRTUAL_PREFIX + cleanPath;
|
|
152
|
+
// 后缀 `.js` 避免 vite:json 把 .json 虚拟模块当 JSON 文件 transform
|
|
153
|
+
return cleanPath.endsWith('.json') ? virtualId + '.js' : virtualId;
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
load(id) {
|
|
157
|
+
if (!id.startsWith(VIRTUAL_PREFIX))
|
|
158
|
+
return null;
|
|
159
|
+
let rel = id.slice(VIRTUAL_PREFIX.length);
|
|
160
|
+
if (rel.endsWith('.json.js'))
|
|
161
|
+
rel = rel.slice(0, -3); // strip 上面加的 .js
|
|
162
|
+
const isJson = rel.endsWith('.json');
|
|
163
|
+
if (isJson) {
|
|
164
|
+
if (isDev) {
|
|
165
|
+
// dev:直接内联 JSON 内容,避免依赖 window.__STATIC_JSON__
|
|
166
|
+
const full = path.join(staticDir, rel);
|
|
167
|
+
try {
|
|
168
|
+
const content = fs.readFileSync(full, 'utf-8');
|
|
169
|
+
return `export default ${content};`;
|
|
170
|
+
}
|
|
171
|
+
catch (e) {
|
|
172
|
+
console.warn(`[miaoda-static-assets] read json failed: ${rel}`, e);
|
|
173
|
+
return `export default undefined;`;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// prod:从 transformIndexHtml 注入的 window.__STATIC_JSON__ 取
|
|
177
|
+
const key = rel.replace(/\.json$/, '');
|
|
178
|
+
return `export default window.__STATIC_JSON__[${JSON.stringify(key)}];`;
|
|
179
|
+
}
|
|
180
|
+
// 非 JSON:返回 URL 字符串
|
|
181
|
+
// - dev:走 `${clientBasePath}/static/${rel}`,由本插件挂的 middleware 服务真实文件
|
|
182
|
+
// - prod:走 `${STATIC_ASSETS_BASE_URL}/${rel}`(build.sh 从 MIAODA_STATIC_CDN_PREFIX 映射,
|
|
183
|
+
// 最终来自 TOS preUploadStatic.downloadURLPrefix)。未设置时空字符串退化为相对路径——
|
|
184
|
+
// 线上 build 缺这个环境变量基本是 deploy 配置漏了,warn 一下方便排查。
|
|
185
|
+
let url;
|
|
186
|
+
if (isDev) {
|
|
187
|
+
url = `${clientBasePath}/static/${rel}`;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
const cdnPrefix = (process.env.STATIC_ASSETS_BASE_URL ?? '').replace(/\/+$/, '');
|
|
191
|
+
if (!cdnPrefix) {
|
|
192
|
+
console.warn(`[miaoda-static-assets] STATIC_ASSETS_BASE_URL is not set; "${rel}" will resolve to a relative URL. ` +
|
|
193
|
+
`Did you forget to inject MIAODA_STATIC_CDN_PREFIX in build.sh?`);
|
|
194
|
+
}
|
|
195
|
+
url = cdnPrefix ? `${cdnPrefix}/${rel}` : `/${rel}`;
|
|
196
|
+
}
|
|
197
|
+
return `export default ${JSON.stringify(url)};`;
|
|
198
|
+
},
|
|
199
|
+
transformIndexHtml() {
|
|
200
|
+
if (isDev)
|
|
201
|
+
return; // dev 直接内联,不需要 window.__STATIC_JSON__
|
|
202
|
+
const data = getJson();
|
|
203
|
+
if (Object.keys(data).length === 0)
|
|
204
|
+
return;
|
|
205
|
+
const tags = [
|
|
206
|
+
{
|
|
207
|
+
tag: 'script',
|
|
208
|
+
children: `window.__STATIC_JSON__ = ${JSON.stringify(data)};`,
|
|
209
|
+
injectTo: 'head-prepend',
|
|
210
|
+
},
|
|
211
|
+
];
|
|
212
|
+
return { html: '', tags };
|
|
213
|
+
},
|
|
214
|
+
configureServer(server) {
|
|
215
|
+
if (!fs.existsSync(staticDir))
|
|
216
|
+
return;
|
|
217
|
+
const watcher = server.watcher;
|
|
218
|
+
watcher.add(staticDir);
|
|
219
|
+
const handleChange = (changedPath) => {
|
|
220
|
+
if (!changedPath.startsWith(staticDir))
|
|
221
|
+
return;
|
|
222
|
+
const rel = path.relative(staticDir, changedPath);
|
|
223
|
+
if (rel.endsWith('.json')) {
|
|
224
|
+
// JSON 变了:invalidate 虚拟模块 + full-reload
|
|
225
|
+
const moduleId = VIRTUAL_PREFIX + rel;
|
|
226
|
+
const mod = server.environments.client.moduleGraph.getModuleById(moduleId);
|
|
227
|
+
if (mod)
|
|
228
|
+
server.environments.client.moduleGraph.invalidateModule(mod);
|
|
229
|
+
server.hot.send({ type: 'custom', event: 'static-json-update', data: { path: rel } });
|
|
230
|
+
server.hot.send({ type: 'full-reload', path: '*' });
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
server.hot.send({ type: 'custom', event: 'static-asset-update', data: { path: rel } });
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
watcher.on('change', handleChange);
|
|
237
|
+
watcher.on('add', handleChange);
|
|
238
|
+
watcher.on('unlink', (changedPath) => {
|
|
239
|
+
if (!changedPath.startsWith(staticDir))
|
|
240
|
+
return;
|
|
241
|
+
if (changedPath.endsWith('.json')) {
|
|
242
|
+
const rel = path.relative(staticDir, changedPath);
|
|
243
|
+
const moduleId = VIRTUAL_PREFIX + rel;
|
|
244
|
+
const mod = server.environments.client.moduleGraph.getModuleById(moduleId);
|
|
245
|
+
if (mod)
|
|
246
|
+
server.environments.client.moduleGraph.invalidateModule(mod);
|
|
247
|
+
}
|
|
248
|
+
server.hot.send({ type: 'full-reload', path: '*' });
|
|
249
|
+
});
|
|
250
|
+
// dev 下直接 serve `${clientBasePath}/static/...` 路径
|
|
251
|
+
server.middlewares.use((req, res, next) => {
|
|
252
|
+
const staticPrefix = `${clientBasePath}/static/`;
|
|
253
|
+
const url = req.url || '';
|
|
254
|
+
if (!url.startsWith(staticPrefix))
|
|
255
|
+
return next();
|
|
256
|
+
const rawRel = url.slice(staticPrefix.length).split('?')[0];
|
|
257
|
+
let rel;
|
|
258
|
+
try {
|
|
259
|
+
rel = decodeURIComponent(rawRel);
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
res.statusCode = 400;
|
|
263
|
+
res.end('Bad Request');
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const filePath = path.join(staticDir, rel);
|
|
267
|
+
// 防 path traversal
|
|
268
|
+
const normalized = path.normalize(filePath);
|
|
269
|
+
if (!normalized.startsWith(staticDir)) {
|
|
270
|
+
res.statusCode = 403;
|
|
271
|
+
res.end('Forbidden');
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (!fs.existsSync(filePath)) {
|
|
275
|
+
res.statusCode = 404;
|
|
276
|
+
res.end('Not Found');
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const stat = fs.statSync(filePath);
|
|
280
|
+
if (stat.isDirectory()) {
|
|
281
|
+
res.statusCode = 403;
|
|
282
|
+
res.end('Forbidden');
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
286
|
+
res.setHeader('Content-Type', MIME[ext] || 'application/octet-stream');
|
|
287
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
288
|
+
fs.createReadStream(filePath).pipe(res);
|
|
289
|
+
});
|
|
290
|
+
},
|
|
291
|
+
// closeBundle 拷贝 shared/static 的逻辑已删除——build.sh 用 rsync 直接拷到
|
|
292
|
+
// dist/output_static/(部署侧识别的目录),plugin 之前拷到 dist/shared/static
|
|
293
|
+
// 是死代码、没人读,而且没排除 .ts/.tsx 还可能误传脚本文件。
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
exports.default = staticAssetsPlugin;
|
|
297
|
+
//# sourceMappingURL=static-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-assets.js","sourceRoot":"","sources":["../../src/plugins/static-assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { IncomingMessage } from 'node:http';
|
|
2
|
+
import type { Plugin } from 'vite';
|
|
3
|
+
interface RequestRenderContext {
|
|
4
|
+
userId: string;
|
|
5
|
+
tenantId: number | string;
|
|
6
|
+
userName: string;
|
|
7
|
+
csrfToken: string;
|
|
8
|
+
environment: 'staging' | 'gray' | 'online';
|
|
9
|
+
}
|
|
10
|
+
/** 从 incoming request 抽出全部 server 端能拿到的 view-context 字段 */
|
|
11
|
+
export declare function buildRenderContext(req: IncomingMessage): RequestRenderContext;
|
|
12
|
+
export interface ViewContextPluginOptions {
|
|
13
|
+
/**
|
|
14
|
+
* 显式传入的 appId override。preset 已经从 `CLIENT_BASE_PATH=/app/<appId>`
|
|
15
|
+
* 提取,设置后 inline script 直接拼真值字面量。未设置则走 IIFE 从 URL
|
|
16
|
+
* 解析(prod / 部分本地 dev URL 没 base path 时用)。
|
|
17
|
+
*/
|
|
18
|
+
appId?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function viewContextPlugin(options?: ViewContextPluginOptions): Plugin;
|
|
21
|
+
export default viewContextPlugin;
|
|
22
|
+
//# sourceMappingURL=view-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-context.d.ts","sourceRoot":"","sources":["../../src/plugins/view-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,MAAM,CAAC;AA6BtD,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC5C;AA4BD,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,oBAAoB,CAS7E;AAID,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+CD,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM,CA+BhF;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildRenderContext = buildRenderContext;
|
|
4
|
+
exports.viewContextPlugin = viewContextPlugin;
|
|
5
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
6
|
+
/**
|
|
7
|
+
* 在 HTML head 注入 inline script,把启动期上下文挂到 `window`。
|
|
8
|
+
*
|
|
9
|
+
* **dev 期完全走 server 渲染**:在 `configureServer` 中间件里解析 incoming request
|
|
10
|
+
* 的 cookie / host / `x-larkgw-suda-webuser` header,用 `AsyncLocalStorage` 绑到当前
|
|
11
|
+
* 异步链;`transformIndexHtml` 钩子读出后**全部拼成字面量**注入。
|
|
12
|
+
*
|
|
13
|
+
* **prod / 本地裸 dev 无 request 上下文时**走 IIFE fallback:
|
|
14
|
+
* - `csrfToken` 从 `document.cookie` 读
|
|
15
|
+
* - `ENVIRONMENT` 从 `location.hostname` 推
|
|
16
|
+
* - `userId / tenantId / userName` 空字符串
|
|
17
|
+
*
|
|
18
|
+
* 这套设计针对纯前端 jsPage 模板:dev 期沙箱网关已经把 `x-larkgw-suda-webuser`
|
|
19
|
+
* 透传给本地 devserver,于是 server 端有完整 user 上下文;prod 由业务侧
|
|
20
|
+
* `useCurrentUserProfile` 等 hook 异步 fetch 兜底。
|
|
21
|
+
*/
|
|
22
|
+
const SUDA_HEADER = 'x-larkgw-suda-webuser';
|
|
23
|
+
const requestContext = new node_async_hooks_1.AsyncLocalStorage();
|
|
24
|
+
// ───────────── header / cookie / host 解析 helpers ─────────────
|
|
25
|
+
function parseSudaWebUser(header) {
|
|
26
|
+
if (typeof header !== 'string' || !header)
|
|
27
|
+
return null;
|
|
28
|
+
try {
|
|
29
|
+
return JSON.parse(decodeURIComponent(header));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function parseCsrfToken(cookieHeader) {
|
|
36
|
+
if (!cookieHeader)
|
|
37
|
+
return '';
|
|
38
|
+
const m = cookieHeader.match(/(?:^|;\s*)suda-csrf-token=([^;]+)/);
|
|
39
|
+
return m ? decodeURIComponent(m[1]) : '';
|
|
40
|
+
}
|
|
41
|
+
function deriveEnvironment(host) {
|
|
42
|
+
if (!host)
|
|
43
|
+
return 'online';
|
|
44
|
+
if (host.includes('boe'))
|
|
45
|
+
return 'staging';
|
|
46
|
+
if (host.includes('feishu-pre') || host.includes('-pre.'))
|
|
47
|
+
return 'gray';
|
|
48
|
+
return 'online';
|
|
49
|
+
}
|
|
50
|
+
/** 从 incoming request 抽出全部 server 端能拿到的 view-context 字段 */
|
|
51
|
+
function buildRenderContext(req) {
|
|
52
|
+
const user = parseSudaWebUser(req.headers[SUDA_HEADER]);
|
|
53
|
+
return {
|
|
54
|
+
userId: user?.user_id ?? '',
|
|
55
|
+
tenantId: user?.tenant_id ?? '',
|
|
56
|
+
userName: user?.user_name?.zh_cn ?? '',
|
|
57
|
+
csrfToken: parseCsrfToken(req.headers.cookie),
|
|
58
|
+
environment: deriveEnvironment(req.headers.host),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function appIdExpr(appId) {
|
|
62
|
+
if (appId)
|
|
63
|
+
return JSON.stringify(appId);
|
|
64
|
+
return `(function () {
|
|
65
|
+
var p = location.pathname.match(/\\/app\\/(app_[a-z0-9]+)/i);
|
|
66
|
+
if (p) return p[1];
|
|
67
|
+
var h = location.hostname.match(/app_[a-z0-9]+/i);
|
|
68
|
+
return h ? h[0] : '';
|
|
69
|
+
})()`;
|
|
70
|
+
}
|
|
71
|
+
/** 有 request context(dev 沙箱 / dev 本地):全字面量 */
|
|
72
|
+
function buildScriptFromRequest(options, ctx) {
|
|
73
|
+
return `
|
|
74
|
+
window.appId = ${appIdExpr(options.appId)};
|
|
75
|
+
window.userId = ${JSON.stringify(ctx.userId)};
|
|
76
|
+
window.tenantId = ${JSON.stringify(ctx.tenantId)};
|
|
77
|
+
window.userName = ${JSON.stringify(ctx.userName)};
|
|
78
|
+
window.csrfToken = ${JSON.stringify(ctx.csrfToken)};
|
|
79
|
+
window.ENVIRONMENT = ${JSON.stringify(ctx.environment)};
|
|
80
|
+
`;
|
|
81
|
+
}
|
|
82
|
+
/** 无 request context(prod build):IIFE fallback */
|
|
83
|
+
function buildScriptFallback(options) {
|
|
84
|
+
return `
|
|
85
|
+
window.appId = ${appIdExpr(options.appId)};
|
|
86
|
+
window.userId = '';
|
|
87
|
+
window.tenantId = '';
|
|
88
|
+
window.userName = '';
|
|
89
|
+
window.csrfToken = (function () {
|
|
90
|
+
var m = document.cookie.match(/(?:^|;\\s*)suda-csrf-token=([^;]+)/);
|
|
91
|
+
return m ? decodeURIComponent(m[1]) : '';
|
|
92
|
+
})();
|
|
93
|
+
window.ENVIRONMENT = (function () {
|
|
94
|
+
var h = location.hostname;
|
|
95
|
+
if (h.indexOf('boe') !== -1) return 'staging';
|
|
96
|
+
if (h.indexOf('feishu-pre') !== -1 || h.indexOf('-pre.') !== -1) return 'gray';
|
|
97
|
+
return 'online';
|
|
98
|
+
})();
|
|
99
|
+
`;
|
|
100
|
+
}
|
|
101
|
+
function viewContextPlugin(options = {}) {
|
|
102
|
+
return {
|
|
103
|
+
name: 'miaoda-view-context',
|
|
104
|
+
/**
|
|
105
|
+
* dev 期前置 middleware:每个请求都把 render context 绑到 ALS。
|
|
106
|
+
* 后续 `transformIndexHtml` 在同一异步链里 `getStore()` 读出。
|
|
107
|
+
*/
|
|
108
|
+
configureServer(server) {
|
|
109
|
+
server.middlewares.use((req, _res, next) => {
|
|
110
|
+
const ctx = buildRenderContext(req);
|
|
111
|
+
requestContext.run(ctx, () => next());
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
transformIndexHtml() {
|
|
115
|
+
const ctx = requestContext.getStore();
|
|
116
|
+
const children = ctx
|
|
117
|
+
? buildScriptFromRequest(options, ctx)
|
|
118
|
+
: buildScriptFallback(options);
|
|
119
|
+
const tags = [
|
|
120
|
+
{
|
|
121
|
+
tag: 'script',
|
|
122
|
+
children,
|
|
123
|
+
// head-prepend:必须在业务代码 / runtime 之前注入,保证业务可同步读 window 全局
|
|
124
|
+
injectTo: 'head-prepend',
|
|
125
|
+
},
|
|
126
|
+
];
|
|
127
|
+
return tags;
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
exports.default = viewContextPlugin;
|
|
132
|
+
//# sourceMappingURL=view-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-context.js","sourceRoot":"","sources":["../../src/plugins/view-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAkBnC,wBAAgB,qBAAqB,IAAI,MAAM,CAqB9C;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
const RECONNECT_RELOAD_PATTERN = /(await waitForSuccessfulPing\(url\.href\);)\r?\n(\s*)location\.reload\(\);/;
|
|
18
|
+
function viteClientPatchPlugin() {
|
|
19
|
+
return {
|
|
20
|
+
name: 'miaoda-vite-client-patch',
|
|
21
|
+
enforce: 'post',
|
|
22
|
+
apply: 'serve',
|
|
23
|
+
transform(code, id) {
|
|
24
|
+
if (!id.includes('vite/dist/client/client.mjs'))
|
|
25
|
+
return;
|
|
26
|
+
if (!RECONNECT_RELOAD_PATTERN.test(code)) {
|
|
27
|
+
console.warn('[miaoda-vite-client-patch] reconnect-reload pattern not found in @vite/client. ' +
|
|
28
|
+
'patch NOT applied — Vite client.mjs may have changed.');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const patched = code.replace(RECONNECT_RELOAD_PATTERN, (_, pingLine) => pingLine);
|
|
32
|
+
return { code: patched };
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
exports.default = viteClientPatchPlugin;
|
|
37
|
+
//# 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":";;AAkBA,sDAqBC;AArCD;;;;;;;;;;;;GAYG;AACH,MAAM,wBAAwB,GAC5B,4EAA4E,CAAC;AAE/E,SAAgB,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,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,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,OAAO,CAAC,IAAI,CACV,iFAAiF;oBAC/E,uDAAuD,CAC1D,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;YAClF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
export interface WsWatchdogPluginOptions {
|
|
12
|
+
pingEvent?: string;
|
|
13
|
+
pongEvent?: string;
|
|
14
|
+
/**
|
|
15
|
+
* 客户端 base path(如 `/app/app_xxx`)。沙箱网关把完整路径透传给 Vite,
|
|
16
|
+
* middleware 匹配和注入的 `<script src>` 都必须带 base;空串退化到裸路径。
|
|
17
|
+
*/
|
|
18
|
+
clientBasePath?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function wsWatchdogPlugin(options?: WsWatchdogPluginOptions): Plugin;
|
|
21
|
+
export default wsWatchdogPlugin;
|
|
22
|
+
//# 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;;;;;;;;GAQG;AACH,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAUD,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,MAAM,CA6D9E;AAED,eAAe,gBAAgB,CAAC"}
|