vite-react-ssg 0.8.3 → 0.8.5-beta.1

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.
Files changed (43) hide show
  1. package/README.md +37 -8
  2. package/dist/client/single-page.d.mts +4 -4
  3. package/dist/client/single-page.d.ts +4 -4
  4. package/dist/client/single-page.mjs +7 -6
  5. package/dist/index.d.mts +11 -4
  6. package/dist/index.d.ts +11 -4
  7. package/dist/index.mjs +11 -9
  8. package/dist/node/cli.mjs +9 -9
  9. package/dist/node.d.mts +2 -2
  10. package/dist/node.d.ts +2 -2
  11. package/dist/node.mjs +7 -7
  12. package/dist/shared/{vite-react-ssg.Cm9gBlfg.d.ts → vite-react-ssg.-NlgsPvg.d.mts} +8 -8
  13. package/dist/shared/{vite-react-ssg.Cm9gBlfg.d.mts → vite-react-ssg.-NlgsPvg.d.ts} +8 -8
  14. package/dist/shared/{vite-react-ssg.BgawrvuJ.mjs → vite-react-ssg.2P3UhU88.mjs} +216 -212
  15. package/dist/shared/{vite-react-ssg.C0y5wbxl.mjs → vite-react-ssg.C_MPXL9p.mjs} +1 -1
  16. package/dist/shared/{vite-react-ssg.CfJcpdWF.mjs → vite-react-ssg.Dx4ca9OM.mjs} +18 -4
  17. package/dist/tanstack.d.mts +5 -4
  18. package/dist/tanstack.d.ts +5 -4
  19. package/dist/tanstack.mjs +9 -7
  20. package/package.json +32 -33
  21. package/dist/chunks/jsdomGlobal.cjs +0 -36
  22. package/dist/client/single-page.cjs +0 -75
  23. package/dist/client/single-page.d.cts +0 -11
  24. package/dist/index.cjs +0 -196
  25. package/dist/index.d.cts +0 -20
  26. package/dist/node/cli.cjs +0 -89
  27. package/dist/node/cli.d.cts +0 -2
  28. package/dist/node.cjs +0 -24
  29. package/dist/node.d.cts +0 -11
  30. package/dist/shared/vite-react-ssg.B4jDfvXh.cjs +0 -106
  31. package/dist/shared/vite-react-ssg.C2GpVZF1.cjs +0 -38
  32. package/dist/shared/vite-react-ssg.CFQGqC60.cjs +0 -36
  33. package/dist/shared/vite-react-ssg.CjsEygxB.cjs +0 -37
  34. package/dist/shared/vite-react-ssg.Cm9gBlfg.d.cts +0 -15
  35. package/dist/shared/vite-react-ssg.D5xBH08M.cjs +0 -1079
  36. package/dist/shared/vite-react-ssg.DWHmkjdM.cjs +0 -35
  37. package/dist/shared/vite-react-ssg.Di0pROyF.d.ts +0 -214
  38. package/dist/style-collectors/styled-components.cjs +0 -20
  39. package/dist/style-collectors/styled-components.d.cts +0 -9
  40. package/dist/tanstack.cjs +0 -144
  41. package/dist/tanstack.d.cts +0 -30
  42. package/dist/shared/{vite-react-ssg.Di0pROyF.d.cts → vite-react-ssg.BrImbdZU.d.mts} +1 -1
  43. package/dist/shared/{vite-react-ssg.Di0pROyF.d.mts → vite-react-ssg.BrImbdZU.d.ts} +1 -1
@@ -1,89 +1,81 @@
1
- import { join, isAbsolute, parse, dirname } from 'node:path';
2
1
  import { createRequire } from 'node:module';
2
+ import { join, isAbsolute, parse, dirname } from 'node:path';
3
+ import fs from 'fs-extra';
4
+ import { JSDOM } from 'jsdom';
3
5
  import { gray, yellow, blue, dim, cyan, red, green, reset, bold, bgLightCyan } from 'kolorist';
4
6
  import PQueue from 'p-queue';
5
- import fs from 'fs-extra';
6
7
  import { resolveConfig, createLogger, build as build$1, mergeConfig, version as version$1, send, createServer } from 'vite';
7
- import { JSDOM } from 'jsdom';
8
- import { s as serializeState } from './vite-react-ssg.C6pK7rvr.mjs';
9
8
  import { a as withTrailingSlash, r as removeLeadingSlash, w as withLeadingSlash, s as stripBase, j as joinUrlSegments } from './vite-react-ssg.CjIppNIS.mjs';
