Skip to content

Commit c00e2fd

Browse files
authored
Allow input spec with extra values passthrough (#273)
* Allow input spec extra values passthrough * Refine custom input spec * nit * nit
1 parent d77343d commit c00e2fd

File tree

2 files changed

+30
-24
lines changed

2 files changed

+30
-24
lines changed

src/types/apiTypes.ts

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -175,69 +175,69 @@ function inputSpec(
175175
])
176176
}
177177

178+
const zBaseInputSpecValue = z
179+
.object({
180+
default: z.any().optional(),
181+
forceInput: z.boolean().optional()
182+
})
183+
.passthrough()
184+
178185
const zIntInputSpec = inputSpec([
179186
z.literal('INT'),
180-
z.object({
187+
zBaseInputSpecValue.extend({
181188
min: z.number().optional(),
182189
max: z.number().optional(),
183190
step: z.number().optional(),
184-
default: z.number().optional(),
185-
forceInput: z.boolean().optional()
191+
default: z.number().optional()
186192
})
187193
])
188194

189195
const zFloatInputSpec = inputSpec([
190196
z.literal('FLOAT'),
191-
z.object({
197+
zBaseInputSpecValue.extend({
192198
min: z.number().optional(),
193199
max: z.number().optional(),
194200
step: z.number().optional(),
195-
round: z.number().optional(),
196-
default: z.number().optional(),
197-
forceInput: z.boolean().optional()
201+
round: z.union([z.number(), z.literal(false)]).optional(),
202+
default: z.number().optional()
198203
})
199204
])
200205

201206
const zBooleanInputSpec = inputSpec([
202207
z.literal('BOOLEAN'),
203-
z.object({
208+
zBaseInputSpecValue.extend({
204209
label_on: z.string().optional(),
205210
label_off: z.string().optional(),
206-
default: z.boolean().optional(),
207-
forceInput: z.boolean().optional()
211+
default: z.boolean().optional()
208212
})
209213
])
210214

211215
const zStringInputSpec = inputSpec([
212216
z.literal('STRING'),
213-
z.object({
217+
zBaseInputSpecValue.extend({
214218
default: z.string().optional(),
215219
multiline: z.boolean().optional(),
216-
dynamicPrompts: z.boolean().optional(),
217-
forceInput: z.boolean().optional()
220+
dynamicPrompts: z.boolean().optional()
218221
})
219222
])
220223

221224
// Dropdown Selection.
222225
const zComboInputSpec = inputSpec(
223226
[
224227
z.array(z.any()),
225-
z.object({
226-
default: z.any().optional(),
228+
zBaseInputSpecValue.extend({
227229
control_after_generate: z.boolean().optional(),
228-
image_upload: z.boolean().optional(),
229-
forceInput: z.boolean().optional()
230+
image_upload: z.boolean().optional()
230231
})
231232
],
232233
/* allowUpcast=*/ false
233234
)
234235

236+
const excludedLiterals = new Set(['INT', 'FLOAT', 'BOOLEAN', 'STRING', 'COMBO'])
237+
235238
const zCustomInputSpec = inputSpec([
236-
z.string(),
237-
z.object({
238-
default: z.any().optional(),
239-
forceInput: z.boolean().optional()
240-
})
239+
z.string().refine((value) => !excludedLiterals.has(value)),
240+
zBaseInputSpecValue
241241
])
242242

243243
const zInputSpec = z.union([

tests-ui/tests/apiTypes.test.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ describe('validateNodeDef', () => {
2727
describe.each([
2828
[{ ckpt_name: 'foo' }, ['foo', {}]],
2929
[{ ckpt_name: ['foo'] }, ['foo', {}]],
30-
[{ ckpt_name: ['foo', { default: 1 }] }, ['foo', { default: 1 }]]
30+
[{ ckpt_name: ['foo', { default: 1 }] }, ['foo', { default: 1 }]],
31+
// Extra input spec should be preserved
32+
[{ ckpt_name: ['foo', { bar: 1 }] }, ['foo', { bar: 1 }]],
33+
[{ ckpt_name: ['INT', { bar: 1 }] }, ['INT', { bar: 1 }]],
34+
[{ ckpt_name: [[1, 2, 3], { bar: 1 }] }, [[1, 2, 3], { bar: 1 }]]
3135
])(
3236
'validateComfyNodeDef with various input spec formats',
3337
(inputSpec, expected) => {
@@ -47,7 +51,9 @@ describe('validateNodeDef', () => {
4751
describe.each([
4852
[{ ckpt_name: { 'model1.safetensors': 'foo' } }],
4953
[{ ckpt_name: ['*', ''] }],
50-
[{ ckpt_name: ['foo', { default: 1 }, { default: 2 }] }]
54+
[{ ckpt_name: ['foo', { default: 1 }, { default: 2 }] }],
55+
// Should reject incorrect default value type.
56+
[{ ckpt_name: ['INT', { default: '124' }] }]
5157
])(
5258
'validateComfyNodeDef rejects with various input spec formats',
5359
(inputSpec) => {

0 commit comments

Comments
 (0)