Skip to content

Commit 381ccef

Browse files
committed
feat: support connecting multiple buffers and highlighting current node
1 parent 5d894a2 commit 381ccef

File tree

3 files changed

+291
-177
lines changed

3 files changed

+291
-177
lines changed

rollup.config.mjs

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,28 @@
1+
import { defineExternal, definePlugins } from '@gera2ld/plaid-rollup';
12
import { defineConfig } from 'rollup';
2-
import { definePlugins, defineExternal } from '@gera2ld/plaid-rollup';
33
import pkg from './package.json' with { type: 'json' };
44

5-
export default defineConfig({
6-
input: './src/index.ts',
7-
plugins: definePlugins({
8-
esm: true,
9-
}),
10-
external: defineExternal(['coc.nvim', ...Object.keys(pkg.dependencies)]),
11-
output: {
12-
format: 'cjs',
13-
file: 'dist/index.js',
5+
export default defineConfig([
6+
{
7+
input: './src/index.ts',
8+
plugins: definePlugins({
9+
esm: true,
10+
}),
11+
external: defineExternal(['coc.nvim', ...Object.keys(pkg.dependencies)]),
12+
output: {
13+
format: 'cjs',
14+
dir: 'dist',
15+
},
1416
},
15-
});
17+
{
18+
input: './src/bridge.ts',
19+
plugins: definePlugins({
20+
esm: true,
21+
}),
22+
external: defineExternal(['coc.nvim', ...Object.keys(pkg.dependencies)]),
23+
output: {
24+
format: 'es',
25+
dir: 'dist',
26+
},
27+
},
28+
]);

src/bridge.ts

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import { createHash } from 'crypto';
2+
import {
3+
MarkmapDevServer,
4+
config,
5+
createMarkmap,
6+
develop,
7+
fetchAssets,
8+
} from 'markmap-cli';
9+
import open from 'open';
10+
11+
let devServer: MarkmapDevServer | undefined;
12+
13+
type MaybePromise<T> = T | Promise<T>;
14+
15+
const handlers: Record<string, (data: unknown) => MaybePromise<unknown>> = {
16+
initialize(options: { assetsDir: string }) {
17+
config.assetsDir = options.assetsDir;
18+
},
19+
async createMarkmap(options: Record<string, unknown>) {
20+
await fetchAssets();
21+
await createMarkmap({
22+
open: true,
23+
toolbar: true,
24+
offline: false,
25+
...options,
26+
});
27+
},
28+
async startServer(options?: Record<string, unknown>) {
29+
if (!devServer) {
30+
await fetchAssets();
31+
devServer = await develop({
32+
toolbar: true,
33+
offline: true,
34+
...options,
35+
});
36+
}
37+
return (
38+
devServer.serverInfo && {
39+
port: devServer.serverInfo.address.port,
40+
}
41+
);
42+
},
43+
addProvider(filePath: string) {
44+
const key = createHash('sha256')
45+
.update(filePath, 'utf8')
46+
.digest('hex')
47+
.slice(0, 7);
48+
const provider = invariant(devServer).addProvider({ key });
49+
return provider.key;
50+
},
51+
delProvider(key: string) {
52+
invariant(devServer).delProvider(key);
53+
},
54+
setContent(data: { key: string; content: string }) {
55+
const provider = invariant(devServer?.providers[data.key]);
56+
provider.setContent(data.content);
57+
},
58+
setCursor(data: { key: string; line: number }) {
59+
const provider = invariant(devServer?.providers[data.key]);
60+
provider.setCursor(data.line);
61+
},
62+
stopServer() {
63+
if (!devServer) return;
64+
devServer.shutdown();
65+
devServer = undefined;
66+
},
67+
openUrl(url: string) {
68+
open(url);
69+
},
70+
};
71+
72+
process.on(
73+
'message',
74+
async ({ id, cmd, data }: { id: number; cmd: string; data: unknown }) => {
75+
const handler = handlers[cmd];
76+
let result: unknown;
77+
let error: string | undefined;
78+
try {
79+
result = await handler?.(data);
80+
} catch (err) {
81+
error = `${err}`;
82+
}
83+
process.send?.({
84+
id,
85+
cmd: '_setResult',
86+
data: { result, error },
87+
});
88+
},
89+
);
90+
91+
function invariant<T>(input: T | undefined, message?: string): T {
92+
if (!input) throw new Error(message || 'input is required');
93+
return input;
94+
}

0 commit comments

Comments
 (0)