@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.
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
@@ -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, '&amp;')
281
+ .replace(/</g, '&lt;')
282
+ .replace(/>/g, '&gt;')
283
+ .replace(/"/g, '&quot;');
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,3 @@
1
+ import type { WriteStaticSiteOptions } from './types.js';
2
+ export declare function writeStaticSite<TContext>(options: WriteStaticSiteOptions<TContext>): Promise<void>;
3
+ //# sourceMappingURL=writeStaticSite.d.ts.map
@@ -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"}