loro/crates/loro-wasm/scripts/build.ts
Zixuan Chen 9047065843
Fix undo with checkout (#375)
* fix: should transform checkout event

* chore: update fuzz dep

* chore: add pos to error info

* fix: clear undo/redo stack when checkingout

* test: update fuzz dep

* test: a new failed test case

* fix: tree transform

* chore: fuzz

* chore: add log

* chore: add more logs

* fix: compose err

* chore: fuzz test dep

* test: a failed tree case

* fix: undo tree event

* fix: do not compare tree position in fuzz

* fix: fuzz rev

* test: a failed tree case

* fix: add tree compose

* chore: add comment

* chore: fuzz

* fix: test

* fix: tree transform

* fix: tree transform index

* fix: sort tree index

* chore: fuzz

* fix: undo/redo remote change effect compose

* bk

* fix: tree undo redo (#385)

* fix: event hint none

* chore: fuzz version

* ci: fuzz

* bk: weird err

* fix: type err

* fix: fractional index between

* fix: wasm counter feature

* test: a new failed case

* fix: recursively create child nodes

* fix: filter empty event

* bk

* bk

* fix: tree undo redo remap

* chore: clean

* bk

* fix: tree need remap first

* fix: tree undo effect

* fix: tree diff calc

* fix: tree fuzz check eq func

* fix: remove EventHint None

* chore: cargo fix

* fix: tree uncreate

* fix: fuzz tree assert only structure

* refactor: rename methods

* fix: movable tree apply delta

* fix: another movable list issue

* chore: fuzz only check 1 actor's history

---------

Co-authored-by: Leon Zhao <leeeon233@gmail.com>
2024-07-04 18:15:44 +08:00

111 lines
3 KiB
TypeScript

import * as path from "https://deno.land/std@0.105.0/path/mod.ts";
const __dirname = path.dirname(path.fromFileUrl(import.meta.url));
// deno run -A build.ts debug
// deno run -A build.ts release
// deno run -A build.ts release web
// deno run -A build.ts release nodejs
let profile = "dev";
let profileDir = "debug";
if (Deno.args[0] == "release") {
profile = "release";
profileDir = "release";
}
const TARGETS = ["bundler", "nodejs"];
const startTime = performance.now();
const LoroWasmDir = path.resolve(__dirname, "..");
console.log(LoroWasmDir);
async function build() {
await cargoBuild();
const target = Deno.args[1];
if (target != null) {
if (!TARGETS.includes(target)) {
throw new Error(`Invalid target ${target}`);
}
buildTarget(target);
return;
}
await Promise.all(
TARGETS.map((target) => {
return buildTarget(target);
}),
);
if (profile !== "dev") {
await Promise.all(
TARGETS.map(async (target) => {
// --snip-rust-panicking-code --snip-rust-fmt-code
// const snip = `wasm-snip ./${target}/loro_wasm_bg.wasm -o ./${target}/loro_wasm_bg.wasm`;
// console.log(">", snip);
// await Deno.run({ cmd: snip.split(" "), cwd: LoroWasmDir }).status();
const cmd =
`wasm-opt -Os ./${target}/loro_wasm_bg.wasm -o ./${target}/loro_wasm_bg.wasm`;
console.log(">", cmd);
await Deno.run({ cmd: cmd.split(" "), cwd: LoroWasmDir }).status();
}),
);
}
console.log(
"✅",
"Build complete in",
(performance.now() - startTime) / 1000,
"s",
);
}
async function cargoBuild() {
const cmd =
`cargo build --target wasm32-unknown-unknown --profile ${profile}`;
console.log(cmd);
const status = await Deno.run({
cmd: cmd.split(" "),
cwd: LoroWasmDir,
}).status();
if (!status.success) {
console.log(
"❌",
"Build failed in",
(performance.now() - startTime) / 1000,
"s",
);
Deno.exit(status.code);
}
}
async function buildTarget(target: string) {
console.log("🏗️ Building target", `[${target}]`);
const targetDirPath = path.resolve(LoroWasmDir, target);
try {
await Deno.remove(targetDirPath, { recursive: true });
console.log("Clear directory " + targetDirPath);
} catch (_e) {
//
}
// TODO: polyfill FinalizationRegistry
const cmd =
`wasm-bindgen --weak-refs --target ${target} --out-dir ${target} ../../target/wasm32-unknown-unknown/${profileDir}/loro_wasm.wasm`;
console.log(">", cmd);
await Deno.run({ cmd: cmd.split(" "), cwd: LoroWasmDir }).status();
console.log();
if (target === "nodejs") {
console.log("🔨 Patching nodejs target");
const patch = await Deno.readTextFile(
path.resolve(__dirname, "./nodejs_patch.js"),
);
const wasm = await Deno.readTextFile(
path.resolve(targetDirPath, "loro_wasm.js"),
);
await Deno.writeTextFile(
path.resolve(targetDirPath, "loro_wasm.js"),
wasm + "\n" + patch,
);
}
}
build();