@void/svelte 0.7.4 → 0.7.6

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/svelte`:
34
34
 
35
35
  - `Link`
36
36
  - `useRouter()`
37
+ - `useParams()`
37
38
  - `useNavigation()`
38
39
  - `useShared()`
39
40
  - `useForm()`
package/dist/plugin.mjs CHANGED
@@ -2,7 +2,7 @@ import { svelte } from "@sveltejs/vite-plugin-svelte";
2
2
  import { existsSync, readFileSync, readdirSync } from "node:fs";
3
3
  import { normalizePath } from "vite";
4
4
  import { generateComponentManifest, resolveEffectiveLayoutChain, resolveStaticPageDataBuildOptions, scanPages } from "void/pages";
5
- import { ISLANDS_CLIENT_ENTRY_ID, ISLANDS_RENDERER_ID, computePagesNeedingClientJS, configureIslandCssServer, extractCssImports, fileHasCssImports, needsIslandClientBundle, rebuildIslandCssMap, resolveSpecifier, rewriteCssImportForVirtualModule, watchPagesForRescan } from "void/pages-islands-plugin";
5
+ import { ISLANDS_CLIENT_ENTRY_ID, ISLANDS_RENDERER_ID, computePagesNeedingClientJS, extractCssImports, needsIslandClientBundle, resolveSpecifier, rewriteCssImportForVirtualModule, watchPagesForRescan } from "void/pages-islands-plugin";
6
6
  //#region ../../node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs
7
7
  const _DRIVE_LETTER_START_RE = /^[A-Za-z]:\//;
8
8
  function normalizeWindowsPath(input = "") {
@@ -153,13 +153,7 @@ function islandsPlugin(pagesDir) {
153
153
  const islandCssFiles = /* @__PURE__ */ new Set();
154
154
  let isDev = false;
155
155
  let viteRoot = "";
156
- const islandCssMap = /* @__PURE__ */ new Map();
157
156
  let resolvedConfig = null;
158
- /** Rebuild islandCssMap from current file contents (re-runs fileHasCssImports). */
159
- function rebuildIslandCssMap$1() {
160
- if (!pageScan) return;
161
- rebuildIslandCssMap(pageScan, pagesDir, islandCssMap, fileHasCssImports);
162
- }
163
157
  function computePagesNeedingClientJS$1() {
164
158
  if (!pageScan) return /* @__PURE__ */ new Set();
165
159
  return computePagesNeedingClientJS(pageScan, pagesDir, resolvedConfig);
@@ -173,10 +167,8 @@ function islandsPlugin(pagesDir) {
173
167
  isDev = config.command === "serve";
174
168
  },
175
169
  configureServer(server) {
176
- configureIslandCssServer(server, islandCssFiles, viteRoot, rebuildIslandCssMap$1);
177
170
  watchPagesForRescan(server, pagesDir, root, (scan) => {
178
171
  pageScan = scan;
179
- rebuildIslandCssMap$1();
180
172
  });
181
173
  },
182
174
  async buildStart() {
@@ -224,7 +216,6 @@ function islandsPlugin(pagesDir) {
224
216
  const layoutChain = resolveEffectiveLayoutChain(page, pageScan.layouts, pageScan.namedLayouts);
225
217
  for (const layout of layoutChain) islandCssFiles.add(normalizePath(resolve(pagesDir, layout.filePath)));
226
218
  }
227
- rebuildIslandCssMap$1();
228
219
  }
229
220
  },
230
221
  resolveId: {
@@ -250,7 +241,7 @@ function islandsPlugin(pagesDir) {
250
241
  const mdPlugin = resolvedConfig?.plugins?.find((p) => p.name === "void-md");
251
242
  const mdScriptIds = new Set(mdPlugin?.api?.getClientScripts?.()?.keys() ?? []);
252
243
  const needsJS = computePagesNeedingClientJS$1();
253
- return generateIslandRenderer(pageScan, pagesDir, isDev, islandCssMap, viteRoot, mdScriptIds, needsJS);
244
+ return generateIslandRenderer(pageScan, pagesDir, mdScriptIds, needsJS);
254
245
  }
255
246
  if (id === "\0" + ISLANDS_CLIENT_ENTRY_ID) {
256
247
  if (!pageScan) return "";
@@ -350,13 +341,7 @@ function generateWrapperComponent(id) {
350
341
  </div>
351
342
  `;
352
343
  }
