deft 1.0.0

Cross platform ui framework
const fs = require("node:fs");
const {spawnSync} = require("node:child_process");
function item(dir, name, namespace = "") {
    return {
        src: `${dir}/${name}.js`,
        namespace,
    }
}
const list = [
    item("src/js", "core", "deft:core"),
    item("src/js", "ui", "deft:ui"),
    item("src/js", "menu", "deft:menu"),
    item("src/ext", "system-tray", "deft:systemtray"),
    item("src/ext", "process", "deft:process"),
    item("src/ext", "audio", "deft:audio"),
    item("src/ext", "clipboard", "deft:clipboard"),
    item("src/ext", "dialog", "deft:dialog"),
    item("src/ext", "sqlite", "deft:sqlite"),
    item("src/ext", "fetch")
]

const paths = Object.create(null);
for (const it of list) {
    if (it.namespace) {
        paths[it.namespace] = [it.src];
    }
}
const files = list.map(it => it.src);

const config = {
    "compilerOptions": {
        "target": "esnext",
        "lib": ["esnext"],
        "declaration": true,
        "allowJs": true,
        "emitDeclarationOnly": true,
        "outDir": "target/deft-dts",
        "baseUrl": ".",
        paths,
    },
    files,
};

fs.rmSync("target/deft-dts", {recursive: true, force: true});
fs.writeFileSync("tsconfig.dts.json", JSON.stringify(config), {encoding: "utf-8"});
spawnSync(`npx`, ["-p", "typescript@5", "tsc", "-p", "tsconfig.dts.json"], {
    stdio: "inherit",
});

function outputPath(src) {
    return `target/deft-dts/${src.replace(/^src\//, "").replace(/\.js$/, ".d.ts")}`;
}

for (const it of list) {
    const file = outputPath(it.src);
    let content = fs.readFileSync(file, {encoding: "utf-8"});
    if (it.namespace) {
        content = content.replace(/export declare /g, "export ").replace(/#private;/g, "");
        content = `declare module '${it.namespace}' {\n${content}}\n`;
    } else {
        content = content.replace(/export /g, "declare ").replace(/#private;/g, "").replace(/declare {};/g, "");
    }
    fs.writeFileSync(file, content, {encoding: "utf-8"});
}

const parts = list.map(it => outputPath(it.src));
fs.writeFileSync(
    "js/deft.d.ts",
    [
        fs.readFileSync("env.d.ts", "utf-8"),
        ...parts.map(f => fs.readFileSync(f, "utf-8"))
    ].join("\n"), {encoding: "utf-8"}
);