diff --git a/js/h3_prompt_curator/index.js b/js/h3_prompt_curator/index.js new file mode 100644 index 0000000..f417fae --- /dev/null +++ b/js/h3_prompt_curator/index.js @@ -0,0 +1,76 @@ +import { app } from "/scripts/app.js"; + +const NODE_NAME = "DumasH3PromptCurator"; +const EXPECTED_OUTPUTS = [ + "prompt", + "ref_image_1", + "ref_image_2", + "ref_image_3", + "ref_image_4", + "ref_image_5", + "ref_image_6", + "ref_image_7", + "ref_image_8", + "ref_image_9", + "reference_count", + "debug", + "anchor", + "sounds", + "bgm", + "original_ref_1", + "original_ref_2", + "original_ref_3", + "original_ref_4", + "original_ref_5", + "original_ref_6", + "original_ref_7", + "original_ref_8", + "original_ref_9", +]; +const EXPECTED_NAMES = new Set(EXPECTED_OUTPUTS); + +function pruneStaleOutputs(node) { + if (!Array.isArray(node.outputs)) return; + + const byName = new Map(); + for (const output of node.outputs) { + if (!output?.name || !EXPECTED_NAMES.has(output.name) || byName.has(output.name)) continue; + byName.set(output.name, output); + } + + const nextOutputs = []; + for (const name of EXPECTED_OUTPUTS) { + const existing = byName.get(name); + if (existing) { + nextOutputs.push(existing); + } + } + + if (nextOutputs.length && nextOutputs.length !== node.outputs.length) { + node.outputs = nextOutputs; + node.size = node.computeSize?.() || node.size; + node.setDirtyCanvas?.(true, true); + } +} + +app.registerExtension({ + name: "Dumas.H3PromptCuratorOutputs", + async beforeRegisterNodeDef(nodeType, nodeData) { + if (nodeData?.name !== NODE_NAME) return; + + const originalOnNodeCreated = nodeType.prototype.onNodeCreated; + const originalOnConfigure = nodeType.prototype.onConfigure; + + nodeType.prototype.onNodeCreated = function onNodeCreated() { + const created = originalOnNodeCreated?.apply(this, arguments); + pruneStaleOutputs(this); + return created; + }; + + nodeType.prototype.onConfigure = function onConfigure() { + const configured = originalOnConfigure?.apply(this, arguments); + pruneStaleOutputs(this); + return configured; + }; + }, +});