tidy(ui): clean up unused code 3

variables, types and schemas
This commit is contained in:
psychedelicious 2024-02-27 17:07:40 +11:00 committed by Brandon Rising
parent bca1737b9c
commit a106c1126c
27 changed files with 141 additions and 554 deletions

View File

@ -1,4 +0,0 @@
{
"$schema": "https://unpkg.com/knip@5/schema.json",
"ignore": ["src/features/nodes/types/v2/**/*", "src/features/nodes/types/v1/**/*"]
}

View File

@ -0,0 +1,19 @@
import type { KnipConfig } from 'knip';
const config: KnipConfig = {
ignore: [
// This file is only used during debugging
'src/app/store/middleware/debugLoggerMiddleware.ts',
// These are old schemas, used in migrations. Needs cleanup.
'src/features/nodes/types/v2/**/*',
'src/features/nodes/types/v1/**/*',
// We don't want to check the public folder - contains images and translations
'public/**/*',
],
compilers: {
//
svg: () => '',
},
};
export default config;

View File

@ -1,24 +0,0 @@
import { FormControl, FormLabel, Switch } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { combinatorialToggled } from 'features/dynamicPrompts/store/dynamicPromptsSlice';
import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
const ParamDynamicPromptsCombinatorial = () => {
const combinatorial = useAppSelector((s) => s.dynamicPrompts.combinatorial);
const dispatch = useAppDispatch();
const { t } = useTranslation();
const handleChange = useCallback(() => {
dispatch(combinatorialToggled());
}, [dispatch]);
return (
<FormControl>
<FormLabel>{t('dynamicPrompts.combinatorial')}</FormLabel>
<Switch isChecked={combinatorial} onChange={handleChange} />
</FormControl>
);
};
export default memo(ParamDynamicPromptsCombinatorial);

View File

@ -1,7 +0,0 @@
import { memo } from 'react';
const NoBoardContextMenuItems = () => {
return <></>;
};
export default memo(NoBoardContextMenuItems);

View File

