@joinezco/codeblock 0.0.8 → 0.0.9
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/dist/assets/fs.worker-DfanUHpQ.js +21 -0
- package/dist/assets/{index-MGle_v2x.js → index-BAnLzvMk.js} +1 -1
- package/dist/assets/{index-as7ELo0J.js → index-BBC9WDX6.js} +1 -1
- package/dist/assets/{index-Dx_VuNNd.js → index-BEXYxRro.js} +1 -1
- package/dist/assets/{index-pGm0qkrJ.js → index-BfYmUKH9.js} +1 -1
- package/dist/assets/{index-CXFONXS8.js → index-BhaTNAWE.js} +1 -1
- package/dist/assets/{index-D5Z27j1C.js → index-CCbYDSng.js} +1 -1
- package/dist/assets/{index-Dvu-FFzd.js → index-CIi8tLT6.js} +1 -1
- package/dist/assets/{index-C-QhPFHP.js → index-CaANcgI2.js} +1 -1
- package/dist/assets/index-CkWzFNzm.js +208 -0
- package/dist/assets/{index-N-GE7HTU.js → index-D_XGv9QZ.js} +1 -1
- package/dist/assets/{index-DWOBdRjn.js → index-DkmiPfkD.js} +1 -1
- package/dist/assets/{index-CGx5MZO7.js → index-DmNlLMQ4.js} +1 -1
- package/dist/assets/{index-I0dlv-r3.js → index-DmX_vI7D.js} +1 -1
- package/dist/assets/{index-9HdhmM_Y.js → index-DogEEevD.js} +1 -1
- package/dist/assets/{index-aEsF5o-7.js → index-DsDl5qZV.js} +1 -1
- package/dist/assets/{index-gUUzXNuP.js → index-gAy5mDg-.js} +1 -1
- package/dist/assets/{index-CIuq3uTk.js → index-i5qJLB2h.js} +1 -1
- package/dist/assets/javascript.worker-ClsyHOLi.js +552 -0
- package/dist/e2e/editor.spec.d.ts +1 -0
- package/dist/e2e/editor.spec.js +309 -0
- package/dist/editor.d.ts +9 -3
- package/dist/editor.js +83 -15
- package/dist/index.d.ts +3 -0
- package/dist/index.html +2 -3
- package/dist/index.js +3 -0
- package/dist/lsps/typescript.d.ts +3 -1
- package/dist/lsps/typescript.js +8 -17
- package/dist/panels/footer.d.ts +16 -0
- package/dist/panels/footer.js +258 -0
- package/dist/panels/toolbar.d.ts +15 -2
- package/dist/panels/toolbar.js +528 -115
- package/dist/panels/toolbar.test.js +20 -14
- package/dist/rpc/transport.d.ts +2 -11
- package/dist/rpc/transport.js +19 -35
- package/dist/themes/index.js +181 -14
- package/dist/themes/vscode.js +3 -2
- package/dist/utils/fs.d.ts +15 -3
- package/dist/utils/fs.js +85 -6
- package/dist/utils/lsp.d.ts +26 -15
- package/dist/utils/lsp.js +79 -44
- package/dist/utils/search.d.ts +2 -0
- package/dist/utils/search.js +13 -4
- package/dist/utils/typescript-defaults.d.ts +57 -0
- package/dist/utils/typescript-defaults.js +208 -0
- package/dist/utils/typescript-defaults.test.d.ts +1 -0
- package/dist/utils/typescript-defaults.test.js +197 -0
- package/dist/workers/fs.worker.js +14 -18
- package/dist/workers/javascript.worker.js +11 -9
- package/package.json +4 -3
- package/dist/assets/fs.worker-BwEqZcql.ts +0 -109
- package/dist/assets/index-C3BnE2cG.js +0 -222
- package/dist/assets/javascript.worker-C1zGArKk.js +0 -527
- package/dist/snapshot.bin +0 -0
|
@@ -1,46 +1,43 @@
|
|
|
1
1
|
import * as Comlink from "comlink";
|
|
2
2
|
import { watchOptionsTransferHandler, asyncGeneratorTransferHandler } from '../rpc/serde';
|
|
3
3
|
import { Snapshot } from "../utils";
|
|
4
|
+
import { fs } from '@joinezco/memfs';
|
|
4
5
|
Comlink.transferHandlers.set('asyncGenerator', asyncGeneratorTransferHandler);
|
|
5
6
|
Comlink.transferHandlers.set('watchOptions', watchOptionsTransferHandler);
|
|
6
7
|
let filesystems = [];
|
|
7
8
|
export const mount = async ({ buffer, mountPoint = '/' }) => {
|
|
8
9
|
let filesystem;
|
|
9
10
|
try {
|
|
10
|
-
console.log('Importing memfs after FS mount...');
|
|
11
|
-
const { fs } = await import('@joinezco/memfs');
|
|
12
|
-
console.log("FS imported");
|
|
13
11
|
try {
|
|
14
12
|
if (buffer) {
|
|
15
|
-
console.
|
|
13
|
+
console.debug(`Mounting filesystem snapshot at [${mountPoint}]...`, buffer);
|
|
16
14
|
// Convert Node Buffer to ArrayBuffer if needed
|
|
17
15
|
const uint8 = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
|
|
18
16
|
const aligned = uint8.byteOffset === 0 && uint8.byteLength === uint8.buffer.byteLength
|
|
19
17
|
? uint8.buffer
|
|
20
18
|
: uint8.buffer.slice(uint8.byteOffset, uint8.byteOffset + uint8.byteLength);
|
|
21
|
-
console.log('Aligned ArrayBuffer:', aligned);
|
|
22
19
|
await Snapshot.mount(new Uint8Array(aligned), {
|
|
23
20
|
// @ts-ignore
|
|
24
21
|
fs,
|
|
25
22
|
});
|
|
26
23
|
}
|
|
27
24
|
else {
|
|
28
|
-
console.
|
|
25
|
+
console.debug('Getting storage directory...');
|
|
29
26
|
// const handle = await navigator.storage.getDirectory();
|
|
30
|
-
console.
|
|
31
|
-
console.
|
|
27
|
+
console.debug('Got storage directory');
|
|
28
|
+
console.debug('Attempting to remove directory...');
|
|
32
29
|
try {
|
|
33
30
|
// TODO: clear storage button
|
|
34
31
|
// @ts-ignore
|
|
35
32
|
// await handle.remove({ recursive: true });
|
|
36
|
-
console.
|
|
33
|
+
console.debug('Successfully removed directory');
|
|
37
34
|
}
|
|
38
35
|
catch (removeErr) {
|
|
39
36
|
console.error('Error removing directory:', removeErr);
|
|
40
37
|
// Continue anyway, this might not be critical
|
|
41
38
|
}
|
|
42
39
|
}
|
|
43
|
-
console.
|
|
40
|
+
console.debug('Returning proxy from worker', fs);
|
|
44
41
|
filesystem = Comlink.proxy({ fs });
|
|
45
42
|
filesystems.push(filesystem);
|
|
46
43
|
}
|
|
@@ -50,9 +47,9 @@ export const mount = async ({ buffer, mountPoint = '/' }) => {
|
|
|
50
47
|
}
|
|
51
48
|
}
|
|
52
49
|
catch (e) {
|
|
53
|
-
console.error('Error
|
|
50
|
+
console.error('Error using memfs:', e);
|
|
54
51
|
}
|
|
55
|
-
console.
|
|
52
|
+
console.debug('mounting fs', { buffer, mountPoint });
|
|
56
53
|
return filesystem;
|
|
57
54
|
};
|
|
58
55
|
/**
|
|
@@ -63,8 +60,7 @@ export const mount = async ({ buffer, mountPoint = '/' }) => {
|
|
|
63
60
|
export const mountFromUrl = async ({ url, mountPoint = '/' }) => {
|
|
64
61
|
let filesystem;
|
|
65
62
|
try {
|
|
66
|
-
|
|
67
|
-
console.log(`Loading and mounting filesystem snapshot from URL: ${url} at [${mountPoint}]...`);
|
|
63
|
+
console.debug(`Loading and mounting filesystem snapshot from URL: ${url} at [${mountPoint}]...`);
|
|
68
64
|
const startTime = performance.now();
|
|
69
65
|
await Snapshot.loadAndMount(url, {
|
|
70
66
|
// @ts-ignore
|
|
@@ -72,8 +68,8 @@ export const mountFromUrl = async ({ url, mountPoint = '/' }) => {
|
|
|
72
68
|
path: mountPoint
|
|
73
69
|
});
|
|
74
70
|
const endTime = performance.now();
|
|
75
|
-
console.
|
|
76
|
-
console.
|
|
71
|
+
console.debug(`Snapshot loaded and mounted in ${Math.round(endTime - startTime)}ms`);
|
|
72
|
+
console.debug('Returning proxy from worker', fs);
|
|
77
73
|
filesystem = Comlink.proxy({ fs });
|
|
78
74
|
filesystems.push(filesystem);
|
|
79
75
|
}
|
|
@@ -85,9 +81,9 @@ export const mountFromUrl = async ({ url, mountPoint = '/' }) => {
|
|
|
85
81
|
};
|
|
86
82
|
onconnect = async function (event) {
|
|
87
83
|
const [port] = event.ports;
|
|
88
|
-
console.
|
|
84
|
+
console.debug('workers/fs connected on port: ', port);
|
|
89
85
|
port.addEventListener('close', () => {
|
|
90
|
-
console.
|
|
86
|
+
console.debug('fs port closed');
|
|
91
87
|
});
|
|
92
88
|
Comlink.expose({ mount, mountFromUrl }, port);
|
|
93
89
|
};
|
|
@@ -2,19 +2,21 @@ import * as Comlink from 'comlink';
|
|
|
2
2
|
import { createLanguageServer } from '../lsps/typescript';
|
|
3
3
|
import { createConnection } from 'vscode-languageserver/browser';
|
|
4
4
|
import { BrowserMessageReader, BrowserMessageWriter } from '@volar/language-server/browser';
|
|
5
|
-
// TODO: get rid of this
|
|
6
|
-
// instead, create language specific workers (with a smarter client)
|
|
7
|
-
// i.e typescript.worker.ts / rust.worker.ts / ...
|
|
8
5
|
onconnect = async (event) => {
|
|
9
6
|
const [port] = event.ports;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
// Use a MessageChannel to separate Comlink RPC from LSP protocol.
|
|
8
|
+
// Both Comlink and BrowserMessageReader listen on the same port's
|
|
9
|
+
// 'message' event, so Comlink messages get misinterpreted as LSP messages.
|
|
10
|
+
const { port1: lspPort, port2: clientLspPort } = new MessageChannel();
|
|
11
|
+
lspPort.start();
|
|
12
|
+
const reader = new BrowserMessageReader(lspPort);
|
|
13
|
+
const writer = new BrowserMessageWriter(lspPort);
|
|
13
14
|
const connection = createConnection(reader, writer);
|
|
14
15
|
connection.listen();
|
|
15
|
-
const proxy = async (
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const proxy = async (fsProxy, libFiles) => {
|
|
17
|
+
await createLanguageServer({ fs: fsProxy, connection, libFiles });
|
|
18
|
+
// Return the LSP port for the client to use (separate from Comlink port)
|
|
19
|
+
return Comlink.transfer(clientLspPort, [clientLspPort]);
|
|
18
20
|
};
|
|
19
21
|
Comlink.expose({ createLanguageServer: proxy }, port);
|
|
20
22
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@joinezco/codeblock",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"module": "dist/index.js",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"@types/sharedworker": "^0.0.181",
|
|
27
27
|
"multimatch": "^7.0.0",
|
|
28
28
|
"process": "^0.11.10",
|
|
29
|
+
"puppeteer-core": "^24.37.5",
|
|
29
30
|
"tsx": "^4.19.4",
|
|
30
31
|
"vite": "^7.0.6",
|
|
31
32
|
"vitest": "^3.2.4"
|
|
@@ -58,7 +59,7 @@
|
|
|
58
59
|
"@jsonjoy.com/json-pack": "^1.2.0",
|
|
59
60
|
"@jsonjoy.com/util": "^1.6.0",
|
|
60
61
|
"@lezer/highlight": "^1.2.1",
|
|
61
|
-
"@
|
|
62
|
+
"@m234/nerd-fonts": "^0.5.0",
|
|
62
63
|
"@typescript/vfs": "^1.6.1",
|
|
63
64
|
"@uiw/codemirror-theme-vscode": "^4.23.12",
|
|
64
65
|
"@volar/language-server": "2.4.13",
|
|
@@ -82,8 +83,8 @@
|
|
|
82
83
|
"vscode-languageserver-protocol": "^3.17.5",
|
|
83
84
|
"vscode-languageserver-textdocument": "^1.0.12",
|
|
84
85
|
"vscode-uri": "^3.1.0",
|
|
85
|
-
"@marimo-team/codemirror-languageserver": "1.16.0",
|
|
86
86
|
"@joinezco/jswasi": "0.0.1",
|
|
87
|
+
"@codemirror/lsp-client": "6.2.2",
|
|
87
88
|
"@joinezco/memfs": "4.23.0"
|
|
88
89
|
},
|
|
89
90
|
"scripts": {
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import * as Comlink from "comlink";
|
|
2
|
-
import { watchOptionsTransferHandler, asyncGeneratorTransferHandler } from '../rpc/serde';
|
|
3
|
-
import { MountArgs, MountResult } from "../types";
|
|
4
|
-
import type { SnapshotNode } from '@ezdevlol/memfs/snapshot';
|
|
5
|
-
import type { CborUint8Array } from "@jsonjoy.com/json-pack/lib/cbor/types";
|
|
6
|
-
import { Snapshot } from "../utils";
|
|
7
|
-
|
|
8
|
-
Comlink.transferHandlers.set('asyncGenerator', asyncGeneratorTransferHandler)
|
|
9
|
-
Comlink.transferHandlers.set('watchOptions', watchOptionsTransferHandler)
|
|
10
|
-
|
|
11
|
-
let filesystems = [];
|
|
12
|
-
|
|
13
|
-
export const mount = async ({ buffer, mountPoint = '/' }: MountArgs): Promise<MountResult> => {
|
|
14
|
-
let filesystem;
|
|
15
|
-
|
|
16
|
-
try {
|
|
17
|
-
console.log('Importing memfs after FS mount...');
|
|
18
|
-
const { fs } = await import('@ezdevlol/memfs');
|
|
19
|
-
console.log("FS imported")
|
|
20
|
-
|
|
21
|
-
try {
|
|
22
|
-
if (buffer) {
|
|
23
|
-
console.log(`Mounting filesystem snapshot at [${mountPoint}]...`, buffer);
|
|
24
|
-
// Convert Node Buffer to ArrayBuffer if needed
|
|
25
|
-
const uint8 = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
|
|
26
|
-
const aligned = uint8.byteOffset === 0 && uint8.byteLength === uint8.buffer.byteLength
|
|
27
|
-
? uint8.buffer
|
|
28
|
-
: uint8.buffer.slice(uint8.byteOffset, uint8.byteOffset + uint8.byteLength);
|
|
29
|
-
console.log('Aligned ArrayBuffer:', aligned);
|
|
30
|
-
|
|
31
|
-
await Snapshot.mount(new Uint8Array(aligned) as CborUint8Array<SnapshotNode>, {
|
|
32
|
-
// @ts-ignore
|
|
33
|
-
fs,
|
|
34
|
-
});
|
|
35
|
-
} else {
|
|
36
|
-
console.log('Getting storage directory...');
|
|
37
|
-
// const handle = await navigator.storage.getDirectory();
|
|
38
|
-
console.log('Got storage directory');
|
|
39
|
-
|
|
40
|
-
console.log('Attempting to remove directory...');
|
|
41
|
-
try {
|
|
42
|
-
// TODO: clear storage button
|
|
43
|
-
// @ts-ignore
|
|
44
|
-
// await handle.remove({ recursive: true });
|
|
45
|
-
console.log('Successfully removed directory');
|
|
46
|
-
} catch (removeErr) {
|
|
47
|
-
console.error('Error removing directory:', removeErr);
|
|
48
|
-
// Continue anyway, this might not be critical
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
console.log('Returning proxy from worker', fs);
|
|
52
|
-
filesystem = Comlink.proxy({ fs });
|
|
53
|
-
filesystems.push(filesystem);
|
|
54
|
-
} catch (e) {
|
|
55
|
-
console.error('Worker initialization failed with error:', e);
|
|
56
|
-
throw e; // Make sure error propagates
|
|
57
|
-
}
|
|
58
|
-
} catch (e) {
|
|
59
|
-
console.error('Error importing memfs:', e);
|
|
60
|
-
}
|
|
61
|
-
console.log('mounting fs', { buffer, mountPoint });
|
|
62
|
-
return filesystem;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Optimized mount function that loads snapshots directly from URLs.
|
|
67
|
-
* This is much more efficient for large snapshots as it avoids transferring
|
|
68
|
-
* data through the main thread.
|
|
69
|
-
*/
|
|
70
|
-
export const mountFromUrl = async ({ url, mountPoint = '/' }: {
|
|
71
|
-
url: string;
|
|
72
|
-
mountPoint?: string;
|
|
73
|
-
}): Promise<MountResult> => {
|
|
74
|
-
let filesystem;
|
|
75
|
-
|
|
76
|
-
try {
|
|
77
|
-
const { fs } = await import('@ezdevlol/memfs');
|
|
78
|
-
|
|
79
|
-
console.log(`Loading and mounting filesystem snapshot from URL: ${url} at [${mountPoint}]...`);
|
|
80
|
-
const startTime = performance.now();
|
|
81
|
-
await Snapshot.loadAndMount(url, {
|
|
82
|
-
// @ts-ignore
|
|
83
|
-
fs,
|
|
84
|
-
path: mountPoint
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
const endTime = performance.now();
|
|
88
|
-
console.log(`Snapshot loaded and mounted in ${Math.round(endTime - startTime)}ms`);
|
|
89
|
-
|
|
90
|
-
console.log('Returning proxy from worker', fs);
|
|
91
|
-
filesystem = Comlink.proxy({ fs });
|
|
92
|
-
filesystems.push(filesystem);
|
|
93
|
-
|
|
94
|
-
} catch (e) {
|
|
95
|
-
console.error('Error loading snapshot from URL:', e);
|
|
96
|
-
throw e;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return filesystem;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
onconnect = async function (event) {
|
|
103
|
-
const [port] = event.ports;
|
|
104
|
-
console.log('workers/fs connected on port: ', port);
|
|
105
|
-
port.addEventListener('close', () => {
|
|
106
|
-
console.log('fs port closed')
|
|
107
|
-
});
|
|
108
|
-
Comlink.expose({ mount, mountFromUrl }, port);
|
|
109
|
-
}
|