tutanota/buildSrc/DevBuild.js

140 lines
3.8 KiB
JavaScript
Raw Normal View History

import path from "path"
import fs from "fs-extra"
2022-05-02 17:17:33 +02:00
import {prepareAssets} from "./Builder.js"
import {build} from "esbuild"
import {getTutanotaAppVersion} from "./buildUtils.js"
import {$} from "zx"
import {keytarNativePlugin, sqliteNativePlugin} from "./nativeLibraryEsbuildPlugin.js"
import * as env from "./env.js"
import {dependencyMap} from "./RollupConfig.js"
import {esbuildPluginAliasPath} from "esbuild-plugin-alias-path"
2022-05-09 18:41:10 +02:00
import {runStep} from "./runStep.js"
2022-05-02 17:17:33 +02:00
export async function runDevBuild({stage, host, desktop, clean, watch}) {
if (clean) {
2022-05-02 17:17:33 +02:00
await runStep("Clean", async () => {
await fs.emptyDir("build")
})
}
2022-05-02 17:17:33 +02:00
await runStep("Packages", async () => {
await $`npm run build-runtime-packages`
})
2022-05-02 17:17:33 +02:00
const version = getTutanotaAppVersion()
2022-05-02 17:17:33 +02:00
await runStep("Types", async () => {
await $`npx tsc --incremental true --noEmit true`
})
2022-05-02 17:17:33 +02:00
const mode = desktop ? "Desktop" : "Browser"
await buildWebPart({stage, host, version, mode})
2022-05-02 17:17:33 +02:00
if (desktop) {
await buildDesktopPart({version})
}
2022-05-02 17:17:33 +02:00
}
async function buildWebPart({stage, host, version}) {
await runStep("Web: Assets", async () => {
await prepareAssets(stage, host, version)
await fs.promises.writeFile("build/worker-bootstrap.js", `importScripts("./polyfill.js")
importScripts("./api/worker/worker.js")
`)
})
await runStep("Web: Esbuild", async () => {
await build({
entryPoints: ["src/app.ts", "src/api/worker/worker.ts"],
outdir: "./build/",
bundle: true,
format: 'esm',
sourcemap: "linked",
define: {
// See Env.ts for explanation
"NO_THREAD_ASSERTIONS": 'true',
},
plugins: [
libDeps(),
],
})
})
}
async function buildDesktopPart({version}) {
await runStep("Desktop: Esbuild", async () => {
await build({
entryPoints: ["src/desktop/DesktopMain.ts"],
outdir: "./build/desktop",
bundle: true,
format: 'cjs',
sourcemap: "linked",
platform: "node",
external: ["electron"],
plugins: [
libDeps(),
sqliteNativePlugin({
environment: "electron",
dstPath: "./build/desktop/better_sqlite3.node",
platform: process.platform,
nativeBindingPath: "./better_sqlite3.node",
}),
keytarNativePlugin({
environment: "electron",
dstPath: "./build/desktop/keytar.node",
nativeBindingPath: './keytar.node',
platform: process.platform,
}),
preludeEnvPlugin(env.create({staticUrl: null, version, mode: "Desktop", dist: false}))
],
})
})
2022-05-02 17:17:33 +02:00
await runStep("Desktop: assets", async () => {
const desktopIconsPath = "./resources/desktop-icons"
await fs.copy(desktopIconsPath, "./build/desktop/resources/icons", {overwrite: true})
const packageJSON = (await import('./electron-package-json-template.js')).default({
nameSuffix: "-debug",
version,
updateUrl: "http://localhost:9000/client/build",
iconPath: path.join(desktopIconsPath, "logo-solo-red.png"),
sign: false
})
const content = JSON.stringify(packageJSON, null, 2)
await fs.createFile("./build/package.json")
await fs.writeFile("./build/package.json", content, 'utf-8')
await fs.mkdir("build/desktop", {recursive: true})
await fs.copyFile("src/desktop/preload.js", "build/desktop/preload.js")
await fs.copyFile("src/desktop/preload-webdialog.js", "build/desktop/preload-webdialog.js")
})
}
2022-05-09 18:41:10 +02:00
export function libDeps(prefix = ".") {
2022-05-02 17:17:33 +02:00
const absoluteDependencyMap = Object.fromEntries(
Object.entries(dependencyMap)
.map(
(([k, v]) => {
2022-05-09 18:41:10 +02:00
return [k, path.resolve(prefix, v)]
2022-05-02 17:17:33 +02:00
})
)
)
return esbuildPluginAliasPath({
alias: absoluteDependencyMap,
})
}
export function preludeEnvPlugin(env) {
return {
name: "prelude-env",
setup(build) {
const options = build.initialOptions
options.banner = options.banner ?? {}
const bannerStart = options.banner["js"] ? options.banner["js"] + "\n" : ""
options.banner["js"] = bannerStart + `globalThis.env = ${JSON.stringify(env, null, 2)};`
},
}
2022-05-09 18:41:10 +02:00
}