@lark-apaas/fullstack-vite-preset 1.0.1-beta.2 → 1.0.1-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/module-alias/echarts-for-react.d.ts +1 -8
- package/lib/module-alias/echarts-for-react.d.ts.map +1 -1
- package/lib/module-alias/echarts-for-react.js +45 -11
- package/lib/module-alias/echarts-for-react.js.map +1 -1
- package/lib/module-alias/echarts.d.ts +4 -0
- package/lib/module-alias/echarts.d.ts.map +1 -1
- package/lib/module-alias/echarts.js +17 -2
- package/lib/module-alias/echarts.js.map +1 -1
- package/lib/module-alias/registry_echarts_theme.d.ts +2 -6
- package/lib/module-alias/registry_echarts_theme.d.ts.map +1 -1
- package/lib/module-alias/registry_echarts_theme.js +1 -1
- package/lib/module-alias/registry_echarts_theme.js.map +1 -1
- 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/preset.d.ts.map +1 -1
- package/lib/preset.js +44 -12
- package/lib/preset.js.map +1 -1
- package/lib/vite-plugins/css-legacy-plugin.d.ts +12 -0
- package/lib/vite-plugins/css-legacy-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/css-legacy-plugin.js +205 -0
- package/lib/vite-plugins/css-legacy-plugin.js.map +1 -0
- package/lib/vite-plugins/html-output-plugin.d.ts +7 -0
- package/lib/vite-plugins/html-output-plugin.d.ts.map +1 -1
- package/lib/vite-plugins/html-output-plugin.js +49 -7
- package/lib/vite-plugins/html-output-plugin.js.map +1 -1
- package/lib/vite-plugins/module-alias-plugin.d.ts.map +1 -1
- package/lib/vite-plugins/module-alias-plugin.js +4 -0
- package/lib/vite-plugins/module-alias-plugin.js.map +1 -1
- package/lib/vite-plugins/polyfill-plugin.d.ts +12 -0
- package/lib/vite-plugins/polyfill-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/polyfill-plugin.js +120 -0
- package/lib/vite-plugins/polyfill-plugin.js.map +1 -0
- package/lib/vite-plugins/route-parser-plugin.d.ts +3 -1
- package/lib/vite-plugins/route-parser-plugin.d.ts.map +1 -1
- package/lib/vite-plugins/route-parser-plugin.js +47 -18
- package/lib/vite-plugins/route-parser-plugin.js.map +1 -1
- package/lib/vite-plugins/static-assets-plugin.d.ts +27 -0
- package/lib/vite-plugins/static-assets-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/static-assets-plugin.js +393 -0
- package/lib/vite-plugins/static-assets-plugin.js.map +1 -0
- package/lib/vite-plugins/vite-client-patch-plugin.d.ts +23 -0
- package/lib/vite-plugins/vite-client-patch-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/vite-client-patch-plugin.js +53 -0
- package/lib/vite-plugins/vite-client-patch-plugin.js.map +1 -0
- package/package.json +10 -4
- package/src/module-alias/echarts-for-react.mjs +129 -0
- package/src/module-alias/echarts.mjs +14 -0
- package/src/module-alias/registry_echarts_theme.mjs +1 -1
- package/lib/vite-plugins/inspector-css-plugin.d.ts +0 -19
- package/lib/vite-plugins/inspector-css-plugin.d.ts.map +0 -1
- package/lib/vite-plugins/inspector-css-plugin.js +0 -70
- package/lib/vite-plugins/inspector-css-plugin.js.map +0 -1
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cssLegacyPlugin = cssLegacyPlugin;
|
|
4
|
+
const lightningcss_1 = require("lightningcss");
|
|
5
|
+
/**
|
|
6
|
+
* CSS Legacy Plugin (Vite)
|
|
7
|
+
*
|
|
8
|
+
* 对齐 rspack-preset 的 CssLegacyPlugin:
|
|
9
|
+
* 在构建完成后生成一份兼容旧浏览器的 CSS 文件(.legacy.css)
|
|
10
|
+
* 并在 HTML 中注入检测脚本,根据浏览器版本加载对应的 CSS
|
|
11
|
+
*
|
|
12
|
+
* 仅在生产构建时生效
|
|
13
|
+
*/
|
|
14
|
+
function cssLegacyPlugin() {
|
|
15
|
+
return {
|
|
16
|
+
name: 'fullstack-css-legacy',
|
|
17
|
+
apply: 'build',
|
|
18
|
+
enforce: 'post',
|
|
19
|
+
generateBundle(_options, bundle) {
|
|
20
|
+
// 1. 找到所有 CSS 产物,生成 legacy 版本
|
|
21
|
+
const cssFiles = Object.keys(bundle).filter((name) => name.endsWith('.css') && !name.endsWith('.legacy.css'));
|
|
22
|
+
for (const cssFile of cssFiles) {
|
|
23
|
+
const chunk = bundle[cssFile];
|
|
24
|
+
if (chunk.type !== 'asset')
|
|
25
|
+
continue;
|
|
26
|
+
const source = typeof chunk.source === 'string' ? chunk.source : Buffer.from(chunk.source).toString('utf-8');
|
|
27
|
+
try {
|
|
28
|
+
// 预处理 CSS
|
|
29
|
+
let cssContent = preprocessCss(source);
|
|
30
|
+
// 使用 LightningCSS 转换现代 CSS 特性
|
|
31
|
+
const result = (0, lightningcss_1.transform)({
|
|
32
|
+
filename: cssFile,
|
|
33
|
+
code: Buffer.from(cssContent),
|
|
34
|
+
minify: true,
|
|
35
|
+
targets: {
|
|
36
|
+
ios_saf: (12 << 16),
|
|
37
|
+
safari: (12 << 16),
|
|
38
|
+
chrome: (80 << 16),
|
|
39
|
+
},
|
|
40
|
+
include: lightningcss_1.Features.Nesting |
|
|
41
|
+
lightningcss_1.Features.MediaQueries |
|
|
42
|
+
lightningcss_1.Features.Colors |
|
|
43
|
+
lightningcss_1.Features.Selectors |
|
|
44
|
+
lightningcss_1.Features.ColorFunction |
|
|
45
|
+
lightningcss_1.Features.OklabColors |
|
|
46
|
+
lightningcss_1.Features.LabColors |
|
|
47
|
+
lightningcss_1.Features.P3Colors |
|
|
48
|
+
lightningcss_1.Features.HexAlphaColors |
|
|
49
|
+
lightningcss_1.Features.LightDark,
|
|
50
|
+
errorRecovery: true,
|
|
51
|
+
});
|
|
52
|
+
// 后处理 CSS
|
|
53
|
+
let legacyCss = Buffer.from(result.code).toString('utf-8');
|
|
54
|
+
legacyCss = postprocessCss(legacyCss);
|
|
55
|
+
const legacyFileName = cssFile.replace('.css', '.legacy.css');
|
|
56
|
+
this.emitFile({
|
|
57
|
+
type: 'asset',
|
|
58
|
+
fileName: legacyFileName,
|
|
59
|
+
source: legacyCss,
|
|
60
|
+
});
|
|
61
|
+
console.log(`[CssLegacyPlugin] Generated ${legacyFileName} (${Math.round(legacyCss.length / 1024)}KB)`);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error(`[CssLegacyPlugin] Failed to transform ${cssFile}:`, error);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// 2. 修改 HTML,注入 CSS 版本检测脚本
|
|
68
|
+
const htmlFiles = Object.keys(bundle).filter((name) => name.endsWith('.html'));
|
|
69
|
+
for (const htmlFile of htmlFiles) {
|
|
70
|
+
const chunk = bundle[htmlFile];
|
|
71
|
+
if (chunk.type !== 'asset')
|
|
72
|
+
continue;
|
|
73
|
+
let htmlContent = typeof chunk.source === 'string' ? chunk.source : Buffer.from(chunk.source).toString('utf-8');
|
|
74
|
+
const cssLinkRegex = /<link[^>]+href="([^"]+\.css)"[^>]*>/g;
|
|
75
|
+
const cssLinks = [...htmlContent.matchAll(cssLinkRegex)];
|
|
76
|
+
if (cssLinks.length === 0)
|
|
77
|
+
continue;
|
|
78
|
+
const detectionScript = generateDetectionScript(cssLinks);
|
|
79
|
+
// 移除原始 CSS link 标签
|
|
80
|
+
for (const match of cssLinks) {
|
|
81
|
+
htmlContent = htmlContent.replace(match[0], '');
|
|
82
|
+
}
|
|
83
|
+
// 注入检测脚本到 <head>
|
|
84
|
+
htmlContent = htmlContent.replace(/<head([^>]*)>/i, `<head$1>\n${detectionScript}`);
|
|
85
|
+
chunk.source = htmlContent;
|
|
86
|
+
console.log(`[CssLegacyPlugin] Updated ${htmlFile} with CSS detection script`);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 预处理 CSS:移除/转换 LightningCSS 不支持降级的特性
|
|
93
|
+
*/
|
|
94
|
+
function preprocessCss(css) {
|
|
95
|
+
// 1. 移除所有 @property 规则(iOS 16.4+ 才支持)
|
|
96
|
+
css = css.replace(/@property\s+--[\w-]+\s*\{[^}]*\}/g, '');
|
|
97
|
+
// 2. 展开 @layer 规则(iOS 15.4+ 才支持)
|
|
98
|
+
css = unwrapAtLayer(css);
|
|
99
|
+
// 3. 移除 @supports 中的 color-mix 检测块
|
|
100
|
+
css = removeColorMixSupports(css);
|
|
101
|
+
return css;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 后处理 CSS:清理可能残留的不支持特性
|
|
105
|
+
*/
|
|
106
|
+
function postprocessCss(css) {
|
|
107
|
+
css = unwrapAtLayer(css);
|
|
108
|
+
css = css.replace(/@property\s+--[\w-]+\s*\{[^}]*\}/g, '');
|
|
109
|
+
css = removeColorMixSupports(css);
|
|
110
|
+
css = css.replace(/@supports\s*\([^)]*\)\s*\{\s*\}/g, '');
|
|
111
|
+
return css;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 展开 @layer 规则,保留内部样式
|
|
115
|
+
*/
|
|
116
|
+
function unwrapAtLayer(css) {
|
|
117
|
+
let result = css;
|
|
118
|
+
let changed = true;
|
|
119
|
+
while (changed) {
|
|
120
|
+
changed = false;
|
|
121
|
+
const layerRegex = /@layer\s+[\w-]+\s*\{/g;
|
|
122
|
+
let match;
|
|
123
|
+
while ((match = layerRegex.exec(result)) !== null) {
|
|
124
|
+
const startIndex = match.index;
|
|
125
|
+
const contentStart = startIndex + match[0].length;
|
|
126
|
+
let depth = 1;
|
|
127
|
+
let i = contentStart;
|
|
128
|
+
while (i < result.length && depth > 0) {
|
|
129
|
+
if (result[i] === '{')
|
|
130
|
+
depth++;
|
|
131
|
+
else if (result[i] === '}')
|
|
132
|
+
depth--;
|
|
133
|
+
i++;
|
|
134
|
+
}
|
|
135
|
+
if (depth === 0) {
|
|
136
|
+
const innerContent = result.slice(contentStart, i - 1);
|
|
137
|
+
result = result.slice(0, startIndex) + innerContent + result.slice(i);
|
|
138
|
+
changed = true;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return result;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 移除 @supports (color: color-mix(...)) 块
|
|
147
|
+
*/
|
|
148
|
+
function removeColorMixSupports(css) {
|
|
149
|
+
let result = css;
|
|
150
|
+
let changed = true;
|
|
151
|
+
while (changed) {
|
|
152
|
+
changed = false;
|
|
153
|
+
const supportsRegex = /@supports\s*\(\s*color\s*:\s*color-mix\s*\([^)]+\)\s*\)\s*\{/g;
|
|
154
|
+
let match;
|
|
155
|
+
while ((match = supportsRegex.exec(result)) !== null) {
|
|
156
|
+
const startIndex = match.index;
|
|
157
|
+
const contentStart = startIndex + match[0].length;
|
|
158
|
+
let depth = 1;
|
|
159
|
+
let i = contentStart;
|
|
160
|
+
while (i < result.length && depth > 0) {
|
|
161
|
+
if (result[i] === '{')
|
|
162
|
+
depth++;
|
|
163
|
+
else if (result[i] === '}')
|
|
164
|
+
depth--;
|
|
165
|
+
i++;
|
|
166
|
+
}
|
|
167
|
+
if (depth === 0) {
|
|
168
|
+
result = result.slice(0, startIndex) + result.slice(i);
|
|
169
|
+
changed = true;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
function generateDetectionScript(cssLinks) {
|
|
177
|
+
const cssUrls = cssLinks.map((match) => match[1]);
|
|
178
|
+
return `<script>
|
|
179
|
+
(function() {
|
|
180
|
+
var isModernBrowser = (function() {
|
|
181
|
+
try {
|
|
182
|
+
if (typeof CSS === 'undefined' || typeof CSS.supports !== 'function') return false;
|
|
183
|
+
if (!CSS.supports('selector(:has(*))')) return false;
|
|
184
|
+
if (!CSS.supports('color', 'color-mix(in srgb, red, blue)')) return false;
|
|
185
|
+
if (!CSS.supports('color', 'oklch(50% 0.1 0)')) return false;
|
|
186
|
+
return true;
|
|
187
|
+
} catch (e) {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
})();
|
|
191
|
+
|
|
192
|
+
var cssUrls = ${JSON.stringify(cssUrls)};
|
|
193
|
+
var suffix = isModernBrowser ? '' : '.legacy';
|
|
194
|
+
|
|
195
|
+
cssUrls.forEach(function(url) {
|
|
196
|
+
var finalUrl = url.replace(/\\.css$/, suffix + '.css');
|
|
197
|
+
document.write('<link rel="stylesheet" href="' + finalUrl + '">');
|
|
198
|
+
});
|
|
199
|
+
})();
|
|
200
|
+
</script>
|
|
201
|
+
<noscript>
|
|
202
|
+
${cssUrls.map((url) => ` <link rel="stylesheet" href="${url}">`).join('\n')}
|
|
203
|
+
</noscript>`;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=css-legacy-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-legacy-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/css-legacy-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { Plugin } from 'vite';
|
|
2
|
+
/**
|
|
3
|
+
* Minify HTML while preserving HBS (Handlebars) template expressions.
|
|
4
|
+
*
|
|
5
|
+
* HBS expressions like {{csrfToken}} and {{{appAvatar}}} are temporarily
|
|
6
|
+
* replaced with safe placeholders before minification, then restored after.
|
|
7
|
+
*/
|
|
8
|
+
export declare function minifyHtmlWithHbsProtection(html: string): Promise<string>;
|
|
2
9
|
export interface HtmlOutputPluginOptions {
|
|
3
10
|
/** Whether running in development mode */
|
|
4
11
|
isDev: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-output-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/html-output-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAiC,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"html-output-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/html-output-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAiC,MAAM,MAAM,CAAC;AAGlE;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0B/E;AAED,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,KAAK,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAwIzE"}
|
|
@@ -3,9 +3,41 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.minifyHtmlWithHbsProtection = minifyHtmlWithHbsProtection;
|
|
6
7
|
exports.htmlOutputPlugin = htmlOutputPlugin;
|
|
7
8
|
const fs_1 = __importDefault(require("fs"));
|
|
8
9
|
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const html_minifier_terser_1 = require("html-minifier-terser");
|
|
11
|
+
/**
|
|
12
|
+
* Minify HTML while preserving HBS (Handlebars) template expressions.
|
|
13
|
+
*
|
|
14
|
+
* HBS expressions like {{csrfToken}} and {{{appAvatar}}} are temporarily
|
|
15
|
+
* replaced with safe placeholders before minification, then restored after.
|
|
16
|
+
*/
|
|
17
|
+
async function minifyHtmlWithHbsProtection(html) {
|
|
18
|
+
// Replace HBS expressions with placeholders before minification
|
|
19
|
+
// to prevent html-minifier-terser from corrupting them
|
|
20
|
+
const hbsPlaceholders = [];
|
|
21
|
+
let processed = html.replace(/\{\{\{?.+?\}\}\}?/g, (match) => {
|
|
22
|
+
const index = hbsPlaceholders.length;
|
|
23
|
+
hbsPlaceholders.push(match);
|
|
24
|
+
return `__HBS_${index}__`;
|
|
25
|
+
});
|
|
26
|
+
processed = await (0, html_minifier_terser_1.minify)(processed, {
|
|
27
|
+
collapseWhitespace: true,
|
|
28
|
+
removeComments: true,
|
|
29
|
+
removeRedundantAttributes: true,
|
|
30
|
+
removeEmptyAttributes: true,
|
|
31
|
+
minifyCSS: true,
|
|
32
|
+
// Do NOT minifyJS — inline scripts may reference HBS placeholders
|
|
33
|
+
minifyJS: false,
|
|
34
|
+
});
|
|
35
|
+
// Restore HBS expressions
|
|
36
|
+
processed = processed.replace(/__HBS_(\d+)__/g, (_, index) => {
|
|
37
|
+
return hbsPlaceholders[Number(index)];
|
|
38
|
+
});
|
|
39
|
+
return processed;
|
|
40
|
+
}
|
|
9
41
|
/**
|
|
10
42
|
* Vite plugin to handle HTML output:
|
|
11
43
|
* 1. In production: fixes HTML output path (removes extra 'client' directory)
|
|
@@ -70,12 +102,10 @@ function htmlOutputPlugin(options) {
|
|
|
70
102
|
if (!isDev)
|
|
71
103
|
return;
|
|
72
104
|
server = devServer;
|
|
73
|
-
// Return a post hook to run after
|
|
105
|
+
// Return a post hook to run after all plugins' configureServer and
|
|
106
|
+
// Vite's internal middlewares are set up
|
|
74
107
|
return () => {
|
|
75
|
-
|
|
76
|
-
setTimeout(() => {
|
|
77
|
-
writeHtmlToDisk();
|
|
78
|
-
}, 100);
|
|
108
|
+
writeHtmlToDisk();
|
|
79
109
|
// Watch for HTML file changes
|
|
80
110
|
const rollupInput = config.build.rollupOptions?.input;
|
|
81
111
|
let htmlPath;
|
|
@@ -99,8 +129,8 @@ function htmlOutputPlugin(options) {
|
|
|
99
129
|
}
|
|
100
130
|
};
|
|
101
131
|
},
|
|
102
|
-
// In production, fix the HTML output path after build
|
|
103
|
-
closeBundle() {
|
|
132
|
+
// In production, fix the HTML output path and minify after build
|
|
133
|
+
async closeBundle() {
|
|
104
134
|
if (!isDev && config) {
|
|
105
135
|
const outDir = config.build.outDir;
|
|
106
136
|
const wrongPath = path_1.default.resolve(outDir, 'client/index.html');
|
|
@@ -122,6 +152,18 @@ function htmlOutputPlugin(options) {
|
|
|
122
152
|
// Directory doesn't exist or not empty, ignore
|
|
123
153
|
}
|
|
124
154
|
}
|
|
155
|
+
// Minify HTML (protect HBS templates like {{csrfToken}}, {{{appAvatar}}})
|
|
156
|
+
if (fs_1.default.existsSync(correctPath)) {
|
|
157
|
+
try {
|
|
158
|
+
const html = fs_1.default.readFileSync(correctPath, 'utf-8');
|
|
159
|
+
const minified = await minifyHtmlWithHbsProtection(html);
|
|
160
|
+
fs_1.default.writeFileSync(correctPath, minified);
|
|
161
|
+
console.log(`[html-output] Minified: ${correctPath}`);
|
|
162
|
+
}
|
|
163
|
+
catch (e) {
|
|
164
|
+
console.warn(`[html-output] HTML minification failed, skipping:`, e);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
125
167
|
}
|
|
126
168
|
},
|
|
127
169
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-output-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/html-output-plugin.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"html-output-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/html-output-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-alias-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/module-alias-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"module-alias-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/module-alias-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA6B1C;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -28,6 +28,10 @@ function moduleAliasPlugin() {
|
|
|
28
28
|
if (source === 'echarts') {
|
|
29
29
|
return path_1.default.resolve(__dirname, '../../src/module-alias/echarts.mjs');
|
|
30
30
|
}
|
|
31
|
+
// Replace 'echarts-for-react' with our wrapper (ESM version in src/)
|
|
32
|
+
if (source === 'echarts-for-react') {
|
|
33
|
+
return path_1.default.resolve(__dirname, '../../src/module-alias/echarts-for-react.mjs');
|
|
34
|
+
}
|
|
31
35
|
return null;
|
|
32
36
|
},
|
|
33
37
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-alias-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/module-alias-plugin.ts"],"names":[],"mappings":";;;;;AASA,
|
|
1
|
+
{"version":3,"file":"module-alias-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/module-alias-plugin.ts"],"names":[],"mappings":";;;;;AASA,8CA6BC;AArCD,gDAAwB;AAExB;;;;;GAKG;AACH,SAAgB,iBAAiB;IAC/B,OAAO;QACL,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,KAAK;QAEd,SAAS,CAAC,MAAM,EAAE,QAAQ;YACxB,wDAAwD;YACxD,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBAClD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,wDAAwD;YACxD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,OAAO,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;YACpE,CAAC;YAED,2DAA2D;YAC3D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oCAAoC,CAAC,CAAC;YACvE,CAAC;YAED,qEAAqE;YACrE,IAAI,MAAM,KAAK,mBAAmB,EAAE,CAAC;gBACnC,OAAO,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,8CAA8C,CAAC,CAAC;YACjF,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
/**
|
|
3
|
+
* Polyfill Plugin (Vite)
|
|
4
|
+
*
|
|
5
|
+
* 对齐 rspack-preset 的 PolyfillPlugin:
|
|
6
|
+
* 使用 core-js 为旧版浏览器生成独立的 polyfill 文件
|
|
7
|
+
* 通过检测脚本按需加载,现代浏览器不会加载 polyfill
|
|
8
|
+
*
|
|
9
|
+
* 仅在生产构建时生效
|
|
10
|
+
*/
|
|
11
|
+
export declare function polyfillPlugin(): Plugin;
|
|
12
|
+
//# sourceMappingURL=polyfill-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyfill-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/polyfill-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;AAGnD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAiEvC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.polyfillPlugin = polyfillPlugin;
|
|
40
|
+
const path_1 = __importDefault(require("path"));
|
|
41
|
+
/**
|
|
42
|
+
* Polyfill Plugin (Vite)
|
|
43
|
+
*
|
|
44
|
+
* 对齐 rspack-preset 的 PolyfillPlugin:
|
|
45
|
+
* 使用 core-js 为旧版浏览器生成独立的 polyfill 文件
|
|
46
|
+
* 通过检测脚本按需加载,现代浏览器不会加载 polyfill
|
|
47
|
+
*
|
|
48
|
+
* 仅在生产构建时生效
|
|
49
|
+
*/
|
|
50
|
+
function polyfillPlugin() {
|
|
51
|
+
let config;
|
|
52
|
+
return {
|
|
53
|
+
name: 'fullstack-polyfill',
|
|
54
|
+
apply: 'build',
|
|
55
|
+
enforce: 'post',
|
|
56
|
+
configResolved(resolvedConfig) {
|
|
57
|
+
config = resolvedConfig;
|
|
58
|
+
},
|
|
59
|
+
async generateBundle(_options, bundle) {
|
|
60
|
+
// 使用 esbuild 打包 polyfills 入口
|
|
61
|
+
const polyfillEntry = path_1.default.resolve(__dirname, '../polyfills/index');
|
|
62
|
+
const { build } = await Promise.resolve().then(() => __importStar(require('esbuild')));
|
|
63
|
+
try {
|
|
64
|
+
const result = await build({
|
|
65
|
+
entryPoints: [polyfillEntry],
|
|
66
|
+
bundle: true,
|
|
67
|
+
write: false,
|
|
68
|
+
format: 'iife',
|
|
69
|
+
minify: true,
|
|
70
|
+
target: ['es2015'],
|
|
71
|
+
});
|
|
72
|
+
const polyfillCode = result.outputFiles?.[0]?.text || '';
|
|
73
|
+
this.emitFile({
|
|
74
|
+
type: 'asset',
|
|
75
|
+
fileName: 'polyfills.js',
|
|
76
|
+
source: polyfillCode,
|
|
77
|
+
});
|
|
78
|
+
console.log(`[PolyfillPlugin] Generated polyfills.js (${Math.round(polyfillCode.length / 1024)}KB)`);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error('[PolyfillPlugin] Failed to build polyfills:', error);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// 修改 HTML,注入检测脚本
|
|
85
|
+
const base = config.base || '/';
|
|
86
|
+
const polyfillUrl = `${base}polyfills.js`.replace(/\/+/g, '/').replace(':/', '://');
|
|
87
|
+
const htmlFiles = Object.keys(bundle).filter((name) => name.endsWith('.html'));
|
|
88
|
+
for (const htmlFile of htmlFiles) {
|
|
89
|
+
const chunk = bundle[htmlFile];
|
|
90
|
+
if (chunk.type !== 'asset')
|
|
91
|
+
continue;
|
|
92
|
+
let htmlContent = typeof chunk.source === 'string' ? chunk.source : Buffer.from(chunk.source).toString('utf-8');
|
|
93
|
+
const detectionScript = generateDetectionScript(polyfillUrl);
|
|
94
|
+
// 注入到 <head> 最前面
|
|
95
|
+
htmlContent = htmlContent.replace(/<head([^>]*)>/i, `<head$1>\n${detectionScript}`);
|
|
96
|
+
chunk.source = htmlContent;
|
|
97
|
+
console.log(`[PolyfillPlugin] Updated ${htmlFile} with polyfill detection`);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function generateDetectionScript(polyfillUrl) {
|
|
103
|
+
return `<script>
|
|
104
|
+
(function(){
|
|
105
|
+
var needsPolyfill=(function(){
|
|
106
|
+
try{
|
|
107
|
+
if(typeof crypto==="undefined"||typeof crypto.randomUUID!=="function")return true;
|
|
108
|
+
if(typeof Object.hasOwn!=="function")return true;
|
|
109
|
+
if(typeof[].at!=="function")return true;
|
|
110
|
+
if(typeof[].findLast!=="function")return true;
|
|
111
|
+
return false;
|
|
112
|
+
}catch(e){return true}
|
|
113
|
+
})();
|
|
114
|
+
if(needsPolyfill){
|
|
115
|
+
document.write('<script src="${polyfillUrl}"><\\/script>');
|
|
116
|
+
}
|
|
117
|
+
})();
|
|
118
|
+
</script>`;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=polyfill-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyfill-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/polyfill-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,10 @@ import type { Plugin } from 'vite';
|
|
|
2
2
|
interface RouteParserPluginOptions {
|
|
3
3
|
appPath?: string;
|
|
4
4
|
outputPath?: string;
|
|
5
|
-
/** Base path for the routes
|
|
5
|
+
/** Base path for the routes content (e.g., '/miaoda_custom_plugin'). If not provided, reads from CLIENT_BASE_PATH env */
|
|
6
6
|
basePath?: string;
|
|
7
|
+
/** Base path for serving routes.json in dev mode (e.g., '/miaoda_custom_plugin'). Defaults to CLIENT_BASE_PATH env */
|
|
8
|
+
serveBasePath?: string;
|
|
7
9
|
}
|
|
8
10
|
export declare function routeParserPlugin(options?: RouteParserPluginOptions): Plugin;
|
|
9
11
|
export default routeParserPlugin;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-parser-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/route-parser-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAQlD,UAAU,wBAAwB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,
|
|
1
|
+
{"version":3,"file":"route-parser-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/route-parser-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAQlD,UAAU,wBAAwB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yHAAyH;IACzH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sHAAsH;IACtH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA2QD,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,wBAA6B,GACrC,MAAM,CA4ER;AAED,eAAe,iBAAiB,CAAC"}
|