vike-lite 1.0.12 → 1.0.14

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.
@@ -1,15 +1,12 @@
1
- import { t as RenderContext } from "../index-Ck5rzSdQ.mjs";
1
+ import { r as Manifest } from "../index-B6dJFVs8.mjs";
2
+ import { t as Config } from "../index-kftPCG4J.mjs";
2
3
 
3
4
  //#region src/server/store.d.ts
4
5
  interface VikeState {
5
6
  routes: any[];
6
7
  errorRoute: any | null;
7
- config: {
8
- onRenderHtml: () => Promise<{
9
- default: (ctx: RenderContext) => Promise<string>;
10
- }>;
11
- } | null;
12
- manifest: Record<string, any> | undefined;
8
+ config: Config | null;
9
+ manifest: Manifest | undefined;
13
10
  }
14
11
  declare const store: VikeState;
15
12
  declare function setVikeState(newState: Partial<VikeState>): void;
@@ -1,2 +1,2 @@
1
- import { n as matchRoute, t as RenderContext } from "../index-Ck5rzSdQ.mjs";
2
- export { RenderContext, matchRoute };
1
+ import { n as RenderContext, r as matchRoute, t as Config } from "../index-kftPCG4J.mjs";
2
+ export { Config, RenderContext, matchRoute };
@@ -0,0 +1,29 @@
1
+ //#region src/index.d.ts
2
+ type PageContext<Data = unknown> = {
3
+ routeParams: Record<string, string>;
4
+ urlOriginal: string;
5
+ urlPathname: string;
6
+ data?: Data;
7
+ title?: string;
8
+ is404?: boolean;
9
+ is500?: boolean;
10
+ errorMessage?: string;
11
+ };
12
+ type DataAsync<Data = unknown> = (pageContext: PageContext) => Promise<Data>;
13
+ type DataSync<Data = unknown> = (pageContext: PageContext) => Data;
14
+ type Route = {
15
+ path: string;
16
+ page: string;
17
+ layout?: string;
18
+ head?: string;
19
+ hasData?: boolean;
20
+ hasTitle?: boolean;
21
+ };
22
+ type Manifest = Record<string, {
23
+ file: string;
24
+ css?: string[];
25
+ imports?: string[];
26
+ isEntry?: boolean;
27
+ }>;
28
+ //#endregion
29
+ export { Route as a, PageContext as i, DataSync as n, Manifest as r, DataAsync as t };
@@ -0,0 +1,33 @@
1
+ //#region src/shared/matchRoute.d.ts
2
+ declare function matchRoute(urlPathname: string, routes: typeof import('virtual:routes').routes): {
3
+ route: any;
4
+ routeParams: Record<string, string>;
5
+ } | null;
6
+ //#endregion
7
+ //#region src/shared/index.d.ts
8
+ interface RenderContext {
9
+ pageContext: any;
10
+ Page: unknown;
11
+ Head?: unknown;
12
+ Layout?: unknown;
13
+ pageTitleTag: string;
14
+ serializedContext: string;
15
+ assets: {
16
+ cssLinks: string;
17
+ jsPreloads: string;
18
+ entryClient: string;
19
+ };
20
+ }
21
+ type Config = {
22
+ onRenderHtml: () => Promise<{
23
+ default: (ctx: RenderContext) => Promise<string>;
24
+ }>;
25
+ onRenderClient: () => Promise<{
26
+ default: (opts: {
27
+ routes: any[];
28
+ errorRoute: any;
29
+ }) => void;
30
+ }>;
31
+ };
32
+ //#endregion
33
+ export { RenderContext as n, matchRoute as r, Config as t };
package/dist/index.d.mts CHANGED
@@ -1,65 +1,2 @@
1
- //#region src/index.d.ts
2
- type PageContext<Data = unknown> = {
3
- routeParams: Record<string, string>;
4
- urlOriginal: string;
5
- urlPathname: string;
6
- data?: Data;
7
- title?: string;
8
- is404?: boolean;
9
- is500?: boolean;
10
- errorMessage?: string;
11
- };
12
- type DataAsync<Data = unknown> = (pageContext: PageContext) => Promise<Data>;
13
- type DataSync<Data = unknown> = (pageContext: PageContext) => Data;
14
- type Route = {
15
- path: string;
16
- page: string;
17
- layout?: string;
18
- head?: string;
19
- hasData?: boolean;
20
- hasTitle?: boolean;
21
- };
22
- type Manifest = Record<string, {
23
- file: string;
24
- css?: string[];
25
- imports?: string[];
26
- }>;
27
- declare module 'virtual:routes' {
28
- type Imported<Name extends string, T> = () => Promise<({ [K in Name]: T } & {
29
- default?: T;
30
- }) | ({ [K in Name]?: T } & {
31
- default: T;
32
- })>;
33
- const config: {
34
- onRenderClient: () => Promise<{
35
- onRenderClient: () => void;
36
- }>;
37
- onRenderHtml: () => Promise<{
38
- onRenderHtml: (pageContext: any) => string;
39
- }>;
40
- };
41
- const routes: Array<{
42
- path: string;
43
- page: string;
44
- hasData: boolean;
45
- hasTitle: boolean;
46
- Page: Imported<'Page', HTMLElement>;
47
- Head?: Imported<'Head', HTMLElement>;
48
- Layout?: Imported<'Layout', HTMLElement>;
49
- data?: Imported<'data', (pageContext: PageContext) => Promise<PageContext['data']>>;
50
- title?: Imported<'title', string | ((pageContext: PageContext) => string)>;
51
- }>;
52
- const errorRoute: {
53
- path: string;
54
- page: string;
55
- Page: Imported<'Page', HTMLElement>;
56
- Head?: Imported<'Head', HTMLElement>;
57
- Layout?: Imported<'Layout', HTMLElement>;
58
- };
59
- }
60
- declare module 'virtual:client-manifest' {
61
- const manifest: Manifest;
62
- export default manifest;
63
- }
64
- //#endregion
65
- export { DataAsync, DataSync, PageContext, Route };
1
+ import { a as Route, i as PageContext, n as DataSync, r as Manifest, t as DataAsync } from "./index-B6dJFVs8.mjs";
2
+ export { DataAsync, DataSync, Manifest, PageContext, Route };
package/dist/server.mjs CHANGED
@@ -1,5 +1,18 @@
1
1
  import { t as matchRoute } from "./matchRoute-BONrLRYy.mjs";
