const [src, dest] = Deno.args;

const wasm = await Deno.readFile(src);

function encode(bytes) {
  let binary = "";
  for (let i = 0; i < bytes.length; i++) {
    binary += String.fromCharCode(bytes[i]);
  }
  return btoa(binary).replace(/\n/g, "");
}

await Deno.writeFile(
  dest,
  new TextEncoder().encode(
    `/// <reference types="./sqlite.d.ts" />

/* This file is automatically generated. Do not edit directly. */
import env from "./vfs.js";

const wasm =
  "${encode(wasm)}";

function decode(base64) {
  const bytesStr = atob(base64);
  const bytes = new Uint8Array(bytesStr.length);
  for (let i = 0, c = bytesStr.length; i < c; i++) {
    bytes[i] = bytesStr.charCodeAt(i);
  }
  return bytes;
}

const moduleOrInstance = {
  module: null,
  instances: [],
};

export async function compile() {
  moduleOrInstance.module = await WebAssembly.compile(decode(wasm));
}

export async function instantiateBrowser() {
  const placeholder = { exports: null };
  const instance = await WebAssembly.instantiate(moduleOrInstance.module, env(placeholder));
  placeholder.exports = instance.exports;
  instance.exports.seed_rng(Date.now());
  moduleOrInstance.instances.push(instance);
}

export function instantiate() {
  if (moduleOrInstance.instances.length) {
    return moduleOrInstance.instances.pop();
  } else {
    const placeholder = { exports: null };
    const instance = new WebAssembly.Instance(moduleOrInstance.module, env(placeholder));
    placeholder.exports = instance.exports;
    instance.exports.seed_rng(Date.now());
    return instance;
  }
}`,
  ),
);