diff --git a/src/extensions/core/uploadAudio.ts b/src/extensions/core/uploadAudio.ts index 54c90ed0b..94a16d04d 100644 --- a/src/extensions/core/uploadAudio.ts +++ b/src/extensions/core/uploadAudio.ts @@ -5,6 +5,7 @@ import { useNodeDragAndDrop } from '@/composables/node/useNodeDragAndDrop' import { useNodeFileInput } from '@/composables/node/useNodeFileInput' import { useNodePaste } from '@/composables/node/useNodePaste' import { t } from '@/i18n' +import type { ResultItemType } from '@/schemas/apiSchema' import type { ComfyNodeDef } from '@/schemas/nodeDefSchema' import type { DOMWidget } from '@/scripts/domWidget' import { useToastStore } from '@/stores/toastStore' @@ -12,8 +13,6 @@ import { useToastStore } from '@/stores/toastStore' import { api } from '../../scripts/api' import { app } from '../../scripts/app' -type FolderType = 'input' | 'output' | 'temp' - function splitFilePath(path: string): [string, string] { const folder_separator = path.lastIndexOf('/') if (folder_separator === -1) { @@ -28,7 +27,7 @@ function splitFilePath(path: string): [string, string] { function getResourceURL( subfolder: string, filename: string, - type: FolderType = 'input' + type: ResultItemType = 'input' ): string { const params = [ 'filename=' + encodeURIComponent(filename), diff --git a/src/schemas/apiSchema.ts b/src/schemas/apiSchema.ts index a6d8eee27..c93e3e451 100644 --- a/src/schemas/apiSchema.ts +++ b/src/schemas/apiSchema.ts @@ -11,10 +11,13 @@ import { LinkReleaseTriggerAction } from '@/types/searchBoxTypes' const zNodeType = z.string() const zQueueIndex = z.number() const zPromptId = z.string() +export const resultItemType = z.enum(['input', 'output', 'temp']) +export type ResultItemType = z.infer + const zResultItem = z.object({ filename: z.string().optional(), subfolder: z.string().optional(), - type: z.string().optional() + type: resultItemType.optional() }) export type ResultItem = z.infer const zOutputs = z diff --git a/src/schemas/nodeDefSchema.ts b/src/schemas/nodeDefSchema.ts index 928e05845..7e4ce0212 100644 --- a/src/schemas/nodeDefSchema.ts +++ b/src/schemas/nodeDefSchema.ts @@ -1,6 +1,8 @@ import { z } from 'zod' import { fromZodError } from 'zod-validation-error' +import { resultItemType } from '@/schemas/apiSchema' + const zComboOption = z.union([z.string(), z.number()]) const zRemoteWidgetConfig = z.object({ route: z.string().url().or(z.string().startsWith('/')), @@ -72,7 +74,7 @@ export const zStringInputOptions = zBaseInputOptions.extend({ export const zComboInputOptions = zBaseInputOptions.extend({ control_after_generate: z.boolean().optional(), image_upload: z.boolean().optional(), - image_folder: z.enum(['input', 'output', 'temp']).optional(), + image_folder: resultItemType.optional(), allow_batch: z.boolean().optional(), video_upload: z.boolean().optional(), animated_image_upload: z.boolean().optional(), diff --git a/src/stores/imagePreviewStore.ts b/src/stores/imagePreviewStore.ts index 83f5f8bcd..b6d88c9bb 100644 --- a/src/stores/imagePreviewStore.ts +++ b/src/stores/imagePreviewStore.ts @@ -1,7 +1,11 @@ import { LGraphNode } from '@comfyorg/litegraph' import { defineStore } from 'pinia' -import { ExecutedWsMessage, ResultItem } from '@/schemas/apiSchema' +import { + ExecutedWsMessage, + ResultItem, + ResultItemType +} from '@/schemas/apiSchema' import { api } from '@/scripts/api' import { app } from '@/scripts/app' import { parseFilePath } from '@/utils/formatUtil' @@ -9,7 +13,7 @@ import { isVideoNode } from '@/utils/litegraphUtil' const createOutputs = ( filenames: string[], - type: string, + type: ResultItemType, isAnimated: boolean ): ExecutedWsMessage['output'] => { return { @@ -88,7 +92,7 @@ export const useNodeOutputStore = defineStore('nodeOutput', () => { { folder = 'input', isAnimated = false - }: { folder?: string; isAnimated?: boolean } = {} + }: { folder?: ResultItemType; isAnimated?: boolean } = {} ) { if (!filenames || !node) return