2
2
  import { n as store } from "./store-BRWiOtOy.mjs";
3
+ //#region src/utils/serializeContext.ts
4
+ const ESCAPE_LOOKUP = {
5
+ "&": String.raw`\u0026`,
6
+ ">": String.raw`\u003e`,
7
+ "<": String.raw`\u003c`,
8
+ "\u2028": String.raw`\u2028`,
9
+ "\u2029": String.raw`\u2029`
10
+ };
11
+ const ESCAPE_REGEX = /[&><\u{2028}\u{2029}]/gu;
12
+ function serializeContext(data) {
13
+ return JSON.stringify(data).replaceAll(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]);
14
+ }
15
+ //#endregion
3
16
  //#region src/server/abort.ts
4
17
  var AbortRender = class extends Error {
5
18
  statusCode;
@@ -13,18 +26,6 @@ var AbortRender = class extends Error {
13
26
  //#endregion
14
27
  //#region src/server/renderPage.tsx
15
28
  const isProd = process.env.NODE_ENV === "production";
16
- const virtualEntryClientId = "virtual:entry-client";
17
- const ESCAPE_LOOKUP = {
18
- "&": String.raw`\u0026`,
19
- ">": String.raw`\u003e`,
20
- "<": String.raw`\u003c`,
21
- "\u2028": String.raw`\u2028`,
22
- "\u2029": String.raw`\u2029`
23
- };
24
- const ESCAPE_REGEX = /[&><\u{2028}\u{2029}]/gu;
25
- function serializeContext(data) {
26
- return JSON.stringify(data).replaceAll(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]);
27
- }
28
29
  function getAssets(pageModuleId) {
29
30
  if (!isProd) return {
30
31
  cssLinks: "",
@@ -33,7 +34,11 @@ function getAssets(pageModuleId) {
33
34
  };
34
35
  const cssFiles = /* @__PURE__ */ new Set();
35
36
  const jsFiles = /* @__PURE__ */ new Set();
36
- const manifest = store.manifest;
37
+ const { manifest } = store;
38
+ function getVirtualEntryClientKey() {
39
+ for (const key in manifest) if (manifest[key].isEntry) return key;
40
+ throw new Error("entry-client not found in manifest");
41
+ }
37
42
  function collectAssets(key) {
38
43
  const chunk = manifest[key];
39
44
  if (!chunk) throw new Error(`Asset not found in manifest for key: ${key}`);
@@ -41,22 +46,23 @@ function getAssets(pageModuleId) {
41
46
  if (chunk.css) for (const css of chunk.css) cssFiles.add(css);
42
47
  if (chunk.imports) for (const imp of chunk.imports) collectAssets(imp);
43
48
  }
44
- collectAssets(virtualEntryClientId);
49
+ const virtualEntryClientKey = getVirtualEntryClientKey();
50
+ collectAssets(virtualEntryClientKey);
45
51
  collectAssets(pageModuleId.replace("@/", ""));
46
52
  return {
47
53
  cssLinks: [...cssFiles].map((href) => `<link rel="stylesheet" href="/${href}">`).join(""),
48
54
  jsPreloads: [...jsFiles].map((href) => `<link rel="modulepreload" href="/${href}">`).join(""),
49
- entryClient: "/" + manifest[virtualEntryClientId].file
55
+ entryClient: "/" + manifest[virtualEntryClientKey].file
50
56
  };
51
57
  }
52
- async function buildPageContext(pathname, fullUrl, isJsonRequest) {
53
- const matched = matchRoute(pathname, store.routes);
58
+ async function buildPageContext(urlPathname, urlOriginal, isJsonRequest) {
59
+ const matched = matchRoute(urlPathname, store.routes);
54
60
  if (!matched) return null;
55
61
  const { route, routeParams } = matched;
56
62
  const pageContext = {
57
63
  routeParams,
58
- urlOriginal: fullUrl,
59
- urlPathname: pathname
64
+ urlOriginal,
65
+ urlPathname
60
66
  };
61
67
  const [dataMod, titleMod, PageModule, HeadModule, LayoutModule] = await Promise.all([
62
68
  route.data?.() ?? null,
@@ -68,14 +74,14 @@ async function buildPageContext(pathname, fullUrl, isJsonRequest) {
68
74
  if (dataMod) try {
69
75
  pageContext.data = await (dataMod.data ?? dataMod.default)(pageContext);
70
76
  } catch (error) {
71
- console.error("+data hook failed at:", pathname);
77
+ console.error("+data hook failed at:", urlPathname);
72
78
  throw error;
73
79
  }
74
80
  if (titleMod) try {
75
81
  const titleFn = titleMod.title ?? titleMod.default;
76
82
  pageContext.title = typeof titleFn === "function" ? titleFn(pageContext) : titleFn;
77
83
  } catch (error) {
78
- console.error("+title hook failed at:", pathname);
84
+ console.error("+title hook failed at:", urlPathname);
79
85
  throw error;
80
86
  }
81
87
  return {
@@ -89,7 +95,7 @@ async function buildPageContext(pathname, fullUrl, isJsonRequest) {
89
95
  async function renderErrorPage(req, status, originalPathname, error) {
90
96
  if (!store.errorRoute) return new Response(status === 404 ? "Not Found" : "Internal Server Error", { status });
91
97
  try {
92
- const { onRenderHtml } = await store.config.onRenderHtml();
98
+ const { default: onRenderHtml } = await store.config.onRenderHtml();
93
99
  const [PageModule, HeadModule, LayoutModule] = await Promise.all([
94
100
  store.errorRoute.Page(),
95
101
  store.errorRoute.Head?.() ?? null,
@@ -137,7 +143,7 @@ async function renderPage(req) {
137
143
  }
138
144
  const { pageContext, route, PageModule, HeadModule, LayoutModule } = resolved;
139
145
  if (isJsonRequest) return Response.json(pageContext);
140
- const { onRenderHtml } = await store.config.onRenderHtml();
146
+ const { default: onRenderHtml } = await store.config.onRenderHtml();
141
147
  const html = await onRenderHtml({
142
148
  pageContext,
143
149
  Page: PageModule.Page ?? PageModule.default,
package/dist/vite.mjs CHANGED
@@ -201,6 +201,13 @@ function routerPlugin({ pagesDir = "pages", serverEntry = "server/index.ts", api
201
201
  server.middlewares.use(async (req, res, next) => {
202
202
  try {
203
203
  const ssrEnv = server.environments.ssr;
204
+ const { routes, errorRoute, config } = await ssrEnv.runner.import(virtualModuleId);
205
+ const { setVikeState } = await ssrEnv.runner.import("vike-lite/__internal/server");
206
+ setVikeState({
207
+ routes,
208
+ errorRoute,
209
+ config
210
+ });
204
211
  const absoluteServerEntry = path.join(viteConfigRoot, serverEntry);
205
212
  const { default: app } = await ssrEnv.runner.import(absoluteServerEntry);
206
213
  const headers = new Headers();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike-lite",
3
- "version": "1.0.12",
3
+ "version": "1.0.14",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "module": "./dist/index.mjs",
@@ -1,22 +0,0 @@
1
- //#region src/shared/matchRoute.d.ts
2
- declare function matchRoute(urlPathname: string, routes: Route[]): {
3
- route: Route;
4
- routeParams: Record<string, string>;
5
- } | null;
6
- //#endregion
7
- //#region src/shared/index.d.ts
8
- interface RenderContext {
9
- pageContext: any;
10
- Page: unknown;
11
- Head?: unknown;
12
- Layout?: unknown;
13
- pageTitleTag: string;
14
- serializedContext: string;
15
- assets: {
16
- cssLinks: string;
17
- jsPreloads: string;
18
- entryClient: string;
19
- };
20
- }
21
- //#endregion
22
- export { matchRoute as n, RenderContext as t };