@plumile/site 0.2.3 → 0.2.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.
Files changed (53) hide show
  1. package/README.md +102 -29
  2. package/lib/esm/node/httpResponse.d.ts +4 -0
  3. package/lib/esm/node/httpResponse.d.ts.map +1 -0
  4. package/lib/esm/node/httpResponse.js +29 -0
  5. package/lib/esm/node/index.d.ts +4 -48
  6. package/lib/esm/node/index.d.ts.map +1 -1
  7. package/lib/esm/node/index.js +4 -102
  8. package/lib/esm/node/renderSiteRequest.d.ts +4 -0
  9. package/lib/esm/node/renderSiteRequest.d.ts.map +1 -0
  10. package/lib/esm/node/renderSiteRequest.js +293 -0
  11. package/lib/esm/node/types.d.ts +106 -0
  12. package/lib/esm/node/types.d.ts.map +1 -0
  13. package/lib/esm/node/types.js +2 -0
  14. package/lib/esm/node/writeStaticSite.d.ts +3 -0
  15. package/lib/esm/node/writeStaticSite.d.ts.map +1 -0
  16. package/lib/esm/node/writeStaticSite.js +77 -0
  17. package/lib/esm/runtime/hydrationPayload.d.ts +8 -0
  18. package/lib/esm/runtime/hydrationPayload.d.ts.map +1 -0
  19. package/lib/esm/runtime/hydrationPayload.js +81 -0
  20. package/lib/esm/runtime/index.d.ts +36 -28
  21. package/lib/esm/runtime/index.d.ts.map +1 -1
  22. package/lib/esm/runtime/index.js +92 -78
  23. package/lib/esm/runtime/scrollRestoration.d.ts +12 -0
  24. package/lib/esm/runtime/scrollRestoration.d.ts.map +1 -0
  25. package/lib/esm/runtime/scrollRestoration.js +66 -0
  26. package/lib/esm/vite/index.d.ts +3 -1
  27. package/lib/esm/vite/index.d.ts.map +1 -1
  28. package/lib/esm/vite/index.js +23 -5
  29. package/lib/esm/vite/resolveSiteAssetsFromViteManifest.d.ts +14 -0
  30. package/lib/esm/vite/resolveSiteAssetsFromViteManifest.d.ts.map +1 -0
  31. package/lib/esm/vite/resolveSiteAssetsFromViteManifest.js +81 -0
  32. package/lib/tsconfig.esm.tsbuildinfo +1 -1
  33. package/lib/types/node/httpResponse.d.ts +4 -0
  34. package/lib/types/node/httpResponse.d.ts.map +1 -0
  35. package/lib/types/node/index.d.ts +4 -48
  36. package/lib/types/node/index.d.ts.map +1 -1
  37. package/lib/types/node/renderSiteRequest.d.ts +4 -0
  38. package/lib/types/node/renderSiteRequest.d.ts.map +1 -0
  39. package/lib/types/node/types.d.ts +106 -0
  40. package/lib/types/node/types.d.ts.map +1 -0
  41. package/lib/types/node/writeStaticSite.d.ts +3 -0
  42. package/lib/types/node/writeStaticSite.d.ts.map +1 -0
  43. package/lib/types/runtime/hydrationPayload.d.ts +8 -0
  44. package/lib/types/runtime/hydrationPayload.d.ts.map +1 -0
  45. package/lib/types/runtime/index.d.ts +36 -28
  46. package/lib/types/runtime/index.d.ts.map +1 -1
  47. package/lib/types/runtime/scrollRestoration.d.ts +12 -0
  48. package/lib/types/runtime/scrollRestoration.d.ts.map +1 -0
  49. package/lib/types/vite/index.d.ts +3 -1
  50. package/lib/types/vite/index.d.ts.map +1 -1
  51. package/lib/types/vite/resolveSiteAssetsFromViteManifest.d.ts +14 -0
  52. package/lib/types/vite/resolveSiteAssetsFromViteManifest.d.ts.map +1 -0
  53. package/package.json +5 -5
package/README.md CHANGED
@@ -1,32 +1,105 @@
1
1
  # @plumile/site
2
2
 
