@lark-apaas/coding-vite-preset 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 +7 -0
- package/README.md +68 -0
- package/lib/index.d.ts +37 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +69 -0
- package/lib/index.js.map +1 -0
- package/lib/module-alias/clsx.d.ts +4 -0
- package/lib/module-alias/clsx.d.ts.map +1 -0
- package/lib/module-alias/clsx.js +13 -0
- package/lib/module-alias/clsx.js.map +1 -0
- package/lib/module-alias/echarts-for-react.d.ts +14 -0
- package/lib/module-alias/echarts-for-react.d.ts.map +1 -0
- package/lib/module-alias/echarts-for-react.js +142 -0
- package/lib/module-alias/echarts-for-react.js.map +1 -0
- package/lib/module-alias/echarts.d.ts +9 -0
- package/lib/module-alias/echarts.d.ts.map +1 -0
- package/lib/module-alias/echarts.js +84 -0
- package/lib/module-alias/echarts.js.map +1 -0
- package/lib/module-alias/registry_echarts_theme.d.ts +692 -0
- package/lib/module-alias/registry_echarts_theme.d.ts.map +1 -0
- package/lib/module-alias/registry_echarts_theme.js +394 -0
- package/lib/module-alias/registry_echarts_theme.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/preset.d.ts +14 -0
- package/lib/preset.d.ts.map +1 -0
- package/lib/preset.js +452 -0
- package/lib/preset.js.map +1 -0
- package/lib/utils/hmr-timing.d.ts +10 -0
- package/lib/utils/hmr-timing.d.ts.map +1 -0
- package/lib/utils/hmr-timing.js +102 -0
- package/lib/utils/hmr-timing.js.map +1 -0
- package/lib/utils/normalize-base-path.d.ts +12 -0
- package/lib/utils/normalize-base-path.d.ts.map +1 -0
- package/lib/utils/normalize-base-path.js +24 -0
- package/lib/utils/normalize-base-path.js.map +1 -0
- package/lib/utils/snapdom-proxy.d.ts +8 -0
- package/lib/utils/snapdom-proxy.d.ts.map +1 -0
- package/lib/utils/snapdom-proxy.js +52 -0
- package/lib/utils/snapdom-proxy.js.map +1 -0
- package/lib/vite-plugins/banner-plugin.d.ts +3 -0
- package/lib/vite-plugins/banner-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/banner-plugin.js +26 -0
- package/lib/vite-plugins/banner-plugin.js.map +1 -0
- 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/error-overlay-plugin.d.ts +33 -0
- package/lib/vite-plugins/error-overlay-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/error-overlay-plugin.js +129 -0
- package/lib/vite-plugins/error-overlay-plugin.js.map +1 -0
- package/lib/vite-plugins/html-output-plugin.d.ts +21 -0
- package/lib/vite-plugins/html-output-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/html-output-plugin.js +171 -0
- package/lib/vite-plugins/html-output-plugin.js.map +1 -0
- package/lib/vite-plugins/module-alias-plugin.d.ts +10 -0
- package/lib/vite-plugins/module-alias-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/module-alias-plugin.js +40 -0
- package/lib/vite-plugins/module-alias-plugin.js.map +1 -0
- package/lib/vite-plugins/og-meta-plugin.d.ts +17 -0
- package/lib/vite-plugins/og-meta-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/og-meta-plugin.js +80 -0
- package/lib/vite-plugins/og-meta-plugin.js.map +1 -0
- 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 +132 -0
- package/lib/vite-plugins/polyfill-plugin.js.map +1 -0
- package/lib/vite-plugins/route-parser-plugin.d.ts +13 -0
- package/lib/vite-plugins/route-parser-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/route-parser-plugin.js +120 -0
- package/lib/vite-plugins/route-parser-plugin.js.map +1 -0
- package/lib/vite-plugins/runtime-injection-plugin.d.ts +23 -0
- package/lib/vite-plugins/runtime-injection-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/runtime-injection-plugin.js +93 -0
- package/lib/vite-plugins/runtime-injection-plugin.js.map +1 -0
- package/lib/vite-plugins/slardar-plugin.d.ts +10 -0
- package/lib/vite-plugins/slardar-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/slardar-plugin.js +102 -0
- package/lib/vite-plugins/slardar-plugin.js.map +1 -0
- package/lib/vite-plugins/source-map-upload-plugin.d.ts +7 -0
- package/lib/vite-plugins/source-map-upload-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/source-map-upload-plugin.js +85 -0
- package/lib/vite-plugins/source-map-upload-plugin.js.map +1 -0
- 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/view-context-plugin.d.ts +4 -0
- package/lib/vite-plugins/view-context-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/view-context-plugin.js +40 -0
- package/lib/vite-plugins/view-context-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 +61 -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 +129 -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 +554 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapdom-proxy.d.ts","sourceRoot":"","sources":["../../src/utils/snapdom-proxy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,UAAU,wBAAwB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,OAAO,CAAC,MAAM,EAC3B,OAAO,GAAE,wBAA6B,GACrC,IAAI,CAiDN;AAED,eAAe,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
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.registerSnapDomProxyMiddleware = registerSnapDomProxyMiddleware;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
function registerSnapDomProxyMiddleware(middlewares, options = {}) {
|
|
9
|
+
// `/dev` prefix ensures requests won't be intercepted
|
|
10
|
+
const { proxyUrl = '/dev/snapdom-proxy', baseUrl = '/' } = options;
|
|
11
|
+
const targetUrl = path_1.default.join(baseUrl, proxyUrl);
|
|
12
|
+
middlewares.use(async (req, res, next) => {
|
|
13
|
+
// Only handle GET requests to our proxy endpoint
|
|
14
|
+
if (req.method !== 'GET' || !req.url?.startsWith(targetUrl)) {
|
|
15
|
+
return next();
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
// Parse query parameters
|
|
19
|
+
const url = new URL(req.url, `http://${req.headers.host}`);
|
|
20
|
+
let targetUrlParam = url.searchParams.get('url');
|
|
21
|
+
if (!targetUrlParam) {
|
|
22
|
+
res.statusCode = 400;
|
|
23
|
+
res.setHeader('Content-Type', 'application/json');
|
|
24
|
+
res.end(JSON.stringify({ error: 'Missing url parameter' }));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
targetUrlParam = decodeURIComponent(targetUrlParam);
|
|
28
|
+
const fetchOption = {
|
|
29
|
+
headers: {
|
|
30
|
+
cookie: req.headers.cookie || '',
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
const response = await fetch(targetUrlParam, fetchOption);
|
|
34
|
+
const contentType = response.headers.get('content-type');
|
|
35
|
+
if (contentType) {
|
|
36
|
+
res.setHeader('Content-Type', contentType);
|
|
37
|
+
}
|
|
38
|
+
const buffer = await response.arrayBuffer();
|
|
39
|
+
res.end(Buffer.from(buffer));
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
res.statusCode = 500;
|
|
43
|
+
res.setHeader('Content-Type', 'application/json');
|
|
44
|
+
res.end(JSON.stringify({
|
|
45
|
+
error: 'Proxy request failed',
|
|
46
|
+
message: error.message,
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
exports.default = registerSnapDomProxyMiddleware;
|
|
52
|
+
//# sourceMappingURL=snapdom-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapdom-proxy.js","sourceRoot":"","sources":["../../src/utils/snapdom-proxy.ts"],"names":[],"mappings":";;;;;AAQA,wEAoDC;AA5DD,gDAAwB;AAQxB,SAAgB,8BAA8B,CAC5C,WAA2B,EAC3B,UAAoC,EAAE;IAEtC,sDAAsD;IACtD,MAAM,EAAE,QAAQ,GAAG,oBAAoB,EAAE,OAAO,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IACnE,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE/C,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACvC,iDAAiD;QACjD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5D,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3D,IAAI,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAEjD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;YAED,cAAc,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;YACpD,MAAM,WAAW,GAAG;gBAClB,OAAO,EAAE;oBACP,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE;iBACjC;aACF,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAE1D,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACzD,IAAI,WAAW,EAAE,CAAC;gBAChB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC5C,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;YAClD,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,sBAAsB;gBAC7B,OAAO,EAAG,KAAe,CAAC,OAAO;aAClC,CAAC,CACH,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kBAAe,8BAA8B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/banner-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBnD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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.bannerPlugin = bannerPlugin;
|
|
7
|
+
const magic_string_1 = __importDefault(require("magic-string"));
|
|
8
|
+
function bannerPlugin(banner) {
|
|
9
|
+
return {
|
|
10
|
+
name: 'vite-plugin-banner',
|
|
11
|
+
enforce: 'post',
|
|
12
|
+
renderChunk(code, chunk) {
|
|
13
|
+
// Only add banner to entry chunks
|
|
14
|
+
if (chunk.isEntry) {
|
|
15
|
+
const magicString = new magic_string_1.default(code);
|
|
16
|
+
magicString.prepend(`${banner}\n`);
|
|
17
|
+
return {
|
|
18
|
+
code: magicString.toString(),
|
|
19
|
+
map: magicString.generateMap({ hires: true }),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=banner-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/banner-plugin.ts"],"names":[],"mappings":";;;;;AAGA,oCAiBC;AAnBD,gEAAuC;AAEvC,SAAgB,YAAY,CAAC,MAAc;IACzC,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,MAAM;QACf,WAAW,CAAC,IAAI,EAAE,KAAK;YACrB,kCAAkC;YAClC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,WAAW,GAAG,IAAI,sBAAW,CAAC,IAAI,CAAC,CAAC;gBAC1C,WAAW,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;gBACnC,OAAO;oBACL,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE;oBAC5B,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;iBAC9C,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
/**
|
|
3
|
+
* CSS Legacy Plugin (Vite)
|
|
4
|
+
*
|
|
5
|
+
* 对齐 rspack-preset 的 CssLegacyPlugin:
|
|
6
|
+
* 在构建完成后生成一份兼容旧浏览器的 CSS 文件(.legacy.css)
|
|
7
|
+
* 并在 HTML 中注入检测脚本,根据浏览器版本加载对应的 CSS
|
|
8
|
+
*
|
|
9
|
+
* 仅在生产构建时生效
|
|
10
|
+
*/
|
|
11
|
+
export declare function cssLegacyPlugin(): Plugin;
|
|
12
|
+
//# sourceMappingURL=css-legacy-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css-legacy-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/css-legacy-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAU,MAAM,MAAM,CAAC;AAK3C;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAgGxC"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Overlay Plugin for Vite
|
|
3
|
+
*
|
|
4
|
+
* 功能:
|
|
5
|
+
* 1. 禁用 Vite 原生错误 overlay
|
|
6
|
+
* 2. 注入自定义错误 overlay 客户端脚本
|
|
7
|
+
*
|
|
8
|
+
* 原理:
|
|
9
|
+
* - Dev: 中间件拦截 /@error-overlay.js 请求,返回处理后的脚本
|
|
10
|
+
* - HTML 中注入 <script type="module" src="/@error-overlay.js">
|
|
11
|
+
* - 客户端脚本通过 createHotContext 监听 Vite HMR 事件
|
|
12
|
+
*
|
|
13
|
+
* 与 rspack-preset 中的 ReactRefreshPlugin overlay 功能对齐
|
|
14
|
+
*/
|
|
15
|
+
import type { Plugin } from 'vite';
|
|
16
|
+
export interface ErrorOverlayPluginOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Whether to enable the error overlay
|
|
19
|
+
* @default true
|
|
20
|
+
*/
|
|
21
|
+
enabled?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Client base path prefix for routes
|
|
24
|
+
* @default ''
|
|
25
|
+
*/
|
|
26
|
+
clientBasePath?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Vite plugin to provide custom error overlay
|
|
30
|
+
*/
|
|
31
|
+
export declare function errorOverlayPlugin(options?: ErrorOverlayPluginOptions): Plugin;
|
|
32
|
+
export default errorOverlayPlugin;
|
|
33
|
+
//# sourceMappingURL=error-overlay-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-overlay-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/error-overlay-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAoC,MAAM,MAAM,CAAC;AAIrE,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAiDD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,MAAM,CAoER;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Error Overlay Plugin for Vite
|
|
4
|
+
*
|
|
5
|
+
* 功能:
|
|
6
|
+
* 1. 禁用 Vite 原生错误 overlay
|
|
7
|
+
* 2. 注入自定义错误 overlay 客户端脚本
|
|
8
|
+
*
|
|
9
|
+
* 原理:
|
|
10
|
+
* - Dev: 中间件拦截 /@error-overlay.js 请求,返回处理后的脚本
|
|
11
|
+
* - HTML 中注入 <script type="module" src="/@error-overlay.js">
|
|
12
|
+
* - 客户端脚本通过 createHotContext 监听 Vite HMR 事件
|
|
13
|
+
*
|
|
14
|
+
* 与 rspack-preset 中的 ReactRefreshPlugin overlay 功能对齐
|
|
15
|
+
*/
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.errorOverlayPlugin = errorOverlayPlugin;
|
|
21
|
+
const fs_1 = __importDefault(require("fs"));
|
|
22
|
+
const path_1 = __importDefault(require("path"));
|
|
23
|
+
const OVERLAY_PATH = '/@error-overlay.js';
|
|
24
|
+
/**
|
|
25
|
+
* 获取客户端脚本路径
|
|
26
|
+
*/
|
|
27
|
+
function getClientScriptPath() {
|
|
28
|
+
const possiblePaths = [
|
|
29
|
+
// 从 lib/vite-plugins 编译后的位置,相对于 src/overlay
|
|
30
|
+
path_1.default.resolve(__dirname, '../../src/overlay/vite-client.js'),
|
|
31
|
+
// 开发时从 src/vite-plugins 的位置
|
|
32
|
+
path_1.default.resolve(__dirname, '../overlay/vite-client.js'),
|
|
33
|
+
];
|
|
34
|
+
for (const clientPath of possiblePaths) {
|
|
35
|
+
if (fs_1.default.existsSync(clientPath)) {
|
|
36
|
+
return clientPath;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
console.error('[error-overlay] Failed to find client script in paths:', possiblePaths);
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 读取并处理客户端脚本
|
|
44
|
+
*/
|
|
45
|
+
function getProcessedClientScript(clientBasePath) {
|
|
46
|
+
const clientScriptPath = getClientScriptPath();
|
|
47
|
+
if (!clientScriptPath) {
|
|
48
|
+
return '// Error overlay client script not found';
|
|
49
|
+
}
|
|
50
|
+
let code = fs_1.default.readFileSync(clientScriptPath, 'utf-8');
|
|
51
|
+
// 手动替换 process.env 变量
|
|
52
|
+
const envReplacements = {
|
|
53
|
+
'process.env.FORCE_FRAMEWORK_DOMAIN_MAIN': JSON.stringify(process.env.FORCE_FRAMEWORK_DOMAIN_MAIN ?? ''),
|
|
54
|
+
'process.env.CLIENT_BASE_PATH': JSON.stringify(clientBasePath),
|
|
55
|
+
};
|
|
56
|
+
for (const [key, value] of Object.entries(envReplacements)) {
|
|
57
|
+
code = code.replace(new RegExp(key.replace(/\./g, '\\.'), 'g'), value);
|
|
58
|
+
}
|
|
59
|
+
return code;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Vite plugin to provide custom error overlay
|
|
63
|
+
*/
|
|
64
|
+
function errorOverlayPlugin(options = {}) {
|
|
65
|
+
const { enabled = true, clientBasePath = '' } = options;
|
|
66
|
+
const overlayPath = clientBasePath + OVERLAY_PATH;
|
|
67
|
+
return {
|
|
68
|
+
name: 'fullstack-error-overlay',
|
|
69
|
+
enforce: 'pre',
|
|
70
|
+
// 禁用原生 overlay
|
|
71
|
+
config(config) {
|
|
72
|
+
if (!enabled)
|
|
73
|
+
return;
|
|
74
|
+
return {
|
|
75
|
+
server: {
|
|
76
|
+
...config.server,
|
|
77
|
+
hmr: config.server?.hmr === false
|
|
78
|
+
? false
|
|
79
|
+
: {
|
|
80
|
+
...(typeof config.server?.hmr === 'object'
|
|
81
|
+
? config.server.hmr
|
|
82
|
+
: {}),
|
|
83
|
+
overlay: false,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
// Dev: 中间件处理 /@error-overlay.js 请求
|
|
89
|
+
configureServer(server) {
|
|
90
|
+
if (!enabled)
|
|
91
|
+
return;
|
|
92
|
+
server.middlewares.use((req, res, next) => {
|
|
93
|
+
if (req.url !== overlayPath)
|
|
94
|
+
return next();
|
|
95
|
+
try {
|
|
96
|
+
const code = getProcessedClientScript(clientBasePath);
|
|
97
|
+
res.setHeader('Content-Type', 'application/javascript');
|
|
98
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
99
|
+
res.end(code);
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
console.error('[error-overlay] Failed to serve client script:', e);
|
|
103
|
+
res.statusCode = 500;
|
|
104
|
+
res.end(`// Error: ${e}`);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
// HTML 注入 script
|
|
109
|
+
transformIndexHtml(html) {
|
|
110
|
+
if (!enabled)
|
|
111
|
+
return html;
|
|
112
|
+
const tags = [
|
|
113
|
+
{
|
|
114
|
+
tag: 'script',
|
|
115
|
+
attrs: {
|
|
116
|
+
type: 'module',
|
|
117
|
+
src: overlayPath,
|
|
118
|
+
},
|
|
119
|
+
// 注入到 head 末尾,在 @runtime.js 之前
|
|
120
|
+
// (插件注册顺序: error-overlay -> runtime,所以 error-overlay 先注入)
|
|
121
|
+
injectTo: 'head',
|
|
122
|
+
},
|
|
123
|
+
];
|
|
124
|
+
return { html, tags };
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
exports.default = errorOverlayPlugin;
|
|
129
|
+
//# sourceMappingURL=error-overlay-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-overlay-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/error-overlay-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
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>;
|
|
9
|
+
export interface HtmlOutputPluginOptions {
|
|
10
|
+
/** Whether running in development mode */
|
|
11
|
+
isDev: boolean;
|
|
12
|
+
/** Output directory for built files */
|
|
13
|
+
outDir: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Vite plugin to handle HTML output:
|
|
17
|
+
* 1. In production: fixes HTML output path (removes extra 'client' directory)
|
|
18
|
+
* 2. In development: writes transformed HTML to disk for backend to serve
|
|
19
|
+
*/
|
|
20
|
+
export declare function htmlOutputPlugin(options: HtmlOutputPluginOptions): Plugin;
|
|
21
|
+
//# sourceMappingURL=html-output-plugin.d.ts.map
|
|
@@ -0,0 +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;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"}
|