@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,393 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Static Assets Plugin for Vite
|
|
4
|
+
*
|
|
5
|
+
* Supports importing static files from shared/static directory:
|
|
6
|
+
* - JSON files → bundled into HTML, injected as window.__STATIC_JSON__
|
|
7
|
+
* - Other files → converted to URL {clientBasePath}/static/path
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import config from '@shared/static/config.json';
|
|
11
|
+
* import logoUrl from '@shared/static/images/logo.png';
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.staticAssetsPlugin = staticAssetsPlugin;
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const glob_1 = require("glob");
|
|
51
|
+
const SHARED_STATIC_PREFIX = '@shared/static/';
|
|
52
|
+
const VIRTUAL_MODULE_PREFIX = '\0@shared/static/';
|
|
53
|
+
/** File extensions that should be resolved as normal modules instead of static asset URLs */
|
|
54
|
+
const SCRIPT_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mts', '.cts', '.mjs', '.cjs'];
|
|
55
|
+
/**
|
|
56
|
+
* Split a relative path into the clean path and optional query string.
|
|
57
|
+
* e.g. "file.md?raw" → ["file.md", "?raw"]
|
|
58
|
+
*/
|
|
59
|
+
function splitQuery(relativePath) {
|
|
60
|
+
const qIndex = relativePath.indexOf('?');
|
|
61
|
+
if (qIndex === -1)
|
|
62
|
+
return [relativePath, ''];
|
|
63
|
+
return [relativePath.slice(0, qIndex), relativePath.slice(qIndex)];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Try to resolve a relative path to a real script file on disk.
|
|
67
|
+
* Handles both explicit extensions (utils.ts) and extensionless imports (utils).
|
|
68
|
+
* Returns the absolute path if found, null otherwise.
|
|
69
|
+
*/
|
|
70
|
+
function resolveScriptFile(staticDir, cleanPath) {
|
|
71
|
+
const ext = path.extname(cleanPath).toLowerCase();
|
|
72
|
+
// Has explicit script extension → resolve directly
|
|
73
|
+
if (ext && SCRIPT_EXTENSIONS.includes(ext)) {
|
|
74
|
+
return path.join(staticDir, cleanPath);
|
|
75
|
+
}
|
|
76
|
+
// No extension → probe for matching script file on disk
|
|
77
|
+
if (!ext) {
|
|
78
|
+
for (const scriptExt of SCRIPT_EXTENSIONS) {
|
|
79
|
+
const fullPath = path.join(staticDir, cleanPath + scriptExt);
|
|
80
|
+
if (fs.existsSync(fullPath)) {
|
|
81
|
+
return fullPath;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
function staticAssetsPlugin(options = {}) {
|
|
88
|
+
const { clientBasePath = '', rootDir = process.cwd() } = options;
|
|
89
|
+
const staticDir = path.resolve(rootDir, 'shared/static');
|
|
90
|
+
let isDev = true;
|
|
91
|
+
let resolvedConfig = null;
|
|
92
|
+
// Cache for JSON data (used in build mode)
|
|
93
|
+
let jsonDataCache = null;
|
|
94
|
+
/**
|
|
95
|
+
* Get the key for a static file path (used for __STATIC_JSON__)
|
|
96
|
+
*/
|
|
97
|
+
function getJsonKey(filePath) {
|
|
98
|
+
// Remove .json extension and use relative path as key
|
|
99
|
+
return filePath.replace(/\.json$/, '');
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Scan and read all JSON files from shared/static directory
|
|
103
|
+
*/
|
|
104
|
+
function scanJsonFiles() {
|
|
105
|
+
const jsonData = {};
|
|
106
|
+
if (!fs.existsSync(staticDir)) {
|
|
107
|
+
return jsonData;
|
|
108
|
+
}
|
|
109
|
+
const jsonFiles = glob_1.glob.sync('**/*.json', {
|
|
110
|
+
cwd: staticDir,
|
|
111
|
+
nodir: true,
|
|
112
|
+
});
|
|
113
|
+
for (const file of jsonFiles) {
|
|
114
|
+
const fullPath = path.join(staticDir, file);
|
|
115
|
+
try {
|
|
116
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
117
|
+
const key = getJsonKey(file);
|
|
118
|
+
jsonData[key] = JSON.parse(content);
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
console.warn(`[static-assets] Failed to parse JSON file: ${file}`, e);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return jsonData;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get JSON data (with caching for build mode)
|
|
128
|
+
*/
|
|
129
|
+
function getJsonData() {
|
|
130
|
+
if (!isDev && jsonDataCache) {
|
|
131
|
+
return jsonDataCache;
|
|
132
|
+
}
|
|
133
|
+
const data = scanJsonFiles();
|
|
134
|
+
if (!isDev) {
|
|
135
|
+
jsonDataCache = data;
|
|
136
|
+
}
|
|
137
|
+
return data;
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
name: 'fullstack-static-assets',
|
|
141
|
+
enforce: 'pre',
|
|
142
|
+
config(_config, { command }) {
|
|
143
|
+
isDev = command === 'serve';
|
|
144
|
+
},
|
|
145
|
+
configResolved(config) {
|
|
146
|
+
resolvedConfig = config;
|
|
147
|
+
},
|
|
148
|
+
/**
|
|
149
|
+
* Intercept @shared/static/* imports and return virtual module ID
|
|
150
|
+
*
|
|
151
|
+
* For JSON files, the virtual ID is suffixed with .js to prevent
|
|
152
|
+
* vite:json's transform hook from trying to parse it as JSON.
|
|
153
|
+
*/
|
|
154
|
+
resolveId(id) {
|
|
155
|
+
if (id.startsWith(SHARED_STATIC_PREFIX)) {
|
|
156
|
+
const relativePath = id.slice(SHARED_STATIC_PREFIX.length);
|
|
157
|
+
const [cleanPath, query] = splitQuery(relativePath);
|
|
158
|
+
// Imports with query params (e.g. ?raw, ?url) should resolve to real
|
|
159
|
+
// paths and let Vite's native handling process them
|
|
160
|
+
if (query) {
|
|
161
|
+
return path.join(staticDir, cleanPath) + query;
|
|
162
|
+
}
|
|
163
|
+
// JS/TS files should be resolved to their real paths and bundled normally
|
|
164
|
+
const scriptPath = resolveScriptFile(staticDir, cleanPath);
|
|
165
|
+
if (scriptPath) {
|
|
166
|
+
return scriptPath;
|
|
167
|
+
}
|
|
168
|
+
const virtualId = VIRTUAL_MODULE_PREFIX + cleanPath;
|
|
169
|
+
// Prevent vite:json from processing JSON virtual modules
|
|
170
|
+
return cleanPath.endsWith('.json') ? virtualId + '.js' : virtualId;
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
},
|
|
174
|
+
/**
|
|
175
|
+
* Load virtual module content
|
|
176
|
+
* - JSON (dev) → export default { ... } (inline data, read from disk)
|
|
177
|
+
* - JSON (prod) → export default window.__STATIC_JSON__['key']
|
|
178
|
+
* - Other → export default '{clientBasePath}/static/path'
|
|
179
|
+
*/
|
|
180
|
+
load(id) {
|
|
181
|
+
if (!id.startsWith(VIRTUAL_MODULE_PREFIX)) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
let relativePath = id.slice(VIRTUAL_MODULE_PREFIX.length);
|
|
185
|
+
// Strip .js suffix added in resolveId for JSON files
|
|
186
|
+
if (relativePath.endsWith('.json.js')) {
|
|
187
|
+
relativePath = relativePath.slice(0, -3);
|
|
188
|
+
}
|
|
189
|
+
const isJson = relativePath.endsWith('.json');
|
|
190
|
+
if (isJson) {
|
|
191
|
+
if (isDev) {
|
|
192
|
+
// Dev: inline the JSON data directly so we don't depend on
|
|
193
|
+
// window.__STATIC_JSON__ in the HTML (avoids HTML regeneration issues)
|
|
194
|
+
const fullPath = path.join(staticDir, relativePath);
|
|
195
|
+
try {
|
|
196
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
197
|
+
return `export default ${content};`;
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
console.warn(`[static-assets] Failed to read JSON: ${relativePath}`, e);
|
|
201
|
+
return `export default undefined;`;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Prod: read from window.__STATIC_JSON__ injected into HTML
|
|
205
|
+
const key = getJsonKey(relativePath);
|
|
206
|
+
return `export default window.__STATIC_JSON__['${key}'];`;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
const envBaseUrl = typeof process !== 'undefined' ? process.env?.STATIC_ASSETS_BASE_URL : undefined;
|
|
210
|
+
// envBaseUrl (downloadURLPrefix) 已指向 static 目录,无需再拼 /static/
|
|
211
|
+
const staticUrl = envBaseUrl
|
|
212
|
+
? `${envBaseUrl.replace(/\/+$/, '')}/${relativePath}`
|
|
213
|
+
: `${clientBasePath}/static/${relativePath}`;
|
|
214
|
+
return `export default ${JSON.stringify(staticUrl)};`;
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
/**
|
|
218
|
+
* Inject __STATIC_JSON__ script into HTML
|
|
219
|
+
*/
|
|
220
|
+
transformIndexHtml() {
|
|
221
|
+
// In dev mode, JSON data is inlined directly in virtual modules,
|
|
222
|
+
// so we don't need __STATIC_JSON__ in the HTML.
|
|
223
|
+
if (isDev)
|
|
224
|
+
return;
|
|
225
|
+
const jsonData = getJsonData();
|
|
226
|
+
if (Object.keys(jsonData).length === 0) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const scriptContent = `window.__STATIC_JSON__ = ${JSON.stringify(jsonData)};`;
|
|
230
|
+
const tags = [
|
|
231
|
+
{
|
|
232
|
+
tag: 'script',
|
|
233
|
+
children: scriptContent,
|
|
234
|
+
injectTo: 'head-prepend',
|
|
235
|
+
},
|
|
236
|
+
];
|
|
237
|
+
return { html: '', tags };
|
|
238
|
+
},
|
|
239
|
+
/**
|
|
240
|
+
* Configure dev server for HMR support
|
|
241
|
+
*/
|
|
242
|
+
configureServer(server) {
|
|
243
|
+
// Watch shared/static directory for changes
|
|
244
|
+
if (!fs.existsSync(staticDir)) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const watcher = server.watcher;
|
|
248
|
+
// Add static directory to watch list
|
|
249
|
+
watcher.add(staticDir);
|
|
250
|
+
// Handle file changes in static directory
|
|
251
|
+
const handleStaticFileChange = (changedPath) => {
|
|
252
|
+
if (!changedPath.startsWith(staticDir)) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const relativePath = path.relative(staticDir, changedPath);
|
|
256
|
+
const isJson = relativePath.endsWith('.json');
|
|
257
|
+
if (isJson) {
|
|
258
|
+
// JSON file changed: invalidate the virtual module so Vite
|
|
259
|
+
// re-runs the load hook with fresh data on next request
|
|
260
|
+
const moduleId = VIRTUAL_MODULE_PREFIX + relativePath;
|
|
261
|
+
const mod = server.environments.client.moduleGraph.getModuleById(moduleId);
|
|
262
|
+
if (mod) {
|
|
263
|
+
server.environments.client.moduleGraph.invalidateModule(mod);
|
|
264
|
+
}
|
|
265
|
+
// Send custom HMR event for JSON update
|
|
266
|
+
server.hot.send({
|
|
267
|
+
type: 'custom',
|
|
268
|
+
event: 'static-json-update',
|
|
269
|
+
data: { path: relativePath },
|
|
270
|
+
});
|
|
271
|
+
// Trigger full reload so the virtual module is re-requested with fresh data
|
|
272
|
+
server.hot.send({
|
|
273
|
+
type: 'full-reload',
|
|
274
|
+
path: '*',
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
// Non-JSON file changed: just send HMR update event
|
|
279
|
+
// The URL doesn't change, but we notify for potential cache invalidation
|
|
280
|
+
server.hot.send({
|
|
281
|
+
type: 'custom',
|
|
282
|
+
event: 'static-asset-update',
|
|
283
|
+
data: { path: relativePath },
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
watcher.on('change', handleStaticFileChange);
|
|
288
|
+
watcher.on('add', handleStaticFileChange);
|
|
289
|
+
watcher.on('unlink', (changedPath) => {
|
|
290
|
+
if (changedPath.startsWith(staticDir)) {
|
|
291
|
+
if (changedPath.endsWith('.json')) {
|
|
292
|
+
const relativePath = path.relative(staticDir, changedPath);
|
|
293
|
+
const moduleId = VIRTUAL_MODULE_PREFIX + relativePath;
|
|
294
|
+
const mod = server.environments.client.moduleGraph.getModuleById(moduleId);
|
|
295
|
+
if (mod) {
|
|
296
|
+
server.environments.client.moduleGraph.invalidateModule(mod);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// File deleted: trigger full reload
|
|
300
|
+
server.hot.send({
|
|
301
|
+
type: 'full-reload',
|
|
302
|
+
path: '*',
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
// Serve static files in dev mode
|
|
307
|
+
server.middlewares.use((req, res, next) => {
|
|
308
|
+
const staticPrefix = `${clientBasePath}/static/`;
|
|
309
|
+
const url = req.url || '';
|
|
310
|
+
if (!url.startsWith(staticPrefix)) {
|
|
311
|
+
return next();
|
|
312
|
+
}
|
|
313
|
+
const rawRelativePath = url.slice(staticPrefix.length).split('?')[0];
|
|
314
|
+
let relativePath;
|
|
315
|
+
try {
|
|
316
|
+
relativePath = decodeURIComponent(rawRelativePath);
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
res.statusCode = 400;
|
|
320
|
+
res.end('Bad Request');
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
const filePath = path.join(staticDir, relativePath);
|
|
324
|
+
// Security: prevent path traversal
|
|
325
|
+
const normalizedPath = path.normalize(filePath);
|
|
326
|
+
if (!normalizedPath.startsWith(staticDir)) {
|
|
327
|
+
res.statusCode = 403;
|
|
328
|
+
res.end('Forbidden');
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
if (!fs.existsSync(filePath)) {
|
|
332
|
+
res.statusCode = 404;
|
|
333
|
+
res.end('Not Found');
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const stat = fs.statSync(filePath);
|
|
337
|
+
if (stat.isDirectory()) {
|
|
338
|
+
res.statusCode = 403;
|
|
339
|
+
res.end('Forbidden');
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
// Get MIME type
|
|
343
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
344
|
+
const mimeTypes = {
|
|
345
|
+
'.json': 'application/json',
|
|
346
|
+
'.png': 'image/png',
|
|
347
|
+
'.jpg': 'image/jpeg',
|
|
348
|
+
'.jpeg': 'image/jpeg',
|
|
349
|
+
'.gif': 'image/gif',
|
|
350
|
+
'.svg': 'image/svg+xml',
|
|
351
|
+
'.webp': 'image/webp',
|
|
352
|
+
'.ico': 'image/x-icon',
|
|
353
|
+
'.woff': 'font/woff',
|
|
354
|
+
'.woff2': 'font/woff2',
|
|
355
|
+
'.ttf': 'font/ttf',
|
|
356
|
+
'.eot': 'application/vnd.ms-fontobject',
|
|
357
|
+
'.otf': 'font/otf',
|
|
358
|
+
'.css': 'text/css',
|
|
359
|
+
'.js': 'application/javascript',
|
|
360
|
+
'.txt': 'text/plain',
|
|
361
|
+
'.html': 'text/html',
|
|
362
|
+
'.xml': 'application/xml',
|
|
363
|
+
'.pdf': 'application/pdf',
|
|
364
|
+
'.mp3': 'audio/mpeg',
|
|
365
|
+
'.mp4': 'video/mp4',
|
|
366
|
+
'.webm': 'video/webm',
|
|
367
|
+
};
|
|
368
|
+
const contentType = mimeTypes[ext] || 'application/octet-stream';
|
|
369
|
+
res.setHeader('Content-Type', contentType);
|
|
370
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
371
|
+
// Stream the file
|
|
372
|
+
const stream = fs.createReadStream(filePath);
|
|
373
|
+
stream.pipe(res);
|
|
374
|
+
});
|
|
375
|
+
},
|
|
376
|
+
/**
|
|
377
|
+
* Copy shared/static to dist/shared/static for production serving
|
|
378
|
+
*/
|
|
379
|
+
closeBundle() {
|
|
380
|
+
if (isDev || !resolvedConfig || !fs.existsSync(staticDir)) {
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
const outDir = resolvedConfig.build.outDir;
|
|
384
|
+
// outDir is typically dist/client, target is dist/shared/static
|
|
385
|
+
const distRoot = path.resolve(outDir, '..');
|
|
386
|
+
const destDir = path.join(distRoot, 'shared', 'static');
|
|
387
|
+
fs.cpSync(staticDir, destDir, { recursive: true });
|
|
388
|
+
console.log(`[static-assets] Copied shared/static → ${path.relative(rootDir, destDir)}`);
|
|
389
|
+
},
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
exports.default = staticAssetsPlugin;
|
|
393
|
+
//# sourceMappingURL=static-assets-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-assets-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/static-assets-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-context-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/view-context-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAqB,MAAM,MAAM,CAAC;AAoBtD,wBAAgB,iBAAiB,IAAI,MAAM,CAmB1C;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.viewContextPlugin = viewContextPlugin;
|
|
4
|
+
function getViewContextScript() {
|
|
5
|
+
return `
|
|
6
|
+
window.csrfToken = "{{csrfToken}}";
|
|
7
|
+
window.userId = "{{userId}}";
|
|
8
|
+
window.tenantId = "{{tenantId}}";
|
|
9
|
+
window.appId = "{{appId}}";
|
|
10
|
+
window.ENVIRONMENT = "{{environment}}";
|
|
11
|
+
const appInfo = {
|
|
12
|
+
name: "{{appName}}",
|
|
13
|
+
avatar: "{{{appAvatar}}}",
|
|
14
|
+
description: "{{appDescription}}",
|
|
15
|
+
};
|
|
16
|
+
if (appInfo.name) {
|
|
17
|
+
window._appInfo = appInfo;
|
|
18
|
+
}
|
|
19
|
+
`;
|
|
20
|
+
}
|
|
21
|
+
function viewContextPlugin() {
|
|
22
|
+
return {
|
|
23
|
+
name: 'fullstack-view-context',
|
|
24
|
+
transformIndexHtml(html) {
|
|
25
|
+
const tags = [
|
|
26
|
+
{
|
|
27
|
+
tag: 'script',
|
|
28
|
+
children: getViewContextScript(),
|
|
29
|
+
injectTo: 'head',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
return {
|
|
33
|
+
html,
|
|
34
|
+
tags,
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
exports.default = viewContextPlugin;
|
|
40
|
+
//# sourceMappingURL=view-context-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-context-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/view-context-plugin.ts"],"names":[],"mappings":";;AAoBA,8CAmBC;AArCD,SAAS,oBAAoB;IAC3B,OAAO;;;;;;;;;;;;;;KAcJ,CAAC;AACN,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO;QACL,IAAI,EAAE,wBAAwB;QAE9B,kBAAkB,CAAC,IAAI;YACrB,MAAM,IAAI,GAAwB;gBAChC;oBACE,GAAG,EAAE,QAAQ;oBACb,QAAQ,EAAE,oBAAoB,EAAE;oBAChC,QAAQ,EAAE,MAAM;iBACjB;aACF,CAAC;YAEF,OAAO;gBACL,IAAI;gBACJ,IAAI;aACL,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vite Client Patch Plugin
|
|
3
|
+
*
|
|
4
|
+
* 问题背景:
|
|
5
|
+
* 在云端开发环境(如通过反向代理 aiforce.run 访问)中,电脑休眠后唤醒,
|
|
6
|
+
* Vite HMR WebSocket 断连重连时会触发 location.reload()。
|
|
7
|
+
* 此时浏览器 HTTP/2 连接池中持有休眠前的死连接,reload 请求复用该死连接,
|
|
8
|
+
* 导致页面 blocked ~18s 后超时白屏(ERR_CONNECTION_TIMED_OUT)。
|
|
9
|
+
*
|
|
10
|
+
* 根本原因:
|
|
11
|
+
* Vite 的 @vite/client 在 vite:ws:disconnect 后调用 waitForSuccessfulPing(),
|
|
12
|
+
* WS ping 成功(新 TCP)后立即 location.reload(),
|
|
13
|
+
* 但 reload 走的是旧的死 HTTP/2 连接,不是新 TCP。
|
|
14
|
+
*
|
|
15
|
+
* 解决方案:
|
|
16
|
+
* 通过 Vite transform hook 拦截 @vite/client,直接移除 WS 重连后的 location.reload()。
|
|
17
|
+
* 用户若需要获取最新代码,手动刷新即可(符合云端 IDE 使用预期)。
|
|
18
|
+
*
|
|
19
|
+
* 适用范围:仅 dev server (apply: 'serve')
|
|
20
|
+
*/
|
|
21
|
+
import type { Plugin } from 'vite';
|
|
22
|
+
export declare function viteClientPatchPlugin(): Plugin;
|
|
23
|
+
//# sourceMappingURL=vite-client-patch-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-client-patch-plugin.d.ts","sourceRoot":"","sources":["../../src/vite-plugins/vite-client-patch-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAUnC,wBAAgB,qBAAqB,IAAI,MAAM,CA+B9C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Vite Client Patch Plugin
|
|
4
|
+
*
|
|
5
|
+
* 问题背景:
|
|
6
|
+
* 在云端开发环境(如通过反向代理 aiforce.run 访问)中,电脑休眠后唤醒,
|
|
7
|
+
* Vite HMR WebSocket 断连重连时会触发 location.reload()。
|
|
8
|
+
* 此时浏览器 HTTP/2 连接池中持有休眠前的死连接,reload 请求复用该死连接,
|
|
9
|
+
* 导致页面 blocked ~18s 后超时白屏(ERR_CONNECTION_TIMED_OUT)。
|
|
10
|
+
*
|
|
11
|
+
* 根本原因:
|
|
12
|
+
* Vite 的 @vite/client 在 vite:ws:disconnect 后调用 waitForSuccessfulPing(),
|
|
13
|
+
* WS ping 成功(新 TCP)后立即 location.reload(),
|
|
14
|
+
* 但 reload 走的是旧的死 HTTP/2 连接,不是新 TCP。
|
|
15
|
+
*
|
|
16
|
+
* 解决方案:
|
|
17
|
+
* 通过 Vite transform hook 拦截 @vite/client,直接移除 WS 重连后的 location.reload()。
|
|
18
|
+
* 用户若需要获取最新代码,手动刷新即可(符合云端 IDE 使用预期)。
|
|
19
|
+
*
|
|
20
|
+
* 适用范围:仅 dev server (apply: 'serve')
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.viteClientPatchPlugin = viteClientPatchPlugin;
|
|
24
|
+
/**
|
|
25
|
+
* 匹配 vite:ws:disconnect 处理器中的重连刷新代码:
|
|
26
|
+
* await waitForSuccessfulPing(url.href);
|
|
27
|
+
* location.reload();
|
|
28
|
+
*/
|
|
29
|
+
const RECONNECT_RELOAD_PATTERN = /(await waitForSuccessfulPing\(url\.href\);)\r?\n(\s*)location\.reload\(\);/;
|
|
30
|
+
function viteClientPatchPlugin() {
|
|
31
|
+
return {
|
|
32
|
+
name: 'fullstack-vite-client-patch',
|
|
33
|
+
enforce: 'post',
|
|
34
|
+
apply: 'serve',
|
|
35
|
+
transform(code, id) {
|
|
36
|
+
if (!id.includes('vite/dist/client/client.mjs')) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!RECONNECT_RELOAD_PATTERN.test(code)) {
|
|
40
|
+
console.warn('[fullstack-vite-client-patch] Warning: Could not find the reconnect-reload pattern ' +
|
|
41
|
+
'in @vite/client. The patch has NOT been applied. ' +
|
|
42
|
+
'Check if this Vite version changed the vite:ws:disconnect handler.');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Remove location.reload() — suppress auto-reload after WS reconnect.
|
|
46
|
+
// In cloud environments, the browser's stale HTTP/2 connection causes ~18s timeout on reload.
|
|
47
|
+
// Users can manually refresh when needed.
|
|
48
|
+
const patchedCode = code.replace(RECONNECT_RELOAD_PATTERN, (_, pingLine) => pingLine);
|
|
49
|
+
return { code: patchedCode };
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=vite-client-patch-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-client-patch-plugin.js","sourceRoot":"","sources":["../../src/vite-plugins/vite-client-patch-plugin.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;AAYH,sDA+BC;AAvCD;;;;GAIG;AACH,MAAM,wBAAwB,GAC5B,4EAA4E,CAAC;AAE/E,SAAgB,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,OAAO;QAEd,SAAS,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,OAAO,CAAC,IAAI,CACV,qFAAqF;oBACnF,mDAAmD;oBACnD,oEAAoE,CACvE,CAAC;gBACF,OAAO;YACT,CAAC;YAED,sEAAsE;YACtE,8FAA8F;YAC9F,0CAA0C;YAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAC9B,wBAAwB,EACxB,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAC1B,CAAC;YAEF,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lark-apaas/coding-vite-preset",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Vite 8 preset for OpenClaw projects",
|
|
5
|
+
"main": "./lib/index.js",
|
|
6
|
+
"types": "./lib/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"lib",
|
|
9
|
+
"src/empty.css",
|
|
10
|
+
"src/inspector-stub.js",
|
|
11
|
+
"src/module-alias/clsx.mjs",
|
|
12
|
+
"src/module-alias/echarts.mjs",
|
|
13
|
+
"src/module-alias/echarts-for-react.mjs",
|
|
14
|
+
"src/module-alias/registry_echarts_theme.mjs",
|
|
15
|
+
"src/overlay"
|
|
16
|
+
],
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"keywords": [
|
|
19
|
+
"openclaw",
|
|
20
|
+
"vite",
|
|
21
|
+
"presets"
|
|
22
|
+
],
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc || true",
|
|
28
|
+
"watch": "tsc --watch",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest",
|
|
31
|
+
"prepublishOnly": "npm run build"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@lark-apaas/devtool-kits": "^1.2.20",
|
|
35
|
+
"@tailwindcss/vite": "^4.0.0",
|
|
36
|
+
"@lark-apaas/vite-inspector-plugin": "^1.0.3",
|
|
37
|
+
"@vitejs/plugin-legacy": "^7.0.0",
|
|
38
|
+
"@vitejs/plugin-react": "^6.0.0",
|
|
39
|
+
"clsx": "^2.1.1",
|
|
40
|
+
"colorjs.io": "^0.5.2",
|
|
41
|
+
"dotenv": "^16.4.5",
|
|
42
|
+
"echarts": "^6.0.0",
|
|
43
|
+
"echarts-for-react": "^3.0.2",
|
|
44
|
+
"glob": "^11.0.0",
|
|
45
|
+
"html-minifier-terser": "^7.2.0",
|
|
46
|
+
"postcss-import": "^16.1.1",
|
|
47
|
+
"tailwind-merge": "^2.5.5",
|
|
48
|
+
"vite-tsconfig-paths": "^6.0.5"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.15.30",
|
|
52
|
+
"typescript": "^5.9.2",
|
|
53
|
+
"vite": "^8.0.0",
|
|
54
|
+
"vitest": "^3.2.4"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"react": ">=16.14.0",
|
|
58
|
+
"react-dom": ">=16.14.0",
|
|
59
|
+
"vite": "^8.0.0"
|
|
60
|
+
}
|
|
61
|
+
}
|
package/src/empty.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/* Empty CSS stub for production builds - inspector styles are dev-only */
|