You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.1 KiB
129 lines
3.1 KiB
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]; |
|
} |