@plumile/site 0.2.2 → 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,81 @@
1
+ export function readHydrationPayload(document) {
2
+ const elements = document.querySelectorAll('#__PLUMILE_SITE__');
3
+ if (elements.length !== 1) {
4
+ throw new Error('Expected exactly one Plumile site hydration payload');
5
+ }
6
+ const text = document.getElementById('__PLUMILE_SITE__')?.textContent;
7
+ if (text == null || text.trim() === '') {
8
+ throw new Error('Plumile site hydration payload is empty');
9
+ }
10
+ let value;
11
+ try {
12
+ value = JSON.parse(text);
13
+ }
14
+ catch {
15
+ throw new Error('Plumile site hydration payload is invalid JSON');
16
+ }
17
+ assertHydrationPayload(value);
18
+ return value;
19
+ }
20
+ function assertHydrationPayload(value) {
21
+ if (typeof value !== 'object' || value == null) {
22
+ throw new Error('Plumile site hydration payload is malformed');
23
+ }
24
+ const payload = value;
25
+ assertExactKeys(payload, ['version', 'routePath', 'router']);
26
+ if (payload.version !== 1 || typeof payload.routePath !== 'string') {
27
+ throw new Error('Plumile site hydration payload is malformed');
28
+ }
29
+ const router = payload.router;
30
+ if (typeof router?.version !== 'number' ||
31
+ router.version !== 1 ||
32
+ !Array.isArray(router.segments)) {
33
+ throw new Error('Plumile site router hydration payload is malformed');
34
+ }
35
+ const location = router.location;
36
+ if (typeof location !== 'object' ||
37
+ location == null ||
38
+ typeof location.pathname !== 'string' ||
39
+ typeof location.search !== 'string' ||
40
+ typeof location.hash !== 'string') {
41
+ throw new Error('Plumile site router hydration payload is malformed');
42
+ }
43
+ router.segments.forEach((segment) => {
44
+ if (typeof segment !== 'object' ||
45
+ segment == null ||
46
+ typeof segment.key !== 'string' ||
47
+ !('prepared' in segment)) {
48
+ throw new Error('Plumile site router hydration payload is malformed');
49
+ }
50
+ assertJsonValue(segment.prepared);
51
+ });
52
+ }
53
+ function assertExactKeys(value, expected) {
54
+ const expectedKeys = new Set(expected);
55
+ if (Object.keys(value).length !== expected.length ||
56
+ Object.keys(value).some((key) => {
57
+ return !expectedKeys.has(key);
58
+ })) {
59
+ throw new Error('Plumile site hydration payload is malformed');
60
+ }
61
+ }
62
+ function assertJsonValue(value) {
63
+ if (value == null ||
64
+ typeof value === 'string' ||
65
+ typeof value === 'boolean') {
66
+ return;
67
+ }
68
+ if (typeof value === 'number' && Number.isFinite(value)) {
69
+ return;
70
+ }
71
+ if (Array.isArray(value)) {
72
+ value.forEach(assertJsonValue);
73
+ return;
74
+ }
75
+ if (typeof value !== 'object' ||
76
+ Object.getPrototypeOf(value) !== Object.prototype) {
77
+ throw new Error('Plumile site router hydration payload is malformed');
78
+ }
79
+ Object.values(value).forEach(assertJsonValue);
80
+ }
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlkcmF0aW9uUGF5bG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW50aW1lL2h5ZHJhdGlvblBheWxvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxRQUFrQjtJQUVsQixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsV0FBVyxDQUFDO0lBQ3RFLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxJQUFJLEtBQWMsQ0FBQztJQUNuQixJQUFJLENBQUM7UUFDSCxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQVksQ0FBQztJQUN0QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDRCxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFHRCxTQUFTLHNCQUFzQixDQUM3QixLQUFjO0lBRWQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsTUFB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LENBQUMsS0FBSyxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFDakQsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUm91dGVySHlkcmF0aW9uU25hcHNob3QgfSBmcm9tICdAcGx1bWlsZS9yb3V0ZXIvdHlwZXMuanMnO1xuXG5leHBvcnQgdHlwZSBQbHVtaWxlU2l0ZUh5ZHJhdGlvblBheWxvYWQgPSB7XG4gIHZlcnNpb246IDE7XG4gIHJvdXRlUGF0aDogc3RyaW5nO1xuICByb3V0ZXI6IFJvdXRlckh5ZHJhdGlvblNuYXBzaG90O1xufTtcblxuLyoqIFJlYWRzIGFuZCB2YWxpZGF0ZXMgdGhlIHNlcnZlci1wcm92aWRlZCBoeWRyYXRpb24gcGF5bG9hZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkSHlkcmF0aW9uUGF5bG9hZChcbiAgZG9jdW1lbnQ6IERvY3VtZW50LFxuKTogUGx1bWlsZVNpdGVIeWRyYXRpb25QYXlsb2FkIHtcbiAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjX19QTFVNSUxFX1NJVEVfXycpO1xuICBpZiAoZWxlbWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBleGFjdGx5IG9uZSBQbHVtaWxlIHNpdGUgaHlkcmF0aW9uIHBheWxvYWQnKTtcbiAgfVxuICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fUExVTUlMRV9TSVRFX18nKT8udGV4dENvbnRlbnQ7XG4gIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC50cmltKCkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQbHVtaWxlIHNpdGUgaHlkcmF0aW9uIHBheWxvYWQgaXMgZW1wdHknKTtcbiAgfVxuICBsZXQgdmFsdWU6IHVua25vd247XG4gIHRyeSB7XG4gICAgdmFsdWUgPSBKU09OLnBhcnNlKHRleHQpIGFzIHVua25vd247XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignUGx1bWlsZSBzaXRlIGh5ZHJhdGlvbiBwYXlsb2FkIGlzIGludmFsaWQgSlNPTicpO1xuICB9XG4gIGFzc2VydEh5ZHJhdGlvblBheWxvYWQodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKiBWYWxpZGF0ZXMgdGhlIGNvbXBsZXRlIGh5ZHJhdGlvbiBwYXlsb2FkIGJvdW5kYXJ5LiAqL1xuZnVuY3Rpb24gYXNzZXJ0SHlkcmF0aW9uUGF5bG9hZChcbiAgdmFsdWU6IHVua25vd24sXG4pOiBhc3NlcnRzIHZhbHVlIGlzIFBsdW1pbGVTaXRlSHlkcmF0aW9uUGF5bG9hZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsdW1pbGUgc2l0ZSBoeWRyYXRpb24gcGF5bG9hZCBpcyBtYWxmb3JtZWQnKTtcbiAgfVxuICBjb25zdCBwYXlsb2FkID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGFzc2VydEV4YWN0S2V5cyhwYXlsb2FkLCBbJ3ZlcnNpb24nLCAncm91dGVQYXRoJywgJ3JvdXRlciddKTtcbiAgaWYgKHBheWxvYWQudmVyc2lvbiAhPT0gMSB8fCB0eXBlb2YgcGF5bG9hZC5yb3V0ZVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQbHVtaWxlIHNpdGUgaHlkcmF0aW9uIHBheWxvYWQgaXMgbWFsZm9ybWVkJyk7XG4gIH1cbiAgY29uc3Qgcm91dGVyID0gcGF5bG9hZC5yb3V0ZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHwgdW5kZWZpbmVkO1xuICBpZiAoXG4gICAgdHlwZW9mIHJvdXRlcj8udmVyc2lvbiAhPT0gJ251bWJlcicgfHxcbiAgICByb3V0ZXIudmVyc2lvbiAhPT0gMSB8fFxuICAgICFBcnJheS5pc0FycmF5KHJvdXRlci5zZWdtZW50cylcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQbHVtaWxlIHNpdGUgcm91dGVyIGh5ZHJhdGlvbiBwYXlsb2FkIGlzIG1hbGZvcm1lZCcpO1xuICB9XG4gIGNvbnN0IGxvY2F0aW9uID0gcm91dGVyLmxvY2F0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgaWYgKFxuICAgIHR5cGVvZiBsb2NhdGlvbiAhPT0gJ29iamVjdCcgfHxcbiAgICBsb2NhdGlvbiA9PSBudWxsIHx8XG4gICAgdHlwZW9mIGxvY2F0aW9uLnBhdGhuYW1lICE9PSAnc3RyaW5nJyB8fFxuICAgIHR5cGVvZiBsb2NhdGlvbi5zZWFyY2ggIT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIGxvY2F0aW9uLmhhc2ggIT09ICdzdHJpbmcnXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGx1bWlsZSBzaXRlIHJvdXRlciBoeWRyYXRpb24gcGF5bG9hZCBpcyBtYWxmb3JtZWQnKTtcbiAgfVxuICByb3V0ZXIuc2VnbWVudHMuZm9yRWFjaCgoc2VnbWVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBzZWdtZW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgc2VnbWVudCA9PSBudWxsIHx8XG4gICAgICB0eXBlb2YgKHNlZ21lbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmtleSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICEoJ3ByZXBhcmVkJyBpbiBzZWdtZW50KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbHVtaWxlIHNpdGUgcm91dGVyIGh5ZHJhdGlvbiBwYXlsb2FkIGlzIG1hbGZvcm1lZCcpO1xuICAgIH1cbiAgICBhc3NlcnRKc29uVmFsdWUoKHNlZ21lbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnByZXBhcmVkKTtcbiAgfSk7XG59XG5cbi8qKiBSZXF1aXJlcyBhbiBvYmplY3QgdG8gY29udGFpbiBleGFjdGx5IHRoZSBleHBlY3RlZCBrZXlzLiAqL1xuZnVuY3Rpb24gYXNzZXJ0RXhhY3RLZXlzKFxuICB2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGV4cGVjdGVkOiByZWFkb25seSBzdHJpbmdbXSxcbik6IHZvaWQge1xuICBjb25zdCBleHBlY3RlZEtleXMgPSBuZXcgU2V0KGV4cGVjdGVkKTtcbiAgaWYgKFxuICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggIT09IGV4cGVjdGVkLmxlbmd0aCB8fFxuICAgIE9iamVjdC5rZXlzKHZhbHVlKS5zb21lKChrZXkpID0+IHtcbiAgICAgIHJldHVybiAhZXhwZWN0ZWRLZXlzLmhhcyhrZXkpO1xuICAgIH0pXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGx1bWlsZSBzaXRlIGh5ZHJhdGlvbiBwYXlsb2FkIGlzIG1hbGZvcm1lZCcpO1xuICB9XG59XG5cbi8qKiBSZWplY3RzIHZhbHVlcyBvdXRzaWRlIHRoZSBmaW5pdGUgSlNPTiBoeWRyYXRpb24gY29udHJhY3QuICovXG5mdW5jdGlvbiBhc3NlcnRKc29uVmFsdWUodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKFxuICAgIHZhbHVlID09IG51bGwgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaChhc3NlcnRKc29uVmFsdWUpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoXG4gICAgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fFxuICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgIT09IE9iamVjdC5wcm90b3R5cGVcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQbHVtaWxlIHNpdGUgcm91dGVyIGh5ZHJhdGlvbiBwYXlsb2FkIGlzIG1hbGZvcm1lZCcpO1xuICB9XG4gIE9iamVjdC52YWx1ZXModmFsdWUpLmZvckVhY2goYXNzZXJ0SnNvblZhbHVlKTtcbn1cbiJdfQ==
@@ -1,35 +1,26 @@
1
- import { type PlumileSiteManifest } from '../manifest/index.js';
2
1
  import type { ComponentType, ReactElement, ReactNode, createElement } from 'react';
