tscircuit/ti

ti tscircuit library

Version
1.0.198
License
unset
Stars
0

system-block-ui/src/rendering/export-tscircuit-tsx.ts

import { strToU8, zipSync } from "fflate";
import {
  getGeneratedSystemSourceFiles,
  type GeneratedSystemSourceArtifacts,
} from "./generated-source-files";
import {
  copyBytesToArrayBuffer,
  getSafeProjectExportName,
  type ProjectZipOptions,
} from "./project-zip-options";

const ZIP_MIME_TYPE = "application/zip";
const DETERMINISTIC_ZIP_MTIME = new Date(1980, 0, 1, 0, 0, 0);

export type TscircuitTsxZipOptions = ProjectZipOptions;

export const getTscircuitTsxZipFileName = (
  options: TscircuitTsxZipOptions = {},
): string => `${getSafeProjectExportName(options)}.tscircuit-tsx.zip`;

/** Package every generated source file required to evaluate the design. */
export const createTscircuitTsxZipBlob = (
  artifacts: GeneratedSystemSourceArtifacts,
): Blob => {
  const files: Record<string, Uint8Array> = {};
  for (const { fileName, source } of getGeneratedSystemSourceFiles(artifacts)) {
    files[fileName] = strToU8(source);
  }

  const zipBytes = zipSync(files, {
    level: 6,
    mtime: DETERMINISTIC_ZIP_MTIME,
  });
  return new Blob([copyBytesToArrayBuffer(zipBytes)], { type: ZIP_MIME_TYPE });
};