Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/core/graph/subgraph/proxyWidget.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ function setupSubgraph(
const subgraph = createTestSubgraph()
const subgraphNode = createTestSubgraphNode(subgraph)
subgraphNode._internalConfigureAfterSlots()
const graph = subgraphNode.graph
const graph = subgraphNode.graph!
graph.add(subgraphNode)
const innerNodes = []
for (let i = 0; i < innerNodeCount; i++) {
Expand Down
4 changes: 4 additions & 0 deletions src/lib/litegraph/src/subgraph/ExecutableNodeDTO.ts
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,10 @@ export class ExecutableNodeDTO implements ExecutableLGraphNode {
}
}

if (!subgraphNode.graph)
throw new NullGraphError(
`SubgraphNode ${subgraphNode.id} has no graph during input resolution`
)
const outerLink = subgraphNode.graph.getLink(linkId)
if (!outerLink)
throw new InvalidLinkError(
Expand Down
10 changes: 5 additions & 5 deletions src/lib/litegraph/src/subgraph/SubgraphConversion.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ describe.skip('SubgraphConversion', () => {
it('Should keep interior nodes and links', () => {
const subgraph = createTestSubgraph()
const subgraphNode = createTestSubgraphNode(subgraph)
const graph = subgraphNode.graph
const graph = subgraphNode.graph!
graph.add(subgraphNode)

const node1 = createNode(subgraph, [], ['number'])
Expand All @@ -63,7 +63,7 @@ describe.skip('SubgraphConversion', () => {
outputs: [{ name: 'value', type: 'number' }]
})
const subgraphNode = createTestSubgraphNode(subgraph)
const graph = subgraphNode.graph
const graph = subgraphNode.graph!
graph.add(subgraphNode)

const innerNode1 = createNode(subgraph, [], ['number'])
Expand All @@ -86,7 +86,7 @@ describe.skip('SubgraphConversion', () => {
outputs: [{ name: 'value', type: 'number' }]
})
const subgraphNode = createTestSubgraphNode(subgraph)
const graph = subgraphNode.graph
const graph = subgraphNode.graph!
graph.add(subgraphNode)

const inner = createNode(subgraph, [], ['number'])
Expand Down Expand Up @@ -117,7 +117,7 @@ describe.skip('SubgraphConversion', () => {
]
})
const subgraphNode = createTestSubgraphNode(subgraph)
const graph = subgraphNode.graph
const graph = subgraphNode.graph!
graph.add(subgraphNode)

const inner = createNode(subgraph, [], ['number', 'number'])
Expand Down Expand Up @@ -159,7 +159,7 @@ describe.skip('SubgraphConversion', () => {
]
})
const subgraphNode = createTestSubgraphNode(subgraph)
const graph = subgraphNode.graph
const graph = subgraphNode.graph!
graph.add(subgraphNode)

const inner1 = createNode(subgraph, ['number', 'number'])
Expand Down
14 changes: 13 additions & 1 deletion src/lib/litegraph/src/subgraph/SubgraphNode.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,23 @@ describe.skip('SubgraphNode Construction', () => {
it('should maintain reference to root graph', () => {
const subgraph = createTestSubgraph()
const subgraphNode = createTestSubgraphNode(subgraph)
const parentGraph = subgraphNode.graph
const parentGraph = subgraphNode.graph!

expect(subgraphNode.rootGraph).toBe(parentGraph.rootGraph)
})

it('should throw NullGraphError when accessing rootGraph after removal', () => {
const subgraph = createTestSubgraph()
const subgraphNode = createTestSubgraphNode(subgraph)
const parentGraph = subgraphNode.graph!
parentGraph.add(subgraphNode)

parentGraph.remove(subgraphNode)

expect(() => subgraphNode.rootGraph).toThrow()
expect(subgraphNode.graph).toBeNull()
})

subgraphTest(
'should synchronize slots with subgraph definition',
({ subgraphWithNode }) => {
Expand Down
9 changes: 7 additions & 2 deletions src/lib/litegraph/src/subgraph/SubgraphNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { LGraphNode } from '@/lib/litegraph/src/LGraphNode'
import type { DrawTitleBoxOptions } from '@/lib/litegraph/src/LGraphNode'
import { LLink } from '@/lib/litegraph/src/LLink'
import type { ResolvedConnection } from '@/lib/litegraph/src/LLink'
import { NullGraphError } from '@/lib/litegraph/src/infrastructure/NullGraphError'
import { RecursionError } from '@/lib/litegraph/src/infrastructure/RecursionError'
import type {
ISubgraphInput,
Expand Down Expand Up @@ -47,8 +48,11 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph {

override readonly type: UUID
override readonly isVirtualNode = true as const
override graph: GraphOrSubgraph | null

get rootGraph(): LGraph {
if (!this.graph)
throw new NullGraphError(`SubgraphNode ${this.id} has no graph`)
return this.graph.rootGraph
}

Expand All @@ -67,12 +71,13 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph {

constructor(
/** The (sub)graph that contains this subgraph instance. */
override readonly graph: GraphOrSubgraph,
graph: GraphOrSubgraph,
/** The definition of this subgraph; how its nodes are configured, etc. */
readonly subgraph: Subgraph,
instanceData: ExportedSubgraphInstance
) {
super(subgraph.name, subgraph.id)
this.graph = graph

// Update this node when the subgraph input / output slots are changed
const subgraphEvents = this.subgraph.events
Expand Down Expand Up @@ -496,7 +501,7 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph {
const subgraphInstanceIdPath = [...subgraphNodePath, this.id]

// Store the subgraph node DTO
const parentSubgraphNode = this.graph.rootGraph
const parentSubgraphNode = this.rootGraph
.resolveSubgraphIdPath(subgraphNodePath)
.at(-1)
const subgraphNodeDto = new ExecutableNodeDTO(
Expand Down
7 changes: 4 additions & 3 deletions src/stores/imagePreviewStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -298,9 +298,10 @@ export const useNodeOutputStore = defineStore('nodeOutput', () => {
* Does not recurse to contents of nested subgraphs.
*/
function revokeSubgraphPreviews(subgraphNode: SubgraphNode) {
const graphId = subgraphNode.graph.isRootGraph
? ''
: subgraphNode.graph.id + ':'
const { graph } = subgraphNode
if (!graph) return

const graphId = graph.isRootGraph ? '' : graph.id + ':'
revokePreviewsByLocatorId(graphId + subgraphNode.id)
for (const node of subgraphNode.subgraph.nodes) {
revokePreviewsByLocatorId(subgraphNode.subgraph.id + node.id)
Expand Down
2 changes: 1 addition & 1 deletion src/stores/subgraphStore.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ describe('useSubgraphStore', () => {
//mock canvas to provide a minimal subgraphNode
const subgraph = createTestSubgraph()
const subgraphNode = createTestSubgraphNode(subgraph)
const graph = subgraphNode.graph
const graph = subgraphNode.graph!
graph.add(subgraphNode)
vi.mocked(comfyApp.canvas).selectedItems = new Set([subgraphNode])
vi.mocked(comfyApp.canvas)._serializeItems = vi.fn(() => {
Expand Down