3
2
  import type { hydrateRoot } from 'react-dom/client';
4
- export type InternalLinkDecision = {
5
- external: boolean;
6
- hashOnly: boolean;
7
- modified: boolean;
8
- shouldHandle: boolean;
9
- };
10
- export type LinkClickLike = {
11
- altKey?: boolean;
12
- button?: number;
13
- ctrlKey?: boolean;
14
- metaKey?: boolean;
15
- shiftKey?: boolean;
16
- };
17
- export type BrowserNavigationEvent = LinkClickLike & {
18
- currentTarget?: EventTarget | null;
19
- preventDefault?: () => void;
20
- };
3
+ import type { ParamData } from 'path-to-regexp';
4
+ import type { RouteEntry, RouteNode, RouterHydrationSnapshot } from '@plumile/router/types.js';
5
+ import { type PlumileSiteHydrationPayload } from './hydrationPayload.js';
6
+ export type { PlumileSiteHydrationPayload } from './hydrationPayload.js';
7
+ export { createScrollRestoration, type SiteScrollRestoration, } from './scrollRestoration.js';
21
8
  export type HydrateSiteRuntime = {
22
9
  createElement: typeof createElement;
23
10
  hydrateRoot: typeof hydrateRoot;
24
11
  };
25
12
  export type HydrateSiteRouterModule<TContext> = {
26
- createRouter: (routes: unknown[], options?: {
13
+ createRouter: (routes: RouteNode[], options: {
27
14
  context?: TContext;
15
+ getContext?: () => TContext;
16
+ hydrationSnapshot: RouterHydrationSnapshot;
28
17
  }) => {
29
18
  context: unknown;
19
+ cleanup?: () => void;
30
20
  };
31
21
  RouterRenderer: ComponentType<{
32
22
  fallback?: ReactNode;
23
+ onRouteCommit?: (entry: RouteEntry<ParamData>) => void;
33
24
  }>;
34
25
  RoutingContext: {
35
26
  Provider: ComponentType<{
@@ -38,21 +29,38 @@ export type HydrateSiteRouterModule<TContext> = {
38
29
  }>;
39
30
  };
40
31
  };
41
- export type HydrateSiteOptions<TContext = unknown> = {
42
- container?: Element | null;
32
+ export type HydrateSiteOptions<TContext> = {
33
+ routes: RouteNode[];
43
34
  context?: TContext;
44
- document?: Document;
35
+ getContext?: () => TContext;
45
36
  fallback?: ReactElement | string | null;
46
- manifest?: PlumileSiteManifest;
47
- manifestGlobalName?: string;
37
+ container?: Element;
38
+ document?: Document;
48
39
  runtime?: HydrateSiteRuntime;
49
40
  routerModule?: HydrateSiteRouterModule<TContext>;
50
- routes: unknown[];
51
- window?: Window;
41
+ onRouteCommit?: (entry: RouteEntry<ParamData>) => void;
52
42
  };
53
43
  export type HydrateSiteResult = {
54
- manifest: PlumileSiteManifest;
44
+ payload: PlumileSiteHydrationPayload;
55
45
  routerContext: unknown;
46
+ cleanup?: () => void;
47
+ };
48
+ export type InternalLinkDecision = {
49
+ external: boolean;
50
+ hashOnly: boolean;
51
+ modified: boolean;
52
+ shouldHandle: boolean;
53
+ };
54
+ export type LinkClickLike = {
55
+ altKey?: boolean;
56
+ button?: number;
57
+ ctrlKey?: boolean;
58
+ metaKey?: boolean;
59
+ shiftKey?: boolean;
60
+ };
61
+ export type BrowserNavigationEvent = LinkClickLike & {
62
+ currentTarget?: EventTarget | null;
63
+ preventDefault?: () => void;
56
64
  };
57
65
  export type SiteSearchIndexEntry = {
58
66
  content?: string;
@@ -70,13 +78,13 @@ export type SiteSearchIndex = {
70
78
  export type SiteSearchResult = SiteSearchIndexEntry & {
71
79
  score: number;
72
80
  };
81
+ export declare function hydratePlumileSite<TContext = unknown>(options: HydrateSiteOptions<TContext>): Promise<HydrateSiteResult>;
73
82
  export declare function shouldHandleSiteNavigation(href: string, currentUrl: string, event?: LinkClickLike): InternalLinkDecision;
74
83
  export declare function normalizeSitePath(pathname: string): string;
75
84
  export declare function searchSiteIndex(index: SiteSearchIndex, query: string, options?: {
76
85
  locale?: string;
77
86
  limit?: number;
78
87
  }): SiteSearchResult[];
79
- export declare function hydratePlumileSite<TContext = unknown>(options: HydrateSiteOptions<TContext>): Promise<HydrateSiteResult>;
80
88
  export declare function attachSiteNavigationHandler(input: {
81
89
  currentUrl: string;
82
90
  event: BrowserNavigationEvent;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,57 @@
1
- import { assertSiteManifest, } from '../manifest/index.js';
1
+ import { readHydrationPayload, } from './hydrationPayload.js';
2
+ export { createScrollRestoration, } from './scrollRestoration.js';
3
+ export async function hydratePlumileSite(options) {
4
+ const doc = options.document ?? globalThis.document;
5
+ const container = options.container ?? doc.getElementById('root') ?? undefined;
6
+ if (container == null) {
7
+ throw new Error('Cannot hydrate Plumile site without a root container');
8
+ }
9
+ const payload = readHydrationPayload(doc);
10
+ const win = doc.defaultView ?? globalThis.window;
11
+ if (payload.routePath !== win.location.pathname) {
12
+ throw new Error('Plumile site route path does not match window location');
13
+ }
14
+ const browserSearchValue = win.location.search;
15
+ const browserHashValue = win.location.hash;
16
+ let browserSearch = '';
17
+ let browserHash = '';
18
+ if (typeof browserSearchValue === 'string') {
19
+ browserSearch = browserSearchValue;
20
+ }
21
+ if (typeof browserHashValue === 'string') {
22
+ browserHash = browserHashValue;
23
+ }
24
+ let hydrationSnapshot = payload.router;
25
+ if (payload.router.segments.length === 0 &&
26
+ (payload.router.location.search !== browserSearch ||
27
+ payload.router.location.hash !== browserHash)) {
28
+ hydrationSnapshot = {
29
+ ...payload.router,
30
+ location: {
31
+ pathname: win.location.pathname,
32
+ search: browserSearch,
33
+ hash: browserHash,
34
+ },
35
+ };
36
+ }
37
+ const runtime = options.runtime ?? (await loadHydrateRuntime());
38
+ const routerModule = options.routerModule ?? (await loadHydrateRouterModule());
39
+ const router = routerModule.createRouter(options.routes, {
40
+ context: options.context,
41
+ getContext: options.getContext,
42
+ hydrationSnapshot,
43
+ });
44
+ const element = runtime.createElement(routerModule.RoutingContext.Provider, { value: router.context }, runtime.createElement(routerModule.RouterRenderer, {
45
+ fallback: options.fallback ?? null,
46
+ onRouteCommit: options.onRouteCommit,
47
+ }));
48
+ runtime.hydrateRoot(container, element);
49
+ return {
50
+ payload,
51
+ routerContext: router.context,
52
+ cleanup: router.cleanup,
53
+ };
54
+ }
2
55
  export function shouldHandleSiteNavigation(href, currentUrl, event = {}) {
3
56
  const modified = event.altKey === true ||
4
57
  event.ctrlKey === true ||
@@ -21,33 +74,31 @@ export function shouldHandleSiteNavigation(href, currentUrl, event = {}) {
21
74
  }
22
75
  export function normalizeSitePath(pathname) {
23
76
  const trimmed = pathname.trim();
24
- if (trimmed === '') {
77
+ if (trimmed === '')
25
78
  return '/';
26
- }
27
79
  const normalized = `/${trimmed}`.replace(/\/+/g, '/');
28
- if (normalized === '/') {
29
- return normalized;
30
- }
31
- if (normalized.endsWith('/')) {
80
+ if (normalized === '/' || normalized.endsWith('/'))
32
81
  return normalized;
33
- }
34
82
  return `${normalized}/`;
35
83
  }
36
84
  export function searchSiteIndex(index, query, options = {}) {
37
- const terms = normalizeSearchTerms(query);
38
- if (terms.length === 0) {
85
+ const terms = query
86
+ .toLocaleLowerCase()
87
+ .split(/\s+/)
88
+ .map((term) => {
89
+ return term.trim();
90
+ })
91
+ .filter((term) => {
92
+ return term !== '';
93
+ });
94
+ if (terms.length === 0)
39
95
  return [];
40
- }
41
- const limit = options.limit ?? 10;
42
96
  return index.entries
43
97
  .filter((entry) => {
44
98
  return options.locale == null || entry.locale === options.locale;
45
99
  })
46
100
  .map((entry) => {
47
- return {
48
- ...entry,
49
- score: scoreSearchEntry(entry, terms),
50
- };
101
+ return { ...entry, score: scoreSearchEntry(entry, terms) };
51
102
  })
52
103
  .filter((entry) => {
53
104
  return entry.score > 0;
@@ -59,30 +110,7 @@ export function searchSiteIndex(index, query, options = {}) {
59
110
  }
60
111
  return left.path.localeCompare(right.path);
61
112
  })
62
- .slice(0, limit);
63
- }
64
- export async function hydratePlumileSite(options) {
65
- const doc = options.document ?? globalThis.document;
66
- const win = options.window ?? globalThis.window;
67
- const container = options.container ?? doc.getElementById('root');
68
- if (container == null) {
69
- throw new Error('Cannot hydrate Plumile site without a root container');
70
- }
71
- const manifest = options.manifest ??
72
- readSerializedSiteManifest(win, options.manifestGlobalName);
73
- const runtime = options.runtime ?? (await loadHydrateRuntime());
74
- const routerModule = options.routerModule ?? (await loadHydrateRouterModule());
75
- const router = routerModule.createRouter(options.routes, {
76
- context: options.context,
77
- });
78
- const element = runtime.createElement(routerModule.RoutingContext.Provider, { value: router.context }, runtime.createElement(routerModule.RouterRenderer, {
79
- fallback: options.fallback ?? null,
80
- }));
81
- runtime.hydrateRoot(container, element);
82
- return {
83
- manifest,
84
- routerContext: router.context,
85
- };
113
+ .slice(0, options.limit ?? 10);
86
114
  }
87
115
  export function attachSiteNavigationHandler(input) {
88
116
  const href = readAnchorHref(input.event.currentTarget);
@@ -95,23 +123,13 @@ export function attachSiteNavigationHandler(input) {
95
123
  };
96
124
  }
97
125
  const decision = shouldHandleSiteNavigation(href, input.currentUrl, input.event);
98
- if (!decision.shouldHandle) {
126
+ if (!decision.shouldHandle)
99
127
  return decision;
100
- }
101
128
  input.event.preventDefault?.();
102
129
  const target = new URL(href, input.currentUrl);
103
130
  input.navigate(`${target.pathname}${target.search}${target.hash}`);
104
131
  return decision;
105
132
  }
106
- function normalizeSearchTerms(query) {
107
- return query
108
- .toLocaleLowerCase()
109
- .split(/\s+/)
110
- .map((term) => {
111
- return term.trim();
112
- })
113
- .filter(Boolean);
114
- }
115
133
  function scoreSearchEntry(entry, terms) {
116
134
  const title = entry.title.toLocaleLowerCase();
117
135
  const description = entry.description?.toLocaleLowerCase() ?? '';
@@ -122,40 +140,29 @@ function scoreSearchEntry(entry, terms) {
122
140
  .join(' ')
123
141
  .toLocaleLowerCase() ?? '';
124
142
  const content = entry.content?.toLocaleLowerCase() ?? '';
125
- let score = 0;
126
- for (const term of terms) {
143
+ return terms.reduce((score, term) => {
144
+ let termScore = 0;
127
145
  if (title.includes(term)) {
128
- score += 8;
146
+ termScore += 8;
129
147
  }
130
148
  if (headings.includes(term)) {
131
- score += 4;
149
+ termScore += 4;
132
150
  }
133
151
  if (description.includes(term)) {
134
- score += 2;
152
+ termScore += 2;
135
153
  }
136
154
  if (content.includes(term)) {
137
- score += 1;
155
+ termScore += 1;
138
156
  }
139
- }
140
- return score;
141
- }
142
- function readSerializedSiteManifest(windowValue, globalName = '__PLUMILE_SITE__') {
143
- if (windowValue == null) {
144
- throw new Error('Cannot read Plumile site manifest without window');
145
- }
146
- const value = Reflect.get(windowValue, globalName);
147
- assertSiteManifest(value);
148
- return value;
157
+ return score + termScore;
158
+ }, 0);
149
159
  }
150
160
  function readAnchorHref(target) {
151
- if (target == null) {
152
- return null;
161
+ const href = target?.href;
162
+ if (typeof href === 'string' && href !== '') {
163
+ return href;
153
164
  }
154
- const value = target;
155
- if (typeof value.href !== 'string' || value.href === '') {
156
- return null;
157
- }
158
- return value.href;
165
+ return null;
159
166
  }
160
167
  async function loadHydrateRuntime() {
161
168
  const [reactModule, domModule] = await Promise.all([
@@ -168,8 +175,15 @@ async function loadHydrateRuntime() {
168
175
  };
169
176
  }
170
177
  async function loadHydrateRouterModule() {
171
- const routerSpecifier = '@plumile/router';
172
- const routerModule = (await import(routerSpecifier));
173
- return routerModule;
178
+ const [createRouterModule, rendererModule, contextModule] = await Promise.all([
179
+ import('@plumile/router/routing/createRouter.js'),
180
+ import('@plumile/router/routing/RouterRenderer.js'),
181
+ import('@plumile/router/routing/RoutingContext.js'),
182
+ ]);
183
+ return {
184
+ createRouter: createRouterModule.default,
185
+ RouterRenderer: rendererModule.default,
186
+ RoutingContext: contextModule.default,
187
+ };
174
188
  }
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVudGltZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0JBQWtCLEdBRW5CLE1BQU0sc0JBQXNCLENBQUM7QUF1RjlCLE1BQU0sVUFBVSwwQkFBMEIsQ0FDeEMsSUFBWSxFQUNaLFVBQWtCLEVBQ2xCLEtBQUssR0FBa0IsRUFBRTtJQUV6QixNQUFNLFFBQVEsR0FDWixLQUFLLENBQUMsTUFBTSxLQUFLLElBQUk7UUFDckIsS0FBSyxDQUFDLE9BQU8sS0FBSyxJQUFJO1FBQ3RCLEtBQUssQ0FBQyxPQUFPLEtBQUssSUFBSTtRQUN0QixLQUFLLENBQUMsUUFBUSxLQUFLLElBQUk7UUFDdkIsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDaEQsTUFBTSxRQUFRLEdBQ1osQ0FBQyxRQUFRO1FBQ1QsSUFBSSxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsUUFBUTtRQUNsQyxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQyxNQUFNO1FBQzlCLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQztJQUU3QixPQUFPO1FBQ0wsUUFBUTtRQUNSLFFBQVE7UUFDUixRQUFRO1FBQ1IsWUFBWSxFQUFFLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUTtLQUNsRCxDQUFDO0FBQ0osQ0FBQztBQUtELE1BQU0s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QUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN4RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUM7QUFDcEIsQ0FBQztBQUtELEtBQUssVUFBVSxrQkFBa0I7SUFDL0IsTUFBTSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDakQsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNmLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztLQUMzQixDQUFDLENBQUM7SUFDSCxPQUFPO1FBQ0wsYUFBYSxFQUFFLFdBQVcsQ0FBQyxhQUFhO1FBQ3hDLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVztLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUtELEtBQUssVUFBVSx1QkFBdUI7SUFHcEMsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUM7SUFDMUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBWSxDQUFDO0lBQ2hFLE9BQU8sWUFBaUQsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYXNzZXJ0U2l0ZU1hbmlmZXN0LFxuICB0eXBlIFBsdW1pbGVTaXRlTWFuaWZlc3QsXG59IGZyb20gJy4uL21hbmlmZXN0L2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50VHlwZSxcbiAgUmVhY3RFbGVtZW50LFxuICBSZWFjdE5vZGUsXG4gIGNyZWF0ZUVsZW1lbnQsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgaHlkcmF0ZVJvb3QgfSBmcm9tICdyZWFjdC1kb20vY2xpZW50JztcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxMaW5rRGVjaXNpb24gPSB7XG4gIGV4dGVybmFsOiBib29sZWFuO1xuICBoYXNoT25seTogYm9vbGVhbjtcbiAgbW9kaWZpZWQ6IGJvb2xlYW47XG4gIHNob3VsZEhhbmRsZTogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIExpbmtDbGlja0xpa2UgPSB7XG4gIGFsdEtleT86IGJvb2xlYW47XG4gIGJ1dHRvbj86IG51bWJlcjtcbiAgY3RybEtleT86IGJvb2xlYW47XG4gIG1ldGFLZXk/OiBib29sZWFuO1xuICBzaGlmdEtleT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBCcm93c2VyTmF2aWdhdGlvbkV2ZW50ID0gTGlua0NsaWNrTGlrZSAmIHtcbiAgY3VycmVudFRhcmdldD86IEV2ZW50VGFyZ2V0IHwgbnVsbDtcbiAgcHJldmVudERlZmF1bHQ/OiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgSHlkcmF0ZVNpdGVSdW50aW1lID0ge1xuICBjcmVhdGVFbGVtZW50OiB0eXBlb2YgY3JlYXRlRWxlbWVudDtcbiAgaHlkcmF0ZVJvb3Q6IHR5cGVvZiBoeWRyYXRlUm9vdDtcbn07XG5cbmV4cG9ydCB0eXBlIEh5ZHJhdGVTaXRlUm91dGVyTW9kdWxlPFRDb250ZXh0PiA9IHtcbiAgY3JlYXRlUm91dGVyOiAoXG4gICAgcm91dGVzOiB1bmtub3duW10sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGNvbnRleHQ/OiBUQ29udGV4dDtcbiAgICB9LFxuICApID0+IHtcbiAgICBjb250ZXh0OiB1bmtub3duO1xuICB9O1xuICBSb3V0ZXJSZW5kZXJlcjogQ29tcG9uZW50VHlwZTx7IGZhbGxiYWNrPzogUmVhY3ROb2RlIH0+O1xuICBSb3V0aW5nQ29udGV4dDoge1xuICAgIFByb3ZpZGVyOiBDb21wb25lbnRUeXBlPHsgdmFsdWU6IHVua25vd247IGNoaWxkcmVuPzogUmVhY3ROb2RlIH0+O1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgSHlkcmF0ZVNpdGVPcHRpb25zPFRDb250ZXh0ID0gdW5rbm93bj4gPSB7XG4gIGNvbnRhaW5lcj86IEVsZW1lbnQgfCBudWxsO1xuICBjb250ZXh0PzogVENvbnRleHQ7XG4gIGRvY3VtZW50PzogRG9jdW1lbnQ7XG4gIGZhbGxiYWNrPzogUmVhY3RFbGVtZW50IHwgc3RyaW5nIHwgbnVsbDtcbiAgbWFuaWZlc3Q/OiBQbHVtaWxlU2l0ZU1hbmlmZXN0O1xuICBtYW5pZmVzdEdsb2JhbE5hbWU/OiBzdHJpbmc7XG4gIHJ1bnRpbWU/OiBIeWRyYXRlU2l0ZVJ1bnRpbWU7XG4gIHJvdXRlck1vZHVsZT86IEh5ZHJhdGVTaXRlUm91dGVyTW9kdWxlPFRDb250ZXh0PjtcbiAgcm91dGVzOiB1bmtub3duW107XG4gIHdpbmRvdz86IFdpbmRvdztcbn07XG5cbmV4cG9ydCB0eXBlIEh5ZHJhdGVTaXRlUmVzdWx0ID0ge1xuICBtYW5pZmVzdDogUGx1bWlsZVNpdGVNYW5pZmVzdDtcbiAgcm91dGVyQ29udGV4dDogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIFNpdGVTZWFyY2hJbmRleEVudHJ5ID0ge1xuICBjb250ZW50Pzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gIGhlYWRpbmdzPzogcmVhZG9ubHkgeyB0ZXh0OiBzdHJpbmcgfVtdO1xuICBsb2NhbGU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2l0ZVNlYXJjaEluZGV4ID0ge1xuICBlbnRyaWVzOiByZWFkb25seSBTaXRlU2VhcmNoSW5kZXhFbnRyeVtdO1xufTtcblxuZXhwb3J0IHR5cGUgU2l0ZVNlYXJjaFJlc3VsdCA9IFNpdGVTZWFyY2hJbmRleEVudHJ5ICYge1xuICBzY29yZTogbnVtYmVyO1xufTtcblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkSGFuZGxlU2l0ZU5hdmlnYXRpb24oXG4gIGhyZWY6IHN0cmluZyxcbiAgY3VycmVudFVybDogc3RyaW5nLFxuICBldmVudDogTGlua0NsaWNrTGlrZSA9IHt9LFxuKTogSW50ZXJuYWxMaW5rRGVjaXNpb24ge1xuICBjb25zdCBtb2RpZmllZCA9XG4gICAgZXZlbnQuYWx0S2V5ID09PSB0cnVlIHx8XG4gICAgZXZlbnQuY3RybEtleSA9PT0gdHJ1ZSB8fFxuICAgIGV2ZW50Lm1ldGFLZXkgPT09IHRydWUgfHxcbiAgICBldmVudC5zaGlmdEtleSA9PT0gdHJ1ZSB8fFxuICAgIChldmVudC5idXR0b24gIT0gbnVsbCAmJiBldmVudC5idXR0b24gIT09IDApO1xuXG4gIGNvbnN0IGN1cnJlbnQgPSBuZXcgVVJMKGN1cnJlbnRVcmwpO1xuICBjb25zdCBuZXh0ID0gbmV3IFVSTChocmVmLCBjdXJyZW50KTtcbiAgY29uc3QgZXh0ZXJuYWwgPSBuZXh0Lm9yaWdpbiAhPT0gY3VycmVudC5vcmlnaW47XG4gIGNvbnN0IGhhc2hPbmx5ID1cbiAgICAhZXh0ZXJuYWwgJiZcbiAgICBuZXh0LnBhdGhuYW1lID09PSBjdXJyZW50LnBhdGhuYW1lICYmXG4gICAgbmV4dC5zZWFyY2ggPT09IGN1cnJlbnQuc2VhcmNoICYmXG4gICAgbmV4dC5oYXNoICE9PSBjdXJyZW50Lmhhc2g7XG5cbiAgcmV0dXJuIHtcbiAgICBleHRlcm5hbCxcbiAgICBoYXNoT25seSxcbiAgICBtb2RpZmllZCxcbiAgICBzaG91bGRIYW5kbGU6ICFtb2RpZmllZCAmJiAhZXh0ZXJuYWwgJiYgIWhhc2hPbmx5LFxuICB9O1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTaXRlUGF0aChwYXRobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IHBhdGhuYW1lLnRyaW0oKTtcbiAgaWYgKHRyaW1tZWQgPT09ICcnKSB7XG4gICAgcmV0dXJuICcvJztcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gYC8ke3RyaW1tZWR9YC5yZXBsYWNlKC9cXC8rL2csICcvJyk7XG4gIGlmIChub3JtYWxpemVkID09PSAnLycpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuICBpZiAobm9ybWFsaXplZC5lbmRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIH1cbiAgcmV0dXJuIGAke25vcm1hbGl6ZWR9L2A7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaFNpdGVJbmRleChcbiAgaW5kZXg6IFNpdGVTZWFyY2hJbmRleCxcbiAgcXVlcnk6IHN0cmluZyxcbiAgb3B0aW9uczoge1xuICAgIGxvY2FsZT86IHN0cmluZztcbiAgICBsaW1pdD86IG51bWJlcjtcbiAgfSA9IHt9LFxuKTogU2l0ZVNlYXJjaFJlc3VsdFtdIHtcbiAgY29uc3QgdGVybXMgPSBub3JtYWxpemVTZWFyY2hUZXJtcyhxdWVyeSk7XG4gIGlmICh0ZXJtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgbGltaXQgPSBvcHRpb25zLmxpbWl0ID8/IDEwO1xuICByZXR1cm4gaW5kZXguZW50cmllc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5sb2NhbGUgPT0gbnVsbCB8fCBlbnRyeS5sb2NhbGUgPT09IG9wdGlvbnMubG9jYWxlO1xuICAgIH0pXG4gICAgLm1hcCgoZW50cnkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmVudHJ5LFxuICAgICAgICBzY29yZTogc2NvcmVTZWFyY2hFbnRyeShlbnRyeSwgdGVybXMpLFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgICByZXR1cm4gZW50cnkuc2NvcmUgPiAwO1xuICAgIH0pXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgICBjb25zdCBzY29yZURpZmZlcmVuY2UgPSByaWdodC5zY29yZSAtIGxlZnQuc2NvcmU7XG4gICAgICBpZiAoc2NvcmVEaWZmZXJlbmNlICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBzY29yZURpZmZlcmVuY2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVmdC5wYXRoLmxvY2FsZUNvbXBhcmUocmlnaHQucGF0aCk7XG4gICAgfSlcbiAgICAuc2xpY2UoMCwgbGltaXQpO1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlUGx1bWlsZVNpdGU8VENvbnRleHQgPSB1bmtub3duPihcbiAgb3B0aW9uczogSHlkcmF0ZVNpdGVPcHRpb25zPFRDb250ZXh0Pixcbik6IFByb21pc2U8SHlkcmF0ZVNpdGVSZXN1bHQ+IHtcbiAgY29uc3QgZG9jID0gb3B0aW9ucy5kb2N1bWVudCA/PyBnbG9iYWxUaGlzLmRvY3VtZW50O1xuICBjb25zdCB3aW4gPSBvcHRpb25zLndpbmRvdyA/PyBnbG9iYWxUaGlzLndpbmRvdztcbiAgY29uc3QgY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXIgPz8gZG9jLmdldEVsZW1lbnRCeUlkKCdyb290Jyk7XG4gIGlmIChjb250YWluZXIgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGh5ZHJhdGUgUGx1bWlsZSBzaXRlIHdpdGhvdXQgYSByb290IGNvbnRhaW5lcicpO1xuICB9XG5cbiAgY29uc3QgbWFuaWZlc3QgPVxuICAgIG9wdGlvbnMubWFuaWZlc3QgPz9cbiAgICByZWFkU2VyaWFsaXplZFNpdGVNYW5pZmVzdCh3aW4sIG9wdGlvbnMubWFuaWZlc3RHbG9iYWxOYW1lKTtcbiAgY29uc3QgcnVudGltZSA9IG9wdGlvbnMucnVudGltZSA/PyAoYXdhaXQgbG9hZEh5ZHJhdGVSdW50aW1lKCkpO1xuICBjb25zdCByb3V0ZXJNb2R1bGUgPVxuICAgIG9wdGlvbnMucm91dGVyTW9kdWxlID8/IChhd2FpdCBsb2FkSHlkcmF0ZVJvdXRlck1vZHVsZTxUQ29udGV4dD4oKSk7XG4gIGNvbnN0IHJvdXRlciA9IHJvdXRlck1vZHVsZS5jcmVhdGVSb3V0ZXIob3B0aW9ucy5yb3V0ZXMsIHtcbiAgICBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsXG4gIH0pO1xuXG4gIGNvbnN0IGVsZW1lbnQgPSBydW50aW1lLmNyZWF0ZUVsZW1lbnQoXG4gICAgcm91dGVyTW9kdWxlLlJvdXRpbmdDb250ZXh0LlByb3ZpZGVyLFxuICAgIHsgdmFsdWU6IHJvdXRlci5jb250ZXh0IH0sXG4gICAgcnVudGltZS5jcmVhdGVFbGVtZW50KHJvdXRlck1vZHVsZS5Sb3V0ZXJSZW5kZXJlciwge1xuICAgICAgZmFsbGJhY2s6IG9wdGlvbnMuZmFsbGJhY2sgPz8gbnVsbCxcbiAgICB9KSxcbiAgKTtcbiAgcnVudGltZS5oeWRyYXRlUm9vdChjb250YWluZXIsIGVsZW1lbnQpO1xuXG4gIHJldHVybiB7XG4gICAgbWFuaWZlc3QsXG4gICAgcm91dGVyQ29udGV4dDogcm91dGVyLmNvbnRleHQsXG4gIH07XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFNpdGVOYXZpZ2F0aW9uSGFuZGxlcihpbnB1dDoge1xuICBjdXJyZW50VXJsOiBzdHJpbmc7XG4gIGV2ZW50OiBCcm93c2VyTmF2aWdhdGlvbkV2ZW50O1xuICBuYXZpZ2F0ZTogKHBhdGhuYW1lOiBzdHJpbmcpID0+IHZvaWQ7XG59KTogSW50ZXJuYWxMaW5rRGVjaXNpb24ge1xuICBjb25zdCBocmVmID0gcmVhZEFuY2hvckhyZWYoaW5wdXQuZXZlbnQuY3VycmVudFRhcmdldCk7XG4gIGlmIChocmVmID09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXh0ZXJuYWw6IGZhbHNlLFxuICAgICAgaGFzaE9ubHk6IGZhbHNlLFxuICAgICAgbW9kaWZpZWQ6IGZhbHNlLFxuICAgICAgc2hvdWxkSGFuZGxlOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZGVjaXNpb24gPSBzaG91bGRIYW5kbGVTaXRlTmF2aWdhdGlvbihcbiAgICBocmVmLFxuICAgIGlucHV0LmN1cnJlbnRVcmwsXG4gICAgaW5wdXQuZXZlbnQsXG4gICk7XG4gIGlmICghZGVjaXNpb24uc2hvdWxkSGFuZGxlKSB7XG4gICAgcmV0dXJuIGRlY2lzaW9uO1xuICB9XG5cbiAgaW5wdXQuZXZlbnQucHJldmVudERlZmF1bHQ/LigpO1xuICBjb25zdCB0YXJnZXQgPSBuZXcgVVJMKGhyZWYsIGlucHV0LmN1cnJlbnRVcmwpO1xuICBpbnB1dC5uYXZpZ2F0ZShgJHt0YXJnZXQucGF0aG5hbWV9JHt0YXJnZXQuc2VhcmNofSR7dGFyZ2V0Lmhhc2h9YCk7XG4gIHJldHVybiBkZWNpc2lvbjtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVTZWFyY2hUZXJtcyhxdWVyeTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gcXVlcnlcbiAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgodGVybSkgPT4ge1xuICAgICAgcmV0dXJuIHRlcm0udHJpbSgpO1xuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiBzY29yZVNlYXJjaEVudHJ5KFxuICBlbnRyeTogU2l0ZVNlYXJjaEluZGV4RW50cnksXG4gIHRlcm1zOiByZWFkb25seSBzdHJpbmdbXSxcbik6IG51bWJlciB7XG4gIGNvbnN0IHRpdGxlID0gZW50cnkudGl0bGUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBlbnRyeS5kZXNjcmlwdGlvbj8udG9Mb2NhbGVMb3dlckNhc2UoKSA/PyAnJztcbiAgY29uc3QgaGVhZGluZ3MgPVxuICAgIGVudHJ5LmhlYWRpbmdzXG4gICAgICA/Lm1hcCgoaGVhZGluZykgPT4ge1xuICAgICAgICByZXR1cm4gaGVhZGluZy50ZXh0O1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcgJylcbiAgICAgIC50b0xvY2FsZUxvd2VyQ2FzZSgpID8/ICcnO1xuICBjb25zdCBjb250ZW50ID0gZW50cnkuY29udGVudD8udG9Mb2NhbGVMb3dlckNhc2UoKSA/PyAnJztcbiAgbGV0IHNjb3JlID0gMDtcbiAgZm9yIChjb25zdCB0ZXJtIG9mIHRlcm1zKSB7XG4gICAgaWYgKHRpdGxlLmluY2x1ZGVzKHRlcm0pKSB7XG4gICAgICBzY29yZSArPSA4O1xuICAgIH1cbiAgICBpZiAoaGVhZGluZ3MuaW5jbHVkZXModGVybSkpIHtcbiAgICAgIHNjb3JlICs9IDQ7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbi5pbmNsdWRlcyh0ZXJtKSkge1xuICAgICAgc2NvcmUgKz0gMjtcbiAgICB9XG4gICAgaWYgKGNvbnRlbnQuaW5jbHVkZXModGVybSkpIHtcbiAgICAgIHNjb3JlICs9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBzY29yZTtcbn1cblxuLyoqXG4gKlxuICovXG5mdW5jdGlvbiByZWFkU2VyaWFsaXplZFNpdGVNYW5pZmVzdChcbiAgd2luZG93VmFsdWU6IFdpbmRvdyB8IHVuZGVmaW5lZCxcbiAgZ2xvYmFsTmFtZSA9ICdfX1BMVU1JTEVfU0lURV9fJyxcbik6IFBsdW1pbGVTaXRlTWFuaWZlc3Qge1xuICBpZiAod2luZG93VmFsdWUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgUGx1bWlsZSBzaXRlIG1hbmlmZXN0IHdpdGhvdXQgd2luZG93Jyk7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh3aW5kb3dWYWx1ZSwgZ2xvYmFsTmFtZSkgYXMgdW5rbm93bjtcbiAgYXNzZXJ0U2l0ZU1hbmlmZXN0KHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqXG4gKi9cbmZ1bmN0aW9uIHJlYWRBbmNob3JIcmVmKHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0YXJnZXQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gdGFyZ2V0IGFzIHsgaHJlZj86IHVua25vd24gfTtcbiAgaWYgKHR5cGVvZiB2YWx1ZS5ocmVmICE9PSAnc3RyaW5nJyB8fCB2YWx1ZS5ocmVmID09PSAnJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB2YWx1ZS5ocmVmO1xufVxuXG4vKipcbiAqXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRIeWRyYXRlUnVudGltZSgpOiBQcm9taXNlPEh5ZHJhdGVTaXRlUnVudGltZT4ge1xuICBjb25zdCBbcmVhY3RNb2R1bGUsIGRvbU1vZHVsZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgaW1wb3J0KCdyZWFjdCcpLFxuICAgIGltcG9ydCgncmVhY3QtZG9tL2NsaWVudCcpLFxuICBdKTtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGVFbGVtZW50OiByZWFjdE1vZHVsZS5jcmVhdGVFbGVtZW50LFxuICAgIGh5ZHJhdGVSb290OiBkb21Nb2R1bGUuaHlkcmF0ZVJvb3QsXG4gIH07XG59XG5cbi8qKlxuICpcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZEh5ZHJhdGVSb3V0ZXJNb2R1bGU8VENvbnRleHQ+KCk6IFByb21pc2U8XG4gIEh5ZHJhdGVTaXRlUm91dGVyTW9kdWxlPFRDb250ZXh0PlxuPiB7XG4gIGNvbnN0IHJvdXRlclNwZWNpZmllciA9ICdAcGx1bWlsZS9yb3V0ZXInO1xuICBjb25zdCByb3V0ZXJNb2R1bGUgPSAoYXdhaXQgaW1wb3J0KHJvdXRlclNwZWNpZmllcikpIGFzIHVua25vd247XG4gIHJldHVybiByb3V0ZXJNb2R1bGUgYXMgSHlkcmF0ZVNpdGVSb3V0ZXJNb2R1bGU8VENvbnRleHQ+O1xufVxuIl19
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVudGltZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFhQSxPQUFPLEVBQ0wsb0JBQW9CLEdBRXJCLE1BQU0sdUJBQXVCLENBQUM7QUFHL0IsT0FBTyxFQUNMLHVCQUF1QixHQUV4QixNQUFNLHdCQUF3QixDQUFDO0FBMkVoQyxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxPQUFxQztJQUVyQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUM7SUFDcEQsTUFBTSxTQUFTLEdBQ2IsT0FBTyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQztJQUMvRCxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUNqRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUNELE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFpQixDQUFDO0lBQzFELE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFlLENBQUM7SUFDdEQsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNyQixJQUFJLE9BQU8s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QUFrQixFQUFFLGNBQWMsRUFBRSxhQUFhLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzNFO1FBQ0UsTUFBTSxDQUFDLHlDQUF5QyxDQUFDO1FBQ2pELE1BQU0sQ0FBQywyQ0FBMkMsQ0FBQztRQUNuRCxNQUFNLENBQUMsMkNBQTJDLENBQUM7S0FDcEQsQ0FDRixDQUFDO0lBQ0YsT0FBTztRQUNMLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxPQUFPO1FBQ3hDLGNBQWMsRUFBRSxjQUFjLENBQUMsT0FBTztRQUN0QyxjQUFjLEVBQUUsYUFBYSxDQUFDLE9BQU87S0FDRCxDQUFDO0FBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG4gIENvbXBvbmVudFR5cGUsXG4gIFJlYWN0RWxlbWVudCxcbiAgUmVhY3ROb2RlLFxuICBjcmVhdGVFbGVtZW50LFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IGh5ZHJhdGVSb290IH0gZnJvbSAncmVhY3QtZG9tL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IFBhcmFtRGF0YSB9IGZyb20gJ3BhdGgtdG8tcmVnZXhwJztcbmltcG9ydCB0eXBlIHtcbiAgUm91dGVFbnRyeSxcbiAgUm91dGVOb2RlLFxuICBSb3V0ZXJIeWRyYXRpb25TbmFwc2hvdCxcbn0gZnJvbSAnQHBsdW1pbGUvcm91dGVyL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIHJlYWRIeWRyYXRpb25QYXlsb2FkLFxuICB0eXBlIFBsdW1pbGVTaXRlSHlkcmF0aW9uUGF5bG9hZCxcbn0gZnJvbSAnLi9oeWRyYXRpb25QYXlsb2FkLmpzJztcblxuZXhwb3J0IHR5cGUgeyBQbHVtaWxlU2l0ZUh5ZHJhdGlvblBheWxvYWQgfSBmcm9tICcuL2h5ZHJhdGlvblBheWxvYWQuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlU2Nyb2xsUmVzdG9yYXRpb24sXG4gIHR5cGUgU2l0ZVNjcm9sbFJlc3RvcmF0aW9uLFxufSBmcm9tICcuL3Njcm9sbFJlc3RvcmF0aW9uLmpzJztcblxuZXhwb3J0IHR5cGUgSHlkcmF0ZVNpdGVSdW50aW1lID0ge1xuICBjcmVhdGVFbGVtZW50OiB0eXBlb2YgY3JlYXRlRWxlbWVudDtcbiAgaHlkcmF0ZVJvb3Q6IHR5cGVvZiBoeWRyYXRlUm9vdDtcbn07XG5cbmV4cG9ydCB0eXBlIEh5ZHJhdGVTaXRlUm91dGVyTW9kdWxlPFRDb250ZXh0PiA9IHtcbiAgY3JlYXRlUm91dGVyOiAoXG4gICAgcm91dGVzOiBSb3V0ZU5vZGVbXSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBjb250ZXh0PzogVENvbnRleHQ7XG4gICAgICBnZXRDb250ZXh0PzogKCkgPT4gVENvbnRleHQ7XG4gICAgICBoeWRyYXRpb25TbmFwc2hvdDogUm91dGVySHlkcmF0aW9uU25hcHNob3Q7XG4gICAgfSxcbiAgKSA9PiB7IGNvbnRleHQ6IHVua25vd247IGNsZWFudXA/OiAoKSA9PiB2b2lkIH07XG4gIFJvdXRlclJlbmRlcmVyOiBDb21wb25lbnRUeXBlPHtcbiAgICBmYWxsYmFjaz86IFJlYWN0Tm9kZTtcbiAgICBvblJvdXRlQ29tbWl0PzogKGVudHJ5OiBSb3V0ZUVudHJ5PFBhcmFtRGF0YT4pID0+IHZvaWQ7XG4gIH0+O1xuICBSb3V0aW5nQ29udGV4dDoge1xuICAgIFByb3ZpZGVyOiBDb21wb25lbnRUeXBlPHsgdmFsdWU6IHVua25vd247IGNoaWxkcmVuPzogUmVhY3ROb2RlIH0+O1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgSHlkcmF0ZVNpdGVPcHRpb25zPFRDb250ZXh0PiA9IHtcbiAgcm91dGVzOiBSb3V0ZU5vZGVbXTtcbiAgY29udGV4dD86IFRDb250ZXh0O1xuICBnZXRDb250ZXh0PzogKCkgPT4gVENvbnRleHQ7XG4gIGZhbGxiYWNrPzogUmVhY3RFbGVtZW50IHwgc3RyaW5nIHwgbnVsbDtcbiAgY29udGFpbmVyPzogRWxlbWVudDtcbiAgZG9jdW1lbnQ/OiBEb2N1bWVudDtcbiAgcnVudGltZT86IEh5ZHJhdGVTaXRlUnVudGltZTtcbiAgcm91dGVyTW9kdWxlPzogSHlkcmF0ZVNpdGVSb3V0ZXJNb2R1bGU8VENvbnRleHQ+O1xuICBvblJvdXRlQ29tbWl0PzogKGVudHJ5OiBSb3V0ZUVudHJ5PFBhcmFtRGF0YT4pID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBIeWRyYXRlU2l0ZVJlc3VsdCA9IHtcbiAgcGF5bG9hZDogUGx1bWlsZVNpdGVIeWRyYXRpb25QYXlsb2FkO1xuICByb3V0ZXJDb250ZXh0OiB1bmtub3duO1xuICBjbGVhbnVwPzogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIEludGVybmFsTGlua0RlY2lzaW9uID0ge1xuICBleHRlcm5hbDogYm9vbGVhbjtcbiAgaGFzaE9ubHk6IGJvb2xlYW47XG4gIG1vZGlmaWVkOiBib29sZWFuO1xuICBzaG91bGRIYW5kbGU6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBMaW5rQ2xpY2tMaWtlID0ge1xuICBhbHRLZXk/OiBib29sZWFuO1xuICBidXR0b24/OiBudW1iZXI7XG4gIGN0cmxLZXk/OiBib29sZWFuO1xuICBtZXRhS2V5PzogYm9vbGVhbjtcbiAgc2hpZnRLZXk/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQnJvd3Nlck5hdmlnYXRpb25FdmVudCA9IExpbmtDbGlja0xpa2UgJiB7XG4gIGN1cnJlbnRUYXJnZXQ/OiBFdmVudFRhcmdldCB8IG51bGw7XG4gIHByZXZlbnREZWZhdWx0PzogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIFNpdGVTZWFyY2hJbmRleEVudHJ5ID0ge1xuICBjb250ZW50Pzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gIGhlYWRpbmdzPzogcmVhZG9ubHkgeyB0ZXh0OiBzdHJpbmcgfVtdO1xuICBsb2NhbGU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFNpdGVTZWFyY2hJbmRleCA9IHsgZW50cmllczogcmVhZG9ubHkgU2l0ZVNlYXJjaEluZGV4RW50cnlbXSB9O1xuZXhwb3J0IHR5cGUgU2l0ZVNlYXJjaFJlc3VsdCA9IFNpdGVTZWFyY2hJbmRleEVudHJ5ICYgeyBzY29yZTogbnVtYmVyIH07XG5cbi8qKiBIeWRyYXRlcyBhIHNlcnZlci1yZW5kZXJlZCBzaXRlIHdpdGggdGhlIG1hdGNoaW5nIHJvdXRlciBzbmFwc2hvdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlUGx1bWlsZVNpdGU8VENvbnRleHQgPSB1bmtub3duPihcbiAgb3B0aW9uczogSHlkcmF0ZVNpdGVPcHRpb25zPFRDb250ZXh0Pixcbik6IFByb21pc2U8SHlkcmF0ZVNpdGVSZXN1bHQ+IHtcbiAgY29uc3QgZG9jID0gb3B0aW9ucy5kb2N1bWVudCA/PyBnbG9iYWxUaGlzLmRvY3VtZW50O1xuICBjb25zdCBjb250YWluZXIgPVxuICAgIG9wdGlvbnMuY29udGFpbmVyID8/IGRvYy5nZXRFbGVtZW50QnlJZCgncm9vdCcpID8/IHVuZGVmaW5lZDtcbiAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgaHlkcmF0ZSBQbHVtaWxlIHNpdGUgd2l0aG91dCBhIHJvb3QgY29udGFpbmVyJyk7XG4gIH1cbiAgY29uc3QgcGF5bG9hZCA9IHJlYWRIeWRyYXRpb25QYXlsb2FkKGRvYyk7XG4gIGNvbnN0IHdpbiA9IGRvYy5kZWZhdWx0VmlldyA/PyBnbG9iYWxUaGlzLndpbmRvdztcbiAgaWYgKHBheWxvYWQucm91dGVQYXRoICE9PSB3aW4ubG9jYXRpb24ucGF0aG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsdW1pbGUgc2l0ZSByb3V0ZSBwYXRoIGRvZXMgbm90IG1hdGNoIHdpbmRvdyBsb2NhdGlvbicpO1xuICB9XG4gIGNvbnN0IGJyb3dzZXJTZWFyY2hWYWx1ZSA9IHdpbi5sb2NhdGlvbi5zZWFyY2ggYXMgdW5rbm93bjtcbiAgY29uc3QgYnJvd3Nlckhhc2hWYWx1ZSA9IHdpbi5sb2NhdGlvbi5oYXNoIGFzIHVua25vd247XG4gIGxldCBicm93c2VyU2VhcmNoID0gJyc7XG4gIGxldCBicm93c2VySGFzaCA9ICcnO1xuICBpZiAodHlwZW9mIGJyb3dzZXJTZWFyY2hWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBicm93c2VyU2VhcmNoID0gYnJvd3NlclNlYXJjaFZhbHVlO1xuICB9XG4gIGlmICh0eXBlb2YgYnJvd3Nlckhhc2hWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBicm93c2VySGFzaCA9IGJyb3dzZXJIYXNoVmFsdWU7XG4gIH1cbiAgbGV0IGh5ZHJhdGlvblNuYXBzaG90ID0gcGF5bG9hZC5yb3V0ZXI7XG4gIGlmIChcbiAgICBwYXlsb2FkLnJvdXRlci5zZWdtZW50cy5sZW5ndGggPT09IDAgJiZcbiAgICAocGF5bG9hZC5yb3V0ZXIubG9jYXRpb24uc2VhcmNoICE9PSBicm93c2VyU2VhcmNoIHx8XG4gICAgICBwYXlsb2FkLnJvdXRlci5sb2NhdGlvbi5oYXNoICE9PSBicm93c2VySGFzaClcbiAgKSB7XG4gICAgaHlkcmF0aW9uU25hcHNob3QgPSB7XG4gICAgICAuLi5wYXlsb2FkLnJvdXRlcixcbiAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgIHBhdGhuYW1lOiB3aW4ubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogYnJvd3NlclNlYXJjaCxcbiAgICAgICAgaGFzaDogYnJvd3Nlckhhc2gsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgY29uc3QgcnVudGltZSA9IG9wdGlvbnMucnVudGltZSA/PyAoYXdhaXQgbG9hZEh5ZHJhdGVSdW50aW1lKCkpO1xuICBjb25zdCByb3V0ZXJNb2R1bGUgPVxuICAgIG9wdGlvbnMucm91dGVyTW9kdWxlID8/IChhd2FpdCBsb2FkSHlkcmF0ZVJvdXRlck1vZHVsZTxUQ29udGV4dD4oKSk7XG4gIGNvbnN0IHJvdXRlciA9IHJvdXRlck1vZHVsZS5jcmVhdGVSb3V0ZXIob3B0aW9ucy5yb3V0ZXMsIHtcbiAgICBjb250ZXh0OiBvcHRpb25zLmNvbnRleHQsXG4gICAgZ2V0Q29udGV4dDogb3B0aW9ucy5nZXRDb250ZXh0LFxuICAgIGh5ZHJhdGlvblNuYXBzaG90LFxuICB9KTtcbiAgY29uc3QgZWxlbWVudCA9IHJ1bnRpbWUuY3JlYXRlRWxlbWVudChcbiAgICByb3V0ZXJNb2R1bGUuUm91dGluZ0NvbnRleHQuUHJvdmlkZXIsXG4gICAgeyB2YWx1ZTogcm91dGVyLmNvbnRleHQgfSxcbiAgICBydW50aW1lLmNyZWF0ZUVsZW1lbnQocm91dGVyTW9kdWxlLlJvdXRlclJlbmRlcmVyLCB7XG4gICAgICBmYWxsYmFjazogb3B0aW9ucy5mYWxsYmFjayA/PyBudWxsLFxuICAgICAgb25Sb3V0ZUNvbW1pdDogb3B0aW9ucy5vblJvdXRlQ29tbWl0LFxuICAgIH0pLFxuICApO1xuICBydW50aW1lLmh5ZHJhdGVSb290KGNvbnRhaW5lciwgZWxlbWVudCk7XG4gIHJldHVybiB7XG4gICAgcGF5bG9hZCxcbiAgICByb3V0ZXJDb250ZXh0OiByb3V0ZXIuY29udGV4dCxcbiAgICBjbGVhbnVwOiByb3V0ZXIuY2xlYW51cCxcbiAgfTtcbn1cblxuLyoqIENsYXNzaWZpZXMgYSBsaW5rIGZvciBjbGllbnQtc2lkZSBzaXRlIG5hdmlnYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkSGFuZGxlU2l0ZU5hdmlnYXRpb24oXG4gIGhyZWY6IHN0cmluZyxcbiAgY3VycmVudFVybDogc3RyaW5nLFxuICBldmVudDogTGlua0NsaWNrTGlrZSA9IHt9LFxuKTogSW50ZXJuYWxMaW5rRGVjaXNpb24ge1xuICBjb25zdCBtb2RpZmllZCA9XG4gICAgZXZlbnQuYWx0S2V5ID09PSB0cnVlIHx8XG4gICAgZXZlbnQuY3RybEtleSA9PT0gdHJ1ZSB8fFxuICAgIGV2ZW50Lm1ldGFLZXkgPT09IHRydWUgfHxcbiAgICBldmVudC5zaGlmdEtleSA9PT0gdHJ1ZSB8fFxuICAgIChldmVudC5idXR0b24gIT0gbnVsbCAmJiBldmVudC5idXR0b24gIT09IDApO1xuICBjb25zdCBjdXJyZW50ID0gbmV3IFVSTChjdXJyZW50VXJsKTtcbiAgY29uc3QgbmV4dCA9IG5ldyBVUkwoaHJlZiwgY3VycmVudCk7XG4gIGNvbnN0IGV4dGVybmFsID0gbmV4dC5vcmlnaW4gIT09IGN1cnJlbnQub3JpZ2luO1xuICBjb25zdCBoYXNoT25seSA9XG4gICAgIWV4dGVybmFsICYmXG4gICAgbmV4dC5wYXRobmFtZSA9PT0gY3VycmVudC5wYXRobmFtZSAmJlxuICAgIG5leHQuc2VhcmNoID09PSBjdXJyZW50LnNlYXJjaCAmJlxuICAgIG5leHQuaGFzaCAhPT0gY3VycmVudC5oYXNoO1xuICByZXR1cm4ge1xuICAgIGV4dGVybmFsLFxuICAgIGhhc2hPbmx5LFxuICAgIG1vZGlmaWVkLFxuICAgIHNob3VsZEhhbmRsZTogIW1vZGlmaWVkICYmICFleHRlcm5hbCAmJiAhaGFzaE9ubHksXG4gIH07XG59XG5cbi8qKiBOb3JtYWxpemVzIGEgc2l0ZSBwYXRobmFtZSB0byBpdHMgY2Fub25pY2FsIHRyYWlsaW5nLXNsYXNoIGZvcm0uICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2l0ZVBhdGgocGF0aG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWQgPSBwYXRobmFtZS50cmltKCk7XG4gIGlmICh0cmltbWVkID09PSAnJykgcmV0dXJuICcvJztcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGAvJHt0cmltbWVkfWAucmVwbGFjZSgvXFwvKy9nLCAnLycpO1xuICBpZiAobm9ybWFsaXplZCA9PT0gJy8nIHx8IG5vcm1hbGl6ZWQuZW5kc1dpdGgoJy8nKSkgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIHJldHVybiBgJHtub3JtYWxpemVkfS9gO1xufVxuXG4vKiogU2NvcmVzIGFuZCBvcmRlcnMgbWF0Y2hpbmcgZW50cmllcyBmcm9tIHRoZSBzdGF0aWMgc2VhcmNoIGluZGV4LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaFNpdGVJbmRleChcbiAgaW5kZXg6IFNpdGVTZWFyY2hJbmRleCxcbiAgcXVlcnk6IHN0cmluZyxcbiAgb3B0aW9uczogeyBsb2NhbGU/OiBzdHJpbmc7IGxpbWl0PzogbnVtYmVyIH0gPSB7fSxcbik6IFNpdGVTZWFyY2hSZXN1bHRbXSB7XG4gIGNvbnN0IHRlcm1zID0gcXVlcnlcbiAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgodGVybSkgPT4ge1xuICAgICAgcmV0dXJuIHRlcm0udHJpbSgpO1xuICAgIH0pXG4gICAgLmZpbHRlcigodGVybSkgPT4ge1xuICAgICAgcmV0dXJuIHRlcm0gIT09ICcnO1xuICAgIH0pO1xuICBpZiAodGVybXMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIHJldHVybiBpbmRleC5lbnRyaWVzXG4gICAgLmZpbHRlcigoZW50cnkpID0+IHtcbiAgICAgIHJldHVybiBvcHRpb25zLmxvY2FsZSA9PSBudWxsIHx8IGVudHJ5LmxvY2FsZSA9PT0gb3B0aW9ucy5sb2NhbGU7XG4gICAgfSlcbiAgICAubWFwKChlbnRyeSkgPT4ge1xuICAgICAgcmV0dXJuIHsgLi4uZW50cnksIHNjb3JlOiBzY29yZVNlYXJjaEVudHJ5KGVudHJ5LCB0ZXJtcykgfTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgICByZXR1cm4gZW50cnkuc2NvcmUgPiAwO1xuICAgIH0pXG4gICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgICBjb25zdCBzY29yZURpZmZlcmVuY2UgPSByaWdodC5zY29yZSAtIGxlZnQuc2NvcmU7XG4gICAgICBpZiAoc2NvcmVEaWZmZXJlbmNlICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBzY29yZURpZmZlcmVuY2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVmdC5wYXRoLmxvY2FsZUNvbXBhcmUocmlnaHQucGF0aCk7XG4gICAgfSlcbiAgICAuc2xpY2UoMCwgb3B0aW9ucy5saW1pdCA/PyAxMCk7XG59XG5cbi8qKiBIYW5kbGVzIGFuIGVsaWdpYmxlIGFuY2hvciBldmVudCB3aXRoIHRoZSBzdXBwbGllZCByb3V0ZXIgY2FsbGJhY2suICovXG5leHBvcnQgZnVuY3Rpb24gYXR0YWNoU2l0ZU5hdmlnYXRpb25IYW5kbGVyKGlucHV0OiB7XG4gIGN1cnJlbnRVcmw6IHN0cmluZztcbiAgZXZlbnQ6IEJyb3dzZXJOYXZpZ2F0aW9uRXZlbnQ7XG4gIG5hdmlnYXRlOiAocGF0aG5hbWU6IHN0cmluZykgPT4gdm9pZDtcbn0pOiBJbnRlcm5hbExpbmtEZWNpc2lvbiB7XG4gIGNvbnN0IGhyZWYgPSByZWFkQW5jaG9ySHJlZihpbnB1dC5ldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgaWYgKGhyZWYgPT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBleHRlcm5hbDogZmFsc2UsXG4gICAgICBoYXNoT25seTogZmFsc2UsXG4gICAgICBtb2RpZmllZDogZmFsc2UsXG4gICAgICBzaG91bGRIYW5kbGU6IGZhbHNlLFxuICAgIH07XG4gIH1cbiAgY29uc3QgZGVjaXNpb24gPSBzaG91bGRIYW5kbGVTaXRlTmF2aWdhdGlvbihcbiAgICBocmVmLFxuICAgIGlucHV0LmN1cnJlbnRVcmwsXG4gICAgaW5wdXQuZXZlbnQsXG4gICk7XG4gIGlmICghZGVjaXNpb24uc2hvdWxkSGFuZGxlKSByZXR1cm4gZGVjaXNpb247XG4gIGlucHV0LmV2ZW50LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgY29uc3QgdGFyZ2V0ID0gbmV3IFVSTChocmVmLCBpbnB1dC5jdXJyZW50VXJsKTtcbiAgaW5wdXQubmF2aWdhdGUoYCR7dGFyZ2V0LnBhdGhuYW1lfSR7dGFyZ2V0LnNlYXJjaH0ke3RhcmdldC5oYXNofWApO1xuICByZXR1cm4gZGVjaXNpb247XG59XG5cbi8qKiBDb21wdXRlcyB0aGUgd2VpZ2h0ZWQgcmVsZXZhbmNlIG9mIG9uZSBzZWFyY2ggZW50cnkuICovXG5mdW5jdGlvbiBzY29yZVNlYXJjaEVudHJ5KFxuICBlbnRyeTogU2l0ZVNlYXJjaEluZGV4RW50cnksXG4gIHRlcm1zOiByZWFkb25seSBzdHJpbmdbXSxcbik6IG51bWJlciB7XG4gIGNvbnN0IHRpdGxlID0gZW50cnkudGl0bGUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSBlbnRyeS5kZXNjcmlwdGlvbj8udG9Mb2NhbGVMb3dlckNhc2UoKSA/PyAnJztcbiAgY29uc3QgaGVhZGluZ3MgPVxuICAgIGVudHJ5LmhlYWRpbmdzXG4gICAgICA/Lm1hcCgoaGVhZGluZykgPT4ge1xuICAgICAgICByZXR1cm4gaGVhZGluZy50ZXh0O1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcgJylcbiAgICAgIC50b0xvY2FsZUxvd2VyQ2FzZSgpID8/ICcnO1xuICBjb25zdCBjb250ZW50ID0gZW50cnkuY29udGVudD8udG9Mb2NhbGVMb3dlckNhc2UoKSA/PyAnJztcbiAgcmV0dXJuIHRlcm1zLnJlZHVjZSgoc2NvcmUsIHRlcm0pID0+IHtcbiAgICBsZXQgdGVybVNjb3JlID0gMDtcbiAgICBpZiAodGl0bGUuaW5jbHVkZXModGVybSkpIHtcbiAgICAgIHRlcm1TY29yZSArPSA4O1xuICAgIH1cbiAgICBpZiAoaGVhZGluZ3MuaW5jbHVkZXModGVybSkpIHtcbiAgICAgIHRlcm1TY29yZSArPSA0O1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24uaW5jbHVkZXModGVybSkpIHtcbiAgICAgIHRlcm1TY29yZSArPSAyO1xuICAgIH1cbiAgICBpZiAoY29udGVudC5pbmNsdWRlcyh0ZXJtKSkge1xuICAgICAgdGVybVNjb3JlICs9IDE7XG4gICAgfVxuICAgIHJldHVybiBzY29yZSArIHRlcm1TY29yZTtcbiAgfSwgMCk7XG59XG5cbi8qKiBSZWFkcyBhIHVzYWJsZSBocmVmIGZyb20gYW4gYW5jaG9yLWxpa2UgZXZlbnQgdGFyZ2V0LiAqL1xuZnVuY3Rpb24gcmVhZEFuY2hvckhyZWYodGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgaHJlZiA9ICh0YXJnZXQgYXMgeyBocmVmPzogdW5rbm93biB9IHwgbnVsbCk/LmhyZWY7XG4gIGlmICh0eXBlb2YgaHJlZiA9PT0gJ3N0cmluZycgJiYgaHJlZiAhPT0gJycpIHtcbiAgICByZXR1cm4gaHJlZjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIExvYWRzIHRoZSBSZWFjdCBicm93c2VyIHJ1bnRpbWUgb25seSB3aGVuIGh5ZHJhdGlvbiBpcyByZXF1ZXN0ZWQuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkSHlkcmF0ZVJ1bnRpbWUoKTogUHJvbWlzZTxIeWRyYXRlU2l0ZVJ1bnRpbWU+IHtcbiAgY29uc3QgW3JlYWN0TW9kdWxlLCBkb21Nb2R1bGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGltcG9ydCgncmVhY3QnKSxcbiAgICBpbXBvcnQoJ3JlYWN0LWRvbS9jbGllbnQnKSxcbiAgXSk7XG4gIHJldHVybiB7XG4gICAgY3JlYXRlRWxlbWVudDogcmVhY3RNb2R1bGUuY3JlYXRlRWxlbWVudCxcbiAgICBoeWRyYXRlUm9vdDogZG9tTW9kdWxlLmh5ZHJhdGVSb290LFxuICB9O1xufVxuXG4vKiogTG9hZHMgdGhlIHJvdXRlciB0aHJvdWdoIGl0cyBkZWNsYXJlZCBwdWJsaWMgc3VicGF0aHMuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkSHlkcmF0ZVJvdXRlck1vZHVsZTxUQ29udGV4dD4oKTogUHJvbWlzZTxcbiAgSHlkcmF0ZVNpdGVSb3V0ZXJNb2R1bGU8VENvbnRleHQ+XG4+IHtcbiAgY29uc3QgW2NyZWF0ZVJvdXRlck1vZHVsZSwgcmVuZGVyZXJNb2R1bGUsIGNvbnRleHRNb2R1bGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgW1xuICAgICAgaW1wb3J0KCdAcGx1bWlsZS9yb3V0ZXIvcm91dGluZy9jcmVhdGVSb3V0ZXIuanMnKSxcbiAgICAgIGltcG9ydCgnQHBsdW1pbGUvcm91dGVyL3JvdXRpbmcvUm91dGVyUmVuZGVyZXIuanMnKSxcbiAgICAgIGltcG9ydCgnQHBsdW1pbGUvcm91dGVyL3JvdXRpbmcvUm91dGluZ0NvbnRleHQuanMnKSxcbiAgICBdLFxuICApO1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZVJvdXRlcjogY3JlYXRlUm91dGVyTW9kdWxlLmRlZmF1bHQsXG4gICAgUm91dGVyUmVuZGVyZXI6IHJlbmRlcmVyTW9kdWxlLmRlZmF1bHQsXG4gICAgUm91dGluZ0NvbnRleHQ6IGNvbnRleHRNb2R1bGUuZGVmYXVsdCxcbiAgfSBhcyBIeWRyYXRlU2l0ZVJvdXRlck1vZHVsZTxUQ29udGV4dD47XG59XG4iXX0=
@@ -0,0 +1,12 @@
1
+ import type { ParamData } from 'path-to-regexp';
2
+ import type { RouteEntry } from '@plumile/router/types.js';
3
+ export type SiteScrollRestoration = {
4
+ beforeRouteChange: (current: RouteEntry<ParamData>) => void;
5
+ onRouteCommit: (next: RouteEntry<ParamData>) => void;
6
+ dispose: () => void;
7
+ };
8
+ export declare function createScrollRestoration(options: {
9
+ window?: Window;
10
+ document?: Document;
11
+ }): SiteScrollRestoration;
12
+ //# sourceMappingURL=scrollRestoration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrollRestoration.d.ts","sourceRoot":"","sources":["../../../src/runtime/scrollRestoration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,MAAM,qBAAqB,GAAG;IAClC,iBAAiB,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IAC5D,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAGF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,GAAG,qBAAqB,CA4DxB"}
@@ -0,0 +1,66 @@
1
+ export function createScrollRestoration(options) {
2
+ const win = options.window ?? globalThis.window;
3
+ const doc = options.document ?? globalThis.document;
4
+ const previousMode = win.history.scrollRestoration;
5
+ win.history.scrollRestoration = 'manual';
6
+ const positions = new Map();
7
+ let previousEntry;
8
+ let disposed = false;
9
+ const scrollToHashOrTop = (hash) => {
10
+ if (hash !== '') {
11
+ try {
12
+ const id = decodeURIComponent(hash.replace(/^#/, ''));
13
+ let target = null;
14
+ if (id !== '') {
15
+ target = doc.getElementById(id);
16
+ }
17
+ if (target != null) {
18
+ target.scrollIntoView();
19
+ return;
20
+ }
21
+ }
22
+ catch {
23
+ }
24
+ }
25
+ win.scrollTo(0, 0);
26
+ };
27
+ return {
28
+ beforeRouteChange(current) {
29
+ if (disposed)
30
+ return;
31
+ positions.set(current.navigation.key, { x: win.scrollX, y: win.scrollY });
32
+ previousEntry = current;
33
+ },
34
+ onRouteCommit(next) {
35
+ if (disposed)
36
+ return;
37
+ if (next.navigation.type === 'initial') {
38
+ if (next.location.hash !== '')
39
+ scrollToHashOrTop(next.location.hash);
40
+ }
41
+ else if (next.navigation.type === 'pop') {
42
+ const position = positions.get(next.navigation.key);
43
+ if (position == null)
44
+ scrollToHashOrTop(next.location.hash);
45
+ else
46
+ win.scrollTo(position.x, position.y);
47
+ }
48
+ else if (next.navigation.type === 'replace' &&
49
+ previousEntry?.location.pathname === next.location.pathname) {
50
+ }
51
+ else {
52
+ scrollToHashOrTop(next.location.hash);
53
+ }
54
+ previousEntry = next;
55
+ },
56
+ dispose() {
57
+ if (disposed)
58
+ return;
59
+ disposed = true;
60
+ positions.clear();
61
+ previousEntry = undefined;
62
+ win.history.scrollRestoration = previousMode;
63
+ },
64
+ };
65
+ }
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsUmVzdG9yYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVudGltZS9zY3JvbGxSZXN0b3JhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxNQUFNLFVBQVUsdUJBQXVCLENBQUMsT0FHdkM7SUFDQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDaEQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDO0lBQ3BELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7SUFDbkQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUM7SUFDekMsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQW9DLENBQUM7SUFDOUQsSUFBSSxhQUFnRCxDQUFDO0lBQ3JELElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVyQixNQUFNLGlCQUFpQixHQUFHLENBQUMsSUFBWSxFQUFRLEVBQUU7UUFDL0MsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sRUFBRSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELElBQUksTUFBTSxHQUF1QixJQUFJLENBQUM7Z0JBQ3RDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO29CQUNkLE1BQU0sR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO2dCQUNELElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNuQixNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3hCLE9BQU87Z0JBQ1QsQ0FBQztZQUNILENBQUM7WUFBQyxNQUFNLENBQUM7WUFFVCxDQUFDO1FBQ0gsQ0FBQztRQUNELEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxpQkFBaUIsQ0FBQyxPQUFPO1lBQ3ZCLElBQUksUUFBUTtnQkFBRSxPQUFPO1lBQ3JCLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDMUUsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUMxQixDQUFDO1FBQ0QsYUFBYSxDQUFDLElBQUk7WUFDaEIsSUFBSSxRQUFRO2dCQUFFLE9BQU87WUFDckIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxFQUFFO29CQUFFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkUsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUMxQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3BELElBQUksUUFBUSxJQUFJLElBQUk7b0JBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7b0JBQ3ZELEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQztpQkFBTSxJQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLFNBQVM7Z0JBQ2xDLGFBQWEsRUFBRSxRQUFRLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUMzRCxDQUFDO1lBRUgsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUNELGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELE9BQU87WUFDTCxJQUFJLFFBQVE7Z0JBQUUsT0FBTztZQUNyQixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixhQUFhLEdBQUcsU0FBUyxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEdBQUcsWUFBWSxDQUFDO1FBQy9DLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUGFyYW1EYXRhIH0gZnJvbSAncGF0aC10by1yZWdleHAnO1xuaW1wb3J0IHR5cGUgeyBSb3V0ZUVudHJ5IH0gZnJvbSAnQHBsdW1pbGUvcm91dGVyL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgU2l0ZVNjcm9sbFJlc3RvcmF0aW9uID0ge1xuICBiZWZvcmVSb3V0ZUNoYW5nZTogKGN1cnJlbnQ6IFJvdXRlRW50cnk8UGFyYW1EYXRhPikgPT4gdm9pZDtcbiAgb25Sb3V0ZUNvbW1pdDogKG5leHQ6IFJvdXRlRW50cnk8UGFyYW1EYXRhPikgPT4gdm9pZDtcbiAgZGlzcG9zZTogKCkgPT4gdm9pZDtcbn07XG5cbi8qKiBDb29yZGluYXRlcyBzYXZlZCBzY3JvbGwgcG9zaXRpb25zLCBoYXNoZXMsIGFuZCBmcmVzaCBuYXZpZ2F0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTY3JvbGxSZXN0b3JhdGlvbihvcHRpb25zOiB7XG4gIHdpbmRvdz86IFdpbmRvdztcbiAgZG9jdW1lbnQ/OiBEb2N1bWVudDtcbn0pOiBTaXRlU2Nyb2xsUmVzdG9yYXRpb24ge1xuICBjb25zdCB3aW4gPSBvcHRpb25zLndpbmRvdyA/PyBnbG9iYWxUaGlzLndpbmRvdztcbiAgY29uc3QgZG9jID0gb3B0aW9ucy5kb2N1bWVudCA/PyBnbG9iYWxUaGlzLmRvY3VtZW50O1xuICBjb25zdCBwcmV2aW91c01vZGUgPSB3aW4uaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbjtcbiAgd2luLmhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSAnbWFudWFsJztcbiAgY29uc3QgcG9zaXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT4oKTtcbiAgbGV0IHByZXZpb3VzRW50cnk6IFJvdXRlRW50cnk8UGFyYW1EYXRhPiB8IHVuZGVmaW5lZDtcbiAgbGV0IGRpc3Bvc2VkID0gZmFsc2U7XG5cbiAgY29uc3Qgc2Nyb2xsVG9IYXNoT3JUb3AgPSAoaGFzaDogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGhhc2ggIT09ICcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpZCA9IGRlY29kZVVSSUNvbXBvbmVudChoYXNoLnJlcGxhY2UoL14jLywgJycpKTtcbiAgICAgICAgbGV0IHRhcmdldDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgaWYgKGlkICE9PSAnJykge1xuICAgICAgICAgIHRhcmdldCA9IGRvYy5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsKSB7XG4gICAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTWFsZm9ybWVkIGhhc2ggdmFsdWVzIGludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoIHRvIHRoZSB0b3AuXG4gICAgICB9XG4gICAgfVxuICAgIHdpbi5zY3JvbGxUbygwLCAwKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGJlZm9yZVJvdXRlQ2hhbmdlKGN1cnJlbnQpIHtcbiAgICAgIGlmIChkaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgcG9zaXRpb25zLnNldChjdXJyZW50Lm5hdmlnYXRpb24ua2V5LCB7IHg6IHdpbi5zY3JvbGxYLCB5OiB3aW4uc2Nyb2xsWSB9KTtcbiAgICAgIHByZXZpb3VzRW50cnkgPSBjdXJyZW50O1xuICAgIH0sXG4gICAgb25Sb3V0ZUNvbW1pdChuZXh0KSB7XG4gICAgICBpZiAoZGlzcG9zZWQpIHJldHVybjtcbiAgICAgIGlmIChuZXh0Lm5hdmlnYXRpb24udHlwZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgIGlmIChuZXh0LmxvY2F0aW9uLmhhc2ggIT09ICcnKSBzY3JvbGxUb0hhc2hPclRvcChuZXh0LmxvY2F0aW9uLmhhc2gpO1xuICAgICAgfSBlbHNlIGlmIChuZXh0Lm5hdmlnYXRpb24udHlwZSA9PT0gJ3BvcCcpIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBwb3NpdGlvbnMuZ2V0KG5leHQubmF2aWdhdGlvbi5rZXkpO1xuICAgICAgICBpZiAocG9zaXRpb24gPT0gbnVsbCkgc2Nyb2xsVG9IYXNoT3JUb3AobmV4dC5sb2NhdGlvbi5oYXNoKTtcbiAgICAgICAgZWxzZSB3aW4uc2Nyb2xsVG8ocG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBuZXh0Lm5hdmlnYXRpb24udHlwZSA9PT0gJ3JlcGxhY2UnICYmXG4gICAgICAgIHByZXZpb3VzRW50cnk/LmxvY2F0aW9uLnBhdGhuYW1lID09PSBuZXh0LmxvY2F0aW9uLnBhdGhuYW1lXG4gICAgICApIHtcbiAgICAgICAgLy8gUHJlc2VydmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gZm9yIGEgc2FtZS1wYXRoIHJlcGxhY2VtZW50LlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Nyb2xsVG9IYXNoT3JUb3AobmV4dC5sb2NhdGlvbi5oYXNoKTtcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzRW50cnkgPSBuZXh0O1xuICAgIH0sXG4gICAgZGlzcG9zZSgpIHtcbiAgICAgIGlmIChkaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgcG9zaXRpb25zLmNsZWFyKCk7XG4gICAgICBwcmV2aW91c0VudHJ5ID0gdW5kZWZpbmVkO1xuICAgICAgd2luLmhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSBwcmV2aW91c01vZGU7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==