3
- Static-SPA site framework for Plumile React documentation and marketing sites.
4
-
5
- This package is under initial implementation. The first public surface covers
6
- configuration normalization, manifest types, Node rendering helpers, runtime
7
- hydration/navigation helpers, i18n payloads, optional Relay hooks, markdown
8
- component mapping, Vite integration, and theme presets used by the Rust
9
- `plumile-site` CLI and future React renderer.
10
-
11
- ## Main Exports
12
-
13
- - `@plumile/site/config` defines and normalizes site config.
14
- - `@plumile/site/node` renders static route HTML and stable hydration payloads.
15
- - `@plumile/site/runtime` hydrates static HTML, handles internal navigation, and
16
- searches generated static indexes.
17
- - `@plumile/site/manifest` validates manifests and resolves direct route links.
18
- - `@plumile/site/i18n` creates initial i18n payloads and locale switch targets.
19
- - `@plumile/site/relay` exposes optional build-time and hydration store hooks.
20
- - `@plumile/site/markdown` defines markdown component maps.
21
- - `@plumile/site/theme` resolves static theme presets.
22
- - `@plumile/site/vite` creates the Vite plugin wrapper.
23
-
24
- ## CLI
25
-
26
- The companion Rust CLI lives in `rust/crates/plumile-site-cli` and currently covers
27
- content checks, manifest generation, static output, sitemap, robots, search
28
- index, TypeDoc mounting, route inspection, and baseline comparison.
29
-
30
- ```bash
31
- cargo test --manifest-path rust/Cargo.toml -p plumile-site-cli
3
+ Universal SSG/SSR document and browser runtime for applications using
4
+ `@plumile/router`.
5
+
6
+ The package deliberately separates browser-safe APIs from Node-only rendering
7
+ and filesystem APIs:
8
+
9
+ - `@plumile/site/node` exports `renderSiteRequest`, `writeStaticSite`, the head,
10
+ page, asset and response types, plus the framework-neutral HTTP adapters.
11
+ - `@plumile/site/runtime` exports `hydratePlumileSite`,
12
+ `createScrollRestoration`, navigation helpers and static search helpers.
13
+ - `@plumile/site/vite` exports `plumileSiteVitePlugin` and the pure
14
+ `resolveSiteAssetsFromViteManifest` helper.
15
+ - The existing `config`, `i18n`, `manifest`, `markdown`, `relay`, and `theme`
16
+ subpaths retain their specialized APIs.
17
+
18
+ ## Request rendering
19
+
20
+ Define an explicit concrete page list; dynamic router patterns are not used as
21
+ the SSG enumeration. Every path begins and ends with `/`, and hydration is an
22
+ explicit per-page choice.
23
+
24
+ ```ts
25
+ import { renderSiteRequest, type SitePageDefinition } from '@plumile/site/node';
26
+
27
+ const page: SitePageDefinition<{ locale: string }> = {
28
+ path: '/guide/',
29
+ locale: 'en',
30
+ hydrate: false,
31
+ head: () => ({
32
+ title: 'Guide',
33
+ meta: [{ name: 'description', content: 'Product guide' }],
34
+ }),
35
+ };
36
+
37
+ const response = await renderSiteRequest({
38
+ location: { pathname: page.path },
39
+ routes,
40
+ context: { locale: page.locale },
41
+ page,
42
+ assets,
43
+ });
44
+ ```
45
+
46
+ `renderSiteRequest` returns a discriminated HTML, redirect, or not-found
47
+ response. It is the shared request renderer for prerendering and SSR. Static
48
+ pages always receive CSS and no browser entry; hydrated pages additionally
49
+ receive module preloads, a versioned JSON payload, and the client module.
50
+
51
+ Prepared route data crosses the server/client boundary only when that route
52
+ declares `preparedHydration.serialize` and `preparedHydration.deserialize`.
53
+ The router validates the payload as finite JSON and rejects unsafe or stale
54
+ snapshots.
55
+
56
+ ## Static output and SSR
57
+
58
+ `writeStaticSite` writes validated HTML responses to deterministic directory
59
+ indexes and refuses traversal, duplicate paths, output collisions, redirects,
60
+ and no-match results in the normal page list. The caller owns cleaning the
61
+ output directory and Vite owns public asset copying.
62
+
63
+ For an HTTP host, map successful results with `siteResponseToHttpResponse`.
64
+ Catch request-rendering failures at the outer host boundary and map them with
65
+ `siteRenderErrorToHttpResponse`; the latter intentionally exposes no error
66
+ details and performs no logging.
67
+
68
+ ## Client hydration
69
+
70
+ ```ts
71
+ import {
72
+ createScrollRestoration,
73
+ hydratePlumileSite,
74
+ } from '@plumile/site/runtime';
75
+
76
+ const scroll = createScrollRestoration({});
77
+ await hydratePlumileSite({
78
+ routes,
79
+ getContext: createContextFromBrowserPath,
80
+ onRouteCommit: scroll.onRouteCommit,
81
+ });
32
82
  ```
83
+
84
+ Hydration reads exactly one `#__PLUMILE_SITE__` JSON element, verifies its
85
+ route and router snapshot against the current location, preserves server HTML,
86
+ and hydrates once. Wire `scroll.beforeRouteChange` to the router subscription
87
+ before updating the stored current entry, and call `scroll.dispose()` with the
88
+ router cleanup when the application shuts down.
89
+
90
+ ## Vite
91
+
92
+ ```ts
93
+ import { defineConfig } from 'vite';
94
+ import { plumileSiteVitePlugin } from '@plumile/site/vite';
95
+
96
+ export default defineConfig({
97
+ plugins: [plumileSiteVitePlugin({ clientEntry: 'app/entry.client.tsx' })],
98
+ });
99
+ ```
100
+
101
+ The client build has a single JavaScript entry and emits a Vite manifest. The
102
+ SSR build keeps its CLI-provided server input, emits no manifest, and does not
103
+ copy the public directory. Read the client manifest in application-owned Node
104
+ or prerender code, then pass it to `resolveSiteAssetsFromViteManifest` with the
105
+ client entry and the concrete page's dynamic route entry.
@@ -0,0 +1,4 @@
1
+ import type { SiteHttpResponse, SiteResponse } from './types.js';
2
+ export declare function siteResponseToHttpResponse(response: SiteResponse): SiteHttpResponse;
3
+ export declare function siteRenderErrorToHttpResponse(): SiteHttpResponse;
4
+ //# sourceMappingURL=httpResponse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpResponse.d.ts","sourceRoot":"","sources":["../../../src/node/httpResponse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGjE,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,YAAY,GACrB,gBAAgB,CAoBlB;AAGD,wBAAgB,6BAA6B,IAAI,gBAAgB,CAMhE"}
@@ -0,0 +1,29 @@
1
+ export function siteResponseToHttpResponse(response) {
2
+ if (response.kind === 'html') {
3
+ return {
4
+ status: response.status,
5
+ headers: { 'Content-Type': 'text/html; charset=utf-8' },
6
+ body: response.html,
7
+ };
8
+ }
9
+ if (response.kind === 'redirect') {
10
+ return {
11
+ status: response.status,
12
+ headers: { Location: response.location },
13
+ body: '',
14
+ };
15
+ }
16
+ return {
17
+ status: 404,
18
+ headers: { 'Content-Type': 'text/plain; charset=utf-8' },
19
+ body: 'Not Found',
20
+ };
21
+ }
22
+ export function siteRenderErrorToHttpResponse() {
23
+ return {
24
+ status: 500,
25
+ headers: { 'Content-Type': 'text/plain; charset=utf-8' },
26
+ body: 'Internal Server Error',
27
+ };
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cFJlc3BvbnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vZGUvaHR0cFJlc3BvbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sVUFBVSwwQkFBMEIsQ0FDeEMsUUFBc0I7SUFFdEIsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzdCLE9BQU87WUFDTCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLDBCQUEwQixFQUFFO1lBQ3ZELElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtTQUNwQixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNqQyxPQUFPO1lBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1lBQ3ZCLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFO1lBQ3hDLElBQUksRUFBRSxFQUFFO1NBQ1QsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLEdBQUc7UUFDWCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsMkJBQTJCLEVBQUU7UUFDeEQsSUFBSSxFQUFFLFdBQVc7S0FDbEIsQ0FBQztBQUNKLENBQUM7QUFHRCxNQUFNLFVBQVUsNkJBQTZCO0lBQzNDLE9BQU87UUFDTCxNQUFNLEVBQUUsR0FBRztRQUNYLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSwyQkFBMkIsRUFBRTtRQUN4RCxJQUFJLEVBQUUsdUJBQXVCO0tBQzlCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTaXRlSHR0cFJlc3BvbnNlLCBTaXRlUmVzcG9uc2UgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIENvbnZlcnRzIGEgc2l0ZSByZW5kZXJpbmcgb3V0Y29tZSBpbnRvIGEgZnJhbWV3b3JrLW5ldXRyYWwgSFRUUCByZXNwb25zZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaXRlUmVzcG9uc2VUb0h0dHBSZXNwb25zZShcbiAgcmVzcG9uc2U6IFNpdGVSZXNwb25zZSxcbik6IFNpdGVIdHRwUmVzcG9uc2Uge1xuICBpZiAocmVzcG9uc2Uua2luZCA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcgfSxcbiAgICAgIGJvZHk6IHJlc3BvbnNlLmh0bWwsXG4gICAgfTtcbiAgfVxuICBpZiAocmVzcG9uc2Uua2luZCA9PT0gJ3JlZGlyZWN0Jykge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIGhlYWRlcnM6IHsgTG9jYXRpb246IHJlc3BvbnNlLmxvY2F0aW9uIH0sXG4gICAgICBib2R5OiAnJyxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiA0MDQsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnIH0sXG4gICAgYm9keTogJ05vdCBGb3VuZCcsXG4gIH07XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBzdGFibGUgSFRUUCByZXNwb25zZSB1c2VkIHdoZW4gc2l0ZSByZW5kZXJpbmcgZmFpbHMuICovXG5leHBvcnQgZnVuY3Rpb24gc2l0ZVJlbmRlckVycm9yVG9IdHRwUmVzcG9uc2UoKTogU2l0ZUh0dHBSZXNwb25zZSB7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiA1MDAsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnIH0sXG4gICAgYm9keTogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gIH07XG59XG4iXX0=
@@ -1,51 +1,7 @@
1
- import React, { type ReactElement } from 'react';
2
1
  import { type SiteConfig } from '../config/index.js';
3
- import type { PlumileSiteManifest, PlumileSiteRouteManifest } from '../manifest/index.js';
2
+ export type * from './types.js';
3
+ export { siteRenderErrorToHttpResponse, siteResponseToHttpResponse, } from './httpResponse.js';
4
+ export { renderSiteRequest, serializeHydrationPayload, } from './renderSiteRequest.js';
5
+ export { writeStaticSite } from './writeStaticSite.js';
4
6
  export declare function resolveSiteConfigFile(path: string): Promise<SiteConfig>;
5
- export type RenderStaticSiteRouteOptions<TContext> = {
6
- context?: TContext;
7
- fallback?: ReactElement | string | null;
8
- location: {
9
- pathname: string;
10
- search?: string;
11
- hash?: string;
12
- };
13
- routerModule?: SiteRouterModule<TContext>;
14
- routes: unknown[];
15
- };
16
- export type RenderStaticSiteRouteResult = {
17
- body: string;
18
- routePath: string | null;
19
- };
20
- export type RenderStaticSiteDocumentOptions = {
21
- body: string;
22
- manifest: PlumileSiteManifest;
23
- route: PlumileSiteRouteManifest;
24
- hydration?: Record<string, unknown>;
25
- };
26
- export type RenderStaticSiteDocumentResult = {
27
- html: string;
28
- hydrationPayload: string;
29
- };
30
- type SiteRouterModule<TContext> = {
31
- createStaticRouter: (routes: unknown[], options: {
32
- context?: TContext;
33
- location: RenderStaticSiteRouteOptions<TContext>['location'];
34
- }) => Promise<{
35
- context: React.ComponentProps<React.Context<unknown>['Provider']>['value'];
36
- entry: {
37
- route?: {
38
- path?: string;
39
- } | null;
40
- };
41
- }>;
42
- RouterRenderer: React.ComponentType<{
43
- fallback?: ReactElement | string | null;
44
- }>;
45
- RoutingContext: React.Context<unknown>;
46
- };
47
- export declare function renderStaticSiteRoute<TContext = unknown>(options: RenderStaticSiteRouteOptions<TContext>): Promise<RenderStaticSiteRouteResult>;
48
- export declare function renderStaticSiteDocument(options: RenderStaticSiteDocumentOptions): RenderStaticSiteDocumentResult;
49
- export declare function serializeHydrationPayload(value: unknown): string;
50
- export {};
51
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/node/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAGjD,OAAO,EAEL,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAK9B,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ7E;AAED,MAAM,MAAM,4BAA4B,CAAC,QAAQ,IAAI;IACnD,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,YAAY,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,KAAK,EAAE,wBAAwB,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,KAAK,gBAAgB,CAAC,QAAQ,IAAI;IAChC,kBAAkB,EAAE,CAClB,MAAM,EAAE,OAAO,EAAE,EACjB,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,QAAQ,CAAC;QACnB,QAAQ,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC;KAC9D,KACE,OAAO,CAAC;QACX,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3E,KAAK,EAAE;YACL,KAAK,CAAC,EAAE;gBACN,IAAI,CAAC,EAAE,MAAM,CAAC;aACf,GAAG,IAAI,CAAC;SACV,CAAC;KACH,CAAC,CAAC;IACH,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC;QAClC,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAAC;KACzC,CAAC,CAAC;IACH,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;CACxC,CAAC;AAKF,wBAAsB,qBAAqB,CAAC,QAAQ,GAAG,OAAO,EAC5D,OAAO,EAAE,4BAA4B,CAAC,QAAQ,CAAC,GAC9C,OAAO,CAAC,2BAA2B,CAAC,CAqBtC;AAKD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,+BAA+B,GACvC,8BAA8B,CAiDhC;AAKD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEhE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/node/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAE5B,mBAAmB,YAAY,CAAC;AAChC,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ7E"}
@@ -1,7 +1,8 @@
1
1
  import { pathToFileURL } from 'node:url';
2
- import React from 'react';
3
- import { renderToString } from 'react-dom/server';
4
2
  import { normalizeSiteConfig, } from '../config/index.js';
3
+ export { siteRenderErrorToHttpResponse, siteResponseToHttpResponse, } from './httpResponse.js';
4
+ export { renderSiteRequest, serializeHydrationPayload, } from './renderSiteRequest.js';
5
+ export { writeStaticSite } from './writeStaticSite.js';
5
6
  export async function resolveSiteConfigFile(path) {
6
7
  const module = (await import(pathToFileURL(path).href));
7
8
  if (module.default == null) {
@@ -9,103 +10,4 @@ export async function resolveSiteConfigFile(path) {
9
10
  }
10
11
  return normalizeSiteConfig(module.default);
11
12
  }
12
- export async function renderStaticSiteRoute(options) {
13
- const { createStaticRouter, RouterRenderer, RoutingContext } = options.routerModule ?? (await loadSiteRouterModule());
14
- const router = await createStaticRouter(options.routes, {
15
- context: options.context,
16
- location: options.location,
17
- });
18
- const body = renderToString(React.createElement(RoutingContext.Provider, { value: router.context }, React.createElement(RouterRenderer, {
19
- fallback: options.fallback ?? null,
20
- })));
21
- return {
22
- body,
23
- routePath: router.entry.route?.path ?? null,
24
- };
25
- }
26
- export function renderStaticSiteDocument(options) {
27
- const baseUrl = options.manifest.site.baseUrl?.replace(/\/+$/, '') ?? '';
28
- const canonicalUrl = `${baseUrl}${options.route.path}`;
29
- const hydrationPayload = serializeHydrationPayload({
30
- manifest: options.manifest,
31
- routePath: options.route.path,
32
- ...options.hydration,
33
- });
34
- const description = options.route.description ?? '';
35
- const alternates = findLocaleAlternates(options.manifest, options.route).map((alternate) => {
36
- return `<link rel="alternate" hreflang="${escapeHtml(alternate.locale)}" href="${escapeHtml(`${baseUrl}${alternate.path}`)}">`;
37
- });
38
- if (alternates.length > 0) {
39
- alternates.push(`<link rel="alternate" hreflang="x-default" href="${escapeHtml(`${baseUrl}${options.route.path}`)}">`);
40
- }
41
- const html = [
42
- '<!doctype html>',
43
- `<html lang="${escapeHtml(options.route.locale)}">`,
44
- '<head>',
45
- '<meta charset="utf-8">',
46
- '<meta name="viewport" content="width=device-width, initial-scale=1">',
47
- `<title>${escapeHtml(options.route.title)}</title>`,
48
- `<meta name="description" content="${escapeHtml(description)}">`,
49
- `<link rel="canonical" href="${escapeHtml(canonicalUrl)}">`,
50
- ...alternates,
51
- '</head>',
52
- '<body>',
53
- `<div id="root">${options.body}</div>`,
54
- `<script type="application/json" id="__PLUMILE_SITE__">${escapeJsonForHtml(hydrationPayload)}</script>`,
55
- '</body>',
56
- '</html>',
57
- '',
58
- ].join('\n');
59
- return {
60
- html,
61
- hydrationPayload,
62
- };
63
- }
64
- export function serializeHydrationPayload(value) {
65
- return JSON.stringify(sortJsonValue(value));
66
- }
67
- async function loadSiteRouterModule() {
68
- const routerSpecifier = '@plumile/router';
69
- const routerModule = (await import(routerSpecifier));
70
- return routerModule;
71
- }
72
- function findLocaleAlternates(manifest, route) {
73
- const groupKey = localeSourceGroupKey(route.source, manifest.site.locales);
74
- return manifest.routes.filter((candidate) => {
75
- return (candidate.path !== route.path &&
76
- localeSourceGroupKey(candidate.source, manifest.site.locales) === groupKey);
77
- });
78
- }
79
- function localeSourceGroupKey(source, locales) {
80
- for (const locale of locales) {
81
- const suffix = `.${locale}.md`;
82
- if (source.endsWith(suffix)) {
83
- return `${source.slice(0, -suffix.length)}.md`;
84
- }
85
- }
86
- return source;
87
- }
88
- function sortJsonValue(value) {
89
- if (Array.isArray(value)) {
90
- return value.map(sortJsonValue);
91
- }
92
- if (value == null || typeof value !== 'object') {
93
- return value;
94
- }
95
- const result = {};
96
- for (const key of Object.keys(value).sort()) {
97
- result[key] = sortJsonValue(value[key]);
98
- }
99
- return result;
100
- }
101
- function escapeHtml(value) {
102
- return value
103
- .replace(/&/g, '&amp;')
104
- .replace(/</g, '&lt;')
105
- .replace(/>/g, '&gt;')
106
- .replace(/"/g, '&quot;');
107
- }
108
- function escapeJsonForHtml(value) {
109
- return value.replace(/</g, '\\u003c');
110
- }
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbm9kZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sS0FBNEIsTUFBTSxPQUFPLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWxELE9BQU8sRUFDTCxtQkFBbUIsR0FHcEIsTUFBTSxvQkFBb0IsQ0FBQztBQVM1QixNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUFDLElBQVk7SUFDdEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBRXJELENBQUM7SUFDRixJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQXVERCxNQUFNLENBQUMsS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxPQUErQztJQUUvQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxHQUMxRCxPQUFPLENBQUMsWUFBWSxJQUFJLENBQUMsTUFBTSxvQkFBb0IsRUFBWSxDQUFDLENBQUM7SUFDbkUsTUFBTSxNQUFNLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1FBQ3RELE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztRQUN4QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7S0FDM0IsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUN6QixLQUFLLENBQUMsYUFB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QUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBNEIsRUFBRSxDQUFDO0lBQzNDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUUsS0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBS0QsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixPQUFPLEtBQUs7U0FDVCxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztTQUN0QixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztTQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztTQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFLRCxTQUFTLGlCQUFpQixDQUFDLEtBQWE7SUFDdEMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCBSZWFjdCwgeyB0eXBlIFJlYWN0RWxlbWVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlclRvU3RyaW5nIH0gZnJvbSAncmVhY3QtZG9tL3NlcnZlcic7XG5cbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVNpdGVDb25maWcsXG4gIHR5cGUgU2l0ZUNvbmZpZyxcbiAgdHlwZSBTaXRlQ29uZmlnSW5wdXQsXG59IGZyb20gJy4uL2NvbmZpZy9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBsdW1pbGVTaXRlTWFuaWZlc3QsXG4gIFBsdW1pbGVTaXRlUm91dGVNYW5pZmVzdCxcbn0gZnJvbSAnLi4vbWFuaWZlc3QvaW5kZXguanMnO1xuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlU2l0ZUNvbmZpZ0ZpbGUocGF0aDogc3RyaW5nKTogUHJvbWlzZTxTaXRlQ29uZmlnPiB7XG4gIGNvbnN0IG1vZHVsZSA9IChhd2FpdCBpbXBvcnQocGF0aFRvRmlsZVVSTChwYXRoKS5ocmVmKSkgYXMge1xuICAgIGRlZmF1bHQ/OiBTaXRlQ29uZmlnSW5wdXQ7XG4gIH07XG4gIGlmIChtb2R1bGUuZGVmYXVsdCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTaXRlIGNvbmZpZyBkb2VzIG5vdCBleHBvcnQgYSBkZWZhdWx0IGNvbmZpZzogJHtwYXRofWApO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVTaXRlQ29uZmlnKG1vZHVsZS5kZWZhdWx0KTtcbn1cblxuZXhwb3J0IHR5cGUgUmVuZGVyU3RhdGljU2l0ZVJvdXRlT3B0aW9uczxUQ29udGV4dD4gPSB7XG4gIGNvbnRleHQ/OiBUQ29udGV4dDtcbiAgZmFsbGJhY2s/OiBSZWFjdEVsZW1lbnQgfCBzdHJpbmcgfCBudWxsO1xuICBsb2NhdGlvbjoge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgc2VhcmNoPzogc3RyaW5nO1xuICAgIGhhc2g/OiBzdHJpbmc7XG4gIH07XG4gIHJvdXRlck1vZHVsZT86IFNpdGVSb3V0ZXJNb2R1bGU8VENvbnRleHQ+O1xuICByb3V0ZXM6IHVua25vd25bXTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlbmRlclN0YXRpY1NpdGVSb3V0ZVJlc3VsdCA9IHtcbiAgYm9keTogc3RyaW5nO1xuICByb3V0ZVBhdGg6IHN0cmluZyB8IG51bGw7XG59O1xuXG5leHBvcnQgdHlwZSBSZW5kZXJTdGF0aWNTaXRlRG9jdW1lbnRPcHRpb25zID0ge1xuICBib2R5OiBzdHJpbmc7XG4gIG1hbmlmZXN0OiBQbHVtaWxlU2l0ZU1hbmlmZXN0O1xuICByb3V0ZTogUGx1bWlsZVNpdGVSb3V0ZU1hbmlmZXN0O1xuICBoeWRyYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG5cbmV4cG9ydCB0eXBlIFJlbmRlclN0YXRpY1NpdGVEb2N1bWVudFJlc3VsdCA9IHtcbiAgaHRtbDogc3RyaW5nO1xuICBoeWRyYXRpb25QYXlsb2FkOiBzdHJpbmc7XG59O1xuXG50eXBlIFNpdGVSb3V0ZXJNb2R1bGU8VENvbnRleHQ+ID0ge1xuICBjcmVhdGVTdGF0aWNSb3V0ZXI6IChcbiAgICByb3V0ZXM6IHVua25vd25bXSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBjb250ZXh0PzogVENvbnRleHQ7XG4gICAgICBsb2NhdGlvbjogUmVuZGVyU3RhdGljU2l0ZVJvdXRlT3B0aW9uczxUQ29udGV4dD5bJ2xvY2F0aW9uJ107XG4gICAgfSxcbiAgKSA9PiBQcm9taXNlPHtcbiAgICBjb250ZXh0OiBSZWFjdC5Db21wb25lbnRQcm9wczxSZWFjdC5Db250ZXh0PHVua25vd24+WydQcm92aWRlciddPlsndmFsdWUnXTtcbiAgICBlbnRyeToge1xuICAgICAgcm91dGU/OiB7XG4gICAgICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgICB9IHwgbnVsbDtcbiAgICB9O1xuICB9PjtcbiAgUm91dGVyUmVuZGVyZXI6IFJlYWN0LkNvbXBvbmVudFR5cGU8e1xuICAgIGZhbGxiYWNrPzogUmVhY3RFbGVtZW50IHwgc3RyaW5nIHwgbnVsbDtcbiAgfT47XG4gIFJvdXRpbmdDb250ZXh0OiBSZWFjdC5Db250ZXh0PHVua25vd24+O1xufTtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyU3RhdGljU2l0ZVJvdXRlPFRDb250ZXh0ID0gdW5rbm93bj4oXG4gIG9wdGlvbnM6IFJlbmRlclN0YXRpY1NpdGVSb3V0ZU9wdGlvbnM8VENvbnRleHQ+LFxuKTogUHJvbWlzZTxSZW5kZXJTdGF0aWNTaXRlUm91dGVSZXN1bHQ+IHtcbiAgY29uc3QgeyBjcmVhdGVTdGF0aWNSb3V0ZXIsIFJvdXRlclJlbmRlcmVyLCBSb3V0aW5nQ29udGV4dCB9ID1cbiAgICBvcHRpb25zLnJvdXRlck1vZHVsZSA/PyAoYXdhaXQgbG9hZFNpdGVSb3V0ZXJNb2R1bGU8VENvbnRleHQ+KCkpO1xuICBjb25zdCByb3V0ZXIgPSBhd2FpdCBjcmVhdGVTdGF0aWNSb3V0ZXIob3B0aW9ucy5yb3V0ZXMsIHtcbiAgICBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsXG4gICAgbG9jYXRpb246IG9wdGlvbnMubG9jYXRpb24sXG4gIH0pO1xuICBjb25zdCBib2R5ID0gcmVuZGVyVG9TdHJpbmcoXG4gICAgUmVhY3QuY3JlYXRlRWxlbWVudChcbiAgICAgIFJvdXRpbmdDb250ZXh0LlByb3ZpZGVyLFxuICAgICAgeyB2YWx1ZTogcm91dGVyLmNvbnRleHQgfSxcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUm91dGVyUmVuZGVyZXIsIHtcbiAgICAgICAgZmFsbGJhY2s6IG9wdGlvbnMuZmFsbGJhY2sgPz8gbnVsbCxcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBib2R5LFxuICAgIHJvdXRlUGF0aDogcm91dGVyLmVudHJ5LnJvdXRlPy5wYXRoID8/IG51bGwsXG4gIH07XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclN0YXRpY1NpdGVEb2N1bWVudChcbiAgb3B0aW9uczogUmVuZGVyU3RhdGljU2l0ZURvY3VtZW50T3B0aW9ucyxcbik6IFJlbmRlclN0YXRpY1NpdGVEb2N1bWVudFJlc3VsdCB7XG4gIGNvbnN0IGJhc2VVcmwgPSBvcHRpb25zLm1hbmlmZXN0LnNpdGUuYmFzZVVybD8ucmVwbGFjZSgvXFwvKyQvLCAnJykgPz8gJyc7XG4gIGNvbnN0IGNhbm9uaWNhbFVybCA9IGAke2Jhc2VVcmx9JHtvcHRpb25zLnJvdXRlLnBhdGh9YDtcbiAgY29uc3QgaHlkcmF0aW9uUGF5bG9hZCA9IHNlcmlhbGl6ZUh5ZHJhdGlvblBheWxvYWQoe1xuICAgIG1hbmlmZXN0OiBvcHRpb25zLm1hbmlmZXN0LFxuICAgIHJvdXRlUGF0aDogb3B0aW9ucy5yb3V0ZS5wYXRoLFxuICAgIC4uLm9wdGlvbnMuaHlkcmF0aW9uLFxuICB9KTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBvcHRpb25zLnJvdXRlLmRlc2NyaXB0aW9uID8/ICcnO1xuICBjb25zdCBhbHRlcm5hdGVzID0gZmluZExvY2FsZUFsdGVybmF0ZXMob3B0aW9ucy5tYW5pZmVzdCwgb3B0aW9ucy5yb3V0ZSkubWFwKFxuICAgIChhbHRlcm5hdGUpID0+IHtcbiAgICAgIHJldHVybiBgPGxpbmsgcmVsPVwiYWx0ZXJuYXRlXCIgaHJlZmxhbmc9XCIke2VzY2FwZUh0bWwoYWx0ZXJuYXRlLmxvY2FsZSl9XCIgaHJlZj1cIiR7ZXNjYXBlSHRtbChcbiAgICAgICAgYCR7YmFzZVVybH0ke2FsdGVybmF0ZS5wYXRofWAsXG4gICAgICApfVwiPmA7XG4gICAgfSxcbiAgKTtcbiAgaWYgKGFsdGVybmF0ZXMubGVuZ3RoID4gMCkge1xuICAgIGFsdGVybmF0ZXMucHVzaChcbiAgICAgIGA8bGluayByZWw9XCJhbHRlcm5hdGVcIiBocmVmbGFuZz1cIngtZGVmYXVsdFwiIGhyZWY9XCIke2VzY2FwZUh0bWwoXG4gICAgICAgIGAke2Jhc2VVcmx9JHtvcHRpb25zLnJvdXRlLnBhdGh9YCxcbiAgICAgICl9XCI+YCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaHRtbCA9IFtcbiAgICAnPCFkb2N0eXBlIGh0bWw+JyxcbiAgICBgPGh0bWwgbGFuZz1cIiR7ZXNjYXBlSHRtbChvcHRpb25zLnJvdXRlLmxvY2FsZSl9XCI+YCxcbiAgICAnPGhlYWQ+JyxcbiAgICAnPG1ldGEgY2hhcnNldD1cInV0Zi04XCI+JyxcbiAgICAnPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCI+JyxcbiAgICBgPHRpdGxlPiR7ZXNjYXBlSHRtbChvcHRpb25zLnJvdXRlLnRpdGxlKX08L3RpdGxlPmAsXG4gICAgYDxtZXRhIG5hbWU9XCJkZXNjcmlwdGlvblwiIGNvbnRlbnQ9XCIke2VzY2FwZUh0bWwoZGVzY3JpcHRpb24pfVwiPmAsXG4gICAgYDxsaW5rIHJlbD1cImNhbm9uaWNhbFwiIGhyZWY9XCIke2VzY2FwZUh0bWwoY2Fub25pY2FsVXJsKX1cIj5gLFxuICAgIC4uLmFsdGVybmF0ZXMsXG4gICAgJzwvaGVhZD4nLFxuICAgICc8Ym9keT4nLFxuICAgIGA8ZGl2IGlkPVwicm9vdFwiPiR7b3B0aW9ucy5ib2R5fTwvZGl2PmAsXG4gICAgYDxzY3JpcHQgdHlwZT1cImFwcGxpY2F0aW9uL2pzb25cIiBpZD1cIl9fUExVTUlMRV9TSVRFX19cIj4ke2VzY2FwZUpzb25Gb3JIdG1sKFxuICAgICAgaHlkcmF0aW9uUGF5bG9hZCxcbiAgICApfTwvc2NyaXB0PmAsXG4gICAgJzwvYm9keT4nLFxuICAgICc8L2h0bWw+JyxcbiAgICAnJyxcbiAgXS5qb2luKCdcXG4nKTtcblxuICByZXR1cm4ge1xuICAgIGh0bWwsXG4gICAgaHlkcmF0aW9uUGF5bG9hZCxcbiAgfTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplSHlkcmF0aW9uUGF5bG9hZCh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzb3J0SnNvblZhbHVlKHZhbHVlKSk7XG59XG5cbi8qKlxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZFNpdGVSb3V0ZXJNb2R1bGU8VENvbnRleHQ+KCk6IFByb21pc2U8XG4gIFNpdGVSb3V0ZXJNb2R1bGU8VENvbnRleHQ+XG4+IHtcbiAgY29uc3Qgcm91dGVyU3BlY2lmaWVyID0gJ0BwbHVtaWxlL3JvdXRlcic7XG4gIGNvbnN0IHJvdXRlck1vZHVsZSA9IChhd2FpdCBpbXBvcnQocm91dGVyU3BlY2lmaWVyKSkgYXMgdW5rbm93bjtcbiAgcmV0dXJuIHJvdXRlck1vZHVsZSBhcyBTaXRlUm91dGVyTW9kdWxlPFRDb250ZXh0Pjtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBmaW5kTG9jYWxlQWx0ZXJuYXRlcyhcbiAgbWFuaWZlc3Q6IFBsdW1pbGVTaXRlTWFuaWZlc3QsXG4gIHJvdXRlOiBQbHVtaWxlU2l0ZVJvdXRlTWFuaWZlc3QsXG4pOiBQbHVtaWxlU2l0ZVJvdXRlTWFuaWZlc3RbXSB7XG4gIGNvbnN0IGdyb3VwS2V5ID0gbG9jYWxlU291cmNlR3JvdXBLZXkocm91dGUuc291cmNlLCBtYW5pZmVzdC5zaXRlLmxvY2FsZXMpO1xuICByZXR1cm4gbWFuaWZlc3Qucm91dGVzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNhbmRpZGF0ZS5wYXRoICE9PSByb3V0ZS5wYXRoICYmXG4gICAgICBsb2NhbGVTb3VyY2VHcm91cEtleShjYW5kaWRhdGUuc291cmNlLCBtYW5pZmVzdC5zaXRlLmxvY2FsZXMpID09PSBncm91cEtleVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIGxvY2FsZVNvdXJjZUdyb3VwS2V5KFxuICBzb3VyY2U6IHN0cmluZyxcbiAgbG9jYWxlczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBzdHJpbmcge1xuICBmb3IgKGNvbnN0IGxvY2FsZSBvZiBsb2NhbGVzKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gYC4ke2xvY2FsZX0ubWRgO1xuICAgIGlmIChzb3VyY2UuZW5kc1dpdGgoc3VmZml4KSkge1xuICAgICAgcmV0dXJuIGAke3NvdXJjZS5zbGljZSgwLCAtc3VmZml4Lmxlbmd0aCl9Lm1kYDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNvdXJjZTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBzb3J0SnNvblZhbHVlKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoc29ydEpzb25WYWx1ZSk7XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWUpLnNvcnQoKSkge1xuICAgIHJlc3VsdFtrZXldID0gc29ydEpzb25WYWx1ZSgodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gZXNjYXBlSHRtbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG59XG5cbi8qKlxuICpcbiAqL1xuZnVuY3Rpb24gZXNjYXBlSnNvbkZvckh0bWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC88L2csICdcXFxcdTAwM2MnKTtcbn1cbiJdfQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbm9kZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpDLE9BQU8sRUFDTCxtQkFBbUIsR0FHcEIsTUFBTSxvQkFBb0IsQ0FBQztBQUc1QixPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLDBCQUEwQixHQUMzQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIseUJBQXlCLEdBQzFCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3ZELE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQUMsSUFBWTtJQUN0RCxNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FFckQsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHtcbiAgbm9ybWFsaXplU2l0ZUNvbmZpZyxcbiAgdHlwZSBTaXRlQ29uZmlnLFxuICB0eXBlIFNpdGVDb25maWdJbnB1dCxcbn0gZnJvbSAnLi4vY29uZmlnL2luZGV4LmpzJztcblxuZXhwb3J0IHR5cGUgKiBmcm9tICcuL3R5cGVzLmpzJztcbmV4cG9ydCB7XG4gIHNpdGVSZW5kZXJFcnJvclRvSHR0cFJlc3BvbnNlLFxuICBzaXRlUmVzcG9uc2VUb0h0dHBSZXNwb25zZSxcbn0gZnJvbSAnLi9odHRwUmVzcG9uc2UuanMnO1xuZXhwb3J0IHtcbiAgcmVuZGVyU2l0ZVJlcXVlc3QsXG4gIHNlcmlhbGl6ZUh5ZHJhdGlvblBheWxvYWQsXG59IGZyb20gJy4vcmVuZGVyU2l0ZVJlcXVlc3QuanMnO1xuZXhwb3J0IHsgd3JpdGVTdGF0aWNTaXRlIH0gZnJvbSAnLi93cml0ZVN0YXRpY1NpdGUuanMnO1xuXG4vKiogTG9hZHMgYW5kIHZhbGlkYXRlcyBhIHNpdGUgY29uZmlndXJhdGlvbiBtb2R1bGUgZnJvbSBkaXNrLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTaXRlQ29uZmlnRmlsZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPFNpdGVDb25maWc+IHtcbiAgY29uc3QgbW9kdWxlID0gKGF3YWl0IGltcG9ydChwYXRoVG9GaWxlVVJMKHBhdGgpLmhyZWYpKSBhcyB7XG4gICAgZGVmYXVsdD86IFNpdGVDb25maWdJbnB1dDtcbiAgfTtcbiAgaWYgKG1vZHVsZS5kZWZhdWx0ID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNpdGUgY29uZmlnIGRvZXMgbm90IGV4cG9ydCBhIGRlZmF1bHQgY29uZmlnOiAke3BhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZVNpdGVDb25maWcobW9kdWxlLmRlZmF1bHQpO1xufVxuIl19
@@ -0,0 +1,4 @@
1
+ import type { RenderSiteRequestOptions, SiteResponse } from './types.js';
2
+ export declare function serializeHydrationPayload(value: unknown): string;
3
+ export declare function renderSiteRequest<TContext>(options: RenderSiteRequestOptions<TContext>): Promise<SiteResponse>;
4
+ //# sourceMappingURL=renderSiteRequest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderSiteRequest.d.ts","sourceRoot":"","sources":["../../../src/node/renderSiteRequest.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,wBAAwB,EAMxB,YAAY,EAGb,MAAM,YAAY,CAAC;AAGpB,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEhE;AAGD,wBAAsB,iBAAiB,CAAC,QAAQ,EAC9C,OAAO,EAAE,wBAAwB,CAAC,QAAQ,CAAC,GAC1C,OAAO,CAAC,YAAY,CAAC,CAuFvB"}