olova 2.0.61 → 2.0.63
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/CHANGELOG.md +5 -0
- package/README.md +42 -61
- package/dist/compiler.d.ts +44 -0
- package/dist/compiler.js +2139 -0
- package/dist/compiler.js.map +1 -0
- package/dist/core.d.ts +4 -0
- package/dist/core.js +859 -0
- package/dist/core.js.map +1 -0
- package/dist/global.d.ts +15 -0
- package/dist/global.js +226 -0
- package/dist/global.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2302 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime.d.ts +89 -0
- package/dist/runtime.js +633 -0
- package/dist/runtime.js.map +1 -0
- package/dist/signals-core-BdfWh1Yt.d.ts +43 -0
- package/dist/vite.d.ts +5 -0
- package/dist/vite.js +2302 -0
- package/dist/vite.js.map +1 -0
- package/package.json +83 -65
- package/dist/chunk-D7SIC5TC.js +0 -367
- package/dist/chunk-D7SIC5TC.js.map +0 -1
- package/dist/entry-server.cjs +0 -120
- package/dist/entry-server.cjs.map +0 -1
- package/dist/entry-server.js +0 -115
- package/dist/entry-server.js.map +0 -1
- package/dist/entry-worker.cjs +0 -133
- package/dist/entry-worker.cjs.map +0 -1
- package/dist/entry-worker.js +0 -127
- package/dist/entry-worker.js.map +0 -1
- package/dist/main.cjs +0 -18
- package/dist/main.cjs.map +0 -1
- package/dist/main.js +0 -16
- package/dist/main.js.map +0 -1
- package/dist/olova.cjs +0 -1680
- package/dist/olova.cjs.map +0 -1
- package/dist/olova.d.cts +0 -72
- package/dist/olova.d.ts +0 -72
- package/dist/olova.js +0 -1321
- package/dist/olova.js.map +0 -1
- package/dist/performance.cjs +0 -386
- package/dist/performance.cjs.map +0 -1
- package/dist/performance.js +0 -3
- package/dist/performance.js.map +0 -1
- package/dist/router.cjs +0 -646
- package/dist/router.cjs.map +0 -1
- package/dist/router.d.cts +0 -113
- package/dist/router.d.ts +0 -113
- package/dist/router.js +0 -632
- package/dist/router.js.map +0 -1
- package/main.tsx +0 -76
- package/olova.ts +0 -619
- package/src/entry-server.tsx +0 -165
- package/src/entry-worker.tsx +0 -201
- package/src/generator/index.ts +0 -409
- package/src/hydration/flight.ts +0 -320
- package/src/hydration/index.ts +0 -12
- package/src/hydration/types.ts +0 -225
- package/src/logger.ts +0 -182
- package/src/main.tsx +0 -24
- package/src/performance.ts +0 -488
- package/src/plugin/index.ts +0 -204
- package/src/router/ErrorBoundary.tsx +0 -145
- package/src/router/Link.tsx +0 -117
- package/src/router/OlovaRouter.tsx +0 -354
- package/src/router/Outlet.tsx +0 -8
- package/src/router/context.ts +0 -117
- package/src/router/index.ts +0 -29
- package/src/router/matching.ts +0 -63
- package/src/router/router.tsx +0 -23
- package/src/router/search-params.ts +0 -29
- package/src/scanner/index.ts +0 -114
- package/src/types/index.ts +0 -190
- package/src/utils/export.ts +0 -85
- package/src/utils/index.ts +0 -4
- package/src/utils/naming.ts +0 -54
- package/src/utils/path.ts +0 -45
- package/tsup.config.ts +0 -35
package/dist/performance.cjs
DELETED
|
@@ -1,386 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var fs = require('fs/promises');
|
|
6
|
-
var path = require('path');
|
|
7
|
-
var util = require('util');
|
|
8
|
-
var zlib = require('zlib');
|
|
9
|
-
var pc = require('picocolors');
|
|
10
|
-
|
|
11
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
-
|
|
13
|
-
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
14
|
-
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
15
|
-
var zlib__default = /*#__PURE__*/_interopDefault(zlib);
|
|
16
|
-
var pc__default = /*#__PURE__*/_interopDefault(pc);
|
|
17
|
-
|
|
18
|
-
// src/performance.ts
|
|
19
|
-
var VERSION = "0.0.14";
|
|
20
|
-
function printBanner() {
|
|
21
|
-
console.log("");
|
|
22
|
-
console.log(pc__default.default.cyan(` \u25B2 Olova`) + pc__default.default.dim(` ${VERSION}`));
|
|
23
|
-
console.log("");
|
|
24
|
-
}
|
|
25
|
-
function printDevReady(url, networkUrl) {
|
|
26
|
-
console.log("");
|
|
27
|
-
console.log(` ${pc__default.default.green("\u2713")} ${pc__default.default.bold("Ready")} in ${pc__default.default.cyan("~1s")}`);
|
|
28
|
-
console.log("");
|
|
29
|
-
console.log(` ${pc__default.default.dim("Local:")} ${pc__default.default.cyan(url)}`);
|
|
30
|
-
if (networkUrl) {
|
|
31
|
-
console.log(` ${pc__default.default.dim("Network:")} ${pc__default.default.cyan(networkUrl)}`);
|
|
32
|
-
}
|
|
33
|
-
console.log("");
|
|
34
|
-
}
|
|
35
|
-
function printBuildStart() {
|
|
36
|
-
console.log("");
|
|
37
|
-
console.log(` ${pc__default.default.dim("Creating an optimized production build...")}`);
|
|
38
|
-
console.log("");
|
|
39
|
-
}
|
|
40
|
-
function printSSGStart(buildId) {
|
|
41
|
-
console.log("");
|
|
42
|
-
console.log(pc__default.default.bold(pc__default.default.cyan(` \u2713 Compiled successfully`)));
|
|
43
|
-
console.log("");
|
|
44
|
-
console.log(` ${pc__default.default.dim("Build ID:")} ${pc__default.default.yellow(buildId)}`);
|
|
45
|
-
console.log("");
|
|
46
|
-
}
|
|
47
|
-
function printRoutes(routes) {
|
|
48
|
-
console.log(` ${pc__default.default.bold("Route")}${" ".repeat(32)}${pc__default.default.bold("Type")}`);
|
|
49
|
-
console.log(` ${pc__default.default.dim("\u250C")}${pc__default.default.dim("\u2500".repeat(43))}${pc__default.default.dim("\u2510")}`);
|
|
50
|
-
for (const route of routes) {
|
|
51
|
-
const icon = route.type === "static" ? pc__default.default.green("\u25CB") : pc__default.default.magenta("\u03BB");
|
|
52
|
-
const typeLabel = route.type === "static" ? pc__default.default.green("Static") : pc__default.default.magenta("Dynamic");
|
|
53
|
-
const pathDisplay = route.path === "/" ? "/" : route.path;
|
|
54
|
-
const padding = " ".repeat(Math.max(1, 35 - pathDisplay.length));
|
|
55
|
-
console.log(` ${pc__default.default.dim("\u2502")} ${icon} ${pc__default.default.white(pathDisplay)}${padding}${typeLabel}`);
|
|
56
|
-
}
|
|
57
|
-
console.log(` ${pc__default.default.dim("\u2514")}${pc__default.default.dim("\u2500".repeat(43))}${pc__default.default.dim("\u2518")}`);
|
|
58
|
-
console.log("");
|
|
59
|
-
}
|
|
60
|
-
function printPageGenerated(path2, hasFlightData = true) {
|
|
61
|
-
const badge = hasFlightData ? pc__default.default.dim(pc__default.default.cyan(" [Flight]")) : "";
|
|
62
|
-
console.log(` ${pc__default.default.dim("\u2713")} ${pc__default.default.dim("Generated")} ${pc__default.default.white(path2)}${badge}`);
|
|
63
|
-
}
|
|
64
|
-
function printPageError(path2, error2) {
|
|
65
|
-
console.log(` ${pc__default.default.red("\u2717")} ${pc__default.default.red("Failed")} ${path2}`);
|
|
66
|
-
console.log(` ${pc__default.default.dim(error2)}`);
|
|
67
|
-
}
|
|
68
|
-
function printSSGComplete(stats) {
|
|
69
|
-
console.log("");
|
|
70
|
-
console.log(` ${pc__default.default.dim("\u2500".repeat(45))}`);
|
|
71
|
-
console.log("");
|
|
72
|
-
if (stats.failedPages > 0) {
|
|
73
|
-
console.log(` ${pc__default.default.yellow("\u26A0")} ${pc__default.default.yellow("Build completed with warnings")}`);
|
|
74
|
-
} else {
|
|
75
|
-
console.log(` ${pc__default.default.green("\u2713")} ${pc__default.default.green("Build completed successfully")}`);
|
|
76
|
-
}
|
|
77
|
-
console.log("");
|
|
78
|
-
console.log(` ${pc__default.default.dim("Pages:")} ${pc__default.default.bold(stats.successPages.toString())} generated`);
|
|
79
|
-
if (stats.failedPages > 0) {
|
|
80
|
-
console.log(` ${pc__default.default.red(stats.failedPages.toString())} failed`);
|
|
81
|
-
}
|
|
82
|
-
console.log(` ${pc__default.default.dim("Time:")} ${pc__default.default.cyan(stats.buildTime + "ms")}`);
|
|
83
|
-
console.log("");
|
|
84
|
-
}
|
|
85
|
-
function printFlightInfo() {
|
|
86
|
-
console.log(` ${pc__default.default.cyan("\u25CB")} ${pc__default.default.dim("Flight hydration enabled")}`);
|
|
87
|
-
console.log(` ${pc__default.default.dim("\u2022 JSON-LD structured data")}`);
|
|
88
|
-
console.log(` ${pc__default.default.dim("\u2022 Resource hints")}`);
|
|
89
|
-
console.log(` ${pc__default.default.dim("\u2022 $OLOVA global")}`);
|
|
90
|
-
console.log("");
|
|
91
|
-
}
|
|
92
|
-
function info(message) {
|
|
93
|
-
console.log(` ${pc__default.default.cyan("\u25CB")} ${message}`);
|
|
94
|
-
}
|
|
95
|
-
function success(message) {
|
|
96
|
-
console.log(` ${pc__default.default.green("\u2713")} ${pc__default.default.green(message)}`);
|
|
97
|
-
}
|
|
98
|
-
function warn(message) {
|
|
99
|
-
console.log(` ${pc__default.default.yellow("\u26A0")} ${pc__default.default.yellow(message)}`);
|
|
100
|
-
}
|
|
101
|
-
function error(message) {
|
|
102
|
-
console.log(` ${pc__default.default.red("\u2717")} ${pc__default.default.red(message)}`);
|
|
103
|
-
}
|
|
104
|
-
function printSSRRender(path2) {
|
|
105
|
-
console.log(` ${pc__default.default.cyan("\u2192")} ${pc__default.default.dim("SSR")} ${path2}`);
|
|
106
|
-
}
|
|
107
|
-
var logger_default = {
|
|
108
|
-
printBanner,
|
|
109
|
-
printDevReady,
|
|
110
|
-
printBuildStart,
|
|
111
|
-
printSSGStart,
|
|
112
|
-
printRoutes,
|
|
113
|
-
printPageGenerated,
|
|
114
|
-
printPageError,
|
|
115
|
-
printSSGComplete,
|
|
116
|
-
printFlightInfo,
|
|
117
|
-
printSSRRender,
|
|
118
|
-
info,
|
|
119
|
-
success,
|
|
120
|
-
warn,
|
|
121
|
-
error
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
// src/performance.ts
|
|
125
|
-
var gzip = util.promisify(zlib__default.default.gzip);
|
|
126
|
-
var brotliCompress = util.promisify(zlib__default.default.brotliCompress);
|
|
127
|
-
function createManualChunks() {
|
|
128
|
-
const seenModules = /* @__PURE__ */ new Map();
|
|
129
|
-
return (id, { getModuleInfo }) => {
|
|
130
|
-
if (id.includes("node_modules/react-dom")) {
|
|
131
|
-
return "vendor-react-dom";
|
|
132
|
-
}
|
|
133
|
-
if (id.includes("node_modules/react")) {
|
|
134
|
-
return "vendor-react";
|
|
135
|
-
}
|
|
136
|
-
if (id.includes("olova-router") || id.includes("olovastart/dist/router")) {
|
|
137
|
-
return "framework-router";
|
|
138
|
-
}
|
|
139
|
-
if (id.includes("node_modules")) {
|
|
140
|
-
const match = id.match(/node_modules[\\/]([^/\\]+)/);
|
|
141
|
-
if (match) {
|
|
142
|
-
const pkg = match[1];
|
|
143
|
-
if (["scheduler", "object-assign", "prop-types"].includes(pkg)) {
|
|
144
|
-
return "vendor-react";
|
|
145
|
-
}
|
|
146
|
-
if (["lodash", "moment", "axios", "date-fns"].includes(pkg)) {
|
|
147
|
-
return `vendor-${pkg}`;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return "vendor";
|
|
151
|
-
}
|
|
152
|
-
if (id.includes("/components/")) {
|
|
153
|
-
return "common-components";
|
|
154
|
-
}
|
|
155
|
-
if (id.includes("/utils/") || id.includes("/lib/") || id.includes("/helpers/")) {
|
|
156
|
-
return "common-utils";
|
|
157
|
-
}
|
|
158
|
-
if (id.endsWith(".css") || id.endsWith(".scss")) {
|
|
159
|
-
return void 0;
|
|
160
|
-
}
|
|
161
|
-
if (id.includes("/(auth)/") || id.includes("\\(auth)\\") || id.includes("/search/") || id.includes("\\search\\")) {
|
|
162
|
-
return "page-auth";
|
|
163
|
-
}
|
|
164
|
-
if (id.includes("/src/") && (id.endsWith("/index.tsx") || id.endsWith("/index.mdx"))) {
|
|
165
|
-
const moduleInfo = getModuleInfo(id);
|
|
166
|
-
if (moduleInfo) {
|
|
167
|
-
for (const importer of moduleInfo.importers) {
|
|
168
|
-
if (importer.includes("/src/") && importer.includes("/index.") && !importer.includes(id)) {
|
|
169
|
-
return "common-routes";
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
const routeMatch = id.match(/[\\/]src[\\/](.+?)[\\/]index\.(tsx|mdx)$/);
|
|
174
|
-
if (routeMatch) {
|
|
175
|
-
const routePath = routeMatch[1].replace(/\([^)]+\)[\\/]/g, "").replace(/\[.*?\]/g, "dynamic").replace(/[\\/]/g, "-");
|
|
176
|
-
const baseRoute = routePath.split("-")[0];
|
|
177
|
-
if (seenModules.has(baseRoute)) {
|
|
178
|
-
const existingChunk = seenModules.get(baseRoute);
|
|
179
|
-
if (existingChunk.startsWith("page-")) {
|
|
180
|
-
return existingChunk;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
const chunkName = `page-${routePath}`;
|
|
184
|
-
seenModules.set(baseRoute, chunkName);
|
|
185
|
-
return chunkName;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
return void 0;
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
function compressionPlugin(options = {}) {
|
|
192
|
-
const {
|
|
193
|
-
gzip: enableGzip = true,
|
|
194
|
-
brotli: enableBrotli = true,
|
|
195
|
-
threshold = 1024,
|
|
196
|
-
extensions = ["js", "css", "html", "json", "svg", "xml"]
|
|
197
|
-
} = options;
|
|
198
|
-
let config;
|
|
199
|
-
return {
|
|
200
|
-
name: "olova-compression",
|
|
201
|
-
apply: "build",
|
|
202
|
-
configResolved(resolvedConfig) {
|
|
203
|
-
config = resolvedConfig;
|
|
204
|
-
},
|
|
205
|
-
async closeBundle() {
|
|
206
|
-
if (config.command !== "build" || config.build.ssr) return;
|
|
207
|
-
const outDir = config.build.outDir;
|
|
208
|
-
const stats = { gzip: 0, brotli: 0, skipped: 0 };
|
|
209
|
-
const files = await findFilesToCompress(outDir, extensions);
|
|
210
|
-
for (const file of files) {
|
|
211
|
-
const content = await fs__default.default.readFile(file);
|
|
212
|
-
if (content.length < threshold) {
|
|
213
|
-
stats.skipped++;
|
|
214
|
-
continue;
|
|
215
|
-
}
|
|
216
|
-
if (enableGzip) {
|
|
217
|
-
try {
|
|
218
|
-
const compressed = await gzip(content, { level: 9 });
|
|
219
|
-
await fs__default.default.writeFile(`${file}.gz`, compressed);
|
|
220
|
-
stats.gzip++;
|
|
221
|
-
} catch (e) {
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
if (enableBrotli) {
|
|
225
|
-
try {
|
|
226
|
-
const compressed = await brotliCompress(content, {
|
|
227
|
-
params: {
|
|
228
|
-
[zlib__default.default.constants.BROTLI_PARAM_QUALITY]: 11
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
await fs__default.default.writeFile(`${file}.br`, compressed);
|
|
232
|
-
stats.brotli++;
|
|
233
|
-
} catch (e) {
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
if (stats.gzip > 0 || stats.brotli > 0) {
|
|
238
|
-
logger_default.info(`Compressed ${stats.gzip} files (gzip), ${stats.brotli} files (brotli)`);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
function chunkAnalysisPlugin(options = {}) {
|
|
244
|
-
const {
|
|
245
|
-
chunkSizeWarning = true,
|
|
246
|
-
maxChunkSize = 250
|
|
247
|
-
} = options;
|
|
248
|
-
const chunks = [];
|
|
249
|
-
return {
|
|
250
|
-
name: "olova-chunk-analysis",
|
|
251
|
-
apply: "build",
|
|
252
|
-
generateBundle(_options, bundle) {
|
|
253
|
-
for (const [fileName, chunk] of Object.entries(bundle)) {
|
|
254
|
-
if (chunk.type === "chunk") {
|
|
255
|
-
const sizeKB = Buffer.byteLength(chunk.code, "utf8") / 1024;
|
|
256
|
-
let type = "other";
|
|
257
|
-
if (fileName.includes("vendor")) type = "vendor";
|
|
258
|
-
else if (fileName.includes("framework")) type = "framework";
|
|
259
|
-
else if (fileName.includes("common")) type = "common";
|
|
260
|
-
else if (fileName.includes("page-")) type = "route";
|
|
261
|
-
chunks.push({
|
|
262
|
-
name: fileName,
|
|
263
|
-
size: Math.round(sizeKB * 100) / 100,
|
|
264
|
-
isEntry: chunk.isEntry,
|
|
265
|
-
type
|
|
266
|
-
});
|
|
267
|
-
if (chunkSizeWarning && sizeKB > maxChunkSize) {
|
|
268
|
-
logger_default.warn(`Chunk "${fileName}" is ${sizeKB.toFixed(2)}KB (exceeds ${maxChunkSize}KB limit)`);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
},
|
|
273
|
-
closeBundle() {
|
|
274
|
-
if (chunks.length === 0) return;
|
|
275
|
-
chunks.sort((a, b) => b.size - a.size);
|
|
276
|
-
console.log("");
|
|
277
|
-
logger_default.info("Bundle Analysis:");
|
|
278
|
-
const typeGroups = {};
|
|
279
|
-
let totalSize = 0;
|
|
280
|
-
for (const chunk of chunks) {
|
|
281
|
-
typeGroups[chunk.type] = (typeGroups[chunk.type] || 0) + chunk.size;
|
|
282
|
-
totalSize += chunk.size;
|
|
283
|
-
}
|
|
284
|
-
console.log(` Vendor: ${(typeGroups.vendor || 0).toFixed(2)} KB`);
|
|
285
|
-
console.log(` Framework: ${(typeGroups.framework || 0).toFixed(2)} KB`);
|
|
286
|
-
console.log(` Common: ${(typeGroups.common || 0).toFixed(2)} KB`);
|
|
287
|
-
console.log(` Routes: ${(typeGroups.route || 0).toFixed(2)} KB`);
|
|
288
|
-
console.log(` Other: ${(typeGroups.other || 0).toFixed(2)} KB`);
|
|
289
|
-
console.log(` \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
|
|
290
|
-
console.log(` Total: ${totalSize.toFixed(2)} KB`);
|
|
291
|
-
console.log("");
|
|
292
|
-
}
|
|
293
|
-
};
|
|
294
|
-
}
|
|
295
|
-
function generatePreloadHints(chunks, entryChunk) {
|
|
296
|
-
const hints = [];
|
|
297
|
-
hints.push({
|
|
298
|
-
href: `/${entryChunk}`,
|
|
299
|
-
as: "script",
|
|
300
|
-
priority: "critical"
|
|
301
|
-
});
|
|
302
|
-
for (const chunk of chunks) {
|
|
303
|
-
if (chunk === entryChunk) continue;
|
|
304
|
-
if (chunk.includes("vendor")) {
|
|
305
|
-
hints.push({
|
|
306
|
-
href: `/${chunk}`,
|
|
307
|
-
as: "script",
|
|
308
|
-
priority: "high"
|
|
309
|
-
});
|
|
310
|
-
} else if (chunk.includes("framework")) {
|
|
311
|
-
hints.push({
|
|
312
|
-
href: `/${chunk}`,
|
|
313
|
-
as: "script",
|
|
314
|
-
priority: "high"
|
|
315
|
-
});
|
|
316
|
-
} else if (chunk.includes("common")) {
|
|
317
|
-
hints.push({
|
|
318
|
-
href: `/${chunk}`,
|
|
319
|
-
as: "script",
|
|
320
|
-
priority: "high"
|
|
321
|
-
});
|
|
322
|
-
} else if (chunk.includes("page-")) {
|
|
323
|
-
hints.push({
|
|
324
|
-
href: `/${chunk}`,
|
|
325
|
-
as: "script",
|
|
326
|
-
priority: "low"
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
return hints;
|
|
331
|
-
}
|
|
332
|
-
function generatePreloadTags(hints) {
|
|
333
|
-
return hints.map((hint) => {
|
|
334
|
-
const rel = hint.priority === "low" ? "prefetch" : "modulepreload";
|
|
335
|
-
const crossorigin = hint.crossorigin ? " crossorigin" : "";
|
|
336
|
-
return `<link rel="${rel}" href="${hint.href}"${crossorigin}>`;
|
|
337
|
-
}).join("");
|
|
338
|
-
}
|
|
339
|
-
async function findFilesToCompress(dir, extensions) {
|
|
340
|
-
const files = [];
|
|
341
|
-
try {
|
|
342
|
-
const entries = await fs__default.default.readdir(dir, { withFileTypes: true });
|
|
343
|
-
for (const entry of entries) {
|
|
344
|
-
const fullPath = path__default.default.join(dir, entry.name);
|
|
345
|
-
if (entry.isDirectory()) {
|
|
346
|
-
files.push(...await findFilesToCompress(fullPath, extensions));
|
|
347
|
-
} else if (entry.isFile()) {
|
|
348
|
-
const ext = path__default.default.extname(entry.name).slice(1);
|
|
349
|
-
if (extensions.includes(ext)) {
|
|
350
|
-
files.push(fullPath);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
} catch (e) {
|
|
355
|
-
}
|
|
356
|
-
return files;
|
|
357
|
-
}
|
|
358
|
-
async function getGzipSize(content) {
|
|
359
|
-
const buffer = typeof content === "string" ? Buffer.from(content) : content;
|
|
360
|
-
const compressed = await gzip(buffer);
|
|
361
|
-
return compressed.length;
|
|
362
|
-
}
|
|
363
|
-
function formatBytes(bytes) {
|
|
364
|
-
if (bytes < 1024) return `${bytes} B`;
|
|
365
|
-
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;
|
|
366
|
-
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
367
|
-
}
|
|
368
|
-
function olovaPerformance(options = {}) {
|
|
369
|
-
return [
|
|
370
|
-
chunkAnalysisPlugin(options),
|
|
371
|
-
compressionPlugin(options)
|
|
372
|
-
];
|
|
373
|
-
}
|
|
374
|
-
var performance_default = olovaPerformance;
|
|
375
|
-
|
|
376
|
-
exports.chunkAnalysisPlugin = chunkAnalysisPlugin;
|
|
377
|
-
exports.compressionPlugin = compressionPlugin;
|
|
378
|
-
exports.createManualChunks = createManualChunks;
|
|
379
|
-
exports.default = performance_default;
|
|
380
|
-
exports.formatBytes = formatBytes;
|
|
381
|
-
exports.generatePreloadHints = generatePreloadHints;
|
|
382
|
-
exports.generatePreloadTags = generatePreloadTags;
|
|
383
|
-
exports.getGzipSize = getGzipSize;
|
|
384
|
-
exports.olovaPerformance = olovaPerformance;
|
|
385
|
-
//# sourceMappingURL=performance.cjs.map
|
|
386
|
-
//# sourceMappingURL=performance.cjs.map
|
package/dist/performance.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/logger.ts","../src/performance.ts"],"names":["pc","path","error","promisify","zlib","fs"],"mappings":"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","file":"performance.cjs","sourcesContent":["/**\r\n * Olova Logger - Modern, styled terminal output\r\n * Inspired by Next.js console output\r\n */\r\n\r\nimport pc from 'picocolors';\r\n\r\n// Olova version from package.json\r\nconst VERSION = '0.0.14';\r\n\r\n/**\r\n * Print the startup banner (minimal, like Next.js)\r\n */\r\nexport function printBanner() {\r\n console.log('');\r\n console.log(pc.cyan(` ▲ Olova`) + pc.dim(` ${VERSION}`));\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print dev server ready message\r\n */\r\nexport function printDevReady(url: string, networkUrl?: string) {\r\n console.log('');\r\n console.log(` ${pc.green('✓')} ${pc.bold('Ready')} in ${pc.cyan('~1s')}`);\r\n console.log('');\r\n console.log(` ${pc.dim('Local:')} ${pc.cyan(url)}`);\r\n if (networkUrl) {\r\n console.log(` ${pc.dim('Network:')} ${pc.cyan(networkUrl)}`);\r\n }\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print SSG build start (minimal)\r\n */\r\nexport function printBuildStart() {\r\n console.log('');\r\n console.log(` ${pc.dim('Creating an optimized production build...')}`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print SSG build header\r\n */\r\nexport function printSSGStart(buildId: string) {\r\n console.log('');\r\n console.log(pc.bold(pc.cyan(` ✓ Compiled successfully`)));\r\n console.log('');\r\n console.log(` ${pc.dim('Build ID:')} ${pc.yellow(buildId)}`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print route table (Next.js style)\r\n */\r\nexport function printRoutes(routes: { path: string; type: 'static' | 'dynamic' }[]) {\r\n // Header\r\n console.log(` ${pc.bold('Route')}${' '.repeat(32)}${pc.bold('Type')}`);\r\n console.log(` ${pc.dim('┌')}${pc.dim('─'.repeat(43))}${pc.dim('┐')}`);\r\n\r\n for (const route of routes) {\r\n const icon = route.type === 'static' ? pc.green('○') : pc.magenta('λ');\r\n const typeLabel = route.type === 'static'\r\n ? pc.green('Static')\r\n : pc.magenta('Dynamic');\r\n const pathDisplay = route.path === '/' ? '/' : route.path;\r\n const padding = ' '.repeat(Math.max(1, 35 - pathDisplay.length));\r\n console.log(` ${pc.dim('│')} ${icon} ${pc.white(pathDisplay)}${padding}${typeLabel}`);\r\n }\r\n\r\n // Footer\r\n console.log(` ${pc.dim('└')}${pc.dim('─'.repeat(43))}${pc.dim('┘')}`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print single page generation\r\n */\r\nexport function printPageGenerated(path: string, hasFlightData = true) {\r\n const badge = hasFlightData ? pc.dim(pc.cyan(' [Flight]')) : '';\r\n console.log(` ${pc.dim('✓')} ${pc.dim('Generated')} ${pc.white(path)}${badge}`);\r\n}\r\n\r\n/**\r\n * Print page generation error\r\n */\r\nexport function printPageError(path: string, error: string) {\r\n console.log(` ${pc.red('✗')} ${pc.red('Failed')} ${path}`);\r\n console.log(` ${pc.dim(error)}`);\r\n}\r\n\r\n/**\r\n * Print SSG completion summary\r\n */\r\nexport function printSSGComplete(stats: {\r\n totalPages: number;\r\n successPages: number;\r\n failedPages: number;\r\n buildTime: number;\r\n}) {\r\n console.log('');\r\n console.log(` ${pc.dim('─'.repeat(45))}`);\r\n console.log('');\r\n\r\n if (stats.failedPages > 0) {\r\n console.log(` ${pc.yellow('⚠')} ${pc.yellow('Build completed with warnings')}`);\r\n } else {\r\n console.log(` ${pc.green('✓')} ${pc.green('Build completed successfully')}`);\r\n }\r\n\r\n console.log('');\r\n console.log(` ${pc.dim('Pages:')} ${pc.bold(stats.successPages.toString())} generated`);\r\n if (stats.failedPages > 0) {\r\n console.log(` ${pc.red(stats.failedPages.toString())} failed`);\r\n }\r\n console.log(` ${pc.dim('Time:')} ${pc.cyan(stats.buildTime + 'ms')}`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print Flight hydration info (compact)\r\n */\r\nexport function printFlightInfo() {\r\n console.log(` ${pc.cyan('○')} ${pc.dim('Flight hydration enabled')}`);\r\n console.log(` ${pc.dim('• JSON-LD structured data')}`);\r\n console.log(` ${pc.dim('• Resource hints')}`);\r\n console.log(` ${pc.dim('• $OLOVA global')}`);\r\n console.log('');\r\n}\r\n\r\n/**\r\n * Print a simple info message\r\n */\r\nexport function info(message: string) {\r\n console.log(` ${pc.cyan('○')} ${message}`);\r\n}\r\n\r\n/**\r\n * Print a success message\r\n */\r\nexport function success(message: string) {\r\n console.log(` ${pc.green('✓')} ${pc.green(message)}`);\r\n}\r\n\r\n/**\r\n * Print a warning message\r\n */\r\nexport function warn(message: string) {\r\n console.log(` ${pc.yellow('⚠')} ${pc.yellow(message)}`);\r\n}\r\n\r\n/**\r\n * Print an error message\r\n */\r\nexport function error(message: string) {\r\n console.log(` ${pc.red('✗')} ${pc.red(message)}`);\r\n}\r\n\r\n/**\r\n * Print SSR render info (dev mode)\r\n */\r\nexport function printSSRRender(path: string) {\r\n console.log(` ${pc.cyan('→')} ${pc.dim('SSR')} ${path}`);\r\n}\r\n\r\nexport default {\r\n printBanner,\r\n printDevReady,\r\n printBuildStart,\r\n printSSGStart,\r\n printRoutes,\r\n printPageGenerated,\r\n printPageError,\r\n printSSGComplete,\r\n printFlightInfo,\r\n printSSRRender,\r\n info,\r\n success,\r\n warn,\r\n error,\r\n};\r\n","/**\r\n * Olova Performance Optimizations Plugin\r\n * \r\n * Provides build-time optimizations for SSG:\r\n * - Code splitting strategies\r\n * - Asset compression (gzip/brotli)\r\n * - Chunk size analysis\r\n * - Resource prioritization\r\n */\r\n\r\nimport fs from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { promisify } from 'node:util';\r\nimport zlib from 'node:zlib';\r\nimport type { Plugin, ResolvedConfig } from 'vite';\r\nimport logger from './logger';\r\n\r\n// Promisify zlib functions\r\nconst gzip = promisify(zlib.gzip);\r\nconst brotliCompress = promisify(zlib.brotliCompress);\r\n\r\n// =============================================================================\r\n// TYPES\r\n// =============================================================================\r\n\r\nexport interface PerformanceOptions {\r\n /**\r\n * Enable gzip compression for assets\r\n * @default true\r\n */\r\n gzip?: boolean;\r\n \r\n /**\r\n * Enable brotli compression for assets\r\n * @default true\r\n */\r\n brotli?: boolean;\r\n \r\n /**\r\n * Minimum file size (in bytes) to compress\r\n * @default 1024 (1KB)\r\n */\r\n threshold?: number;\r\n \r\n /**\r\n * File extensions to compress\r\n * @default ['js', 'css', 'html', 'json', 'svg', 'xml']\r\n */\r\n extensions?: string[];\r\n \r\n /**\r\n * Enable chunk size warnings\r\n * @default true\r\n */\r\n chunkSizeWarning?: boolean;\r\n \r\n /**\r\n * Maximum chunk size before warning (in KB)\r\n * @default 250\r\n */\r\n maxChunkSize?: number;\r\n \r\n /**\r\n * Enable route-based code splitting\r\n * @default true\r\n */\r\n routeCodeSplitting?: boolean;\r\n}\r\n\r\nexport interface ChunkInfo {\r\n name: string;\r\n size: number;\r\n gzipSize?: number;\r\n brotliSize?: number;\r\n isEntry: boolean;\r\n type: 'vendor' | 'framework' | 'common' | 'route' | 'other';\r\n}\r\n\r\n// =============================================================================\r\n// MANUAL CHUNKS CONFIGURATION\r\n// =============================================================================\r\n\r\n/**\r\n * Smart manual chunks configuration for optimal code splitting\r\n * Separates vendor, framework, and route-specific code\r\n * Avoids circular dependencies by grouping related routes\r\n */\r\nexport function createManualChunks() {\r\n // Track modules to detect potential circular dependencies\r\n const seenModules = new Map<string, string>();\r\n \r\n return (id: string, { getModuleInfo }: { getModuleInfo: (id: string) => { importers: readonly string[] } | null }): string | undefined => {\r\n // React and React DOM - cached separately\r\n if (id.includes('node_modules/react-dom')) {\r\n return 'vendor-react-dom';\r\n }\r\n if (id.includes('node_modules/react')) {\r\n return 'vendor-react';\r\n }\r\n \r\n // Olova Router - framework code\r\n if (id.includes('olova-router') || id.includes('olovastart/dist/router')) {\r\n return 'framework-router';\r\n }\r\n \r\n // Other node_modules - vendor bundle\r\n if (id.includes('node_modules')) {\r\n // Extract package name for better caching\r\n const match = id.match(/node_modules[\\\\/]([^/\\\\]+)/);\r\n if (match) {\r\n const pkg = match[1];\r\n // Group small packages together\r\n if (['scheduler', 'object-assign', 'prop-types'].includes(pkg)) {\r\n return 'vendor-react';\r\n }\r\n // Keep large packages separate\r\n if (['lodash', 'moment', 'axios', 'date-fns'].includes(pkg)) {\r\n return `vendor-${pkg}`;\r\n }\r\n }\r\n return 'vendor';\r\n }\r\n \r\n // Shared components - group together to avoid circular deps\r\n if (id.includes('/components/')) {\r\n return 'common-components';\r\n }\r\n \r\n // Shared utilities\r\n if (id.includes('/utils/') || id.includes('/lib/') || id.includes('/helpers/')) {\r\n return 'common-utils';\r\n }\r\n \r\n // CSS - let Vite handle\r\n if (id.endsWith('.css') || id.endsWith('.scss')) {\r\n return undefined;\r\n }\r\n \r\n // Auth pages + search - group together to avoid circular deps\r\n // (login <-> register <-> search often share components/navigation)\r\n if (id.includes('/(auth)/') || id.includes('\\\\(auth)\\\\') || \r\n id.includes('/search/') || id.includes('\\\\search\\\\')) {\r\n return 'page-auth';\r\n }\r\n \r\n // Route components - be conservative, only split truly isolated routes\r\n // Don't split if the module has cross-route imports\r\n if (id.includes('/src/') && (id.endsWith('/index.tsx') || id.endsWith('/index.mdx'))) {\r\n // Check if this module would cause circular dependencies\r\n const moduleInfo = getModuleInfo(id);\r\n if (moduleInfo) {\r\n // If imported by another route, group with common\r\n for (const importer of moduleInfo.importers) {\r\n if (importer.includes('/src/') && importer.includes('/index.') && !importer.includes(id)) {\r\n return 'common-routes';\r\n }\r\n }\r\n }\r\n \r\n const routeMatch = id.match(/[\\\\/]src[\\\\/](.+?)[\\\\/]index\\.(tsx|mdx)$/);\r\n if (routeMatch) {\r\n const routePath = routeMatch[1]\r\n .replace(/\\([^)]+\\)[\\\\/]/g, '') // Remove route groups\r\n .replace(/\\[.*?\\]/g, 'dynamic') // Replace dynamic segments\r\n .replace(/[\\\\/]/g, '-');\r\n \r\n // Skip if we've seen a chunk with same base that would cause circular\r\n const baseRoute = routePath.split('-')[0];\r\n if (seenModules.has(baseRoute)) {\r\n const existingChunk = seenModules.get(baseRoute)!;\r\n // If related routes, group them\r\n if (existingChunk.startsWith('page-')) {\r\n return existingChunk;\r\n }\r\n }\r\n \r\n const chunkName = `page-${routePath}`;\r\n seenModules.set(baseRoute, chunkName);\r\n return chunkName;\r\n }\r\n }\r\n \r\n return undefined;\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// COMPRESSION PLUGIN\r\n// =============================================================================\r\n\r\n/**\r\n * Compression plugin for generating gzip and brotli compressed assets\r\n */\r\nexport function compressionPlugin(options: PerformanceOptions = {}): Plugin {\r\n const {\r\n gzip: enableGzip = true,\r\n brotli: enableBrotli = true,\r\n threshold = 1024,\r\n extensions = ['js', 'css', 'html', 'json', 'svg', 'xml'],\r\n } = options;\r\n \r\n let config: ResolvedConfig;\r\n \r\n return {\r\n name: 'olova-compression',\r\n apply: 'build',\r\n \r\n configResolved(resolvedConfig) {\r\n config = resolvedConfig;\r\n },\r\n \r\n async closeBundle() {\r\n if (config.command !== 'build' || config.build.ssr) return;\r\n \r\n const outDir = config.build.outDir;\r\n const stats = { gzip: 0, brotli: 0, skipped: 0 };\r\n \r\n // Find all files to compress\r\n const files = await findFilesToCompress(outDir, extensions);\r\n \r\n for (const file of files) {\r\n const content = await fs.readFile(file);\r\n \r\n // Skip small files\r\n if (content.length < threshold) {\r\n stats.skipped++;\r\n continue;\r\n }\r\n \r\n // Gzip compression\r\n if (enableGzip) {\r\n try {\r\n const compressed = await gzip(content, { level: 9 });\r\n await fs.writeFile(`${file}.gz`, compressed);\r\n stats.gzip++;\r\n } catch (e) {\r\n // Silently skip compression errors\r\n }\r\n }\r\n \r\n // Brotli compression\r\n if (enableBrotli) {\r\n try {\r\n const compressed = await brotliCompress(content, {\r\n params: {\r\n [zlib.constants.BROTLI_PARAM_QUALITY]: 11,\r\n },\r\n });\r\n await fs.writeFile(`${file}.br`, compressed);\r\n stats.brotli++;\r\n } catch (e) {\r\n // Silently skip compression errors\r\n }\r\n }\r\n }\r\n \r\n // Log compression stats\r\n if (stats.gzip > 0 || stats.brotli > 0) {\r\n logger.info(`Compressed ${stats.gzip} files (gzip), ${stats.brotli} files (brotli)`);\r\n }\r\n },\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// CHUNK ANALYSIS PLUGIN\r\n// =============================================================================\r\n\r\n/**\r\n * Chunk analysis plugin for monitoring bundle sizes\r\n */\r\nexport function chunkAnalysisPlugin(options: PerformanceOptions = {}): Plugin {\r\n const {\r\n chunkSizeWarning = true,\r\n maxChunkSize = 250,\r\n } = options;\r\n \r\n const chunks: ChunkInfo[] = [];\r\n \r\n return {\r\n name: 'olova-chunk-analysis',\r\n apply: 'build',\r\n \r\n generateBundle(_options, bundle) {\r\n for (const [fileName, chunk] of Object.entries(bundle)) {\r\n if (chunk.type === 'chunk') {\r\n const sizeKB = Buffer.byteLength(chunk.code, 'utf8') / 1024;\r\n \r\n // Determine chunk type\r\n let type: ChunkInfo['type'] = 'other';\r\n if (fileName.includes('vendor')) type = 'vendor';\r\n else if (fileName.includes('framework')) type = 'framework';\r\n else if (fileName.includes('common')) type = 'common';\r\n else if (fileName.includes('page-')) type = 'route';\r\n \r\n chunks.push({\r\n name: fileName,\r\n size: Math.round(sizeKB * 100) / 100,\r\n isEntry: chunk.isEntry,\r\n type,\r\n });\r\n \r\n // Warn about large chunks\r\n if (chunkSizeWarning && sizeKB > maxChunkSize) {\r\n logger.warn(`Chunk \"${fileName}\" is ${sizeKB.toFixed(2)}KB (exceeds ${maxChunkSize}KB limit)`);\r\n }\r\n }\r\n }\r\n },\r\n \r\n closeBundle() {\r\n if (chunks.length === 0) return;\r\n \r\n // Sort by size descending\r\n chunks.sort((a, b) => b.size - a.size);\r\n \r\n // Print chunk summary\r\n console.log('');\r\n logger.info('Bundle Analysis:');\r\n \r\n const typeGroups: Record<string, number> = {};\r\n let totalSize = 0;\r\n \r\n for (const chunk of chunks) {\r\n typeGroups[chunk.type] = (typeGroups[chunk.type] || 0) + chunk.size;\r\n totalSize += chunk.size;\r\n }\r\n \r\n console.log(` Vendor: ${(typeGroups.vendor || 0).toFixed(2)} KB`);\r\n console.log(` Framework: ${(typeGroups.framework || 0).toFixed(2)} KB`);\r\n console.log(` Common: ${(typeGroups.common || 0).toFixed(2)} KB`);\r\n console.log(` Routes: ${(typeGroups.route || 0).toFixed(2)} KB`);\r\n console.log(` Other: ${(typeGroups.other || 0).toFixed(2)} KB`);\r\n console.log(` ─────────────────────`);\r\n console.log(` Total: ${totalSize.toFixed(2)} KB`);\r\n console.log('');\r\n },\r\n };\r\n}\r\n\r\n// =============================================================================\r\n// PRELOAD HINTS GENERATOR\r\n// =============================================================================\r\n\r\nexport interface PreloadHint {\r\n href: string;\r\n as: 'script' | 'style' | 'font' | 'image';\r\n priority: 'critical' | 'high' | 'low';\r\n crossorigin?: boolean;\r\n}\r\n\r\n/**\r\n * Generate optimized preload hints for chunks\r\n */\r\nexport function generatePreloadHints(\r\n chunks: string[],\r\n entryChunk: string\r\n): PreloadHint[] {\r\n const hints: PreloadHint[] = [];\r\n \r\n // Entry chunk - critical priority\r\n hints.push({\r\n href: `/${entryChunk}`,\r\n as: 'script',\r\n priority: 'critical',\r\n });\r\n \r\n for (const chunk of chunks) {\r\n if (chunk === entryChunk) continue;\r\n \r\n // Vendor chunks - high priority (needed for hydration)\r\n if (chunk.includes('vendor')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'high',\r\n });\r\n }\r\n // Framework chunks - high priority\r\n else if (chunk.includes('framework')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'high',\r\n });\r\n }\r\n // Common chunks - high priority\r\n else if (chunk.includes('common')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'high',\r\n });\r\n }\r\n // Route chunks - low priority (prefetch for navigation)\r\n else if (chunk.includes('page-')) {\r\n hints.push({\r\n href: `/${chunk}`,\r\n as: 'script',\r\n priority: 'low',\r\n });\r\n }\r\n }\r\n \r\n return hints;\r\n}\r\n\r\n/**\r\n * Generate HTML preload/prefetch tags from hints\r\n */\r\nexport function generatePreloadTags(hints: PreloadHint[]): string {\r\n return hints\r\n .map((hint) => {\r\n const rel = hint.priority === 'low' ? 'prefetch' : 'modulepreload';\r\n const crossorigin = hint.crossorigin ? ' crossorigin' : '';\r\n return `<link rel=\"${rel}\" href=\"${hint.href}\"${crossorigin}>`;\r\n })\r\n .join('');\r\n}\r\n\r\n// =============================================================================\r\n// UTILITY FUNCTIONS\r\n// =============================================================================\r\n\r\n/**\r\n * Recursively find files to compress\r\n */\r\nasync function findFilesToCompress(\r\n dir: string,\r\n extensions: string[]\r\n): Promise<string[]> {\r\n const files: string[] = [];\r\n \r\n try {\r\n const entries = await fs.readdir(dir, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(dir, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n files.push(...await findFilesToCompress(fullPath, extensions));\r\n } else if (entry.isFile()) {\r\n const ext = path.extname(entry.name).slice(1);\r\n if (extensions.includes(ext)) {\r\n files.push(fullPath);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n // Directory doesn't exist or can't be read\r\n }\r\n \r\n return files;\r\n}\r\n\r\n/**\r\n * Calculate gzip size of content\r\n */\r\nexport async function getGzipSize(content: string | Buffer): Promise<number> {\r\n const buffer = typeof content === 'string' ? Buffer.from(content) : content;\r\n const compressed = await gzip(buffer);\r\n return compressed.length;\r\n}\r\n\r\n/**\r\n * Format bytes to human readable size\r\n */\r\nexport function formatBytes(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(2)} KB`;\r\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\r\n}\r\n\r\n// =============================================================================\r\n// COMBINED PERFORMANCE PLUGIN\r\n// =============================================================================\r\n\r\n/**\r\n * Main performance plugin that combines all optimizations\r\n */\r\nexport function olovaPerformance(options: PerformanceOptions = {}): Plugin[] {\r\n return [\r\n chunkAnalysisPlugin(options),\r\n compressionPlugin(options),\r\n ];\r\n}\r\n\r\nexport default olovaPerformance;\r\n"]}
|
package/dist/performance.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export { chunkAnalysisPlugin, compressionPlugin, createManualChunks, performance_default as default, formatBytes, generatePreloadHints, generatePreloadTags, getGzipSize, olovaPerformance } from './chunk-D7SIC5TC.js';
|
|
2
|
-
//# sourceMappingURL=performance.js.map
|
|
3
|
-
//# sourceMappingURL=performance.js.map
|
package/dist/performance.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"performance.js"}
|