@ -1,38 +0,0 @@
import type { ComboboxOnChange, ComboboxOption } from '@invoke-ai/ui-library';
import { Combobox, Flex, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { typedMemo } from 'common/util/typedMemo';
import { MODEL_TYPE_MAP } from 'features/parameters/types/constants';
import { useCallback, useMemo } from 'react';
import type { UseControllerProps } from 'react-hook-form';
import { useController } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import type { AnyModelConfig } from 'services/api/types';
const options: ComboboxOption[] = [
{ value: 'sd-1', label: MODEL_TYPE_MAP['sd-1'] },
{ value: 'sd-2', label: MODEL_TYPE_MAP['sd-2'] },
{ value: 'sdxl', label: MODEL_TYPE_MAP['sdxl'] },
{ value: 'sdxl-refiner', label: MODEL_TYPE_MAP['sdxl-refiner'] },
];
const BaseModelSelect = <T extends AnyModelConfig>(props: UseControllerProps<T>) => {
const { t } = useTranslation();
const { field } = useController(props);
const value = useMemo(() => options.find((o) => o.value === field.value), [field.value]);
const onChange = useCallback<ComboboxOnChange>(
(v) => {
field.onChange(v?.value);
},
[field]
);
return (
<FormControl>
<Flex direction="column" width="full">
<FormLabel>{t('modelManager.baseModel')}</FormLabel>
<Combobox value={value} options={options} onChange={onChange} />
</Flex>
</FormControl>
);
};
export default typedMemo(BaseModelSelect);

View File

@ -1,36 +0,0 @@
import type { ComboboxOnChange, ComboboxOption } from '@invoke-ai/ui-library';
import { Combobox, Flex, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { typedMemo } from 'common/util/typedMemo';
import { useCallback, useMemo } from 'react';
import type { UseControllerProps } from 'react-hook-form';
import { useController } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import type { CheckpointModelConfig, DiffusersModelConfig } from 'services/api/types';
const options: ComboboxOption[] = [
{ value: 'normal', label: 'Normal' },
{ value: 'inpaint', label: 'Inpaint' },
{ value: 'depth', label: 'Depth' },
];
const ModelVariantSelect = <T extends CheckpointModelConfig | DiffusersModelConfig>(props: UseControllerProps<T>) => {
const { t } = useTranslation();
const { field } = useController(props);
const value = useMemo(() => options.find((o) => o.value === field.value), [field.value]);
const onChange = useCallback<ComboboxOnChange>(
(v) => {
field.onChange(v?.value);
},
[field]
);
return (
<FormControl>
<Flex direction="column" width="full">
<FormLabel>{t('modelManager.variant')}</FormLabel>
<Combobox value={value} options={options} onChange={onChange} />
</Flex>
</FormControl>
);
};
export default typedMemo(ModelVariantSelect);

View File

@ -1,3 +0,0 @@
export const ScanModels = () => {
return null;
};

View File

@ -1,25 +0,0 @@
import { createSelector } from '@reduxjs/toolkit';
import { useAppSelector } from 'app/store/storeHooks';
import { compareVersions } from 'compare-versions';
import { selectNodesSlice } from 'features/nodes/store/nodesSlice';
import { selectNodeData, selectNodeTemplate } from 'features/nodes/store/selectors';
import { useMemo } from 'react';
export const useDoNodeVersionsMatch = (nodeId: string): boolean => {
const selector = useMemo(
() =>
createSelector(selectNodesSlice, (nodes) => {
const data = selectNodeData(nodes, nodeId);
const template = selectNodeTemplate(nodes, nodeId);
if (!template?.version || !data?.version) {
return false;
}
return compareVersions(template.version, data.version) === 0;
}),
[nodeId]
);
const nodeTemplate = useAppSelector(selector);
return nodeTemplate;
};

View File

@ -1,21 +0,0 @@
import { createSelector } from '@reduxjs/toolkit';
import { useAppSelector } from 'app/store/storeHooks';
import { selectNodesSlice } from 'features/nodes/store/nodesSlice';
import { selectFieldInputTemplate } from 'features/nodes/store/selectors';
import type { FieldInput } from 'features/nodes/types/field';
import { useMemo } from 'react';
export const useFieldInputKind = (nodeId: string, fieldName: string) => {
const selector = useMemo(
() =>
createSelector(selectNodesSlice, (nodes): FieldInput | null => {
const template = selectFieldInputTemplate(nodes, nodeId, fieldName);
return template?.input ?? null;
}),
[fieldName, nodeId]
);
const inputKind = useAppSelector(selector);
return inputKind;
};

View File

@ -1,19 +0,0 @@
import { createSelector } from '@reduxjs/toolkit';
import { useAppSelector } from 'app/store/storeHooks';
import { selectNodesSlice } from 'features/nodes/store/nodesSlice';
import type { InvocationTemplate } from 'features/nodes/types/invocation';
import { useMemo } from 'react';
export const useNodeTemplateByType = (type: string): InvocationTemplate | null => {
const selector = useMemo(
() =>
createSelector(selectNodesSlice, (nodes) => {
return nodes.templates[type] ?? null;
}),
[type]
);
const nodeTemplate = useAppSelector(selector);
return nodeTemplate;
};

View File

@ -54,8 +54,8 @@ export type SchedulerField = z.infer<typeof zSchedulerField>;
// #endregion
// #region Model-related schemas
export const zBaseModel = z.enum(['any', 'sd-1', 'sd-2', 'sdxl', 'sdxl-refiner']);
export const zModelType = z.enum([
const zBaseModel = z.enum(['any', 'sd-1', 'sd-2', 'sdxl', 'sdxl-refiner']);
const zModelType = z.enum([
'main',
'vae',
'lora',
@ -65,15 +65,14 @@ export const zModelType = z.enum([
'clip_vision',
't2i_adapter',
]);
export const zModelName = z.string().min(3);
export const zModelIdentifier = z.object({
const zModelIdentifier = z.object({
key: z.string().min(1),
});
export const isModelIdentifier = (field: unknown): field is ModelIdentifier =>
zModelIdentifier.safeParse(field).success;
export const isModelIdentifierV2 = (field: unknown): field is ModelIdentifierV2 =>
zModelIdentifierV2.safeParse(field).success;
export const zModelFieldBase = zModelIdentifier;
const zModelFieldBase = zModelIdentifier;
export const zModelIdentifierWithBase = zModelIdentifier.extend({ base: zBaseModel });
export type BaseModel = z.infer<typeof zBaseModel>;
export type ModelType = z.infer<typeof zModelType>;
@ -123,7 +122,7 @@ export type ProgressImage = z.infer<typeof zProgressImage>;
// #endregion
// #region ImageOutput
export const zImageOutput = z.object({
const zImageOutput = z.object({
image: zImageField,
width: z.number().int().gt(0),
height: z.number().int().gt(0),

View File

@ -1,12 +1,6 @@
import { z } from 'zod';
import {
zBoardField,
zColorField,
zImageField,
zModelIdentifierWithBase,
zSchedulerField,
} from './common';
import { zBoardField, zColorField, zImageField, zModelIdentifierWithBase, zSchedulerField } from './common';
/**
* zod schemas & inferred types for fields.
@ -35,19 +29,19 @@ import {
/** */
// #region Base schemas & misc
export const zFieldInput = z.enum(['connection', 'direct', 'any']);
const zFieldInput = z.enum(['connection', 'direct', 'any']);
export type FieldInput = z.infer<typeof zFieldInput>;
export const zFieldUIComponent = z.enum(['none', 'textarea', 'slider']);
const zFieldUIComponent = z.enum(['none', 'textarea', 'slider']);
export type FieldUIComponent = z.infer<typeof zFieldUIComponent>;
export const zFieldInputInstanceBase = z.object({
const zFieldInputInstanceBase = z.object({
name: z.string().trim().min(1),
label: z.string().nullish(),
});
export type FieldInputInstanceBase = z.infer<typeof zFieldInputInstanceBase>;
export const zFieldTemplateBase = z.object({
const zFieldTemplateBase = z.object({
name: z.string().min(1),
title: z.string().min(1),
description: z.string().nullish(),
@ -55,21 +49,21 @@ export const zFieldTemplateBase = z.object({
ui_type: z.string().nullish(),
ui_order: z.number().int().nullish(),
});
export const zFieldInputTemplateBase = zFieldTemplateBase.extend({
const zFieldInputTemplateBase = zFieldTemplateBase.extend({
fieldKind: z.literal('input'),
input: zFieldInput,
required: z.boolean(),
ui_component: zFieldUIComponent.nullish(),
ui_choice_labels: z.record(z.string()).nullish(),
});
export const zFieldOutputTemplateBase = zFieldTemplateBase.extend({
const zFieldOutputTemplateBase = zFieldTemplateBase.extend({
fieldKind: z.literal('output'),
});
export type FieldTemplateBase = z.infer<typeof zFieldTemplateBase>;
export type FieldInputTemplateBase = z.infer<typeof zFieldInputTemplateBase>;
export type FieldOutputTemplateBase = z.infer<typeof zFieldOutputTemplateBase>;
export const zFieldTypeBase = z.object({
const zFieldTypeBase = z.object({
isCollection: z.boolean(),
isCollectionOrScalar: z.boolean(),
});
@ -79,18 +73,17 @@ export const zFieldIdentifier = z.object({
fieldName: z.string().trim().min(1),
});
export type FieldIdentifier = z.infer<typeof zFieldIdentifier>;
export const isFieldIdentifier = (val: unknown): val is FieldIdentifier => zFieldIdentifier.safeParse(val).success;
// #endregion
// #region IntegerField
export const zIntegerFieldType = zFieldTypeBase.extend({
const zIntegerFieldType = zFieldTypeBase.extend({
name: z.literal('IntegerField'),
});
export const zIntegerFieldValue = z.number().int();
export const zIntegerFieldInputInstance = zFieldInputInstanceBase.extend({
const zIntegerFieldInputInstance = zFieldInputInstanceBase.extend({
value: zIntegerFieldValue,
});
export const zIntegerFieldInputTemplate = zFieldInputTemplateBase.extend({
const zIntegerFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zIntegerFieldType,
default: zIntegerFieldValue,
multipleOf: z.number().int().optional(),
@ -99,7 +92,7 @@ export const zIntegerFieldInputTemplate = zFieldInputTemplateBase.extend({
minimum: z.number().int().optional(),
exclusiveMinimum: z.number().int().optional(),
});
export const zIntegerFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zIntegerFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zIntegerFieldType,
});
export type IntegerFieldType = z.infer<typeof zIntegerFieldType>;
@ -113,14 +106,14 @@ export const isIntegerFieldInputTemplate = (val: unknown): val is IntegerFieldIn
// #endregion
// #region FloatField
export const zFloatFieldType = zFieldTypeBase.extend({
const zFloatFieldType = zFieldTypeBase.extend({
name: z.literal('FloatField'),
});
export const zFloatFieldValue = z.number();
export const zFloatFieldInputInstance = zFieldInputInstanceBase.extend({
const zFloatFieldInputInstance = zFieldInputInstanceBase.extend({
value: zFloatFieldValue,
});
export const zFloatFieldInputTemplate = zFieldInputTemplateBase.extend({
const zFloatFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zFloatFieldType,
default: zFloatFieldValue,
multipleOf: z.number().optional(),
@ -129,7 +122,7 @@ export const zFloatFieldInputTemplate = zFieldInputTemplateBase.extend({
minimum: z.number().optional(),
exclusiveMinimum: z.number().optional(),
});
export const zFloatFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zFloatFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zFloatFieldType,
});
export type FloatFieldType = z.infer<typeof zFloatFieldType>;
@ -144,20 +137,20 @@ export const isFloatFieldInputTemplate = (val: unknown): val is FloatFieldInputT
// #endregion
// #region StringField
export const zStringFieldType = zFieldTypeBase.extend({
const zStringFieldType = zFieldTypeBase.extend({
name: z.literal('StringField'),
});
export const zStringFieldValue = z.string();
export const zStringFieldInputInstance = zFieldInputInstanceBase.extend({
const zStringFieldInputInstance = zFieldInputInstanceBase.extend({
value: zStringFieldValue,
});
export const zStringFieldInputTemplate = zFieldInputTemplateBase.extend({
const zStringFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zStringFieldType,
default: zStringFieldValue,
maxLength: z.number().int().optional(),
minLength: z.number().int().optional(),
});
export const zStringFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zStringFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zStringFieldType,
});
@ -173,18 +166,18 @@ export const isStringFieldInputTemplate = (val: unknown): val is StringFieldInpu
// #endregion
// #region BooleanField
export const zBooleanFieldType = zFieldTypeBase.extend({
const zBooleanFieldType = zFieldTypeBase.extend({
name: z.literal('BooleanField'),
});
export const zBooleanFieldValue = z.boolean();
export const zBooleanFieldInputInstance = zFieldInputInstanceBase.extend({
const zBooleanFieldInputInstance = zFieldInputInstanceBase.extend({
value: zBooleanFieldValue,
});
export const zBooleanFieldInputTemplate = zFieldInputTemplateBase.extend({
const zBooleanFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zBooleanFieldType,
default: zBooleanFieldValue,
});
export const zBooleanFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zBooleanFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zBooleanFieldType,
});
export type BooleanFieldType = z.infer<typeof zBooleanFieldType>;
@ -199,20 +192,20 @@ export const isBooleanFieldInputTemplate = (val: unknown): val is BooleanFieldIn
// #endregion
// #region EnumField
export const zEnumFieldType = zFieldTypeBase.extend({
const zEnumFieldType = zFieldTypeBase.extend({
name: z.literal('EnumField'),
});
export const zEnumFieldValue = z.string();
export const zEnumFieldInputInstance = zFieldInputInstanceBase.extend({
const zEnumFieldInputInstance = zFieldInputInstanceBase.extend({
value: zEnumFieldValue,
});
export const zEnumFieldInputTemplate = zFieldInputTemplateBase.extend({
const zEnumFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zEnumFieldType,
default: zEnumFieldValue,
options: z.array(z.string()),
labels: z.record(z.string()).optional(),
});
export const zEnumFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zEnumFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zEnumFieldType,
});
export type EnumFieldType = z.infer<typeof zEnumFieldType>;
@ -227,18 +220,18 @@ export const isEnumFieldInputTemplate = (val: unknown): val is EnumFieldInputTem
// #endregion
// #region ImageField
export const zImageFieldType = zFieldTypeBase.extend({
const zImageFieldType = zFieldTypeBase.extend({
name: z.literal('ImageField'),
});
export const zImageFieldValue = zImageField.optional();
export const zImageFieldInputInstance = zFieldInputInstanceBase.extend({
const zImageFieldInputInstance = zFieldInputInstanceBase.extend({
value: zImageFieldValue,
});
export const zImageFieldInputTemplate = zFieldInputTemplateBase.extend({
const zImageFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zImageFieldType,
default: zImageFieldValue,
});
export const zImageFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zImageFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zImageFieldType,
});
export type ImageFieldType = z.infer<typeof zImageFieldType>;
@ -253,18 +246,18 @@ export const isImageFieldInputTemplate = (val: unknown): val is ImageFieldInputT
// #endregion
// #region BoardField
export const zBoardFieldType = zFieldTypeBase.extend({
const zBoardFieldType = zFieldTypeBase.extend({
name: z.literal('BoardField'),
});
export const zBoardFieldValue = zBoardField.optional();
export const zBoardFieldInputInstance = zFieldInputInstanceBase.extend({
const zBoardFieldInputInstance = zFieldInputInstanceBase.extend({
value: zBoardFieldValue,
});
export const zBoardFieldInputTemplate = zFieldInputTemplateBase.extend({
const zBoardFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zBoardFieldType,
default: zBoardFieldValue,
});
export const zBoardFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zBoardFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zBoardFieldType,
});
export type BoardFieldType = z.infer<typeof zBoardFieldType>;
@ -279,18 +272,18 @@ export const isBoardFieldInputTemplate = (val: unknown): val is BoardFieldInputT
// #endregion
// #region ColorField
export const zColorFieldType = zFieldTypeBase.extend({
const zColorFieldType = zFieldTypeBase.extend({
name: z.literal('ColorField'),
});
export const zColorFieldValue = zColorField.optional();
export const zColorFieldInputInstance = zFieldInputInstanceBase.extend({
const zColorFieldInputInstance = zFieldInputInstanceBase.extend({
value: zColorFieldValue,
});
export const zColorFieldInputTemplate = zFieldInputTemplateBase.extend({
const zColorFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zColorFieldType,
default: zColorFieldValue,
});
export const zColorFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zColorFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zColorFieldType,
});
export type ColorFieldType = z.infer<typeof zColorFieldType>;
@ -305,18 +298,18 @@ export const isColorFieldInputTemplate = (val: unknown): val is ColorFieldInputT
// #endregion
// #region MainModelField
export const zMainModelFieldType = zFieldTypeBase.extend({
const zMainModelFieldType = zFieldTypeBase.extend({
name: z.literal('MainModelField'),
});
export const zMainModelFieldValue = zModelIdentifierWithBase.optional();
export const zMainModelFieldInputInstance = zFieldInputInstanceBase.extend({
const zMainModelFieldInputInstance = zFieldInputInstanceBase.extend({
value: zMainModelFieldValue,
});
export const zMainModelFieldInputTemplate = zFieldInputTemplateBase.extend({
const zMainModelFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zMainModelFieldType,
default: zMainModelFieldValue,
});
export const zMainModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zMainModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zMainModelFieldType,
});
export type MainModelFieldType = z.infer<typeof zMainModelFieldType>;
@ -331,18 +324,18 @@ export const isMainModelFieldInputTemplate = (val: unknown): val is MainModelFie
// #endregion
// #region SDXLMainModelField
export const zSDXLMainModelFieldType = zFieldTypeBase.extend({
const zSDXLMainModelFieldType = zFieldTypeBase.extend({
name: z.literal('SDXLMainModelField'),
});
export const zSDXLMainModelFieldValue = zMainModelFieldValue; // TODO: Narrow to SDXL models only.
export const zSDXLMainModelFieldInputInstance = zFieldInputInstanceBase.extend({
const zSDXLMainModelFieldValue = zMainModelFieldValue; // TODO: Narrow to SDXL models only.
const zSDXLMainModelFieldInputInstance = zFieldInputInstanceBase.extend({
value: zSDXLMainModelFieldValue,
});
export const zSDXLMainModelFieldInputTemplate = zFieldInputTemplateBase.extend({
const zSDXLMainModelFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zSDXLMainModelFieldType,
default: zSDXLMainModelFieldValue,
});
export const zSDXLMainModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zSDXLMainModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zSDXLMainModelFieldType,
});
export type SDXLMainModelFieldType = z.infer<typeof zSDXLMainModelFieldType>;
@ -357,18 +350,18 @@ export const isSDXLMainModelFieldInputTemplate = (val: unknown): val is SDXLMain
// #endregion
// #region SDXLRefinerModelField
export const zSDXLRefinerModelFieldType = zFieldTypeBase.extend({
const zSDXLRefinerModelFieldType = zFieldTypeBase.extend({
name: z.literal('SDXLRefinerModelField'),
});
export const zSDXLRefinerModelFieldValue = zMainModelFieldValue; // TODO: Narrow to SDXL Refiner models only.
export const zSDXLRefinerModelFieldInputInstance = zFieldInputInstanceBase.extend({
const zSDXLRefinerModelFieldInputInstance = zFieldInputInstanceBase.extend({
value: zSDXLRefinerModelFieldValue,
});
export const zSDXLRefinerModelFieldInputTemplate = zFieldInputTemplateBase.extend({
const zSDXLRefinerModelFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zSDXLRefinerModelFieldType,
default: zSDXLRefinerModelFieldValue,
});
export const zSDXLRefinerModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zSDXLRefinerModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zSDXLRefinerModelFieldType,
});
export type SDXLRefinerModelFieldType = z.infer<typeof zSDXLRefinerModelFieldType>;
@ -383,18 +376,18 @@ export const isSDXLRefinerModelFieldInputTemplate = (val: unknown): val is SDXLR
// #endregion
// #region VAEModelField
export const zVAEModelFieldType = zFieldTypeBase.extend({
const zVAEModelFieldType = zFieldTypeBase.extend({
name: z.literal('VAEModelField'),
});
export const zVAEModelFieldValue = zModelIdentifierWithBase.optional();
export const zVAEModelFieldInputInstance = zFieldInputInstanceBase.extend({
const zVAEModelFieldInputInstance = zFieldInputInstanceBase.extend({
value: zVAEModelFieldValue,
});
export const zVAEModelFieldInputTemplate = zFieldInputTemplateBase.extend({
const zVAEModelFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zVAEModelFieldType,
default: zVAEModelFieldValue,
});
export const zVAEModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zVAEModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zVAEModelFieldType,
});
export type VAEModelFieldType = z.infer<typeof zVAEModelFieldType>;
@ -409,18 +402,18 @@ export const isVAEModelFieldInputTemplate = (val: unknown): val is VAEModelField
// #endregion
// #region LoRAModelField
export const zLoRAModelFieldType = zFieldTypeBase.extend({
const zLoRAModelFieldType = zFieldTypeBase.extend({
name: z.literal('LoRAModelField'),
});
export const zLoRAModelFieldValue = zModelIdentifierWithBase.optional();
export const zLoRAModelFieldInputInstance = zFieldInputInstanceBase.extend({
const zLoRAModelFieldInputInstance = zFieldInputInstanceBase.extend({
value: zLoRAModelFieldValue,
});
export const zLoRAModelFieldInputTemplate = zFieldInputTemplateBase.extend({
const zLoRAModelFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zLoRAModelFieldType,
default: zLoRAModelFieldValue,
});
export const zLoRAModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zLoRAModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zLoRAModelFieldType,
});
export type LoRAModelFieldType = z.infer<typeof zLoRAModelFieldType>;
@ -435,18 +428,18 @@ export const isLoRAModelFieldInputTemplate = (val: unknown): val is LoRAModelFie
// #endregion
// #region ControlNetModelField
export const zControlNetModelFieldType = zFieldTypeBase.extend({
const zControlNetModelFieldType = zFieldTypeBase.extend({
name: z.literal('ControlNetModelField'),
});
export const zControlNetModelFieldValue = zModelIdentifierWithBase.optional();
export const zControlNetModelFieldInputInstance = zFieldInputInstanceBase.extend({
const zControlNetModelFieldInputInstance = zFieldInputInstanceBase.extend({
value: zControlNetModelFieldValue,
});
export const zControlNetModelFieldInputTemplate = zFieldInputTemplateBase.extend({
const zControlNetModelFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zControlNetModelFieldType,
default: zControlNetModelFieldValue,
});
export const zControlNetModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zControlNetModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zControlNetModelFieldType,
});
export type ControlNetModelFieldType = z.infer<typeof zControlNetModelFieldType>;
@ -458,23 +451,21 @@ export const isControlNetModelFieldInputInstance = (val: unknown): val is Contro
zControlNetModelFieldInputInstance.safeParse(val).success;
export const isControlNetModelFieldInputTemplate = (val: unknown): val is ControlNetModelFieldInputTemplate =>
zControlNetModelFieldInputTemplate.safeParse(val).success;
export const isControlNetModelFieldValue = (v: unknown): v is ControlNetModelFieldValue =>
zControlNetModelFieldValue.safeParse(v).success;
// #endregion
// #region IPAdapterModelField
export const zIPAdapterModelFieldType = zFieldTypeBase.extend({
const zIPAdapterModelFieldType = zFieldTypeBase.extend({
name: z.literal('IPAdapterModelField'),
});
export const zIPAdapterModelFieldValue = zModelIdentifierWithBase.optional();
export const zIPAdapterModelFieldInputInstance = zFieldInputInstanceBase.extend({
const zIPAdapterModelFieldInputInstance = zFieldInputInstanceBase.extend({
value: zIPAdapterModelFieldValue,
});
export const zIPAdapterModelFieldInputTemplate = zFieldInputTemplateBase.extend({
const zIPAdapterModelFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zIPAdapterModelFieldType,
default: zIPAdapterModelFieldValue,
});
export const zIPAdapterModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zIPAdapterModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zIPAdapterModelFieldType,
});
export type IPAdapterModelFieldType = z.infer<typeof zIPAdapterModelFieldType>;
@ -486,23 +477,21 @@ export const isIPAdapterModelFieldInputInstance = (val: unknown): val is IPAdapt
zIPAdapterModelFieldInputInstance.safeParse(val).success;
export const isIPAdapterModelFieldInputTemplate = (val: unknown): val is IPAdapterModelFieldInputTemplate =>
zIPAdapterModelFieldInputTemplate.safeParse(val).success;
export const isIPAdapterModelFieldValue = (val: unknown): val is IPAdapterModelFieldValue =>
zIPAdapterModelFieldValue.safeParse(val).success;
// #endregion
// #region T2IAdapterField
export const zT2IAdapterModelFieldType = zFieldTypeBase.extend({
const zT2IAdapterModelFieldType = zFieldTypeBase.extend({
name: z.literal('T2IAdapterModelField'),
});
export const zT2IAdapterModelFieldValue = zModelIdentifierWithBase.optional();
export const zT2IAdapterModelFieldInputInstance = zFieldInputInstanceBase.extend({
const zT2IAdapterModelFieldInputInstance = zFieldInputInstanceBase.extend({
value: zT2IAdapterModelFieldValue,
});
export const zT2IAdapterModelFieldInputTemplate = zFieldInputTemplateBase.extend({
const zT2IAdapterModelFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zT2IAdapterModelFieldType,
default: zT2IAdapterModelFieldValue,
});
export const zT2IAdapterModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zT2IAdapterModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zT2IAdapterModelFieldType,
});
export type T2IAdapterModelFieldType = z.infer<typeof zT2IAdapterModelFieldType>;
@ -517,18 +506,18 @@ export const isT2IAdapterModelFieldInputTemplate = (val: unknown): val is T2IAda
// #endregion
// #region SchedulerField
export const zSchedulerFieldType = zFieldTypeBase.extend({
const zSchedulerFieldType = zFieldTypeBase.extend({
name: z.literal('SchedulerField'),
});
export const zSchedulerFieldValue = zSchedulerField.optional();
export const zSchedulerFieldInputInstance = zFieldInputInstanceBase.extend({
const zSchedulerFieldInputInstance = zFieldInputInstanceBase.extend({
value: zSchedulerFieldValue,
});
export const zSchedulerFieldInputTemplate = zFieldInputTemplateBase.extend({
const zSchedulerFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zSchedulerFieldType,
default: zSchedulerFieldValue,
});
export const zSchedulerFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zSchedulerFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zSchedulerFieldType,
});
export type SchedulerFieldType = z.infer<typeof zSchedulerFieldType>;
@ -554,19 +543,19 @@ export const isSchedulerFieldInputTemplate = (val: unknown): val is SchedulerFie
* - Reserved fields like IsIntermediate
* - Any other field we don't have full-on schemas for
*/
export const zStatelessFieldType = zFieldTypeBase.extend({
const zStatelessFieldType = zFieldTypeBase.extend({
name: z.string().min(1), // stateless --> we accept the field's name as the type
});
export const zStatelessFieldValue = z.undefined().catch(undefined); // stateless --> no value, but making this z.never() introduces a lot of extra TS fanagling
export const zStatelessFieldInputInstance = zFieldInputInstanceBase.extend({
const zStatelessFieldValue = z.undefined().catch(undefined); // stateless --> no value, but making this z.never() introduces a lot of extra TS fanagling
const zStatelessFieldInputInstance = zFieldInputInstanceBase.extend({
value: zStatelessFieldValue,
});
export const zStatelessFieldInputTemplate = zFieldInputTemplateBase.extend({
const zStatelessFieldInputTemplate = zFieldInputTemplateBase.extend({
type: zStatelessFieldType,
default: zStatelessFieldValue,
input: z.literal('connection'), // stateless --> only accepts connection inputs
});
export const zStatelessFieldOutputTemplate = zFieldOutputTemplateBase.extend({
const zStatelessFieldOutputTemplate = zFieldOutputTemplateBase.extend({
type: zStatelessFieldType,
});
@ -593,7 +582,7 @@ export type StatelessFieldOutputTemplate = z.infer<typeof zStatelessFieldOutputT
*/
// #region StatefulFieldType & FieldType
export const zStatefulFieldType = z.union([
const zStatefulFieldType = z.union([
zIntegerFieldType,
zFloatFieldType,
zStringFieldType,
@ -616,9 +605,8 @@ export type StatefulFieldType = z.infer<typeof zStatefulFieldType>;
export const isStatefulFieldType = (val: unknown): val is StatefulFieldType =>
zStatefulFieldType.safeParse(val).success;
export const zFieldType = z.union([zStatefulFieldType, zStatelessFieldType]);
const zFieldType = z.union([zStatefulFieldType, zStatelessFieldType]);
export type FieldType = z.infer<typeof zFieldType>;
export const isFieldType = (val: unknown): val is FieldType => zFieldType.safeParse(val).success;
// #endregion
// #region StatefulFieldValue & FieldValue
@ -642,16 +630,13 @@ export const zStatefulFieldValue = z.union([
zSchedulerFieldValue,
]);
export type StatefulFieldValue = z.infer<typeof zStatefulFieldValue>;
export const isStatefulFieldValue = (val: unknown): val is StatefulFieldValue =>
zStatefulFieldValue.safeParse(val).success;
export const zFieldValue = z.union([zStatefulFieldValue, zStatelessFieldValue]);
const zFieldValue = z.union([zStatefulFieldValue, zStatelessFieldValue]);
export type FieldValue = z.infer<typeof zFieldValue>;
export const isFieldValue = (val: unknown): val is FieldValue => zFieldValue.safeParse(val).success;
// #endregion
// #region StatefulFieldInputInstance & FieldInputInstance
export const zStatefulFieldInputInstance = z.union([
const zStatefulFieldInputInstance = z.union([
zIntegerFieldInputInstance,
zFloatFieldInputInstance,
zStringFieldInputInstance,
@ -671,8 +656,6 @@ export const zStatefulFieldInputInstance = z.union([
zSchedulerFieldInputInstance,
]);
export type StatefulFieldInputInstance = z.infer<typeof zStatefulFieldInputInstance>;
export const isStatefulFieldInputInstance = (val: unknown): val is StatefulFieldInputInstance =>
zStatefulFieldInputInstance.safeParse(val).success;
export const zFieldInputInstance = z.union([zStatefulFieldInputInstance, zStatelessFieldInputInstance]);
export type FieldInputInstance = z.infer<typeof zFieldInputInstance>;
@ -681,7 +664,7 @@ export const isFieldInputInstance = (val: unknown): val is FieldInputInstance =>
// #endregion
// #region StatefulFieldInputTemplate & FieldInputTemplate
export const zStatefulFieldInputTemplate = z.union([
const zStatefulFieldInputTemplate = z.union([
zIntegerFieldInputTemplate,
zFloatFieldInputTemplate,
zStringFieldInputTemplate,
@ -702,8 +685,6 @@ export const zStatefulFieldInputTemplate = z.union([
zStatelessFieldInputTemplate,
]);
export type StatefulFieldInputTemplate = z.infer<typeof zFieldInputTemplate>;
export const isStatefulFieldInputTemplate = (val: unknown): val is StatefulFieldInputTemplate =>
zStatefulFieldInputTemplate.safeParse(val).success;
export const zFieldInputTemplate = z.union([zStatefulFieldInputTemplate, zStatelessFieldInputTemplate]);
export type FieldInputTemplate = z.infer<typeof zFieldInputTemplate>;
@ -712,7 +693,7 @@ export const isFieldInputTemplate = (val: unknown): val is FieldInputTemplate =>
// #endregion
// #region StatefulFieldOutputTemplate & FieldOutputTemplate
export const zStatefulFieldOutputTemplate = z.union([
const zStatefulFieldOutputTemplate = z.union([
zIntegerFieldOutputTemplate,
zFloatFieldOutputTemplate,
zStringFieldOutputTemplate,
@ -732,11 +713,7 @@ export const zStatefulFieldOutputTemplate = z.union([
zSchedulerFieldOutputTemplate,
]);
export type StatefulFieldOutputTemplate = z.infer<typeof zStatefulFieldOutputTemplate>;
export const isStatefulFieldOutputTemplate = (val: unknown): val is StatefulFieldOutputTemplate =>
zStatefulFieldOutputTemplate.safeParse(val).success;
export const zFieldOutputTemplate = z.union([zStatefulFieldOutputTemplate, zStatelessFieldOutputTemplate]);
export type FieldOutputTemplate = z.infer<typeof zFieldOutputTemplate>;
export const isFieldOutputTemplate = (val: unknown): val is FieldOutputTemplate =>
zFieldOutputTemplate.safeParse(val).success;
// #endregion

View File

@ -6,7 +6,7 @@ import { zFieldInputInstance, zFieldInputTemplate, zFieldOutputTemplate } from '
import { zSemVer } from './semver';
// #region InvocationTemplate
export const zInvocationTemplate = z.object({
const zInvocationTemplate = z.object({
type: z.string(),
title: z.string(),
description: z.string(),
@ -43,13 +43,13 @@ export const zNotesNodeData = z.object({
isOpen: z.boolean(),
notes: z.string(),
});
export const zCurrentImageNodeData = z.object({
const zCurrentImageNodeData = z.object({
id: z.string().trim().min(1),
type: z.literal('current_image'),
label: z.string(),
isOpen: z.boolean(),
});
export const zAnyNodeData = z.union([zInvocationNodeData, zNotesNodeData, zCurrentImageNodeData]);
const zAnyNodeData = z.union([zInvocationNodeData, zNotesNodeData, zCurrentImageNodeData]);
export type NotesNodeData = z.infer<typeof zNotesNodeData>;
export type InvocationNodeData = z.infer<typeof zInvocationNodeData>;
@ -64,15 +64,13 @@ export type AnyNode = Node<AnyNodeData>;
export const isInvocationNode = (node?: AnyNode | null): node is InvocationNode =>
Boolean(node && node.type === 'invocation');
export const isNotesNode = (node?: AnyNode | null): node is NotesNode => Boolean(node && node.type === 'notes');
export const isCurrentImageNode = (node?: AnyNode | null): node is CurrentImageNode =>
Boolean(node && node.type === 'current_image');
export const isInvocationNodeData = (node?: AnyNodeData | null): node is InvocationNodeData =>
Boolean(node && !['notes', 'current_image'].includes(node.type)); // node.type may be 'notes', 'current_image', or any invocation type
// #endregion
// #region NodeExecutionState
export const zNodeStatus = z.enum(['PENDING', 'IN_PROGRESS', 'COMPLETED', 'FAILED']);
export const zNodeExecutionState = z.object({
const zNodeExecutionState = z.object({
nodeId: z.string().trim().min(1),
status: zNodeStatus,
progress: z.number().nullable(),
@ -85,7 +83,7 @@ export type NodeStatus = z.infer<typeof zNodeStatus>;
// #endregion
// #region Edges
export const zInvocationNodeEdgeExtra = z.object({
const zInvocationNodeEdgeExtra = z.object({
type: z.union([z.literal('default'), z.literal('collapsed')]),
});
export type InvocationNodeEdgeExtra = z.infer<typeof zInvocationNodeEdgeExtra>;

View File

@ -4,7 +4,7 @@ import { zFieldIdentifier } from './field';
import { zInvocationNodeData, zNotesNodeData } from './invocation';
// #region Workflow misc
export const zXYPosition = z
const zXYPosition = z
.object({
x: z.number(),
y: z.number(),
@ -12,27 +12,27 @@ export const zXYPosition = z
.default({ x: 0, y: 0 });
export type XYPosition = z.infer<typeof zXYPosition>;
export const zDimension = z.number().gt(0).nullish();
const zDimension = z.number().gt(0).nullish();
export type Dimension = z.infer<typeof zDimension>;
export const zWorkflowCategory = z.enum(['user', 'default', 'project']);
const zWorkflowCategory = z.enum(['user', 'default', 'project']);
export type WorkflowCategory = z.infer<typeof zWorkflowCategory>;
// #endregion
// #region Workflow Nodes
export const zWorkflowInvocationNode = z.object({
const zWorkflowInvocationNode = z.object({
id: z.string().trim().min(1),
type: z.literal('invocation'),
data: zInvocationNodeData,
position: zXYPosition,
});
export const zWorkflowNotesNode = z.object({
const zWorkflowNotesNode = z.object({
id: z.string().trim().min(1),
type: z.literal('notes'),
data: zNotesNodeData,
position: zXYPosition,
});
export const zWorkflowNode = z.union([zWorkflowInvocationNode, zWorkflowNotesNode]);
const zWorkflowNode = z.union([zWorkflowInvocationNode, zWorkflowNotesNode]);
export type WorkflowInvocationNode = z.infer<typeof zWorkflowInvocationNode>;
export type WorkflowNotesNode = z.infer<typeof zWorkflowNotesNode>;
@ -43,20 +43,20 @@ export const isWorkflowInvocationNode = (val: unknown): val is WorkflowInvocatio
// #endregion
// #region Workflow Edges
export const zWorkflowEdgeBase = z.object({
const zWorkflowEdgeBase = z.object({
id: z.string().trim().min(1),
source: z.string().trim().min(1),
target: z.string().trim().min(1),
});
export const zWorkflowEdgeDefault = zWorkflowEdgeBase.extend({
const zWorkflowEdgeDefault = zWorkflowEdgeBase.extend({
type: z.literal('default'),
sourceHandle: z.string().trim().min(1),
targetHandle: z.string().trim().min(1),
});
export const zWorkflowEdgeCollapsed = zWorkflowEdgeBase.extend({
const zWorkflowEdgeCollapsed = zWorkflowEdgeBase.extend({
type: z.literal('collapsed'),
});
export const zWorkflowEdge = z.union([zWorkflowEdgeDefault, zWorkflowEdgeCollapsed]);
const zWorkflowEdge = z.union([zWorkflowEdgeDefault, zWorkflowEdgeCollapsed]);
export type WorkflowEdgeDefault = z.infer<typeof zWorkflowEdgeDefault>;
export type WorkflowEdgeCollapsed = z.infer<typeof zWorkflowEdgeCollapsed>;

View File

@ -1,19 +1,10 @@
import type { NodesState } from 'features/nodes/store/types';
import type { FieldInputInstance } from 'features/nodes/types/field';
import { isInvocationNode } from 'features/nodes/types/invocation';
import { omit, reduce } from 'lodash-es';
import type { Graph } from 'services/api/types';
import type { AnyInvocation } from 'services/events/types';
import { v4 as uuidv4 } from 'uuid';
/**
* We need to do special handling for some fields
*/
export const parseFieldValue = (field: FieldInputInstance) => {
// Currently, no special handling is needed.
return field.value;
};
/**
* Builds a graph from the node editor state.
*/
@ -31,8 +22,7 @@ export const buildNodesGraph = (nodesState: NodesState): Graph => {
const transformedInputs = reduce(
inputs,
(inputsAccumulator, input, name) => {
const parsedValue = parseFieldValue(input);
inputsAccumulator[name] = parsedValue;
inputsAccumulator[name] = input.value;
return inputsAccumulator;
},

View File

@ -13,58 +13,30 @@ export const NSFW_CHECKER = 'nsfw_checker';
export const WATERMARKER = 'invisible_watermark';
export const NOISE = 'noise';
export const NOISE_HRF = 'noise_hrf';
export const RANDOM_INT = 'rand_int';
export const RANGE_OF_SIZE = 'range_of_size';
export const ITERATE = 'iterate';
export const MAIN_MODEL_LOADER = 'main_model_loader';
export const VAE_LOADER = 'vae_loader';
export const LORA_LOADER = 'lora_loader';
export const CLIP_SKIP = 'clip_skip';
export const IMAGE_TO_LATENTS = 'image_to_latents';
export const LATENTS_TO_LATENTS = 'latents_to_latents';
export const RESIZE = 'resize_image';
export const IMG2IMG_RESIZE = 'img2img_resize';
export const CANVAS_OUTPUT = 'canvas_output';
export const INPAINT_IMAGE = 'inpaint_image';
export const SCALED_INPAINT_IMAGE = 'scaled_inpaint_image';
export const INPAINT_IMAGE_RESIZE_UP = 'inpaint_image_resize_up';
export const INPAINT_IMAGE_RESIZE_DOWN = 'inpaint_image_resize_down';
export const INPAINT_INFILL = 'inpaint_infill';
export const INPAINT_INFILL_RESIZE_DOWN = 'inpaint_infill_resize_down';
export const INPAINT_FINAL_IMAGE = 'inpaint_final_image';
export const INPAINT_CREATE_MASK = 'inpaint_create_mask';
export const INPAINT_MASK = 'inpaint_mask';
export const CANVAS_COHERENCE_DENOISE_LATENTS = 'canvas_coherence_denoise_latents';
export const CANVAS_COHERENCE_NOISE = 'canvas_coherence_noise';
export const CANVAS_COHERENCE_NOISE_INCREMENT = 'canvas_coherence_noise_increment';
export const CANVAS_COHERENCE_MASK_EDGE = 'canvas_coherence_mask_edge';
export const CANVAS_COHERENCE_INPAINT_CREATE_MASK = 'canvas_coherence_inpaint_create_mask';
export const MASK_FROM_ALPHA = 'tomask';
export const MASK_EDGE = 'mask_edge';
export const MASK_BLUR = 'mask_blur';
export const MASK_COMBINE = 'mask_combine';
export const MASK_RESIZE_UP = 'mask_resize_up';
export const MASK_RESIZE_DOWN = 'mask_resize_down';
export const COLOR_CORRECT = 'color_correct';
export const PASTE_IMAGE = 'img_paste';
export const CONTROL_NET_COLLECT = 'control_net_collect';
export const IP_ADAPTER_COLLECT = 'ip_adapter_collect';
export const T2I_ADAPTER_COLLECT = 't2i_adapter_collect';
export const IP_ADAPTER = 'ip_adapter';
export const DYNAMIC_PROMPT = 'dynamic_prompt';
export const IMAGE_COLLECTION = 'image_collection';
export const IMAGE_COLLECTION_ITERATE = 'image_collection_iterate';
export const METADATA = 'core_metadata';
export const BATCH_METADATA = 'batch_metadata';
export const BATCH_METADATA_COLLECT = 'batch_metadata_collect';
export const BATCH_SEED = 'batch_seed';
export const BATCH_PROMPT = 'batch_prompt';
export const BATCH_STYLE_PROMPT = 'batch_style_prompt';
export const METADATA_COLLECT = 'metadata_collect';
export const MERGE_METADATA = 'merge_metadata';
export const ESRGAN = 'esrgan';
export const DIVIDE = 'divide';
export const SCALE = 'scale_image';
export const SDXL_MODEL_LOADER = 'sdxl_model_loader';
export const SDXL_DENOISE_LATENTS = 'sdxl_denoise_latents';
export const SDXL_REFINER_MODEL_LOADER = 'sdxl_refiner_model_loader';
@ -75,32 +47,6 @@ export const SDXL_REFINER_INPAINT_CREATE_MASK = 'refiner_inpaint_create_mask';
export const SEAMLESS = 'seamless';
export const SDXL_REFINER_SEAMLESS = 'refiner_seamless';
// these image-outputting nodes are from the linear UI and we should not handle the gallery logic on them
// instead, we wait for LINEAR_UI_OUTPUT node, and handle it like any other image-outputting node
export const nodeIDDenyList = [
CANVAS_OUTPUT,
LATENTS_TO_IMAGE,
LATENTS_TO_IMAGE_HRF_HR,
NSFW_CHECKER,
WATERMARKER,
ESRGAN,
ESRGAN_HRF,
RESIZE_HRF,
LATENTS_TO_IMAGE_HRF_LR,
IMG2IMG_RESIZE,
INPAINT_IMAGE,
SCALED_INPAINT_IMAGE,
INPAINT_IMAGE_RESIZE_UP,
INPAINT_IMAGE_RESIZE_DOWN,
INPAINT_INFILL,
INPAINT_INFILL_RESIZE_DOWN,
INPAINT_FINAL_IMAGE,
INPAINT_CREATE_MASK,
INPAINT_MASK,
PASTE_IMAGE,
SCALE,
];
// friendly graph ids
export const TEXT_TO_IMAGE_GRAPH = 'text_to_image_graph';
export const IMAGE_TO_IMAGE_GRAPH = 'image_to_image_graph';

View File

@ -11,13 +11,14 @@ export const getNeedsUpdate = (node: InvocationNode, template: InvocationTemplat
return true;
}
return node.data.version !== template.version;
}; /**
};
/**
* Checks if a node may be updated by comparing its major version with the template's major version.
* @param node The node to check.
* @param template The invocation template to check against.
*/
export const getMayUpdateNode = (node: InvocationNode, template: InvocationTemplate): boolean => {
const getMayUpdateNode = (node: InvocationNode, template: InvocationTemplate): boolean => {
const needsUpdate = getNeedsUpdate(node, template);
if (!needsUpdate || node.data.type !== template.type) {
return false;
@ -25,7 +26,9 @@ export const getMayUpdateNode = (node: InvocationNode, template: InvocationTempl
const templateMajor = zParsedSemver.parse(template.version).major;
return satisfies(node.data.version, `^${templateMajor}`);
}; /**
};
/**
* Updates a node to the latest version of its template:
* - Create a new node data object with the latest version of the template.
* - Recursively merge new node data object into the node to be updated.
@ -34,7 +37,6 @@ export const getMayUpdateNode = (node: InvocationNode, template: InvocationTempl
* @param template The invocation template to update to.
* @throws {NodeUpdateError} If the node is not an invocation node.
*/
export const updateNode = (node: InvocationNode, template: InvocationTemplate): InvocationNode => {
const mayUpdate = getMayUpdateNode(node, template);

View File

@ -1,45 +0,0 @@
import type { ComboboxOnChange, ComboboxOption } from '@invoke-ai/ui-library';
import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
import { setMaskBlurMethod } from 'features/parameters/store/generationSlice';
import { isParameterMaskBlurMethod } from 'features/parameters/types/parameterSchemas';
import { memo, useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
const ParamMaskBlurMethod = () => {
const maskBlurMethod = useAppSelector((s) => s.generation.maskBlurMethod);
const dispatch = useAppDispatch();
const { t } = useTranslation();
const options: ComboboxOption[] = useMemo(
() => [
{ label: t('parameters.boxBlur'), value: 'box' },
{ label: t('parameters.gaussianBlur'), value: 'gaussian' },
],
[t]
);
const onChange = useCallback<ComboboxOnChange>(
(v) => {
if (!isParameterMaskBlurMethod(v?.value)) {
return;
}
dispatch(setMaskBlurMethod(v.value));
},
[dispatch]
);
const value = useMemo(() => options.find((o) => o.value === maskBlurMethod), [maskBlurMethod, options]);
return (
<FormControl>
<InformationalPopover feature="compositingBlurMethod">
<FormLabel>{t('parameters.maskBlurMethod')}</FormLabel>
</InformationalPopover>
<Combobox value={value} onChange={onChange} options={options} />
</FormControl>
);
};
export default memo(ParamMaskBlurMethod);

View File

@ -8,7 +8,7 @@ import { selectOptimalDimension } from 'features/parameters/store/generationSlic
import { memo, useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
export const OPTIONS: ComboboxOption[] = [
const OPTIONS: ComboboxOption[] = [
{ label: 'None', value: 'none' },
{ label: 'Auto', value: 'auto' },
{ label: 'Manual', value: 'manual' },

View File

@ -5,8 +5,8 @@ import type { AspectRatioID, AspectRatioState } from './types';
// When the aspect ratio is between these two values, we show the icon (experimentally determined)
export const ICON_LOW_CUTOFF = 0.23;
export const ICON_HIGH_CUTOFF = 1 / ICON_LOW_CUTOFF;
export const ICON_SIZE_PX = 64;
export const ICON_PADDING_PX = 16;
const ICON_SIZE_PX = 64;
const ICON_PADDING_PX = 16;
export const BOX_SIZE_CSS_CALC = `min(${ICON_SIZE_PX}px, calc(100% - ${ICON_PADDING_PX}px))`;
export const MOTION_ICON_INITIAL = {
opacity: 0,

View File

@ -1,45 +0,0 @@
import { useMemo } from 'react';
import { ICON_HIGH_CUTOFF, ICON_LOW_CUTOFF } from './constants';
type Dimensions = {
width: number;
height: number;
};
type UseAspectRatioPreviewStateArg = {
width: number;
height: number;
containerSize?: Dimensions;
};
type UseAspectRatioPreviewState = (arg: UseAspectRatioPreviewStateArg) => Dimensions & { shouldShowIcon: boolean };
export const useAspectRatioPreviewState: UseAspectRatioPreviewState = ({
width: _width,
height: _height,
containerSize,
}) => {
const dimensions = useMemo(() => {
if (!containerSize) {
return { width: 0, height: 0, shouldShowIcon: false };
}
const aspectRatio = _width / _height;
let width = _width;
let height = _height;
if (_width > _height) {
width = containerSize.width;
height = width / aspectRatio;
} else {
height = containerSize.height;
width = height * aspectRatio;
}
const shouldShowIcon = aspectRatio < ICON_HIGH_CUTOFF && aspectRatio > ICON_LOW_CUTOFF;
return { width, height, shouldShowIcon };
}, [_height, _width, containerSize]);
return dimensions;
};

View File

@ -1,6 +1,6 @@
import { z } from 'zod';
export const zAspectRatioID = z.enum(['Free', '16:9', '3:2', '4:3', '1:1', '3:4', '2:3', '9:16']);
const zAspectRatioID = z.enum(['Free', '16:9', '3:2', '4:3', '1:1', '3:4', '2:3', '9:16']);
export type AspectRatioID = z.infer<typeof zAspectRatioID>;
export const isAspectRatioID = (v: string): v is AspectRatioID => zAspectRatioID.safeParse(v).success;

View File

@ -1,29 +0,0 @@
import { useAppSelector } from 'app/store/storeHooks';
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
export const useCoreParametersCollapseLabel = () => {
const { t } = useTranslation();
const shouldRandomizeSeed = useAppSelector((s) => s.generation.shouldRandomizeSeed);
const iterations = useAppSelector((s) => s.generation.iterations);
const iterationsLabel = useMemo(() => {
if (iterations === 1) {
return t('parameters.iterationsWithCount_one', { count: 1 });
} else {
return t('parameters.iterationsWithCount_other', { count: iterations });
}
}, [iterations, t]);
const seedLabel = useMemo(() => {
if (shouldRandomizeSeed) {
return t('parameters.randomSeed');
} else {
return t('parameters.manualSeed');
}
}, [shouldRandomizeSeed, t]);
const iterationsAndSeedLabel = useMemo(() => [iterationsLabel, seedLabel].join(', '), [iterationsLabel, seedLabel]);
return { iterationsAndSeedLabel, iterationsLabel, seedLabel };
};

View File

@ -11,7 +11,6 @@ import type {
ParameterCanvasCoherenceMode,
ParameterCFGRescaleMultiplier,
ParameterCFGScale,
ParameterMaskBlurMethod,
ParameterModel,
ParameterPrecision,
ParameterScheduler,
@ -25,7 +24,7 @@ import type { ImageDTO } from 'services/api/types';
import type { GenerationState } from './types';
export const initialGenerationState: GenerationState = {
const initialGenerationState: GenerationState = {
_version: 1,
cfgScale: 7.5,
cfgRescaleMultiplier: 0,
@ -100,27 +99,12 @@ export const generationSlice = createSlice({
setShouldFitToWidthHeight: (state, action: PayloadAction<boolean>) => {
state.shouldFitToWidthHeight = action.payload;
},
resetSeed: (state) => {
state.seed = -1;
},
resetParametersState: (state) => {
return {
...state,
...initialGenerationState,
};
},
setShouldRandomizeSeed: (state, action: PayloadAction<boolean>) => {
state.shouldRandomizeSeed = action.payload;
},
clearInitialImage: (state) => {
state.initialImage = undefined;
},
setMaskBlur: (state, action: PayloadAction<number>) => {
state.maskBlur = action.payload;
},
setMaskBlurMethod: (state, action: PayloadAction<ParameterMaskBlurMethod>) => {
state.maskBlurMethod = action.payload;
},
setCanvasCoherenceMode: (state, action: PayloadAction<ParameterCanvasCoherenceMode>) => {
state.canvasCoherenceMode = action.payload;
},
@ -261,8 +245,6 @@ export const generationSlice = createSlice({
export const {
clearInitialImage,
resetParametersState,
resetSeed,
setCfgScale,
setCfgRescaleMultiplier,
setImg2imgStrength,
@ -271,8 +253,6 @@ export const {
setPositivePrompt,
setNegativePrompt,
setScheduler,
setMaskBlur,
setMaskBlurMethod,
setCanvasCoherenceMode,
setCanvasCoherenceEdgeSize,
setCanvasCoherenceMinDenoise,
@ -302,7 +282,7 @@ export const { selectOptimalDimension } = generationSlice.selectors;
export const selectGenerationSlice = (state: RootState) => state.generation;
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
export const migrateGenerationState = (state: any): GenerationState => {
const migrateGenerationState = (state: any): GenerationState => {
if (!('_version' in state)) {
state._version = 1;
state.aspectRatio = initialAspectRatioState;

View File

@ -1,15 +0,0 @@
import { useGetQueueStatusQuery } from 'services/api/endpoints/queue';
export const useIsQueueEmpty = () => {
const { isEmpty } = useGetQueueStatusQuery(undefined, {
selectFromResult: ({ data }) => {
if (!data) {
return { isEmpty: true };
}
return {
isEmpty: data.queue.in_progress === 0 && data.queue.pending === 0,
};
},
});
return isEmpty;
};

View File

@ -1,13 +0,0 @@
import { Flex } from '@invoke-ai/ui-library';
import type { PropsWithChildren } from 'react';
import { memo } from 'react';
const StyledFlex = (props: PropsWithChildren) => {
return (
<Flex flexDirection="column" gap={2} p={4} borderRadius="base" bg="base.900">
{props.children}
</Flex>
);
};
export default memo(StyledFlex);