353
- function generateIslandRenderer(scan, pagesDir, isDev, islandCssMap, viteRoot, mdScriptIds, pagesNeedingClientJS) {
354
- let cssMapCode = "";
355
- if (isDev && islandCssMap.size > 0) {
356
- const cssMapObj = {};
357
- for (const [compId, paths] of islandCssMap) cssMapObj[compId] = paths.map((p) => "/" + normalizePath(relative(viteRoot, p)) + ".css");
358
- cssMapCode = `const __cssPaths = ${JSON.stringify(cssMapObj)};`;
359
- }
344
+ function generateIslandRenderer(scan, pagesDir, mdScriptIds, pagesNeedingClientJS) {
360
345
  const mdScriptIdsCode = `const __mdClientScriptIds = new Set(${JSON.stringify([...mdScriptIds])});`;
361
346
  const needsJSCode = `const __pagesNeedingClientJS = new Set(${JSON.stringify([...pagesNeedingClientJS])});`;
362
347
  return `
@@ -365,7 +350,6 @@ import App from "@void/svelte/App.svelte";
365
350
  import { renderHeadToString, renderHtmlAttrs, renderBodyAttrs } from "void/pages-head";
366
351
 
367
352
  ${generateComponentManifest(scan, pagesDir)}
368
- ${cssMapCode}
369
353
  ${mdScriptIdsCode}
370
354
  ${needsJSCode}
371
355
 
@@ -387,6 +371,7 @@ export async function renderIslandPage(pageObj, assetTags) {
387
371
  pageProps: pageObj.props,
388
372
  shared: pageObj.shared || {},
389
373
  errors: pageObj.errors || {},
374
+ params: pageObj.params || {},
390
375
  router: null,
391
376
  stores: null,
392
377
  },
@@ -399,7 +384,7 @@ export async function renderIslandPage(pageObj, assetTags) {
399
384
 
400
385
  return \`<!doctype html>
401
386
  <html\${htmlAttrs}>
402
- <head>\${headHtml}\${typeof __cssPaths !== "undefined" ? (__cssPaths[pageObj.component] || []).map(url => '<link rel="stylesheet" href="' + url + '">').join("\\n") : ""}\${head}\${assetTags.css}\${__pagesNeedingClientJS.has(pageObj.component) ? assetTags.preloads : ""}</head>
387
+ <head>\${headHtml}\${head}\${assetTags.css}\${__pagesNeedingClientJS.has(pageObj.component) ? assetTags.preloads : ""}</head>
403
388
  <body\${bodyAttrs}>
404
389
  <div id="app"\${__mdScriptAttr}>\${html}</div>
405
390
  \${__pagesNeedingClientJS.has(pageObj.component) ? assetTags.body : ""}
@@ -548,7 +533,8 @@ export async function renderPage(pageObj, assetTags) {
548
533
  pageProps: pageObj.props,
549
534
  shared: pageObj.shared || {},
550
535
  errors: pageObj.errors || {},
551
- router: createSsrRouter(pageObj.url || "/"),
536
+ params: pageObj.params || {},
537
+ router: createSsrRouter(pageObj.url || "/", pageObj.params || {}),
552
538
  routeUrl: pageObj.url || "/",
553
539
  navigation: idleNavigationState(),
554
540
  stores: null,
@@ -588,7 +574,9 @@ const propsStore = writable({});
588
574
  const layoutsStore = writable([]);
589
575
  const sharedStore = writable({});
590
576
  const errorsStore = writable({});
577
+ const paramsStore = writable({});
591
578
  let routeUrl = window.location.pathname + window.location.search + window.location.hash;
579
+ let routeParams = {};
592
580
  const routeStore = writable(routeUrl);
593
581
  const navigationStore = writable(idleNavigationState());
594
582
 
@@ -603,6 +591,8 @@ const { router, initialPageData, initialComponent, initialLayouts, start } =
603
591
  propsStore.set(pageData.props);
604
592
  sharedStore.update((s) => ({ ...s, ...(pageData.shared || {}) }));
605
593
  errorsStore.set(pageData.errors || {});
594
+ routeParams = pageData.params || {};
595
+ paramsStore.set(routeParams);
606
596
  layoutsStore.set(layouts);
607
597
  pageStore.set(comp);
608
598
  },
@@ -625,7 +615,7 @@ const { router, initialPageData, initialComponent, initialLayouts, start } =
625
615
  },
626
616
  });
627
617
 
628
- const reactiveRouter = createRouterFacade(router, () => routeUrl);
618
+ const reactiveRouter = createRouterFacade(router, () => routeUrl, () => routeParams);
629
619
 
630
620
  setActionRouter(reactiveRouter);
631
621
 
@@ -634,6 +624,8 @@ propsStore.set(initialPageData.props);
634
624
  layoutsStore.set(initialLayouts);
635
625
  sharedStore.set(initialPageData.shared || {});
636
626
  errorsStore.set(initialPageData.errors || {});
627
+ routeParams = initialPageData.params || {};
628
+ paramsStore.set(routeParams);
637
629
 
638
630
  const appEl = document.getElementById("app");
639
631
  hydrate(App, {
@@ -644,6 +636,7 @@ hydrate(App, {
644
636
  pageProps: initialPageData.props,
645
637
  shared: initialPageData.shared || {},
646
638
  errors: initialPageData.errors || {},
639
+ params: initialPageData.params || {},
647
640
  router,
648
641
  routeUrl,
649
642
  navigation: idleNavigationState(),
@@ -653,6 +646,7 @@ hydrate(App, {
653
646
  layouts: layoutsStore,
654
647
  shared: sharedStore,
655
648
  errors: errorsStore,
649
+ params: paramsStore,
656
650
  route: routeStore,
657
651
  navigation: navigationStore,
658
652
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@void/svelte",
3
- "version": "0.7.4",
3
+ "version": "0.7.6",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/voidzero-dev/void.git",
@@ -44,12 +44,12 @@
44
44
  "svelte": "^5.55.5",
45
45
  "vite": "npm:@voidzero-dev/vite-plus-core@0.1.20",
46
46
  "vite-plus": "^0.1.20",
47
- "void": "0.7.4"
47
+ "void": "0.7.6"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "svelte": "^5.0.0",
51
51
  "vite": "npm:@voidzero-dev/vite-plus-core@0.1.20",
52
- "void": "0.7.4"
52
+ "void": "0.7.6"
53
53
  },
54
54
  "scripts": {
55
55
  "build": "vp pack",
@@ -13,6 +13,7 @@
13
13
  pageProps: props.pageProps,
14
14
  shared: props.shared,
15
15
  errors: props.errors,
16
+ params: props.params,
16
17
  router: props.router,
17
18
  routeUrl: props.routeUrl,
18
19
  navigation: props.navigation,
@@ -25,9 +26,10 @@
25
26
  let currentPageProps = $state(init.pageProps);
26
27
  let shared = $state(init.shared);
27
28
  let errors = $state(init.errors);
29
+ let params = $state(init.params || {});
28
30
  let routeUrl = $state(init.routeUrl || "/");
29
31
  let navigation = $state(init.navigation || idleNavigationState());
30
- const router = createRouterFacade(init.router, () => routeUrl);
32
+ const router = createRouterFacade(init.router, () => routeUrl, () => params);
31
33
 
32
34
  // Capitalized alias for dynamic component rendering
33
35
  let Page = $derived(currentPage);
@@ -39,6 +41,9 @@
39
41
  setContext("__void_errors", {
40
42
  get value() { return errors; },
41
43
  });
44
+ setContext("__void_params", {
45
+ get value() { return params; },
46
+ });
42
47
  setContext("__void_router", router);
43
48
  setContext("__void_navigation", {
44
49
  get value() { return navigation; },
@@ -54,6 +59,7 @@
54
59
  init.stores.layouts.subscribe((v) => { currentLayouts = v; }),
55
60
  init.stores.shared.subscribe((v) => { shared = v; }),
56
61
  init.stores.errors.subscribe((v) => { errors = v; }),
62
+ init.stores.params.subscribe((v) => { params = v; }),
57
63
  init.stores.route.subscribe((v) => { routeUrl = v; }),
58
64
  init.stores.navigation.subscribe((v) => { navigation = v; }),
59
65
  ];
@@ -1,5 +1,6 @@
1
1
  export { default as Link } from './Link.svelte';
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.svelte.ts';
5
6
  export { useNavigation } from './use-navigation.ts';
@@ -0,0 +1,9 @@
1
+ import { getContext } from 'svelte';
2
+
3
+ export function useParams<T extends Record<string, string> = Record<string, string>>(): T {
4
+ const ctx = getContext<{ value: T }>('__void_params');
5
+ if (!ctx) {
6
+ throw new Error('useParams(): must be used inside a Void page.');
7
+ }
8
+ return ctx.value;
9
+ }