export class CompilerResource {
#inner;
#getWasm;
#client;
constructor(inner, getWasm, client = null) {
this.#inner = inner;
this.#getWasm = getWasm;
this.#client = client;
}
async component({ code, slots = [], supportAllTypes = true }) {
this.#client?.assertNotTerminated();
const wasm = await this.#getWasm();
const builder = this.#inner.createCodeBuilder();
const compiled = builder.compileAccountComponentCode(code);
const component = wasm.AccountComponent.compile(compiled, slots);
return supportAllTypes ? component.withSupportsAllTypes() : component;
}
async txScript({ code, libraries = [] }) {
this.#client?.assertNotTerminated();
await this.#getWasm();
const builder = this.#inner.createCodeBuilder();
linkLibraries(builder, libraries);
return builder.compileTxScript(code);
}
async noteScript({ code, libraries = [] }) {
this.#client?.assertNotTerminated();
await this.#getWasm();
const builder = this.#inner.createCodeBuilder();
linkLibraries(builder, libraries);
return builder.compileNoteScript(code);
}
}
function linkLibraries(builder, libraries) {
for (const lib of libraries) {
if (lib && typeof lib.namespace === "string") {
const built = builder.buildLibrary(lib.namespace, lib.code);
if (lib.linking === "static") {
builder.linkStaticLibrary(built);
} else {
builder.linkDynamicLibrary(built);
}
} else {
builder.linkDynamicLibrary(lib);
}
}
}