cpython/Tools/wasm/emscripten/node_entry.mjs

import EmscriptenModule from "./python.mjs";
import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url';

if (process?.versions?.node) {
  const nodeVersion = Number(process.versions.node.split(".", 1)[0]);
  if (nodeVersion < 18) {
      process.stderr.write(
          `Node version must be >= 18, got version ${process.version}\n`,
      );
      process.exit(1);
  }
}

const settings = {
  preRun(Module) {
    const __dirname = dirname(fileURLToPath(import.meta.url));
    Module.FS.mkdirTree("/lib/");
    Module.FS.mount(Module.FS.filesystems.NODEFS, { root: __dirname + "/lib/" }, "/lib/");
  },
  // The first three arguments are: "node", path to this file, path to
  // python.sh. After that come the arguments the user passed to python.sh.
  arguments: process.argv.slice(3),
  // Ensure that sys.executable, sys._base_executable, etc point to python.sh
  // not to this file. To properly handle symlinks, python.sh needs to compute
  // its own path.
  thisProgram: process.argv[2],
};

await EmscriptenModule(settings);