@lark-apaas/fullstack-vite-preset 1.0.1-alpha.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/README.md +121 -0
- package/lib/index.d.ts +39 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +75 -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.d.ts +4 -0
- package/lib/module-alias/echarts.d.ts.map +1 -0
- package/lib/module-alias/echarts.js +50 -0
- package/lib/module-alias/echarts.js.map +1 -0
- package/lib/module-alias/registry_echarts_theme.d.ts +696 -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/preset.d.ts +14 -0
- package/lib/preset.d.ts.map +1 -0
- package/lib/preset.js +283 -0
- package/lib/preset.js.map +1 -0
- package/lib/utils/hmr-timing.d.ts +8 -0
- package/lib/utils/hmr-timing.d.ts.map +1 -0
- package/lib/utils/hmr-timing.js +132 -0
- package/lib/utils/hmr-timing.js.map +1 -0
- package/lib/utils/normalize-base-path.d.ts +7 -0
- package/lib/utils/normalize-base-path.d.ts.map +1 -0
- package/lib/utils/normalize-base-path.js +15 -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/html-output-plugin.d.ts +14 -0
- package/lib/vite-plugins/html-output-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/html-output-plugin.js +129 -0
- package/lib/vite-plugins/html-output-plugin.js.map +1 -0
- package/lib/vite-plugins/inspector-css-plugin.d.ts +19 -0
- package/lib/vite-plugins/inspector-css-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/inspector-css-plugin.js +70 -0
- package/lib/vite-plugins/inspector-css-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 +36 -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 +81 -0
- package/lib/vite-plugins/og-meta-plugin.js.map +1 -0
- package/lib/vite-plugins/route-parser-plugin.d.ts +8 -0
- package/lib/vite-plugins/route-parser-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/route-parser-plugin.js +280 -0
- package/lib/vite-plugins/route-parser-plugin.js.map +1 -0
- package/lib/vite-plugins/runtime-injection-plugin.d.ts +22 -0
- package/lib/vite-plugins/runtime-injection-plugin.d.ts.map +1 -0
- package/lib/vite-plugins/runtime-injection-plugin.js +50 -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 +98 -0
- package/lib/vite-plugins/slardar-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/package.json +57 -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.mjs +28 -0
- package/src/module-alias/registry_echarts_theme.mjs +390 -0
package/lib/preset.js
ADDED
|
@@ -0,0 +1,283 @@
|
|
|
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.createRecommendViteConfig = createRecommendViteConfig;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const plugin_react_1 = __importDefault(require("@vitejs/plugin-react"));
|
|
9
|
+
const vite_inspector_plugin_1 = require("@lark-apaas/vite-inspector-plugin");
|
|
10
|
+
const devtool_kits_1 = require("@lark-apaas/devtool-kits");
|
|
11
|
+
const route_parser_plugin_1 = require("./vite-plugins/route-parser-plugin");
|
|
12
|
+
const slardar_plugin_1 = require("./vite-plugins/slardar-plugin");
|
|
13
|
+
const view_context_plugin_1 = require("./vite-plugins/view-context-plugin");
|
|
14
|
+
const og_meta_plugin_1 = require("./vite-plugins/og-meta-plugin");
|
|
15
|
+
const module_alias_plugin_1 = require("./vite-plugins/module-alias-plugin");
|
|
16
|
+
const inspector_css_plugin_1 = require("./vite-plugins/inspector-css-plugin");
|
|
17
|
+
const html_output_plugin_1 = require("./vite-plugins/html-output-plugin");
|
|
18
|
+
const runtime_injection_plugin_1 = require("./vite-plugins/runtime-injection-plugin");
|
|
19
|
+
const snapdom_proxy_1 = require("./utils/snapdom-proxy");
|
|
20
|
+
const hmr_timing_1 = require("./utils/hmr-timing");
|
|
21
|
+
function sendBackendUnavailable502(_err, _req, res) {
|
|
22
|
+
if (res.headersSent)
|
|
23
|
+
return;
|
|
24
|
+
res.writeHead(502, {
|
|
25
|
+
'Content-Type': 'application/json; charset=utf-8',
|
|
26
|
+
'Cache-Control': 'no-cache, no-store, must-revalidate',
|
|
27
|
+
});
|
|
28
|
+
res.end(JSON.stringify({
|
|
29
|
+
error: 'Bad Gateway',
|
|
30
|
+
message: 'Backend service is not running',
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
function createRecommendViteConfig(options) {
|
|
34
|
+
const { isDev = true, enableReactRefresh = isDev, needRoutes = true, clientBasePath = '', publicPath = '', } = options;
|
|
35
|
+
// Inspector can be disabled via environment variable
|
|
36
|
+
const enableInspector = isDev && process.env.DISABLE_INSPECTOR !== 'true';
|
|
37
|
+
const rootDir = process.cwd();
|
|
38
|
+
const serverPort = process.env.SERVER_PORT || '3000';
|
|
39
|
+
// Build the plugins array
|
|
40
|
+
const plugins = [
|
|
41
|
+
// Runtime injection plugin - injects @lark-apaas/client-toolkit/runtime
|
|
42
|
+
// Must be early to ensure runtime is loaded before app code
|
|
43
|
+
(0, runtime_injection_plugin_1.runtimeInjectionPlugin)(),
|
|
44
|
+
// Inspector CSS plugin - handles @/inspector.dev.css import
|
|
45
|
+
// Must be before React plugin to intercept the import
|
|
46
|
+
(0, inspector_css_plugin_1.inspectorCssPlugin)({ isDev }),
|
|
47
|
+
// React plugin with Babel for styled-jsx support
|
|
48
|
+
(0, plugin_react_1.default)({
|
|
49
|
+
jsxRuntime: 'automatic',
|
|
50
|
+
// Only use inspector jsx-runtime in dev mode when inspector is enabled
|
|
51
|
+
jsxImportSource: enableInspector
|
|
52
|
+
? '@lark-apaas/miaoda-inspector-jsx-runtime'
|
|
53
|
+
: 'react',
|
|
54
|
+
babel: {
|
|
55
|
+
plugins: [['styled-jsx/babel']],
|
|
56
|
+
},
|
|
57
|
+
// Only enable fast refresh in dev mode
|
|
58
|
+
...(enableReactRefresh ? {} : { fastRefresh: false }),
|
|
59
|
+
}),
|
|
60
|
+
// Inspector plugin for dev mode (injects data attributes for debugging)
|
|
61
|
+
// Only enabled in development when DISABLE_INSPECTOR is not set
|
|
62
|
+
enableInspector && (0, vite_inspector_plugin_1.inspectorPlugin)(),
|
|
63
|
+
// Module alias plugin for clsx and echarts
|
|
64
|
+
(0, module_alias_plugin_1.moduleAliasPlugin)(),
|
|
65
|
+
// Route parser plugin (dev only, when needRoutes is true)
|
|
66
|
+
needRoutes &&
|
|
67
|
+
(0, route_parser_plugin_1.routeParserPlugin)({
|
|
68
|
+
appPath: './client/src/app.tsx',
|
|
69
|
+
}),
|
|
70
|
+
// Performance monitoring plugin (Slardar + Tea)
|
|
71
|
+
(0, slardar_plugin_1.slardarPlugin)({ bid: 'apaas_miaoda' }),
|
|
72
|
+
// View context injection plugin
|
|
73
|
+
(0, view_context_plugin_1.viewContextPlugin)(),
|
|
74
|
+
// OG Meta tags injection plugin
|
|
75
|
+
(0, og_meta_plugin_1.ogMetaPlugin)(),
|
|
76
|
+
// HTML output plugin - handles HTML path and dev mode disk write
|
|
77
|
+
(0, html_output_plugin_1.htmlOutputPlugin)({
|
|
78
|
+
isDev,
|
|
79
|
+
outDir: path_1.default.resolve(rootDir, 'dist/client'),
|
|
80
|
+
}),
|
|
81
|
+
// HMR timing plugin (dev only)
|
|
82
|
+
isDev && (0, hmr_timing_1.createHmrTimingPlugin)(),
|
|
83
|
+
];
|
|
84
|
+
const config = {
|
|
85
|
+
root: rootDir,
|
|
86
|
+
base: publicPath ? publicPath + '/' : '/',
|
|
87
|
+
plugins: plugins.filter(Boolean),
|
|
88
|
+
resolve: {
|
|
89
|
+
extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'],
|
|
90
|
+
alias: {
|
|
91
|
+
// In production, replace inspector package with empty stub
|
|
92
|
+
// Inspector is only needed in development mode
|
|
93
|
+
...(!isDev
|
|
94
|
+
? {
|
|
95
|
+
'@lark-apaas/miaoda-inspector': path_1.default.resolve(__dirname, '../src/inspector-stub.js'),
|
|
96
|
+
}
|
|
97
|
+
: {}),
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
define: {
|
|
101
|
+
// Polyfill for Node.js global object (used by sockjs-client, etc.)
|
|
102
|
+
global: 'globalThis',
|
|
103
|
+
'process.env.NODE_ENV': JSON.stringify(isDev ? 'development' : 'production'),
|
|
104
|
+
'process.env.runtimeMode': JSON.stringify('fullstack'),
|
|
105
|
+
'process.env.CLIENT_BASE_PATH': JSON.stringify(clientBasePath),
|
|
106
|
+
// Define as undefined (not empty string) when not set, so ?? fallback works
|
|
107
|
+
'process.env.FORCE_FRAMEWORK_DOMAIN_MAIN': process.env
|
|
108
|
+
.FORCE_FRAMEWORK_DOMAIN_MAIN
|
|
109
|
+
? JSON.stringify(process.env.FORCE_FRAMEWORK_DOMAIN_MAIN)
|
|
110
|
+
: 'undefined',
|
|
111
|
+
'process.env.CWD': JSON.stringify(''),
|
|
112
|
+
},
|
|
113
|
+
server: {
|
|
114
|
+
port: Number(process.env.CLIENT_DEV_PORT) || 8080,
|
|
115
|
+
host: process.env.CLIENT_DEV_HOST || 'localhost',
|
|
116
|
+
strictPort: false,
|
|
117
|
+
cors: true,
|
|
118
|
+
headers: {
|
|
119
|
+
...(process.env.FORCE_FRAMEWORK_DOMAIN_MAIN
|
|
120
|
+
? {
|
|
121
|
+
'Access-Control-Allow-Origin': process.env.FORCE_FRAMEWORK_DOMAIN_MAIN,
|
|
122
|
+
}
|
|
123
|
+
: {}),
|
|
124
|
+
},
|
|
125
|
+
watch: {
|
|
126
|
+
usePolling: true,
|
|
127
|
+
interval: 500,
|
|
128
|
+
},
|
|
129
|
+
proxy: {
|
|
130
|
+
// API proxy
|
|
131
|
+
[`${clientBasePath}/api`]: {
|
|
132
|
+
target: `http://localhost:${serverPort}`,
|
|
133
|
+
changeOrigin: true,
|
|
134
|
+
configure: (proxy) => {
|
|
135
|
+
proxy.on('error', (err, req, res) => {
|
|
136
|
+
sendBackendUnavailable502(err, req, res);
|
|
137
|
+
});
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
// Inner API proxy
|
|
141
|
+
[`${clientBasePath}/__innerapi__`]: {
|
|
142
|
+
target: `http://localhost:${serverPort}`,
|
|
143
|
+
changeOrigin: true,
|
|
144
|
+
configure: (proxy) => {
|
|
145
|
+
proxy.on('error', (err, req, res) => {
|
|
146
|
+
sendBackendUnavailable502(err, req, res);
|
|
147
|
+
});
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
build: {
|
|
153
|
+
outDir: path_1.default.resolve(rootDir, 'dist/client'),
|
|
154
|
+
emptyOutDir: false,
|
|
155
|
+
sourcemap: isDev,
|
|
156
|
+
minify: !isDev ? 'esbuild' : false,
|
|
157
|
+
rollupOptions: {
|
|
158
|
+
input: path_1.default.resolve(rootDir, 'client/index.html'),
|
|
159
|
+
output: {
|
|
160
|
+
// Allow code splitting (Vite default)
|
|
161
|
+
manualChunks: undefined,
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
// Copy public directory
|
|
165
|
+
copyPublicDir: true,
|
|
166
|
+
},
|
|
167
|
+
publicDir: path_1.default.resolve(rootDir, 'client/public'),
|
|
168
|
+
// Don't specify css.postcss here - let Vite pick up the project's postcss.config.js
|
|
169
|
+
// This allows projects to configure their own PostCSS plugins (e.g., Tailwind v4)
|
|
170
|
+
// Optimize deps for faster dev startup
|
|
171
|
+
optimizeDeps: {
|
|
172
|
+
include: [
|
|
173
|
+
'react',
|
|
174
|
+
'react-dom',
|
|
175
|
+
'react/jsx-runtime',
|
|
176
|
+
'react/jsx-dev-runtime',
|
|
177
|
+
'clsx',
|
|
178
|
+
'echarts',
|
|
179
|
+
// Include inspector so Vite pre-bundles it with its dependencies
|
|
180
|
+
...(enableInspector ? ['@lark-apaas/miaoda-inspector'] : []),
|
|
181
|
+
],
|
|
182
|
+
// Exclude jsx-runtime from pre-bundling (it's handled specially by React plugin)
|
|
183
|
+
exclude: enableInspector
|
|
184
|
+
? ['@lark-apaas/miaoda-inspector-jsx-runtime']
|
|
185
|
+
: [],
|
|
186
|
+
// Pass define replacements to esbuild for pre-bundling
|
|
187
|
+
// Without this, process.env.X in dependencies won't be replaced
|
|
188
|
+
esbuildOptions: {
|
|
189
|
+
define: {
|
|
190
|
+
'process.env.NODE_ENV': JSON.stringify(isDev ? 'development' : 'production'),
|
|
191
|
+
// Use actual value if set, otherwise undefined for ?? fallback
|
|
192
|
+
'process.env.FORCE_FRAMEWORK_DOMAIN_MAIN': process.env
|
|
193
|
+
.FORCE_FRAMEWORK_DOMAIN_MAIN
|
|
194
|
+
? JSON.stringify(process.env.FORCE_FRAMEWORK_DOMAIN_MAIN)
|
|
195
|
+
: 'undefined',
|
|
196
|
+
global: 'globalThis',
|
|
197
|
+
},
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
// Add custom middleware setup for dev server
|
|
202
|
+
if (isDev) {
|
|
203
|
+
const originalConfigureServer = config.server?.configureServer;
|
|
204
|
+
config.server = {
|
|
205
|
+
...config.server,
|
|
206
|
+
};
|
|
207
|
+
// Use a plugin to configure the dev server with middlewares
|
|
208
|
+
config.plugins.push({
|
|
209
|
+
name: 'fullstack-dev-middlewares',
|
|
210
|
+
async configureServer(server) {
|
|
211
|
+
// Note: Express compatibility layer (res.status, res.json, req.query) is now
|
|
212
|
+
// handled by @lark-apaas/devtool-kits internally via registerMiddlewares()
|
|
213
|
+
// Register SnapDom proxy middleware
|
|
214
|
+
(0, snapdom_proxy_1.registerSnapDomProxyMiddleware)(server.middlewares, {
|
|
215
|
+
baseUrl: clientBasePath,
|
|
216
|
+
});
|
|
217
|
+
// Register devtool-kits middlewares (must await since it's async)
|
|
218
|
+
await (0, devtool_kits_1.registerMiddlewares)(server.middlewares, [
|
|
219
|
+
(0, devtool_kits_1.createDevLogsMiddleware)({
|
|
220
|
+
logDir: process.env.LOG_DIR || './logs',
|
|
221
|
+
}),
|
|
222
|
+
(0, devtool_kits_1.createOpenapiMiddleware)({
|
|
223
|
+
openapiFilePath: path_1.default.resolve(rootDir, './client/src/api/gen/openapi.json'),
|
|
224
|
+
serverDir: path_1.default.resolve(rootDir, './server'),
|
|
225
|
+
enableEnhancement: true,
|
|
226
|
+
}),
|
|
227
|
+
(0, devtool_kits_1.createCollectLogsMiddleware)({
|
|
228
|
+
logDir: process.env.LOG_DIR || './logs',
|
|
229
|
+
fileName: 'browser.log',
|
|
230
|
+
}),
|
|
231
|
+
], {
|
|
232
|
+
basePath: clientBasePath,
|
|
233
|
+
isDev,
|
|
234
|
+
});
|
|
235
|
+
// Proxy HTML requests to backend server
|
|
236
|
+
server.middlewares.use((req, res, next) => {
|
|
237
|
+
const devServerWhiteList = [
|
|
238
|
+
'/@vite',
|
|
239
|
+
'/@fs',
|
|
240
|
+
'/__vite',
|
|
241
|
+
'/@id',
|
|
242
|
+
'/node_modules',
|
|
243
|
+
'/dev/',
|
|
244
|
+
'.hot-update',
|
|
245
|
+
];
|
|
246
|
+
const isHtmlRequest = req.headers.accept?.includes('text/html');
|
|
247
|
+
const pathname = req.url?.split('?')[0] || '';
|
|
248
|
+
const isDevServerPath = devServerWhiteList.some((item) => pathname.includes(item));
|
|
249
|
+
const isStaticAsset = /\.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot)$/i.test(pathname);
|
|
250
|
+
if (isHtmlRequest && !isDevServerPath && !isStaticAsset) {
|
|
251
|
+
// Forward to backend server
|
|
252
|
+
const http = require('http');
|
|
253
|
+
const proxyReq = http.request({
|
|
254
|
+
hostname: 'localhost',
|
|
255
|
+
port: serverPort,
|
|
256
|
+
path: req.url,
|
|
257
|
+
method: req.method,
|
|
258
|
+
headers: req.headers,
|
|
259
|
+
}, (proxyRes) => {
|
|
260
|
+
res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);
|
|
261
|
+
proxyRes.pipe(res);
|
|
262
|
+
});
|
|
263
|
+
proxyReq.on('error', (err) => {
|
|
264
|
+
(0, devtool_kits_1.handleDevProxyError)(err, req, res, {
|
|
265
|
+
target: `http://localhost:${serverPort}`,
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
req.pipe(proxyReq);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
next();
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
// Call original configureServer if exists
|
|
275
|
+
if (originalConfigureServer) {
|
|
276
|
+
originalConfigureServer(server);
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
return config;
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=preset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset.js","sourceRoot":"","sources":["../src/preset.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
/**
|
|
3
|
+
* Create HMR timing plugin for Vite
|
|
4
|
+
* Tracks file changes and compilation time, broadcasting to connected clients
|
|
5
|
+
*/
|
|
6
|
+
export declare function createHmrTimingPlugin(): Plugin;
|
|
7
|
+
export default createHmrTimingPlugin;
|
|
8
|
+
//# sourceMappingURL=hmr-timing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmr-timing.d.ts","sourceRoot":"","sources":["../../src/utils/hmr-timing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAGlD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAqG9C;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
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.createHmrTimingPlugin = createHmrTimingPlugin;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
/**
|
|
39
|
+
* Create HMR timing plugin for Vite
|
|
40
|
+
* Tracks file changes and compilation time, broadcasting to connected clients
|
|
41
|
+
*/
|
|
42
|
+
function createHmrTimingPlugin() {
|
|
43
|
+
let startTime = 0;
|
|
44
|
+
let changedFiles = new Set();
|
|
45
|
+
return {
|
|
46
|
+
name: 'fullstack-hmr-timing',
|
|
47
|
+
configureServer(server) {
|
|
48
|
+
// Listen for file changes
|
|
49
|
+
server.watcher.on('change', (file) => {
|
|
50
|
+
startTime = Date.now();
|
|
51
|
+
changedFiles.add(file);
|
|
52
|
+
});
|
|
53
|
+
// Listen for HMR update events
|
|
54
|
+
server.ws.on('connection', (socket) => {
|
|
55
|
+
// When an HMR update is sent, calculate and broadcast timing
|
|
56
|
+
const originalSend = socket.send.bind(socket);
|
|
57
|
+
socket.send = (data) => {
|
|
58
|
+
try {
|
|
59
|
+
const parsed = JSON.parse(data);
|
|
60
|
+
if (parsed.type === 'update' || parsed.type === 'full-reload') {
|
|
61
|
+
const duration = Date.now() - startTime;
|
|
62
|
+
// Filter valid files - only keep actual project files
|
|
63
|
+
const validFiles = [...changedFiles]
|
|
64
|
+
.map((f) => f.replace(process.cwd(), '').replace(/\\/g, '/'))
|
|
65
|
+
.filter((filePath) => {
|
|
66
|
+
// Filter invalid files
|
|
67
|
+
if (!filePath || filePath.length === 0)
|
|
68
|
+
return false;
|
|
69
|
+
// Filter out node_modules files
|
|
70
|
+
if (filePath.includes('/node_modules/'))
|
|
71
|
+
return false;
|
|
72
|
+
// Only keep supported file types
|
|
73
|
+
const validExtensions = [
|
|
74
|
+
'.js',
|
|
75
|
+
'.jsx',
|
|
76
|
+
'.ts',
|
|
77
|
+
'.tsx',
|
|
78
|
+
'.svelte',
|
|
79
|
+
'.css',
|
|
80
|
+
'.json',
|
|
81
|
+
'.html',
|
|
82
|
+
];
|
|
83
|
+
const hasValidExtension = validExtensions.some((ext) => filePath.toLowerCase().endsWith(ext));
|
|
84
|
+
if (!hasValidExtension)
|
|
85
|
+
return false;
|
|
86
|
+
return true;
|
|
87
|
+
});
|
|
88
|
+
// Get file statistics
|
|
89
|
+
const fileStats = validFiles.map((filePath) => {
|
|
90
|
+
const fullPath = process.cwd() + filePath;
|
|
91
|
+
try {
|
|
92
|
+
const stats = fs.statSync(fullPath);
|
|
93
|
+
return {
|
|
94
|
+
path: filePath,
|
|
95
|
+
size: stats.size,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return {
|
|
100
|
+
path: filePath,
|
|
101
|
+
size: 0,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
// Calculate total file size (bytes)
|
|
106
|
+
const totalSize = fileStats.reduce((sum, file) => sum + file.size, 0);
|
|
107
|
+
const payload = {
|
|
108
|
+
duration,
|
|
109
|
+
fileCount: validFiles.length,
|
|
110
|
+
fileTotalSize: totalSize,
|
|
111
|
+
};
|
|
112
|
+
// Broadcast to browser
|
|
113
|
+
server.ws.send({
|
|
114
|
+
type: 'custom',
|
|
115
|
+
event: 'hmr-timing',
|
|
116
|
+
data: payload,
|
|
117
|
+
});
|
|
118
|
+
// Clear changed files after broadcasting
|
|
119
|
+
changedFiles.clear();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Ignore parsing errors
|
|
124
|
+
}
|
|
125
|
+
return originalSend(data);
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
exports.default = createHmrTimingPlugin;
|
|
132
|
+
//# sourceMappingURL=hmr-timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hmr-timing.js","sourceRoot":"","sources":["../../src/utils/hmr-timing.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,sDAqGC;AA3GD,uCAAyB;AAEzB;;;GAGG;AACH,SAAgB,qBAAqB;IACnC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,OAAO;QACL,IAAI,EAAE,sBAAsB;QAE5B,eAAe,CAAC,MAAqB;YACnC,0BAA0B;YAC1B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;gBACnC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;YAEH,+BAA+B;YAC/B,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;gBACpC,6DAA6D;gBAC7D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM,CAAC,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE;oBAC7B,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAChC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;4BAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;4BAExC,sDAAsD;4BACtD,MAAM,UAAU,GAAG,CAAC,GAAG,YAAY,CAAC;iCACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CACjD;iCACA,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;gCACnB,uBAAuB;gCACvB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;oCAAE,OAAO,KAAK,CAAC;gCAErD,gCAAgC;gCAChC,IAAI,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC;oCAAE,OAAO,KAAK,CAAC;gCAEtD,iCAAiC;gCACjC,MAAM,eAAe,GAAG;oCACtB,KAAK;oCACL,MAAM;oCACN,KAAK;oCACL,MAAM;oCACN,SAAS;oCACT,MAAM;oCACN,OAAO;oCACP,OAAO;iCACR,CAAC;gCACF,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CACrD,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CACrC,CAAC;gCACF,IAAI,CAAC,iBAAiB;oCAAE,OAAO,KAAK,CAAC;gCACrC,OAAO,IAAI,CAAC;4BACd,CAAC,CAAC,CAAC;4BAEL,sBAAsB;4BACtB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;gCAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;gCAC1C,IAAI,CAAC;oCACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oCACpC,OAAO;wCACL,IAAI,EAAE,QAAQ;wCACd,IAAI,EAAE,KAAK,CAAC,IAAI;qCACjB,CAAC;gCACJ,CAAC;gCAAC,MAAM,CAAC;oCACP,OAAO;wCACL,IAAI,EAAE,QAAQ;wCACd,IAAI,EAAE,CAAC;qCACR,CAAC;gCACJ,CAAC;4BACH,CAAC,CAAC,CAAC;4BAEH,oCAAoC;4BACpC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAChC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAC9B,CAAC,CACF,CAAC;4BAEF,MAAM,OAAO,GAAG;gCACd,QAAQ;gCACR,SAAS,EAAE,UAAU,CAAC,MAAM;gCAC5B,aAAa,EAAE,SAAS;6BACzB,CAAC;4BAEF,uBAAuB;4BACvB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC;gCACb,IAAI,EAAE,QAAQ;gCACd,KAAK,EAAE,YAAY;gCACnB,IAAI,EAAE,OAAO;6BACd,CAAC,CAAC;4BAEH,yCAAyC;4BACzC,YAAY,CAAC,KAAK,EAAE,CAAC;wBACvB,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,wBAAwB;oBAC1B,CAAC;oBACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize base path, ensuring it starts with '/' and does not include trailing slash
|
|
3
|
+
* @param basePath Original base path
|
|
4
|
+
* @returns Normalized base path
|
|
5
|
+
*/
|
|
6
|
+
export declare function normalizeBasePathWithoutTrailingSlash(basePath: string): string;
|
|
7
|
+
//# sourceMappingURL=normalize-base-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-base-path.d.ts","sourceRoot":"","sources":["../../src/utils/normalize-base-path.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK9E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeBasePathWithoutTrailingSlash = normalizeBasePathWithoutTrailingSlash;
|
|
4
|
+
/**
|
|
5
|
+
* Normalize base path, ensuring it starts with '/' and does not include trailing slash
|
|
6
|
+
* @param basePath Original base path
|
|
7
|
+
* @returns Normalized base path
|
|
8
|
+
*/
|
|
9
|
+
function normalizeBasePathWithoutTrailingSlash(basePath) {
|
|
10
|
+
const basePathWithoutTrailingSlash = basePath.endsWith('/')
|
|
11
|
+
? basePath.slice(0, -1)
|
|
12
|
+
: basePath;
|
|
13
|
+
return basePathWithoutTrailingSlash;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=normalize-base-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-base-path.js","sourceRoot":"","sources":["../../src/utils/normalize-base-path.ts"],"names":[],"mappings":";;AAKA,sFAKC;AAVD;;;;GAIG;AACH,SAAgB,qCAAqC,CAAC,QAAgB;IACpE,MAAM,4BAA4B,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;QACzD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,QAAQ,CAAC;IACb,OAAO,4BAA4B,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Connect } from 'vite';
|
|
2
|
+
interface SnapDomMiddlewareOptions {
|
|
3
|
+
proxyUrl?: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function registerSnapDomProxyMiddleware(middlewares: Connect.Server, options?: SnapDomMiddlewareOptions): void;
|
|
7
|
+
export default registerSnapDomProxyMiddleware;
|
|
8
|
+
//# sourceMappingURL=snapdom-proxy.d.ts.map
|
|
@@ -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,14 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
export interface HtmlOutputPluginOptions {
|
|
3
|
+
/** Whether running in development mode */
|
|
4
|
+
isDev: boolean;
|
|
5
|
+
/** Output directory for built files */
|
|
6
|
+
outDir: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Vite plugin to handle HTML output:
|
|
10
|
+
* 1. In production: fixes HTML output path (removes extra 'client' directory)
|
|
11
|
+
* 2. In development: writes transformed HTML to disk for backend to serve
|
|
12
|
+
*/
|
|
13
|
+
export declare function htmlOutputPlugin(options: HtmlOutputPluginOptions): Plugin;
|
|
14
|
+
//# 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;AAElE,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,CA8HzE"}
|