Centraliza output key

This commit is contained in:
Benjamin Lu
2026-01-29 16:30:35 -08:00
parent 6e5900d2d9
commit 0876efe97c
3 changed files with 45 additions and 16 deletions

View File

@@ -2,15 +2,20 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'
import { ref } from 'vue'
import type { AssetItem } from '@/platform/assets/schemas/assetSchema'
import type * as OutputAssetUtil from '@/platform/assets/utils/outputAssetUtil'
import { useOutputStacks } from '@/platform/assets/composables/useOutputStacks'
const mocks = vi.hoisted(() => ({
resolveOutputAssetItems: vi.fn()
}))
vi.mock('@/platform/assets/utils/outputAssetUtil', () => ({
resolveOutputAssetItems: mocks.resolveOutputAssetItems
}))
vi.mock('@/platform/assets/utils/outputAssetUtil', async (importOriginal) => {
const actual = await importOriginal<typeof OutputAssetUtil>()
return {
...actual,
resolveOutputAssetItems: mocks.resolveOutputAssetItems
}
})
type Deferred<T> = {
promise: Promise<T>

View File

@@ -3,7 +3,10 @@ import type { Ref } from 'vue'
import { getOutputAssetMetadata } from '@/platform/assets/schemas/assetMetadataSchema'
import type { AssetItem } from '@/platform/assets/schemas/assetSchema'
import { resolveOutputAssetItems } from '@/platform/assets/utils/outputAssetUtil'
import {
getOutputKey,
resolveOutputAssetItems
} from '@/platform/assets/utils/outputAssetUtil'
export type OutputStackListItem = {
key: string
@@ -109,9 +112,11 @@ export function useOutputStacks({ assets }: UseOutputStacksOptions) {
}
const excludeOutputKey =
metadata.nodeId && metadata.subfolder
? `${metadata.nodeId}-${metadata.subfolder}-${asset.name}`
: undefined
getOutputKey({
nodeId: metadata.nodeId,
subfolder: metadata.subfolder,
filename: asset.name
}) ?? undefined
try {
return await resolveOutputAssetItems(metadata, {

View File

@@ -20,6 +20,12 @@ type ResolveOutputAssetItemsOptions = {
excludeOutputKey?: string
}
type OutputKeyParts = {
nodeId?: string | number | null
subfolder?: string | null
filename?: string | null
}
function shouldLoadFullOutputs(
outputCount: OutputAssetMetadata['outputCount'],
outputsLength: number
@@ -31,8 +37,16 @@ function shouldLoadFullOutputs(
)
}
function getOutputKey(output: ResultItemImpl): string {
return `${output.nodeId}-${output.subfolder}-${output.filename}`
export function getOutputKey({
nodeId,
subfolder,
filename
}: OutputKeyParts): string | null {
if (!nodeId || !subfolder || !filename) {
return null
}
return `${nodeId}-${subfolder}-${filename}`
}
function mapOutputsToAssetItems({
@@ -45,12 +59,14 @@ function mapOutputsToAssetItems({
}: OutputAssetMapOptions): AssetItem[] {
const createdAtValue = createdAt ?? new Date().toISOString()
return outputs
.filter(
(output) => output.filename && getOutputKey(output) !== excludeOutputKey
)
.map((output) => ({
id: `${promptId}-${getOutputKey(output)}`,
return outputs.reduce<AssetItem[]>((items, output) => {
const outputKey = getOutputKey(output)
if (!output.filename || !outputKey || outputKey === excludeOutputKey) {
return items
}
items.push({
id: `${promptId}-${outputKey}`,
name: output.filename,
size: 0,
created_at: createdAtValue,
@@ -63,7 +79,10 @@ function mapOutputsToAssetItems({
executionTimeInSeconds,
workflow
}
}))
})
return items
}, [])
}
export async function resolveOutputAssetItems(