@ilha/router 0.4.2 → 0.4.3

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.
@@ -24,6 +24,8 @@ interface RouteRecord {
24
24
  island: Island<any, any>;
25
25
  /** Merged loader chain (layouts outer→inner, then page) — `undefined` if no loaders. */
26
26
  loader?: Loader<any>;
27
+ /** True when the route has a server-side loader, even if the client only has a marker. */
28
+ hasLoader?: boolean;
27
29
  }
28
30
  interface RouteSnapshot {
29
31
  path: string;
@@ -138,6 +140,12 @@ interface RouterBuilder {
138
140
  * was never registered via `.route()`.
139
141
  */
140
142
  attachLoader(pattern: string, loader: Loader<any>): RouterBuilder;
143
+ /**
144
+ * Mark an already-registered route as having a server-side loader without
145
+ * importing that loader into the client bundle. Used by FS-routing codegen
146
+ * so SPA navigation knows to call the loader endpoint.
147
+ */
148
+ markLoader(pattern: string): RouterBuilder;
141
149
  /**
142
150
  * Return a snapshot of every registered route in match order. Useful for
143
151
  * prerenderers that need to discover the filesystem routes exposed by
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { A as loader, B as useRoute, C as RouterView, D as enableLinkInterception, E as defineLayout, F as routeHash, G as setHistoryMode, H as wrapLayout, I as routeParams, L as routePath, M as prefetch, N as prime, O as error, P as redirect, R as routeSearch, S as RouterOptions, T as composeLoaders, U as HistoryMode, V as wrapError, W as getHistoryMode, _ as RouteRecord, a as InferLoader, b as RouterLink, c as LinkInterceptionOptions, d as LoaderError, f as MergeLoaders, g as RenderResponse, h as Redirect, i as HydrateOptions, j as navigate, k as isActive, l as Loader, m as NavigateOptions, n as ErrorHandler, o as LOADER_ENDPOINT, p as MountOptions, r as HydratableRenderOptions, s as LayoutHandler, t as AppError, u as LoaderContext, v as RouteSnapshot, w as _default, x as RouterMode, y as RouterBuilder, z as router } from "./index-DSE6uoR1.js";
1
+ import { A as loader, B as useRoute, C as RouterView, D as enableLinkInterception, E as defineLayout, F as routeHash, G as setHistoryMode, H as wrapLayout, I as routeParams, L as routePath, M as prefetch, N as prime, O as error, P as redirect, R as routeSearch, S as RouterOptions, T as composeLoaders, U as HistoryMode, V as wrapError, W as getHistoryMode, _ as RouteRecord, a as InferLoader, b as RouterLink, c as LinkInterceptionOptions, d as LoaderError, f as MergeLoaders, g as RenderResponse, h as Redirect, i as HydrateOptions, j as navigate, k as isActive, l as Loader, m as NavigateOptions, n as ErrorHandler, o as LOADER_ENDPOINT, p as MountOptions, r as HydratableRenderOptions, s as LayoutHandler, t as AppError, u as LoaderContext, v as RouteSnapshot, w as _default, x as RouterMode, y as RouterBuilder, z as router } from "./index-CJT0h4u4.js";
2
2
  export { AppError, ErrorHandler, HistoryMode, HydratableRenderOptions, HydrateOptions, InferLoader, LOADER_ENDPOINT, LayoutHandler, LinkInterceptionOptions, Loader, LoaderContext, LoaderError, MergeLoaders, MountOptions, NavigateOptions, Redirect, RenderResponse, RouteRecord, RouteSnapshot, RouterBuilder, RouterLink, RouterMode, RouterOptions, RouterView, composeLoaders, _default as default, defineLayout, enableLinkInterception, error, getHistoryMode, isActive, loader, navigate, prefetch, prime, redirect, routeHash, routeParams, routePath, routeSearch, router, setHistoryMode, useRoute, wrapError, wrapLayout };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { C as wrapError, E as setHistoryMode, S as useRoute, T as getHistoryMode, _ as routeParams, a as RouterView, b as router, c as enableLinkInterception, d as loader, f as navigate, g as routeHash, h as redirect, i as RouterLink, l as error, m as prime, n as LoaderError, o as composeLoaders, p as prefetch, r as Redirect, s as defineLayout, t as LOADER_ENDPOINT, u as isActive, v as routePath, w as wrapLayout, x as src_default, y as routeSearch } from "./src-DX07qe2S.js";
1
+ import { C as wrapError, E as setHistoryMode, S as useRoute, T as getHistoryMode, _ as routeParams, a as RouterView, b as router, c as enableLinkInterception, d as loader, f as navigate, g as routeHash, h as redirect, i as RouterLink, l as error, m as prime, n as LoaderError, o as composeLoaders, p as prefetch, r as Redirect, s as defineLayout, t as LOADER_ENDPOINT, u as isActive, v as routePath, w as wrapLayout, x as src_default, y as routeSearch } from "./src-BqAWh426.js";
2
2
  export { LOADER_ENDPOINT, LoaderError, Redirect, RouterLink, RouterView, composeLoaders, src_default as default, defineLayout, enableLinkInterception, error, getHistoryMode, isActive, loader, navigate, prefetch, prime, redirect, routeHash, routeParams, routePath, routeSearch, router, setHistoryMode, useRoute, wrapError, wrapLayout };
@@ -162,7 +162,7 @@ async function generate(pagesDir, outFile, options = {}) {
162
162
  const wrappedId = `_wrapped${i}`;
163
163
  wrappedIslandLines.push(`const ${wrappedId} = ${expr};`);
164
164
  registryLines.push(` ${JSON.stringify(entry.name)}: ${wrappedId}` + (i < entries.length - 1 ? "," : ""));
165
- routeLines.push(` .route(${JSON.stringify(entry.pattern)}, ${wrappedId})`);
165
+ routeLines.push(` .route(${JSON.stringify(entry.pattern)}, ${wrappedId})` + (entry.hasLoader || entry.loaderLayouts.length > 0 ? `.markLoader(${JSON.stringify(entry.pattern)})` : ""));
166
166
  }
167
167
  const code = [
168
168
  `// @generated by @ilha/router — do not edit`,
@@ -1,4 +1,4 @@
1
- import { H as wrapLayout, V as wrapError, n as ErrorHandler, s as LayoutHandler, t as AppError, v as RouteSnapshot } from "./index-DSE6uoR1.js";
1
+ import { H as wrapLayout, V as wrapError, n as ErrorHandler, s as LayoutHandler, t as AppError, v as RouteSnapshot } from "./index-CJT0h4u4.js";
2
2
  import { n as ilhaPages, t as IlhaPagesOptions } from "./plugin-Diq1AxSa.js";
3
3
  import * as _$unplugin from "unplugin";
4
4
 
package/dist/rolldown.js CHANGED
@@ -1,5 +1,5 @@
1
- import { C as wrapError, w as wrapLayout } from "./src-DX07qe2S.js";
2
- import { t as ilhaPages } from "./plugin-Bhbl9aqc.js";
1
+ import { C as wrapError, w as wrapLayout } from "./src-BqAWh426.js";
2
+ import { t as ilhaPages } from "./plugin-BMk5Ey9X.js";
3
3
  //#region src/rolldown.ts
4
4
  /** Rolldown plugin — use via `@ilha/router/rolldown`. */
5
5
  function pages(options = {}) {
package/dist/rspack.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { H as wrapLayout, V as wrapError, n as ErrorHandler, s as LayoutHandler, t as AppError, v as RouteSnapshot } from "./index-DSE6uoR1.js";
1
+ import { H as wrapLayout, V as wrapError, n as ErrorHandler, s as LayoutHandler, t as AppError, v as RouteSnapshot } from "./index-CJT0h4u4.js";
2
2
  import { n as ilhaPages, t as IlhaPagesOptions } from "./plugin-Diq1AxSa.js";
3
3
  import * as _$unplugin from "unplugin";
4
4
 
package/dist/rspack.js CHANGED
@@ -1,5 +1,5 @@
1
- import { C as wrapError, w as wrapLayout } from "./src-DX07qe2S.js";
2
- import { t as ilhaPages } from "./plugin-Bhbl9aqc.js";
1
+ import { C as wrapError, w as wrapLayout } from "./src-BqAWh426.js";
2
+ import { t as ilhaPages } from "./plugin-BMk5Ey9X.js";
3
3
  //#region src/rspack.ts
4
4
  /** Rspack plugin — use via `@ilha/router/rspack`. */
5
5
  function pages(options = {}) {
@@ -349,7 +349,7 @@ function prefetch(pathWithSearch) {
349
349
  if (!isBrowser) return;
350
350
  if (prefetchCache.has(pathWithSearch)) return;
351
351
  const pathOnly = pathWithSearch.split("?")[0] ?? "";
352
- if (!findRoute(_rou3, "GET", pathOnly)?.data?.loader) return;
352
+ if (!findRoute(_rou3, "GET", pathOnly)?.data?.hasLoader) return;
353
353
  const promise = fetchLoaderData(pathWithSearch).catch((e) => {
354
354
  return {
355
355
  kind: "error",
@@ -369,7 +369,7 @@ async function mountRouteWithHydration(island, host, pathWithSearch, signal, reg
369
369
  host.innerHTML = `<div data-router-empty></div>`;
370
370
  return () => {};
371
371
  }
372
- const hasLoader = !!findRoute(_rou3, "GET", pathWithSearch.split("?")[0] ?? "")?.data?.loader;
372
+ const hasLoader = !!findRoute(_rou3, "GET", pathWithSearch.split("?")[0] ?? "")?.data?.hasLoader;
373
373
  let props = {};
374
374
  const loaderResult = hasLoader ? await fetchLoaderData(pathWithSearch, signal) : {
375
375
  kind: "data",
@@ -587,14 +587,17 @@ function router(options = {}) {
587
587
  let _linkCleanup = null;
588
588
  const builder = {
589
589
  route(pattern, island, loader) {
590
+ const hasLoader = !!loader;
590
591
  const data = {
591
592
  island,
592
- loader
593
+ loader,
594
+ hasLoader
593
595
  };
594
596
  _records.push({
595
597
  pattern,
596
598
  island,
597
- loader
599
+ loader,
600
+ hasLoader
598
601
  });
599
602
  addRoute(_rou3, "GET", pattern, data);
600
603
  _patternToData.set(pattern, data);
@@ -608,8 +611,23 @@ function router(options = {}) {
608
611
  return builder;
609
612
  }
610
613
  data.loader = loader;
614
+ data.hasLoader = true;
611
615
  const rec = _records.find((r) => r.pattern === pattern);
612
- if (rec) rec.loader = loader;
616
+ if (rec) {
617
+ rec.loader = loader;
618
+ rec.hasLoader = true;
619
+ }
620
+ return builder;
621
+ },
622
+ markLoader(pattern) {
623
+ const data = _patternToData.get(pattern);
624
+ if (!data) {
625
+ console.warn(`[ilha-router] markLoader("${pattern}"): pattern was never registered via .route(). The loader marker will be ignored.`);
626
+ return builder;
627
+ }
628
+ data.hasLoader = true;
629
+ const rec = _records.find((r) => r.pattern === pattern);
630
+ if (rec) rec.hasLoader = true;
613
631
  return builder;
614
632
  },
615
633
  routes() {
@@ -693,7 +711,7 @@ function router(options = {}) {
693
711
  const viewHost = host?.querySelector("[data-router-view]");
694
712
  if (!viewHost) return;
695
713
  const loc = getAdapter().readLocation();
696
- const result = !!findRoute(_rou3, "GET", loc.pathname)?.data?.loader ? await fetchLoaderData(loc.pathname + loc.search, signal) : {
714
+ const result = !!findRoute(_rou3, "GET", loc.pathname)?.data?.hasLoader ? await fetchLoaderData(loc.pathname + loc.search, signal) : {
697
715
  kind: "data",
698
716
  data: {}
699
717
  };
package/dist/vite.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- import { H as wrapLayout, V as wrapError, n as ErrorHandler, s as LayoutHandler, t as AppError, v as RouteSnapshot } from "./index-DSE6uoR1.js";
2
+ import { H as wrapLayout, V as wrapError, n as ErrorHandler, s as LayoutHandler, t as AppError, v as RouteSnapshot } from "./index-CJT0h4u4.js";
3
3
  import { n as ilhaPages, t as IlhaPagesOptions } from "./plugin-Diq1AxSa.js";
4
4
  import * as fs from "node:fs";
5
5
  import * as http from "node:http";
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
- import { C as wrapError, w as wrapLayout } from "./src-DX07qe2S.js";
2
- import { t as ilhaPages } from "./plugin-Bhbl9aqc.js";
1
+ import { C as wrapError, w as wrapLayout } from "./src-BqAWh426.js";
2
+ import { t as ilhaPages } from "./plugin-BMk5Ey9X.js";
3
3
  //#region src/vite.ts
4
4
  /** Vite plugin — use via `@ilha/router/vite`. */
5
5
  function pages(options = {}) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ilha/router",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "A tiny SPA router for Ilha",
5
5
  "license": "MIT",
6
6
  "author": "Ryuz <ryuzer@proton.me>",