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.
@@ -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, rmSync, renameSync, readdirSync, mkdirSync, writeFileSync } from 'fs';
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 writeGeneratedBootstrap(root) {
85
- const generatedDir = path.join(root, generatedDirName);
86
- const generatedHtmlPath = path.join(generatedDir, generatedHtmlName);
87
- const generatedMainPath = path.join(generatedDir, generatedMainName);
88
- const relativeStyleImport = normalizePath(path.relative(generatedDir, path.join(root, "src", "style.css")));
89
- mkdirSync(generatedDir, { recursive: true });
90
- writeFileSync(
91
- generatedHtmlPath,
92
- [
93
- "<!doctype html>",
94
- '<html lang="en">',
95
- " <head>",
96
- ' <meta charset="UTF-8" />',
97
- ' <meta name="viewport" content="width=device-width, initial-scale=1.0" />',
98
- " <title>Olova App</title>",
99
- " </head>",
100
- " <body>",
101
- ' <div id="app"></div>',
102
- ` <script type="module" src="./${generatedMainName}"></script>`,
103
- " </body>",
104
- "</html>",
105
- ""
106
- ].join("\n")
107
- );
108
- writeFileSync(
109
- generatedMainPath,
110
- [
111
- `import ${JSON.stringify(relativeStyleImport)};`,
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
- main: path.join(process.cwd(), generatedDirName, generatedHtmlName)
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
- writeGeneratedBootstrap(root);
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(`/${generatedDirName}/`) && !requestUrl.startsWith("/src/") && !requestUrl.startsWith("/node_modules/") && path.extname(requestUrl) === "";
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="/${generatedDirName}/${generatedMainName}"></script>`,
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
- closeBundle() {
360
- const distDir = path.join(root, "dist");
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
- rmSync(distIndexPath, { force: true });
368
- renameSync(generatedDistHtmlPath, distIndexPath);
369
- rmSync(generatedDistDir, { recursive: true, force: true });
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.19",
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",