hmr-serve 0.1.6 → 0.1.7
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/bin/hmr-serve.js +11 -1
- package/dist/cli/index.js +30 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/status.d.ts +22 -0
- package/dist/cli/status.js +93 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/server/createServer.d.ts +2 -0
- package/dist/server/createServer.js +4 -1
- package/dist/server/createServer.js.map +1 -1
- package/dist/server/noNav.js +40 -1
- package/dist/server/noNav.js.map +1 -1
- package/dist/server/plugin.d.ts +2 -0
- package/dist/server/plugin.js +26 -8
- package/dist/server/plugin.js.map +1 -1
- package/dist/server/renderers/csv.js +30 -2
- package/dist/server/renderers/csv.js.map +1 -1
- package/dist/server/renderers/markdown.js +22 -3
- package/dist/server/renderers/markdown.js.map +1 -1
- package/dist/server/renderers/types.d.ts +7 -0
- package/dist/shared/csvPage.d.ts +21 -0
- package/dist/shared/csvPage.js +33 -0
- package/dist/shared/csvPage.js.map +1 -0
- package/package.json +1 -1
- package/src/client/App.vue +12 -0
- package/src/client/components/ContentPane.vue +23 -2
- package/src/client/components/SettingsMenu.vue +23 -1
- package/src/client/csvPage.ts +125 -0
- package/src/client/styles.css +72 -1
- package/src/shared/csvPage.ts +44 -0
package/bin/hmr-serve.js
CHANGED
|
@@ -7,9 +7,19 @@
|
|
|
7
7
|
// includes module load — same approach as Vite's own bin.
|
|
8
8
|
globalThis.__hmr_serve_start = performance.now();
|
|
9
9
|
|
|
10
|
+
const argv = process.argv.slice(2);
|
|
11
|
+
// `--help` prints and exits from arg parsing. Don't leave a spinner over it.
|
|
12
|
+
const wantsHelp = argv.includes('-h') || argv.includes('--help');
|
|
13
|
+
if (!wantsHelp) {
|
|
14
|
+
// Status is a tiny module. Start the line before the CLI pulls in Vite.
|
|
15
|
+
const { getStartup } = await import('../dist/cli/status.js');
|
|
16
|
+
getStartup().set('Starting');
|
|
17
|
+
}
|
|
18
|
+
|
|
10
19
|
const { run } = await import('../dist/cli/index.js');
|
|
11
20
|
|
|
12
|
-
run(
|
|
21
|
+
run(argv).catch((error) => {
|
|
22
|
+
globalThis.__hmr_serve_status?.stop?.();
|
|
13
23
|
console.error(`\n ${error instanceof Error ? error.message : String(error)}\n`);
|
|
14
24
|
process.exitCode = 1;
|
|
15
25
|
});
|
package/dist/cli/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { statSync } from 'node:fs';
|
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
3
|
import { cac } from 'cac';
|
|
4
4
|
import { printLaunchBanner } from './banner.js';
|
|
5
|
-
import {
|
|
5
|
+
import { getStartup } from './status.js';
|
|
6
6
|
/** Pure arg parsing, split out so it can be unit-tested without a live server.
|
|
7
7
|
* Throws `Error` with a user-facing message on invalid input. */
|
|
8
8
|
export function parseArgs(argv) {
|
|
@@ -44,17 +44,35 @@ export function assertDirectory(targetDir) {
|
|
|
44
44
|
}
|
|
45
45
|
export async function run(argv) {
|
|
46
46
|
const started = globalThis.__hmr_serve_start ?? performance.now();
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
47
|
+
const startup = getStartup();
|
|
48
|
+
try {
|
|
49
|
+
const args = parseArgs(argv);
|
|
50
|
+
assertDirectory(args.targetDir);
|
|
51
|
+
// Before the Vite import and the folder scan — both can sit silent for a
|
|
52
|
+
// long time on a large directory.
|
|
53
|
+
startup.set('Starting');
|
|
54
|
+
const { createServer } = await import('../server/createServer.js');
|
|
55
|
+
const server = await createServer({
|
|
56
|
+
targetDir: args.targetDir,
|
|
57
|
+
port: args.port,
|
|
58
|
+
open: args.open,
|
|
59
|
+
noNav: args.noNav,
|
|
60
|
+
onStatus: (step, detail) => {
|
|
61
|
+
startup.set(step);
|
|
62
|
+
if (detail)
|
|
63
|
+
startup.progress(detail);
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
startup.set('Starting server');
|
|
67
|
+
await server.listen();
|
|
68
|
+
startup.stop();
|
|
69
|
+
const info = server.resolvedUrls?.local[0] ?? `http://localhost:${args.port}/`;
|
|
70
|
+
printLaunchBanner(args.targetDir, info, performance.now() - started);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
startup.stop();
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
58
76
|
}
|
|
59
77
|
// Self-execute only when this module is the directly-run script (e.g.
|
|
60
78
|
// `tsx src/cli/index.ts` in dev/e2e, or `node dist/cli/index.js`). The published
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC;kEACkE;AAClE,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;IAC7B,GAAG;SACA,OAAO,CAAC,OAAO,EAAE,qDAAqD,CAAC;SACvE,MAAM,CAAC,eAAe,EAAE,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SAC/D,MAAM,CAAC,QAAQ,EAAE,2BAA2B,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAClE,+DAA+D;SAC9D,MAAM,CAAC,OAAO,EAAE,0DAA0D,EAAE;QAC3E,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IACL,GAAG,CAAC,IAAI,EAAE,CAAC;IAEX,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,MAAM,GAAG,GAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAwB,IAAI,GAAG,CAAC;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC;QACtC,IAAI;QACJ,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;QAClC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,KAAK;KACpC,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,OAAO,GACV,UAA6C,CAAC,iBAAiB,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC;IACxF,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,yEAAyE;QACzE,kCAAkC;QAClC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAExB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClB,IAAI,MAAM;oBAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QAEtB,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,oBAAoB,IAAI,CAAC,IAAI,GAAG,CAAC;QAC/E,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,iFAAiF;AACjF,iFAAiF;AACjF,sCAAsC;AACtC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpE,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,WAAW,EAAE,EAAE,CAAC;IAChD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAClD,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** A writable the startup line can render to. Tests pass a fake; the CLI uses stdout. */
|
|
2
|
+
export interface StatusStream {
|
|
3
|
+
isTTY?: boolean;
|
|
4
|
+
write(chunk: string): void;
|
|
5
|
+
}
|
|
6
|
+
export interface StartupStatus {
|
|
7
|
+
/** Current step. A repeat of the same step does not log again. */
|
|
8
|
+
set(step: string): void;
|
|
9
|
+
/** TTY-only suffix, e.g. "120 of 4381". Ignored when stdout is not a terminal. */
|
|
10
|
+
progress(detail: string): void;
|
|
11
|
+
/** Erase the spinner line. Safe to call more than once. */
|
|
12
|
+
stop(): void;
|
|
13
|
+
}
|
|
14
|
+
/** Visible text for one frame. `tick` 0, 1, 2 → one, two, three dots. */
|
|
15
|
+
export declare function statusFrame(step: string, detail: string | undefined, tick: number): string;
|
|
16
|
+
/**
|
|
17
|
+
* One-line startup feedback. On a TTY the dots cycle in place (`Starting.`
|
|
18
|
+
* `Starting..` `Starting...`). When stdout is piped, each step is printed once.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createStartupStatus(stream?: StatusStream): StartupStatus;
|
|
21
|
+
/** Process-wide status line so the bin can start it before the rest of the CLI loads. */
|
|
22
|
+
export declare function getStartup(): StartupStatus;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
const DOT_MS = 200;
|
|
2
|
+
function useColor(stream) {
|
|
3
|
+
if (process.env.NO_COLOR != null && process.env.NO_COLOR !== '')
|
|
4
|
+
return false;
|
|
5
|
+
if (process.env.FORCE_COLOR != null && process.env.FORCE_COLOR !== '0')
|
|
6
|
+
return true;
|
|
7
|
+
return Boolean(stream.isTTY);
|
|
8
|
+
}
|
|
9
|
+
/** Visible text for one frame. `tick` 0, 1, 2 → one, two, three dots. */
|
|
10
|
+
export function statusFrame(step, detail, tick) {
|
|
11
|
+
const dots = '.'.repeat((tick % 3) + 1);
|
|
12
|
+
const extra = detail ? ` (${detail})` : '';
|
|
13
|
+
return ` ${step}${extra}${dots}`;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* One-line startup feedback. On a TTY the dots cycle in place (`Starting.`
|
|
17
|
+
* `Starting..` `Starting...`). When stdout is piped, each step is printed once.
|
|
18
|
+
*/
|
|
19
|
+
export function createStartupStatus(stream = process.stdout) {
|
|
20
|
+
const tty = Boolean(stream.isTTY);
|
|
21
|
+
const color = useColor(stream);
|
|
22
|
+
// Only the real terminal should claim Ctrl-C. Tests pass a fake stream.
|
|
23
|
+
const signals = stream === process.stdout;
|
|
24
|
+
let step = '';
|
|
25
|
+
let detail;
|
|
26
|
+
let tick = 0;
|
|
27
|
+
let timer;
|
|
28
|
+
let listening = false;
|
|
29
|
+
const onSigint = () => {
|
|
30
|
+
stop();
|
|
31
|
+
process.exit(130);
|
|
32
|
+
};
|
|
33
|
+
const paint = (text) => (color ? `\x1b[2m${text}\x1b[0m` : text);
|
|
34
|
+
const render = () => {
|
|
35
|
+
stream.write(`\r${paint(statusFrame(step, detail, tick))}\x1b[K`);
|
|
36
|
+
};
|
|
37
|
+
const ensureSpinning = () => {
|
|
38
|
+
if (!tty || timer)
|
|
39
|
+
return;
|
|
40
|
+
timer = setInterval(() => {
|
|
41
|
+
tick += 1;
|
|
42
|
+
render();
|
|
43
|
+
}, DOT_MS);
|
|
44
|
+
timer.unref?.();
|
|
45
|
+
if (signals && !listening) {
|
|
46
|
+
listening = true;
|
|
47
|
+
process.once('SIGINT', onSigint);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const stop = () => {
|
|
51
|
+
if (timer) {
|
|
52
|
+
clearInterval(timer);
|
|
53
|
+
timer = undefined;
|
|
54
|
+
}
|
|
55
|
+
if (listening) {
|
|
56
|
+
process.removeListener('SIGINT', onSigint);
|
|
57
|
+
listening = false;
|
|
58
|
+
}
|
|
59
|
+
if (tty && step)
|
|
60
|
+
stream.write('\r\x1b[K');
|
|
61
|
+
step = '';
|
|
62
|
+
detail = undefined;
|
|
63
|
+
};
|
|
64
|
+
return {
|
|
65
|
+
set(next) {
|
|
66
|
+
if (next === step)
|
|
67
|
+
return;
|
|
68
|
+
step = next;
|
|
69
|
+
detail = undefined;
|
|
70
|
+
tick = 0;
|
|
71
|
+
if (!tty) {
|
|
72
|
+
stream.write(`${paint(statusFrame(step, undefined, 2))}\n`);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
ensureSpinning();
|
|
76
|
+
render();
|
|
77
|
+
},
|
|
78
|
+
progress(next) {
|
|
79
|
+
if (!tty || !step)
|
|
80
|
+
return;
|
|
81
|
+
detail = next;
|
|
82
|
+
render();
|
|
83
|
+
},
|
|
84
|
+
stop,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** Process-wide status line so the bin can start it before the rest of the CLI loads. */
|
|
88
|
+
export function getStartup() {
|
|
89
|
+
const g = globalThis;
|
|
90
|
+
g.__hmr_serve_status ??= createStartupStatus();
|
|
91
|
+
return g.__hmr_serve_status;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,8 @@ export interface CreateServerOptions {
|
|
|
8
8
|
host?: string;
|
|
9
9
|
/** Skip the Vue nav shell and serve files like `serve` (with HMR + MD/CSV/TSV). */
|
|
10
10
|
noNav?: boolean;
|
|
11
|
+
/** Startup steps (indexing, and so on) for the CLI status line. */
|
|
12
|
+
onStatus?: (step: string, detail?: string) => void;
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
15
|
* Build (but do not start) a Vite dev server whose root is our app shell, with
|
|
@@ -36,7 +36,10 @@ export async function createServer(options) {
|
|
|
36
36
|
// URLs — an unmatched path (e.g. a stray absolute link) should 404, not render
|
|
37
37
|
// the whole app inside the content iframe.
|
|
38
38
|
appType: 'mpa',
|
|
39
|
-
plugins: [
|
|
39
|
+
plugins: [
|
|
40
|
+
...(noNav ? [] : [vue()]),
|
|
41
|
+
hmrServePlugin({ targetDir, noNav, onStatus: options.onStatus }),
|
|
42
|
+
],
|
|
40
43
|
server: {
|
|
41
44
|
port: options.port ?? 5183,
|
|
42
45
|
host: options.host,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/server/createServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAsB,MAAM,MAAM,CAAC;AAC5E,OAAO,GAAG,MAAM,oBAAoB,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"createServer.js","sourceRoot":"","sources":["../../src/server/createServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAsB,MAAM,MAAM,CAAC;AAC5E,OAAO,GAAG,MAAM,oBAAoB,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAe7C;mFACmF;AACnF,SAAS,iBAAiB;IACxB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,0FAA0F;IAC1F,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACnD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,8EAA8E;IAC9E,2EAA2E;IAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAErC,OAAO,gBAAgB,CAAC;QACtB,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,KAAK;QACjB,+EAA+E;QAC/E,0EAA0E;QAC1E,+EAA+E;QAC/E,2CAA2C;QAC3C,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACzB,cAAc,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;SACjE;QACD,MAAM,EAAE;YACN,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,KAAK;YAC3B,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE;SACxC;QACD,2EAA2E;QAC3E,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;AACL,CAAC"}
|
package/dist/server/noNav.js
CHANGED
|
@@ -95,6 +95,39 @@ const PREVIEW_STYLES = `
|
|
|
95
95
|
.markdown-body th, .markdown-body td { border-color: #d0d7de; }
|
|
96
96
|
}
|
|
97
97
|
.markdown-body th { font-weight: 600; background: rgba(255,255,255,0.04); }
|
|
98
|
+
.csv-preview [hidden] { display: none !important; }
|
|
99
|
+
.csv-pager {
|
|
100
|
+
position: sticky;
|
|
101
|
+
top: 0;
|
|
102
|
+
z-index: 2;
|
|
103
|
+
display: flex;
|
|
104
|
+
align-items: center;
|
|
105
|
+
gap: 8px;
|
|
106
|
+
margin: 0 0 12px;
|
|
107
|
+
padding: 8px 0;
|
|
108
|
+
background: #0d1117;
|
|
109
|
+
font-size: 13px;
|
|
110
|
+
line-height: 1.4;
|
|
111
|
+
}
|
|
112
|
+
.csv-pager button, .csv-pager select {
|
|
113
|
+
font: inherit;
|
|
114
|
+
color: #e6edf3;
|
|
115
|
+
background: #21262d;
|
|
116
|
+
border: 1px solid #30363d;
|
|
117
|
+
border-radius: 6px;
|
|
118
|
+
padding: 2px 8px;
|
|
119
|
+
}
|
|
120
|
+
.csv-pager button { cursor: pointer; }
|
|
121
|
+
.csv-pager button:disabled { opacity: 0.45; cursor: default; }
|
|
122
|
+
.csv-page-size { display: inline-flex; align-items: center; gap: 6px; margin-left: auto; }
|
|
123
|
+
@media (prefers-color-scheme: light) {
|
|
124
|
+
.csv-pager { background: #ffffff; }
|
|
125
|
+
.csv-pager button, .csv-pager select {
|
|
126
|
+
color: #1f2328;
|
|
127
|
+
background: #f6f8fa;
|
|
128
|
+
border-color: #d0d7de;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
98
131
|
.markdown-body pre {
|
|
99
132
|
padding: 16px;
|
|
100
133
|
overflow: auto;
|
|
@@ -142,8 +175,13 @@ const HIGHLIGHT_STYLES = `
|
|
|
142
175
|
`;
|
|
143
176
|
/** Wrap rendered markdown/csv/tsv HTML in a full document with live reload. */
|
|
144
177
|
export function wrapPreviewHtml(title, bodyHtml) {
|
|
178
|
+
// Long CSV/TSV tables ship a pager. The module (Vite-served from the client
|
|
179
|
+
// root) applies the saved page size; markdown pages don't load it.
|
|
180
|
+
const csvPage = bodyHtml.includes('class="csv-pager"');
|
|
181
|
+
const csvAttr = csvPage ? ' data-csv-page="1"' : '';
|
|
182
|
+
const csvScript = csvPage ? '<script type="module" src="/csvPage.ts"></script>' : '';
|
|
145
183
|
return `<!DOCTYPE html>
|
|
146
|
-
<html lang="en">
|
|
184
|
+
<html lang="en"${csvAttr}>
|
|
147
185
|
<head>
|
|
148
186
|
<meta charset="utf-8" />
|
|
149
187
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
@@ -153,6 +191,7 @@ export function wrapPreviewHtml(title, bodyHtml) {
|
|
|
153
191
|
</head>
|
|
154
192
|
<body>
|
|
155
193
|
<main class="markdown-body">${bodyHtml}</main>
|
|
194
|
+
${csvScript}
|
|
156
195
|
</body>
|
|
157
196
|
</html>
|
|
158
197
|
`;
|
package/dist/server/noNav.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noNav.js","sourceRoot":"","sources":["../../src/server/noNav.ts"],"names":[],"mappings":"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
|
|
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
|
@@ -8,6 +8,8 @@ export interface HmrServePluginOptions {
|
|
|
8
8
|
registry?: RendererRegistry;
|
|
9
9
|
/** Serve files directly (like `serve`) instead of the Vue nav shell. */
|
|
10
10
|
noNav?: boolean;
|
|
11
|
+
/** Reports slow startup steps (the initial search-index scan) to the CLI. */
|
|
12
|
+
onStatus?: (step: string, detail?: string) => void;
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
15
|
* The hmr-serve Vite plugin. Owns the search index + file watcher and exposes
|
package/dist/server/plugin.js
CHANGED
|
@@ -67,6 +67,7 @@ export function hmrServePlugin(options) {
|
|
|
67
67
|
const targetDir = options.targetDir;
|
|
68
68
|
const registry = options.registry ?? new RendererRegistry();
|
|
69
69
|
const noNav = Boolean(options.noNav);
|
|
70
|
+
const onStatus = options.onStatus;
|
|
70
71
|
const index = new SearchIndex();
|
|
71
72
|
// Content is routed under this prefix (the folder's name) so bookmarkable URLs
|
|
72
73
|
// like /aurora-notes/docs/intro.md never collide with the shell's root assets.
|
|
@@ -121,13 +122,25 @@ export function hmrServePlugin(options) {
|
|
|
121
122
|
}
|
|
122
123
|
// —— Nav mode (default): Vue shell + JSON APIs ————————————————————————
|
|
123
124
|
// 1. Initial index scan. Binary files (image/video) are indexed by name
|
|
124
|
-
// only — never read as text.
|
|
125
|
+
// only — never read as text. This walk is the long silent stretch on a
|
|
126
|
+
// big folder, so report it on the CLI status line.
|
|
127
|
+
onStatus?.('Indexing files');
|
|
125
128
|
const files = await listSupportedFiles(targetDir, registry);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
129
|
+
const total = files.length;
|
|
130
|
+
if (total > 0) {
|
|
131
|
+
const count = (n) => n.toLocaleString('en-US');
|
|
132
|
+
onStatus?.('Indexing files', `0 of ${count(total)}`);
|
|
133
|
+
let done = 0;
|
|
134
|
+
await Promise.all(files.map(async (rel) => {
|
|
135
|
+
const ext = extOf(rel);
|
|
136
|
+
const raw = registry.isText(ext) ? await readFileText(resolve(targetDir, rel)) : '';
|
|
137
|
+
index.add(rel, ext, raw);
|
|
138
|
+
done += 1;
|
|
139
|
+
if (done === total || done % 50 === 0) {
|
|
140
|
+
onStatus?.('Indexing files', `${count(done)} of ${count(total)}`);
|
|
141
|
+
}
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
131
144
|
// 2. Reuse Vite's chokidar watcher (single source of truth) for the target.
|
|
132
145
|
const emit = (update) => {
|
|
133
146
|
server.ws.send({ type: 'custom', event: HMR_UPDATE_EVENT, data: update });
|
|
@@ -268,7 +281,9 @@ async function handleNoNavRequest(req, res, next, ctx) {
|
|
|
268
281
|
if (pathname.startsWith('/@') ||
|
|
269
282
|
pathname.startsWith('/node_modules/') ||
|
|
270
283
|
pathname.startsWith('/__vite') ||
|
|
271
|
-
pathname.startsWith(API_BASE)
|
|
284
|
+
pathname.startsWith(API_BASE) ||
|
|
285
|
+
// CSV preview pages load this from the Vite client root to paginate tables.
|
|
286
|
+
pathname === '/csvPage.ts') {
|
|
272
287
|
return next();
|
|
273
288
|
}
|
|
274
289
|
const rel = pathname === '/' ? '' : pathname.replace(/^\/+/, '');
|
|
@@ -316,7 +331,10 @@ async function serveNoNavFile(res, ctx, abs) {
|
|
|
316
331
|
const ext = extOf(rel);
|
|
317
332
|
if (isPreviewExtension(ext) && ctx.registry.supports(ext)) {
|
|
318
333
|
const raw = await readFileText(abs);
|
|
319
|
-
|
|
334
|
+
// The preview page is served at the markdown file's own URL, so relative
|
|
335
|
+
// image paths already resolve. Rewriting them to /__hmrserve/raw/ (which
|
|
336
|
+
// this mode does not mount) would 404 every image.
|
|
337
|
+
const result = ctx.registry.render({ path: rel, ext, raw, rewriteAssets: false });
|
|
320
338
|
const body = result.html ?? '';
|
|
321
339
|
sendHtml(res, 200, wrapPreviewHtml(result.title || basenameFallback(rel), body));
|
|
322
340
|
return;
|
|
@@ -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":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { basename } from 'node:path';
|
|
2
|
+
import { CSV_PAGE_SIZE_ALL, CSV_PAGE_SIZE_DEFAULT, CSV_PAGE_SIZES, csvPageWindow, csvPagerVisible, } from '../../shared/csvPage.js';
|
|
2
3
|
function escapeHtml(value) {
|
|
3
4
|
return value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
4
5
|
}
|
|
@@ -51,6 +52,24 @@ export function parseDelimited(raw, delimiter) {
|
|
|
51
52
|
rows.push(row);
|
|
52
53
|
return rows;
|
|
53
54
|
}
|
|
55
|
+
/** Pager markup. The client shows one page and reads the saved rows-per-page preference. */
|
|
56
|
+
function renderPager(rowCount) {
|
|
57
|
+
const { start, end, pageCount } = csvPageWindow(rowCount, 1, CSV_PAGE_SIZE_DEFAULT);
|
|
58
|
+
const options = [
|
|
59
|
+
...CSV_PAGE_SIZES.map((size) => {
|
|
60
|
+
const selected = size === CSV_PAGE_SIZE_DEFAULT ? ' selected' : '';
|
|
61
|
+
return `<option value="${size}"${selected}>${size}</option>`;
|
|
62
|
+
}),
|
|
63
|
+
`<option value="${CSV_PAGE_SIZE_ALL}">All</option>`,
|
|
64
|
+
].join('');
|
|
65
|
+
const nextDisabled = pageCount <= 1 ? ' disabled' : '';
|
|
66
|
+
return (`<nav class="csv-pager" data-testid="csv-pager" aria-label="Pagination">` +
|
|
67
|
+
`<button type="button" data-csv-prev aria-label="Previous page" disabled>Prev</button>` +
|
|
68
|
+
`<span data-csv-status aria-live="polite">${start + 1}–${end} of ${rowCount}</span>` +
|
|
69
|
+
`<button type="button" data-csv-next aria-label="Next page"${nextDisabled}>Next</button>` +
|
|
70
|
+
`<label class="csv-page-size">Rows <select data-csv-size data-testid="csv-pager-size" aria-label="Rows per page">${options}</select></label>` +
|
|
71
|
+
`</nav>`);
|
|
72
|
+
}
|
|
54
73
|
function renderTable(rows) {
|
|
55
74
|
if (rows.length === 0)
|
|
56
75
|
return '<p><em>(empty file)</em></p>';
|
|
@@ -63,11 +82,20 @@ function renderTable(rows) {
|
|
|
63
82
|
});
|
|
64
83
|
const header = normalized[0];
|
|
65
84
|
const body = normalized.slice(1);
|
|
85
|
+
const paginate = csvPagerVisible(body.length);
|
|
66
86
|
const thead = `<thead><tr>${header.map((c) => `<th>${escapeHtml(c)}</th>`).join('')}</tr></thead>`;
|
|
67
87
|
const tbody = body.length > 0
|
|
68
|
-
? `<tbody>${body
|
|
88
|
+
? `<tbody>${body
|
|
89
|
+
.map((r, index) => {
|
|
90
|
+
// Past the default page, start hidden so a long file doesn't flash every row
|
|
91
|
+
// before the client applies the saved page size.
|
|
92
|
+
const hidden = paginate && index >= CSV_PAGE_SIZE_DEFAULT ? ' hidden' : '';
|
|
93
|
+
return `<tr${hidden}>${r.map((c) => `<td>${escapeHtml(c)}</td>`).join('')}</tr>`;
|
|
94
|
+
})
|
|
95
|
+
.join('')}</tbody>`
|
|
69
96
|
: '';
|
|
70
|
-
|
|
97
|
+
const pager = paginate ? renderPager(body.length) : '';
|
|
98
|
+
return `<div class="csv-preview" data-csv-page="1" data-csv-page-size="${CSV_PAGE_SIZE_DEFAULT}">${pager}<table>${thead}${tbody}</table></div>`;
|
|
71
99
|
}
|
|
72
100
|
export const csvRenderer = {
|
|
73
101
|
extensions: ['csv', 'tsv'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/server/renderers/csv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../src/server/renderers/csv.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,24 @@ import { createRequire } from 'node:module';
|
|
|
4
4
|
import { basename, posix } from 'node:path';
|
|
5
5
|
/** Where the server streams raw file bytes (mirror of the plugin's raw route). */
|
|
6
6
|
const RAW_BASE = '/__hmrserve/raw/';
|
|
7
|
+
/**
|
|
8
|
+
* markdown-it percent-encodes link destinations (spaces, non-ASCII) before they
|
|
9
|
+
* land in `src`. Decode each segment first so a later encodeURIComponent does
|
|
10
|
+
* not turn `%20` into `%2520` — the browser would then 404.
|
|
11
|
+
*/
|
|
12
|
+
function decodePath(path) {
|
|
13
|
+
return path
|
|
14
|
+
.split('/')
|
|
15
|
+
.map((segment) => {
|
|
16
|
+
try {
|
|
17
|
+
return decodeURIComponent(segment);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return segment;
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
.join('/');
|
|
24
|
+
}
|
|
7
25
|
/**
|
|
8
26
|
* Rendered markdown is injected into the app-shell DOM (not an iframe), so a
|
|
9
27
|
* relative `<img src="pic.png">` would resolve against the shell URL and 404.
|
|
@@ -21,7 +39,7 @@ function resolveAssetUrl(mdDir, value) {
|
|
|
21
39
|
const cut = v.search(/[?#]/);
|
|
22
40
|
const pathPart = cut >= 0 ? v.slice(0, cut) : v;
|
|
23
41
|
const suffix = cut >= 0 ? v.slice(cut) : '';
|
|
24
|
-
const resolved = posix.normalize(posix.join(mdDir, pathPart));
|
|
42
|
+
const resolved = posix.normalize(posix.join(mdDir, decodePath(pathPart)));
|
|
25
43
|
// Never point outside the served root.
|
|
26
44
|
if (resolved.startsWith('..'))
|
|
27
45
|
return value;
|
|
@@ -67,11 +85,12 @@ function deriveTitle(raw, path) {
|
|
|
67
85
|
export const markdownRenderer = {
|
|
68
86
|
extensions: ['md', 'markdown'],
|
|
69
87
|
category: 'markdown',
|
|
70
|
-
render({ raw, path }) {
|
|
88
|
+
render({ raw, path, rewriteAssets = true }) {
|
|
71
89
|
const mdDir = posix.dirname(path); // '.' at the root
|
|
90
|
+
const html = md.render(raw);
|
|
72
91
|
return {
|
|
73
92
|
kind: 'html',
|
|
74
|
-
html: rewriteRelativeAssets(
|
|
93
|
+
html: rewriteAssets ? rewriteRelativeAssets(html, mdDir === '.' ? '' : mdDir) : html,
|
|
75
94
|
title: deriveTitle(raw, path),
|
|
76
95
|
};
|
|
77
96
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/server/renderers/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,IAAI,MAAM,cAAc,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAG5C,kFAAkF;AAClF,MAAM,QAAQ,GAAG,kBAAkB,CAAC;AAEpC;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,KAAa,EAAE,KAAa;IACnD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,gFAAgF;IAChF,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3E,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/server/renderers/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,13 @@ export interface RenderInput {
|
|
|
6
6
|
ext: string;
|
|
7
7
|
/** Raw file contents. */
|
|
8
8
|
raw: string;
|
|
9
|
+
/**
|
|
10
|
+
* When false, relative asset URLs in rendered markdown are left as written.
|
|
11
|
+
* The nav shell rewrites them (default) because the HTML is injected into the
|
|
12
|
+
* app page; `--no-nav` serves the page at the file's own URL, so relatives
|
|
13
|
+
* already resolve.
|
|
14
|
+
*/
|
|
15
|
+
rewriteAssets?: boolean;
|
|
9
16
|
}
|
|
10
17
|
export interface RenderResult {
|
|
11
18
|
kind: RenderKind;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Rows-per-page choices for CSV/TSV previews. `0` means show every row. */
|
|
2
|
+
export declare const CSV_PAGE_SIZES: readonly [25, 50, 100, 250];
|
|
3
|
+
export declare const CSV_PAGE_SIZE_DEFAULT = 50;
|
|
4
|
+
export declare const CSV_PAGE_SIZE_ALL = 0;
|
|
5
|
+
/** Smallest selectable page. Tables at or under this stay a single unpaged table. */
|
|
6
|
+
export declare function csvPageSizeMin(): number;
|
|
7
|
+
/** True when a table is long enough that the pager (and its page-size control) is useful. */
|
|
8
|
+
export declare function csvPagerVisible(rowCount: number): boolean;
|
|
9
|
+
/** Coerce a stored or selected value to a known page size. Anything else falls back to the default. */
|
|
10
|
+
export declare function normalizeCsvPageSize(value: unknown): number;
|
|
11
|
+
export interface CsvPageWindow {
|
|
12
|
+
/** 1-based page, clamped into range. */
|
|
13
|
+
page: number;
|
|
14
|
+
/** Inclusive row index. */
|
|
15
|
+
start: number;
|
|
16
|
+
/** Exclusive row index. */
|
|
17
|
+
end: number;
|
|
18
|
+
pageCount: number;
|
|
19
|
+
}
|
|
20
|
+
/** Slice a body-row count into one page. `pageSize <= 0` shows every row. */
|
|
21
|
+
export declare function csvPageWindow(rowCount: number, page: number, pageSize: number): CsvPageWindow;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Rows-per-page choices for CSV/TSV previews. `0` means show every row. */
|
|
2
|
+
export const CSV_PAGE_SIZES = [25, 50, 100, 250];
|
|
3
|
+
export const CSV_PAGE_SIZE_DEFAULT = 50;
|
|
4
|
+
export const CSV_PAGE_SIZE_ALL = 0;
|
|
5
|
+
const PAGE_SIZES = CSV_PAGE_SIZES;
|
|
6
|
+
/** Smallest selectable page. Tables at or under this stay a single unpaged table. */
|
|
7
|
+
export function csvPageSizeMin() {
|
|
8
|
+
return Math.min(...CSV_PAGE_SIZES);
|
|
9
|
+
}
|
|
10
|
+
/** True when a table is long enough that the pager (and its page-size control) is useful. */
|
|
11
|
+
export function csvPagerVisible(rowCount) {
|
|
12
|
+
return rowCount > csvPageSizeMin();
|
|
13
|
+
}
|
|
14
|
+
/** Coerce a stored or selected value to a known page size. Anything else falls back to the default. */
|
|
15
|
+
export function normalizeCsvPageSize(value) {
|
|
16
|
+
if (value === CSV_PAGE_SIZE_ALL || value === '0')
|
|
17
|
+
return CSV_PAGE_SIZE_ALL;
|
|
18
|
+
const n = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN;
|
|
19
|
+
if (PAGE_SIZES.includes(n))
|
|
20
|
+
return n;
|
|
21
|
+
return CSV_PAGE_SIZE_DEFAULT;
|
|
22
|
+
}
|
|
23
|
+
/** Slice a body-row count into one page. `pageSize <= 0` shows every row. */
|
|
24
|
+
export function csvPageWindow(rowCount, page, pageSize) {
|
|
25
|
+
if (rowCount <= 0)
|
|
26
|
+
return { page: 1, start: 0, end: 0, pageCount: 1 };
|
|
27
|
+
const size = pageSize > 0 ? pageSize : rowCount;
|
|
28
|
+
const pageCount = Math.max(1, Math.ceil(rowCount / size));
|
|
29
|
+
const current = Math.min(Math.max(1, Math.floor(page) || 1), pageCount);
|
|
30
|
+
const start = (current - 1) * size;
|
|
31
|
+
return { page: current, start, end: Math.min(start + size, rowCount), pageCount };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=csvPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"csvPage.js","sourceRoot":"","sources":["../../src/shared/csvPage.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAU,CAAC;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,MAAM,UAAU,GAAsB,cAAc,CAAC;AAErD,qFAAqF;AACrF,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;AACrC,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,QAAQ,GAAG,cAAc,EAAE,CAAC;AACrC,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,KAAK,iBAAiB,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,iBAAiB,CAAC;IAC3E,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9F,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAYD,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAY,EAAE,QAAgB;IAC5E,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACtE,MAAM,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;AACpF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hmr-serve",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "Point at any folder and review it live in the browser — VSCode-style file tree + content pane, powered by Vite's dev server and HMR client.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
package/src/client/App.vue
CHANGED
|
@@ -15,9 +15,11 @@
|
|
|
15
15
|
:visible="visibleCategories"
|
|
16
16
|
:show-other-files="showOtherFiles"
|
|
17
17
|
:theme="theme"
|
|
18
|
+
:csv-page-size="csvPageSize"
|
|
18
19
|
@change="onCategoriesChange"
|
|
19
20
|
@update:show-other-files="onShowOtherFilesChange"
|
|
20
21
|
@update:theme="onThemeChange"
|
|
22
|
+
@update:csv-page-size="onCsvPageSize"
|
|
21
23
|
/>
|
|
22
24
|
<button
|
|
23
25
|
type="button"
|
|
@@ -113,7 +115,9 @@
|
|
|
113
115
|
:path="selectedPath"
|
|
114
116
|
:selectable-extensions="allowedExtensions"
|
|
115
117
|
:supported-extensions="supportedExtensions"
|
|
118
|
+
:csv-page-size="csvPageSize"
|
|
116
119
|
@navigate="onFrameNavigate"
|
|
120
|
+
@update:csv-page-size="onCsvPageSize"
|
|
117
121
|
/>
|
|
118
122
|
</main>
|
|
119
123
|
</div>
|
|
@@ -121,10 +125,12 @@
|
|
|
121
125
|
|
|
122
126
|
<script lang="ts">
|
|
123
127
|
import { defineComponent } from 'vue';
|
|
128
|
+
import { normalizeCsvPageSize } from '../shared/csvPage';
|
|
124
129
|
import type { CategoryInfo, FileCategory, FileNode, SearchHit } from '../shared/types';
|
|
125
130
|
import { fetchConfig, fetchTree, search } from './api';
|
|
126
131
|
import { onFileUpdate } from './hmr';
|
|
127
132
|
import { hrefFor, isPlainNavClick, readPath, writePath } from './router';
|
|
133
|
+
import { loadCsvPageSize, saveCsvPageSize } from './csvPage';
|
|
128
134
|
import {
|
|
129
135
|
SIDEBAR_DEFAULT_WIDTH,
|
|
130
136
|
clampSidebarWidth,
|
|
@@ -151,6 +157,7 @@ interface AppData {
|
|
|
151
157
|
categories: CategoryInfo[];
|
|
152
158
|
visibleCategories: FileCategory[];
|
|
153
159
|
showOtherFiles: boolean;
|
|
160
|
+
csvPageSize: number;
|
|
154
161
|
theme: Theme;
|
|
155
162
|
sidebarCollapsed: boolean;
|
|
156
163
|
sidebarWidth: number;
|
|
@@ -203,6 +210,7 @@ export default defineComponent({
|
|
|
203
210
|
categories: [],
|
|
204
211
|
visibleCategories: [],
|
|
205
212
|
showOtherFiles: false,
|
|
213
|
+
csvPageSize: loadCsvPageSize(),
|
|
206
214
|
theme: loadTheme(),
|
|
207
215
|
sidebarCollapsed: false,
|
|
208
216
|
sidebarWidth: SIDEBAR_DEFAULT_WIDTH,
|
|
@@ -310,6 +318,10 @@ export default defineComponent({
|
|
|
310
318
|
saveTheme(theme);
|
|
311
319
|
applyTheme(theme);
|
|
312
320
|
},
|
|
321
|
+
onCsvPageSize(size: number): void {
|
|
322
|
+
this.csvPageSize = normalizeCsvPageSize(size);
|
|
323
|
+
saveCsvPageSize(this.csvPageSize);
|
|
324
|
+
},
|
|
313
325
|
toggleSidebar(): void {
|
|
314
326
|
this.sidebarCollapsed = !this.sidebarCollapsed;
|
|
315
327
|
saveSidebarCollapsed(this.mount, this.sidebarCollapsed);
|
|
@@ -162,8 +162,10 @@
|
|
|
162
162
|
|
|
163
163
|
<script lang="ts">
|
|
164
164
|
import { defineComponent, type PropType, nextTick } from 'vue';
|
|
165
|
+
import { CSV_PAGE_SIZE_DEFAULT } from '../../shared/csvPage';
|
|
165
166
|
import type { RenderedFile } from '../../shared/types';
|
|
166
167
|
import { fetchFile, fetchRawText } from '../api';
|
|
168
|
+
import { bindCsvPreview } from '../csvPage';
|
|
167
169
|
import { onFileUpdate } from '../hmr';
|
|
168
170
|
|
|
169
171
|
const RAW_PREFIX = '/__hmrserve/raw/';
|
|
@@ -249,11 +251,14 @@ export default defineComponent({
|
|
|
249
251
|
selectableExtensions: { type: Array as PropType<string[]>, default: () => [] },
|
|
250
252
|
// Extensions with a renderer — anything else shows a not-supported message.
|
|
251
253
|
supportedExtensions: { type: Array as PropType<string[]>, default: () => [] },
|
|
254
|
+
/** Saved CSV/TSV rows per page. The table's own control updates this too. */
|
|
255
|
+
csvPageSize: { type: Number, default: CSV_PAGE_SIZE_DEFAULT },
|
|
252
256
|
},
|
|
253
257
|
emits: {
|
|
254
258
|
// Raised when the iframe navigates itself (a user clicked a link inside a
|
|
255
259
|
// framed doc) so the app can update its selection + URL.
|
|
256
260
|
navigate: (path: string) => typeof path === 'string',
|
|
261
|
+
'update:csvPageSize': (value: number) => typeof value === 'number',
|
|
257
262
|
},
|
|
258
263
|
data(): ContentPaneData {
|
|
259
264
|
return {
|
|
@@ -316,6 +321,9 @@ export default defineComponent({
|
|
|
316
321
|
supportedExtensions(): void {
|
|
317
322
|
if (this.path) void this.load(this.path);
|
|
318
323
|
},
|
|
324
|
+
csvPageSize(): void {
|
|
325
|
+
this.mountCsvPager();
|
|
326
|
+
},
|
|
319
327
|
},
|
|
320
328
|
mounted(): void {
|
|
321
329
|
document.addEventListener('keydown', this.onKeyDown);
|
|
@@ -387,12 +395,23 @@ export default defineComponent({
|
|
|
387
395
|
setMode(mode: PaneMode): void {
|
|
388
396
|
this.mode = mode;
|
|
389
397
|
if (mode === 'code' && this.path) void this.loadSource(this.path);
|
|
390
|
-
if (mode === 'view'
|
|
398
|
+
if (mode === 'view') {
|
|
391
399
|
void nextTick().then(() => {
|
|
392
|
-
|
|
400
|
+
this.mountCsvPager();
|
|
401
|
+
if (this.file?.kind === 'iframe' && this.file.src) {
|
|
402
|
+
this.navigateFrame(this.withVersion(this.file.src));
|
|
403
|
+
}
|
|
393
404
|
});
|
|
394
405
|
}
|
|
395
406
|
},
|
|
407
|
+
/** Page a rendered CSV/TSV table to the current rows-per-page setting. */
|
|
408
|
+
mountCsvPager(): void {
|
|
409
|
+
const root = this.$el as HTMLElement | undefined;
|
|
410
|
+
if (!root || this.mode !== 'view') return;
|
|
411
|
+
bindCsvPreview(root, this.csvPageSize, (size) => {
|
|
412
|
+
this.$emit('update:csvPageSize', size);
|
|
413
|
+
});
|
|
414
|
+
},
|
|
396
415
|
toggleFullscreen(): void {
|
|
397
416
|
this.fullscreen = !this.fullscreen;
|
|
398
417
|
},
|
|
@@ -455,6 +474,8 @@ export default defineComponent({
|
|
|
455
474
|
this.file = file;
|
|
456
475
|
// Gate the PDF viewer behind a placeholder until its iframe fires `load`.
|
|
457
476
|
this.setPdfLoading(file.kind === 'pdf');
|
|
477
|
+
await nextTick();
|
|
478
|
+
this.mountCsvPager();
|
|
458
479
|
if (this.mode === 'code') {
|
|
459
480
|
void this.loadSource(path);
|
|
460
481
|
this.framedPath = null;
|
|
@@ -51,6 +51,20 @@
|
|
|
51
51
|
<button type="button" @click="setAll(false)">None</button>
|
|
52
52
|
</div>
|
|
53
53
|
<div class="settings-divider" role="separator"></div>
|
|
54
|
+
<div class="settings-title">Tables</div>
|
|
55
|
+
<label class="settings-row settings-page-size">
|
|
56
|
+
<span>Rows per page</span>
|
|
57
|
+
<select
|
|
58
|
+
:value="csvPageSize"
|
|
59
|
+
data-testid="csv-page-size"
|
|
60
|
+
aria-label="CSV rows per page"
|
|
61
|
+
@change="onCsvPageSizeChange"
|
|
62
|
+
>
|
|
63
|
+
<option v-for="size in pageSizes" :key="size" :value="size">{{ size }}</option>
|
|
64
|
+
<option :value="pageSizeAll">All</option>
|
|
65
|
+
</select>
|
|
66
|
+
</label>
|
|
67
|
+
<div class="settings-divider" role="separator"></div>
|
|
54
68
|
<div class="settings-title">Appearance</div>
|
|
55
69
|
<div class="settings-actions theme-actions">
|
|
56
70
|
<button
|
|
@@ -109,6 +123,7 @@
|
|
|
109
123
|
|
|
110
124
|
<script lang="ts">
|
|
111
125
|
import { defineComponent, type PropType } from 'vue';
|
|
126
|
+
import { CSV_PAGE_SIZE_ALL, CSV_PAGE_SIZES, normalizeCsvPageSize } from '../../shared/csvPage';
|
|
112
127
|
import type { CategoryInfo, FileCategory } from '../../shared/types';
|
|
113
128
|
import type { Theme } from '../theme';
|
|
114
129
|
|
|
@@ -119,14 +134,16 @@ export default defineComponent({
|
|
|
119
134
|
visible: { type: Array as PropType<FileCategory[]>, required: true },
|
|
120
135
|
showOtherFiles: { type: Boolean, default: false },
|
|
121
136
|
theme: { type: String as PropType<Theme>, default: 'dark' },
|
|
137
|
+
csvPageSize: { type: Number, default: 50 },
|
|
122
138
|
},
|
|
123
139
|
emits: {
|
|
124
140
|
change: (value: FileCategory[]) => Array.isArray(value),
|
|
125
141
|
'update:showOtherFiles': (value: boolean) => typeof value === 'boolean',
|
|
126
142
|
'update:theme': (value: Theme) => value === 'dark' || value === 'light',
|
|
143
|
+
'update:csvPageSize': (value: number) => typeof value === 'number',
|
|
127
144
|
},
|
|
128
145
|
data() {
|
|
129
|
-
return { open: false };
|
|
146
|
+
return { open: false, pageSizes: CSV_PAGE_SIZES, pageSizeAll: CSV_PAGE_SIZE_ALL };
|
|
130
147
|
},
|
|
131
148
|
beforeUnmount(): void {
|
|
132
149
|
document.removeEventListener('mousedown', this.onDocMouseDown);
|
|
@@ -151,6 +168,11 @@ export default defineComponent({
|
|
|
151
168
|
setTheme(theme: Theme): void {
|
|
152
169
|
this.$emit('update:theme', theme);
|
|
153
170
|
},
|
|
171
|
+
onCsvPageSizeChange(event: Event): void {
|
|
172
|
+
const select = event.target;
|
|
173
|
+
if (!(select instanceof HTMLSelectElement)) return;
|
|
174
|
+
this.$emit('update:csvPageSize', normalizeCsvPageSize(select.value));
|
|
175
|
+
},
|
|
154
176
|
toggleOpen(): void {
|
|
155
177
|
this.open = !this.open;
|
|
156
178
|
if (this.open) document.addEventListener('mousedown', this.onDocMouseDown);
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CSV_PAGE_SIZE_DEFAULT,
|
|
3
|
+
csvPageWindow,
|
|
4
|
+
csvPagerVisible,
|
|
5
|
+
normalizeCsvPageSize,
|
|
6
|
+
} from '../shared/csvPage';
|
|
7
|
+
|
|
8
|
+
/** Global (like theme): one rows-per-page preference for every CSV/TSV preview. */
|
|
9
|
+
const CSV_PAGE_SIZE_KEY = 'hmr-serve:csv-page-size';
|
|
10
|
+
|
|
11
|
+
/** Saved CSV/TSV rows per page. Unset, corrupt, or unknown values use the default. */
|
|
12
|
+
export function loadCsvPageSize(): number {
|
|
13
|
+
try {
|
|
14
|
+
const raw = localStorage.getItem(CSV_PAGE_SIZE_KEY);
|
|
15
|
+
if (raw == null) return CSV_PAGE_SIZE_DEFAULT;
|
|
16
|
+
return normalizeCsvPageSize(raw);
|
|
17
|
+
} catch {
|
|
18
|
+
return CSV_PAGE_SIZE_DEFAULT;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function saveCsvPageSize(size: number): void {
|
|
23
|
+
try {
|
|
24
|
+
localStorage.setItem(CSV_PAGE_SIZE_KEY, String(normalizeCsvPageSize(size)));
|
|
25
|
+
} catch {
|
|
26
|
+
// Ignore storage failures — the choice still applies in-session.
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Show one page of a rendered CSV/TSV table. The server emits every row (rows
|
|
32
|
+
* past the default page start hidden); this adjusts that window to the saved
|
|
33
|
+
* page size and wires Prev/Next plus the rows-per-page control.
|
|
34
|
+
*
|
|
35
|
+
* Safe to call again after a re-render or a settings change: listeners attach
|
|
36
|
+
* once, and a changed page size returns to page 1.
|
|
37
|
+
*/
|
|
38
|
+
export function bindCsvPreview(
|
|
39
|
+
root: ParentNode,
|
|
40
|
+
pageSize: number,
|
|
41
|
+
onPageSizeChange?: (size: number) => void,
|
|
42
|
+
): void {
|
|
43
|
+
const preview = root.querySelector('.csv-preview');
|
|
44
|
+
if (!(preview instanceof HTMLElement)) return;
|
|
45
|
+
const pager = preview.querySelector('.csv-pager');
|
|
46
|
+
if (!(pager instanceof HTMLElement)) return;
|
|
47
|
+
|
|
48
|
+
const nextSize = String(normalizeCsvPageSize(pageSize));
|
|
49
|
+
const previousSize = preview.dataset.csvPageSize;
|
|
50
|
+
if (previousSize != null && previousSize !== nextSize) preview.dataset.csvPage = '1';
|
|
51
|
+
preview.dataset.csvPageSize = nextSize;
|
|
52
|
+
|
|
53
|
+
const select = preview.querySelector('[data-csv-size]');
|
|
54
|
+
if (select instanceof HTMLSelectElement && select.value !== nextSize) select.value = nextSize;
|
|
55
|
+
|
|
56
|
+
if (preview.dataset.csvBound !== '1') {
|
|
57
|
+
preview.dataset.csvBound = '1';
|
|
58
|
+
preview.querySelector('[data-csv-prev]')?.addEventListener('click', () => {
|
|
59
|
+
preview.dataset.csvPage = String(readPage(preview) - 1);
|
|
60
|
+
applyCsvPage(preview);
|
|
61
|
+
});
|
|
62
|
+
preview.querySelector('[data-csv-next]')?.addEventListener('click', () => {
|
|
63
|
+
preview.dataset.csvPage = String(readPage(preview) + 1);
|
|
64
|
+
applyCsvPage(preview);
|
|
65
|
+
});
|
|
66
|
+
select?.addEventListener('change', () => {
|
|
67
|
+
if (!(select instanceof HTMLSelectElement)) return;
|
|
68
|
+
const size = normalizeCsvPageSize(select.value);
|
|
69
|
+
saveCsvPageSize(size);
|
|
70
|
+
preview.dataset.csvPageSize = String(size);
|
|
71
|
+
preview.dataset.csvPage = '1';
|
|
72
|
+
applyCsvPage(preview);
|
|
73
|
+
onPageSizeChange?.(size);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
applyCsvPage(preview);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function readPage(preview: HTMLElement): number {
|
|
81
|
+
const page = Number(preview.dataset.csvPage);
|
|
82
|
+
return Number.isInteger(page) && page >= 1 ? page : 1;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function applyCsvPage(preview: HTMLElement): void {
|
|
86
|
+
const rows = Array.from(preview.querySelectorAll('tbody tr'));
|
|
87
|
+
const pager = preview.querySelector('.csv-pager');
|
|
88
|
+
const pageSize = normalizeCsvPageSize(preview.dataset.csvPageSize);
|
|
89
|
+
|
|
90
|
+
if (!(pager instanceof HTMLElement) || !csvPagerVisible(rows.length)) {
|
|
91
|
+
if (pager instanceof HTMLElement) pager.hidden = true;
|
|
92
|
+
for (const row of rows) if (row instanceof HTMLElement) row.hidden = false;
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
pager.hidden = false;
|
|
97
|
+
const span = csvPageWindow(rows.length, readPage(preview), pageSize);
|
|
98
|
+
preview.dataset.csvPage = String(span.page);
|
|
99
|
+
|
|
100
|
+
rows.forEach((row, index) => {
|
|
101
|
+
if (row instanceof HTMLElement) row.hidden = index < span.start || index >= span.end;
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
const status = preview.querySelector('[data-csv-status]');
|
|
105
|
+
if (status) {
|
|
106
|
+
const from = span.end === 0 ? 0 : span.start + 1;
|
|
107
|
+
status.textContent = `${from}–${span.end} of ${rows.length}`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const prev = preview.querySelector('[data-csv-prev]');
|
|
111
|
+
const next = preview.querySelector('[data-csv-next]');
|
|
112
|
+
if (prev instanceof HTMLButtonElement) prev.disabled = span.page <= 1;
|
|
113
|
+
if (next instanceof HTMLButtonElement) next.disabled = span.page >= span.pageCount;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** `--no-nav` preview pages set `data-csv-page` and load this module directly. */
|
|
117
|
+
function bootStandaloneCsvPage(): void {
|
|
118
|
+
if (typeof document === 'undefined') return;
|
|
119
|
+
if (document.documentElement.dataset.csvPage !== '1') return;
|
|
120
|
+
const start = (): void => bindCsvPreview(document, loadCsvPageSize());
|
|
121
|
+
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start);
|
|
122
|
+
else start();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
bootStandaloneCsvPage();
|
package/src/client/styles.css
CHANGED
|
@@ -460,6 +460,63 @@ body.is-resizing {
|
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
462
|
|
|
463
|
+
/* CSV/TSV pager. Sits above the table and sticks while the pane scrolls.
|
|
464
|
+
* Background matches github-markdown-css so rows don't show through. */
|
|
465
|
+
.markdown-body .csv-pager {
|
|
466
|
+
position: sticky;
|
|
467
|
+
top: 0;
|
|
468
|
+
z-index: 2;
|
|
469
|
+
display: flex;
|
|
470
|
+
align-items: center;
|
|
471
|
+
gap: 8px;
|
|
472
|
+
margin: 0 0 12px;
|
|
473
|
+
padding: 8px 0;
|
|
474
|
+
background: #0d1117;
|
|
475
|
+
font-size: 13px;
|
|
476
|
+
line-height: 1.4;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
[data-theme='light'] .markdown-body .csv-pager {
|
|
480
|
+
background: #ffffff;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
.markdown-body .csv-pager button,
|
|
484
|
+
.markdown-body .csv-pager select {
|
|
485
|
+
font: inherit;
|
|
486
|
+
color: #f0f6fc;
|
|
487
|
+
background: #21262d;
|
|
488
|
+
border: 1px solid #30363d;
|
|
489
|
+
border-radius: 6px;
|
|
490
|
+
padding: 2px 8px;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
[data-theme='light'] .markdown-body .csv-pager button,
|
|
494
|
+
[data-theme='light'] .markdown-body .csv-pager select {
|
|
495
|
+
color: #1f2328;
|
|
496
|
+
background: #f6f8fa;
|
|
497
|
+
border-color: #d0d7de;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
.markdown-body .csv-pager button {
|
|
501
|
+
cursor: pointer;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
.markdown-body .csv-pager button:disabled {
|
|
505
|
+
opacity: 0.45;
|
|
506
|
+
cursor: default;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
.markdown-body .csv-page-size {
|
|
510
|
+
display: inline-flex;
|
|
511
|
+
align-items: center;
|
|
512
|
+
gap: 6px;
|
|
513
|
+
margin-left: auto;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
.markdown-body .csv-preview [hidden] {
|
|
517
|
+
display: none !important;
|
|
518
|
+
}
|
|
519
|
+
|
|
463
520
|
/* Source / code files: stay in the editor-adjacent mono pane. */
|
|
464
521
|
.rendered.code-content {
|
|
465
522
|
padding: 24px 32px;
|
|
@@ -656,7 +713,7 @@ body.is-resizing {
|
|
|
656
713
|
top: calc(100% + 6px);
|
|
657
714
|
right: 0;
|
|
658
715
|
z-index: 20;
|
|
659
|
-
min-width:
|
|
716
|
+
min-width: 200px;
|
|
660
717
|
padding: 8px;
|
|
661
718
|
background: var(--bg-side);
|
|
662
719
|
border: 1px solid var(--border);
|
|
@@ -736,6 +793,20 @@ body.is-resizing {
|
|
|
736
793
|
display: block;
|
|
737
794
|
}
|
|
738
795
|
|
|
796
|
+
.settings-page-size {
|
|
797
|
+
justify-content: space-between;
|
|
798
|
+
gap: 12px;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
.settings-page-size select {
|
|
802
|
+
font: inherit;
|
|
803
|
+
color: var(--fg);
|
|
804
|
+
background: var(--bg);
|
|
805
|
+
border: 1px solid var(--border);
|
|
806
|
+
border-radius: 4px;
|
|
807
|
+
padding: 2px 4px;
|
|
808
|
+
}
|
|
809
|
+
|
|
739
810
|
/* Image / video preview */
|
|
740
811
|
.media-wrap {
|
|
741
812
|
display: flex;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Rows-per-page choices for CSV/TSV previews. `0` means show every row. */
|
|
2
|
+
export const CSV_PAGE_SIZES = [25, 50, 100, 250] as const;
|
|
3
|
+
export const CSV_PAGE_SIZE_DEFAULT = 50;
|
|
4
|
+
export const CSV_PAGE_SIZE_ALL = 0;
|
|
5
|
+
|
|
6
|
+
const PAGE_SIZES: readonly number[] = CSV_PAGE_SIZES;
|
|
7
|
+
|
|
8
|
+
/** Smallest selectable page. Tables at or under this stay a single unpaged table. */
|
|
9
|
+
export function csvPageSizeMin(): number {
|
|
10
|
+
return Math.min(...CSV_PAGE_SIZES);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** True when a table is long enough that the pager (and its page-size control) is useful. */
|
|
14
|
+
export function csvPagerVisible(rowCount: number): boolean {
|
|
15
|
+
return rowCount > csvPageSizeMin();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Coerce a stored or selected value to a known page size. Anything else falls back to the default. */
|
|
19
|
+
export function normalizeCsvPageSize(value: unknown): number {
|
|
20
|
+
if (value === CSV_PAGE_SIZE_ALL || value === '0') return CSV_PAGE_SIZE_ALL;
|
|
21
|
+
const n = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN;
|
|
22
|
+
if (PAGE_SIZES.includes(n)) return n;
|
|
23
|
+
return CSV_PAGE_SIZE_DEFAULT;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface CsvPageWindow {
|
|
27
|
+
/** 1-based page, clamped into range. */
|
|
28
|
+
page: number;
|
|
29
|
+
/** Inclusive row index. */
|
|
30
|
+
start: number;
|
|
31
|
+
/** Exclusive row index. */
|
|
32
|
+
end: number;
|
|
33
|
+
pageCount: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Slice a body-row count into one page. `pageSize <= 0` shows every row. */
|
|
37
|
+
export function csvPageWindow(rowCount: number, page: number, pageSize: number): CsvPageWindow {
|
|
38
|
+
if (rowCount <= 0) return { page: 1, start: 0, end: 0, pageCount: 1 };
|
|
39
|
+
const size = pageSize > 0 ? pageSize : rowCount;
|
|
40
|
+
const pageCount = Math.max(1, Math.ceil(rowCount / size));
|
|
41
|
+
const current = Math.min(Math.max(1, Math.floor(page) || 1), pageCount);
|
|
42
|
+
const start = (current - 1) * size;
|
|
43
|
+
return { page: current, start, end: Math.min(start + size, rowCount), pageCount };
|
|
44
|
+
}
|