2021-11-05 17:11:35 +01:00
|
|
|
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"
|
2021-11-05 17:11:35 +01:00
|
|
|
|
2022-05-02 17:17:33 +02:00
|
|
|
export async function runDevBuild({stage, host, desktop, clean, watch}) {
|
2021-11-05 17:11:35 +01:00
|
|
|
if (clean) {
|
2022-05-02 17:17:33 +02:00
|
|
|
await runStep("Clean", async () => {
|
|
|
|
|
await fs.emptyDir("build")
|
|
|
|
|
})
|
2021-11-05 17:11:35 +01:00
|
|
|
}
|
|
|
|
|
|
2022-05-02 17:17:33 +02:00
|
|
|
await runStep("Packages", async () => {
|
|
|
|
|
await $`npm run build-runtime-packages`
|
|
|
|
|
})
|
2022-02-14 10:19:20 +01:00
|
|
|
|
2022-05-02 17:17:33 +02:00
|
|
|
const version = getTutanotaAppVersion()
|
2022-02-18 09:12:05 +01:00
|
|
|
|
2022-05-02 17:17:33 +02:00
|
|
|
await runStep("Types", async () => {
|
|
|
|
|
await $`npx tsc --incremental true --noEmit true`
|
|
|
|
|
})
|
2021-11-10 13:35:54 +01:00
|
|
|
|
2021-11-05 17:11:35 +01:00
|
|
|
|
2022-05-02 17:17:33 +02:00
|
|
|
const mode = desktop ? "Desktop" : "Browser"
|
|
|
|
|
await buildWebPart({stage, host, version, mode})
|
2022-01-07 15:58:30 +01:00
|
|
|
|
2022-05-02 17:17:33 +02:00
|
|
|
if (desktop) {
|
|
|
|
|
await buildDesktopPart({version})
|
2021-11-05 17:11:35 +01:00
|
|
|
}
|
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}))
|
|
|
|
|
],
|
|
|
|
|
})
|
|
|
|
|
})
|
2021-11-05 17:11:35 +01:00
|
|
|
|
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-01-12 14:43:01 +01:00
|
|
|
}
|
2022-05-09 18:41:10 +02:00
|
|
|
}
|