Declare Python 3.12 support, replace the hidden pip bootstrap with explicit uv sync guidance, and remove prompt() from the Web UI save flow. Add focused contract coverage for the metadata and frontend defaults.
78 lines
1.8 KiB
JavaScript
78 lines
1.8 KiB
JavaScript
import { api } from "../../scripts/api.js";
|
|
import { app } from "../../scripts/app.js";
|
|
|
|
const DEFAULT_SCRIPT_FILENAME = "workflow_api.py";
|
|
const DEFAULT_WORKFLOW_NAME = "workflow_api.json";
|
|
|
|
function $el(tag, options = {}) {
|
|
const element = document.createElement(tag);
|
|
const { parent, style, ...props } = options;
|
|
|
|
if (style) {
|
|
Object.assign(element.style, style);
|
|
}
|
|
|
|
Object.assign(element, props);
|
|
|
|
if (parent) {
|
|
parent.appendChild(element);
|
|
}
|
|
|
|
return element;
|
|
}
|
|
|
|
const extension = {
|
|
name: "Comfy.SaveAsScript",
|
|
commands: [
|
|
{
|
|
id: "triggerSaveAsScript",
|
|
label: "Save As Script",
|
|
function: () => { extension.savePythonScript(); }
|
|
}
|
|
],
|
|
menuCommands: [
|
|
{
|
|
path: ["File"],
|
|
commands: ["triggerSaveAsScript"]
|
|
}
|
|
],
|
|
init() {
|
|
$el("style", {
|
|
parent: document.head,
|
|
});
|
|
},
|
|
savePythonScript() {
|
|
const filename = DEFAULT_SCRIPT_FILENAME;
|
|
|
|
app.graphToPrompt().then(async (p) => {
|
|
const frontendWorkflow = p.workflow ?? app.graph.serialize();
|
|
const json = JSON.stringify({
|
|
name: DEFAULT_WORKFLOW_NAME,
|
|
workflow: JSON.stringify(p.output, null, 2),
|
|
frontend_workflow: JSON.stringify(frontendWorkflow, null, 2),
|
|
}, null, 2); // convert the data to a JSON string
|
|
var response = await api.fetchApi(`/saveasscript`, { method: "POST", body: json });
|
|
if(response.status == 200) {
|
|
const blob = new Blob([await response.text()], {type: "text/python;charset=utf-8"});
|
|
const url = URL.createObjectURL(blob);
|
|
const a = $el("a", {
|
|
href: url,
|
|
download: filename,
|
|
style: {display: "none"},
|
|
parent: document.body,
|
|
});
|
|
a.click();
|
|
setTimeout(function () {
|
|
a.remove();
|
|
window.URL.revokeObjectURL(url);
|
|
}, 0);
|
|
}
|
|
});
|
|
},
|
|
async setup() {
|
|
console.log("SaveAsScript loaded");
|
|
}
|
|
};
|
|
|
|
app.registerExtension(extension);
|