diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetChart.test.ts b/src/renderer/extensions/vueNodes/widgets/components/WidgetChart.test.ts index 61d07d6cde..1006d4806f 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/WidgetChart.test.ts +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetChart.test.ts @@ -5,14 +5,14 @@ import { defineComponent, nextTick, ref } from 'vue' import { createI18n } from 'vue-i18n' import type { IWidgetOptions } from '@/lib/litegraph/src/types/widgets' -import type { ChartInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' import type { SimplifiedWidget } from '@/types/simplifiedWidget' import WidgetChart from './WidgetChart.vue' import { createMockWidget } from './widgetTestUtils' -type ChartWidgetOptions = NonNullable & - IWidgetOptions +type ChartWidgetOptions = IWidgetOptions & { + type?: 'bar' | 'line' +} const i18n = createI18n({ legacy: false, diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetChart.vue b/src/renderer/extensions/vueNodes/widgets/components/WidgetChart.vue index 6efa95fa40..5870674cea 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/WidgetChart.vue +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetChart.vue @@ -17,11 +17,11 @@ import Chart from 'primevue/chart' import { computed } from 'vue' import type { IWidgetOptions } from '@/lib/litegraph/src/types/widgets' -import type { ChartInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' import type { SimplifiedWidget } from '@/types/simplifiedWidget' -type ChartWidgetOptions = NonNullable & - IWidgetOptions +type ChartWidgetOptions = IWidgetOptions & { + type?: 'bar' | 'line' +} const value = defineModel({ required: true }) diff --git a/src/renderer/extensions/vueNodes/widgets/composables/useChartWidget.ts b/src/renderer/extensions/vueNodes/widgets/composables/useChartWidget.ts index 3096ac3b80..1dcc18cbd1 100644 --- a/src/renderer/extensions/vueNodes/widgets/composables/useChartWidget.ts +++ b/src/renderer/extensions/vueNodes/widgets/composables/useChartWidget.ts @@ -1,10 +1,7 @@ import type { LGraphNode } from '@/lib/litegraph/src/litegraph' import type { IChartWidget } from '@/lib/litegraph/src/types/widgets' import { isChartInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' -import type { - ChartInputSpec, - InputSpec as InputSpecV2 -} from '@/schemas/nodeDef/nodeDefSchemaV2' +import type { InputSpec as InputSpecV2 } from '@/schemas/nodeDef/nodeDefSchemaV2' import type { ComfyWidgetConstructorV2 } from '@/scripts/widgets' export const useChartWidget = (): ComfyWidgetConstructorV2 => { @@ -13,14 +10,13 @@ export const useChartWidget = (): ComfyWidgetConstructorV2 => { throw new Error('Invalid input spec for chart widget') } - const { name, options = {} } = inputSpec as ChartInputSpec + const { name, chartType = 'line', data = {} } = inputSpec - const chartType = options.type || 'line' + const widgetOptions = { type: chartType } - const widget = node.addWidget('chart', name, options.data || {}, () => {}, { + const widget = node.addWidget('chart', name, data, () => {}, { serialize: true, - type: chartType, - ...options + ...widgetOptions }) as IChartWidget return widget diff --git a/src/renderer/extensions/vueNodes/widgets/composables/useColorWidget.ts b/src/renderer/extensions/vueNodes/widgets/composables/useColorWidget.ts index 08d1aa5743..e7830bb218 100644 --- a/src/renderer/extensions/vueNodes/widgets/composables/useColorWidget.ts +++ b/src/renderer/extensions/vueNodes/widgets/composables/useColorWidget.ts @@ -1,15 +1,16 @@ import type { LGraphNode } from '@/lib/litegraph/src/litegraph' import type { IColorWidget } from '@/lib/litegraph/src/types/widgets' -import type { - ColorInputSpec, - InputSpec as InputSpecV2 -} from '@/schemas/nodeDef/nodeDefSchemaV2' +import { isColorInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' +import type { InputSpec as InputSpecV2 } from '@/schemas/nodeDef/nodeDefSchemaV2' import type { ComfyWidgetConstructorV2 } from '@/scripts/widgets' export const useColorWidget = (): ComfyWidgetConstructorV2 => { return (node: LGraphNode, inputSpec: InputSpecV2): IColorWidget => { - const { name, default: defaultValue = '#000000' } = - inputSpec as ColorInputSpec + if (!isColorInputSpec(inputSpec)) { + throw new Error('Invalid input spec for color widget') + } + + const { name, default: defaultValue = '#000000' } = inputSpec const widget = node.addWidget('color', name, defaultValue, () => {}, { serialize: true diff --git a/src/renderer/extensions/vueNodes/widgets/composables/useGalleriaWidget.ts b/src/renderer/extensions/vueNodes/widgets/composables/useGalleriaWidget.ts index e06259d29e..d7297add0b 100644 --- a/src/renderer/extensions/vueNodes/widgets/composables/useGalleriaWidget.ts +++ b/src/renderer/extensions/vueNodes/widgets/composables/useGalleriaWidget.ts @@ -1,25 +1,20 @@ import type { LGraphNode } from '@/lib/litegraph/src/litegraph' import type { IGalleriaWidget } from '@/lib/litegraph/src/types/widgets' -import type { - GalleriaInputSpec, - InputSpec as InputSpecV2 -} from '@/schemas/nodeDef/nodeDefSchemaV2' +import { isGalleriaInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' +import type { InputSpec as InputSpecV2 } from '@/schemas/nodeDef/nodeDefSchemaV2' import type { ComfyWidgetConstructorV2 } from '@/scripts/widgets' export const useGalleriaWidget = (): ComfyWidgetConstructorV2 => { return (node: LGraphNode, inputSpec: InputSpecV2): IGalleriaWidget => { - const { name, options = {} } = inputSpec as GalleriaInputSpec + if (!isGalleriaInputSpec(inputSpec)) { + throw new Error('Invalid input spec for galleria widget') + } - const widget = node.addWidget( - 'galleria', - name, - options.images || [], - () => {}, - { - serialize: true, - ...options - } - ) as IGalleriaWidget + const { name, images = [] } = inputSpec + + const widget = node.addWidget('galleria', name, images, () => {}, { + serialize: true + }) as IGalleriaWidget return widget } diff --git a/src/renderer/extensions/vueNodes/widgets/composables/useTextareaWidget.ts b/src/renderer/extensions/vueNodes/widgets/composables/useTextareaWidget.ts index 8a8fad27d0..4a128ebd6d 100644 --- a/src/renderer/extensions/vueNodes/widgets/composables/useTextareaWidget.ts +++ b/src/renderer/extensions/vueNodes/widgets/composables/useTextareaWidget.ts @@ -1,20 +1,19 @@ import type { LGraphNode } from '@/lib/litegraph/src/litegraph' import type { ITextareaWidget } from '@/lib/litegraph/src/types/widgets' -import type { - InputSpec as InputSpecV2, - TextareaInputSpec -} from '@/schemas/nodeDef/nodeDefSchemaV2' +import { isTextareaInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' +import type { InputSpec as InputSpecV2 } from '@/schemas/nodeDef/nodeDefSchemaV2' import type { ComfyWidgetConstructorV2 } from '@/scripts/widgets' export const useTextareaWidget = (): ComfyWidgetConstructorV2 => { return (node: LGraphNode, inputSpec: InputSpecV2): ITextareaWidget => { - const textareaSpec = inputSpec as TextareaInputSpec - const { name, default: defaultValue = '' } = textareaSpec - const widgetOptions = { - rows: textareaSpec.rows ?? 5, - cols: textareaSpec.cols ?? 50 + if (!isTextareaInputSpec(inputSpec)) { + throw new Error('Invalid input spec for textarea widget') } + const { name, default: defaultValue = '', rows = 5, cols = 50 } = inputSpec + + const widgetOptions = { rows, cols } + const widget = node.addWidget('textarea', name, defaultValue, () => {}, { serialize: true, ...widgetOptions diff --git a/src/schemas/nodeDef/nodeDefSchemaV2.ts b/src/schemas/nodeDef/nodeDefSchemaV2.ts index 5e16ebd54c..29d224efd4 100644 --- a/src/schemas/nodeDef/nodeDefSchemaV2.ts +++ b/src/schemas/nodeDef/nodeDefSchemaV2.ts @@ -87,23 +87,15 @@ const zChartInputSpec = zBaseInputOptions.extend({ type: z.literal('CHART'), name: z.string(), isOptional: z.boolean().optional(), - options: z - .object({ - type: z.enum(['bar', 'line']).optional(), - data: z.object({}).optional() - }) - .optional() + chartType: z.enum(['bar', 'line']).optional(), + data: z.object({}).optional() }) const zGalleriaInputSpec = zBaseInputOptions.extend({ type: z.literal('GALLERIA'), name: z.string(), isOptional: z.boolean().optional(), - options: z - .object({ - images: z.array(z.string()).optional() - }) - .optional() + images: z.array(z.string()).optional() }) const zTextareaInputSpec = zBaseInputOptions.extend({ @@ -211,9 +203,9 @@ export type ComboInputSpec = z.infer export type ColorInputSpec = z.infer export type ImageCompareInputSpec = z.infer export type BoundingBoxInputSpec = z.infer -export type ChartInputSpec = z.infer -export type GalleriaInputSpec = z.infer -export type TextareaInputSpec = z.infer +type ChartInputSpec = z.infer +type GalleriaInputSpec = z.infer +type TextareaInputSpec = z.infer export type CurveInputSpec = z.infer export type RangeInputSpec = z.infer export type CustomInputSpec = z.infer @@ -257,3 +249,21 @@ export const isChartInputSpec = ( ): inputSpec is ChartInputSpec => { return inputSpec.type === 'CHART' } + +export const isColorInputSpec = ( + inputSpec: InputSpec +): inputSpec is ColorInputSpec => { + return inputSpec.type === 'COLOR' +} + +export const isTextareaInputSpec = ( + inputSpec: InputSpec +): inputSpec is TextareaInputSpec => { + return inputSpec.type === 'TEXTAREA' +} + +export const isGalleriaInputSpec = ( + inputSpec: InputSpec +): inputSpec is GalleriaInputSpec => { + return inputSpec.type === 'GALLERIA' +}