9
+ import { s as serializeState } from './vite-react-ssg.C6pK7rvr.mjs';
10
10
  import { jsx, Fragment } from 'react/jsx-runtime';
11
11
  import { HelmetProvider } from 'react-helmet-async';
12
- import { Writable, Readable } from 'node:stream';
13
- import * as ReactDomServer from 'react-dom/server';
14
12
  import { once } from 'node:events';
15
- import { c as convertRoutesToDataRoutes } from './vite-react-ssg.C0y5wbxl.mjs';
13
+ import { Readable, Writable } from 'node:stream';
14
+ import { c as convertRoutesToDataRoutes } from './vite-react-ssg.C_MPXL9p.mjs';
15
+ import * as ReactDomServer from 'react-dom/server';
16
16
  import { M as META_CONTAINER_ID } from './vite-react-ssg.B-j07kW6.mjs';
17
17
 
18
- const version = "0.8.3";
19
-
20
- function buildLog(text, count) {
21
- console.log(`
22
- ${gray("[vite-react-ssg]")} ${yellow(text)}${count ? blue(` (${count})`) : ""}`);
23
- }
24
- function getSize(str) {
25
- return `${(str.length / 1024).toFixed(2)} KiB`;
26
- }
27
- async function routesToPaths(routes) {
28
- if (!routes || routes.length === 0)
29
- return { paths: ["/"] };
30
- const paths = /* @__PURE__ */ new Set();
31
- const getPaths = async (routes2, prefix = "") => {
32
- prefix = prefix.replace(/\/$/g, "");
33
- for (let route of routes2) {
34
- if (route.lazy) {
35
- const lazyData = await route.lazy();
36
- if (lazyData) {
37
- route = {
38
- ...route,
39
- ...lazyData
40
- };
41
- }
42
- }
43
- let path = route.path;
44
- path = handlePath(path, prefix);
45
- if (route.getStaticPaths && isDynamicSegmentsRoute(path)) {
46
- const staticPaths = await route.getStaticPaths();
47
- for (let staticPath of staticPaths) {
48
- staticPath = handlePath(staticPath, prefix);
49
- if (Array.isArray(route.children))
50
- await getPaths(route.children, staticPath);
51
- }
52
- }
53
- if (route.index && !path) {
54
- paths.add("/");
55
- }
56
- if (Array.isArray(route.children))
57
- await getPaths(route.children, path);
18
+ const DYNAMIC_IMPORT_REGEX = /import\("([^)]+)"\)/g;
19
+ async function collectAssets({
20
+ routes,
21
+ locationArg,
22
+ base,
23
+ serverManifest,
24
+ manifest,
25
+ ssrManifest
26
+ }) {
27
+ const { matchRoutes } = await import('react-router-dom');
28
+ const matches = matchRoutes([...routes], locationArg, base);
29
+ const routeEntries = matches?.map((item) => item.route.entry).filter(Boolean) ?? [];
30
+ const dynamicImports = /* @__PURE__ */ new Set();
31
+ matches?.forEach((item) => {
32
+ let lazyStr = "";
33
+ if (item.route.lazy) {
34
+ lazyStr += item.route.lazy.toString();
58
35
  }
59
- };
60
- await getPaths(routes);
61
- return { paths: Array.from(paths) };
62
- function handlePath(path, prefix) {
63
- if (path != null) {
64
- path = prefix && !path.startsWith("/") ? `${prefix}${path ? `/${path}` : ""}` : path;
65
- paths.add(path);
36
+ if (item.route.Component?._payload?._result) {
37
+ lazyStr += item.route.Component._payload._result.toString();
66
38
  }
67
- return path;
68
- }
69
- }
70
- async function resolveAlias(config, entry) {
71
- const resolver = config.createResolver();
72
- const result = await resolver(entry, config.root);
73
- return result || join(config.root, entry);
39
+ const match = lazyStr.matchAll(DYNAMIC_IMPORT_REGEX);
40
+ for (const m of match) {
41
+ dynamicImports.add(m[1].split("/").at(-1) ?? "");
42
+ }
43
+ });
44
+ const entries = /* @__PURE__ */ new Set();
45
+ routeEntries.forEach((e) => entries.add(e));
46
+ const manifestEntries = [...Object.entries(serverManifest)];
47
+ dynamicImports.forEach((name) => {
48
+ const result = manifestEntries.find(([_, value]) => value.file.endsWith(name));
49
+ if (result) {
50
+ entries.add(result[0]);
51
+ }
52
+ });
53
+ const modules = collectModulesForEntries(manifest, entries);
54
+ const assets = /* @__PURE__ */ new Set();
55
+ Array.from(modules).forEach((id) => {
56
+ const files = ssrManifest[id] || [];
57
+ files.forEach((file) => {
58
+ assets.add(file);
59
+ });
60
+ });
61
+ return assets;
74
62
  }
75
- function createRequest(path) {
76
- const url = new URL(path, "http://vite-react-ssg.com");
77
- url.search = "";
78
- url.hash = "";
79
- url.pathname = path;
80
- return new Request(url.href);
63
+ function collectModulesForEntries(manifest, entries) {
64
+ const mods = /* @__PURE__ */ new Set();
65
+ if (!entries)
66
+ return mods;
67
+ for (const entry of entries)
68
+ collectModules(manifest, entry, mods);
69
+ return mods;
81
70
  }
82
- const dynamicRE = /[:*?]/;
83
- function isDynamicSegmentsRoute(route) {
84
- if (!route)
85
- return false;
86
- return dynamicRE.test(route);
71
+ function collectModules(manifest, entry, mods = /* @__PURE__ */ new Set()) {
72
+ if (!entry)
73
+ return mods;
74
+ mods.add(entry);
75
+ manifest[entry]?.dynamicImports?.forEach((item) => {
76
+ collectModules(manifest, item, mods);
77
+ });
78
+ return mods;
87
79
  }
88
80
 
89
81
  async function getBeastiesOrCritters(outDir, options = {}) {
@@ -111,7 +103,7 @@ async function getBeastiesOrCritters(outDir, options = {}) {
111
103
  ...options
112
104
  });
113
105
  } catch (e) {
114
- return void 0;
106
+ return undefined;
115
107
  }
116
108
  }
117
109
 
@@ -233,138 +225,6 @@ function appendLink(document, attrs) {
233
225
  document.head.appendChild(link);
234
226
  }
235
227
 
236
- const DYNAMIC_IMPORT_REGEX = /import\("([^)]+)"\)/g;
237
- async function collectAssets({
238
- routes,
239
- locationArg,
240
- base,
241
- serverManifest,
242
- manifest,
243
- ssrManifest
244
- }) {
245
- const { matchRoutes } = await import('react-router-dom');
246
- const matches = matchRoutes([...routes], locationArg, base);
247
- const routeEntries = matches?.map((item) => item.route.entry).filter(Boolean) ?? [];
248
- const dynamicImports = /* @__PURE__ */ new Set();
249
- matches?.forEach((item) => {
250
- let lazyStr = "";
251
- if (item.route.lazy) {
252
- lazyStr += item.route.lazy.toString();
253
- }
254
- if (item.route.Component?._payload?._result) {
255
- lazyStr += item.route.Component._payload._result.toString();
256
- }
257
- const match = lazyStr.matchAll(DYNAMIC_IMPORT_REGEX);
258
- for (const m of match) {
259
- dynamicImports.add(m[1].split("/").at(-1) ?? "");
260
- }
261
- });
262
- const entries = /* @__PURE__ */ new Set();
263
- routeEntries.forEach((e) => entries.add(e));
264
- const manifestEntries = [...Object.entries(serverManifest)];
265
- dynamicImports.forEach((name) => {
266
- const result = manifestEntries.find(([_, value]) => value.file.endsWith(name));
267
- if (result) {
268
- entries.add(result[0]);
269
- }
270
- });
271
- const modules = collectModulesForEntries(manifest, entries);
272
- const assets = /* @__PURE__ */ new Set();
273
- Array.from(modules).forEach((id) => {
274
- const files = ssrManifest[id] || [];
275
- files.forEach((file) => {
276
- assets.add(file);
277
- });
278
- });
279
- return assets;
280
- }
281
- function collectModulesForEntries(manifest, entries) {
282
- const mods = /* @__PURE__ */ new Set();
283
- if (!entries)
284
- return mods;
285
- for (const entry of entries)
286
- collectModules(manifest, entry, mods);
287
- return mods;
288
- }
289
- function collectModules(manifest, entry, mods = /* @__PURE__ */ new Set()) {
290
- if (!entry)
291
- return mods;
292
- mods.add(entry);
293
- manifest[entry]?.dynamicImports?.forEach((item) => {
294
- collectModules(manifest, item, mods);
295
- });
296
- return mods;
297
- }
298
-
299
- async function renderStaticApp(app) {
300
- if (!ReactDomServer.renderToPipeableStream) {
301
- return ReactDomServer.renderToString(/* @__PURE__ */ jsx(Fragment, { children: app }));
302
- }
303
- const writableStream = new WritableAsPromise();
304
- const { pipe } = ReactDomServer.renderToPipeableStream(app, {
305
- onError(error) {
306
- writableStream.destroy(error);
307
- },
308
- onAllReady() {
309
- pipe(writableStream);
310
- }
311
- });
312
- return writableStream.getPromise();
313
- }
314
- class WritableAsPromise extends Writable {
315
- _output;
316
- _deferred;
317
- constructor() {
318
- super();
319
- this._output = "";
320
- this._deferred = {
321
- promise: null,
322
- resolve: () => null,
323
- reject: () => null
324
- };
325
- this._deferred.promise = new Promise((resolve, reject) => {
326
- this._deferred.resolve = resolve;
327
- this._deferred.reject = reject;
328
- });
329
- }
330
- _write(chunk, _enc, next) {
331
- this._output += chunk.toString();
332
- next();
333
- }
334
- _destroy(error, next) {
335
- if (error instanceof Error)
336
- this._deferred.reject(error);
337
- else
338
- next();
339
- }
340
- end() {
341
- this._deferred.resolve(this._output);
342
- return this.destroy();
343
- }
344
- getPromise() {
345
- return this._deferred.promise;
346
- }
347
- }
348
-
349
- function extractHelmet(context, styleCollector) {
350
- const { helmet } = context;
351
- const htmlAttributes = helmet.htmlAttributes.toString();
352
- const bodyAttributes = helmet.bodyAttributes.toString();
353
- let titleString = helmet.title.toString();
354
- if (titleString.split(">")[1] === "</title") {
355
- titleString = "";
356
- }
357
- const metaStrings = [
358
- titleString,
359
- helmet.meta.toString(),
360
- helmet.link.toString(),
361
- helmet.script.toString()
362
- ];
363
- const styleTag = styleCollector?.toString?.("") ?? "";
364
- const metaAttributes = metaStrings.filter(Boolean);
365
- return { htmlAttributes, bodyAttributes, metaAttributes, styleTag };
366
- }
367
-
368
228
  function invariant(value, message) {
369
229
  if (value === false || value === null || typeof value === "undefined") {
370
230
  console.error(
@@ -417,7 +277,7 @@ async function toNodeRequest(res, nodeRes) {
417
277
  }
418
278
  }
419
279
  function json(data, init) {
420
- if (init === void 0) {
280
+ if (init === undefined) {
421
281
  init = {};
422
282
  }
423
283
  const responseInit = typeof init === "number" ? {
@@ -447,6 +307,146 @@ function stripDataParam(request) {
447
307
  return new Request(url.href, init);
448
308
  }
449
309
 
310
+ async function renderStaticApp(app) {
311
+ if (!ReactDomServer.renderToPipeableStream) {
312
+ return ReactDomServer.renderToString(/* @__PURE__ */ jsx(Fragment, { children: app }));
313
+ }
314
+ const writableStream = new WritableAsPromise();
315
+ const { pipe } = ReactDomServer.renderToPipeableStream(app, {
316
+ onError(error) {
317
+ writableStream.destroy(error);
318
+ },
319
+ onAllReady() {
320
+ pipe(writableStream);
321
+ }
322
+ });
323
+ return writableStream.getPromise();
324
+ }
325
+ class WritableAsPromise extends Writable {
326
+ _output;
327
+ _deferred;
328
+ constructor() {
329
+ super();
330
+ this._output = "";
331
+ this._deferred = {
332
+ promise: null,
333
+ resolve: () => null,
334
+ reject: () => null
335
+ };
336
+ this._deferred.promise = new Promise((resolve, reject) => {
337
+ this._deferred.resolve = resolve;
338
+ this._deferred.reject = reject;
339
+ });
340
+ }
341
+ _write(chunk, _enc, next) {
342
+ this._output += chunk.toString();
343
+ next();
344
+ }
345
+ _destroy(error, next) {
346
+ if (error instanceof Error)
347
+ this._deferred.reject(error);
348
+ else
349
+ next();
350
+ }
351
+ end() {
352
+ this._deferred.resolve(this._output);
353
+ return this.destroy();
354
+ }
355
+ getPromise() {
356
+ return this._deferred.promise;
357
+ }
358
+ }
359
+
360
+ const version = "0.8.5-beta.1";
361
+
362
+ function buildLog(text, count) {
363
+ console.log(`
364
+ ${gray("[vite-react-ssg]")} ${yellow(text)}${count ? blue(` (${count})`) : ""}`);
365
+ }
366
+ function getSize(str) {
367
+ return `${(str.length / 1024).toFixed(2)} KiB`;
368
+ }
369
+ async function routesToPaths(routes) {
370
+ if (!routes || routes.length === 0)
371
+ return { paths: ["/"] };
372
+ const paths = /* @__PURE__ */ new Set();
373
+ const getPaths = async (routes2, prefix = "") => {
374
+ prefix = prefix.replace(/\/$/g, "");
375
+ for (let route of routes2) {
376
+ if (route.lazy) {
377
+ const lazyData = await route.lazy();
378
+ if (lazyData) {
379
+ route = {
380
+ ...route,
381
+ ...lazyData
382
+ };
383
+ }
384
+ }
385
+ let path = route.path;
386
+ path = handlePath(path, prefix);
387
+ if (route.getStaticPaths && isDynamicSegmentsRoute(path)) {
388
+ const staticPaths = await route.getStaticPaths();
389
+ for (let staticPath of staticPaths) {
390
+ staticPath = handlePath(staticPath, prefix);
391
+ if (Array.isArray(route.children))
392
+ await getPaths(route.children, staticPath);
393
+ }
394
+ }
395
+ if (route.index && !path) {
396
+ paths.add("/");
397
+ }
398
+ if (Array.isArray(route.children))
399
+ await getPaths(route.children, path);
400
+ }
401
+ };
402
+ await getPaths(routes);
403
+ return { paths: Array.from(paths) };
404
+ function handlePath(path, prefix) {
405
+ if (path != null) {
406
+ path = prefix && !path.startsWith("/") ? `${prefix}${path ? `/${path}` : ""}` : path;
407
+ paths.add(path);
408
+ }
409
+ return path;
410
+ }
411
+ }
412
+ async function resolveAlias(config, entry) {
413
+ const resolver = config.createResolver();
414
+ const result = await resolver(entry, config.root);
415
+ return result || join(config.root, entry);
416
+ }
417
+ function createRequest(path) {
418
+ const url = new URL(path, "http://vite-react-ssg.com");
419
+ url.search = "";
420
+ url.hash = "";
421
+ url.pathname = path;
422
+ return new Request(url.href);
423
+ }
424
+ const dynamicRE = /[:*?]/;
425
+ function isDynamicSegmentsRoute(route) {
426
+ if (!route)
427
+ return false;
428
+ return dynamicRE.test(route);
429
+ }
430
+
431
+ function extractHelmet(context, styleCollector) {
432
+ const { helmet } = context;
433
+ const htmlAttributes = helmet.htmlAttributes.toString();
434
+ const bodyAttributes = helmet.bodyAttributes.toString();
435
+ let titleString = helmet.title.toString();
436
+ if (titleString.split(">")[1] === "</title") {
437
+ titleString = "";
438
+ }
439
+ const metaStrings = [
440
+ titleString,
441
+ helmet.meta.toString(),
442
+ helmet.link.toString(),
443
+ helmet.script.toString()
444
+ ];
445
+ const styleTag = styleCollector?.toString?.("") ?? "";
446
+ const metaAttributes = metaStrings.filter(Boolean);
447
+ return { htmlAttributes, bodyAttributes, metaAttributes, styleTag };
448
+ }
449
+
450
450
  class RemixAdapter {
451
451
  context;
452
452
  constructor(context) {
@@ -528,7 +528,7 @@ async function callRouteLoader({
528
528
  request: stripDataParam(stripIndexParam(request)),
529
529
  params
530
530
  });
531
- if (result === void 0) {
531
+ if (result === undefined) {
532
532
  throw new Error(
533
533
  `You defined a loader for route "${routeId}" but didn't return anything from your \`loader\` function. Please return a value or \`null\`.`
534
534
  );
@@ -752,9 +752,11 @@ async function build(ssgOptions = {}, viteConfig = {}) {
752
752
  customLogger: clientLogger,
753
753
  mode: config.mode
754
754
  }));
755
+ let unmock = () => {
756
+ };
755
757
  if (mock) {
756
758
  const { jsdomGlobal } = await import('../chunks/jsdomGlobal.mjs');
757
- jsdomGlobal();
759
+ unmock = jsdomGlobal();
758
760
  }
759
761
  buildLog("Build for server...");
760
762
  process.env.VITE_SSG = "true";
@@ -786,7 +788,7 @@ async function build(ssgOptions = {}, viteConfig = {}) {
786
788
  }));
787
789
  const prefix = format === "esm" && process.platform === "win32" ? "file://" : "";
788
790
  const ext = format === "esm" ? ".mjs" : ".cjs";
789
- const serverEntry = join(prefix, ssgOut, parse(ssrEntry).name + ext);
791
+ const serverEntry = prefix + join(ssgOut, parse(ssrEntry).name + ext).replace(/\\/g, "/");
790
792
  const serverManifest = JSON.parse(await fs.readFile(join(ssgOut, ...dotVitedir, "manifest.json"), "utf-8"));
791
793
  const _require = createRequire(import.meta.url);
792
794
  const { createRoot, includedRoutes: serverEntryIncludedRoutes } = format === "esm" ? await import(serverEntry) : _require(serverEntry);
@@ -797,7 +799,7 @@ async function build(ssgOptions = {}, viteConfig = {}) {
797
799
  routesPaths = DefaultIncludedRoutes(routesPaths);
798
800
  routesPaths = Array.from(new Set(routesPaths));
799
801
  buildLog("Rendering Pages...", routesPaths.length);
800
- const beasties = beastiesOptions !== false ? await getBeastiesOrCritters(outDir, { publicPath: configBase, ...beastiesOptions }) : void 0;
802
+ const beasties = beastiesOptions !== false ? await getBeastiesOrCritters(outDir, { publicPath: configBase, ...beastiesOptions }) : undefined;
801
803
  if (beasties)
802
804
  console.log(`${gray("[vite-react-ssg]")} ${blue("Critical CSS generation enabled via `beasties`")}`);
803
805
  const ssrManifest = JSON.parse(await fs.readFile(join(out, ...dotVitedir, "ssr-manifest.json"), "utf-8"));
@@ -861,6 +863,7 @@ ${err.stack}`);
861
863
  `${dim(`${outDir}/`)}${cyan(`static-loader-data-manifest-${hash}.json`.padEnd(15, " "))} ${dim(getSize(staticLoaderDataManifestString))}`
862
864
  );
863
865
  await fs.remove(join(root, ".vite-react-ssg-temp"));
866
+ unmock();
864
867
  const pwaPlugin = config.plugins.find((i) => i.name === "vite-plugin-pwa")?.api;
865
868
  if (pwaPlugin && !pwaPlugin.disabled && pwaPlugin.generateSW) {
866
869
  buildLog("Regenerate PWA...");
@@ -913,13 +916,14 @@ function ssrServerPlugin({
913
916
  const appCtx = await createRoot(false, url);
914
917
  const adapter = getAdapter(appCtx);
915
918
  const { app, base } = appCtx;
916
- const searchParams = new URLSearchParams(url.split("?")[1]);
919
+ const [pathname, search] = url.split("?");
920
+ const searchParams = new URLSearchParams(search);
917
921
  if (!app && searchParams.has("_data")) {
918
922
  return adapter.handleLoader(req, res);
919
923
  }
920
924
  const indexHTML = await server.transformIndexHtml(url, template);
921
925
  const transformedIndexHTML = await onBeforePageRender?.(url, indexHTML, appCtx) || indexHTML;
922
- const { appHTML, bodyAttributes, htmlAttributes, metaAttributes, styleTag } = await adapter.render(stripBase(url, base));
926
+ const { appHTML, bodyAttributes, htmlAttributes, metaAttributes, styleTag } = await adapter.render(stripBase(pathname, base));
923
927
  metaAttributes.push(styleTag);
924
928
  const mods = await Promise.all(
925
929
  [ssrEntry, entry].map(async (entry2) => await server.moduleGraph.getModuleByUrl(entry2))
@@ -15,7 +15,7 @@ function convertRoutesToDataRoutes(routes, mapRouteProperties, parentPath = [])
15
15
  ...route,
16
16
  ...mapRouteProperties(route),
17
17
  id,
18
- children: void 0
18
+ children: undefined
19
19
  };
20
20
  if (route.children) {
21
21
  pathOrLayoutRoute.children = convertRoutesToDataRoutes(
@@ -8,10 +8,18 @@ const CopyReactDOM = {
8
8
  };
9
9
  const { version, render: reactRender, hydrate: reactHydrate } = CopyReactDOM;
10
10
  const isReact18 = Number((version || "").split(".")[0]) > 17;
11
+ const isReact19 = Number((version || "").split(".")[0]) > 18;
11
12
  function render(app, container, renderOptions = {}) {
12
13
  const { useLegacyRender } = renderOptions;
13
14
  if (useLegacyRender || !isReact18) {
14
15
  reactRender(app, container);
16
+ } else if (isReact19) {
17
+ import('react-dom/client').then(({ createRoot }) => {
18
+ const root = createRoot(container);
19
+ React.startTransition(() => {
20
+ root.render(app);
21
+ });
22
+ });
15
23
  } else {
16
24
  CopyReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint = true;
17
25
  const { createRoot } = CopyReactDOM;
@@ -29,6 +37,12 @@ function hydrate(app, container, renderOptions = {}) {
29
37
  const { useLegacyRender } = renderOptions;
30
38
  if (useLegacyRender || !isReact18) {
31
39
  reactHydrate(app, container);
40
+ } else if (isReact19) {
41
+ import('react-dom/client').then(({ hydrateRoot }) => {
42
+ React.startTransition(() => {
43
+ hydrateRoot(container, app);
44
+ });
45
+ });
32
46
  } else {
33
47
  CopyReactDOM.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint = true;
34
48
  const { hydrateRoot } = CopyReactDOM;
@@ -51,10 +65,6 @@ function documentReady(_passThrough) {
51
65
  return Promise.resolve(_passThrough);
52
66
  }
53
67
 
54
- function Head(props) {
55
- return /* @__PURE__ */ jsx(Helmet, { ...props });
56
- }
57
-
58
68
  function useIsClient() {
59
69
  const [isBrowser, setIsBrowser] = useState(false);
60
70
  useEffect(() => {
@@ -80,4 +90,8 @@ Current type: ${isValidElement(children) ? "React element" : typeof children}`
80
90
  return fallback ?? null;
81
91
  }
82
92
 
93
+ function Head(props) {
94
+ return /* @__PURE__ */ jsx(Helmet, { ...props });
95
+ }
96
+
83
97
  export { ClientOnly as C, Head as H, documentReady as d, hydrate as h, render as r };
@@ -1,10 +1,10 @@
1
1
  import { AnyRouter } from '@tanstack/react-router';
2
- import { V as ViteReactSSGContext$1, a as ViteReactSSGClientOptions } from './shared/vite-react-ssg.Di0pROyF.mjs';
3
- export { C as CrittersOptions, I as IndexRouteRecord, N as NonIndexRouteRecord, R as RouteRecord, c as RouterFutureConfig, S as StyleCollector, b as ViteReactSSGOptions } from './shared/vite-react-ssg.Di0pROyF.mjs';
4
- export { C as ClientOnly, H as Head } from './shared/vite-react-ssg.Cm9gBlfg.mjs';
2
+ import { V as ViteReactSSGContext$1, a as ViteReactSSGClientOptions } from './shared/vite-react-ssg.BrImbdZU.mjs';
3
+ export { C as CrittersOptions, I as IndexRouteRecord, N as NonIndexRouteRecord, R as RouteRecord, c as RouterFutureConfig, S as StyleCollector, b as ViteReactSSGOptions } from './shared/vite-react-ssg.BrImbdZU.mjs';
4
+ export { C as ClientOnly, H as Head } from './shared/vite-react-ssg.-NlgsPvg.mjs';
5
+ import 'beasties';
5
6
  import 'react';
6
7
  import 'react-router-dom';
7
- import 'beasties';
8
8
  import 'react-helmet-async';
9
9
 
10
10
  declare function registerPaths(id: string, getStaticPaths: () => string[] | Promise<string[]>): void;
@@ -24,6 +24,7 @@ declare global {
24
24
  interface Window {
25
25
  __VITE_REACT_SSG_STATIC_LOADER_DATA__: any;
26
26
  __VITE_REACT_SSG_HASH__: string;
27
+ __VITE_REACT_SSG_CONTEXT__: ViteReactSSGContext<true>;
27
28
  }
28
29
  }
29
30
 
@@ -1,10 +1,10 @@
1
1
  import { AnyRouter } from '@tanstack/react-router';
2
- import { V as ViteReactSSGContext$1, a as ViteReactSSGClientOptions } from './shared/vite-react-ssg.Di0pROyF.js';
3
- export { C as CrittersOptions, I as IndexRouteRecord, N as NonIndexRouteRecord, R as RouteRecord, c as RouterFutureConfig, S as StyleCollector, b as ViteReactSSGOptions } from './shared/vite-react-ssg.Di0pROyF.js';
4
- export { C as ClientOnly, H as Head } from './shared/vite-react-ssg.Cm9gBlfg.js';
2
+ import { V as ViteReactSSGContext$1, a as ViteReactSSGClientOptions } from './shared/vite-react-ssg.BrImbdZU.js';
3
+ export { C as CrittersOptions, I as IndexRouteRecord, N as NonIndexRouteRecord, R as RouteRecord, c as RouterFutureConfig, S as StyleCollector, b as ViteReactSSGOptions } from './shared/vite-react-ssg.BrImbdZU.js';
4
+ export { C as ClientOnly, H as Head } from './shared/vite-react-ssg.-NlgsPvg.js';
5
+ import 'beasties';
5
6
  import 'react';
6
7
  import 'react-router-dom';
7
- import 'beasties';
8
8
  import 'react-helmet-async';
9
9
 
10
10
  declare function registerPaths(id: string, getStaticPaths: () => string[] | Promise<string[]>): void;
@@ -24,6 +24,7 @@ declare global {
24
24
  interface Window {
25
25
  __VITE_REACT_SSG_STATIC_LOADER_DATA__: any;
26
26
  __VITE_REACT_SSG_HASH__: string;
27
+ __VITE_REACT_SSG_CONTEXT__: ViteReactSSGContext<true>;
27
28
  }
28
29
  }
29
30
 
package/dist/tanstack.mjs CHANGED
@@ -1,13 +1,13 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
- import { HelmetProvider } from 'react-helmet-async';
3
2
  import { RouterProvider } from '@tanstack/react-router';
4
3
  import { Meta, StartClient } from '@tanstack/start';
5
- import { r as render, h as hydrate, d as documentReady } from './shared/vite-react-ssg.CfJcpdWF.mjs';
6
- export { C as ClientOnly, H as Head } from './shared/vite-react-ssg.CfJcpdWF.mjs';
4
+ import { HelmetProvider } from 'react-helmet-async';
5
+ import { r as render, h as hydrate, d as documentReady } from './shared/vite-react-ssg.Dx4ca9OM.mjs';
6
+ export { C as ClientOnly, H as Head } from './shared/vite-react-ssg.Dx4ca9OM.mjs';
7
+ import { j as joinUrlSegments, w as withLeadingSlash, s as stripBase } from './shared/vite-react-ssg.CjIppNIS.mjs';
7
8
  import { d as deserializeState } from './shared/vite-react-ssg.C6pK7rvr.mjs';
8
9
  import { M as META_CONTAINER_ID, c as convertRouteTreeToRouteOption } from './shared/vite-react-ssg.B-j07kW6.mjs';
9
10
  export { r as registerPaths } from './shared/vite-react-ssg.B-j07kW6.mjs';
10
- import { j as joinUrlSegments, w as withLeadingSlash, s as stripBase } from './shared/vite-react-ssg.CjIppNIS.mjs';
11
11
  import 'react';
12
12
  import 'react-dom';
13
13
 
@@ -19,7 +19,7 @@ function Experimental_ViteReactSSG(routerOptions, fn, options = {}) {
19
19
  ssrWhenDev,
20
20
  getStyleCollector = null
21
21
  } = options;
22
- if (process.env.NODE_ENV === "development" && ssrWhenDev !== void 0)
22
+ if (process.env.NODE_ENV === "development" && ssrWhenDev !== undefined)
23
23
  console.warn("[vite-react-ssg] `ssrWhenDev` option is no longer needed. If you want to use csr, just replace `vite-react-ssg dev` with `vite`.");
24
24
  const isClient = typeof window !== "undefined";
25
25
  const BASE_URL = routerOptions.basename ?? "/";
@@ -71,7 +71,7 @@ function Experimental_ViteReactSSG(routerOptions, fn, options = {}) {
71
71
  const routeData = staticLoadData?.[pathname]?.find((item) => item.id === node.id);
72
72
  return routeData?.loaderData ?? null;
73
73
  };
74
- } : void 0
74
+ } : undefined
75
75
  );
76
76
  const router = routerOptions.router;
77
77
  router.options.isServer = !client;
@@ -118,7 +118,9 @@ function Experimental_ViteReactSSG(routerOptions, fn, options = {}) {
118
118
  console.warn("[vite-react-ssg] Root container not found.");
119
119
  return;
120
120
  }
121
- const { router } = await createRoot(true);
121
+ const context = await createRoot(true);
122
+ window.__VITE_REACT_SSG_CONTEXT__ = context;
123
+ const { router } = context;
122
124
  const isSSR = document.querySelector("[data-server-rendered=true]") !== null;
123
125
  if (!isSSR && process.env.NODE_ENV === "development") {
124
126
  render(