Compare commits

...

2 Commits

Author SHA1 Message Date
Austin Mroz
81d91fb995 Fix tests 2026-03-19 17:33:26 -07:00
Austin Mroz
b86592ba38 Unrestrict text outptu display 2026-03-19 14:56:22 -07:00
6 changed files with 21 additions and 58 deletions

View File

@@ -141,6 +141,7 @@ import { computed, defineAsyncComponent, provide, ref, toRef } from 'vue'
import IconGroup from '@/components/button/IconGroup.vue'
import LoadingOverlay from '@/components/common/LoadingOverlay.vue'
import Button from '@/components/ui/button/Button.vue'
import { getOutputAssetMetadata } from '@/platform/assets/schemas/assetMetadataSchema'
import { useAssetsStore } from '@/stores/assetsStore'
import {
formatDuration,
@@ -160,7 +161,8 @@ import type { MediaKind } from '../schemas/mediaAssetSchema'
import { MediaAssetKey } from '../schemas/mediaAssetSchema'
import MediaTitle from './MediaTitle.vue'
type PreviewKind = ReturnType<typeof getMediaTypeFromFilename>
const MEDIA_TYPES = ['video', 'audio', 'image', '3D', 'text', 'other'] as const
type PreviewKind = (typeof MEDIA_TYPES)[number]
const mediaComponents = {
top: {
@@ -221,7 +223,15 @@ const fileKind = computed((): MediaKind => {
return getMediaTypeFromFilename(asset?.name || '')
})
function isValidMediaType(val: string): val is PreviewKind {
return MEDIA_TYPES.includes(val as PreviewKind)
}
const previewKind = computed((): PreviewKind => {
const type = getOutputAssetMetadata(asset?.user_metadata)?.allOutputs?.at(
-1
)?.mediaType
if (type && isValidMediaType(type)) return type
return getMediaTypeFromFilename(asset?.name || '')
})

View File

@@ -108,18 +108,6 @@ describe(flattenNodeOutput, () => {
expect(result[0].mediaType).toBe('images')
})
it('excludes non-ResultItem array items', () => {
const output = {
images: [{ filename: 'img.png', subfolder: '', type: 'output' }],
custom_data: [{ randomKey: 123 }]
} as unknown as NodeExecutionOutput
const result = flattenNodeOutput(['1', output])
expect(result).toHaveLength(1)
expect(result[0].mediaType).toBe('images')
})
it('accepts items with filename but no subfolder', () => {
const output = {
images: [
@@ -135,18 +123,4 @@ describe(flattenNodeOutput, () => {
expect(result[1].filename).toBe('no-subfolder.png')
expect(result[1].subfolder).toBe('')
})
it('excludes items missing filename', () => {
const output = {
images: [
{ filename: 'valid.png', subfolder: '', type: 'output' },
{ subfolder: '', type: 'output' }
]
} as unknown as NodeExecutionOutput
const result = flattenNodeOutput(['1', output])
expect(result).toHaveLength(1)
expect(result[0].filename).toBe('valid.png')
})
})

View File

@@ -79,7 +79,9 @@ export async function getOutputsForTask(
function getPreviewableOutputs(outputs?: TaskOutput): ResultItemImpl[] {
if (!outputs) return []
return ResultItemImpl.filterPreviewable(parseTaskOutput(outputs))
return ResultItemImpl.filterPreviewable(parseTaskOutput(outputs)).filter(
(i) => i.filename
)
}
export function getPreviewableOutputsFromJobDetail(

View File

@@ -189,7 +189,7 @@ describe('TaskItemImpl', () => {
})
})
it.skip('should parse text outputs', () => {
it('should parse text outputs', () => {
const job: JobListItem = {
...createHistoryJob(0, 'text-job'),
preview_output: {

View File

@@ -107,18 +107,6 @@ describe(parseNodeOutput, () => {
expect(result[0].mediaType).toBe('images')
})
it('excludes non-ResultItem array items', () => {
const output = {
images: [{ filename: 'img.png', subfolder: '', type: 'output' }],
custom_data: [{ randomKey: 123 }]
} as unknown as NodeExecutionOutput
const result = parseNodeOutput('1', output)
expect(result).toHaveLength(1)
expect(result[0].mediaType).toBe('images')
})
it('accepts items with filename but no subfolder', () => {
const output = {
images: [
@@ -134,20 +122,6 @@ describe(parseNodeOutput, () => {
expect(result[1].filename).toBe('no-subfolder.png')
expect(result[1].subfolder).toBe('')
})
it('excludes items missing filename', () => {
const output = {
images: [
{ filename: 'valid.png', subfolder: '', type: 'output' },
{ subfolder: '', type: 'output' }
]
} as unknown as NodeExecutionOutput
const result = parseNodeOutput('1', output)
expect(result).toHaveLength(1)
expect(result[0].filename).toBe('valid.png')
})
})
describe(parseTaskOutput, () => {

View File

@@ -2,7 +2,7 @@ import type { NodeExecutionOutput, ResultItem } from '@/schemas/apiSchema'
import { resultItemType } from '@/schemas/apiSchema'
import { ResultItemImpl } from '@/stores/queueStore'
const METADATA_KEYS = new Set(['animated', 'text'])
const METADATA_KEYS = new Set(['animated'])
/**
* Validates that an unknown value is a well-formed ResultItem.
@@ -15,8 +15,6 @@ function isResultItem(item: unknown): item is ResultItem {
const candidate = item as Record<string, unknown>
if (typeof candidate.filename !== 'string') return false
if (
candidate.type !== undefined &&
!resultItemType.safeParse(candidate.type).success
@@ -35,6 +33,11 @@ export function parseNodeOutput(
.filter(([key, value]) => !METADATA_KEYS.has(key) && Array.isArray(value))
.flatMap(([mediaType, items]) =>
(items as unknown[])
.map((item) =>
mediaType === 'text' && typeof item === 'string'
? { nodeId, mediaType, content: item }
: item
)
.filter(isResultItem)
.map((item) => new ResultItemImpl({ ...item, mediaType, nodeId }))
)