@plumile/site 0.2.3 → 0.2.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 +102 -29
- package/lib/esm/node/httpResponse.d.ts +4 -0
- package/lib/esm/node/httpResponse.d.ts.map +1 -0
- package/lib/esm/node/httpResponse.js +29 -0
- package/lib/esm/node/index.d.ts +4 -48
- package/lib/esm/node/index.d.ts.map +1 -1
- package/lib/esm/node/index.js +4 -102
- package/lib/esm/node/renderSiteRequest.d.ts +4 -0
- package/lib/esm/node/renderSiteRequest.d.ts.map +1 -0
- package/lib/esm/node/renderSiteRequest.js +293 -0
- package/lib/esm/node/types.d.ts +106 -0
- package/lib/esm/node/types.d.ts.map +1 -0
- package/lib/esm/node/types.js +2 -0
- package/lib/esm/node/writeStaticSite.d.ts +3 -0
- package/lib/esm/node/writeStaticSite.d.ts.map +1 -0
- package/lib/esm/node/writeStaticSite.js +77 -0
- package/lib/esm/runtime/hydrationPayload.d.ts +8 -0
- package/lib/esm/runtime/hydrationPayload.d.ts.map +1 -0
- package/lib/esm/runtime/hydrationPayload.js +81 -0
- package/lib/esm/runtime/index.d.ts +36 -28
- package/lib/esm/runtime/index.d.ts.map +1 -1
- package/lib/esm/runtime/index.js +92 -78
- package/lib/esm/runtime/scrollRestoration.d.ts +12 -0
- package/lib/esm/runtime/scrollRestoration.d.ts.map +1 -0
- package/lib/esm/runtime/scrollRestoration.js +66 -0
- package/lib/esm/vite/index.d.ts +3 -1
- package/lib/esm/vite/index.d.ts.map +1 -1
- package/lib/esm/vite/index.js +23 -5
- package/lib/esm/vite/resolveSiteAssetsFromViteManifest.d.ts +14 -0
- package/lib/esm/vite/resolveSiteAssetsFromViteManifest.d.ts.map +1 -0
- package/lib/esm/vite/resolveSiteAssetsFromViteManifest.js +81 -0
- package/lib/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/node/httpResponse.d.ts +4 -0
- package/lib/types/node/httpResponse.d.ts.map +1 -0
- package/lib/types/node/index.d.ts +4 -48
- package/lib/types/node/index.d.ts.map +1 -1
- package/lib/types/node/renderSiteRequest.d.ts +4 -0
- package/lib/types/node/renderSiteRequest.d.ts.map +1 -0
- package/lib/types/node/types.d.ts +106 -0
- package/lib/types/node/types.d.ts.map +1 -0
- package/lib/types/node/writeStaticSite.d.ts +3 -0
- package/lib/types/node/writeStaticSite.d.ts.map +1 -0
- package/lib/types/runtime/hydrationPayload.d.ts +8 -0
- package/lib/types/runtime/hydrationPayload.d.ts.map +1 -0
- package/lib/types/runtime/index.d.ts +36 -28
- package/lib/types/runtime/index.d.ts.map +1 -1
- package/lib/types/runtime/scrollRestoration.d.ts +12 -0
- package/lib/types/runtime/scrollRestoration.d.ts.map +1 -0
- package/lib/types/vite/index.d.ts +3 -1
- package/lib/types/vite/index.d.ts.map +1 -1
- package/lib/types/vite/resolveSiteAssetsFromViteManifest.d.ts +14 -0
- package/lib/types/vite/resolveSiteAssetsFromViteManifest.d.ts.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { renderToString } from 'react-dom/server';
|
|
3
|
+
import { createStaticRouter } from '@plumile/router/routing/createStaticRouter.js';
|
|
4
|
+
import RouterRenderer from '@plumile/router/routing/RouterRenderer.js';
|
|
5
|
+
import RoutingContext from '@plumile/router/routing/RoutingContext.js';
|
|
6
|
+
import { createRouterHydrationSnapshot } from '@plumile/router/routing/routerHydration.js';
|
|
7
|
+
export function serializeHydrationPayload(value) {
|
|
8
|
+
return JSON.stringify(sortJsonValue(value));
|
|
9
|
+
}
|
|
10
|
+
export async function renderSiteRequest(options) {
|
|
11
|
+
validatePage(options.page);
|
|
12
|
+
const pathname = normalizeRequestPath(options.location.pathname);
|
|
13
|
+
if (pathname !== options.page.path) {
|
|
14
|
+
throw new Error(`Site request pathname ${pathname} does not match page ${options.page.path}`);
|
|
15
|
+
}
|
|
16
|
+
validateAssets(options.assets);
|
|
17
|
+
const routerModule = options.routerModule ??
|
|
18
|
+
{
|
|
19
|
+
createStaticRouter,
|
|
20
|
+
createRouterHydrationSnapshot,
|
|
21
|
+
RouterRenderer,
|
|
22
|
+
RoutingContext,
|
|
23
|
+
};
|
|
24
|
+
const result = await routerModule.createStaticRouter(options.routes, {
|
|
25
|
+
context: options.context,
|
|
26
|
+
location: { ...options.location, pathname },
|
|
27
|
+
});
|
|
28
|
+
if (result.kind === 'redirect')
|
|
29
|
+
return result;
|
|
30
|
+
if (result.kind === 'not-found')
|
|
31
|
+
return { kind: 'not-found', status: 404 };
|
|
32
|
+
const head = options.page.head(options.context);
|
|
33
|
+
validateHead(head);
|
|
34
|
+
const documentMeta = options.documentMeta ?? [];
|
|
35
|
+
const documentLinks = options.documentLinks ?? [];
|
|
36
|
+
const documentScripts = options.documentScripts ?? [];
|
|
37
|
+
documentMeta.forEach(validateMeta);
|
|
38
|
+
documentLinks.forEach(validateLink);
|
|
39
|
+
documentScripts.forEach(validateScript);
|
|
40
|
+
const canonicalCount = [...(head.links ?? []), ...documentLinks].filter((link) => {
|
|
41
|
+
return link.rel.trim().toLowerCase() === 'canonical';
|
|
42
|
+
}).length;
|
|
43
|
+
if (canonicalCount > 1) {
|
|
44
|
+
throw new Error('Site head may contain at most one canonical link');
|
|
45
|
+
}
|
|
46
|
+
const body = renderToString(React.createElement(routerModule.RoutingContext.Provider, { value: result.context }, React.createElement(routerModule.RouterRenderer, { fallback: null })));
|
|
47
|
+
if (body.includes('<!--$!--><template data-msg=')) {
|
|
48
|
+
throw new Error('Route rendering failed');
|
|
49
|
+
}
|
|
50
|
+
let hydrationPayload;
|
|
51
|
+
if (options.page.hydrate) {
|
|
52
|
+
result.entry.preparedMatch.segments.forEach((segment) => {
|
|
53
|
+
if (segment.routeNode?.prepare != null &&
|
|
54
|
+
segment.preparedHydration == null) {
|
|
55
|
+
throw new Error(`Hydrated route prepare requires preparedHydration: ${segment.segmentKey}`);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
if (options.assets.clientEntry == null) {
|
|
59
|
+
throw new Error('Hydrated page requires a client entry asset');
|
|
60
|
+
}
|
|
61
|
+
hydrationPayload = {
|
|
62
|
+
version: 1,
|
|
63
|
+
routePath: pathname,
|
|
64
|
+
router: routerModule.createRouterHydrationSnapshot(result.entry),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
kind: 'html',
|
|
69
|
+
status: result.status,
|
|
70
|
+
html: renderDocument({
|
|
71
|
+
assets: options.assets,
|
|
72
|
+
body,
|
|
73
|
+
documentLinks,
|
|
74
|
+
documentMeta,
|
|
75
|
+
documentScripts,
|
|
76
|
+
head,
|
|
77
|
+
hydrationPayload,
|
|
78
|
+
locale: options.page.locale,
|
|
79
|
+
}),
|
|
80
|
+
routePath: result.entry.route?.path ?? pathname,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function renderDocument(input) {
|
|
84
|
+
const hydrated = input.hydrationPayload != null;
|
|
85
|
+
const headLines = [
|
|
86
|
+
'<meta charset="utf-8">',
|
|
87
|
+
'<meta name="viewport" content="width=device-width, initial-scale=1">',
|
|
88
|
+
...input.documentMeta.map((meta) => {
|
|
89
|
+
return renderMeta(meta, false);
|
|
90
|
+
}),
|
|
91
|
+
`<title data-plumile-page-head="">${escapeHtml(input.head.title)}</title>`,
|
|
92
|
+
...(input.head.meta ?? []).map((meta) => {
|
|
93
|
+
return renderMeta(meta, true);
|
|
94
|
+
}),
|
|
95
|
+
...(input.head.links ?? []).map((link) => {
|
|
96
|
+
return renderLink(link, true);
|
|
97
|
+
}),
|
|
98
|
+
...input.documentLinks.map((link) => {
|
|
99
|
+
return renderLink(link, false);
|
|
100
|
+
}),
|
|
101
|
+
...input.assets.stylesheets.map((href) => {
|
|
102
|
+
return `<link rel="stylesheet" href="${escapeHtml(href)}">`;
|
|
103
|
+
}),
|
|
104
|
+
...(hydrated
|
|
105
|
+
? input.assets.modulePreloads.map((href) => {
|
|
106
|
+
return `<link rel="modulepreload" href="${escapeHtml(href)}">`;
|
|
107
|
+
})
|
|
108
|
+
: []),
|
|
109
|
+
...(input.head.scripts ?? []).map((script) => {
|
|
110
|
+
return renderScript(script, true);
|
|
111
|
+
}),
|
|
112
|
+
...input.documentScripts.map((script) => {
|
|
113
|
+
return renderScript(script, false);
|
|
114
|
+
}),
|
|
115
|
+
];
|
|
116
|
+
const bodyLines = [`<div id="root">${input.body}</div>`];
|
|
117
|
+
if (input.hydrationPayload != null) {
|
|
118
|
+
const { clientEntry } = input.assets;
|
|
119
|
+
if (clientEntry == null) {
|
|
120
|
+
throw new Error('Hydrated page requires a client entry asset');
|
|
121
|
+
}
|
|
122
|
+
bodyLines.push(`<script type="application/json" id="__PLUMILE_SITE__">${escapeJsonForHtml(serializeHydrationPayload(input.hydrationPayload))}</script>`, `<script type="module" src="${escapeHtml(clientEntry)}"></script>`);
|
|
123
|
+
}
|
|
124
|
+
return [
|
|
125
|
+
'<!doctype html>',
|
|
126
|
+
`<html lang="${escapeHtml(input.locale.trim())}">`,
|
|
127
|
+
'<head>',
|
|
128
|
+
...headLines,
|
|
129
|
+
'</head>',
|
|
130
|
+
'<body>',
|
|
131
|
+
...bodyLines,
|
|
132
|
+
'</body>',
|
|
133
|
+
'</html>',
|
|
134
|
+
'',
|
|
135
|
+
].join('\n');
|
|
136
|
+
}
|
|
137
|
+
function renderMeta(meta, pageOwned) {
|
|
138
|
+
const identity = 'name' in meta
|
|
139
|
+
? `name="${escapeHtml(meta.name)}"`
|
|
140
|
+
: `property="${escapeHtml(meta.property)}"`;
|
|
141
|
+
const media = meta.media == null ? '' : ` media="${escapeHtml(meta.media)}"`;
|
|
142
|
+
const marker = pageOwned ? ' data-plumile-page-head=""' : '';
|
|
143
|
+
return `<meta ${identity} content="${escapeHtml(meta.content)}"${media}${marker}>`;
|
|
144
|
+
}
|
|
145
|
+
function renderLink(link, pageOwned) {
|
|
146
|
+
const attributes = [
|
|
147
|
+
['rel', link.rel],
|
|
148
|
+
['href', link.href],
|
|
149
|
+
['as', link.as],
|
|
150
|
+
['color', link.color],
|
|
151
|
+
['crossorigin', link.crossOrigin],
|
|
152
|
+
['hreflang', link.hrefLang],
|
|
153
|
+
['media', link.media],
|
|
154
|
+
['sizes', link.sizes],
|
|
155
|
+
['type', link.type],
|
|
156
|
+
];
|
|
157
|
+
if (pageOwned)
|
|
158
|
+
attributes.push(['data-plumile-page-head', '']);
|
|
159
|
+
return `<link ${renderAttributes(attributes)}>`;
|
|
160
|
+
}
|
|
161
|
+
function renderScript(script, pageOwned) {
|
|
162
|
+
const attributes = [['src', script.src]];
|
|
163
|
+
if (script.async === true)
|
|
164
|
+
attributes.push(['async', '']);
|
|
165
|
+
if (script.defer === true)
|
|
166
|
+
attributes.push(['defer', '']);
|
|
167
|
+
if (script.type != null)
|
|
168
|
+
attributes.push(['type', script.type]);
|
|
169
|
+
Object.entries(script.attributes ?? {}).forEach(([name, value]) => {
|
|
170
|
+
attributes.push([name, value]);
|
|
171
|
+
});
|
|
172
|
+
if (pageOwned)
|
|
173
|
+
attributes.push(['data-plumile-page-head', '']);
|
|
174
|
+
return `<script ${renderAttributes(attributes)}></script>`;
|
|
175
|
+
}
|
|
176
|
+
function renderAttributes(attributes) {
|
|
177
|
+
return attributes
|
|
178
|
+
.filter((entry) => {
|
|
179
|
+
return entry[1] != null;
|
|
180
|
+
})
|
|
181
|
+
.map(([name, value]) => {
|
|
182
|
+
return value === '' ? name : `${name}="${escapeHtml(value)}"`;
|
|
183
|
+
})
|
|
184
|
+
.join(' ');
|
|
185
|
+
}
|
|
186
|
+
function validatePage(page) {
|
|
187
|
+
if (typeof page.path !== 'string' ||
|
|
188
|
+
!page.path.startsWith('/') ||
|
|
189
|
+
!page.path.endsWith('/') ||
|
|
190
|
+
/[:*{}]/.test(page.path) ||
|
|
191
|
+
page.path.includes('?') ||
|
|
192
|
+
page.path.includes('#') ||
|
|
193
|
+
page.path.includes('\\') ||
|
|
194
|
+
page.path.split('/').includes('..')) {
|
|
195
|
+
throw new Error(`Invalid concrete site page path: ${String(page.path)}`);
|
|
196
|
+
}
|
|
197
|
+
if (page.locale.trim() === '') {
|
|
198
|
+
throw new Error('Site page locale must not be empty');
|
|
199
|
+
}
|
|
200
|
+
if (typeof page.hydrate !== 'boolean') {
|
|
201
|
+
throw new Error('Site page hydrate must be explicit');
|
|
202
|
+
}
|
|
203
|
+
if (typeof page.head !== 'function') {
|
|
204
|
+
throw new Error('Site page head must be a function');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
function validateHead(head) {
|
|
208
|
+
if (typeof head.title !== 'string') {
|
|
209
|
+
throw new Error('Site head title must be a string');
|
|
210
|
+
}
|
|
211
|
+
head.meta?.forEach(validateMeta);
|
|
212
|
+
head.links?.forEach(validateLink);
|
|
213
|
+
head.scripts?.forEach(validateScript);
|
|
214
|
+
}
|
|
215
|
+
function validateMeta(meta) {
|
|
216
|
+
const hasName = 'name' in meta;
|
|
217
|
+
const hasProperty = 'property' in meta;
|
|
218
|
+
if (hasName === hasProperty) {
|
|
219
|
+
throw new Error('Site meta must declare exactly one of name or property');
|
|
220
|
+
}
|
|
221
|
+
const identity = hasName ? meta.name : meta.property;
|
|
222
|
+
if (identity.trim() === '') {
|
|
223
|
+
throw new Error('Site meta name or property must not be empty');
|
|
224
|
+
}
|
|
225
|
+
if (typeof meta.content !== 'string') {
|
|
226
|
+
throw new Error('Site meta content must be a string');
|
|
227
|
+
}
|
|
228
|
+
if (hasName && ['viewport', 'charset'].includes(meta.name.toLowerCase())) {
|
|
229
|
+
throw new Error('Charset and viewport metadata are renderer-owned');
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
function validateLink(link) {
|
|
233
|
+
if (link.rel.trim() === '' || link.href.trim() === '') {
|
|
234
|
+
throw new Error('Site link rel and href must not be empty');
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function validateScript(script) {
|
|
238
|
+
if (script.src.trim() === '') {
|
|
239
|
+
throw new Error('Site script src must not be empty');
|
|
240
|
+
}
|
|
241
|
+
const reserved = new Set(['src', 'async', 'defer', 'type']);
|
|
242
|
+
Object.keys(script.attributes ?? {}).forEach((name) => {
|
|
243
|
+
if (reserved.has(name.toLowerCase())) {
|
|
244
|
+
throw new Error(`Site script attributes cannot override ${name}`);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
function validateAssets(assets) {
|
|
249
|
+
[
|
|
250
|
+
...assets.stylesheets,
|
|
251
|
+
...assets.modulePreloads,
|
|
252
|
+
...(assets.clientEntry == null ? [] : [assets.clientEntry]),
|
|
253
|
+
].forEach((value) => {
|
|
254
|
+
if (!value.startsWith('/')) {
|
|
255
|
+
throw new Error(`Site asset must be root-relative: ${value}`);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
function normalizeRequestPath(pathname) {
|
|
260
|
+
if (pathname === '/')
|
|
261
|
+
return '/';
|
|
262
|
+
const prefixed = pathname.startsWith('/') ? pathname : `/${pathname}`;
|
|
263
|
+
return prefixed.endsWith('/') ? prefixed : `${prefixed}/`;
|
|
264
|
+
}
|
|
265
|
+
function sortJsonValue(value) {
|
|
266
|
+
if (Array.isArray(value))
|
|
267
|
+
return value.map(sortJsonValue);
|
|
268
|
+
if (value == null || typeof value !== 'object')
|
|
269
|
+
return value;
|
|
270
|
+
const result = {};
|
|
271
|
+
Object.keys(value)
|
|
272
|
+
.sort()
|
|
273
|
+
.forEach((key) => {
|
|
274
|
+
result[key] = sortJsonValue(value[key]);
|
|
275
|
+
});
|
|
276
|
+
return result;
|
|
277
|
+
}
|
|
278
|
+
function escapeHtml(value) {
|
|
279
|
+
return value
|
|
280
|
+
.replace(/&/g, '&')
|
|
281
|
+
.replace(/</g, '<')
|
|
282
|
+
.replace(/>/g, '>')
|
|
283
|
+
.replace(/"/g, '"');
|
|
284
|
+
}
|
|
285
|
+
function escapeJsonForHtml(value) {
|
|
286
|
+
return value
|
|
287
|
+
.replace(/</g, '\\u003c')
|
|
288
|
+
.replace(/>/g, '\\u003e')
|
|
289
|
+
.replace(/&/g, '\\u0026')
|
|
290
|
+
.replace(/\u2028/g, '\\u2028')
|
|
291
|
+
.replace(/\u2029/g, '\\u2029');
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyU2l0ZVJlcXVlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbm9kZS9yZW5kZXJTaXRlUmVxdWVzdC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNuRixPQUFPLGNBQWMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RSxPQUFPLGNBQWMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQWdCM0YsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEtBQWM7SUFDdEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFHRCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxPQUEyQztJQUUzQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsSUFBSSxRQUFRLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUNiLHlCQUF5QixRQUFRLHdCQUF3QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUM3RSxDQUFDO0lBQ0osQ0FBQztJQUNELGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsTUFBTSxZQUFZLEdBQ2hCLE9BQU8sQ0FBQyxZQUFZO1FBQ25CO1lBQ0Msa0JBQWtCO1lBQ2xCLDZCQUE2QjtZQUM3QixjQUFjO1lBQ2Qs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TCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBR0QsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixPQUFPLEtBQUs7U0FDVCxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztTQUN0QixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztTQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztTQUNyQixPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzdCLENBQUM7QUFHRCxTQUFTLGlCQUFpQixDQUFDLEtBQWE7SUFDdEMsT0FBTyxLQUFLO1NBQ1QsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUM7U0FDeEIsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUM7U0FDeEIsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUM7U0FDeEIsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7U0FDN0IsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlclRvU3RyaW5nIH0gZnJvbSAncmVhY3QtZG9tL3NlcnZlcic7XG5pbXBvcnQgeyBjcmVhdGVTdGF0aWNSb3V0ZXIgfSBmcm9tICdAcGx1bWlsZS9yb3V0ZXIvcm91dGluZy9jcmVhdGVTdGF0aWNSb3V0ZXIuanMnO1xuaW1wb3J0IFJvdXRlclJlbmRlcmVyIGZyb20gJ0BwbHVtaWxlL3JvdXRlci9yb3V0aW5nL1JvdXRlclJlbmRlcmVyLmpzJztcbmltcG9ydCBSb3V0aW5nQ29udGV4dCBmcm9tICdAcGx1bWlsZS9yb3V0ZXIvcm91dGluZy9Sb3V0aW5nQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVSb3V0ZXJIeWRyYXRpb25TbmFwc2hvdCB9IGZyb20gJ0BwbHVtaWxlL3JvdXRlci9yb3V0aW5nL3JvdXRlckh5ZHJhdGlvbi5qcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1bWlsZVNpdGVIeWRyYXRpb25QYXlsb2FkLFxuICBSZW5kZXJTaXRlUmVxdWVzdE9wdGlvbnMsXG4gIFNpdGVIZWFkLFxuICBTaXRlTGlua0Rlc2NyaXB0b3IsXG4gIFNpdGVNZXRhRGVzY3JpcHRvcixcbiAgU2l0ZVBhZ2VEZWZpbml0aW9uLFxuICBTaXRlUmVzb2x2ZWRBc3NldHMsXG4gIFNpdGVSZXNwb25zZSxcbiAgU2l0ZVJvdXRlck1vZHVsZSxcbiAgU2l0ZVNjcmlwdERlc2NyaXB0b3IsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogU2VyaWFsaXplcyBoeWRyYXRpb24gZGF0YSBzYWZlbHkgZm9yIGVtYmVkZGluZyBpbiBhbiBIVE1MIHNjcmlwdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVIeWRyYXRpb25QYXlsb2FkKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNvcnRKc29uVmFsdWUodmFsdWUpKTtcbn1cblxuLyoqIFJlbmRlcnMgb25lIHNpdGUgcmVxdWVzdCBpbnRvIGFuIEhUVFAtYXdhcmUgSFRNTCByZXNwb25zZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJTaXRlUmVxdWVzdDxUQ29udGV4dD4oXG4gIG9wdGlvbnM6IFJlbmRlclNpdGVSZXF1ZXN0T3B0aW9uczxUQ29udGV4dD4sXG4pOiBQcm9taXNlPFNpdGVSZXNwb25zZT4ge1xuICB2YWxpZGF0ZVBhZ2Uob3B0aW9ucy5wYWdlKTtcbiAgY29uc3QgcGF0aG5hbWUgPSBub3JtYWxpemVSZXF1ZXN0UGF0aChvcHRpb25zLmxvY2F0aW9uLnBhdGhuYW1lKTtcbiAgaWYgKHBhdGhuYW1lICE9PSBvcHRpb25zLnBhZ2UucGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBTaXRlIHJlcXVlc3QgcGF0aG5hbWUgJHtwYXRobmFtZX0gZG9lcyBub3QgbWF0Y2ggcGFnZSAke29wdGlvbnMucGFnZS5wYXRofWAsXG4gICAgKTtcbiAgfVxuICB2YWxpZGF0ZUFzc2V0cyhvcHRpb25zLmFzc2V0cyk7XG4gIGNvbnN0IHJvdXRlck1vZHVsZSA9XG4gICAgb3B0aW9ucy5yb3V0ZXJNb2R1bGUgPz9cbiAgICAoe1xuICAgICAgY3JlYXRlU3RhdGljUm91dGVyLFxuICAgICAgY3JlYXRlUm91dGVySHlkcmF0aW9uU25hcHNob3QsXG4gICAgICBSb3V0ZXJSZW5kZXJlcixcbiAgICAgIFJvdXRpbmdDb250ZXh0LFxuICAgIH0gc2F0aXNmaWVzIFNpdGVSb3V0ZXJNb2R1bGU8VENvbnRleHQ+KTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcm91dGVyTW9kdWxlLmNyZWF0ZVN0YXRpY1JvdXRlcihvcHRpb25zLnJvdXRlcywge1xuICAgIGNvbnRleHQ6IG9wdGlvbnMuY29udGV4dCxcbiAgICBsb2NhdGlvbjogeyAuLi5vcHRpb25zLmxvY2F0aW9uLCBwYXRobmFtZSB9LFxuICB9KTtcbiAgaWYgKHJlc3VsdC5raW5kID09PSAncmVkaXJlY3QnKSByZXR1cm4gcmVzdWx0O1xuICBpZiAocmVzdWx0LmtpbmQgPT09ICdub3QtZm91bmQnKSByZXR1cm4geyBraW5kOiAnbm90LWZvdW5kJywgc3RhdHVzOiA0MDQgfTtcblxuICBjb25zdCBoZWFkID0gb3B0aW9ucy5wYWdlLmhlYWQob3B0aW9ucy5jb250ZXh0KTtcbiAgdmFsaWRhdGVIZWFkKGhlYWQpO1xuICBjb25zdCBkb2N1bWVudE1ldGEgPSBvcHRpb25zLmRvY3VtZW50TWV0YSA/PyBbXTtcbiAgY29uc3QgZG9jdW1lbnRMaW5rcyA9IG9wdGlvbnMuZG9jdW1lbnRMaW5rcyA/PyBbXTtcbiAgY29uc3QgZG9jdW1lbnRTY3JpcHRzID0gb3B0aW9ucy5kb2N1bWVudFNjcmlwdHMgPz8gW107XG4gIGRvY3VtZW50TWV0YS5mb3JFYWNoKHZhbGlkYXRlTWV0YSk7XG4gIGRvY3VtZW50TGlua3MuZm9yRWFjaCh2YWxpZGF0ZUxpbmspO1xuICBkb2N1bWVudFNjcmlwdHMuZm9yRWFjaCh2YWxpZGF0ZVNjcmlwdCk7XG4gIGNvbnN0IGNhbm9uaWNhbENvdW50ID0gWy4uLihoZWFkLmxpbmtzID8/IFtdKSwgLi4uZG9jdW1lbnRMaW5rc10uZmlsdGVyKFxuICAgIChsaW5rKSA9PiB7XG4gICAgICByZXR1cm4gbGluay5yZWwudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICdjYW5vbmljYWwnO1xuICAgIH0sXG4gICkubGVuZ3RoO1xuICBpZiAoY2Fub25pY2FsQ291bnQgPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaXRlIGhlYWQgbWF5IGNvbnRhaW4gYXQgbW9zdCBvbmUgY2Fub25pY2FsIGxpbmsnKTtcbiAgfVxuXG4gIGNvbnN0IGJvZHkgPSByZW5kZXJUb1N0cmluZyhcbiAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFxuICAgICAgcm91dGVyTW9kdWxlLlJvdXRpbmdDb250ZXh0LlByb3ZpZGVyLFxuICAgICAgeyB2YWx1ZTogcmVzdWx0LmNvbnRleHQgfSxcbiAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQocm91dGVyTW9kdWxlLlJvdXRlclJlbmRlcmVyLCB7IGZhbGxiYWNrOiBudWxsIH0pLFxuICAgICksXG4gICk7XG4gIGlmIChib2R5LmluY2x1ZGVzKCc8IS0tJCEtLT48dGVtcGxhdGUgZGF0YS1tc2c9JykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JvdXRlIHJlbmRlcmluZyBmYWlsZWQnKTtcbiAgfVxuICBsZXQgaHlkcmF0aW9uUGF5bG9hZDogUGx1bWlsZVNpdGVIeWRyYXRpb25QYXlsb2FkIHwgdW5kZWZpbmVkO1xuICBpZiAob3B0aW9ucy5wYWdlLmh5ZHJhdGUpIHtcbiAgICByZXN1bHQuZW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50cy5mb3JFYWNoKChzZWdtZW50KSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHNlZ21lbnQucm91dGVOb2RlPy5wcmVwYXJlICE9IG51bGwgJiZcbiAgICAgICAgc2VnbWVudC5wcmVwYXJlZEh5ZHJhdGlvbiA9PSBudWxsXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBIeWRyYXRlZCByb3V0ZSBwcmVwYXJlIHJlcXVpcmVzIHByZXBhcmVkSHlkcmF0aW9uOiAke3NlZ21lbnQuc2VnbWVudEtleX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmFzc2V0cy5jbGllbnRFbnRyeSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0h5ZHJhdGVkIHBhZ2UgcmVxdWlyZXMgYSBjbGllbnQgZW50cnkgYXNzZXQnKTtcbiAgICB9XG4gICAgaHlkcmF0aW9uUGF5bG9hZCA9IHtcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICByb3V0ZVBhdGg6IHBhdGhuYW1lLFxuICAgICAgcm91dGVyOiByb3V0ZXJNb2R1bGUuY3JlYXRlUm91dGVySHlkcmF0aW9uU25hcHNob3QocmVzdWx0LmVudHJ5KSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAga2luZDogJ2h0bWwnLFxuICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICBodG1sOiByZW5kZXJEb2N1bWVudCh7XG4gICAgICBhc3NldHM6IG9wdGlvbnMuYXNzZXRzLFxuICAgICAgYm9keSxcbiAgICAgIGRvY3VtZW50TGlua3MsXG4gICAgICBkb2N1bWVudE1ldGEsXG4gICAgICBkb2N1bWVudFNjcmlwdHMsXG4gICAgICBoZWFkLFxuICAgICAgaHlkcmF0aW9uUGF5bG9hZCxcbiAgICAgIGxvY2FsZTogb3B0aW9ucy5wYWdlLmxvY2FsZSxcbiAgICB9KSxcbiAgICByb3V0ZVBhdGg6IHJlc3VsdC5lbnRyeS5yb3V0ZT8ucGF0aCA/PyBwYXRobmFtZSxcbiAgfTtcbn1cblxuLyoqIEFzc2VtYmxlcyB0aGUgZmluYWwgSFRNTCBkb2N1bWVudCBhbmQgaXRzIHBhZ2Utb3duZWQgaGVhZCBlbGVtZW50cy4gKi9cbmZ1bmN0aW9uIHJlbmRlckRvY3VtZW50KGlucHV0OiB7XG4gIGFzc2V0czogU2l0ZVJlc29sdmVkQXNzZXRzO1xuICBib2R5OiBzdHJpbmc7XG4gIGRvY3VtZW50TGlua3M6IHJlYWRvbmx5IFNpdGVMaW5rRGVzY3JpcHRvcltdO1xuICBkb2N1bWVudE1ldGE6IHJlYWRvbmx5IFNpdGVNZXRhRGVzY3JpcHRvcltdO1xuICBkb2N1bWVudFNjcmlwdHM6IHJlYWRvbmx5IFNpdGVTY3JpcHREZXNjcmlwdG9yW107XG4gIGhlYWQ6IFNpdGVIZWFkO1xuICBoeWRyYXRpb25QYXlsb2FkPzogUGx1bWlsZVNpdGVIeWRyYXRpb25QYXlsb2FkO1xuICBsb2NhbGU6IHN0cmluZztcbn0pOiBzdHJpbmcge1xuICBjb25zdCBoeWRyYXRlZCA9IGlucHV0Lmh5ZHJhdGlvblBheWxvYWQgIT0gbnVsbDtcbiAgY29uc3QgaGVhZExpbmVzID0gW1xuICAgICc8bWV0YSBjaGFyc2V0PVwidXRmLThcIj4nLFxuICAgICc8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIj4nLFxuICAgIC4uLmlucHV0LmRvY3VtZW50TWV0YS5tYXAoKG1ldGEpID0+IHtcbiAgICAgIHJldHVybiByZW5kZXJNZXRhKG1ldGEsIGZhbHNlKTtcbiAgICB9KSxcbiAgICBgPHRpdGxlIGRhdGEtcGx1bWlsZS1wYWdlLWhlYWQ9XCJcIj4ke2VzY2FwZUh0bWwoaW5wdXQuaGVhZC50aXRsZSl9PC90aXRsZT5gLFxuICAgIC4uLihpbnB1dC5oZWFkLm1ldGEgPz8gW10pLm1hcCgobWV0YSkgPT4ge1xuICAgICAgcmV0dXJuIHJlbmRlck1ldGEobWV0YSwgdHJ1ZSk7XG4gICAgfSksXG4gICAgLi4uKGlucHV0LmhlYWQubGlua3MgPz8gW10pLm1hcCgobGluaykgPT4ge1xuICAgICAgcmV0dXJuIHJlbmRlckxpbmsobGluaywgdHJ1ZSk7XG4gICAgfSksXG4gICAgLi4uaW5wdXQuZG9jdW1lbnRMaW5rcy5tYXAoKGxpbmspID0+IHtcbiAgICAgIHJldHVybiByZW5kZXJMaW5rKGxpbmssIGZhbHNlKTtcbiAgICB9KSxcbiAgICAuLi5pbnB1dC5hc3NldHMuc3R5bGVzaGVldHMubWFwKChocmVmKSA9PiB7XG4gICAgICByZXR1cm4gYDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiJHtlc2NhcGVIdG1sKGhyZWYpfVwiPmA7XG4gICAgfSksXG4gICAgLi4uKGh5ZHJhdGVkXG4gICAgICA/IGlucHV0LmFzc2V0cy5tb2R1bGVQcmVsb2Fkcy5tYXAoKGhyZWYpID0+IHtcbiAgICAgICAgICByZXR1cm4gYDxsaW5rIHJlbD1cIm1vZHVsZXByZWxvYWRcIiBocmVmPVwiJHtlc2NhcGVIdG1sKGhyZWYpfVwiPmA7XG4gICAgICAgIH0pXG4gICAgICA6IFtdKSxcbiAgICAuLi4oaW5wdXQuaGVhZC5zY3JpcHRzID8/IFtdKS5tYXAoKHNjcmlwdCkgPT4ge1xuICAgICAgcmV0dXJuIHJlbmRlclNjcmlwdChzY3JpcHQsIHRydWUpO1xuICAgIH0pLFxuICAgIC4uLmlucHV0LmRvY3VtZW50U2NyaXB0cy5tYXAoKHNjcmlwdCkgPT4ge1xuICAgICAgcmV0dXJuIHJlbmRlclNjcmlwdChzY3JpcHQsIGZhbHNlKTtcbiAgICB9KSxcbiAgXTtcbiAgY29uc3QgYm9keUxpbmVzID0gW2A8ZGl2IGlkPVwicm9vdFwiPiR7aW5wdXQuYm9keX08L2Rpdj5gXTtcbiAgaWYgKGlucHV0Lmh5ZHJhdGlvblBheWxvYWQgIT0gbnVsbCkge1xuICAgIGNvbnN0IHsgY2xpZW50RW50cnkgfSA9IGlucHV0LmFzc2V0cztcbiAgICBpZiAoY2xpZW50RW50cnkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdIeWRyYXRlZCBwYWdlIHJlcXVpcmVzIGEgY2xpZW50IGVudHJ5IGFzc2V0Jyk7XG4gICAgfVxuICAgIGJvZHlMaW5lcy5wdXNoKFxuICAgICAgYDxzY3JpcHQgdHlwZT1cImFwcGxpY2F0aW9uL2pzb25cIiBpZD1cIl9fUExVTUlMRV9TSVRFX19cIj4ke2VzY2FwZUpzb25Gb3JIdG1sKFxuICAgICAgICBzZXJpYWxpemVIeWRyYXRpb25QYXlsb2FkKGlucHV0Lmh5ZHJhdGlvblBheWxvYWQpLFxuICAgICAgKX08L3NjcmlwdD5gLFxuICAgICAgYDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIHNyYz1cIiR7ZXNjYXBlSHRtbChjbGllbnRFbnRyeSl9XCI+PC9zY3JpcHQ+YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBbXG4gICAgJzwhZG9jdHlwZSBodG1sPicsXG4gICAgYDxodG1sIGxhbmc9XCIke2VzY2FwZUh0bWwoaW5wdXQubG9jYWxlLnRyaW0oKSl9XCI+YCxcbiAgICAnPGhlYWQ+JyxcbiAgICAuLi5oZWFkTGluZXMsXG4gICAgJzwvaGVhZD4nLFxuICAgICc8Ym9keT4nLFxuICAgIC4uLmJvZHlMaW5lcyxcbiAgICAnPC9ib2R5PicsXG4gICAgJzwvaHRtbD4nLFxuICAgICcnLFxuICBdLmpvaW4oJ1xcbicpO1xufVxuXG4vKiogUmVuZGVycyBhIHZhbGlkYXRlZCBtZXRhZGF0YSBkZXNjcmlwdG9yLiAqL1xuZnVuY3Rpb24gcmVuZGVyTWV0YShtZXRhOiBTaXRlTWV0YURlc2NyaXB0b3IsIHBhZ2VPd25lZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGlkZW50aXR5ID1cbiAgICAnbmFtZScgaW4gbWV0YVxuICAgICAgPyBgbmFtZT1cIiR7ZXNjYXBlSHRtbChtZXRhLm5hbWUpfVwiYFxuICAgICAgOiBgcHJvcGVydHk9XCIke2VzY2FwZUh0bWwobWV0YS5wcm9wZXJ0eSl9XCJgO1xuICBjb25zdCBtZWRpYSA9IG1ldGEubWVkaWEgPT0gbnVsbCA/ICcnIDogYCBtZWRpYT1cIiR7ZXNjYXBlSHRtbChtZXRhLm1lZGlhKX1cImA7XG4gIGNvbnN0IG1hcmtlciA9IHBhZ2VPd25lZCA/ICcgZGF0YS1wbHVtaWxlLXBhZ2UtaGVhZD1cIlwiJyA6ICcnO1xuICByZXR1cm4gYDxtZXRhICR7aWRlbnRpdHl9IGNvbnRlbnQ9XCIke2VzY2FwZUh0bWwobWV0YS5jb250ZW50KX1cIiR7bWVkaWF9JHttYXJrZXJ9PmA7XG59XG5cbi8qKiBSZW5kZXJzIGEgdmFsaWRhdGVkIGxpbmsgZGVzY3JpcHRvci4gKi9cbmZ1bmN0aW9uIHJlbmRlckxpbmsobGluazogU2l0ZUxpbmtEZXNjcmlwdG9yLCBwYWdlT3duZWQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBhdHRyaWJ1dGVzOiBbc3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWRdW10gPSBbXG4gICAgWydyZWwnLCBsaW5rLnJlbF0sXG4gICAgWydocmVmJywgbGluay5ocmVmXSxcbiAgICBbJ2FzJywgbGluay5hc10sXG4gICAgWydjb2xvcicsIGxpbmsuY29sb3JdLFxuICAgIFsnY3Jvc3NvcmlnaW4nLCBsaW5rLmNyb3NzT3JpZ2luXSxcbiAgICBbJ2hyZWZsYW5nJywgbGluay5ocmVmTGFuZ10sXG4gICAgWydtZWRpYScsIGxpbmsubWVkaWFdLFxuICAgIFsnc2l6ZXMnLCBsaW5rLnNpemVzXSxcbiAgICBbJ3R5cGUnLCBsaW5rLnR5cGVdLFxuICBdO1xuICBpZiAocGFnZU93bmVkKSBhdHRyaWJ1dGVzLnB1c2goWydkYXRhLXBsdW1pbGUtcGFnZS1oZWFkJywgJyddKTtcbiAgcmV0dXJuIGA8bGluayAke3JlbmRlckF0dHJpYnV0ZXMoYXR0cmlidXRlcyl9PmA7XG59XG5cbi8qKiBSZW5kZXJzIGEgdmFsaWRhdGVkIGV4dGVybmFsIHNjcmlwdCBkZXNjcmlwdG9yLiAqL1xuZnVuY3Rpb24gcmVuZGVyU2NyaXB0KFxuICBzY3JpcHQ6IFNpdGVTY3JpcHREZXNjcmlwdG9yLFxuICBwYWdlT3duZWQ6IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBjb25zdCBhdHRyaWJ1dGVzOiBbc3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWRdW10gPSBbWydzcmMnLCBzY3JpcHQuc3JjXV07XG4gIGlmIChzY3JpcHQuYXN5bmMgPT09IHRydWUpIGF0dHJpYnV0ZXMucHVzaChbJ2FzeW5jJywgJyddKTtcbiAgaWYgKHNjcmlwdC5kZWZlciA9PT0gdHJ1ZSkgYXR0cmlidXRlcy5wdXNoKFsnZGVmZXInLCAnJ10pO1xuICBpZiAoc2NyaXB0LnR5cGUgIT0gbnVsbCkgYXR0cmlidXRlcy5wdXNoKFsndHlwZScsIHNjcmlwdC50eXBlXSk7XG4gIE9iamVjdC5lbnRyaWVzKHNjcmlwdC5hdHRyaWJ1dGVzID8/IHt9KS5mb3JFYWNoKChbbmFtZSwgdmFsdWVdKSA9PiB7XG4gICAgYXR0cmlidXRlcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICB9KTtcbiAgaWYgKHBhZ2VPd25lZCkgYXR0cmlidXRlcy5wdXNoKFsnZGF0YS1wbHVtaWxlLXBhZ2UtaGVhZCcsICcnXSk7XG4gIHJldHVybiBgPHNjcmlwdCAke3JlbmRlckF0dHJpYnV0ZXMoYXR0cmlidXRlcyl9Pjwvc2NyaXB0PmA7XG59XG5cbi8qKiBTZXJpYWxpemVzIGRlZmluZWQgSFRNTCBhdHRyaWJ1dGVzIHdpdGggZXNjYXBpbmcuICovXG5mdW5jdGlvbiByZW5kZXJBdHRyaWJ1dGVzKGF0dHJpYnV0ZXM6IFtzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZF1bXSk6IHN0cmluZyB7XG4gIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBbc3RyaW5nLCBzdHJpbmddID0+IHtcbiAgICAgIHJldHVybiBlbnRyeVsxXSAhPSBudWxsO1xuICAgIH0pXG4gICAgLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSAnJyA/IG5hbWUgOiBgJHtuYW1lfT1cIiR7ZXNjYXBlSHRtbCh2YWx1ZSl9XCJgO1xuICAgIH0pXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuLyoqIFZhbGlkYXRlcyBvbmUgcmVxdWVzdGVkIHBhZ2UgZGVmaW5pdGlvbi4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUGFnZTxUQ29udGV4dD4ocGFnZTogU2l0ZVBhZ2VEZWZpbml0aW9uPFRDb250ZXh0Pik6IHZvaWQge1xuICBpZiAoXG4gICAgdHlwZW9mIHBhZ2UucGF0aCAhPT0gJ3N0cmluZycgfHxcbiAgICAhcGFnZS5wYXRoLnN0YXJ0c1dpdGgoJy8nKSB8fFxuICAgICFwYWdlLnBhdGguZW5kc1dpdGgoJy8nKSB8fFxuICAgIC9bOip7fV0vLnRlc3QocGFnZS5wYXRoKSB8fFxuICAgIHBhZ2UucGF0aC5pbmNsdWRlcygnPycpIHx8XG4gICAgcGFnZS5wYXRoLmluY2x1ZGVzKCcjJykgfHxcbiAgICBwYWdlLnBhdGguaW5jbHVkZXMoJ1xcXFwnKSB8fFxuICAgIHBhZ2UucGF0aC5zcGxpdCgnLycpLmluY2x1ZGVzKCcuLicpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb25jcmV0ZSBzaXRlIHBhZ2UgcGF0aDogJHtTdHJpbmcocGFnZS5wYXRoKX1gKTtcbiAgfVxuICBpZiAocGFnZS5sb2NhbGUudHJpbSgpID09PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcignU2l0ZSBwYWdlIGxvY2FsZSBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICB9XG4gIGlmICh0eXBlb2YgcGFnZS5oeWRyYXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpdGUgcGFnZSBoeWRyYXRlIG11c3QgYmUgZXhwbGljaXQnKTtcbiAgfVxuICBpZiAodHlwZW9mIHBhZ2UuaGVhZCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignU2l0ZSBwYWdlIGhlYWQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbn1cblxuLyoqIFZhbGlkYXRlcyBhbGwgZGVzY3JpcHRvcnMgaW4gdGhlIHBhZ2UgaGVhZC4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlSGVhZChoZWFkOiBTaXRlSGVhZCk6IHZvaWQge1xuICBpZiAodHlwZW9mIGhlYWQudGl0bGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaXRlIGhlYWQgdGl0bGUgbXVzdCBiZSBhIHN0cmluZycpO1xuICB9XG4gIGhlYWQubWV0YT8uZm9yRWFjaCh2YWxpZGF0ZU1ldGEpO1xuICBoZWFkLmxpbmtzPy5mb3JFYWNoKHZhbGlkYXRlTGluayk7XG4gIGhlYWQuc2NyaXB0cz8uZm9yRWFjaCh2YWxpZGF0ZVNjcmlwdCk7XG59XG5cbi8qKiBWYWxpZGF0ZXMgYSBtZXRhZGF0YSBkZXNjcmlwdG9yIGFuZCBpdHMgZXhjbHVzaXZlIGlkZW50aXR5LiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVNZXRhKG1ldGE6IFNpdGVNZXRhRGVzY3JpcHRvcik6IHZvaWQge1xuICBjb25zdCBoYXNOYW1lID0gJ25hbWUnIGluIG1ldGE7XG4gIGNvbnN0IGhhc1Byb3BlcnR5ID0gJ3Byb3BlcnR5JyBpbiBtZXRhO1xuICBpZiAoaGFzTmFtZSA9PT0gaGFzUHJvcGVydHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpdGUgbWV0YSBtdXN0IGRlY2xhcmUgZXhhY3RseSBvbmUgb2YgbmFtZSBvciBwcm9wZXJ0eScpO1xuICB9XG4gIGNvbnN0IGlkZW50aXR5ID0gaGFzTmFtZSA/IG1ldGEubmFtZSA6IG1ldGEucHJvcGVydHk7XG4gIGlmIChpZGVudGl0eS50cmltKCkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaXRlIG1ldGEgbmFtZSBvciBwcm9wZXJ0eSBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICB9XG4gIGlmICh0eXBlb2YgbWV0YS5jb250ZW50ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignU2l0ZSBtZXRhIGNvbnRlbnQgbXVzdCBiZSBhIHN0cmluZycpO1xuICB9XG4gIGlmIChoYXNOYW1lICYmIFsndmlld3BvcnQnLCAnY2hhcnNldCddLmluY2x1ZGVzKG1ldGEubmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2hhcnNldCBhbmQgdmlld3BvcnQgbWV0YWRhdGEgYXJlIHJlbmRlcmVyLW93bmVkJyk7XG4gIH1cbn1cblxuLyoqIFZhbGlkYXRlcyBhIHN0eWxlc2hlZXQgb3IgcmVzb3VyY2UgbGluayBkZXNjcmlwdG9yLiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMaW5rKGxpbms6IFNpdGVMaW5rRGVzY3JpcHRvcik6IHZvaWQge1xuICBpZiAobGluay5yZWwudHJpbSgpID09PSAnJyB8fCBsaW5rLmhyZWYudHJpbSgpID09PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcignU2l0ZSBsaW5rIHJlbCBhbmQgaHJlZiBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICB9XG59XG5cbi8qKiBWYWxpZGF0ZXMgYW4gZXh0ZXJuYWwgc2NyaXB0IGRlc2NyaXB0b3IuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVNjcmlwdChzY3JpcHQ6IFNpdGVTY3JpcHREZXNjcmlwdG9yKTogdm9pZCB7XG4gIGlmIChzY3JpcHQuc3JjLnRyaW0oKSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpdGUgc2NyaXB0IHNyYyBtdXN0IG5vdCBiZSBlbXB0eScpO1xuICB9XG4gIGNvbnN0IHJlc2VydmVkID0gbmV3IFNldChbJ3NyYycsICdhc3luYycsICdkZWZlcicsICd0eXBlJ10pO1xuICBPYmplY3Qua2V5cyhzY3JpcHQuYXR0cmlidXRlcyA/PyB7fSkuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgIGlmIChyZXNlcnZlZC5oYXMobmFtZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaXRlIHNjcmlwdCBhdHRyaWJ1dGVzIGNhbm5vdCBvdmVycmlkZSAke25hbWV9YCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqIFZhbGlkYXRlcyByZXNvbHZlZCBhc3NldCBwYXRocyBiZWZvcmUgaW5jbHVkaW5nIHRoZW0gaW4gSFRNTC4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQXNzZXRzKGFzc2V0czogU2l0ZVJlc29sdmVkQXNzZXRzKTogdm9pZCB7XG4gIFtcbiAgICAuLi5hc3NldHMuc3R5bGVzaGVldHMsXG4gICAgLi4uYXNzZXRzLm1vZHVsZVByZWxvYWRzLFxuICAgIC4uLihhc3NldHMuY2xpZW50RW50cnkgPT0gbnVsbCA/IFtdIDogW2Fzc2V0cy5jbGllbnRFbnRyeV0pLFxuICBdLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2l0ZSBhc3NldCBtdXN0IGJlIHJvb3QtcmVsYXRpdmU6ICR7dmFsdWV9YCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqIE5vcm1hbGl6ZXMgYSByZXF1ZXN0IHBhdGggdG8gdGhlIGNhbm9uaWNhbCB0cmFpbGluZy1zbGFzaCBmb3JtLiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUmVxdWVzdFBhdGgocGF0aG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwYXRobmFtZSA9PT0gJy8nKSByZXR1cm4gJy8nO1xuICBjb25zdCBwcmVmaXhlZCA9IHBhdGhuYW1lLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGhuYW1lIDogYC8ke3BhdGhuYW1lfWA7XG4gIHJldHVybiBwcmVmaXhlZC5lbmRzV2l0aCgnLycpID8gcHJlZml4ZWQgOiBgJHtwcmVmaXhlZH0vYDtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IHNvcnRzIG9iamVjdCBrZXlzIGZvciBkZXRlcm1pbmlzdGljIHNlcmlhbGl6ZWQgb3V0cHV0LiAqL1xuZnVuY3Rpb24gc29ydEpzb25WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoc29ydEpzb25WYWx1ZSk7XG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBPYmplY3Qua2V5cyh2YWx1ZSlcbiAgICAuc29ydCgpXG4gICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgcmVzdWx0W2tleV0gPSBzb3J0SnNvblZhbHVlKCh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSk7XG4gICAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBFc2NhcGVzIGEgc3RyaW5nIGZvciB1c2UgaW4gYW4gSFRNTCBhdHRyaWJ1dGUgb3IgdGV4dCBub2RlLiAqL1xuZnVuY3Rpb24gZXNjYXBlSHRtbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG59XG5cbi8qKiBFc2NhcGVzIEpTT04gY2hhcmFjdGVycyB0aGF0IGNvdWxkIHRlcm1pbmF0ZSBpdHMgSFRNTCBzY3JpcHQgY29udGFpbmVyLiAqL1xuZnVuY3Rpb24gZXNjYXBlSnNvbkZvckh0bWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5yZXBsYWNlKC88L2csICdcXFxcdTAwM2MnKVxuICAgIC5yZXBsYWNlKC8+L2csICdcXFxcdTAwM2UnKVxuICAgIC5yZXBsYWNlKC8mL2csICdcXFxcdTAwMjYnKVxuICAgIC5yZXBsYWNlKC9cXHUyMDI4L2csICdcXFxcdTIwMjgnKVxuICAgIC5yZXBsYWNlKC9cXHUyMDI5L2csICdcXFxcdTIwMjknKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { createStaticRouter } from '@plumile/router/routing/createStaticRouter.js';
|
|
2
|
+
import type RouterRenderer from '@plumile/router/routing/RouterRenderer.js';
|
|
3
|
+
import type RoutingContext from '@plumile/router/routing/RoutingContext.js';
|
|
4
|
+
import type { createRouterHydrationSnapshot } from '@plumile/router/routing/routerHydration.js';
|
|
5
|
+
import type { RouteNode, RouterHydrationSnapshot, RouterRedirectStatus, RouterRenderStatus } from '@plumile/router/types.js';
|
|
6
|
+
export type SiteMetaDescriptor = {
|
|
7
|
+
name: string;
|
|
8
|
+
content: string;
|
|
9
|
+
media?: string;
|
|
10
|
+
} | {
|
|
11
|
+
property: string;
|
|
12
|
+
content: string;
|
|
13
|
+
media?: string;
|
|
14
|
+
};
|
|
15
|
+
export type SiteLinkDescriptor = {
|
|
16
|
+
rel: string;
|
|
17
|
+
href: string;
|
|
18
|
+
as?: string;
|
|
19
|
+
color?: string;
|
|
20
|
+
crossOrigin?: 'anonymous' | 'use-credentials';
|
|
21
|
+
hrefLang?: string;
|
|
22
|
+
media?: string;
|
|
23
|
+
sizes?: string;
|
|
24
|
+
type?: string;
|
|
25
|
+
};
|
|
26
|
+
export type SiteScriptDescriptor = {
|
|
27
|
+
src: string;
|
|
28
|
+
async?: boolean;
|
|
29
|
+
defer?: boolean;
|
|
30
|
+
type?: 'module';
|
|
31
|
+
attributes?: Readonly<Record<string, string>>;
|
|
32
|
+
};
|
|
33
|
+
export type SiteHead = {
|
|
34
|
+
title: string;
|
|
35
|
+
meta?: readonly SiteMetaDescriptor[];
|
|
36
|
+
links?: readonly SiteLinkDescriptor[];
|
|
37
|
+
scripts?: readonly SiteScriptDescriptor[];
|
|
38
|
+
};
|
|
39
|
+
export type SitePageDefinition<TContext> = {
|
|
40
|
+
path: string;
|
|
41
|
+
locale: string;
|
|
42
|
+
hydrate: boolean;
|
|
43
|
+
head: (context: TContext) => SiteHead;
|
|
44
|
+
};
|
|
45
|
+
export type SiteResolvedAssets = {
|
|
46
|
+
stylesheets: readonly string[];
|
|
47
|
+
modulePreloads: readonly string[];
|
|
48
|
+
clientEntry: string | null;
|
|
49
|
+
};
|
|
50
|
+
export type PlumileSiteHydrationPayload = {
|
|
51
|
+
version: 1;
|
|
52
|
+
routePath: string;
|
|
53
|
+
router: RouterHydrationSnapshot;
|
|
54
|
+
};
|
|
55
|
+
export type SiteRouterModule<TContext> = {
|
|
56
|
+
createStaticRouter: typeof createStaticRouter<TContext>;
|
|
57
|
+
createRouterHydrationSnapshot: typeof createRouterHydrationSnapshot;
|
|
58
|
+
RouterRenderer: typeof RouterRenderer;
|
|
59
|
+
RoutingContext: typeof RoutingContext;
|
|
60
|
+
};
|
|
61
|
+
export type RenderSiteRequestOptions<TContext> = {
|
|
62
|
+
location: {
|
|
63
|
+
pathname: string;
|
|
64
|
+
search?: string;
|
|
65
|
+
hash?: string;
|
|
66
|
+
};
|
|
67
|
+
routes: RouteNode[];
|
|
68
|
+
context: TContext;
|
|
69
|
+
page: SitePageDefinition<TContext>;
|
|
70
|
+
assets: SiteResolvedAssets;
|
|
71
|
+
documentLinks?: readonly SiteLinkDescriptor[];
|
|
72
|
+
documentMeta?: readonly SiteMetaDescriptor[];
|
|
73
|
+
documentScripts?: readonly SiteScriptDescriptor[];
|
|
74
|
+
routerModule?: SiteRouterModule<TContext>;
|
|
75
|
+
};
|
|
76
|
+
export type SiteHtmlResponse = {
|
|
77
|
+
kind: 'html';
|
|
78
|
+
status: RouterRenderStatus;
|
|
79
|
+
html: string;
|
|
80
|
+
routePath: string;
|
|
81
|
+
};
|
|
82
|
+
export type SiteRedirectResponse = {
|
|
83
|
+
kind: 'redirect';
|
|
84
|
+
status: RouterRedirectStatus;
|
|
85
|
+
location: string;
|
|
86
|
+
};
|
|
87
|
+
export type SiteNotFoundResponse = {
|
|
88
|
+
kind: 'not-found';
|
|
89
|
+
status: 404;
|
|
90
|
+
};
|
|
91
|
+
export type SiteResponse = SiteHtmlResponse | SiteRedirectResponse | SiteNotFoundResponse;
|
|
92
|
+
export type WriteStaticSiteOptions<TContext> = {
|
|
93
|
+
pages: readonly SitePageDefinition<TContext>[];
|
|
94
|
+
render: (page: SitePageDefinition<TContext>) => Promise<SiteResponse>;
|
|
95
|
+
outDir: string;
|
|
96
|
+
notFoundPages?: readonly {
|
|
97
|
+
output: string;
|
|
98
|
+
render: () => Promise<SiteResponse>;
|
|
99
|
+
}[];
|
|
100
|
+
};
|
|
101
|
+
export type SiteHttpResponse = {
|
|
102
|
+
status: number;
|
|
103
|
+
headers: Readonly<Record<string, string>>;
|
|
104
|
+
body: string;
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/node/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbm9kZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBjcmVhdGVTdGF0aWNSb3V0ZXIgfSBmcm9tICdAcGx1bWlsZS9yb3V0ZXIvcm91dGluZy9jcmVhdGVTdGF0aWNSb3V0ZXIuanMnO1xuaW1wb3J0IHR5cGUgUm91dGVyUmVuZGVyZXIgZnJvbSAnQHBsdW1pbGUvcm91dGVyL3JvdXRpbmcvUm91dGVyUmVuZGVyZXIuanMnO1xuaW1wb3J0IHR5cGUgUm91dGluZ0NvbnRleHQgZnJvbSAnQHBsdW1pbGUvcm91dGVyL3JvdXRpbmcvUm91dGluZ0NvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBjcmVhdGVSb3V0ZXJIeWRyYXRpb25TbmFwc2hvdCB9IGZyb20gJ0BwbHVtaWxlL3JvdXRlci9yb3V0aW5nL3JvdXRlckh5ZHJhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJvdXRlTm9kZSxcbiAgUm91dGVySHlkcmF0aW9uU25hcHNob3QsXG4gIFJvdXRlclJlZGlyZWN0U3RhdHVzLFxuICBSb3V0ZXJSZW5kZXJTdGF0dXMsXG59IGZyb20gJ0BwbHVtaWxlL3JvdXRlci90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIFNpdGVNZXRhRGVzY3JpcHRvciA9XG4gIHwgeyBuYW1lOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZzsgbWVkaWE/OiBzdHJpbmcgfVxuICB8IHsgcHJvcGVydHk6IHN0cmluZzsgY29udGVudDogc3RyaW5nOyBtZWRpYT86IHN0cmluZyB9O1xuXG5leHBvcnQgdHlwZSBTaXRlTGlua0Rlc2NyaXB0b3IgPSB7XG4gIHJlbDogc3RyaW5nO1xuICBocmVmOiBzdHJpbmc7XG4gIGFzPzogc3RyaW5nO1xuICBjb2xvcj86IHN0cmluZztcbiAgY3Jvc3NPcmlnaW4/OiAnYW5vbnltb3VzJyB8ICd1c2UtY3JlZGVudGlhbHMnO1xuICBocmVmTGFuZz86IHN0cmluZztcbiAgbWVkaWE/OiBzdHJpbmc7XG4gIHNpemVzPzogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2l0ZVNjcmlwdERlc2NyaXB0b3IgPSB7XG4gIHNyYzogc3RyaW5nO1xuICBhc3luYz86IGJvb2xlYW47XG4gIGRlZmVyPzogYm9vbGVhbjtcbiAgdHlwZT86ICdtb2R1bGUnO1xuICBhdHRyaWJ1dGVzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG59O1xuXG5leHBvcnQgdHlwZSBTaXRlSGVhZCA9IHtcbiAgdGl0bGU6IHN0cmluZztcbiAgbWV0YT86IHJlYWRvbmx5IFNpdGVNZXRhRGVzY3JpcHRvcltdO1xuICBsaW5rcz86IHJlYWRvbmx5IFNpdGVMaW5rRGVzY3JpcHRvcltdO1xuICBzY3JpcHRzPzogcmVhZG9ubHkgU2l0ZVNjcmlwdERlc2NyaXB0b3JbXTtcbn07XG5cbmV4cG9ydCB0eXBlIFNpdGVQYWdlRGVmaW5pdGlvbjxUQ29udGV4dD4gPSB7XG4gIHBhdGg6IHN0cmluZztcbiAgbG9jYWxlOiBzdHJpbmc7XG4gIGh5ZHJhdGU6IGJvb2xlYW47XG4gIGhlYWQ6IChjb250ZXh0OiBUQ29udGV4dCkgPT4gU2l0ZUhlYWQ7XG59O1xuXG5leHBvcnQgdHlwZSBTaXRlUmVzb2x2ZWRBc3NldHMgPSB7XG4gIHN0eWxlc2hlZXRzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgbW9kdWxlUHJlbG9hZHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICBjbGllbnRFbnRyeTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFBsdW1pbGVTaXRlSHlkcmF0aW9uUGF5bG9hZCA9IHtcbiAgdmVyc2lvbjogMTtcbiAgcm91dGVQYXRoOiBzdHJpbmc7XG4gIHJvdXRlcjogUm91dGVySHlkcmF0aW9uU25hcHNob3Q7XG59O1xuXG5leHBvcnQgdHlwZSBTaXRlUm91dGVyTW9kdWxlPFRDb250ZXh0PiA9IHtcbiAgY3JlYXRlU3RhdGljUm91dGVyOiB0eXBlb2YgY3JlYXRlU3RhdGljUm91dGVyPFRDb250ZXh0PjtcbiAgY3JlYXRlUm91dGVySHlkcmF0aW9uU25hcHNob3Q6IHR5cGVvZiBjcmVhdGVSb3V0ZXJIeWRyYXRpb25TbmFwc2hvdDtcbiAgUm91dGVyUmVuZGVyZXI6IHR5cGVvZiBSb3V0ZXJSZW5kZXJlcjtcbiAgUm91dGluZ0NvbnRleHQ6IHR5cGVvZiBSb3V0aW5nQ29udGV4dDtcbn07XG5cbmV4cG9ydCB0eXBlIFJlbmRlclNpdGVSZXF1ZXN0T3B0aW9uczxUQ29udGV4dD4gPSB7XG4gIGxvY2F0aW9uOiB7IHBhdGhuYW1lOiBzdHJpbmc7IHNlYXJjaD86IHN0cmluZzsgaGFzaD86IHN0cmluZyB9O1xuICByb3V0ZXM6IFJvdXRlTm9kZVtdO1xuICBjb250ZXh0OiBUQ29udGV4dDtcbiAgcGFnZTogU2l0ZVBhZ2VEZWZpbml0aW9uPFRDb250ZXh0PjtcbiAgYXNzZXRzOiBTaXRlUmVzb2x2ZWRBc3NldHM7XG4gIGRvY3VtZW50TGlua3M/OiByZWFkb25seSBTaXRlTGlua0Rlc2NyaXB0b3JbXTtcbiAgZG9jdW1lbnRNZXRhPzogcmVhZG9ubHkgU2l0ZU1ldGFEZXNjcmlwdG9yW107XG4gIGRvY3VtZW50U2NyaXB0cz86IHJlYWRvbmx5IFNpdGVTY3JpcHREZXNjcmlwdG9yW107XG4gIHJvdXRlck1vZHVsZT86IFNpdGVSb3V0ZXJNb2R1bGU8VENvbnRleHQ+O1xufTtcblxuZXhwb3J0IHR5cGUgU2l0ZUh0bWxSZXNwb25zZSA9IHtcbiAga2luZDogJ2h0bWwnO1xuICBzdGF0dXM6IFJvdXRlclJlbmRlclN0YXR1cztcbiAgaHRtbDogc3RyaW5nO1xuICByb3V0ZVBhdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNpdGVSZWRpcmVjdFJlc3BvbnNlID0ge1xuICBraW5kOiAncmVkaXJlY3QnO1xuICBzdGF0dXM6IFJvdXRlclJlZGlyZWN0U3RhdHVzO1xuICBsb2NhdGlvbjogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2l0ZU5vdEZvdW5kUmVzcG9uc2UgPSB7IGtpbmQ6ICdub3QtZm91bmQnOyBzdGF0dXM6IDQwNCB9O1xuXG5leHBvcnQgdHlwZSBTaXRlUmVzcG9uc2UgPVxuICBTaXRlSHRtbFJlc3BvbnNlIHwgU2l0ZVJlZGlyZWN0UmVzcG9uc2UgfCBTaXRlTm90Rm91bmRSZXNwb25zZTtcblxuZXhwb3J0IHR5cGUgV3JpdGVTdGF0aWNTaXRlT3B0aW9uczxUQ29udGV4dD4gPSB7XG4gIHBhZ2VzOiByZWFkb25seSBTaXRlUGFnZURlZmluaXRpb248VENvbnRleHQ+W107XG4gIHJlbmRlcjogKHBhZ2U6IFNpdGVQYWdlRGVmaW5pdGlvbjxUQ29udGV4dD4pID0+IFByb21pc2U8U2l0ZVJlc3BvbnNlPjtcbiAgb3V0RGlyOiBzdHJpbmc7XG4gIG5vdEZvdW5kUGFnZXM/OiByZWFkb25seSB7XG4gICAgb3V0cHV0OiBzdHJpbmc7XG4gICAgcmVuZGVyOiAoKSA9PiBQcm9taXNlPFNpdGVSZXNwb25zZT47XG4gIH1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIFNpdGVIdHRwUmVzcG9uc2UgPSB7XG4gIHN0YXR1czogbnVtYmVyO1xuICBoZWFkZXJzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgYm9keTogc3RyaW5nO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeStaticSite.d.ts","sourceRoot":"","sources":["../../../src/node/writeStaticSite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAsB,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAG7E,wBAAsB,eAAe,CAAC,QAAQ,EAC5C,OAAO,EAAE,sBAAsB,CAAC,QAAQ,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAqCf"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, isAbsolute, relative, resolve } from 'node:path';
|
|
3
|
+
export async function writeStaticSite(options) {
|
|
4
|
+
const root = resolve(options.outDir);
|
|
5
|
+
const outputs = new Map();
|
|
6
|
+
const pages = options.pages.map((page) => {
|
|
7
|
+
validatePage(page);
|
|
8
|
+
let relativeOutput = `${page.path.slice(1)}index.html`;
|
|
9
|
+
if (page.path === '/') {
|
|
10
|
+
relativeOutput = 'index.html';
|
|
11
|
+
}
|
|
12
|
+
const output = resolveOutput(root, relativeOutput);
|
|
13
|
+
registerOutput(outputs, output, page.path);
|
|
14
|
+
return { page, output };
|
|
15
|
+
});
|
|
16
|
+
const notFoundPages = (options.notFoundPages ?? []).map((page) => {
|
|
17
|
+
const output = resolveOutput(root, page.output);
|
|
18
|
+
registerOutput(outputs, output, page.output);
|
|
19
|
+
return { ...page, output };
|
|
20
|
+
});
|
|
21
|
+
for (const item of pages) {
|
|
22
|
+
const response = await options.render(item.page);
|
|
23
|
+
if (response.kind !== 'html') {
|
|
24
|
+
throw new Error(`Static page ${item.page.path} did not return HTML`);
|
|
25
|
+
}
|
|
26
|
+
await mkdir(dirname(item.output), { recursive: true });
|
|
27
|
+
await writeFile(item.output, response.html, 'utf8');
|
|
28
|
+
}
|
|
29
|
+
for (const item of notFoundPages) {
|
|
30
|
+
const response = await item.render();
|
|
31
|
+
if (response.kind !== 'html' || response.status !== 404) {
|
|
32
|
+
throw new Error(`Not-found output ${item.output} must return HTML status 404`);
|
|
33
|
+
}
|
|
34
|
+
await mkdir(dirname(item.output), { recursive: true });
|
|
35
|
+
await writeFile(item.output, response.html, 'utf8');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function validatePage(page) {
|
|
39
|
+
if (typeof page.path !== 'string' ||
|
|
40
|
+
!page.path.startsWith('/') ||
|
|
41
|
+
!page.path.endsWith('/') ||
|
|
42
|
+
/[:*{}]/.test(page.path) ||
|
|
43
|
+
page.path.includes('?') ||
|
|
44
|
+
page.path.includes('#') ||
|
|
45
|
+
page.path.includes('\\') ||
|
|
46
|
+
page.path.split('/').includes('..')) {
|
|
47
|
+
throw new Error(`Invalid concrete site page path: ${String(page.path)}`);
|
|
48
|
+
}
|
|
49
|
+
if (page.locale.trim() === '') {
|
|
50
|
+
throw new Error('Site page locale must not be empty');
|
|
51
|
+
}
|
|
52
|
+
if (typeof page.hydrate !== 'boolean') {
|
|
53
|
+
throw new Error('Site page hydrate must be explicit');
|
|
54
|
+
}
|
|
55
|
+
if (typeof page.head !== 'function') {
|
|
56
|
+
throw new Error('Site page head must be a function');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function resolveOutput(root, output) {
|
|
60
|
+
if (output.trim() === '' || isAbsolute(output) || output.includes('\\')) {
|
|
61
|
+
throw new Error(`Invalid static output: ${output}`);
|
|
62
|
+
}
|
|
63
|
+
const target = resolve(root, output);
|
|
64
|
+
const rel = relative(root, target);
|
|
65
|
+
if (rel === '..' || rel.startsWith('../') || isAbsolute(rel)) {
|
|
66
|
+
throw new Error(`Static output escapes outDir: ${output}`);
|
|
67
|
+
}
|
|
68
|
+
return target;
|
|
69
|
+
}
|
|
70
|
+
function registerOutput(outputs, output, source) {
|
|
71
|
+
const previous = outputs.get(output);
|
|
72
|
+
if (previous != null) {
|
|
73
|
+
throw new Error(`Static output collision between ${previous} and ${source}`);
|
|
74
|
+
}
|
|
75
|
+
outputs.set(output, source);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVTdGF0aWNTaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vZGUvd3JpdGVTdGF0aWNTaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUtuRSxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FDbkMsT0FBeUM7SUFFekMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ3ZDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixJQUFJLGNBQWMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDdkQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLGNBQWMsR0FBRyxZQUFZLENBQUM7UUFDaEMsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDbkQsY0FBYyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxD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QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgZGlybmFtZSwgaXNBYnNvbHV0ZSwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7IFNpdGVQYWdlRGVmaW5pdGlvbiwgV3JpdGVTdGF0aWNTaXRlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogUmVuZGVycyBldmVyeSBkZWNsYXJlZCBwYWdlIGludG8gYSBzYWZlIHBhdGggYmVsb3cgdGhlIG91dHB1dCBkaXJlY3RvcnkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVTdGF0aWNTaXRlPFRDb250ZXh0PihcbiAgb3B0aW9uczogV3JpdGVTdGF0aWNTaXRlT3B0aW9uczxUQ29udGV4dD4sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgcm9vdCA9IHJlc29sdmUob3B0aW9ucy5vdXREaXIpO1xuICBjb25zdCBvdXRwdXRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgcGFnZXMgPSBvcHRpb25zLnBhZ2VzLm1hcCgocGFnZSkgPT4ge1xuICAgIHZhbGlkYXRlUGFnZShwYWdlKTtcbiAgICBsZXQgcmVsYXRpdmVPdXRwdXQgPSBgJHtwYWdlLnBhdGguc2xpY2UoMSl9aW5kZXguaHRtbGA7XG4gICAgaWYgKHBhZ2UucGF0aCA9PT0gJy8nKSB7XG4gICAgICByZWxhdGl2ZU91dHB1dCA9ICdpbmRleC5odG1sJztcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzb2x2ZU91dHB1dChyb290LCByZWxhdGl2ZU91dHB1dCk7XG4gICAgcmVnaXN0ZXJPdXRwdXQob3V0cHV0cywgb3V0cHV0LCBwYWdlLnBhdGgpO1xuICAgIHJldHVybiB7IHBhZ2UsIG91dHB1dCB9O1xuICB9KTtcbiAgY29uc3Qgbm90Rm91bmRQYWdlcyA9IChvcHRpb25zLm5vdEZvdW5kUGFnZXMgPz8gW10pLm1hcCgocGFnZSkgPT4ge1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc29sdmVPdXRwdXQocm9vdCwgcGFnZS5vdXRwdXQpO1xuICAgIHJlZ2lzdGVyT3V0cHV0KG91dHB1dHMsIG91dHB1dCwgcGFnZS5vdXRwdXQpO1xuICAgIHJldHVybiB7IC4uLnBhZ2UsIG91dHB1dCB9O1xuICB9KTtcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFnZXMpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9wdGlvbnMucmVuZGVyKGl0ZW0ucGFnZSk7XG4gICAgaWYgKHJlc3BvbnNlLmtpbmQgIT09ICdodG1sJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGF0aWMgcGFnZSAke2l0ZW0ucGFnZS5wYXRofSBkaWQgbm90IHJldHVybiBIVE1MYCk7XG4gICAgfVxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoaXRlbS5vdXRwdXQpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoaXRlbS5vdXRwdXQsIHJlc3BvbnNlLmh0bWwsICd1dGY4Jyk7XG4gIH1cbiAgZm9yIChjb25zdCBpdGVtIG9mIG5vdEZvdW5kUGFnZXMpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGl0ZW0ucmVuZGVyKCk7XG4gICAgaWYgKHJlc3BvbnNlLmtpbmQgIT09ICdodG1sJyB8fCByZXNwb25zZS5zdGF0dXMgIT09IDQwNCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm90LWZvdW5kIG91dHB1dCAke2l0ZW0ub3V0cHV0fSBtdXN0IHJldHVybiBIVE1MIHN0YXR1cyA0MDRgLFxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShpdGVtLm91dHB1dCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHdyaXRlRmlsZShpdGVtLm91dHB1dCwgcmVzcG9uc2UuaHRtbCwgJ3V0ZjgnKTtcbiAgfVxufVxuXG4vKiogVmFsaWRhdGVzIHRoZSBzdGF0aWMgcGFnZSBwYXRoIGFuZCBvcHRpb25hbCBvdXRwdXQgb3ZlcnJpZGUuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVBhZ2U8VENvbnRleHQ+KHBhZ2U6IFNpdGVQYWdlRGVmaW5pdGlvbjxUQ29udGV4dD4pOiB2b2lkIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBwYWdlLnBhdGggIT09ICdzdHJpbmcnIHx8XG4gICAgIXBhZ2UucGF0aC5zdGFydHNXaXRoKCcvJykgfHxcbiAgICAhcGFnZS5wYXRoLmVuZHNXaXRoKCcvJykgfHxcbiAgICAvWzoqe31dLy50ZXN0KHBhZ2UucGF0aCkgfHxcbiAgICBwYWdlLnBhdGguaW5jbHVkZXMoJz8nKSB8fFxuICAgIHBhZ2UucGF0aC5pbmNsdWRlcygnIycpIHx8XG4gICAgcGFnZS5wYXRoLmluY2x1ZGVzKCdcXFxcJykgfHxcbiAgICBwYWdlLnBhdGguc3BsaXQoJy8nKS5pbmNsdWRlcygnLi4nKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uY3JldGUgc2l0ZSBwYWdlIHBhdGg6ICR7U3RyaW5nKHBhZ2UucGF0aCl9YCk7XG4gIH1cbiAgaWYgKHBhZ2UubG9jYWxlLnRyaW0oKSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpdGUgcGFnZSBsb2NhbGUgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgfVxuICBpZiAodHlwZW9mIHBhZ2UuaHlkcmF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaXRlIHBhZ2UgaHlkcmF0ZSBtdXN0IGJlIGV4cGxpY2l0Jyk7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYWdlLmhlYWQgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NpdGUgcGFnZSBoZWFkIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG59XG5cbi8qKiBSZXNvbHZlcyBhbiBvdXRwdXQgd2hpbGUgcHJldmVudGluZyBhYnNvbHV0ZSBwYXRocyBhbmQgZGlyZWN0b3J5IHRyYXZlcnNhbC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVPdXRwdXQocm9vdDogc3RyaW5nLCBvdXRwdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChvdXRwdXQudHJpbSgpID09PSAnJyB8fCBpc0Fic29sdXRlKG91dHB1dCkgfHwgb3V0cHV0LmluY2x1ZGVzKCdcXFxcJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3RhdGljIG91dHB1dDogJHtvdXRwdXR9YCk7XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZShyb290LCBvdXRwdXQpO1xuICBjb25zdCByZWwgPSByZWxhdGl2ZShyb290LCB0YXJnZXQpO1xuICBpZiAocmVsID09PSAnLi4nIHx8IHJlbC5zdGFydHNXaXRoKCcuLi8nKSB8fCBpc0Fic29sdXRlKHJlbCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YXRpYyBvdXRwdXQgZXNjYXBlcyBvdXREaXI6ICR7b3V0cHV0fWApO1xuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKiBSZWplY3RzIHR3byBwYWdlcyB0aGF0IHJlc29sdmUgdG8gdGhlIHNhbWUgb3V0cHV0IGZpbGUuICovXG5mdW5jdGlvbiByZWdpc3Rlck91dHB1dChcbiAgb3V0cHV0czogTWFwPHN0cmluZywgc3RyaW5nPixcbiAgb3V0cHV0OiBzdHJpbmcsXG4gIHNvdXJjZTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGNvbnN0IHByZXZpb3VzID0gb3V0cHV0cy5nZXQob3V0cHV0KTtcbiAgaWYgKHByZXZpb3VzICE9IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgU3RhdGljIG91dHB1dCBjb2xsaXNpb24gYmV0d2VlbiAke3ByZXZpb3VzfSBhbmQgJHtzb3VyY2V9YCxcbiAgICApO1xuICB9XG4gIG91dHB1dHMuc2V0KG91dHB1dCwgc291cmNlKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RouterHydrationSnapshot } from '@plumile/router/types.js';
|
|
2
|
+
export type PlumileSiteHydrationPayload = {
|
|
3
|
+
version: 1;
|
|
4
|
+
routePath: string;
|
|
5
|
+
router: RouterHydrationSnapshot;
|
|
6
|
+
};
|
|
7
|
+
export declare function readHydrationPayload(document: Document): PlumileSiteHydrationPayload;
|
|
8
|
+
//# sourceMappingURL=hydrationPayload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydrationPayload.d.ts","sourceRoot":"","sources":["../../../src/runtime/hydrationPayload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,uBAAuB,CAAC;CACjC,CAAC;AAGF,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,GACjB,2BAA2B,CAiB7B"}
|