clone

a browser-first diagram editor with live svg previews, local drafts and encrypted, accountless sharing

main
diagramzip / renderers / edge / scripts / build / d2.mjs
d2.mjs 2.3K
1import { execFileSync } from 'node:child_process'2import { chmodSync, copyFileSync, cpSync, mkdirSync, renameSync, rmSync } from 'node:fs'3import { relative, resolve } from 'node:path'45const root = resolve(import.meta.dirname, '../..')6const source = resolve(root, 'toolchains/d2/source')7const jsrunnerOverlay = resolve(root, 'toolchains/d2/overlays/jsrunner')8const output = resolve(root, 'artifacts/d2/d2-custom.wasm')9const temporary = resolve(root, 'artifacts/d2/.d2-custom.wasm.tmp')1011const goVersion = execFileSync('go', ['version'], { encoding: 'utf8' }).trim()12if (!goVersion.includes('go1.26.6')) {13 throw new Error(`D2 Wasm build requires Go 1.26.6; found ${goVersion}`)14}1516const d2Module = execFileSync('go', ['list', '-m', '-f', '{{.Dir}}', 'oss.terrastruct.com/d2'], {17 cwd: source,18 encoding: 'utf8',19}).trim()20const staging = resolve(root, 'toolchains/d2/.d2-build')21const stagedModule = resolve(staging, 'd2')22const stagedModfile = resolve(staging, 'worker.mod')23rmSync(staging, { force: true, recursive: true })24mkdirSync(staging, { recursive: true })25cpSync(d2Module, stagedModule, { recursive: true })26chmodSync(resolve(stagedModule, 'lib/jsrunner/js.go'), 0o644)27chmodSync(resolve(stagedModule, 'lib/jsrunner/goja.go'), 0o644)28copyFileSync(resolve(jsrunnerOverlay, 'js.go'), resolve(stagedModule, 'lib/jsrunner/js.go'))29copyFileSync(resolve(jsrunnerOverlay, 'goja.go'), resolve(stagedModule, 'lib/jsrunner/goja.go'))30copyFileSync(resolve(source, 'go.mod'), stagedModfile)31copyFileSync(resolve(source, 'go.sum'), resolve(staging, 'worker.sum'))32execFileSync('go', ['mod', 'edit', `-modfile=${stagedModfile}`, `-replace=oss.terrastruct.com/d2=${relative(source, stagedModule)}`], { cwd: source })3334try {35 execFileSync('go', ['build', `-modfile=${stagedModfile}`, '-trimpath', '-buildvcs=false', '-ldflags=-s -w', '-o', temporary, '.'], {36 cwd: source,37 stdio: 'inherit',38 env: { ...process.env, GOOS: 'js', GOARCH: 'wasm' },39 })40 renameSync(temporary, output)41} finally {42 rmSync(staging, { force: true, recursive: true })43 rmSync(temporary, { force: true })44}4546const goroot = execFileSync('go', ['env', 'GOROOT'], { encoding: 'utf8' }).trim()47copyFileSync(resolve(goroot, 'lib/wasm/wasm_exec.js'), resolve(root, 'artifacts/d2/wasm_exec.js'))48console.log(execFileSync('shasum', ['-a', '256', output], { encoding: 'utf8' }).trim())