Switch to esm, add #export statement to newt, tweaks to LSP

This commit is contained in:
2026-02-21 15:08:15 -08:00
parent c54b856f0b
commit 0a5ad3cc9b
22 changed files with 251 additions and 165 deletions

View File

@@ -1,9 +1,9 @@
#!/bin/sh
mkdir -p public
echo build newt worker
esbuild src/worker.ts --bundle --format=esm > public/worker.js
esbuild src/frame.ts --bundle --format=esm > public/frame.js
esbuild src/worker.ts --bundle --format=esm --platform=browser > public/worker.js
esbuild src/frame.ts --bundle --format=esm --platform=browser > public/frame.js
echo copy newt
cp ../newt.js public
cp ../newt.js src/newt.js
cp -r static/* public
(cd samples && zip -r ../public/files.zip .)

View File

@@ -8,6 +8,9 @@
"build": "tsc && vite build",
"preview": "vite preview"
},
"browser": {
"fs": "./src/fs.ts"
},
"devDependencies": {
"@codemirror/theme-one-dark": "^6.1.2",
"esbuild": "^0.25.0",

View File

@@ -7,6 +7,8 @@ export interface Handle {
buf: Uint8Array;
}
// Some of this was written for Idris and is not used by newt
interface Process {
argv: string[];
platform: string;
@@ -49,6 +51,9 @@ export let shim: NodeShim = {
},
writeSync(fd: number, data: string) {
shim.stdout += data;
},
readSync() {
return 0;
}
},
process: {

View File

@@ -14,15 +14,18 @@ const shim = {
throw new Error(`${fn} not found`);
}
},
writeSync: (fd: number, msg: string) => console.log(msg)
},
};
// we intercept require to return our fake node modules
declare global {
interface Window {
require: (x: string) => any;
fs: any;
}
}
const requireStub: any = (x: string) => (shim as any)[x];
self.fs = shim.fs;
self.require = requireStub;
self.process = {
platform: "linux",

View File

@@ -39,6 +39,12 @@ function mdline2nodes(s: string) {
return cs
}
function bundle(js: string) {
js = js.replace(/^import.*\n/g, '');
js = js.replace(/\nexport /g, '\n');
return js;
}
function md2nodes(md: string) {
let rval: VNode[] = []
let list: VNode[] | undefined
@@ -77,7 +83,7 @@ if (!state.javascript.value) {
// maybe send fileName, src?
await ipc.sendMessage("save", [fileName, src]);
let js = await ipc.sendMessage("compile", [fileName]);
state.javascript.value = js;
state.javascript.value = bundle(js);
}
}
@@ -248,7 +254,7 @@ const language: EditorDelegate = {
});
}
// less flashy version
ipc.sendMessage("compile", [fileName]).then(js => state.javascript.value = js);
ipc.sendMessage("compile", [fileName]).then(js => state.javascript.value = bundle(js));
return diags;
} catch (e) {
console.log("ERR", e);

View File

@@ -1,9 +1,12 @@
import { shim } from "./emul";
import { API, Message, ResponseMSG } from "./ipc";
import { archive, preload } from "./preload";
import { Main_main } from './newt';
const LOG = console.log
console.log = (m) => {
LOG(m)
shim.stdout += "\n" + m;
};
@@ -47,4 +50,3 @@ const handleMessage = async function <K extends keyof API>(ev: { data: Message<K
// hooks for worker.html to override
let sendResponse: <K extends keyof API>(_: ResponseMSG) => void = postMessage;
onmessage = handleMessage;
importScripts("newt.js");