deno2node
Version:
`tsc` replacement for transpiling Deno libraries to run on Node.js.
59 lines (58 loc) • 2 kB
JavaScript
import * as fs from "node:fs/promises";
const shimFile = "// See https://github.com/fromdeno/deno2node#shimming";
const gitignore = "/lib/\n/node_modules/\n/src/vendor/";
const denoJson = '{ "exclude": ["lib/"] }';
async function download(url, target) {
const response = await fetch(url);
await fs.writeFile(target, await response.text(), { flag: "wx" });
}
export async function getVersion() {
const packageUrl = new URL("../package.json", import.meta.url);
const response = await fetch(packageUrl);
const { version } = await response.json();
return version;
}
async function createPackageJson() {
const pkg = {
"type": "module",
"version": "0.0.0",
"exports": "./lib/mod.js",
"typings": "./lib/mod.d.ts",
"files": [
"lib/",
"!lib/**/*.test.*",
"!*/vendor/**/*.ts*",
],
"scripts": {
"fmt": "deno fmt",
"lint": "deno lint",
"test": "deno test",
"prepare": "deno2node",
"postprepare": "node --test lib/",
"clean": "git clean -fXde !node_modules/",
},
"devDependencies": {
"deno2node": `~${await getVersion()}`,
},
};
await fs.writeFile("package.json", JSON.stringify(pkg, null, 2), {
flag: "wx",
});
}
export async function initializeProject() {
const tsconfigUrl = new URL("../tsconfig.json", import.meta.url);
await fs.mkdir("src/");
await Promise.all([
createPackageJson(),
download(tsconfigUrl, "tsconfig.json"),
fs.writeFile("deno.json", denoJson, { flag: "wx" }),
fs.writeFile(".gitignore", gitignore, { flag: "wx" }),
fs.writeFile("src/shim.node.ts", shimFile, { flag: "wx" }),
]);
}
// @ts-ignore not available on Node.js: https://github.com/nodejs/modules/issues/274
if (import.meta.main) {
await initializeProject();
}
import { fetch } from "./shim.node.js";