Spaces:
Paused
Paused
| const { mockApi } = require("./setup"); | |
| const { Ez } = require("./ezgraph"); | |
| const lg = require("./litegraph"); | |
| const fs = require("fs"); | |
| const path = require("path"); | |
| const html = fs.readFileSync(path.resolve(__dirname, "../../web/index.html")) | |
| /** | |
| * | |
| * @param { Parameters<typeof mockApi>[0] & { | |
| * resetEnv?: boolean, | |
| * preSetup?(app): Promise<void>, | |
| * localStorage?: Record<string, string> | |
| * } } config | |
| * @returns | |
| */ | |
| export async function start(config = {}) { | |
| if(config.resetEnv) { | |
| jest.resetModules(); | |
| jest.resetAllMocks(); | |
| lg.setup(global); | |
| localStorage.clear(); | |
| sessionStorage.clear(); | |
| } | |
| Object.assign(localStorage, config.localStorage ?? {}); | |
| document.body.innerHTML = html; | |
| mockApi(config); | |
| const { app } = require("../../web/scripts/app"); | |
| config.preSetup?.(app); | |
| await app.setup(); | |
| return { ...Ez.graph(app, global["LiteGraph"], global["LGraphCanvas"]), app }; | |
| } | |
| /** | |
| * @param { ReturnType<Ez["graph"]>["graph"] } graph | |
| * @param { (hasReloaded: boolean) => (Promise<void> | void) } cb | |
| */ | |
| export async function checkBeforeAndAfterReload(graph, cb) { | |
| await cb(false); | |
| await graph.reload(); | |
| await cb(true); | |
| } | |
| /** | |
| * @param { string } name | |
| * @param { Record<string, string | [string | string[], any]> } input | |
| * @param { (string | string[])[] | Record<string, string | string[]> } output | |
| * @returns { Record<string, import("../../web/types/comfy").ComfyObjectInfo> } | |
| */ | |
| export function makeNodeDef(name, input, output = {}) { | |
| const nodeDef = { | |
| name, | |
| category: "test", | |
| output: [], | |
| output_name: [], | |
| output_is_list: [], | |
| input: { | |
| required: {}, | |
| }, | |
| }; | |
| for (const k in input) { | |
| nodeDef.input.required[k] = typeof input[k] === "string" ? [input[k], {}] : [...input[k]]; | |
| } | |
| if (output instanceof Array) { | |
| output = output.reduce((p, c) => { | |
| p[c] = c; | |
| return p; | |
| }, {}); | |
| } | |
| for (const k in output) { | |
| nodeDef.output.push(output[k]); | |
| nodeDef.output_name.push(k); | |
| nodeDef.output_is_list.push(false); | |
| } | |
| return { [name]: nodeDef }; | |
| } | |
| /** | |
| /** | |
| * @template { any } T | |
| * @param { T } x | |
| * @returns { x is Exclude<T, null | undefined> } | |
| */ | |
| export function assertNotNullOrUndefined(x) { | |
| expect(x).not.toEqual(null); | |
| expect(x).not.toEqual(undefined); | |
| return true; | |
| } | |
| /** | |
| * | |
| * @param { ReturnType<Ez["graph"]>["ez"] } ez | |
| * @param { ReturnType<Ez["graph"]>["graph"] } graph | |
| */ | |
| export function createDefaultWorkflow(ez, graph) { | |
| graph.clear(); | |
| const ckpt = ez.CheckpointLoaderSimple(); | |
| const pos = ez.CLIPTextEncode(ckpt.outputs.CLIP, { text: "positive" }); | |
| const neg = ez.CLIPTextEncode(ckpt.outputs.CLIP, { text: "negative" }); | |
| const empty = ez.EmptyLatentImage(); | |
| const sampler = ez.KSampler( | |
| ckpt.outputs.MODEL, | |
| pos.outputs.CONDITIONING, | |
| neg.outputs.CONDITIONING, | |
| empty.outputs.LATENT | |
| ); | |
| const decode = ez.VAEDecode(sampler.outputs.LATENT, ckpt.outputs.VAE); | |
| const save = ez.SaveImage(decode.outputs.IMAGE); | |
| graph.arrange(); | |
| return { ckpt, pos, neg, empty, sampler, decode, save }; | |
| } | |
| export async function getNodeDefs() { | |
| const { api } = require("../../web/scripts/api"); | |
| return api.getNodeDefs(); | |
| } | |
| export async function getNodeDef(nodeId) { | |
| return (await getNodeDefs())[nodeId]; | |
| } |