@void/solid 0.7.3 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -34,6 +34,7 @@ Main runtime APIs live at `@void/solid`:
34
34
 
35
35
  - `Link`
36
36
  - `useRouter()`
37
+ - `useParams()`
37
38
  - `useNavigation()`
38
39
  - `useShared()`
39
40
  - `useForm()`
package/dist/plugin.mjs CHANGED
@@ -341,7 +341,7 @@ function generateIslandRenderer(scan, pagesDir, isDev, islandCssMap, viteRoot, m
341
341
  return `
342
342
  import { renderToStringAsync, generateHydrationScript } from "solid-js/web";
343
343
  import { createComponent } from "solid-js";
344
- import { SharedContext, ErrorsContext } from "@void/solid";
344
+ import { SharedContext, ErrorsContext, ParamsContext } from "@void/solid";
345
345
  import { renderHeadToString, renderHtmlAttrs, renderBodyAttrs } from "void/pages-head";
346
346
 
347
347
  ${generateComponentManifest(scan, pagesDir)}
@@ -367,15 +367,20 @@ export async function renderIslandPage(pageObj, assetTags) {
367
367
  return createComponent(ErrorsContext.Provider, {
368
368
  value: pageObj.errors || {},
369
369
  get children() {
370
- // Build layout chain inside providers so contexts are available.
371
- // No RouterContext — islands have no Void Router.
372
- let element = createComponent(PageComponent, pageObj.props);
373
- for (let i = layoutComponents.length - 1; i >= 0; i--) {
374
- const Layout = layoutComponents[i];
375
- const child = element;
376
- element = createComponent(Layout, { get children() { return child; } });
377
- }
378
- return element;
370
+ return createComponent(ParamsContext.Provider, {
371
+ value: pageObj.params || {},
372
+ get children() {
373
+ // Build layout chain inside providers so contexts are available.
374
+ // No RouterContext — islands have no Void Router.
375
+ let element = createComponent(PageComponent, pageObj.props);
376
+ for (let i = layoutComponents.length - 1; i >= 0; i--) {
377
+ const Layout = layoutComponents[i];
378
+ const child = element;
379
+ element = createComponent(Layout, { get children() { return child; } });
380
+ }
381
+ return element;
382
+ }
383
+ });
379
384
  }
380
385
  });
381
386
  }
@@ -504,7 +509,7 @@ function generateRendererModule(scan, pagesDir) {
504
509
  return `
505
510
  import { renderToStringAsync, generateHydrationScript } from "solid-js/web";
506
511
  import { createComponent } from "solid-js";
507
- import { SharedContext, ErrorsContext, RouterContext, NavigationContext } from "@void/solid";
512
+ import { SharedContext, ErrorsContext, ParamsContext, RouterContext, NavigationContext } from "@void/solid";
508
513
  import { createSsrRouter, idleNavigationState } from "void/pages-client";
509
514
  import { renderHeadToString, renderHtmlAttrs, renderBodyAttrs } from "void/pages-head";
510
515
  import { serializePageData } from "void/pages-server";
@@ -526,19 +531,24 @@ export async function renderPage(pageObj, assetTags) {
526
531
  value: pageObj.errors || {},
527
532
  get children() {
528
533
  return createComponent(RouterContext.Provider, {
529
- value: createSsrRouter(pageObj.url || "/"),
534
+ value: createSsrRouter(pageObj.url || "/", pageObj.params || {}),
530
535
  get children() {
531
536
  return createComponent(NavigationContext.Provider, {
532
537
  value: () => idleNavigationState(),
533
538
  get children() {
534
- // Build layout chain inside providers so contexts are available
535
- let element = createComponent(PageComponent, pageObj.props);
536
- for (let i = layoutComponents.length - 1; i >= 0; i--) {
537
- const Layout = layoutComponents[i];
538
- const child = element;
539
- element = createComponent(Layout, { get children() { return child; } });
540
- }
541
- return element;
539
+ return createComponent(ParamsContext.Provider, {
540
+ value: pageObj.params || {},
541
+ get children() {
542
+ // Build layout chain inside providers so contexts are available
543
+ let element = createComponent(PageComponent, pageObj.props);
544
+ for (let i = layoutComponents.length - 1; i >= 0; i--) {
545
+ const Layout = layoutComponents[i];
546
+ const child = element;
547
+ element = createComponent(Layout, { get children() { return child; } });
548
+ }
549
+ return element;
550
+ }
551
+ });
542
552
  }
543
553
  });
544
554
  }
@@ -573,7 +583,7 @@ function generateClientEntry(scan, pagesDir, viewTransitions, prefetch, staticPa
573
583
  return `
574
584
  import { createSignal, createComponent, batch } from "solid-js";
575
585
  import { hydrate } from "solid-js/web";
576
- import { SharedContext, ErrorsContext, RouterContext, NavigationContext, setActionRouter } from "@void/solid";
586
+ import { SharedContext, ErrorsContext, ParamsContext, RouterContext, NavigationContext, setActionRouter } from "@void/solid";
577
587
  import { createRouterFacade, createVoidRouter, idleNavigationState } from "void/pages-client";
578
588
  import { parseCacheFor } from "void/pages-prefetch";
579
589
 
@@ -585,6 +595,7 @@ const [layouts, setLayouts] = createSignal([]);
585
595
  const [shared, setShared] = createSignal({});
586
596
  const [errors, setErrors] = createSignal({});
587
597
  const [routeUrl, setRouteUrl] = createSignal(window.location.pathname + window.location.search + window.location.hash);
598
+ const [routeParams, setRouteParams] = createSignal({});
588
599
  const [navigation, setNavigation] = createSignal(idleNavigationState());
589
600
 
590
601
  const { router, initialPageData, initialComponent, initialLayouts, start } =
@@ -601,6 +612,7 @@ const { router, initialPageData, initialComponent, initialLayouts, start } =
601
612
  setLayouts(layoutComps);
602
613
  setShared((prev) => ({ ...prev, ...(pageData.shared || {}) }));
603
614
  setErrors(pageData.errors || {});
615
+ setRouteParams(pageData.params || {});
604
616
  });
605
617
  },
606
618
  onDeferredUpdate(props) {
@@ -621,7 +633,7 @@ const { router, initialPageData, initialComponent, initialLayouts, start } =
621
633
  },
622
634
  });
623
635
 
624
- const reactiveRouter = createRouterFacade(router, () => routeUrl());
636
+ const reactiveRouter = createRouterFacade(router, () => routeUrl(), () => routeParams());
625
637
 
626
638
  setActionRouter(reactiveRouter);
627
639
 
@@ -631,6 +643,7 @@ batch(() => {
631
643
  setLayouts(initialLayouts);
632
644
  setShared(initialPageData.shared || {});
633
645
  setErrors(initialPageData.errors || {});
646
+ setRouteParams(initialPageData.params || {});
634
647
  });
635
648
 
636
649
  function App() {
@@ -643,19 +656,24 @@ function App() {
643
656
  return createComponent(RouterContext.Provider, {
644
657
  value: reactiveRouter,
645
658
  get children() {
646
- return createComponent(NavigationContext.Provider, {
647
- value: navigation,
659
+ return createComponent(ParamsContext.Provider, {
660
+ get value() { return routeParams(); },
648
661
  get children() {
649
- const Comp = component();
650
- if (!Comp) return null;
651
- let element = createComponent(Comp, pageProps());
652
- const layoutList = layouts();
653
- for (let i = layoutList.length - 1; i >= 0; i--) {
654
- const Layout = layoutList[i];
655
- const child = element;
656
- element = createComponent(Layout, { get children() { return child; } });
657
- }
658
- return element;
662
+ return createComponent(NavigationContext.Provider, {
663
+ value: navigation,
664
+ get children() {
665
+ const Comp = component();
666
+ if (!Comp) return null;
667
+ let element = createComponent(Comp, pageProps());
668
+ const layoutList = layouts();
669
+ for (let i = layoutList.length - 1; i >= 0; i--) {
670
+ const Layout = layoutList[i];
671
+ const child = element;
672
+ element = createComponent(Layout, { get children() { return child; } });
673
+ }
674
+ return element;
675
+ }
676
+ });
659
677
  }
660
678
  });
661
679
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@void/solid",
3
- "version": "0.7.3",
3
+ "version": "0.7.5",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/voidzero-dev/void.git",
@@ -43,12 +43,12 @@
43
43
  "solid-js": "^1.9.12",
44
44
  "vite": "npm:@voidzero-dev/vite-plus-core@0.1.20",
45
45
  "vite-plus": "^0.1.20",
46
- "void": "0.7.3"
46
+ "void": "0.7.5"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "solid-js": "^1.9.0",
50
50
  "vite": "npm:@voidzero-dev/vite-plus-core@0.1.20",
51
- "void": "0.7.3"
51
+ "void": "0.7.5"
52
52
  },
53
53
  "scripts": {
54
54
  "build": "vp pack",
@@ -8,6 +8,10 @@ export const SharedContext: Context<Record<string, unknown> | null> = createCont
8
8
  export const ErrorsContext: Context<
9
9
  Record<string, string> | (() => Record<string, string>) | null
10
10
  > = createContext<Record<string, string> | (() => Record<string, string>) | null>(null);
11
+ export const ParamsContext: Context<Record<string, string> | null> = createContext<Record<
12
+ string,
13
+ string
14
+ > | null>(null);
11
15
  export const RouterContext: Context<VoidRouter | null> = createContext<VoidRouter | null>(null);
12
16
  export const NavigationContext: Context<(() => NavigationState) | null> = createContext<
13
17
  (() => NavigationState) | null
@@ -1,9 +1,16 @@
1
1
  export { Link, type LinkProps } from './link.tsx';
2
2
  export { useRouter } from './use-router.ts';
3
+ export { useParams } from './use-params.ts';
3
4
  export { useShared } from './use-shared.ts';
4
5
  export { useForm } from './use-form.ts';
5
6
  export { useNavigation } from './use-navigation.ts';
6
7
  export { useIslandForm } from './use-island-form.ts';
7
8
  export { action, setActionRouter } from './action.ts';
8
- export { SharedContext, ErrorsContext, RouterContext, NavigationContext } from './context.ts';
9
+ export {
10
+ SharedContext,
11
+ ErrorsContext,
12
+ ParamsContext,
13
+ RouterContext,
14
+ NavigationContext,
15
+ } from './context.ts';
9
16
  export type { DeferredState as Deferred, InferProps } from 'void';
@@ -0,0 +1,10 @@
1
+ import { useContext } from 'solid-js';
2
+ import { ParamsContext } from './context.ts';
3
+
4
+ export function useParams<T extends Record<string, string> = Record<string, string>>(): T {
5
+ const params = useContext(ParamsContext);
6
+ if (params === null) {
7
+ throw new Error('useParams(): must be used inside a Void page.');
8
+ }
9
+ return params as T;
10
+ }