hmr-serve 0.1.0 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -19
- package/bin/hmr-serve.js +6 -1
- package/dist/cli/banner.d.ts +2 -0
- package/dist/cli/banner.js +60 -0
- package/dist/cli/banner.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +10 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/server/createServer.d.ts +5 -0
- package/dist/server/createServer.js +10 -1
- package/dist/server/createServer.js.map +1 -1
- package/dist/server/fs.d.ts +9 -4
- package/dist/server/fs.js +41 -7
- package/dist/server/fs.js.map +1 -1
- package/dist/server/index/watcher.d.ts +3 -0
- package/dist/server/index/watcher.js +10 -1
- package/dist/server/index/watcher.js.map +1 -1
- package/dist/server/mount.d.ts +11 -0
- package/dist/server/mount.js +19 -0
- package/dist/server/mount.js.map +1 -0
- package/dist/server/noNav.d.ts +22 -0
- package/dist/server/noNav.js +202 -0
- package/dist/server/noNav.js.map +1 -0
- package/dist/server/plugin.d.ts +6 -0
- package/dist/server/plugin.js +211 -20
- package/dist/server/plugin.js.map +1 -1
- package/dist/server/renderers/csv.d.ts +4 -0
- package/dist/server/renderers/csv.js +85 -0
- package/dist/server/renderers/csv.js.map +1 -0
- package/dist/server/renderers/html.js +1 -0
- package/dist/server/renderers/html.js.map +1 -1
- package/dist/server/renderers/markdown.js +61 -3
- package/dist/server/renderers/markdown.js.map +1 -1
- package/dist/server/renderers/media.d.ts +3 -0
- package/dist/server/renderers/media.js +19 -0
- package/dist/server/renderers/media.js.map +1 -0
- package/dist/server/renderers/registry.d.ts +8 -0
- package/dist/server/renderers/registry.js +39 -2
- package/dist/server/renderers/registry.js.map +1 -1
- package/dist/server/renderers/source.d.ts +5 -3
- package/dist/server/renderers/source.js +45 -15
- package/dist/server/renderers/source.js.map +1 -1
- package/dist/server/renderers/types.d.ts +3 -1
- package/dist/shared/types.d.ts +20 -8
- package/dist/shared/types.js +17 -3
- package/dist/shared/types.js.map +1 -1
- package/package.json +19 -8
- package/src/client/App.vue +284 -31
- package/src/client/api.ts +18 -1
- package/src/client/components/ContentPane.vue +337 -26
- package/src/client/components/FileIcon.vue +81 -0
- package/src/client/components/FileTree.vue +85 -0
- package/src/client/components/SettingsMenu.vue +168 -0
- package/src/client/components/TreeNode.vue +38 -9
- package/src/client/env.d.ts +6 -0
- package/src/client/favicon.svg +15 -0
- package/src/client/index.html +1 -0
- package/src/client/main.ts +8 -0
- package/src/client/router.ts +60 -0
- package/src/client/settings.ts +179 -0
- package/src/client/styles.css +570 -32
- package/src/client/theme.ts +51 -0
- package/src/shared/types.ts +38 -9
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { readdir, stat } from 'node:fs/promises';
|
|
2
|
+
import { basename, join } from 'node:path';
|
|
3
|
+
/** Index files checked (in order) when a directory URL is requested — same idea
|
|
4
|
+
* as vercel/serve: an index file wins over a directory listing. */
|
|
5
|
+
export const INDEX_NAMES = ['index.html', 'index.htm'];
|
|
6
|
+
/** Extensions rendered to an HTML preview page in `--no-nav` mode (everything
|
|
7
|
+
* else is served as raw bytes with the appropriate MIME type). */
|
|
8
|
+
export const PREVIEW_EXTENSIONS = new Set(['md', 'markdown', 'csv', 'tsv']);
|
|
9
|
+
const IGNORED_LISTING = new Set(['.git', 'node_modules', '.vite', 'dist', '.DS_Store']);
|
|
10
|
+
/** Find an index file inside `dirAbs`. Returns the absolute path, or null. */
|
|
11
|
+
export async function findIndexFile(dirAbs) {
|
|
12
|
+
for (const name of INDEX_NAMES) {
|
|
13
|
+
const candidate = join(dirAbs, name);
|
|
14
|
+
try {
|
|
15
|
+
if ((await stat(candidate)).isFile())
|
|
16
|
+
return candidate;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// try next
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
/** Directory listing entries (dirs first, then files), with an optional `..`. */
|
|
25
|
+
export async function listDirectory(dirAbs, urlPath) {
|
|
26
|
+
const entries = await readdir(dirAbs, { withFileTypes: true });
|
|
27
|
+
const items = [];
|
|
28
|
+
for (const entry of entries) {
|
|
29
|
+
if (entry.name.startsWith('.') || IGNORED_LISTING.has(entry.name))
|
|
30
|
+
continue;
|
|
31
|
+
if (entry.isDirectory()) {
|
|
32
|
+
items.push({
|
|
33
|
+
name: `${entry.name}/`,
|
|
34
|
+
href: `${entry.name}/`,
|
|
35
|
+
type: 'directory',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else if (entry.isFile()) {
|
|
39
|
+
items.push({
|
|
40
|
+
name: entry.name,
|
|
41
|
+
href: entry.name,
|
|
42
|
+
type: 'file',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
items.sort((a, b) => {
|
|
47
|
+
if (a.type !== b.type)
|
|
48
|
+
return a.type === 'directory' ? -1 : 1;
|
|
49
|
+
return a.name.localeCompare(b.name);
|
|
50
|
+
});
|
|
51
|
+
const normalized = urlPath === '/' ? '/' : urlPath.replace(/\/?$/, '/');
|
|
52
|
+
if (normalized !== '/') {
|
|
53
|
+
items.unshift({ name: '../', href: '../', type: 'directory' });
|
|
54
|
+
}
|
|
55
|
+
return items;
|
|
56
|
+
}
|
|
57
|
+
function escapeHtml(value) {
|
|
58
|
+
return value
|
|
59
|
+
.replace(/&/g, '&')
|
|
60
|
+
.replace(/</g, '<')
|
|
61
|
+
.replace(/>/g, '>')
|
|
62
|
+
.replace(/"/g, '"');
|
|
63
|
+
}
|
|
64
|
+
/** Vite client + full-reload on any watched change (wired via `full-reload`). */
|
|
65
|
+
const VITE_CLIENT_TAG = '<script type="module" src="/@vite/client"></script>';
|
|
66
|
+
const PREVIEW_STYLES = `
|
|
67
|
+
:root { color-scheme: dark light; }
|
|
68
|
+
body {
|
|
69
|
+
margin: 0;
|
|
70
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
|
|
71
|
+
background: #0d1117;
|
|
72
|
+
color: #e6edf3;
|
|
73
|
+
}
|
|
74
|
+
@media (prefers-color-scheme: light) {
|
|
75
|
+
body { background: #ffffff; color: #1f2328; }
|
|
76
|
+
}
|
|
77
|
+
.markdown-body {
|
|
78
|
+
box-sizing: border-box;
|
|
79
|
+
max-width: 980px;
|
|
80
|
+
margin: 0 auto;
|
|
81
|
+
padding: 32px 24px 64px;
|
|
82
|
+
}
|
|
83
|
+
.markdown-body table {
|
|
84
|
+
border-collapse: collapse;
|
|
85
|
+
width: 100%;
|
|
86
|
+
margin: 1em 0;
|
|
87
|
+
display: block;
|
|
88
|
+
overflow: auto;
|
|
89
|
+
}
|
|
90
|
+
.markdown-body th, .markdown-body td {
|
|
91
|
+
border: 1px solid #30363d;
|
|
92
|
+
padding: 6px 13px;
|
|
93
|
+
}
|
|
94
|
+
@media (prefers-color-scheme: light) {
|
|
95
|
+
.markdown-body th, .markdown-body td { border-color: #d0d7de; }
|
|
96
|
+
}
|
|
97
|
+
.markdown-body th { font-weight: 600; background: rgba(255,255,255,0.04); }
|
|
98
|
+
.markdown-body pre {
|
|
99
|
+
padding: 16px;
|
|
100
|
+
overflow: auto;
|
|
101
|
+
border-radius: 6px;
|
|
102
|
+
background: #161b22;
|
|
103
|
+
}
|
|
104
|
+
@media (prefers-color-scheme: light) {
|
|
105
|
+
.markdown-body pre { background: #f6f8fa; }
|
|
106
|
+
}
|
|
107
|
+
.markdown-body code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
|
|
108
|
+
`;
|
|
109
|
+
/** Wrap rendered markdown/csv/tsv HTML in a full document with live reload. */
|
|
110
|
+
export function wrapPreviewHtml(title, bodyHtml) {
|
|
111
|
+
return `<!DOCTYPE html>
|
|
112
|
+
<html lang="en">
|
|
113
|
+
<head>
|
|
114
|
+
<meta charset="utf-8" />
|
|
115
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
116
|
+
<title>${escapeHtml(title)}</title>
|
|
117
|
+
${VITE_CLIENT_TAG}
|
|
118
|
+
<style>${PREVIEW_STYLES}</style>
|
|
119
|
+
</head>
|
|
120
|
+
<body>
|
|
121
|
+
<main class="markdown-body">${bodyHtml}</main>
|
|
122
|
+
</body>
|
|
123
|
+
</html>
|
|
124
|
+
`;
|
|
125
|
+
}
|
|
126
|
+
/** Inject the Vite client into an HTML document so edits trigger a full reload. */
|
|
127
|
+
export function injectViteClient(html) {
|
|
128
|
+
if (html.includes('/@vite/client'))
|
|
129
|
+
return html;
|
|
130
|
+
if (/<head[^>]*>/i.test(html)) {
|
|
131
|
+
return html.replace(/<head[^>]*>/i, (m) => `${m}\n ${VITE_CLIENT_TAG}`);
|
|
132
|
+
}
|
|
133
|
+
if (/<html[^>]*>/i.test(html)) {
|
|
134
|
+
return html.replace(/<html[^>]*>/i, (m) => `${m}\n <head>${VITE_CLIENT_TAG}</head>`);
|
|
135
|
+
}
|
|
136
|
+
return `${VITE_CLIENT_TAG}\n${html}`;
|
|
137
|
+
}
|
|
138
|
+
/** Serve-style directory listing page. */
|
|
139
|
+
export function renderDirectoryListing(urlPath, entries) {
|
|
140
|
+
const displayPath = urlPath === '/' ? '/' : urlPath.replace(/\/?$/, '/');
|
|
141
|
+
const title = `Index of ${displayPath}`;
|
|
142
|
+
const rootName = basename(displayPath.replace(/\/$/, '') || 'root') || '/';
|
|
143
|
+
const rows = entries
|
|
144
|
+
.map((entry) => {
|
|
145
|
+
const label = escapeHtml(entry.name);
|
|
146
|
+
const href = escapeHtml(entry.href);
|
|
147
|
+
const kind = entry.type === 'directory' ? 'dir' : 'file';
|
|
148
|
+
return ` <li class="${kind}"><a href="${href}">${label}</a></li>`;
|
|
149
|
+
})
|
|
150
|
+
.join('\n');
|
|
151
|
+
return `<!DOCTYPE html>
|
|
152
|
+
<html lang="en">
|
|
153
|
+
<head>
|
|
154
|
+
<meta charset="utf-8" />
|
|
155
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
156
|
+
<title>${escapeHtml(title)}</title>
|
|
157
|
+
${VITE_CLIENT_TAG}
|
|
158
|
+
<style>
|
|
159
|
+
:root { color-scheme: dark light; }
|
|
160
|
+
body {
|
|
161
|
+
margin: 0;
|
|
162
|
+
font: 14px/1.5 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
163
|
+
background: #0d1117;
|
|
164
|
+
color: #e6edf3;
|
|
165
|
+
}
|
|
166
|
+
@media (prefers-color-scheme: light) {
|
|
167
|
+
body { background: #fff; color: #1f2328; }
|
|
168
|
+
}
|
|
169
|
+
main { max-width: 48rem; margin: 0 auto; padding: 2rem 1.25rem 4rem; }
|
|
170
|
+
h1 { font-size: 1.1rem; font-weight: 600; margin: 0 0 1rem; }
|
|
171
|
+
ul { list-style: none; margin: 0; padding: 0; border: 1px solid #30363d; border-radius: 8px; }
|
|
172
|
+
@media (prefers-color-scheme: light) { ul { border-color: #d0d7de; } }
|
|
173
|
+
li { border-top: 1px solid #30363d; }
|
|
174
|
+
li:first-child { border-top: 0; }
|
|
175
|
+
@media (prefers-color-scheme: light) { li { border-top-color: #d0d7de; } }
|
|
176
|
+
a {
|
|
177
|
+
display: block;
|
|
178
|
+
padding: 0.55rem 0.85rem;
|
|
179
|
+
color: #58a6ff;
|
|
180
|
+
text-decoration: none;
|
|
181
|
+
}
|
|
182
|
+
@media (prefers-color-scheme: light) { a { color: #0969da; } }
|
|
183
|
+
a:hover { background: rgba(56, 139, 253, 0.1); }
|
|
184
|
+
.note { margin-top: 1rem; opacity: 0.55; font-size: 12px; }
|
|
185
|
+
</style>
|
|
186
|
+
</head>
|
|
187
|
+
<body>
|
|
188
|
+
<main>
|
|
189
|
+
<h1>${escapeHtml(title)}</h1>
|
|
190
|
+
<ul>
|
|
191
|
+
${rows}
|
|
192
|
+
</ul>
|
|
193
|
+
<p class="note">hmr-serve · ${escapeHtml(rootName)}</p>
|
|
194
|
+
</main>
|
|
195
|
+
</body>
|
|
196
|
+
</html>
|
|
197
|
+
`;
|
|
198
|
+
}
|
|
199
|
+
export function isPreviewExtension(ext) {
|
|
200
|
+
return PREVIEW_EXTENSIONS.has(ext.toLowerCase());
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=noNav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noNav.js","sourceRoot":"","sources":["../../src/server/noNav.ts"],"names":[],"mappings":"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"}
|
package/dist/server/plugin.d.ts
CHANGED
|
@@ -6,10 +6,16 @@ export interface HmrServePluginOptions {
|
|
|
6
6
|
/** Absolute path to the folder being served. */
|
|
7
7
|
targetDir: string;
|
|
8
8
|
registry?: RendererRegistry;
|
|
9
|
+
/** Serve files directly (like `serve`) instead of the Vue nav shell. */
|
|
10
|
+
noNav?: boolean;
|
|
9
11
|
}
|
|
10
12
|
/**
|
|
11
13
|
* The hmr-serve Vite plugin. Owns the search index + file watcher and exposes
|
|
12
14
|
* the tree/file/raw/search endpoints. Content live-updates are pushed over
|
|
13
15
|
* Vite's own HMR websocket (a custom event) rather than a hand-rolled channel.
|
|
16
|
+
*
|
|
17
|
+
* With `noNav: true`, skips the Vue shell and serves the folder like `serve`:
|
|
18
|
+
* index file → that file; otherwise a directory listing; markdown/csv/tsv are
|
|
19
|
+
* rendered to HTML; edits trigger a Vite full-reload.
|
|
14
20
|
*/
|
|
15
21
|
export declare function hmrServePlugin(options: HmrServePluginOptions): Plugin;
|
package/dist/server/plugin.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import { resolve, sep } from 'node:path';
|
|
2
|
+
import { stat } from 'node:fs/promises';
|
|
2
3
|
import { RendererRegistry } from './renderers/registry.js';
|
|
3
4
|
import { SearchIndex } from './index/searchIndex.js';
|
|
4
5
|
import { createWatchHandler } from './index/watcher.js';
|
|
5
|
-
import {
|
|
6
|
+
import { mountPrefixFor } from './mount.js';
|
|
7
|
+
import { findIndexFile, injectViteClient, isPreviewExtension, listDirectory, renderDirectoryListing, wrapPreviewHtml, } from './noNav.js';
|
|
8
|
+
import { buildTree, contentTypeFor, extOf, isFile, listSupportedFiles, readFileBuffer, readFileText, toRelPosix, } from './fs.js';
|
|
6
9
|
import { HMR_UPDATE_EVENT, } from '../shared/types.js';
|
|
7
10
|
/** Base path for all server API routes. */
|
|
8
11
|
export const API_BASE = '/__hmrserve';
|
|
12
|
+
/** Render kinds whose bytes the browser loads directly from /raw (so the file
|
|
13
|
+
* response carries a `src` rather than inlined `html`). */
|
|
14
|
+
const RAW_KINDS = new Set(['iframe', 'image', 'video']);
|
|
9
15
|
function sendJson(res, status, body) {
|
|
10
16
|
const payload = JSON.stringify(body);
|
|
11
17
|
res.statusCode = status;
|
|
@@ -13,10 +19,16 @@ function sendJson(res, status, body) {
|
|
|
13
19
|
res.setHeader('Cache-Control', 'no-store');
|
|
14
20
|
res.end(payload);
|
|
15
21
|
}
|
|
22
|
+
function sendHtml(res, status, html) {
|
|
23
|
+
res.statusCode = status;
|
|
24
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
25
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
26
|
+
res.end(html);
|
|
27
|
+
}
|
|
16
28
|
/** Resolve a client-supplied relative path against the served root, rejecting
|
|
17
29
|
* anything that escapes it (traversal / absolute paths). Returns null if unsafe. */
|
|
18
30
|
function safeResolve(targetDir, rel) {
|
|
19
|
-
if (
|
|
31
|
+
if (rel == null)
|
|
20
32
|
return null;
|
|
21
33
|
const abs = resolve(targetDir, rel);
|
|
22
34
|
if (abs !== targetDir && !abs.startsWith(targetDir + sep))
|
|
@@ -27,26 +39,90 @@ function queryParam(req, key) {
|
|
|
27
39
|
const url = new URL(req.url ?? '', 'http://localhost');
|
|
28
40
|
return url.searchParams.get(key);
|
|
29
41
|
}
|
|
42
|
+
/** The mirror-path URL a raw file is served at: `/__hmrserve/raw/<rel>`, with
|
|
43
|
+
* each path segment encoded but the slashes preserved so the browser's base URL
|
|
44
|
+
* matches the folder layout and relative links/assets resolve naturally. */
|
|
45
|
+
function rawUrl(rel) {
|
|
46
|
+
return `${API_BASE}/raw/${rel.split('/').map(encodeURIComponent).join('/')}`;
|
|
47
|
+
}
|
|
48
|
+
/** Extract the folder-relative path from a mounted `/raw/...` request, dropping
|
|
49
|
+
* the query string (e.g. the cache-busting `?v=`). Returns '' for the mount root. */
|
|
50
|
+
function rawRelPath(req) {
|
|
51
|
+
const pathname = new URL(req.url ?? '', 'http://localhost').pathname;
|
|
52
|
+
return decodeURIComponent(pathname).replace(/^\/+/, '');
|
|
53
|
+
}
|
|
54
|
+
function wantsHtml(req) {
|
|
55
|
+
return (req.headers.accept ?? '').includes('text/html');
|
|
56
|
+
}
|
|
30
57
|
/**
|
|
31
58
|
* The hmr-serve Vite plugin. Owns the search index + file watcher and exposes
|
|
32
59
|
* the tree/file/raw/search endpoints. Content live-updates are pushed over
|
|
33
60
|
* Vite's own HMR websocket (a custom event) rather than a hand-rolled channel.
|
|
61
|
+
*
|
|
62
|
+
* With `noNav: true`, skips the Vue shell and serves the folder like `serve`:
|
|
63
|
+
* index file → that file; otherwise a directory listing; markdown/csv/tsv are
|
|
64
|
+
* rendered to HTML; edits trigger a Vite full-reload.
|
|
34
65
|
*/
|
|
35
66
|
export function hmrServePlugin(options) {
|
|
36
67
|
const targetDir = options.targetDir;
|
|
37
68
|
const registry = options.registry ?? new RendererRegistry();
|
|
69
|
+
const noNav = Boolean(options.noNav);
|
|
38
70
|
const index = new SearchIndex();
|
|
71
|
+
// Content is routed under this prefix (the folder's name) so bookmarkable URLs
|
|
72
|
+
// like /aurora-notes/docs/intro.md never collide with the shell's root assets.
|
|
73
|
+
const mountPrefix = mountPrefixFor(targetDir);
|
|
39
74
|
return {
|
|
40
75
|
name: 'hmr-serve',
|
|
76
|
+
// Expose the mount prefix to the client for its History-API routing. Injected
|
|
77
|
+
// into every shell response (whether Vite serves '/' or our fallback serves a
|
|
78
|
+
// deep content URL), so the client can parse the initial URL synchronously.
|
|
79
|
+
transformIndexHtml() {
|
|
80
|
+
if (noNav)
|
|
81
|
+
return [];
|
|
82
|
+
return [
|
|
83
|
+
{
|
|
84
|
+
tag: 'script',
|
|
85
|
+
injectTo: 'head-prepend',
|
|
86
|
+
children: `window.__HMR_SERVE_MOUNT__=${JSON.stringify(mountPrefix)};`,
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
},
|
|
41
90
|
async configureServer(server) {
|
|
42
|
-
|
|
91
|
+
const within = (abs) => abs === targetDir || abs.startsWith(targetDir + sep) ? toRelPosix(targetDir, abs) : null;
|
|
92
|
+
server.watcher.add(targetDir);
|
|
93
|
+
if (noNav) {
|
|
94
|
+
// Full-page reload whenever anything under the target changes. Pages
|
|
95
|
+
// include /@vite/client so the browser picks this up automatically.
|
|
96
|
+
const reload = () => {
|
|
97
|
+
server.ws.send({ type: 'full-reload' });
|
|
98
|
+
};
|
|
99
|
+
server.watcher.on('add', (abs) => {
|
|
100
|
+
if (within(abs))
|
|
101
|
+
reload();
|
|
102
|
+
});
|
|
103
|
+
server.watcher.on('change', (abs) => {
|
|
104
|
+
if (within(abs))
|
|
105
|
+
reload();
|
|
106
|
+
});
|
|
107
|
+
server.watcher.on('unlink', (abs) => {
|
|
108
|
+
if (within(abs))
|
|
109
|
+
reload();
|
|
110
|
+
});
|
|
111
|
+
server.middlewares.use((req, res, next) => {
|
|
112
|
+
handleNoNavRequest(req, res, next, { targetDir, registry }).catch(next);
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// —— Nav mode (default): Vue shell + JSON APIs ————————————————————————
|
|
117
|
+
// 1. Initial index scan. Binary files (image/video) are indexed by name
|
|
118
|
+
// only — never read as text.
|
|
43
119
|
const files = await listSupportedFiles(targetDir, registry);
|
|
44
120
|
await Promise.all(files.map(async (rel) => {
|
|
45
|
-
const
|
|
46
|
-
|
|
121
|
+
const ext = extOf(rel);
|
|
122
|
+
const raw = registry.isText(ext) ? await readFileText(resolve(targetDir, rel)) : '';
|
|
123
|
+
index.add(rel, ext, raw);
|
|
47
124
|
}));
|
|
48
125
|
// 2. Reuse Vite's chokidar watcher (single source of truth) for the target.
|
|
49
|
-
server.watcher.add(targetDir);
|
|
50
126
|
const emit = (update) => {
|
|
51
127
|
server.ws.send({ type: 'custom', event: HMR_UPDATE_EVENT, data: update });
|
|
52
128
|
};
|
|
@@ -54,10 +130,9 @@ export function hmrServePlugin(options) {
|
|
|
54
130
|
index,
|
|
55
131
|
extOf,
|
|
56
132
|
isSupported: (ext) => registry.supports(ext),
|
|
57
|
-
readFile: (rel) => readFileText(resolve(targetDir, rel)),
|
|
133
|
+
readFile: (rel) => registry.isText(extOf(rel)) ? readFileText(resolve(targetDir, rel)) : Promise.resolve(''),
|
|
58
134
|
emit,
|
|
59
135
|
});
|
|
60
|
-
const within = (abs) => abs === targetDir || abs.startsWith(targetDir + sep) ? toRelPosix(targetDir, abs) : null;
|
|
61
136
|
server.watcher.on('add', (abs) => {
|
|
62
137
|
const rel = within(abs);
|
|
63
138
|
if (rel)
|
|
@@ -75,8 +150,12 @@ export function hmrServePlugin(options) {
|
|
|
75
150
|
});
|
|
76
151
|
server.httpServer?.once('close', () => handlers.dispose());
|
|
77
152
|
// 3. API routes.
|
|
153
|
+
server.middlewares.use(`${API_BASE}/config`, (_req, res) => {
|
|
154
|
+
const body = { categories: registry.categories() };
|
|
155
|
+
sendJson(res, 200, body);
|
|
156
|
+
});
|
|
78
157
|
server.middlewares.use(`${API_BASE}/tree`, (_req, res, next) => {
|
|
79
|
-
buildTree(targetDir
|
|
158
|
+
buildTree(targetDir)
|
|
80
159
|
.then((nodes) => {
|
|
81
160
|
const body = { root: targetDir, nodes };
|
|
82
161
|
sendJson(res, 200, body);
|
|
@@ -95,15 +174,16 @@ export function hmrServePlugin(options) {
|
|
|
95
174
|
.then((ok) => {
|
|
96
175
|
if (!ok)
|
|
97
176
|
return sendJson(res, 404, { error: 'not found' });
|
|
98
|
-
|
|
177
|
+
// Binary kinds (image/video) render from metadata only — don't slurp
|
|
178
|
+
// their bytes as text.
|
|
179
|
+
const rawText = registry.isText(ext) ? readFileText(abs) : Promise.resolve('');
|
|
180
|
+
return rawText.then((raw) => {
|
|
99
181
|
const result = registry.render({ path: rel, ext, raw });
|
|
100
182
|
const body = {
|
|
101
183
|
path: rel,
|
|
102
184
|
kind: result.kind,
|
|
103
185
|
title: result.title,
|
|
104
|
-
...(result.kind
|
|
105
|
-
? { iframeSrc: `${API_BASE}/raw?path=${encodeURIComponent(rel)}` }
|
|
106
|
-
: { html: result.html }),
|
|
186
|
+
...(RAW_KINDS.has(result.kind) ? { src: rawUrl(rel) } : { html: result.html }),
|
|
107
187
|
...(result.language ? { language: result.language } : {}),
|
|
108
188
|
};
|
|
109
189
|
sendJson(res, 200, body);
|
|
@@ -111,23 +191,24 @@ export function hmrServePlugin(options) {
|
|
|
111
191
|
})
|
|
112
192
|
.catch(next);
|
|
113
193
|
});
|
|
194
|
+
// Raw content is served at mirror paths (/raw/<rel>) so a framed HTML doc's
|
|
195
|
+
// relative links and assets (css/js/images/fonts) resolve against the real
|
|
196
|
+
// folder layout. Serves any file under the target (bytes preserved), not
|
|
197
|
+
// just HTML, because those assets can be any type.
|
|
114
198
|
server.middlewares.use(`${API_BASE}/raw`, (req, res, next) => {
|
|
115
|
-
const abs = safeResolve(targetDir,
|
|
199
|
+
const abs = safeResolve(targetDir, rawRelPath(req));
|
|
116
200
|
if (!abs)
|
|
117
201
|
return sendJson(res, 400, { error: 'invalid path' });
|
|
118
|
-
if (extOf(abs) !== 'html' && extOf(abs) !== 'htm') {
|
|
119
|
-
return sendJson(res, 415, { error: 'raw only serves html' });
|
|
120
|
-
}
|
|
121
202
|
isFile(abs)
|
|
122
203
|
.then((ok) => {
|
|
123
204
|
if (!ok)
|
|
124
205
|
return sendJson(res, 404, { error: 'not found' });
|
|
125
|
-
return
|
|
206
|
+
return readFileBuffer(abs).then((bytes) => {
|
|
126
207
|
res.statusCode = 200;
|
|
127
|
-
res.setHeader('Content-Type',
|
|
208
|
+
res.setHeader('Content-Type', contentTypeFor(extOf(abs)));
|
|
128
209
|
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
129
210
|
res.setHeader('Cache-Control', 'no-store');
|
|
130
|
-
res.end(
|
|
211
|
+
res.end(bytes);
|
|
131
212
|
});
|
|
132
213
|
})
|
|
133
214
|
.catch(next);
|
|
@@ -137,7 +218,117 @@ export function hmrServePlugin(options) {
|
|
|
137
218
|
const body = { query, hits: index.search(query) };
|
|
138
219
|
sendJson(res, 200, body);
|
|
139
220
|
});
|
|
221
|
+
// History fallback for bookmarkable content URLs. A top-level navigation
|
|
222
|
+
// (GET, Accept: text/html) under the mount prefix that maps to a real file
|
|
223
|
+
// serves the app shell; the client then selects that file. Everything else
|
|
224
|
+
// falls through to Vite → 404 (appType 'mpa'), so a stray absolute link
|
|
225
|
+
// like /contact can't nest the app inside the content iframe. Registered
|
|
226
|
+
// directly in configureServer, so it runs BEFORE Vite's internal
|
|
227
|
+
// middlewares and catches these paths before they 404.
|
|
228
|
+
server.middlewares.use((req, res, next) => {
|
|
229
|
+
if (req.method !== 'GET' && req.method !== 'HEAD')
|
|
230
|
+
return next();
|
|
231
|
+
if (!wantsHtml(req))
|
|
232
|
+
return next();
|
|
233
|
+
const pathname = decodeURIComponent(new URL(req.url ?? '/', 'http://localhost').pathname);
|
|
234
|
+
const isMountRoot = pathname === mountPrefix || pathname === `${mountPrefix}/`;
|
|
235
|
+
if (!isMountRoot && !pathname.startsWith(`${mountPrefix}/`))
|
|
236
|
+
return next();
|
|
237
|
+
const serveShell = () => {
|
|
238
|
+
readFileText(resolve(server.config.root, 'index.html'))
|
|
239
|
+
.then((raw) => server.transformIndexHtml(req.url ?? '/', raw, req.originalUrl))
|
|
240
|
+
.then((html) => {
|
|
241
|
+
sendHtml(res, 200, html);
|
|
242
|
+
})
|
|
243
|
+
.catch(next);
|
|
244
|
+
};
|
|
245
|
+
if (isMountRoot)
|
|
246
|
+
return serveShell();
|
|
247
|
+
const abs = safeResolve(targetDir, pathname.slice(mountPrefix.length + 1));
|
|
248
|
+
if (!abs)
|
|
249
|
+
return next();
|
|
250
|
+
isFile(abs)
|
|
251
|
+
.then((ok) => (ok ? serveShell() : next()))
|
|
252
|
+
.catch(next);
|
|
253
|
+
});
|
|
140
254
|
},
|
|
141
255
|
};
|
|
142
256
|
}
|
|
257
|
+
async function handleNoNavRequest(req, res, next, ctx) {
|
|
258
|
+
if (req.method !== 'GET' && req.method !== 'HEAD')
|
|
259
|
+
return next();
|
|
260
|
+
const pathname = decodeURIComponent(new URL(req.url ?? '/', 'http://localhost').pathname);
|
|
261
|
+
// Let Vite handle its own tooling paths.
|
|
262
|
+
if (pathname.startsWith('/@') ||
|
|
263
|
+
pathname.startsWith('/node_modules/') ||
|
|
264
|
+
pathname.startsWith('/__vite') ||
|
|
265
|
+
pathname.startsWith(API_BASE)) {
|
|
266
|
+
return next();
|
|
267
|
+
}
|
|
268
|
+
const rel = pathname === '/' ? '' : pathname.replace(/^\/+/, '');
|
|
269
|
+
const abs = safeResolve(ctx.targetDir, rel || '.');
|
|
270
|
+
if (!abs) {
|
|
271
|
+
res.statusCode = 400;
|
|
272
|
+
res.end('Bad Request');
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
let info;
|
|
276
|
+
try {
|
|
277
|
+
info = await stat(abs);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
res.statusCode = 404;
|
|
281
|
+
res.end('Not Found');
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (info.isDirectory()) {
|
|
285
|
+
const indexAbs = await findIndexFile(abs);
|
|
286
|
+
if (indexAbs) {
|
|
287
|
+
await serveNoNavFile(res, ctx, indexAbs);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
// Browsers requesting assets won't ask for HTML listings.
|
|
291
|
+
if (!wantsHtml(req) && pathname !== '/') {
|
|
292
|
+
res.statusCode = 404;
|
|
293
|
+
res.end('Not Found');
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const urlPath = pathname === '/' ? '/' : pathname.replace(/\/?$/, '/');
|
|
297
|
+
const entries = await listDirectory(abs, urlPath);
|
|
298
|
+
sendHtml(res, 200, renderDirectoryListing(urlPath, entries));
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
if (!info.isFile()) {
|
|
302
|
+
res.statusCode = 404;
|
|
303
|
+
res.end('Not Found');
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
await serveNoNavFile(res, ctx, abs);
|
|
307
|
+
}
|
|
308
|
+
async function serveNoNavFile(res, ctx, abs) {
|
|
309
|
+
const rel = toRelPosix(ctx.targetDir, abs);
|
|
310
|
+
const ext = extOf(rel);
|
|
311
|
+
if (isPreviewExtension(ext) && ctx.registry.supports(ext)) {
|
|
312
|
+
const raw = await readFileText(abs);
|
|
313
|
+
const result = ctx.registry.render({ path: rel, ext, raw });
|
|
314
|
+
const body = result.html ?? '';
|
|
315
|
+
sendHtml(res, 200, wrapPreviewHtml(result.title || basenameFallback(rel), body));
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (ext === 'html' || ext === 'htm') {
|
|
319
|
+
const raw = await readFileText(abs);
|
|
320
|
+
sendHtml(res, 200, injectViteClient(raw));
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
const bytes = await readFileBuffer(abs);
|
|
324
|
+
res.statusCode = 200;
|
|
325
|
+
res.setHeader('Content-Type', contentTypeFor(ext));
|
|
326
|
+
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
327
|
+
res.setHeader('Cache-Control', 'no-store');
|
|
328
|
+
res.end(bytes);
|
|
329
|
+
}
|
|
330
|
+
function basenameFallback(rel) {
|
|
331
|
+
const parts = rel.split('/');
|
|
332
|
+
return parts[parts.length - 1] || rel;
|
|
333
|
+
}
|
|
143
334
|
//# sourceMappingURL=plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/server/plugin.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/server/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,SAAS,EACT,cAAc,EACd,KAAK,EACL,MAAM,EACN,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,gBAAgB,GAOjB,MAAM,oBAAoB,CAAC;AAE5B,2CAA2C;AAC3C,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AAEtC;4DAC4D;AAC5D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAUpE,SAAS,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAa;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC;IACxB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;IACjE,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3C,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,IAAY;IACjE,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC;IACxB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;IAC1D,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;qFACqF;AACrF,SAAS,WAAW,CAAC,SAAiB,EAAE,GAAkB;IACxD,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACpC,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,GAAG,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACvE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,GAA4B,EAAE,GAAW;IAC3D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;IACvD,OAAO,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED;;6EAE6E;AAC7E,SAAS,MAAM,CAAC,GAAW;IACzB,OAAO,GAAG,QAAQ,QAAQ,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED;sFACsF;AACtF,SAAS,UAAU,CAAC,GAA4B;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC;IACrE,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,GAA4B;IAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,gBAAgB,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;IAChC,+EAA+E;IAC/E,+EAA+E;IAC/E,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C,OAAO;QACL,IAAI,EAAE,WAAW;QAEjB,8EAA8E;QAC9E,8EAA8E;QAC9E,4EAA4E;QAC5E,kBAAkB;YAChB,IAAI,KAAK;gBAAE,OAAO,EAAE,CAAC;YACrB,OAAO;gBACL;oBACE,GAAG,EAAE,QAAQ;oBACb,QAAQ,EAAE,cAAc;oBACxB,QAAQ,EAAE,8BAA8B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG;iBACvE;aACF,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,MAAqB;YACzC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAiB,EAAE,CAC5C,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAE3F,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAE9B,IAAI,KAAK,EAAE,CAAC;gBACV,qEAAqE;gBACrE,oEAAoE;gBACpE,MAAM,MAAM,GAAG,GAAS,EAAE;oBACxB,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;gBAC1C,CAAC,CAAC;gBACF,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;oBAC/B,IAAI,MAAM,CAAC,GAAG,CAAC;wBAAE,MAAM,EAAE,CAAC;gBAC5B,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;oBAClC,IAAI,MAAM,CAAC,GAAG,CAAC;wBAAE,MAAM,EAAE,CAAC;gBAC5B,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;oBAClC,IAAI,MAAM,CAAC,GAAG,CAAC;wBAAE,MAAM,EAAE,CAAC;gBAC5B,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;oBACxC,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1E,CAAC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,wEAAwE;YAExE,wEAAwE;YACxE,gCAAgC;YAChC,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC5D,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACtB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpF,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAC3B,CAAC,CAAC,CACH,CAAC;YAEF,4EAA4E;YAC5E,MAAM,IAAI,GAAG,CAAC,MAAsB,EAAQ,EAAE;gBAC5C,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5E,CAAC,CAAC;YACF,MAAM,QAAQ,GAAG,kBAAkB,CAAC;gBAClC,KAAK;gBACL,KAAK;gBACL,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAC5C,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAChB,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3F,IAAI;aACL,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,GAAG;oBAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;gBAClC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,GAAG;oBAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;gBAClC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,GAAG;oBAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YAE3D,iBAAiB;YACjB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,QAAQ,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBACzD,MAAM,IAAI,GAAmB,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;gBACnE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,QAAQ,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBAC7D,SAAS,CAAC,SAAS,CAAC;qBACjB,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBACd,MAAM,IAAI,GAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;oBACtD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC3B,CAAC,CAAC;qBACD,KAAK,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,QAAQ,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBAC5D,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC5D,IAAI,CAAC,GAAG;oBAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;gBAC/D,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBACvC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBACtF,MAAM,CAAC,GAAG,CAAC;qBACR,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;oBACX,IAAI,CAAC,EAAE;wBAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;oBAC3D,qEAAqE;oBACrE,uBAAuB;oBACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC/E,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;wBAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;wBACxD,MAAM,IAAI,GAAiB;4BACzB,IAAI,EAAE,GAAG;4BACT,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;4BAC9E,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;yBAC1D,CAAC;wBACF,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBAC3B,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC;qBACD,KAAK,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,4EAA4E;YAC5E,2EAA2E;YAC3E,yEAAyE;YACzE,mDAAmD;YACnD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,QAAQ,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBAC3D,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,GAAG;oBAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;gBAC/D,MAAM,CAAC,GAAG,CAAC;qBACR,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;oBACX,IAAI,CAAC,EAAE;wBAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;oBAC3D,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;wBACxC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;wBACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBAC1D,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;wBACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;wBAC3C,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACjB,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC;qBACD,KAAK,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,QAAQ,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACxD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,yEAAyE;YACzE,2EAA2E;YAC3E,2EAA2E;YAC3E,wEAAwE;YACxE,yEAAyE;YACzE,iEAAiE;YACjE,uDAAuD;YACvD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;oBAAE,OAAO,IAAI,EAAE,CAAC;gBACjE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;oBAAE,OAAO,IAAI,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC1F,MAAM,WAAW,GAAG,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,GAAG,WAAW,GAAG,CAAC;gBAC/E,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,CAAC;oBAAE,OAAO,IAAI,EAAE,CAAC;gBAE3E,MAAM,UAAU,GAAG,GAAS,EAAE;oBAC5B,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;yBACpD,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;yBAC9E,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;wBACb,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;oBAC3B,CAAC,CAAC;yBACD,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjB,CAAC,CAAC;gBAEF,IAAI,WAAW;oBAAE,OAAO,UAAU,EAAE,CAAC;gBACrC,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC3E,IAAI,CAAC,GAAG;oBAAE,OAAO,IAAI,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,CAAC;qBACR,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;qBAC1C,KAAK,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAOD,KAAK,UAAU,kBAAkB,CAC/B,GAA4B,EAC5B,GAAmB,EACnB,IAA0B,EAC1B,GAAiB;IAEjB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,EAAE,CAAC;IAEjE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE1F,yCAAyC;IACzC,IACE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;QACzB,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC;QACrC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAC9B,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAC7B,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QACrB,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QACrB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QACD,0DAA0D;QAC1D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YACxC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAClD,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACnB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;QACrB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAmB,EAAE,GAAiB,EAAE,GAAW;IAC/E,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IAEvB,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAC/B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACpC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IACxC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;IACrB,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3C,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;AACxC,CAAC"}
|