olova-router 1.0.19 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +402 -53
- package/dist/breadcrumbs.d.ts +272 -0
- package/dist/breadcrumbs.js +36 -0
- package/dist/breadcrumbs.js.map +1 -0
- package/dist/guards.d.ts +4 -0
- package/dist/guards.js +66 -0
- package/dist/guards.js.map +1 -0
- package/dist/history.d.ts +17 -0
- package/dist/history.js +51 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +4 -117
- package/dist/index.js +912 -5
- package/dist/index.js.map +1 -1
- package/dist/lazy.d.ts +9 -0
- package/dist/lazy.js +127 -0
- package/dist/lazy.js.map +1 -0
- package/dist/middleware.d.ts +4 -0
- package/dist/middleware.js +54 -0
- package/dist/middleware.js.map +1 -0
- package/dist/vite.js +78 -50
- package/dist/vite.js.map +1 -1
- package/package.json +84 -2
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { M as Middleware, f as MiddlewareChain, g as createAnalyticsMiddleware, h as createAuthMiddleware, i as createMiddlewareChain, j as createRoleMiddleware, k as createScrollMiddleware } from './breadcrumbs.js';
|
|
2
|
+
import 'olova/runtime';
|
|
3
|
+
import './history.js';
|
|
4
|
+
import './lazy.js';
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// src/middleware.ts
|
|
2
|
+
function createMiddlewareChain() {
|
|
3
|
+
const middlewares = [];
|
|
4
|
+
return {
|
|
5
|
+
use(middleware) {
|
|
6
|
+
middlewares.push(middleware);
|
|
7
|
+
return this;
|
|
8
|
+
},
|
|
9
|
+
async execute(context) {
|
|
10
|
+
for (const middleware of middlewares) {
|
|
11
|
+
const result = await middleware(context);
|
|
12
|
+
if (result !== void 0 && result !== true) {
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function createAuthMiddleware(isAuthenticated, redirectTo = "/login") {
|
|
21
|
+
return (context) => {
|
|
22
|
+
if (!isAuthenticated()) {
|
|
23
|
+
return redirectTo;
|
|
24
|
+
}
|
|
25
|
+
return true;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function createRoleMiddleware(userRole, allowedRoles, redirectTo = "/unauthorized") {
|
|
29
|
+
return (context) => {
|
|
30
|
+
const role = userRole();
|
|
31
|
+
if (!role || !allowedRoles.includes(role)) {
|
|
32
|
+
return redirectTo;
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function createAnalyticsMiddleware(trackPageView) {
|
|
38
|
+
return (context) => {
|
|
39
|
+
trackPageView(context.to.path);
|
|
40
|
+
return true;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function createScrollMiddleware(scrollToTop = true) {
|
|
44
|
+
return () => {
|
|
45
|
+
if (scrollToTop && typeof window !== "undefined") {
|
|
46
|
+
window.scrollTo({ top: 0, left: 0, behavior: "auto" });
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export { createAnalyticsMiddleware, createAuthMiddleware, createMiddlewareChain, createRoleMiddleware, createScrollMiddleware };
|
|
53
|
+
//# sourceMappingURL=middleware.js.map
|
|
54
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/middleware.ts"],"names":[],"mappings":";AASO,SAAS,qBAAA,GAAyC;AACvD,EAAA,MAAM,cAA4B,EAAC;AAEnC,EAAA,OAAO;AAAA,IACL,IAAI,UAAA,EAAwB;AAC1B,MAAA,WAAA,CAAY,KAAK,UAAU,CAAA;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,MAAM,QAAQ,OAAA,EAAuD;AACnE,MAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,QAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAO,CAAA;AACvC,QAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,IAAA,EAAM;AAC3C,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,GACF;AACF;AAEO,SAAS,oBAAA,CAAqB,eAAA,EAAgC,UAAA,GAAa,QAAA,EAAsB;AACtG,EAAA,OAAO,CAAC,OAAA,KAAY;AAClB,IAAA,IAAI,CAAC,iBAAgB,EAAG;AACtB,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACF;AAEO,SAAS,oBAAA,CACd,QAAA,EACA,YAAA,EACA,UAAA,GAAa,eAAA,EACD;AACZ,EAAA,OAAO,CAAC,OAAA,KAAY;AAClB,IAAA,MAAM,OAAO,QAAA,EAAS;AACtB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,YAAA,CAAa,QAAA,CAAS,IAAI,CAAA,EAAG;AACzC,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACF;AAEO,SAAS,0BAA0B,aAAA,EAAmD;AAC3F,EAAA,OAAO,CAAC,OAAA,KAAY;AAClB,IAAA,aAAA,CAAc,OAAA,CAAQ,GAAG,IAAI,CAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACF;AAEO,SAAS,sBAAA,CAAuB,cAAc,IAAA,EAAkB;AACrE,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,WAAA,IAAe,OAAO,MAAA,KAAW,WAAA,EAAa;AAChD,MAAA,MAAA,CAAO,QAAA,CAAS,EAAE,GAAA,EAAK,CAAA,EAAG,MAAM,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACF","file":"middleware.js","sourcesContent":["import type { RouteGuardContext, RouteGuardResult } from \"./index\";\r\n\r\nexport type Middleware = (context: RouteGuardContext) => RouteGuardResult | Promise<RouteGuardResult>;\r\n\r\nexport type MiddlewareChain = {\r\n use: (middleware: Middleware) => MiddlewareChain;\r\n execute: (context: RouteGuardContext) => Promise<RouteGuardResult>;\r\n};\r\n\r\nexport function createMiddlewareChain(): MiddlewareChain {\r\n const middlewares: Middleware[] = [];\r\n\r\n return {\r\n use(middleware: Middleware) {\r\n middlewares.push(middleware);\r\n return this;\r\n },\r\n async execute(context: RouteGuardContext): Promise<RouteGuardResult> {\r\n for (const middleware of middlewares) {\r\n const result = await middleware(context);\r\n if (result !== undefined && result !== true) {\r\n return result;\r\n }\r\n }\r\n return true;\r\n },\r\n };\r\n}\r\n\r\nexport function createAuthMiddleware(isAuthenticated: () => boolean, redirectTo = \"/login\"): Middleware {\r\n return (context) => {\r\n if (!isAuthenticated()) {\r\n return redirectTo;\r\n }\r\n return true;\r\n };\r\n}\r\n\r\nexport function createRoleMiddleware(\r\n userRole: () => string | null,\r\n allowedRoles: string[],\r\n redirectTo = \"/unauthorized\",\r\n): Middleware {\r\n return (context) => {\r\n const role = userRole();\r\n if (!role || !allowedRoles.includes(role)) {\r\n return redirectTo;\r\n }\r\n return true;\r\n };\r\n}\r\n\r\nexport function createAnalyticsMiddleware(trackPageView: (path: string) => void): Middleware {\r\n return (context) => {\r\n trackPageView(context.to.path);\r\n return true;\r\n };\r\n}\r\n\r\nexport function createScrollMiddleware(scrollToTop = true): Middleware {\r\n return () => {\r\n if (scrollToTop && typeof window !== \"undefined\") {\r\n window.scrollTo({ top: 0, left: 0, behavior: \"auto\" });\r\n }\r\n return true;\r\n };\r\n}\r\n"]}
|
package/dist/vite.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { statSync,
|
|
1
|
+
import { statSync, readdirSync } from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { normalizePath } from 'vite';
|
|
4
4
|
|
|
@@ -9,6 +9,8 @@ var virtualRoutesId = "virtual:router-demo-routes";
|
|
|
9
9
|
var resolvedVirtualRoutesId = "\0virtual:router-demo-routes";
|
|
10
10
|
var virtualAppEntryId = "virtual:olova-app-entry";
|
|
11
11
|
var resolvedVirtualAppEntryId = "\0virtual:olova-app-entry";
|
|
12
|
+
var virtualBootstrapId = "virtual:olova-bootstrap";
|
|
13
|
+
var resolvedVirtualBootstrapId = "\0virtual:olova-bootstrap";
|
|
12
14
|
var olovaPluginName = "vite-plugin-olova";
|
|
13
15
|
var generatedDirName = ".olova";
|
|
14
16
|
var generatedHtmlName = "index.html";
|
|
@@ -81,41 +83,34 @@ function createAppRouteName(relativeFile) {
|
|
|
81
83
|
const nameParts = [...dirSegments, fileName === "app" ? "home" : fileName].filter(Boolean).map((segment) => segment.replace(/^\[\.\.\.(.+)\]$/u, "$1").replace(/^\[(.+)\]$/u, "$1"));
|
|
82
84
|
return nameParts.join(".");
|
|
83
85
|
}
|
|
84
|
-
function
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
'import { createApp } from "olova/runtime";',
|
|
113
|
-
`import App from ${JSON.stringify(virtualAppEntryId)};`,
|
|
114
|
-
"",
|
|
115
|
-
'createApp(App).mount("#app");',
|
|
116
|
-
""
|
|
117
|
-
].join("\n")
|
|
118
|
-
);
|
|
86
|
+
function joinBase(base, target) {
|
|
87
|
+
if (!base || base === "/") {
|
|
88
|
+
return `/${target.replace(/^\/+/u, "")}`;
|
|
89
|
+
}
|
|
90
|
+
if (base === "./") {
|
|
91
|
+
return `./${target.replace(/^\/+/u, "")}`;
|
|
92
|
+
}
|
|
93
|
+
const normalizedBase = base.endsWith("/") ? base : `${base}/`;
|
|
94
|
+
return `${normalizedBase}${target.replace(/^\/+/u, "")}`;
|
|
95
|
+
}
|
|
96
|
+
function renderAppHtml(options) {
|
|
97
|
+
const cssTags = (options.cssHrefs ?? []).map((href) => ` <link rel="stylesheet" href="${href}">`).join("\n");
|
|
98
|
+
return [
|
|
99
|
+
"<!doctype html>",
|
|
100
|
+
'<html lang="en">',
|
|
101
|
+
" <head>",
|
|
102
|
+
' <meta charset="UTF-8" />',
|
|
103
|
+
' <meta name="viewport" content="width=device-width, initial-scale=1.0" />',
|
|
104
|
+
` <title>${options.title}</title>`,
|
|
105
|
+
cssTags,
|
|
106
|
+
" </head>",
|
|
107
|
+
" <body>",
|
|
108
|
+
' <div id="app"></div>',
|
|
109
|
+
` <script type="module" src="${options.scriptSrc}"></script>`,
|
|
110
|
+
" </body>",
|
|
111
|
+
"</html>",
|
|
112
|
+
""
|
|
113
|
+
].filter(Boolean).join("\n");
|
|
119
114
|
}
|
|
120
115
|
function patchOlovaTransform(plugins) {
|
|
121
116
|
if (!plugins) {
|
|
@@ -226,14 +221,18 @@ export default routes
|
|
|
226
221
|
}
|
|
227
222
|
function createOlovaAppRouterPlugin() {
|
|
228
223
|
let root = "";
|
|
224
|
+
let base = "/";
|
|
225
|
+
let isBuild = false;
|
|
229
226
|
return {
|
|
230
227
|
name: "olova-app-router",
|
|
231
|
-
config() {
|
|
228
|
+
config(_config, env) {
|
|
229
|
+
isBuild = env.command === "build";
|
|
232
230
|
return {
|
|
233
231
|
build: {
|
|
234
232
|
rollupOptions: {
|
|
235
233
|
input: {
|
|
236
|
-
|
|
234
|
+
// Build without a physical `index.html` in the project root.
|
|
235
|
+
main: virtualBootstrapId
|
|
237
236
|
}
|
|
238
237
|
}
|
|
239
238
|
},
|
|
@@ -247,12 +246,19 @@ function createOlovaAppRouterPlugin() {
|
|
|
247
246
|
},
|
|
248
247
|
configResolved(config) {
|
|
249
248
|
root = config.root;
|
|
250
|
-
|
|
249
|
+
base = config.base ?? "/";
|
|
250
|
+
isBuild = config.command === "build";
|
|
251
|
+
},
|
|
252
|
+
buildStart() {
|
|
253
|
+
if (!isBuild) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
this.emitFile({ type: "chunk", id: virtualBootstrapId, name: "main" });
|
|
251
257
|
},
|
|
252
258
|
configureServer(server) {
|
|
253
259
|
server.middlewares.use(async (req, res, next) => {
|
|
254
260
|
const requestUrl = req.url?.split("?", 1)[0] ?? "/";
|
|
255
|
-
const isAppRequest = (req.method === "GET" || req.method === "HEAD" || !req.method) && !requestUrl.startsWith("/@") && !requestUrl.startsWith(
|
|
261
|
+
const isAppRequest = (req.method === "GET" || req.method === "HEAD" || !req.method) && !requestUrl.startsWith("/@") && !requestUrl.startsWith("/src/") && !requestUrl.startsWith("/node_modules/") && path.extname(requestUrl) === "";
|
|
256
262
|
if (!isAppRequest) {
|
|
257
263
|
next();
|
|
258
264
|
return;
|
|
@@ -267,7 +273,7 @@ function createOlovaAppRouterPlugin() {
|
|
|
267
273
|
" </head>",
|
|
268
274
|
" <body>",
|
|
269
275
|
' <div id="app"></div>',
|
|
270
|
-
` <script type="module" src="
|
|
276
|
+
` <script type="module" src="${joinBase(base, `@id/${virtualBootstrapId}`)}"></script>`,
|
|
271
277
|
" </body>",
|
|
272
278
|
"</html>",
|
|
273
279
|
""
|
|
@@ -277,12 +283,27 @@ function createOlovaAppRouterPlugin() {
|
|
|
277
283
|
});
|
|
278
284
|
},
|
|
279
285
|
resolveId(id) {
|
|
286
|
+
if (id === virtualBootstrapId) {
|
|
287
|
+
return resolvedVirtualBootstrapId;
|
|
288
|
+
}
|
|
280
289
|
if (id === virtualAppEntryId) {
|
|
281
290
|
return resolvedVirtualAppEntryId;
|
|
282
291
|
}
|
|
283
292
|
return null;
|
|
284
293
|
},
|
|
285
294
|
load(id) {
|
|
295
|
+
if (id === resolvedVirtualBootstrapId) {
|
|
296
|
+
const relativeStylePath = normalizePath(path.relative(root, path.join(root, "src", "style.css")));
|
|
297
|
+
const styleImport = `/${relativeStylePath.replace(/^\/+/u, "")}`;
|
|
298
|
+
return [
|
|
299
|
+
`import ${JSON.stringify(styleImport)};`,
|
|
300
|
+
'import { createApp } from "olova/runtime";',
|
|
301
|
+
`import App from ${JSON.stringify(virtualAppEntryId)};`,
|
|
302
|
+
"",
|
|
303
|
+
'createApp(App).mount("#app");',
|
|
304
|
+
""
|
|
305
|
+
].join("\n");
|
|
306
|
+
}
|
|
286
307
|
if (id !== resolvedVirtualAppEntryId) {
|
|
287
308
|
return null;
|
|
288
309
|
}
|
|
@@ -356,17 +377,24 @@ export default AppEntry;
|
|
|
356
377
|
context.server.reloadModule(module);
|
|
357
378
|
}
|
|
358
379
|
},
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
const generatedDistDir = path.join(distDir, generatedDirName);
|
|
362
|
-
const generatedDistHtmlPath = path.join(generatedDistDir, generatedHtmlName);
|
|
363
|
-
const distIndexPath = path.join(distDir, generatedHtmlName);
|
|
364
|
-
if (!statSync(generatedDistHtmlPath, { throwIfNoEntry: false })?.isFile?.()) {
|
|
380
|
+
generateBundle(_outputOptions, bundle) {
|
|
381
|
+
if (!isBuild) {
|
|
365
382
|
return;
|
|
366
383
|
}
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
384
|
+
const chunks = Object.values(bundle).filter((output) => output.type === "chunk");
|
|
385
|
+
const entryChunk = chunks.find(
|
|
386
|
+
(chunk) => chunk.isEntry && typeof chunk.facadeModuleId === "string" && chunk.facadeModuleId.includes(virtualBootstrapId)
|
|
387
|
+
);
|
|
388
|
+
if (!entryChunk) {
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
const cssFiles = Object.values(bundle).filter((output) => output.type === "asset" && typeof output.fileName === "string").map((asset) => asset.fileName).filter((fileName) => fileName.endsWith(".css")).map((fileName) => joinBase(base, fileName));
|
|
392
|
+
const html = renderAppHtml({
|
|
393
|
+
title: "Olova App",
|
|
394
|
+
scriptSrc: joinBase(base, entryChunk.fileName),
|
|
395
|
+
cssHrefs: cssFiles
|
|
396
|
+
});
|
|
397
|
+
this.emitFile({ type: "asset", fileName: "index.html", source: html });
|
|
370
398
|
}
|
|
371
399
|
};
|
|
372
400
|
}
|
package/dist/vite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vite.ts"],"names":[],"mappings":"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","file":"vite.js","sourcesContent":["import { mkdirSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin, PluginOption } from \"vite\";\nimport { normalizePath } from \"vite\";\n\nconst playgroundEntry = normalizePath(\"/playground/main.ts\");\nconst routerPackageEntry = normalizePath(\"/packages/olova-router/\");\nconst virtualRoutesId = \"virtual:router-demo-routes\";\nconst resolvedVirtualRoutesId = \"\\0virtual:router-demo-routes\";\nconst virtualAppEntryId = \"virtual:olova-app-entry\";\nconst resolvedVirtualAppEntryId = \"\\0virtual:olova-app-entry\";\nconst olovaPluginName = \"vite-plugin-olova\";\n\nexport const generatedDirName = \".olova\";\nexport const generatedHtmlName = \"index.html\";\nexport const generatedMainName = \"main.ts\";\n\nfunction toRouteSegment(segment: string): string {\n if (segment === \"index\") {\n return \"\";\n }\n\n if (segment === \"+not-found\") {\n return \"*\";\n }\n\n if (segment.startsWith(\"[...\") && segment.endsWith(\"]\")) {\n return `:${segment.slice(4, -1)}*`;\n }\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n return `:${segment.slice(1, -1)}`;\n }\n\n return segment;\n}\n\nfunction collectOlovaFiles(dir: string): string[] {\n const entries = readdirSync(dir);\n const files: string[] = [];\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry);\n const stats = statSync(fullPath);\n\n if (stats.isDirectory()) {\n files.push(...collectOlovaFiles(fullPath));\n continue;\n }\n\n if (entry.endsWith(\".olova\")) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\nfunction createRoutePath(relativeFile: string): string {\n const withoutExt = relativeFile.replace(/\\.olova$/u, \"\");\n const segments = normalizePath(withoutExt).split(\"/\").map(toRouteSegment);\n\n if (segments.includes(\"*\")) {\n return \"*\";\n }\n\n const filtered = segments.filter(Boolean);\n return filtered.length === 0 ? \"/\" : `/${filtered.join(\"/\")}`;\n}\n\nfunction createRouteName(relativeFile: string): string {\n const withoutExt = relativeFile.replace(/\\.olova$/u, \"\");\n const segments = normalizePath(withoutExt)\n .split(\"/\")\n .filter((segment) => segment !== \"index\" && segment !== \"+not-found\")\n .map((segment) => segment.replace(/^\\[\\.\\.\\.(.+)\\]$/u, \"$1\").replace(/^\\[(.+)\\]$/u, \"$1\"));\n\n return segments.length === 0 ? \"home\" : segments.join(\".\");\n}\n\nfunction createAppRoutePath(relativeFile: string): string {\n const normalized = normalizePath(relativeFile).replace(/\\.olova$/u, \"\");\n const rawSegments = normalized.split(\"/\");\n const fileName = rawSegments[rawSegments.length - 1];\n const dirSegments = rawSegments.slice(0, -1);\n\n if (fileName === \"+not-found\") {\n return \"*\";\n }\n\n const fileSegment = fileName === \"app\" ? \"\" : toRouteSegment(fileName);\n const routeSegments = [...dirSegments.map(toRouteSegment), fileSegment].filter(Boolean);\n\n return routeSegments.length === 0 ? \"/\" : `/${routeSegments.join(\"/\")}`;\n}\n\nfunction createAppRouteName(relativeFile: string): string {\n const normalized = normalizePath(relativeFile).replace(/\\.olova$/u, \"\");\n const rawSegments = normalized.split(\"/\");\n const fileName = rawSegments[rawSegments.length - 1];\n const dirSegments = rawSegments.slice(0, -1);\n\n if (fileName === \"+not-found\") {\n return \"not-found\";\n }\n\n const nameParts = [...dirSegments, fileName === \"app\" ? \"home\" : fileName]\n .filter(Boolean)\n .map((segment) => segment.replace(/^\\[\\.\\.\\.(.+)\\]$/u, \"$1\").replace(/^\\[(.+)\\]$/u, \"$1\"));\n\n return nameParts.join(\".\");\n}\n\nfunction writeGeneratedBootstrap(root: string): void {\n const generatedDir = path.join(root, generatedDirName);\n const generatedHtmlPath = path.join(generatedDir, generatedHtmlName);\n const generatedMainPath = path.join(generatedDir, generatedMainName);\n const relativeStyleImport = normalizePath(path.relative(generatedDir, path.join(root, \"src\", \"style.css\")));\n\n mkdirSync(generatedDir, { recursive: true });\n writeFileSync(\n generatedHtmlPath,\n [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \" <head>\",\n ' <meta charset=\"UTF-8\" />',\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />',\n \" <title>Olova App</title>\",\n \" </head>\",\n \" <body>\",\n ' <div id=\"app\"></div>',\n ` <script type=\"module\" src=\"./${generatedMainName}\"></script>`,\n \" </body>\",\n \"</html>\",\n \"\",\n ].join(\"\\n\"),\n );\n writeFileSync(\n generatedMainPath,\n [\n `import ${JSON.stringify(relativeStyleImport)};`,\n 'import { createApp } from \"olova/runtime\";',\n `import App from ${JSON.stringify(virtualAppEntryId)};`,\n \"\",\n 'createApp(App).mount(\"#app\");',\n \"\",\n ].join(\"\\n\"),\n );\n}\n\nfunction patchOlovaTransform(plugins: unknown[] | undefined): void {\n if (!plugins) {\n return;\n }\n\n const queue = [...plugins];\n\n while (queue.length > 0) {\n const candidate = queue.shift();\n\n if (Array.isArray(candidate)) {\n queue.push(...candidate);\n continue;\n }\n\n if (!candidate || typeof candidate !== \"object\") {\n continue;\n }\n\n const plugin = candidate as Plugin & { __olovaRouterPatched?: boolean };\n if (plugin.name !== olovaPluginName) {\n continue;\n }\n\n const transformHook = plugin.transform;\n const originalTransform =\n typeof transformHook === \"function\"\n ? transformHook\n : typeof transformHook?.handler === \"function\"\n ? transformHook.handler\n : null;\n\n if (!originalTransform || plugin.__olovaRouterPatched) {\n return;\n }\n\n plugin.transform = function transform(code, id, ...rest): any {\n const normalizedId = normalizePath(id.split(\"?\", 1)[0]);\n\n if (\n normalizedId.endsWith(playgroundEntry) ||\n (normalizedId.includes(routerPackageEntry) &&\n (normalizedId.endsWith(\".ts\") || normalizedId.endsWith(\".js\")))\n ) {\n return null;\n }\n\n return (originalTransform as typeof transform).call(this, code, id, ...rest);\n };\n\n plugin.__olovaRouterPatched = true;\n return;\n }\n}\n\nfunction createOlovaCompatPlugin(): Plugin {\n return {\n name: \"olova-router-compat\",\n config(config) {\n patchOlovaTransform((config.plugins ?? []) as unknown[]);\n },\n configResolved(config) {\n patchOlovaTransform(config.plugins as unknown[]);\n },\n };\n}\n\nfunction createRouterDemoRoutesPlugin(): Plugin {\n let root = \"\";\n\n return {\n name: \"router-demo-file-routes\",\n configResolved(config) {\n root = config.root;\n },\n resolveId(id) {\n if (id === virtualRoutesId) {\n return resolvedVirtualRoutesId;\n }\n\n return null;\n },\n load(id) {\n if (id !== resolvedVirtualRoutesId) {\n return null;\n }\n\n const routesDir = path.join(root, \"src\", \"router-demo\", \"routes\");\n const files = collectOlovaFiles(routesDir)\n .map((file) => {\n const relative = normalizePath(path.relative(routesDir, file));\n return {\n file,\n routePath: createRoutePath(relative),\n routeName: createRouteName(relative),\n };\n })\n .sort((left, right) => {\n if (left.routePath === \"*\") {\n return 1;\n }\n\n if (right.routePath === \"*\") {\n return -1;\n }\n\n return left.routePath.localeCompare(right.routePath);\n });\n\n const imports = files\n .map((route, index) => `import Route${index} from ${JSON.stringify(normalizePath(route.file))}`)\n .join(\"\\n\");\n\n const definitions = files\n .map((route, index) => {\n if (route.routePath === \"*\") {\n return `{ path: \"*\", component: Route${index}, name: ${JSON.stringify(route.routeName)} }`;\n }\n\n return `{ path: ${JSON.stringify(route.routePath)}, component: Route${index}, name: ${JSON.stringify(route.routeName)} }`;\n })\n .join(\",\\n\");\n\n return `${imports}\\n\\nconst routes = [\\n${definitions}\\n]\\n\\nexport default routes\\n`;\n },\n handleHotUpdate(context) {\n const normalizedFile = normalizePath(context.file);\n if (!normalizedFile.includes(\"/src/router-demo/routes/\")) {\n return;\n }\n\n const module = context.server.moduleGraph.getModuleById(resolvedVirtualRoutesId);\n if (module) {\n context.server.reloadModule(module);\n }\n },\n };\n}\n\nfunction createOlovaAppRouterPlugin(): Plugin {\n let root = \"\";\n\n return {\n name: \"olova-app-router\",\n config() {\n return {\n build: {\n rollupOptions: {\n input: {\n main: path.join(process.cwd(), generatedDirName, generatedHtmlName),\n },\n },\n },\n optimizeDeps: {\n exclude: [\"olova-router\", \"olova/runtime\", \"olova/core\", \"olova/global\"],\n },\n resolve: {\n dedupe: [\"olova\", \"olova/core\", \"olova/runtime\", \"olova/global\"],\n },\n };\n },\n configResolved(config) {\n root = config.root;\n writeGeneratedBootstrap(root);\n },\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const requestUrl = req.url?.split(\"?\", 1)[0] ?? \"/\";\n const isAppRequest =\n (req.method === \"GET\" || req.method === \"HEAD\" || !req.method) &&\n !requestUrl.startsWith(\"/@\") &&\n !requestUrl.startsWith(`/${generatedDirName}/`) &&\n !requestUrl.startsWith(\"/src/\") &&\n !requestUrl.startsWith(\"/node_modules/\") &&\n path.extname(requestUrl) === \"\";\n\n if (!isAppRequest) {\n next();\n return;\n }\n\n const html = [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \" <head>\",\n ' <meta charset=\"UTF-8\" />',\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />',\n \" <title>Olova App</title>\",\n \" </head>\",\n \" <body>\",\n ' <div id=\"app\"></div>',\n ` <script type=\"module\" src=\"/${generatedDirName}/${generatedMainName}\"></script>`,\n \" </body>\",\n \"</html>\",\n \"\",\n ].join(\"\\n\");\n\n res.setHeader(\"Content-Type\", \"text/html\");\n res.end(await server.transformIndexHtml(\"/\", html));\n });\n },\n resolveId(id) {\n if (id === virtualAppEntryId) {\n return resolvedVirtualAppEntryId;\n }\n\n return null;\n },\n load(id) {\n if (id !== resolvedVirtualAppEntryId) {\n return null;\n }\n\n const appDir = path.join(root, \"src\", \"app\");\n const layoutPath = path.join(appDir, \"layout.olova\");\n const hasLayout = statSync(layoutPath, { throwIfNoEntry: false })?.isFile?.() ?? false;\n const files = collectOlovaFiles(appDir)\n .filter((file) => path.basename(file) !== \"layout.olova\")\n .map((file) => {\n const relative = normalizePath(path.relative(appDir, file));\n return {\n file,\n routePath: createAppRoutePath(relative),\n routeName: createAppRouteName(relative),\n };\n })\n .sort((left, right) => {\n if (left.routePath === \"*\") {\n return 1;\n }\n\n if (right.routePath === \"*\") {\n return -1;\n }\n\n return left.routePath.localeCompare(right.routePath);\n });\n\n const imports = [\n 'import { defineComponent } from \"olova/runtime\";',\n 'import { BrowserRouter } from \"olova-router\";',\n hasLayout ? `import RootLayout from ${JSON.stringify(normalizePath(layoutPath))};` : \"\",\n ...files.map((route, index) => `import Route${index} from ${JSON.stringify(normalizePath(route.file))};`),\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n const routeObjects = files\n .map((route, index) => `{ path: ${JSON.stringify(route.routePath)}, name: ${JSON.stringify(route.routeName)}, component: Route${index} }`)\n .join(\",\\n\");\n\n const routesCode = hasLayout\n ? `[\n {\n path: \"/\",\n component: RootLayout,\n children: [\n${routeObjects}\n ]\n }\n]`\n : `[\n${routeObjects}\n]`;\n\n return `${imports}\n\nconst routes = ${routesCode};\n\nconst AppEntry = defineComponent(() => ({\n template: \"__O_COMP_app_entry__\",\n textBindings: [],\n htmlBindings: [],\n attrBindings: [],\n eventBindings: [],\n slotBindings: [],\n componentBindings: [\n {\n id: \"app_entry\",\n getComponent: () => BrowserRouter,\n getProps: () => ({ routes })\n }\n ]\n}));\n\nexport default AppEntry;\n`;\n },\n handleHotUpdate(context) {\n const normalizedFile = normalizePath(context.file);\n if (!normalizedFile.includes(\"/src/app/\")) {\n return;\n }\n\n const module = context.server.moduleGraph.getModuleById(resolvedVirtualAppEntryId);\n if (module) {\n context.server.reloadModule(module);\n }\n },\n closeBundle() {\n const distDir = path.join(root, \"dist\");\n const generatedDistDir = path.join(distDir, generatedDirName);\n const generatedDistHtmlPath = path.join(generatedDistDir, generatedHtmlName);\n const distIndexPath = path.join(distDir, generatedHtmlName);\n\n if (!statSync(generatedDistHtmlPath, { throwIfNoEntry: false })?.isFile?.()) {\n return;\n }\n\n rmSync(distIndexPath, { force: true });\n renameSync(generatedDistHtmlPath, distIndexPath);\n rmSync(generatedDistDir, { recursive: true, force: true });\n },\n };\n}\n\nexport function olovaRouter(): PluginOption[] {\n return [createOlovaAppRouterPlugin(), createRouterDemoRoutesPlugin(), createOlovaCompatPlugin()];\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/vite.ts"],"names":[],"mappings":"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","file":"vite.js","sourcesContent":["import { readdirSync, statSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin, PluginOption } from \"vite\";\nimport { normalizePath } from \"vite\";\n\nconst playgroundEntry = normalizePath(\"/playground/main.ts\");\nconst routerPackageEntry = normalizePath(\"/packages/olova-router/\");\nconst virtualRoutesId = \"virtual:router-demo-routes\";\nconst resolvedVirtualRoutesId = \"\\0virtual:router-demo-routes\";\nconst virtualAppEntryId = \"virtual:olova-app-entry\";\nconst resolvedVirtualAppEntryId = \"\\0virtual:olova-app-entry\";\nconst virtualBootstrapId = \"virtual:olova-bootstrap\";\nconst resolvedVirtualBootstrapId = \"\\0virtual:olova-bootstrap\";\nconst olovaPluginName = \"vite-plugin-olova\";\n\nexport const generatedDirName = \".olova\";\nexport const generatedHtmlName = \"index.html\";\nexport const generatedMainName = \"main.ts\";\n\nfunction toRouteSegment(segment: string): string {\n if (segment === \"index\") {\n return \"\";\n }\n\n if (segment === \"+not-found\") {\n return \"*\";\n }\n\n if (segment.startsWith(\"[...\") && segment.endsWith(\"]\")) {\n return `:${segment.slice(4, -1)}*`;\n }\n\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n return `:${segment.slice(1, -1)}`;\n }\n\n return segment;\n}\n\nfunction collectOlovaFiles(dir: string): string[] {\n const entries = readdirSync(dir);\n const files: string[] = [];\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry);\n const stats = statSync(fullPath);\n\n if (stats.isDirectory()) {\n files.push(...collectOlovaFiles(fullPath));\n continue;\n }\n\n if (entry.endsWith(\".olova\")) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\nfunction createRoutePath(relativeFile: string): string {\n const withoutExt = relativeFile.replace(/\\.olova$/u, \"\");\n const segments = normalizePath(withoutExt).split(\"/\").map(toRouteSegment);\n\n if (segments.includes(\"*\")) {\n return \"*\";\n }\n\n const filtered = segments.filter(Boolean);\n return filtered.length === 0 ? \"/\" : `/${filtered.join(\"/\")}`;\n}\n\nfunction createRouteName(relativeFile: string): string {\n const withoutExt = relativeFile.replace(/\\.olova$/u, \"\");\n const segments = normalizePath(withoutExt)\n .split(\"/\")\n .filter((segment) => segment !== \"index\" && segment !== \"+not-found\")\n .map((segment) => segment.replace(/^\\[\\.\\.\\.(.+)\\]$/u, \"$1\").replace(/^\\[(.+)\\]$/u, \"$1\"));\n\n return segments.length === 0 ? \"home\" : segments.join(\".\");\n}\n\nfunction createAppRoutePath(relativeFile: string): string {\n const normalized = normalizePath(relativeFile).replace(/\\.olova$/u, \"\");\n const rawSegments = normalized.split(\"/\");\n const fileName = rawSegments[rawSegments.length - 1];\n const dirSegments = rawSegments.slice(0, -1);\n\n if (fileName === \"+not-found\") {\n return \"*\";\n }\n\n const fileSegment = fileName === \"app\" ? \"\" : toRouteSegment(fileName);\n const routeSegments = [...dirSegments.map(toRouteSegment), fileSegment].filter(Boolean);\n\n return routeSegments.length === 0 ? \"/\" : `/${routeSegments.join(\"/\")}`;\n}\n\nfunction createAppRouteName(relativeFile: string): string {\n const normalized = normalizePath(relativeFile).replace(/\\.olova$/u, \"\");\n const rawSegments = normalized.split(\"/\");\n const fileName = rawSegments[rawSegments.length - 1];\n const dirSegments = rawSegments.slice(0, -1);\n\n if (fileName === \"+not-found\") {\n return \"not-found\";\n }\n\n const nameParts = [...dirSegments, fileName === \"app\" ? \"home\" : fileName]\n .filter(Boolean)\n .map((segment) => segment.replace(/^\\[\\.\\.\\.(.+)\\]$/u, \"$1\").replace(/^\\[(.+)\\]$/u, \"$1\"));\n\n return nameParts.join(\".\");\n}\n\nfunction joinBase(base: string, target: string): string {\n if (!base || base === \"/\") {\n return `/${target.replace(/^\\/+/u, \"\")}`;\n }\n\n if (base === \"./\") {\n return `./${target.replace(/^\\/+/u, \"\")}`;\n }\n\n const normalizedBase = base.endsWith(\"/\") ? base : `${base}/`;\n return `${normalizedBase}${target.replace(/^\\/+/u, \"\")}`;\n}\n\nfunction renderAppHtml(options: { title: string; scriptSrc: string; cssHrefs?: string[] }): string {\n const cssTags = (options.cssHrefs ?? [])\n .map((href) => ` <link rel=\"stylesheet\" href=\"${href}\">`)\n .join(\"\\n\");\n\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \" <head>\",\n ' <meta charset=\"UTF-8\" />',\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />',\n ` <title>${options.title}</title>`,\n cssTags,\n \" </head>\",\n \" <body>\",\n ' <div id=\"app\"></div>',\n ` <script type=\"module\" src=\"${options.scriptSrc}\"></script>`,\n \" </body>\",\n \"</html>\",\n \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction patchOlovaTransform(plugins: unknown[] | undefined): void {\n if (!plugins) {\n return;\n }\n\n const queue = [...plugins];\n\n while (queue.length > 0) {\n const candidate = queue.shift();\n\n if (Array.isArray(candidate)) {\n queue.push(...candidate);\n continue;\n }\n\n if (!candidate || typeof candidate !== \"object\") {\n continue;\n }\n\n const plugin = candidate as Plugin & { __olovaRouterPatched?: boolean };\n if (plugin.name !== olovaPluginName) {\n continue;\n }\n\n const transformHook = plugin.transform;\n const originalTransform =\n typeof transformHook === \"function\"\n ? transformHook\n : typeof transformHook?.handler === \"function\"\n ? transformHook.handler\n : null;\n\n if (!originalTransform || plugin.__olovaRouterPatched) {\n return;\n }\n\n plugin.transform = function transform(code, id, ...rest): any {\n const normalizedId = normalizePath(id.split(\"?\", 1)[0]);\n\n if (\n normalizedId.endsWith(playgroundEntry) ||\n (normalizedId.includes(routerPackageEntry) &&\n (normalizedId.endsWith(\".ts\") || normalizedId.endsWith(\".js\")))\n ) {\n return null;\n }\n\n return (originalTransform as typeof transform).call(this, code, id, ...rest);\n };\n\n plugin.__olovaRouterPatched = true;\n return;\n }\n}\n\nfunction createOlovaCompatPlugin(): Plugin {\n return {\n name: \"olova-router-compat\",\n config(config) {\n patchOlovaTransform((config.plugins ?? []) as unknown[]);\n },\n configResolved(config) {\n patchOlovaTransform(config.plugins as unknown[]);\n },\n };\n}\n\nfunction createRouterDemoRoutesPlugin(): Plugin {\n let root = \"\";\n\n return {\n name: \"router-demo-file-routes\",\n configResolved(config) {\n root = config.root;\n },\n resolveId(id) {\n if (id === virtualRoutesId) {\n return resolvedVirtualRoutesId;\n }\n\n return null;\n },\n load(id) {\n if (id !== resolvedVirtualRoutesId) {\n return null;\n }\n\n const routesDir = path.join(root, \"src\", \"router-demo\", \"routes\");\n const files = collectOlovaFiles(routesDir)\n .map((file) => {\n const relative = normalizePath(path.relative(routesDir, file));\n return {\n file,\n routePath: createRoutePath(relative),\n routeName: createRouteName(relative),\n };\n })\n .sort((left, right) => {\n if (left.routePath === \"*\") {\n return 1;\n }\n\n if (right.routePath === \"*\") {\n return -1;\n }\n\n return left.routePath.localeCompare(right.routePath);\n });\n\n const imports = files\n .map((route, index) => `import Route${index} from ${JSON.stringify(normalizePath(route.file))}`)\n .join(\"\\n\");\n\n const definitions = files\n .map((route, index) => {\n if (route.routePath === \"*\") {\n return `{ path: \"*\", component: Route${index}, name: ${JSON.stringify(route.routeName)} }`;\n }\n\n return `{ path: ${JSON.stringify(route.routePath)}, component: Route${index}, name: ${JSON.stringify(route.routeName)} }`;\n })\n .join(\",\\n\");\n\n return `${imports}\\n\\nconst routes = [\\n${definitions}\\n]\\n\\nexport default routes\\n`;\n },\n handleHotUpdate(context) {\n const normalizedFile = normalizePath(context.file);\n if (!normalizedFile.includes(\"/src/router-demo/routes/\")) {\n return;\n }\n\n const module = context.server.moduleGraph.getModuleById(resolvedVirtualRoutesId);\n if (module) {\n context.server.reloadModule(module);\n }\n },\n };\n}\n\nfunction createOlovaAppRouterPlugin(): Plugin {\n let root = \"\";\n let base = \"/\";\n let isBuild = false;\n\n return {\n name: \"olova-app-router\",\n config(_config, env) {\n isBuild = env.command === \"build\";\n\n return {\n build: {\n rollupOptions: {\n input: {\n // Build without a physical `index.html` in the project root.\n main: virtualBootstrapId,\n },\n },\n },\n optimizeDeps: {\n exclude: [\"olova-router\", \"olova/runtime\", \"olova/core\", \"olova/global\"],\n },\n resolve: {\n dedupe: [\"olova\", \"olova/core\", \"olova/runtime\", \"olova/global\"],\n },\n };\n },\n configResolved(config) {\n root = config.root;\n base = config.base ?? \"/\";\n isBuild = config.command === \"build\";\n },\n buildStart() {\n if (!isBuild) {\n return;\n }\n\n // Ensure Rollup has a concrete entry so we can emit `index.html` ourselves.\n this.emitFile({ type: \"chunk\", id: virtualBootstrapId, name: \"main\" });\n },\n configureServer(server) {\n server.middlewares.use(async (req, res, next) => {\n const requestUrl = req.url?.split(\"?\", 1)[0] ?? \"/\";\n const isAppRequest =\n (req.method === \"GET\" || req.method === \"HEAD\" || !req.method) &&\n !requestUrl.startsWith(\"/@\") &&\n !requestUrl.startsWith(\"/src/\") &&\n !requestUrl.startsWith(\"/node_modules/\") &&\n path.extname(requestUrl) === \"\";\n\n if (!isAppRequest) {\n next();\n return;\n }\n\n const html = [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \" <head>\",\n ' <meta charset=\"UTF-8\" />',\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />',\n \" <title>Olova App</title>\",\n \" </head>\",\n \" <body>\",\n ' <div id=\"app\"></div>',\n ` <script type=\"module\" src=\"${joinBase(base, `@id/${virtualBootstrapId}`)}\"></script>`,\n \" </body>\",\n \"</html>\",\n \"\",\n ].join(\"\\n\");\n\n res.setHeader(\"Content-Type\", \"text/html\");\n res.end(await server.transformIndexHtml(\"/\", html));\n });\n },\n resolveId(id) {\n if (id === virtualBootstrapId) {\n return resolvedVirtualBootstrapId;\n }\n\n if (id === virtualAppEntryId) {\n return resolvedVirtualAppEntryId;\n }\n\n return null;\n },\n load(id) {\n if (id === resolvedVirtualBootstrapId) {\n const relativeStylePath = normalizePath(path.relative(root, path.join(root, \"src\", \"style.css\")));\n const styleImport = `/${relativeStylePath.replace(/^\\/+/u, \"\")}`;\n\n return [\n `import ${JSON.stringify(styleImport)};`,\n 'import { createApp } from \"olova/runtime\";',\n `import App from ${JSON.stringify(virtualAppEntryId)};`,\n \"\",\n 'createApp(App).mount(\"#app\");',\n \"\",\n ].join(\"\\n\");\n }\n\n if (id !== resolvedVirtualAppEntryId) {\n return null;\n }\n\n const appDir = path.join(root, \"src\", \"app\");\n const layoutPath = path.join(appDir, \"layout.olova\");\n const hasLayout = statSync(layoutPath, { throwIfNoEntry: false })?.isFile?.() ?? false;\n const files = collectOlovaFiles(appDir)\n .filter((file) => path.basename(file) !== \"layout.olova\")\n .map((file) => {\n const relative = normalizePath(path.relative(appDir, file));\n return {\n file,\n routePath: createAppRoutePath(relative),\n routeName: createAppRouteName(relative),\n };\n })\n .sort((left, right) => {\n if (left.routePath === \"*\") {\n return 1;\n }\n\n if (right.routePath === \"*\") {\n return -1;\n }\n\n return left.routePath.localeCompare(right.routePath);\n });\n\n const imports = [\n 'import { defineComponent } from \"olova/runtime\";',\n 'import { BrowserRouter } from \"olova-router\";',\n hasLayout ? `import RootLayout from ${JSON.stringify(normalizePath(layoutPath))};` : \"\",\n ...files.map((route, index) => `import Route${index} from ${JSON.stringify(normalizePath(route.file))};`),\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n const routeObjects = files\n .map((route, index) => `{ path: ${JSON.stringify(route.routePath)}, name: ${JSON.stringify(route.routeName)}, component: Route${index} }`)\n .join(\",\\n\");\n\n const routesCode = hasLayout\n ? `[\n {\n path: \"/\",\n component: RootLayout,\n children: [\n${routeObjects}\n ]\n }\n]`\n : `[\n${routeObjects}\n]`;\n\n return `${imports}\n\nconst routes = ${routesCode};\n\nconst AppEntry = defineComponent(() => ({\n template: \"__O_COMP_app_entry__\",\n textBindings: [],\n htmlBindings: [],\n attrBindings: [],\n eventBindings: [],\n slotBindings: [],\n componentBindings: [\n {\n id: \"app_entry\",\n getComponent: () => BrowserRouter,\n getProps: () => ({ routes })\n }\n ]\n}));\n\nexport default AppEntry;\n`;\n },\n handleHotUpdate(context) {\n const normalizedFile = normalizePath(context.file);\n if (!normalizedFile.includes(\"/src/app/\")) {\n return;\n }\n\n const module = context.server.moduleGraph.getModuleById(resolvedVirtualAppEntryId);\n if (module) {\n context.server.reloadModule(module);\n }\n },\n generateBundle(_outputOptions, bundle) {\n if (!isBuild) {\n return;\n }\n\n const chunks = Object.values(bundle).filter((output) => output.type === \"chunk\");\n const entryChunk = chunks.find(\n (chunk) =>\n chunk.isEntry &&\n typeof chunk.facadeModuleId === \"string\" &&\n chunk.facadeModuleId.includes(virtualBootstrapId),\n );\n\n if (!entryChunk) {\n return;\n }\n\n const cssFiles = Object.values(bundle)\n .filter((output) => output.type === \"asset\" && typeof output.fileName === \"string\")\n .map((asset) => asset.fileName)\n .filter((fileName) => fileName.endsWith(\".css\"))\n .map((fileName) => joinBase(base, fileName));\n\n const html = renderAppHtml({\n title: \"Olova App\",\n scriptSrc: joinBase(base, entryChunk.fileName),\n cssHrefs: cssFiles,\n });\n\n this.emitFile({ type: \"asset\", fileName: \"index.html\", source: html });\n },\n };\n}\n\nexport function olovaRouter(): PluginOption[] {\n return [createOlovaAppRouterPlugin(), createRouterDemoRoutesPlugin(), createOlovaCompatPlugin()];\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "olova-router",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.21",
|
|
4
|
+
"description": "Next.js-inspired router for Olova framework with 9 advanced routing features including prefetching, transitions, metadata, dynamic routes, route groups, parallel routes, and intercepting routes",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"olova",
|
|
7
|
+
"router",
|
|
8
|
+
"routing",
|
|
9
|
+
"next.js",
|
|
10
|
+
"prefetch",
|
|
11
|
+
"transitions",
|
|
12
|
+
"dynamic-routes",
|
|
13
|
+
"route-groups",
|
|
14
|
+
"parallel-routes",
|
|
15
|
+
"intercepting-routes",
|
|
16
|
+
"file-system-routing",
|
|
17
|
+
"vite"
|
|
18
|
+
],
|
|
19
|
+
"author": "Olova Contributors",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/olovalabs/olova-router.git"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/olovalabs/olova-router/issues"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://github.com/olovalabs/olova-router#readme",
|
|
4
29
|
"type": "module",
|
|
5
30
|
"main": "./dist/index.js",
|
|
6
31
|
"module": "./dist/index.js",
|
|
@@ -14,11 +39,68 @@
|
|
|
14
39
|
"types": "./dist/vite.d.ts",
|
|
15
40
|
"import": "./dist/vite.js"
|
|
16
41
|
},
|
|
42
|
+
"./breadcrumbs": {
|
|
43
|
+
"types": "./dist/breadcrumbs.d.ts",
|
|
44
|
+
"import": "./dist/breadcrumbs.js"
|
|
45
|
+
},
|
|
46
|
+
"./guards": {
|
|
47
|
+
"types": "./dist/guards.d.ts",
|
|
48
|
+
"import": "./dist/guards.js"
|
|
49
|
+
},
|
|
50
|
+
"./history": {
|
|
51
|
+
"types": "./dist/history.d.ts",
|
|
52
|
+
"import": "./dist/history.js"
|
|
53
|
+
},
|
|
54
|
+
"./middleware": {
|
|
55
|
+
"types": "./dist/middleware.d.ts",
|
|
56
|
+
"import": "./dist/middleware.js"
|
|
57
|
+
},
|
|
58
|
+
"./lazy": {
|
|
59
|
+
"types": "./dist/lazy.d.ts",
|
|
60
|
+
"import": "./dist/lazy.js"
|
|
61
|
+
},
|
|
62
|
+
"./prefetch": {
|
|
63
|
+
"types": "./dist/prefetch.d.ts",
|
|
64
|
+
"import": "./dist/prefetch.js"
|
|
65
|
+
},
|
|
66
|
+
"./search-params": {
|
|
67
|
+
"types": "./dist/search-params.d.ts",
|
|
68
|
+
"import": "./dist/search-params.js"
|
|
69
|
+
},
|
|
70
|
+
"./transitions": {
|
|
71
|
+
"types": "./dist/transitions.d.ts",
|
|
72
|
+
"import": "./dist/transitions.js"
|
|
73
|
+
},
|
|
74
|
+
"./error-boundary": {
|
|
75
|
+
"types": "./dist/error-boundary.d.ts",
|
|
76
|
+
"import": "./dist/error-boundary.js"
|
|
77
|
+
},
|
|
78
|
+
"./metadata": {
|
|
79
|
+
"types": "./dist/metadata.d.ts",
|
|
80
|
+
"import": "./dist/metadata.js"
|
|
81
|
+
},
|
|
82
|
+
"./dynamic-routes": {
|
|
83
|
+
"types": "./dist/dynamic-routes.d.ts",
|
|
84
|
+
"import": "./dist/dynamic-routes.js"
|
|
85
|
+
},
|
|
86
|
+
"./route-groups": {
|
|
87
|
+
"types": "./dist/route-groups.d.ts",
|
|
88
|
+
"import": "./dist/route-groups.js"
|
|
89
|
+
},
|
|
90
|
+
"./parallel-routes": {
|
|
91
|
+
"types": "./dist/parallel-routes.d.ts",
|
|
92
|
+
"import": "./dist/parallel-routes.js"
|
|
93
|
+
},
|
|
94
|
+
"./intercepting-routes": {
|
|
95
|
+
"types": "./dist/intercepting-routes.d.ts",
|
|
96
|
+
"import": "./dist/intercepting-routes.js"
|
|
97
|
+
},
|
|
17
98
|
"./package.json": "./package.json"
|
|
18
99
|
},
|
|
19
100
|
"files": [
|
|
20
101
|
"dist",
|
|
21
|
-
"README.md"
|
|
102
|
+
"README.md",
|
|
103
|
+
"LICENSE"
|
|
22
104
|
],
|
|
23
105
|
"peerDependencies": {
|
|
24
106
|
"olova": "^2.0.64",
|