From 862bf7546c823d85e3ab1cf9043790d840089d7d Mon Sep 17 00:00:00 2001
From: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
Date: Mon, 26 Jun 2023 11:53:54 +1000
Subject: [PATCH 1/7] feat(ui): improved node parsing
- use `swagger-parser` to dereference openapi schema
- tidy vite plugins
- use mantine select for node add menu
---
invokeai/frontend/web/config/common.ts | 14 +
.../frontend/web/config/vite.app.config.ts | 14 +-
.../web/config/vite.package.config.ts | 12 +-
invokeai/frontend/web/package.json | 2 +
.../src/app/contexts/DeleteImageContext.tsx | 4 +-
.../middleware/listenerMiddleware/index.ts | 4 +
.../listeners/receivedOpenAPISchema.ts | 35 +
.../listeners/updateImageUrlsOnConnect.ts | 4 +-
.../components/IAIMantineMultiSelect.tsx | 1 -
.../common/components/IAIMantineSelect.tsx | 2 +-
.../features/nodes/components/AddNodeMenu.tsx | 106 ++-
.../nodes/components/panels/TopLeftPanel.tsx | 4 +-
.../src/features/nodes/store/nodesSlice.ts | 27 +-
.../web/src/features/nodes/types/types.ts | 4 +-
.../nodes/util/fieldTemplateBuilders.ts | 20 +-
.../src/features/nodes/util/parseSchema.ts | 229 +++---
.../src/features/system/store/systemSlice.ts | 4 +-
.../frontend/web/src/services/api/schema.d.ts | 14 +-
.../web/src/services/api/thunks/schema.ts | 41 +-
.../frontend/web/src/services/api/types.d.ts | 51 +-
invokeai/frontend/web/tsconfig.node.json | 3 +-
invokeai/frontend/web/yarn.lock | 656 +++++++++++++++++-
22 files changed, 998 insertions(+), 253 deletions(-)
create mode 100644 invokeai/frontend/web/config/common.ts
create mode 100644 invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedOpenAPISchema.ts
diff --git a/invokeai/frontend/web/config/common.ts b/invokeai/frontend/web/config/common.ts
new file mode 100644
index 0000000000..2dce54e70a
--- /dev/null
+++ b/invokeai/frontend/web/config/common.ts
@@ -0,0 +1,14 @@
+import react from '@vitejs/plugin-react-swc';
+import { visualizer } from 'rollup-plugin-visualizer';
+import { PluginOption, UserConfig } from 'vite';
+import eslint from 'vite-plugin-eslint';
+import tsconfigPaths from 'vite-tsconfig-paths';
+import { nodePolyfills } from 'vite-plugin-node-polyfills';
+
+export const commonPlugins: UserConfig['plugins'] = [
+ react(),
+ eslint(),
+ tsconfigPaths(),
+ visualizer() as unknown as PluginOption,
+ nodePolyfills(),
+];
diff --git a/invokeai/frontend/web/config/vite.app.config.ts b/invokeai/frontend/web/config/vite.app.config.ts
index e6c4df79fd..958313402a 100644
--- a/invokeai/frontend/web/config/vite.app.config.ts
+++ b/invokeai/frontend/web/config/vite.app.config.ts
@@ -1,17 +1,9 @@
-import react from '@vitejs/plugin-react-swc';
-import { visualizer } from 'rollup-plugin-visualizer';
-import { PluginOption, UserConfig } from 'vite';
-import eslint from 'vite-plugin-eslint';
-import tsconfigPaths from 'vite-tsconfig-paths';
+import { UserConfig } from 'vite';
+import { commonPlugins } from './common';
export const appConfig: UserConfig = {
base: './',
- plugins: [
- react(),
- eslint(),
- tsconfigPaths(),
- visualizer() as unknown as PluginOption,
- ],
+ plugins: [...commonPlugins],
build: {
chunkSizeWarningLimit: 1500,
},
diff --git a/invokeai/frontend/web/config/vite.package.config.ts b/invokeai/frontend/web/config/vite.package.config.ts
index f87cce0bc9..0dcccab086 100644
--- a/invokeai/frontend/web/config/vite.package.config.ts
+++ b/invokeai/frontend/web/config/vite.package.config.ts
@@ -1,19 +1,13 @@
-import react from '@vitejs/plugin-react-swc';
import path from 'path';
-import { visualizer } from 'rollup-plugin-visualizer';
-import { PluginOption, UserConfig } from 'vite';
+import { UserConfig } from 'vite';
import dts from 'vite-plugin-dts';
-import eslint from 'vite-plugin-eslint';
-import tsconfigPaths from 'vite-tsconfig-paths';
import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js';
+import { commonPlugins } from './common';
export const packageConfig: UserConfig = {
base: './',
plugins: [
- react(),
- eslint(),
- tsconfigPaths(),
- visualizer() as unknown as PluginOption,
+ ...commonPlugins,
dts({
insertTypesEntry: true,
}),
diff --git a/invokeai/frontend/web/package.json b/invokeai/frontend/web/package.json
index 786a721d5c..8c66222584 100644
--- a/invokeai/frontend/web/package.json
+++ b/invokeai/frontend/web/package.json
@@ -53,6 +53,7 @@
]
},
"dependencies": {
+ "@apidevtools/swagger-parser": "^10.1.0",
"@chakra-ui/anatomy": "^2.1.1",
"@chakra-ui/icons": "^2.0.19",
"@chakra-ui/react": "^2.7.1",
@@ -154,6 +155,7 @@
"vite-plugin-css-injected-by-js": "^3.1.1",
"vite-plugin-dts": "^2.3.0",
"vite-plugin-eslint": "^1.8.1",
+ "vite-plugin-node-polyfills": "^0.9.0",
"vite-tsconfig-paths": "^4.2.0",
"yarn": "^1.22.19"
}
diff --git a/invokeai/frontend/web/src/app/contexts/DeleteImageContext.tsx b/invokeai/frontend/web/src/app/contexts/DeleteImageContext.tsx
index b59649a5f8..6f4af7608f 100644
--- a/invokeai/frontend/web/src/app/contexts/DeleteImageContext.tsx
+++ b/invokeai/frontend/web/src/app/contexts/DeleteImageContext.tsx
@@ -15,7 +15,7 @@ import { ImageDTO } from 'services/api/types';
import { RootState } from 'app/store/store';
import { canvasSelector } from 'features/canvas/store/canvasSelectors';
import { controlNetSelector } from 'features/controlNet/store/controlNetSlice';
-import { nodesSelecter } from 'features/nodes/store/nodesSlice';
+import { nodesSelector } from 'features/nodes/store/nodesSlice';
import { generationSelector } from 'features/parameters/store/generationSelectors';
import { some } from 'lodash-es';
@@ -30,7 +30,7 @@ export const selectImageUsage = createSelector(
[
generationSelector,
canvasSelector,
- nodesSelecter,
+ nodesSelector,
controlNetSelector,
(state: RootState, image_name?: string) => image_name,
],
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts
index cb641d00db..eab5e53ad9 100644
--- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts
@@ -82,6 +82,7 @@ import {
addImageRemovedFromBoardFulfilledListener,
addImageRemovedFromBoardRejectedListener,
} from './listeners/imageRemovedFromBoard';
+import { addReceivedOpenAPISchemaListener } from './listeners/receivedOpenAPISchema';
export const listenerMiddleware = createListenerMiddleware();
@@ -205,3 +206,6 @@ addImageAddedToBoardRejectedListener();
addImageRemovedFromBoardFulfilledListener();
addImageRemovedFromBoardRejectedListener();
addBoardIdSelectedListener();
+
+// Node schemas
+addReceivedOpenAPISchemaListener();
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedOpenAPISchema.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedOpenAPISchema.ts
new file mode 100644
index 0000000000..3cc3147b45
--- /dev/null
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedOpenAPISchema.ts
@@ -0,0 +1,35 @@
+import { receivedOpenAPISchema } from 'services/api/thunks/schema';
+import { startAppListening } from '..';
+import { log } from 'app/logging/useLogger';
+import { parseSchema } from 'features/nodes/util/parseSchema';
+import { nodeTemplatesBuilt } from 'features/nodes/store/nodesSlice';
+import { size } from 'lodash-es';
+
+const schemaLog = log.child({ namespace: 'schema' });
+
+export const addReceivedOpenAPISchemaListener = () => {
+ startAppListening({
+ actionCreator: receivedOpenAPISchema.fulfilled,
+ effect: (action, { dispatch, getState }) => {
+ const schemaJSON = action.payload;
+
+ schemaLog.info({ data: { schemaJSON } }, 'Dereferenced OpenAPI schema');
+
+ const nodeTemplates = parseSchema(schemaJSON);
+
+ schemaLog.info(
+ { data: { nodeTemplates } },
+ `Built ${size(nodeTemplates)} node templates`
+ );
+
+ dispatch(nodeTemplatesBuilt(nodeTemplates));
+ },
+ });
+
+ startAppListening({
+ actionCreator: receivedOpenAPISchema.rejected,
+ effect: (action, { dispatch, getState }) => {
+ schemaLog.error('Problem dereferencing OpenAPI Schema');
+ },
+ });
+};
diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts
index 72313a75a3..670d762d24 100644
--- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts
@@ -3,7 +3,7 @@ import { startAppListening } from '..';
import { createSelector } from '@reduxjs/toolkit';
import { generationSelector } from 'features/parameters/store/generationSelectors';
import { canvasSelector } from 'features/canvas/store/canvasSelectors';
-import { nodesSelecter } from 'features/nodes/store/nodesSlice';
+import { nodesSelector } from 'features/nodes/store/nodesSlice';
import { controlNetSelector } from 'features/controlNet/store/controlNetSlice';
import { forEach, uniqBy } from 'lodash-es';
import { imageUrlsReceived } from 'services/api/thunks/image';
@@ -16,7 +16,7 @@ const selectAllUsedImages = createSelector(
[
generationSelector,
canvasSelector,
- nodesSelecter,
+ nodesSelector,
controlNetSelector,
selectImagesEntities,
],
diff --git a/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx
index c7ce1de4c1..90be25d04d 100644
--- a/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx
+++ b/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx
@@ -27,7 +27,6 @@ const IAIMantineMultiSelect = (props: IAIMultiSelectProps) => {
borderWidth: '2px',
borderColor: 'var(--invokeai-colors-base-800)',
color: 'var(--invokeai-colors-base-100)',
- padding: 10,
paddingRight: 24,
fontWeight: 600,
'&:hover': { borderColor: 'var(--invokeai-colors-base-700)' },
diff --git a/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx
index 30517d0f41..a37cfc826c 100644
--- a/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx
+++ b/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx
@@ -64,7 +64,7 @@ const IAIMantineSelect = (props: IAISelectProps) => {
},
},
rightSection: {
- width: 24,
+ width: 32,
},
})}
{...rest}
diff --git a/invokeai/frontend/web/src/features/nodes/components/AddNodeMenu.tsx b/invokeai/frontend/web/src/features/nodes/components/AddNodeMenu.tsx
index db390ed518..64bc38e3bd 100644
--- a/invokeai/frontend/web/src/features/nodes/components/AddNodeMenu.tsx
+++ b/invokeai/frontend/web/src/features/nodes/components/AddNodeMenu.tsx
@@ -1,28 +1,41 @@
import 'reactflow/dist/style.css';
-import { memo, useCallback } from 'react';
-import {
- Tooltip,
- Menu,
- MenuButton,
- MenuList,
- MenuItem,
-} from '@chakra-ui/react';
-import { FaEllipsisV } from 'react-icons/fa';
+import { useCallback, forwardRef } from 'react';
+import { Flex, Text } from '@chakra-ui/react';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
-import { nodeAdded } from '../store/nodesSlice';
+import { nodeAdded, nodesSelector } from '../store/nodesSlice';
import { map } from 'lodash-es';
-import { RootState } from 'app/store/store';
import { useBuildInvocation } from '../hooks/useBuildInvocation';
import { AnyInvocationType } from 'services/events/types';
-import IAIIconButton from 'common/components/IAIIconButton';
import { useAppToaster } from 'app/components/Toaster';
+import { createSelector } from '@reduxjs/toolkit';
+import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
+import IAIMantineMultiSelect from 'common/components/IAIMantineMultiSelect';
+
+type NodeTemplate = {
+ label: string;
+ value: string;
+ description: string;
+};
+
+const selector = createSelector(
+ nodesSelector,
+ (nodes) => {
+ const data: NodeTemplate[] = map(nodes.invocationTemplates, (template) => {
+ return {
+ label: template.title,
+ value: template.type,
+ description: template.description,
+ };
+ });
+
+ return { data };
+ },
+ defaultSelectorOptions
+);
const AddNodeMenu = () => {
const dispatch = useAppDispatch();
-
- const invocationTemplates = useAppSelector(
- (state: RootState) => state.nodes.invocationTemplates
- );
+ const { data } = useAppSelector(selector);
const buildInvocation = useBuildInvocation();
@@ -46,23 +59,52 @@ const AddNodeMenu = () => {
);
return (
-
+
);
};
-export default memo(AddNodeMenu);
+interface ItemProps extends React.ComponentPropsWithoutRef<'div'> {
+ value: string;
+ label: string;
+ description: string;
+}
+
+const SelectItem = forwardRef(
+ ({ label, description, ...others }: ItemProps, ref) => {
+ return (
+
+
+ {label}
+
+ {description}
+
+
+
+ );
+ }
+);
+
+SelectItem.displayName = 'SelectItem';
+
+export default AddNodeMenu;
diff --git a/invokeai/frontend/web/src/features/nodes/components/panels/TopLeftPanel.tsx b/invokeai/frontend/web/src/features/nodes/components/panels/TopLeftPanel.tsx
index 3fe72225eb..2b89db000a 100644
--- a/invokeai/frontend/web/src/features/nodes/components/panels/TopLeftPanel.tsx
+++ b/invokeai/frontend/web/src/features/nodes/components/panels/TopLeftPanel.tsx
@@ -1,10 +1,10 @@
import { memo } from 'react';
import { Panel } from 'reactflow';
-import NodeSearch from '../search/NodeSearch';
+import AddNodeMenu from '../AddNodeMenu';
const TopLeftPanel = () => (
-
+
);
diff --git a/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts b/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts
index 99ba065d4f..ba217fff5f 100644
--- a/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts
+++ b/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts
@@ -14,9 +14,6 @@ import {
import { ImageField } from 'services/api/types';
import { receivedOpenAPISchema } from 'services/api/thunks/schema';
import { InvocationTemplate, InvocationValue } from '../types/types';
-import { parseSchema } from '../util/parseSchema';
-import { log } from 'app/logging/useLogger';
-import { size } from 'lodash-es';
import { RgbaColor } from 'react-colorful';
import { RootState } from 'app/store/store';
@@ -78,25 +75,17 @@ const nodesSlice = createSlice({
shouldShowGraphOverlayChanged: (state, action: PayloadAction) => {
state.shouldShowGraphOverlay = action.payload;
},
- parsedOpenAPISchema: (state, action: PayloadAction) => {
- try {
- const parsedSchema = parseSchema(action.payload);
-
- // TODO: Achtung! Side effect in a reducer!
- log.info(
- { namespace: 'schema', nodes: parsedSchema },
- `Parsed ${size(parsedSchema)} nodes`
- );
- state.invocationTemplates = parsedSchema;
- } catch (err) {
- console.error(err);
- }
+ nodeTemplatesBuilt: (
+ state,
+ action: PayloadAction>
+ ) => {
+ state.invocationTemplates = action.payload;
},
nodeEditorReset: () => {
return { ...initialNodesState };
},
},
- extraReducers(builder) {
+ extraReducers: (builder) => {
builder.addCase(receivedOpenAPISchema.fulfilled, (state, action) => {
state.schema = action.payload;
});
@@ -112,10 +101,10 @@ export const {
connectionStarted,
connectionEnded,
shouldShowGraphOverlayChanged,
- parsedOpenAPISchema,
+ nodeTemplatesBuilt,
nodeEditorReset,
} = nodesSlice.actions;
export default nodesSlice.reducer;
-export const nodesSelecter = (state: RootState) => state.nodes;
+export const nodesSelector = (state: RootState) => state.nodes;
diff --git a/invokeai/frontend/web/src/features/nodes/types/types.ts b/invokeai/frontend/web/src/features/nodes/types/types.ts
index 6497ae0a3d..6309d34b01 100644
--- a/invokeai/frontend/web/src/features/nodes/types/types.ts
+++ b/invokeai/frontend/web/src/features/nodes/types/types.ts
@@ -34,12 +34,10 @@ export type InvocationTemplate = {
* Array of invocation inputs
*/
inputs: Record;
- // inputs: InputField[];
/**
* Array of the invocation outputs
*/
outputs: Record;
- // outputs: OutputField[];
};
export type FieldUIConfig = {
@@ -335,7 +333,7 @@ export type TypeHints = {
};
export type InvocationSchemaExtra = {
- output: OpenAPIV3.ReferenceObject; // the output of the invocation
+ output: OpenAPIV3.SchemaObject; // the output of the invocation
ui?: {
tags?: string[];
type_hints?: TypeHints;
diff --git a/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts b/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts
index f1ad731d32..8f475ec708 100644
--- a/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/fieldTemplateBuilders.ts
@@ -349,21 +349,11 @@ export const getFieldType = (
if (typeHints && name in typeHints) {
rawFieldType = typeHints[name];
- } else if (!schemaObject.type) {
- // if schemaObject has no type, then it should have one of allOf, anyOf, oneOf
- if (schemaObject.allOf) {
- rawFieldType = refObjectToFieldType(
- schemaObject.allOf![0] as OpenAPIV3.ReferenceObject
- );
- } else if (schemaObject.anyOf) {
- rawFieldType = refObjectToFieldType(
- schemaObject.anyOf![0] as OpenAPIV3.ReferenceObject
- );
- } else if (schemaObject.oneOf) {
- rawFieldType = refObjectToFieldType(
- schemaObject.oneOf![0] as OpenAPIV3.ReferenceObject
- );
- }
+ } else if (!schemaObject.type && schemaObject.allOf) {
+ // if schemaObject has no type, then it should have one of allOf
+ rawFieldType =
+ (schemaObject.allOf[0] as OpenAPIV3.SchemaObject).title ??
+ 'Missing Field Type';
} else if (schemaObject.enum) {
rawFieldType = 'enum';
} else if (schemaObject.type) {
diff --git a/invokeai/frontend/web/src/features/nodes/util/parseSchema.ts b/invokeai/frontend/web/src/features/nodes/util/parseSchema.ts
index c77fdeca5e..623002f3dd 100644
--- a/invokeai/frontend/web/src/features/nodes/util/parseSchema.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/parseSchema.ts
@@ -5,127 +5,154 @@ import {
InputFieldTemplate,
InvocationSchemaObject,
InvocationTemplate,
- isInvocationSchemaObject,
OutputFieldTemplate,
} from '../types/types';
-import {
- buildInputFieldTemplate,
- buildOutputFieldTemplates,
-} from './fieldTemplateBuilders';
+import { buildInputFieldTemplate, getFieldType } from './fieldTemplateBuilders';
+import { O } from 'ts-toolbelt';
+
+// recursively exclude all properties of type U from T
+type DeepExclude = T extends U
+ ? never
+ : T extends object
+ ? {
+ [K in keyof T]: DeepExclude;
+ }
+ : T;
+
+// The schema from swagger-parser is dereferenced, and we know `components` and `components.schemas` exist
+type DereferencedOpenAPIDocument = DeepExclude<
+ O.Required,
+ OpenAPIV3.ReferenceObject
+>;
const RESERVED_FIELD_NAMES = ['id', 'type', 'is_intermediate'];
const invocationDenylist = ['Graph', 'InvocationMeta'];
-export const parseSchema = (openAPI: OpenAPIV3.Document) => {
+const nodeFilter = (
+ schema: DereferencedOpenAPIDocument['components']['schemas'][string],
+ key: string
+) =>
+ key.includes('Invocation') &&
+ !key.includes('InvocationOutput') &&
+ !invocationDenylist.some((denylistItem) => key.includes(denylistItem));
+
+export const parseSchema = (openAPI: DereferencedOpenAPIDocument) => {
// filter out non-invocation schemas, plus some tricky invocations for now
- const filteredSchemas = filter(
- openAPI.components!.schemas,
- (schema, key) =>
- key.includes('Invocation') &&
- !key.includes('InvocationOutput') &&
- !invocationDenylist.some((denylistItem) => key.includes(denylistItem))
- ) as (OpenAPIV3.ReferenceObject | InvocationSchemaObject)[];
+ const filteredSchemas = filter(openAPI.components.schemas, nodeFilter);
const invocations = filteredSchemas.reduce<
Record
- >((acc, schema) => {
- // only want SchemaObjects
- if (isInvocationSchemaObject(schema)) {
- const type = schema.properties.type.default;
+ >((acc, s) => {
+ // cast to InvocationSchemaObject, we know the shape
+ const schema = s as InvocationSchemaObject;
- const title = schema.ui?.title ?? schema.title.replace('Invocation', '');
+ const type = schema.properties.type.default;
- const typeHints = schema.ui?.type_hints;
+ const title = schema.ui?.title ?? schema.title.replace('Invocation', '');
- const inputs: Record = {};
+ const typeHints = schema.ui?.type_hints;
- if (type === 'collect') {
- const itemProperty = schema.properties[
- 'item'
- ] as InvocationSchemaObject;
- // Handle the special Collect node
- inputs.item = {
- type: 'item',
- name: 'item',
- description: itemProperty.description ?? '',
- title: 'Collection Item',
- inputKind: 'connection',
- inputRequirement: 'always',
- default: undefined,
- };
- } else if (type === 'iterate') {
- const itemProperty = schema.properties[
- 'collection'
- ] as InvocationSchemaObject;
+ const inputs: Record = {};
- inputs.collection = {
- type: 'array',
- name: 'collection',
- title: itemProperty.title ?? '',
- default: [],
- description: itemProperty.description ?? '',
- inputRequirement: 'always',
- inputKind: 'connection',
- };
- } else {
- // All other nodes
- reduce(
- schema.properties,
- (inputsAccumulator, property, propertyName) => {
- if (
- // `type` and `id` are not valid inputs/outputs
- !RESERVED_FIELD_NAMES.includes(propertyName) &&
- isSchemaObject(property)
- ) {
- const field: InputFieldTemplate | undefined =
- buildInputFieldTemplate(property, propertyName, typeHints);
-
- if (field) {
- inputsAccumulator[propertyName] = field;
- }
- }
- return inputsAccumulator;
- },
- inputs
- );
- }
-
- const rawOutput = (schema as InvocationSchemaObject).output;
-
- let outputs: Record;
-
- // some special handling is needed for collect, iterate and range nodes
- if (type === 'iterate') {
- // this is guaranteed to be a SchemaObject
- const iterationOutput = openAPI.components!.schemas![
- 'IterateInvocationOutput'
- ] as OpenAPIV3.SchemaObject;
-
- outputs = {
- item: {
- name: 'item',
- title: iterationOutput.title ?? '',
- description: iterationOutput.description ?? '',
- type: 'array',
- },
- };
- } else {
- outputs = buildOutputFieldTemplates(rawOutput, openAPI, typeHints);
- }
-
- const invocation: InvocationTemplate = {
- title,
- type,
- tags: schema.ui?.tags ?? [],
- description: schema.description ?? '',
- inputs,
- outputs,
+ if (type === 'collect') {
+ // Special handling for the Collect node
+ const itemProperty = schema.properties['item'] as InvocationSchemaObject;
+ inputs.item = {
+ type: 'item',
+ name: 'item',
+ description: itemProperty.description ?? '',
+ title: 'Collection Item',
+ inputKind: 'connection',
+ inputRequirement: 'always',
+ default: undefined,
};
+ } else if (type === 'iterate') {
+ // Special handling for the Iterate node
+ const itemProperty = schema.properties[
+ 'collection'
+ ] as InvocationSchemaObject;
- Object.assign(acc, { [type]: invocation });
+ inputs.collection = {
+ type: 'array',
+ name: 'collection',
+ title: itemProperty.title ?? '',
+ default: [],
+ description: itemProperty.description ?? '',
+ inputRequirement: 'always',
+ inputKind: 'connection',
+ };
+ } else {
+ // All other nodes
+ reduce(
+ schema.properties,
+ (inputsAccumulator, property, propertyName) => {
+ if (
+ // `type` and `id` are not valid inputs/outputs
+ !RESERVED_FIELD_NAMES.includes(propertyName) &&
+ isSchemaObject(property)
+ ) {
+ const field: InputFieldTemplate | undefined =
+ buildInputFieldTemplate(property, propertyName, typeHints);
+
+ if (field) {
+ inputsAccumulator[propertyName] = field;
+ }
+ }
+ return inputsAccumulator;
+ },
+ inputs
+ );
}
+ let outputs: Record;
+
+ if (type === 'iterate') {
+ // Special handling for the Iterate node output
+ const iterationOutput =
+ openAPI.components.schemas['IterateInvocationOutput'];
+
+ outputs = {
+ item: {
+ name: 'item',
+ title: iterationOutput.title ?? '',
+ description: iterationOutput.description ?? '',
+ type: 'array',
+ },
+ };
+ } else {
+ // All other node outputs
+ outputs = reduce(
+ schema.output.properties as OpenAPIV3.SchemaObject,
+ (outputsAccumulator, property, propertyName) => {
+ if (!['type', 'id'].includes(propertyName)) {
+ const fieldType = getFieldType(property, propertyName, typeHints);
+
+ outputsAccumulator[propertyName] = {
+ name: propertyName,
+ title: property.title ?? '',
+ description: property.description ?? '',
+ type: fieldType,
+ };
+ }
+
+ return outputsAccumulator;
+ },
+ {} as Record
+ );
+ }
+
+ const invocation: InvocationTemplate = {
+ title,
+ type,
+ tags: schema.ui?.tags ?? [],
+ description: schema.description ?? '',
+ inputs,
+ outputs,
+ };
+
+ Object.assign(acc, { [type]: invocation });
+
return acc;
}, {});
diff --git a/invokeai/frontend/web/src/features/system/store/systemSlice.ts b/invokeai/frontend/web/src/features/system/store/systemSlice.ts
index fe6cf7386a..2de0f75963 100644
--- a/invokeai/frontend/web/src/features/system/store/systemSlice.ts
+++ b/invokeai/frontend/web/src/features/system/store/systemSlice.ts
@@ -4,7 +4,6 @@ import * as InvokeAI from 'app/types/invokeai';
import { InvokeLogLevel } from 'app/logging/useLogger';
import { userInvoked } from 'app/store/actions';
-import { parsedOpenAPISchema } from 'features/nodes/store/nodesSlice';
import { TFuncKey, t } from 'i18next';
import { LogLevelName } from 'roarr';
import {
@@ -26,6 +25,7 @@ import {
} from 'services/api/thunks/session';
import { makeToast } from '../../../app/components/Toaster';
import { LANGUAGES } from '../components/LanguagePicker';
+import { nodeTemplatesBuilt } from 'features/nodes/store/nodesSlice';
export type CancelStrategy = 'immediate' | 'scheduled';
@@ -382,7 +382,7 @@ export const systemSlice = createSlice({
/**
* OpenAPI schema was parsed
*/
- builder.addCase(parsedOpenAPISchema, (state) => {
+ builder.addCase(nodeTemplatesBuilt, (state) => {
state.wasSchemaParsed = true;
});
diff --git a/invokeai/frontend/web/src/services/api/schema.d.ts b/invokeai/frontend/web/src/services/api/schema.d.ts
index ce27f4ebcb..164de579bb 100644
--- a/invokeai/frontend/web/src/services/api/schema.d.ts
+++ b/invokeai/frontend/web/src/services/api/schema.d.ts
@@ -2917,7 +2917,7 @@ export type components = {
/** ModelsList */
ModelsList: {
/** Models */
- models: (components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"])[];
+ models: (components["schemas"]["StableDiffusion1ModelDiffusersConfig"] | components["schemas"]["StableDiffusion1ModelCheckpointConfig"] | components["schemas"]["VaeModelConfig"] | components["schemas"]["LoRAModelConfig"] | components["schemas"]["ControlNetModelConfig"] | components["schemas"]["TextualInversionModelConfig"] | components["schemas"]["StableDiffusion2ModelDiffusersConfig"] | components["schemas"]["StableDiffusion2ModelCheckpointConfig"])[];
};
/**
* MultiplyInvocation
@@ -4177,18 +4177,18 @@ export type components = {
*/
image?: components["schemas"]["ImageField"];
};
- /**
- * StableDiffusion2ModelFormat
- * @description An enumeration.
- * @enum {string}
- */
- StableDiffusion2ModelFormat: "checkpoint" | "diffusers";
/**
* StableDiffusion1ModelFormat
* @description An enumeration.
* @enum {string}
*/
StableDiffusion1ModelFormat: "checkpoint" | "diffusers";
+ /**
+ * StableDiffusion2ModelFormat
+ * @description An enumeration.
+ * @enum {string}
+ */
+ StableDiffusion2ModelFormat: "checkpoint" | "diffusers";
};
responses: never;
parameters: never;
diff --git a/invokeai/frontend/web/src/services/api/thunks/schema.ts b/invokeai/frontend/web/src/services/api/thunks/schema.ts
index bc93fa0fae..b63a78943b 100644
--- a/invokeai/frontend/web/src/services/api/thunks/schema.ts
+++ b/invokeai/frontend/web/src/services/api/thunks/schema.ts
@@ -1,20 +1,45 @@
+import SwaggerParser from '@apidevtools/swagger-parser';
import { createAsyncThunk } from '@reduxjs/toolkit';
import { log } from 'app/logging/useLogger';
-import { parsedOpenAPISchema } from 'features/nodes/store/nodesSlice';
import { OpenAPIV3 } from 'openapi-types';
const schemaLog = log.child({ namespace: 'schema' });
+function getCircularReplacer() {
+ const ancestors: Record[] = [];
+ return function (key: string, value: any) {
+ if (typeof value !== 'object' || value === null) {
+ return value;
+ }
+ // `this` is the object that value is contained in,
+ // i.e., its direct parent.
+ // @ts-ignore
+ while (ancestors.length > 0 && ancestors.at(-1) !== this) {
+ ancestors.pop();
+ }
+ if (ancestors.includes(value)) {
+ return '[Circular]';
+ }
+ ancestors.push(value);
+ return value;
+ };
+}
+
export const receivedOpenAPISchema = createAsyncThunk(
'nodes/receivedOpenAPISchema',
- async (_, { dispatch }): Promise => {
- const response = await fetch(`openapi.json`);
- const openAPISchema = await response.json();
+ async (_, { dispatch, rejectWithValue }) => {
+ try {
+ const dereferencedSchema = (await SwaggerParser.dereference(
+ 'openapi.json'
+ )) as OpenAPIV3.Document;
- schemaLog.info({ openAPISchema }, 'Received OpenAPI schema');
+ const schemaJSON = JSON.parse(
+ JSON.stringify(dereferencedSchema, getCircularReplacer())
+ );
- dispatch(parsedOpenAPISchema(openAPISchema as OpenAPIV3.Document));
-
- return openAPISchema;
+ return schemaJSON;
+ } catch (error) {
+ return rejectWithValue({ error });
+ }
}
);
diff --git a/invokeai/frontend/web/src/services/api/types.d.ts b/invokeai/frontend/web/src/services/api/types.d.ts
index 910e73d885..5fa6870bc3 100644
--- a/invokeai/frontend/web/src/services/api/types.d.ts
+++ b/invokeai/frontend/web/src/services/api/types.d.ts
@@ -1,7 +1,14 @@
+import { O } from 'ts-toolbelt';
import { components } from './schema';
type schemas = components['schemas'];
+/**
+ * Helper type to extract the invocation type from the schema.
+ * Also flags the `type` property as required.
+ */
+type Invocation = O.Required;
+
/**
* Types from the API, re-exported from the types generated by `openapi-typescript`.
*/
@@ -31,42 +38,42 @@ export type Edge = schemas['Edge'];
export type GraphExecutionState = schemas['GraphExecutionState'];
// General nodes
-export type CollectInvocation = schemas['CollectInvocation'];
-export type IterateInvocation = schemas['IterateInvocation'];
-export type RangeInvocation = schemas['RangeInvocation'];
-export type RandomRangeInvocation = schemas['RandomRangeInvocation'];
-export type RangeOfSizeInvocation = schemas['RangeOfSizeInvocation'];
-export type InpaintInvocation = schemas['InpaintInvocation'];
-export type ImageResizeInvocation = schemas['ImageResizeInvocation'];
-export type RandomIntInvocation = schemas['RandomIntInvocation'];
-export type CompelInvocation = schemas['CompelInvocation'];
+export type CollectInvocation = Invocation<'CollectInvocation'>;
+export type IterateInvocation = Invocation<'IterateInvocation'>;
+export type RangeInvocation = Invocation<'RangeInvocation'>;
+export type RandomRangeInvocation = Invocation<'RandomRangeInvocation'>;
+export type RangeOfSizeInvocation = Invocation<'RangeOfSizeInvocation'>;
+export type InpaintInvocation = Invocation<'InpaintInvocation'>;
+export type ImageResizeInvocation = Invocation<'ImageResizeInvocation'>;
+export type RandomIntInvocation = Invocation<'RandomIntInvocation'>;
+export type CompelInvocation = Invocation<'CompelInvocation'>;
// ControlNet Nodes
-export type ControlNetInvocation = schemas['ControlNetInvocation'];
+export type ControlNetInvocation = Invocation<'ControlNetInvocation'>;
export type CannyImageProcessorInvocation =
- schemas['CannyImageProcessorInvocation'];
+ Invocation<'CannyImageProcessorInvocation'>;
export type ContentShuffleImageProcessorInvocation =
- schemas['ContentShuffleImageProcessorInvocation'];
+ Invocation<'ContentShuffleImageProcessorInvocation'>;
export type HedImageProcessorInvocation =
- schemas['HedImageProcessorInvocation'];
+ Invocation<'HedImageProcessorInvocation'>;
export type LineartAnimeImageProcessorInvocation =
- schemas['LineartAnimeImageProcessorInvocation'];
+ Invocation<'LineartAnimeImageProcessorInvocation'>;
export type LineartImageProcessorInvocation =
- schemas['LineartImageProcessorInvocation'];
+ Invocation<'LineartImageProcessorInvocation'>;
export type MediapipeFaceProcessorInvocation =
- schemas['MediapipeFaceProcessorInvocation'];
+ Invocation<'MediapipeFaceProcessorInvocation'>;
export type MidasDepthImageProcessorInvocation =
- schemas['MidasDepthImageProcessorInvocation'];
+ Invocation<'MidasDepthImageProcessorInvocation'>;
export type MlsdImageProcessorInvocation =
- schemas['MlsdImageProcessorInvocation'];
+ Invocation<'MlsdImageProcessorInvocation'>;
export type NormalbaeImageProcessorInvocation =
- schemas['NormalbaeImageProcessorInvocation'];
+ Invocation<'NormalbaeImageProcessorInvocation'>;
export type OpenposeImageProcessorInvocation =
- schemas['OpenposeImageProcessorInvocation'];
+ Invocation<'OpenposeImageProcessorInvocation'>;
export type PidiImageProcessorInvocation =
- schemas['PidiImageProcessorInvocation'];
+ Invocation<'PidiImageProcessorInvocation'>;
export type ZoeDepthImageProcessorInvocation =
- schemas['ZoeDepthImageProcessorInvocation'];
+ Invocation<'ZoeDepthImageProcessorInvocation'>;
// Node Outputs
export type ImageOutput = schemas['ImageOutput'];
diff --git a/invokeai/frontend/web/tsconfig.node.json b/invokeai/frontend/web/tsconfig.node.json
index 4b04192240..3fa58ad1d1 100644
--- a/invokeai/frontend/web/tsconfig.node.json
+++ b/invokeai/frontend/web/tsconfig.node.json
@@ -9,6 +9,7 @@
"vite.config.ts",
"./config/vite.app.config.ts",
"./config/vite.package.config.ts",
- "./config/vite.common.config.ts"
+ "./config/vite.common.config.ts",
+ "./config/common.ts"
]
}
diff --git a/invokeai/frontend/web/yarn.lock b/invokeai/frontend/web/yarn.lock
index 45bdf25fae..bdd20af86a 100644
--- a/invokeai/frontend/web/yarn.lock
+++ b/invokeai/frontend/web/yarn.lock
@@ -2,6 +2,15 @@
# yarn lockfile v1
+"@apidevtools/json-schema-ref-parser@9.0.6":
+ version "9.0.6"
+ resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz#5d9000a3ac1fd25404da886da6b266adcd99cf1c"
+ integrity sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==
+ dependencies:
+ "@jsdevtools/ono" "^7.1.3"
+ call-me-maybe "^1.0.1"
+ js-yaml "^3.13.1"
+
"@apidevtools/json-schema-ref-parser@9.0.9":
version "9.0.9"
resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz#d720f9256e3609621280584f2b47ae165359268b"
@@ -12,6 +21,29 @@
call-me-maybe "^1.0.1"
js-yaml "^4.1.0"
+"@apidevtools/openapi-schemas@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz#9fa08017fb59d80538812f03fc7cac5992caaa17"
+ integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==
+
+"@apidevtools/swagger-methods@^3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267"
+ integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==
+
+"@apidevtools/swagger-parser@^10.1.0":
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.1.0.tgz#a987d71e5be61feb623203be0c96e5985b192ab6"
+ integrity sha512-9Kt7EuS/7WbMAUv2gSziqjvxwDbFSg3Xeyfuj5laUODX8o/k/CpsAKiQ8W7/R88eXFTMbJYg6+7uAmOWNKmwnw==
+ dependencies:
+ "@apidevtools/json-schema-ref-parser" "9.0.6"
+ "@apidevtools/openapi-schemas" "^2.1.0"
+ "@apidevtools/swagger-methods" "^3.0.2"
+ "@jsdevtools/ono" "^7.1.3"
+ ajv "^8.6.3"
+ ajv-draft-04 "^1.0.0"
+ call-me-maybe "^1.0.1"
+
"@babel/code-frame@^7.0.0":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658"
@@ -1589,6 +1621,15 @@
globalthis "^1.0.2"
liqe "^3.6.0"
+"@rollup/plugin-inject@^5.0.3":
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz#0783711efd93a9547d52971db73b2fb6140a67b1"
+ integrity sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==
+ dependencies:
+ "@rollup/pluginutils" "^5.0.1"
+ estree-walker "^2.0.2"
+ magic-string "^0.27.0"
+
"@rollup/pluginutils@^4.2.1":
version "4.2.1"
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d"
@@ -1597,7 +1638,7 @@
estree-walker "^2.0.1"
picomatch "^2.2.2"
-"@rollup/pluginutils@^5.0.2":
+"@rollup/pluginutils@^5.0.1", "@rollup/pluginutils@^5.0.2":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33"
integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==
@@ -2228,6 +2269,11 @@ aggregate-error@^3.0.0:
clean-stack "^2.0.0"
indent-string "^4.0.0"
+ajv-draft-04@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8"
+ integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==
+
ajv@^6.10.0, ajv@^6.11.0, ajv@^6.12.4, ajv@~6.12.6:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
@@ -2238,6 +2284,16 @@ ajv@^6.10.0, ajv@^6.11.0, ajv@^6.12.4, ajv@~6.12.6:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
+ajv@^8.6.3:
+ version "8.12.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1"
+ integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+ uri-js "^4.2.2"
+
ansi-colors@^4.1.3:
version "4.1.3"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
@@ -2297,18 +2353,18 @@ app-module-path@^2.2.0:
resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5"
integrity sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==
-argparse@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
- integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-
-argparse@~1.0.9:
+argparse@^1.0.7, argparse@~1.0.9:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
dependencies:
sprintf-js "~1.0.2"
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
aria-hidden@^1.1.3, aria-hidden@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.3.tgz#14aeb7fb692bbb72d69bebfa47279c1fd725e954"
@@ -2361,6 +2417,26 @@ array.prototype.tosorted@^1.1.1:
es-shim-unscopables "^1.0.0"
get-intrinsic "^1.1.3"
+asn1.js@^5.2.0:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+assert@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32"
+ integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==
+ dependencies:
+ es6-object-assign "^1.1.0"
+ is-nan "^1.2.1"
+ object-is "^1.0.1"
+ util "^0.12.0"
+
ast-module-types@^2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-2.7.1.tgz#3f7989ef8dfa1fdb82dfe0ab02bdfc7c77a57dd3"
@@ -2451,6 +2527,16 @@ bl@^4.1.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
+ version "4.12.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.0.0, bn.js@^5.1.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
+ integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
+
boolean@^3.1.4:
version "3.2.0"
resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
@@ -2478,12 +2564,90 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
+brorand@^1.0.1, brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
+
+browser-resolve@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b"
+ integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==
+ dependencies:
+ resolve "^1.17.0"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
+ integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+ dependencies:
+ bn.js "^5.0.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
+ integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ dependencies:
+ bn.js "^5.1.1"
+ browserify-rsa "^4.0.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ elliptic "^6.5.3"
+ inherits "^2.0.4"
+ parse-asn1 "^5.1.5"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
+ dependencies:
+ pako "~1.0.5"
+
buffer-from@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-buffer@^5.5.0:
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==
+
+buffer@^5.5.0, buffer@^5.7.1:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
@@ -2491,6 +2655,11 @@ buffer@^5.5.0:
base64-js "^1.3.1"
ieee754 "^1.1.13"
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+ integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==
+
busboy@^1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
@@ -2576,6 +2745,14 @@ ci-info@^3.7.0:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91"
integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
classcat@^5.0.3, classcat@^5.0.4:
version "5.0.4"
resolved "https://registry.yarnpkg.com/classcat/-/classcat-5.0.4.tgz#e12d1dfe6df6427f260f03b80dc63571a5107ba6"
@@ -2776,6 +2953,16 @@ concurrently@^8.2.0:
tree-kill "^1.2.2"
yargs "^17.7.2"
+console-browserify@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
+ integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+ integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==
+
convert-source-map@^1.5.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
@@ -2799,6 +2986,42 @@ cosmiconfig@^7.0.0:
path-type "^4.0.0"
yaml "^1.10.0"
+create-ecdh@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
+ integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+create-require@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+ integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
cross-fetch@3.1.6:
version "3.1.6"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c"
@@ -2815,6 +3038,23 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
css-box-model@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1"
@@ -2989,6 +3229,14 @@ dependency-tree@^9.0.0:
precinct "^9.0.0"
typescript "^4.0.0"
+des.js@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da"
+ integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
detect-node-es@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493"
@@ -3139,6 +3387,15 @@ detective-typescript@^9.0.0, detective-typescript@^9.1.1:
node-source-walk "^5.0.1"
typescript "^4.9.5"
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@@ -3165,6 +3422,11 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
+domain-browser@^4.22.0:
+ version "4.22.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.22.0.tgz#6ddd34220ec281f9a65d3386d267ddd35c491f9f"
+ integrity sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==
+
downshift@^7.6.0:
version "7.6.0"
resolved "https://registry.yarnpkg.com/downshift/-/downshift-7.6.0.tgz#de04fb2962bd6c4ea94589c797c91f34aa9816f3"
@@ -3181,6 +3443,19 @@ eastasianwidth@^0.2.0:
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+elliptic@^6.5.3:
+ version "6.5.4"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
@@ -3294,6 +3569,11 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
+es6-object-assign@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
+ integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==
+
esbuild@^0.17.18, esbuild@^0.17.5:
version "0.17.19"
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955"
@@ -3506,6 +3786,19 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+events@^3.0.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
execa@^7.0.0:
version "7.1.1"
resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43"
@@ -4001,6 +4294,32 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
@@ -4015,6 +4334,11 @@ html-parse-stringify@^3.0.1:
dependencies:
void-elements "3.1.0"
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+ integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==
+
human-signals@^4.3.0:
version "4.3.1"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
@@ -4102,7 +4426,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@^2.0.3, inherits@^2.0.4:
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -4136,6 +4460,14 @@ invariant@^2.2.4:
dependencies:
loose-envify "^1.0.0"
+is-arguments@^1.0.4:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
+ integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
@@ -4216,6 +4548,13 @@ is-fullwidth-code-point@^4.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88"
integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
+is-generator-function@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
+ integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
is-glob@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@@ -4242,6 +4581,14 @@ is-invalid-path@^0.1.0:
dependencies:
is-glob "^2.0.0"
+is-nan@^1.2.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d"
+ integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+
is-negative-zero@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
@@ -4313,7 +4660,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
dependencies:
has-symbols "^1.0.2"
-is-typed-array@^1.1.10, is-typed-array@^1.1.9:
+is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9:
version "1.1.10"
resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f"
integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==
@@ -4365,6 +4712,11 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+isomorphic-timers-promises@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz#e4137c24dbc54892de8abae3a4b5c1ffff381598"
+ integrity sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==
+
its-fine@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/its-fine/-/its-fine-1.1.1.tgz#e74b93fddd487441f978a50f64f0f5af4d2fc38e"
@@ -4387,6 +4739,14 @@ js-cookie@^2.2.1:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
js-yaml@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
@@ -4411,6 +4771,11 @@ json-schema-traverse@^0.4.1:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
@@ -4635,6 +5000,13 @@ madge@^6.1.0:
ts-graphviz "^1.5.0"
walkdir "^0.4.1"
+magic-string@^0.27.0:
+ version "0.27.0"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3"
+ integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.13"
+
magic-string@^0.29.0:
version "0.29.0"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.29.0.tgz#f034f79f8c43dba4ae1730ffb5e8c4e084b16cf3"
@@ -4642,6 +5014,15 @@ magic-string@^0.29.0:
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.13"
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
mdn-data@2.0.14:
version "2.0.14"
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
@@ -4665,6 +5046,14 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5:
braces "^3.0.2"
picomatch "^2.3.1"
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
@@ -4687,6 +5076,16 @@ mimic-fn@^4.0.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
+
minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
@@ -4818,6 +5217,39 @@ node-source-walk@^5.0.0, node-source-walk@^5.0.1:
dependencies:
"@babel/parser" "^7.21.4"
+node-stdlib-browser@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz#5ddcfdf4063b88fb282979a1aa6ddab9728d5e4c"
+ integrity sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==
+ dependencies:
+ assert "^2.0.0"
+ browser-resolve "^2.0.0"
+ browserify-zlib "^0.2.0"
+ buffer "^5.7.1"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ create-require "^1.1.1"
+ crypto-browserify "^3.11.0"
+ domain-browser "^4.22.0"
+ events "^3.0.0"
+ https-browserify "^1.0.0"
+ isomorphic-timers-promises "^1.0.1"
+ os-browserify "^0.3.0"
+ path-browserify "^1.0.1"
+ pkg-dir "^5.0.0"
+ process "^0.11.10"
+ punycode "^1.4.1"
+ querystring-es3 "^0.2.1"
+ readable-stream "^3.6.0"
+ stream-browserify "^3.0.0"
+ stream-http "^3.2.0"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.1"
+ url "^0.11.0"
+ util "^0.12.4"
+ vm-browserify "^1.0.1"
+
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@@ -4840,6 +5272,14 @@ object-inspect@^1.12.3, object-inspect@^1.9.0:
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
+object-is@^1.0.1:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
@@ -5000,6 +5440,11 @@ ora@^5.4.1:
strip-ansi "^6.0.0"
wcwidth "^1.0.1"
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+ integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==
+
os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
@@ -5036,6 +5481,11 @@ p-map@^4.0.0:
dependencies:
aggregate-error "^3.0.0"
+pako@~1.0.5:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+ integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -5043,6 +5493,17 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
+ integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+ dependencies:
+ asn1.js "^5.2.0"
+ browserify-aes "^1.0.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+ safe-buffer "^5.1.1"
+
parse-json@^5.0.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
@@ -5113,6 +5574,17 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+pbkdf2@^3.0.3:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
@@ -5128,6 +5600,13 @@ pidtree@^0.6.0:
resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c"
integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==
+pkg-dir@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760"
+ integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==
+ dependencies:
+ find-up "^5.0.0"
+
pluralize@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
@@ -5231,6 +5710,11 @@ pretty-ms@^7.0.1:
dependencies:
parse-ms "^2.1.0"
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
+
prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
@@ -5245,11 +5729,35 @@ proxy-from-env@^1.1.0:
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+public-encrypt@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+ integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+ safe-buffer "^5.1.2"
+
+punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+ integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==
+
punycode@^2.1.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
+qs@^6.11.0:
+ version "6.11.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9"
+ integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==
+ dependencies:
+ side-channel "^1.0.4"
+
query-string@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-8.1.0.tgz#e7f95367737219544cd360a11a4f4ca03836e115"
@@ -5259,6 +5767,11 @@ query-string@^8.1.0:
filter-obj "^5.1.0"
split-on-first "^3.0.0"
+querystring-es3@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+ integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==
+
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
@@ -5282,6 +5795,21 @@ randexp@0.4.6:
discontinuous-range "1.0.0"
ret "~0.1.10"
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
rc@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
@@ -5507,7 +6035,7 @@ reactflow@^11.7.4:
"@reactflow/node-resizer" "2.1.1"
"@reactflow/node-toolbar" "1.2.3"
-readable-stream@^3.4.0:
+readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
@@ -5564,6 +6092,11 @@ require-directory@^2.1.1:
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
requirejs-config-file@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz#4244da5dd1f59874038cc1091d078d620abb6ebc"
@@ -5597,7 +6130,7 @@ resolve-from@^4.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-resolve@^1.19.0, resolve@^1.21.0, resolve@~1.22.1:
+resolve@^1.17.0, resolve@^1.19.0, resolve@^1.21.0, resolve@~1.22.1:
version "1.22.2"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f"
integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
@@ -5660,6 +6193,14 @@ rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
roarr@^7.15.0:
version "7.15.0"
resolved "https://registry.yarnpkg.com/roarr/-/roarr-7.15.0.tgz#09b792f0cd31b4a7f91030bb1c47550ceec98ee4"
@@ -5717,7 +6258,7 @@ rxjs@^7.8.0, rxjs@^7.8.1:
dependencies:
tslib "^2.1.0"
-safe-buffer@~5.2.0:
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -5736,6 +6277,11 @@ safe-stable-stringify@^2.4.1:
resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886"
integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==
+safer-buffer@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
sass-lookup@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/sass-lookup/-/sass-lookup-3.0.0.tgz#3b395fa40569738ce857bc258e04df2617c48cac"
@@ -5796,6 +6342,19 @@ set-harmonic-interval@^1.0.1:
resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249"
integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -5963,6 +6522,24 @@ stacktrace-js@^2.0.2:
stack-generator "^2.0.5"
stacktrace-gps "^3.0.4"
+stream-browserify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f"
+ integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==
+ dependencies:
+ inherits "~2.0.4"
+ readable-stream "^3.5.0"
+
+stream-http@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5"
+ integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ xtend "^4.0.2"
+
stream-to-array@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/stream-to-array/-/stream-to-array-2.3.0.tgz#bbf6b39f5f43ec30bc71babcb37557acecf34353"
@@ -6044,7 +6621,7 @@ string.prototype.trimstart@^1.0.6:
define-properties "^1.1.4"
es-abstract "^1.20.4"
-string_decoder@^1.1.1:
+string_decoder@^1.0.0, string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
@@ -6173,6 +6750,13 @@ through@^2.3.8:
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+timers-browserify@^2.0.4:
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee"
+ integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==
+ dependencies:
+ setimmediate "^1.0.4"
+
tiny-invariant@^1.0.6:
version "1.3.1"
resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642"
@@ -6282,6 +6866,11 @@ tsutils@^3.21.0:
dependencies:
tslib "^1.8.1"
+tty-browserify@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
+ integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==
+
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@@ -6379,6 +6968,14 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
+url@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.1.tgz#26f90f615427eca1b9f4d6a28288c147e2302a32"
+ integrity sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==
+ dependencies:
+ punycode "^1.4.1"
+ qs "^6.11.0"
+
use-callback-ref@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5"
@@ -6426,6 +7023,17 @@ util-deprecate@^1.0.1:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+util@^0.12.0, util@^0.12.4:
+ version "0.12.5"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc"
+ integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==
+ dependencies:
+ inherits "^2.0.3"
+ is-arguments "^1.0.4"
+ is-generator-function "^1.0.7"
+ is-typed-array "^1.1.3"
+ which-typed-array "^1.1.2"
+
uuid@^9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
@@ -6466,6 +7074,14 @@ vite-plugin-eslint@^1.8.1:
"@types/eslint" "^8.4.5"
rollup "^2.77.2"
+vite-plugin-node-polyfills@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.9.0.tgz#181d096c43e22cae219c6c2434a204b665044de0"
+ integrity sha512-+i+WPUuIBhJy+ODfxx6S6FTl28URCxUszbl/IL4GwrZvbqqY/8VDIp+zpjMS8Us/a7GwN4Iaqr/fVIBtkNQojQ==
+ dependencies:
+ "@rollup/plugin-inject" "^5.0.3"
+ node-stdlib-browser "^1.2.0"
+
vite-tsconfig-paths@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz#bd2647d3eadafb65a10fc98a2ca565211f2eaf63"
@@ -6486,6 +7102,11 @@ vite@^4.3.9:
optionalDependencies:
fsevents "~2.3.2"
+vm-browserify@^1.0.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
+ integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
+
void-elements@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09"
@@ -6527,7 +7148,7 @@ which-boxed-primitive@^1.0.2:
is-string "^1.0.5"
is-symbol "^1.0.3"
-which-typed-array@^1.1.9:
+which-typed-array@^1.1.2, which-typed-array@^1.1.9:
version "1.1.9"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6"
integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==
@@ -6589,6 +7210,11 @@ xmlhttprequest-ssl@~2.0.0:
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67"
integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==
+xtend@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
From 8d43cf92f6fdadbeede26aa66845d4f1ce1a1904 Mon Sep 17 00:00:00 2001
From: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
Date: Mon, 26 Jun 2023 12:00:38 +1000
Subject: [PATCH 2/7] feat(ui): update action santizer for schema actions
---
.../middleware/devtools/actionSanitizer.ts | 28 +++++++++++--------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts b/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts
index 227b15d6f8..143b16594c 100644
--- a/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts
+++ b/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts
@@ -1,6 +1,7 @@
import { AnyAction } from '@reduxjs/toolkit';
import { isAnyGraphBuilt } from 'features/nodes/store/actions';
-import { forEach } from 'lodash-es';
+import { nodeTemplatesBuilt } from 'features/nodes/store/nodesSlice';
+import { receivedOpenAPISchema } from 'services/api/thunks/schema';
import { Graph } from 'services/api/types';
export const actionSanitizer = (action: A): A => {
@@ -8,17 +9,6 @@ export const actionSanitizer = (action: A): A => {
if (action.payload.nodes) {
const sanitizedNodes: Graph['nodes'] = {};
- // Sanitize nodes as needed
- forEach(action.payload.nodes, (node, key) => {
- // Don't log the whole freaking dataURL
- if (node.type === 'dataURL_image') {
- const { dataURL, ...rest } = node;
- sanitizedNodes[key] = { ...rest, dataURL: '' };
- } else {
- sanitizedNodes[key] = { ...node };
- }
- });
-
return {
...action,
payload: { ...action.payload, nodes: sanitizedNodes },
@@ -26,5 +16,19 @@ export const actionSanitizer = (action: A): A => {
}
}
+ if (receivedOpenAPISchema.fulfilled.match(action)) {
+ return {
+ ...action,
+ payload: '',
+ };
+ }
+
+ if (nodeTemplatesBuilt.match(action)) {
+ return {
+ ...action,
+ payload: '',
+ };
+ }
+
return action;
};
From 60780e990ddc9b926c54c80929e78d3926b14912 Mon Sep 17 00:00:00 2001
From: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
Date: Mon, 26 Jun 2023 12:03:11 +1000
Subject: [PATCH 3/7] fix(ui): fix controlnet image size
---
.../web/src/features/controlNet/components/ControlNet.tsx | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/invokeai/frontend/web/src/features/controlNet/components/ControlNet.tsx b/invokeai/frontend/web/src/features/controlNet/components/ControlNet.tsx
index 5b914446f0..9ed63fe64d 100644
--- a/invokeai/frontend/web/src/features/controlNet/components/ControlNet.tsx
+++ b/invokeai/frontend/web/src/features/controlNet/components/ControlNet.tsx
@@ -174,7 +174,10 @@ const ControlNet = (props: ControlNetProps) => {
aspectRatio: '1/1',
}}
>
-
+
)}
From 3a19be1606ece01e38e939a228ba2ca05cdd11ab Mon Sep 17 00:00:00 2001
From: blessedcoolant <54517381+blessedcoolant@users.noreply.github.com>
Date: Mon, 26 Jun 2023 17:37:47 +1200
Subject: [PATCH 4/7] fix: Add missing IAIMantineSelect disabled styles
---
.../frontend/web/src/common/components/IAIMantineSelect.tsx | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx
index a37cfc826c..5f02140904 100644
--- a/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx
+++ b/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx
@@ -34,6 +34,10 @@ const IAIMantineSelect = (props: IAISelectProps) => {
'&:focus': {
borderColor: 'var(--invokeai-colors-accent-600)',
},
+ '&:disabled': {
+ backgroundColor: 'var(--invokeai-colors-base-700)',
+ color: 'var(--invokeai-colors-base-400)',
+ },
},
dropdown: {
backgroundColor: 'var(--invokeai-colors-base-800)',
From 6390af229d8d025a2769a857fb80a30ff3e262ef Mon Sep 17 00:00:00 2001
From: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
Date: Mon, 26 Jun 2023 16:20:57 +1000
Subject: [PATCH 5/7] feat(ui): add dynamic prompts to t2i tab
- add param accordion for dynamic prompts
- update graphs
---
invokeai/frontend/web/src/app/store/store.ts | 4 +
.../frontend/web/src/app/types/invokeai.ts | 8 +
.../web/src/common/components/IAISwitch.tsx | 10 +-
.../ParamDynamicPromptsCollapse.tsx | 45 ++++++
.../ParamDynamicPromptsCombinatorial.tsx | 36 +++++
.../ParamDynamicPromptsMaxPrompts.tsx | 53 ++++++
.../dynamicPrompts/store/selectors.ts | 1 +
.../features/dynamicPrompts/store/slice.ts | 50 ++++++
.../nodes/util/addControlNetToLinearGraph.ts | 20 +--
.../graphBuilders/addDynamicPromptsToGraph.ts | 153 ++++++++++++++++++
.../buildCanvasImageToImageGraph.ts | 79 ++-------
.../graphBuilders/buildCanvasInpaintGraph.ts | 14 +-
.../buildCanvasTextToImageGraph.ts | 69 ++------
.../buildLinearImageToImageGraph.ts | 88 ++--------
.../buildLinearTextToImageGraph.ts | 92 ++---------
.../nodes/util/graphBuilders/constants.ts | 3 +-
.../util/nodeBuilders/buildCompelNode.ts | 26 ---
.../nodeBuilders/buildImageToImageNode.ts | 107 ------------
.../util/nodeBuilders/buildInpaintNode.ts | 48 ------
.../util/nodeBuilders/buildIterateNode.ts | 13 --
.../nodes/util/nodeBuilders/buildRangeNode.ts | 26 ---
.../util/nodeBuilders/buildTextToImageNode.ts | 45 ------
.../Parameters/Core/ParamIterations.tsx | 41 ++---
.../src/features/system/store/configSlice.ts | 8 +
.../ImageToImageTabParameters.tsx | 2 +
.../TextToImage/TextToImageTabParameters.tsx | 2 +
.../UnifiedCanvas/UnifiedCanvasParameters.tsx | 2 +
.../web/src/services/api/endpoints/images.ts | 1 +
.../frontend/web/src/services/api/types.d.ts | 9 ++
29 files changed, 479 insertions(+), 576 deletions(-)
create mode 100644 invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCollapse.tsx
create mode 100644 invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCombinatorial.tsx
create mode 100644 invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx
create mode 100644 invokeai/frontend/web/src/features/dynamicPrompts/store/selectors.ts
create mode 100644 invokeai/frontend/web/src/features/dynamicPrompts/store/slice.ts
create mode 100644 invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts
delete mode 100644 invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildCompelNode.ts
delete mode 100644 invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildImageToImageNode.ts
delete mode 100644 invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildInpaintNode.ts
delete mode 100644 invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildIterateNode.ts
delete mode 100644 invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildRangeNode.ts
delete mode 100644 invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildTextToImageNode.ts
diff --git a/invokeai/frontend/web/src/app/store/store.ts b/invokeai/frontend/web/src/app/store/store.ts
index 8202c4fa76..e92a422d68 100644
--- a/invokeai/frontend/web/src/app/store/store.ts
+++ b/invokeai/frontend/web/src/app/store/store.ts
@@ -22,6 +22,7 @@ import boardsReducer from 'features/gallery/store/boardSlice';
import configReducer from 'features/system/store/configSlice';
import hotkeysReducer from 'features/ui/store/hotkeysSlice';
import uiReducer from 'features/ui/store/uiSlice';
+import dynamicPromptsReducer from 'features/dynamicPrompts/store/slice';
import { listenerMiddleware } from './middleware/listenerMiddleware';
@@ -48,6 +49,7 @@ const allReducers = {
controlNet: controlNetReducer,
boards: boardsReducer,
// session: sessionReducer,
+ dynamicPrompts: dynamicPromptsReducer,
[api.reducerPath]: api.reducer,
};
@@ -65,6 +67,7 @@ const rememberedKeys: (keyof typeof allReducers)[] = [
'system',
'ui',
'controlNet',
+ 'dynamicPrompts',
// 'boards',
// 'hotkeys',
// 'config',
@@ -100,3 +103,4 @@ export type AppGetState = typeof store.getState;
export type RootState = ReturnType;
export type AppThunkDispatch = ThunkDispatch;
export type AppDispatch = typeof store.dispatch;
+export const stateSelector = (state: RootState) => state;
diff --git a/invokeai/frontend/web/src/app/types/invokeai.ts b/invokeai/frontend/web/src/app/types/invokeai.ts
index 4532783ae6..a89ba01130 100644
--- a/invokeai/frontend/web/src/app/types/invokeai.ts
+++ b/invokeai/frontend/web/src/app/types/invokeai.ts
@@ -171,6 +171,14 @@ export type AppConfig = {
fineStep: number;
coarseStep: number;
};
+ dynamicPrompts: {
+ maxPrompts: {
+ initial: number;
+ min: number;
+ sliderMax: number;
+ inputMax: number;
+ };
+ };
};
};
diff --git a/invokeai/frontend/web/src/common/components/IAISwitch.tsx b/invokeai/frontend/web/src/common/components/IAISwitch.tsx
index 33c46c4aeb..54a3b30a4f 100644
--- a/invokeai/frontend/web/src/common/components/IAISwitch.tsx
+++ b/invokeai/frontend/web/src/common/components/IAISwitch.tsx
@@ -41,7 +41,15 @@ const IAISwitch = (props: Props) => {
{...formControlProps}
>
{label && (
-
+
{label}
)}
diff --git a/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCollapse.tsx b/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCollapse.tsx
new file mode 100644
index 0000000000..eeaf1b81ec
--- /dev/null
+++ b/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCollapse.tsx
@@ -0,0 +1,45 @@
+import { createSelector } from '@reduxjs/toolkit';
+import { stateSelector } from 'app/store/store';
+import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
+import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
+import IAICollapse from 'common/components/IAICollapse';
+import { useCallback } from 'react';
+import { isEnabledToggled } from '../store/slice';
+import ParamDynamicPromptsMaxPrompts from './ParamDynamicPromptsMaxPrompts';
+import ParamDynamicPromptsCombinatorial from './ParamDynamicPromptsCombinatorial';
+import { Flex } from '@chakra-ui/react';
+
+const selector = createSelector(
+ stateSelector,
+ (state) => {
+ const { isEnabled } = state.dynamicPrompts;
+
+ return { isEnabled };
+ },
+ defaultSelectorOptions
+);
+
+const ParamDynamicPromptsCollapse = () => {
+ const dispatch = useAppDispatch();
+ const { isEnabled } = useAppSelector(selector);
+
+ const handleToggleIsEnabled = useCallback(() => {
+ dispatch(isEnabledToggled());
+ }, [dispatch]);
+
+ return (
+
+
+
+
+
+
+ );
+};
+
+export default ParamDynamicPromptsCollapse;
diff --git a/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCombinatorial.tsx b/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCombinatorial.tsx
new file mode 100644
index 0000000000..30c2240c37
--- /dev/null
+++ b/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsCombinatorial.tsx
@@ -0,0 +1,36 @@
+import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
+import { combinatorialToggled } from '../store/slice';
+import { createSelector } from '@reduxjs/toolkit';
+import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
+import { useCallback } from 'react';
+import { stateSelector } from 'app/store/store';
+import IAISwitch from 'common/components/IAISwitch';
+
+const selector = createSelector(
+ stateSelector,
+ (state) => {
+ const { combinatorial } = state.dynamicPrompts;
+
+ return { combinatorial };
+ },
+ defaultSelectorOptions
+);
+
+const ParamDynamicPromptsCombinatorial = () => {
+ const { combinatorial } = useAppSelector(selector);
+ const dispatch = useAppDispatch();
+
+ const handleChange = useCallback(() => {
+ dispatch(combinatorialToggled());
+ }, [dispatch]);
+
+ return (
+
+ );
+};
+
+export default ParamDynamicPromptsCombinatorial;
diff --git a/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx b/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx
new file mode 100644
index 0000000000..ab56abaa35
--- /dev/null
+++ b/invokeai/frontend/web/src/features/dynamicPrompts/components/ParamDynamicPromptsMaxPrompts.tsx
@@ -0,0 +1,53 @@
+import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
+import IAISlider from 'common/components/IAISlider';
+import { maxPromptsChanged, maxPromptsReset } from '../store/slice';
+import { createSelector } from '@reduxjs/toolkit';
+import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
+import { useCallback } from 'react';
+import { stateSelector } from 'app/store/store';
+
+const selector = createSelector(
+ stateSelector,
+ (state) => {
+ const { maxPrompts } = state.dynamicPrompts;
+ const { min, sliderMax, inputMax } =
+ state.config.sd.dynamicPrompts.maxPrompts;
+
+ return { maxPrompts, min, sliderMax, inputMax };
+ },
+ defaultSelectorOptions
+);
+
+const ParamDynamicPromptsMaxPrompts = () => {
+ const { maxPrompts, min, sliderMax, inputMax } = useAppSelector(selector);
+ const dispatch = useAppDispatch();
+
+ const handleChange = useCallback(
+ (v: number) => {
+ dispatch(maxPromptsChanged(v));
+ },
+ [dispatch]
+ );
+
+ const handleReset = useCallback(() => {
+ dispatch(maxPromptsReset());
+ }, [dispatch]);
+
+ return (
+
+ );
+};
+
+export default ParamDynamicPromptsMaxPrompts;
diff --git a/invokeai/frontend/web/src/features/dynamicPrompts/store/selectors.ts b/invokeai/frontend/web/src/features/dynamicPrompts/store/selectors.ts
new file mode 100644
index 0000000000..8337712ea5
--- /dev/null
+++ b/invokeai/frontend/web/src/features/dynamicPrompts/store/selectors.ts
@@ -0,0 +1 @@
+//
diff --git a/invokeai/frontend/web/src/features/dynamicPrompts/store/slice.ts b/invokeai/frontend/web/src/features/dynamicPrompts/store/slice.ts
new file mode 100644
index 0000000000..8c33feb20c
--- /dev/null
+++ b/invokeai/frontend/web/src/features/dynamicPrompts/store/slice.ts
@@ -0,0 +1,50 @@
+import { PayloadAction, createSlice } from '@reduxjs/toolkit';
+import { RootState } from 'app/store/store';
+
+export interface DynamicPromptsState {
+ isEnabled: boolean;
+ maxPrompts: number;
+ combinatorial: boolean;
+}
+
+export const initialDynamicPromptsState: DynamicPromptsState = {
+ isEnabled: false,
+ maxPrompts: 100,
+ combinatorial: true,
+};
+
+const initialState: DynamicPromptsState = initialDynamicPromptsState;
+
+export const dynamicPromptsSlice = createSlice({
+ name: 'dynamicPrompts',
+ initialState,
+ reducers: {
+ maxPromptsChanged: (state, action: PayloadAction) => {
+ state.maxPrompts = action.payload;
+ },
+ maxPromptsReset: (state) => {
+ state.maxPrompts = initialDynamicPromptsState.maxPrompts;
+ },
+ combinatorialToggled: (state) => {
+ state.combinatorial = !state.combinatorial;
+ },
+ isEnabledToggled: (state) => {
+ state.isEnabled = !state.isEnabled;
+ },
+ },
+ extraReducers: (builder) => {
+ //
+ },
+});
+
+export const {
+ isEnabledToggled,
+ maxPromptsChanged,
+ maxPromptsReset,
+ combinatorialToggled,
+} = dynamicPromptsSlice.actions;
+
+export default dynamicPromptsSlice.reducer;
+
+export const dynamicPromptsSelector = (state: RootState) =>
+ state.dynamicPrompts;
diff --git a/invokeai/frontend/web/src/features/nodes/util/addControlNetToLinearGraph.ts b/invokeai/frontend/web/src/features/nodes/util/addControlNetToLinearGraph.ts
index 13dd1f6ffc..11ceb23763 100644
--- a/invokeai/frontend/web/src/features/nodes/util/addControlNetToLinearGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/addControlNetToLinearGraph.ts
@@ -1,5 +1,5 @@
import { RootState } from 'app/store/store';
-import { filter, forEach, size } from 'lodash-es';
+import { filter } from 'lodash-es';
import { CollectInvocation, ControlNetInvocation } from 'services/api/types';
import { NonNullableGraph } from '../types/types';
import { CONTROL_NET_COLLECT } from './graphBuilders/constants';
@@ -19,9 +19,9 @@ export const addControlNetToLinearGraph = (
(c.processorType === 'none' && Boolean(c.controlImage)))
);
- // Add ControlNet
- if (isControlNetEnabled && validControlNets.length > 0) {
- if (size(controlNets) > 1) {
+ if (isControlNetEnabled && Boolean(validControlNets.length)) {
+ if (validControlNets.length > 1) {
+ // We have multiple controlnets, add ControlNet collector
const controlNetIterateNode: CollectInvocation = {
id: CONTROL_NET_COLLECT,
type: 'collect',
@@ -36,10 +36,9 @@ export const addControlNetToLinearGraph = (
});
}
- forEach(controlNets, (controlNet) => {
+ validControlNets.forEach((controlNet) => {
const {
controlNetId,
- isEnabled,
controlImage,
processedControlImage,
beginStepPct,
@@ -50,11 +49,6 @@ export const addControlNetToLinearGraph = (
weight,
} = controlNet;
- if (!isEnabled) {
- // Skip disabled ControlNets
- return;
- }
-
const controlNetNode: ControlNetInvocation = {
id: `control_net_${controlNetId}`,
type: 'controlnet',
@@ -82,7 +76,8 @@ export const addControlNetToLinearGraph = (
graph.nodes[controlNetNode.id] = controlNetNode;
- if (size(controlNets) > 1) {
+ if (validControlNets.length > 1) {
+ // if we have multiple controlnets, link to the collector
graph.edges.push({
source: { node_id: controlNetNode.id, field: 'control' },
destination: {
@@ -91,6 +86,7 @@ export const addControlNetToLinearGraph = (
},
});
} else {
+ // otherwise, link directly to the base node
graph.edges.push({
source: { node_id: controlNetNode.id, field: 'control' },
destination: {
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts
new file mode 100644
index 0000000000..23abb815a9
--- /dev/null
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts
@@ -0,0 +1,153 @@
+import { RootState } from 'app/store/store';
+import { NonNullableGraph } from 'features/nodes/types/types';
+import {
+ DynamicPromptInvocation,
+ IterateInvocation,
+ NoiseInvocation,
+ RandomIntInvocation,
+ RangeOfSizeInvocation,
+} from 'services/api/types';
+import {
+ DYNAMIC_PROMPT,
+ ITERATE,
+ NOISE,
+ POSITIVE_CONDITIONING,
+ RANDOM_INT,
+ RANGE_OF_SIZE,
+} from './constants';
+import { unset } from 'lodash-es';
+
+export const addDynamicPromptsToGraph = (
+ graph: NonNullableGraph,
+ state: RootState
+): void => {
+ const { positivePrompt, iterations, seed, shouldRandomizeSeed } =
+ state.generation;
+
+ const {
+ combinatorial,
+ isEnabled: isDynamicPromptsEnabled,
+ maxPrompts,
+ } = state.dynamicPrompts;
+
+ if (isDynamicPromptsEnabled) {
+ // iteration is handled via dynamic prompts
+ unset(graph.nodes[POSITIVE_CONDITIONING], 'prompt');
+
+ const dynamicPromptNode: DynamicPromptInvocation = {
+ id: DYNAMIC_PROMPT,
+ type: 'dynamic_prompt',
+ max_prompts: maxPrompts,
+ combinatorial,
+ prompt: positivePrompt,
+ };
+
+ const iterateNode: IterateInvocation = {
+ id: ITERATE,
+ type: 'iterate',
+ };
+
+ graph.nodes[DYNAMIC_PROMPT] = dynamicPromptNode;
+ graph.nodes[ITERATE] = iterateNode;
+
+ // connect dynamic prompts to compel nodes
+ graph.edges.push(
+ {
+ source: {
+ node_id: DYNAMIC_PROMPT,
+ field: 'prompt_collection',
+ },
+ destination: {
+ node_id: ITERATE,
+ field: 'collection',
+ },
+ },
+ {
+ source: {
+ node_id: ITERATE,
+ field: 'item',
+ },
+ destination: {
+ node_id: POSITIVE_CONDITIONING,
+ field: 'prompt',
+ },
+ }
+ );
+
+ if (shouldRandomizeSeed) {
+ // Random int node to generate the starting seed
+ const randomIntNode: RandomIntInvocation = {
+ id: RANDOM_INT,
+ type: 'rand_int',
+ };
+
+ graph.nodes[RANDOM_INT] = randomIntNode;
+
+ // Connect random int to the start of the range of size so the range starts on the random first seed
+ graph.edges.push({
+ source: { node_id: RANDOM_INT, field: 'a' },
+ destination: { node_id: NOISE, field: 'seed' },
+ });
+ } else {
+ // User specified seed, so set the start of the range of size to the seed
+ (graph.nodes[NOISE] as NoiseInvocation).seed = seed;
+ }
+ } else {
+ const rangeOfSizeNode: RangeOfSizeInvocation = {
+ id: RANGE_OF_SIZE,
+ type: 'range_of_size',
+ size: iterations,
+ step: 1,
+ };
+
+ const iterateNode: IterateInvocation = {
+ id: ITERATE,
+ type: 'iterate',
+ };
+
+ graph.nodes[ITERATE] = iterateNode;
+ graph.nodes[RANGE_OF_SIZE] = rangeOfSizeNode;
+
+ graph.edges.push({
+ source: {
+ node_id: RANGE_OF_SIZE,
+ field: 'collection',
+ },
+ destination: {
+ node_id: ITERATE,
+ field: 'collection',
+ },
+ });
+
+ graph.edges.push({
+ source: {
+ node_id: ITERATE,
+ field: 'item',
+ },
+ destination: {
+ node_id: NOISE,
+ field: 'seed',
+ },
+ });
+
+ // handle seed
+ if (shouldRandomizeSeed) {
+ // Random int node to generate the starting seed
+ const randomIntNode: RandomIntInvocation = {
+ id: RANDOM_INT,
+ type: 'rand_int',
+ };
+
+ graph.nodes[RANDOM_INT] = randomIntNode;
+
+ // Connect random int to the start of the range of size so the range starts on the random first seed
+ graph.edges.push({
+ source: { node_id: RANDOM_INT, field: 'a' },
+ destination: { node_id: RANGE_OF_SIZE, field: 'start' },
+ });
+ } else {
+ // User specified seed, so set the start of the range of size to the seed
+ rangeOfSizeNode.start = seed;
+ }
+ }
+};
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasImageToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasImageToImageGraph.ts
index cf46b1226d..49bab291f7 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasImageToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasImageToImageGraph.ts
@@ -2,6 +2,7 @@ import { RootState } from 'app/store/store';
import {
ImageDTO,
ImageResizeInvocation,
+ ImageToLatentsInvocation,
RandomIntInvocation,
RangeOfSizeInvocation,
} from 'services/api/types';
@@ -10,7 +11,7 @@ import { log } from 'app/logging/useLogger';
import {
ITERATE,
LATENTS_TO_IMAGE,
- MODEL_LOADER,
+ PIPELINE_MODEL_LOADER,
NEGATIVE_CONDITIONING,
NOISE,
POSITIVE_CONDITIONING,
@@ -24,6 +25,7 @@ import {
import { set } from 'lodash-es';
import { addControlNetToLinearGraph } from '../addControlNetToLinearGraph';
import { modelIdToPipelineModelField } from '../modelIdToPipelineModelField';
+import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
const moduleLog = log.child({ namespace: 'nodes' });
@@ -75,31 +77,19 @@ export const buildCanvasImageToImageGraph = (
id: NEGATIVE_CONDITIONING,
prompt: negativePrompt,
},
- [RANGE_OF_SIZE]: {
- type: 'range_of_size',
- id: RANGE_OF_SIZE,
- // seed - must be connected manually
- // start: 0,
- size: iterations,
- step: 1,
- },
[NOISE]: {
type: 'noise',
id: NOISE,
},
- [MODEL_LOADER]: {
+ [PIPELINE_MODEL_LOADER]: {
type: 'pipeline_model_loader',
- id: MODEL_LOADER,
+ id: PIPELINE_MODEL_LOADER,
model,
},
[LATENTS_TO_IMAGE]: {
type: 'l2i',
id: LATENTS_TO_IMAGE,
},
- [ITERATE]: {
- type: 'iterate',
- id: ITERATE,
- },
[LATENTS_TO_LATENTS]: {
type: 'l2l',
id: LATENTS_TO_LATENTS,
@@ -120,7 +110,7 @@ export const buildCanvasImageToImageGraph = (
edges: [
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'clip',
},
destination: {
@@ -130,7 +120,7 @@ export const buildCanvasImageToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'clip',
},
destination: {
@@ -140,7 +130,7 @@ export const buildCanvasImageToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'vae',
},
destination: {
@@ -148,26 +138,6 @@ export const buildCanvasImageToImageGraph = (
field: 'vae',
},
},
- {
- source: {
- node_id: RANGE_OF_SIZE,
- field: 'collection',
- },
- destination: {
- node_id: ITERATE,
- field: 'collection',
- },
- },
- {
- source: {
- node_id: ITERATE,
- field: 'item',
- },
- destination: {
- node_id: NOISE,
- field: 'seed',
- },
- },
{
source: {
node_id: LATENTS_TO_LATENTS,
@@ -200,7 +170,7 @@ export const buildCanvasImageToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'vae',
},
destination: {
@@ -210,7 +180,7 @@ export const buildCanvasImageToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'unet',
},
destination: {
@@ -241,26 +211,6 @@ export const buildCanvasImageToImageGraph = (
],
};
- // handle seed
- if (shouldRandomizeSeed) {
- // Random int node to generate the starting seed
- const randomIntNode: RandomIntInvocation = {
- id: RANDOM_INT,
- type: 'rand_int',
- };
-
- graph.nodes[RANDOM_INT] = randomIntNode;
-
- // Connect random int to the start of the range of size so the range starts on the random first seed
- graph.edges.push({
- source: { node_id: RANDOM_INT, field: 'a' },
- destination: { node_id: RANGE_OF_SIZE, field: 'start' },
- });
- } else {
- // User specified seed, so set the start of the range of size to the seed
- (graph.nodes[RANGE_OF_SIZE] as RangeOfSizeInvocation).start = seed;
- }
-
// handle `fit`
if (initialImage.width !== width || initialImage.height !== height) {
// The init image needs to be resized to the specified width and height before being passed to `IMAGE_TO_LATENTS`
@@ -306,9 +256,9 @@ export const buildCanvasImageToImageGraph = (
});
} else {
// We are not resizing, so we need to set the image on the `IMAGE_TO_LATENTS` node explicitly
- set(graph.nodes[IMAGE_TO_LATENTS], 'image', {
+ (graph.nodes[IMAGE_TO_LATENTS] as ImageToLatentsInvocation).image = {
image_name: initialImage.image_name,
- });
+ };
// Pass the image's dimensions to the `NOISE` node
graph.edges.push({
@@ -327,7 +277,10 @@ export const buildCanvasImageToImageGraph = (
});
}
- // add controlnet
+ // add dynamic prompts, mutating `graph`
+ addDynamicPromptsToGraph(graph, state);
+
+ // add controlnet, mutating `graph`
addControlNetToLinearGraph(graph, LATENTS_TO_LATENTS, state);
return graph;
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasInpaintGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasInpaintGraph.ts
index eb2399771a..74bd12a742 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasInpaintGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasInpaintGraph.ts
@@ -9,7 +9,7 @@ import { NonNullableGraph } from 'features/nodes/types/types';
import { log } from 'app/logging/useLogger';
import {
ITERATE,
- MODEL_LOADER,
+ PIPELINE_MODEL_LOADER,
NEGATIVE_CONDITIONING,
POSITIVE_CONDITIONING,
RANDOM_INT,
@@ -101,9 +101,9 @@ export const buildCanvasInpaintGraph = (
id: NEGATIVE_CONDITIONING,
prompt: negativePrompt,
},
- [MODEL_LOADER]: {
+ [PIPELINE_MODEL_LOADER]: {
type: 'pipeline_model_loader',
- id: MODEL_LOADER,
+ id: PIPELINE_MODEL_LOADER,
model,
},
[RANGE_OF_SIZE]: {
@@ -142,7 +142,7 @@ export const buildCanvasInpaintGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'clip',
},
destination: {
@@ -152,7 +152,7 @@ export const buildCanvasInpaintGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'clip',
},
destination: {
@@ -162,7 +162,7 @@ export const buildCanvasInpaintGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'unet',
},
destination: {
@@ -172,7 +172,7 @@ export const buildCanvasInpaintGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'vae',
},
destination: {
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasTextToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasTextToImageGraph.ts
index 251ad94165..b15b2cd192 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasTextToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasTextToImageGraph.ts
@@ -4,7 +4,7 @@ import { RandomIntInvocation, RangeOfSizeInvocation } from 'services/api/types';
import {
ITERATE,
LATENTS_TO_IMAGE,
- MODEL_LOADER,
+ PIPELINE_MODEL_LOADER,
NEGATIVE_CONDITIONING,
NOISE,
POSITIVE_CONDITIONING,
@@ -15,6 +15,7 @@ import {
} from './constants';
import { addControlNetToLinearGraph } from '../addControlNetToLinearGraph';
import { modelIdToPipelineModelField } from '../modelIdToPipelineModelField';
+import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
/**
* Builds the Canvas tab's Text to Image graph.
@@ -62,13 +63,6 @@ export const buildCanvasTextToImageGraph = (
id: NEGATIVE_CONDITIONING,
prompt: negativePrompt,
},
- [RANGE_OF_SIZE]: {
- type: 'range_of_size',
- id: RANGE_OF_SIZE,
- // start: 0, // seed - must be connected manually
- size: iterations,
- step: 1,
- },
[NOISE]: {
type: 'noise',
id: NOISE,
@@ -82,19 +76,15 @@ export const buildCanvasTextToImageGraph = (
scheduler,
steps,
},
- [MODEL_LOADER]: {
+ [PIPELINE_MODEL_LOADER]: {
type: 'pipeline_model_loader',
- id: MODEL_LOADER,
+ id: PIPELINE_MODEL_LOADER,
model,
},
[LATENTS_TO_IMAGE]: {
type: 'l2i',
id: LATENTS_TO_IMAGE,
},
- [ITERATE]: {
- type: 'iterate',
- id: ITERATE,
- },
},
edges: [
{
@@ -119,7 +109,7 @@ export const buildCanvasTextToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'clip',
},
destination: {
@@ -129,7 +119,7 @@ export const buildCanvasTextToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'clip',
},
destination: {
@@ -139,7 +129,7 @@ export const buildCanvasTextToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'unet',
},
destination: {
@@ -159,7 +149,7 @@ export const buildCanvasTextToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'vae',
},
destination: {
@@ -167,26 +157,6 @@ export const buildCanvasTextToImageGraph = (
field: 'vae',
},
},
- {
- source: {
- node_id: RANGE_OF_SIZE,
- field: 'collection',
- },
- destination: {
- node_id: ITERATE,
- field: 'collection',
- },
- },
- {
- source: {
- node_id: ITERATE,
- field: 'item',
- },
- destination: {
- node_id: NOISE,
- field: 'seed',
- },
- },
{
source: {
node_id: NOISE,
@@ -200,27 +170,10 @@ export const buildCanvasTextToImageGraph = (
],
};
- // handle seed
- if (shouldRandomizeSeed) {
- // Random int node to generate the starting seed
- const randomIntNode: RandomIntInvocation = {
- id: RANDOM_INT,
- type: 'rand_int',
- };
+ // add dynamic prompts, mutating `graph`
+ addDynamicPromptsToGraph(graph, state);
- graph.nodes[RANDOM_INT] = randomIntNode;
-
- // Connect random int to the start of the range of size so the range starts on the random first seed
- graph.edges.push({
- source: { node_id: RANDOM_INT, field: 'a' },
- destination: { node_id: RANGE_OF_SIZE, field: 'start' },
- });
- } else {
- // User specified seed, so set the start of the range of size to the seed
- (graph.nodes[RANGE_OF_SIZE] as RangeOfSizeInvocation).start = seed;
- }
-
- // add controlnet
+ // add controlnet, mutating `graph`
addControlNetToLinearGraph(graph, TEXT_TO_LATENTS, state);
return graph;
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearImageToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearImageToImageGraph.ts
index d488accd0a..15d5a431a2 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearImageToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearImageToImageGraph.ts
@@ -1,28 +1,24 @@
import { RootState } from 'app/store/store';
import {
ImageResizeInvocation,
- RandomIntInvocation,
- RangeOfSizeInvocation,
+ ImageToLatentsInvocation,
} from 'services/api/types';
import { NonNullableGraph } from 'features/nodes/types/types';
import { log } from 'app/logging/useLogger';
import {
- ITERATE,
LATENTS_TO_IMAGE,
- MODEL_LOADER,
+ PIPELINE_MODEL_LOADER,
NEGATIVE_CONDITIONING,
NOISE,
POSITIVE_CONDITIONING,
- RANDOM_INT,
- RANGE_OF_SIZE,
IMAGE_TO_IMAGE_GRAPH,
IMAGE_TO_LATENTS,
LATENTS_TO_LATENTS,
RESIZE,
} from './constants';
-import { set } from 'lodash-es';
import { addControlNetToLinearGraph } from '../addControlNetToLinearGraph';
import { modelIdToPipelineModelField } from '../modelIdToPipelineModelField';
+import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
const moduleLog = log.child({ namespace: 'nodes' });
@@ -44,9 +40,6 @@ export const buildLinearImageToImageGraph = (
shouldFitToWidthHeight,
width,
height,
- iterations,
- seed,
- shouldRandomizeSeed,
} = state.generation;
/**
@@ -79,31 +72,19 @@ export const buildLinearImageToImageGraph = (
id: NEGATIVE_CONDITIONING,
prompt: negativePrompt,
},
- [RANGE_OF_SIZE]: {
- type: 'range_of_size',
- id: RANGE_OF_SIZE,
- // seed - must be connected manually
- // start: 0,
- size: iterations,
- step: 1,
- },
[NOISE]: {
type: 'noise',
id: NOISE,
},
- [MODEL_LOADER]: {
+ [PIPELINE_MODEL_LOADER]: {
type: 'pipeline_model_loader',
- id: MODEL_LOADER,
+ id: PIPELINE_MODEL_LOADER,
model,
},
[LATENTS_TO_IMAGE]: {
type: 'l2i',
id: LATENTS_TO_IMAGE,
},
- [ITERATE]: {
- type: 'iterate',
- id: ITERATE,
- },
[LATENTS_TO_LATENTS]: {
type: 'l2l',
id: LATENTS_TO_LATENTS,
@@ -124,7 +105,7 @@ export const buildLinearImageToImageGraph = (
edges: [
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'clip',
},
destination: {
@@ -134,7 +115,7 @@ export const buildLinearImageToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'clip',
},
destination: {
@@ -144,7 +125,7 @@ export const buildLinearImageToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'vae',
},
destination: {
@@ -152,26 +133,6 @@ export const buildLinearImageToImageGraph = (
field: 'vae',
},
},
- {
- source: {
- node_id: RANGE_OF_SIZE,
- field: 'collection',
- },
- destination: {
- node_id: ITERATE,
- field: 'collection',
- },
- },
- {
- source: {
- node_id: ITERATE,
- field: 'item',
- },
- destination: {
- node_id: NOISE,
- field: 'seed',
- },
- },
{
source: {
node_id: LATENTS_TO_LATENTS,
@@ -204,7 +165,7 @@ export const buildLinearImageToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'vae',
},
destination: {
@@ -214,7 +175,7 @@ export const buildLinearImageToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'unet',
},
destination: {
@@ -245,26 +206,6 @@ export const buildLinearImageToImageGraph = (
],
};
- // handle seed
- if (shouldRandomizeSeed) {
- // Random int node to generate the starting seed
- const randomIntNode: RandomIntInvocation = {
- id: RANDOM_INT,
- type: 'rand_int',
- };
-
- graph.nodes[RANDOM_INT] = randomIntNode;
-
- // Connect random int to the start of the range of size so the range starts on the random first seed
- graph.edges.push({
- source: { node_id: RANDOM_INT, field: 'a' },
- destination: { node_id: RANGE_OF_SIZE, field: 'start' },
- });
- } else {
- // User specified seed, so set the start of the range of size to the seed
- (graph.nodes[RANGE_OF_SIZE] as RangeOfSizeInvocation).start = seed;
- }
-
// handle `fit`
if (
shouldFitToWidthHeight &&
@@ -313,9 +254,9 @@ export const buildLinearImageToImageGraph = (
});
} else {
// We are not resizing, so we need to set the image on the `IMAGE_TO_LATENTS` node explicitly
- set(graph.nodes[IMAGE_TO_LATENTS], 'image', {
+ (graph.nodes[IMAGE_TO_LATENTS] as ImageToLatentsInvocation).image = {
image_name: initialImage.imageName,
- });
+ };
// Pass the image's dimensions to the `NOISE` node
graph.edges.push({
@@ -334,7 +275,10 @@ export const buildLinearImageToImageGraph = (
});
}
- // add controlnet
+ // add dynamic prompts, mutating `graph`
+ addDynamicPromptsToGraph(graph, state);
+
+ // add controlnet, mutating `graph`
addControlNetToLinearGraph(graph, LATENTS_TO_LATENTS, state);
return graph;
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearTextToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearTextToImageGraph.ts
index b8bdb1efd0..216c5c8c67 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearTextToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearTextToImageGraph.ts
@@ -1,33 +1,20 @@
import { RootState } from 'app/store/store';
import { NonNullableGraph } from 'features/nodes/types/types';
import {
- BaseModelType,
- RandomIntInvocation,
- RangeOfSizeInvocation,
-} from 'services/api/types';
-import {
- ITERATE,
LATENTS_TO_IMAGE,
- MODEL_LOADER,
+ PIPELINE_MODEL_LOADER,
NEGATIVE_CONDITIONING,
NOISE,
POSITIVE_CONDITIONING,
- RANDOM_INT,
- RANGE_OF_SIZE,
TEXT_TO_IMAGE_GRAPH,
TEXT_TO_LATENTS,
} from './constants';
import { addControlNetToLinearGraph } from '../addControlNetToLinearGraph';
import { modelIdToPipelineModelField } from '../modelIdToPipelineModelField';
-
-type TextToImageGraphOverrides = {
- width: number;
- height: number;
-};
+import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
export const buildLinearTextToImageGraph = (
- state: RootState,
- overrides?: TextToImageGraphOverrides
+ state: RootState
): NonNullableGraph => {
const {
positivePrompt,
@@ -38,9 +25,6 @@ export const buildLinearTextToImageGraph = (
steps,
width,
height,
- iterations,
- seed,
- shouldRandomizeSeed,
} = state.generation;
const model = modelIdToPipelineModelField(modelId);
@@ -68,18 +52,11 @@ export const buildLinearTextToImageGraph = (
id: NEGATIVE_CONDITIONING,
prompt: negativePrompt,
},
- [RANGE_OF_SIZE]: {
- type: 'range_of_size',
- id: RANGE_OF_SIZE,
- // start: 0, // seed - must be connected manually
- size: iterations,
- step: 1,
- },
[NOISE]: {
type: 'noise',
id: NOISE,
- width: overrides?.width || width,
- height: overrides?.height || height,
+ width,
+ height,
},
[TEXT_TO_LATENTS]: {
type: 't2l',
@@ -88,19 +65,15 @@ export const buildLinearTextToImageGraph = (
scheduler,
steps,
},
- [MODEL_LOADER]: {
+ [PIPELINE_MODEL_LOADER]: {
type: 'pipeline_model_loader',
- id: MODEL_LOADER,
+ id: PIPELINE_MODEL_LOADER,
model,
},
[LATENTS_TO_IMAGE]: {
type: 'l2i',
id: LATENTS_TO_IMAGE,
},
- [ITERATE]: {
- type: 'iterate',
- id: ITERATE,
- },
},
edges: [
{
@@ -125,7 +98,7 @@ export const buildLinearTextToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'clip',
},
destination: {
@@ -135,7 +108,7 @@ export const buildLinearTextToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'clip',
},
destination: {
@@ -145,7 +118,7 @@ export const buildLinearTextToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'unet',
},
destination: {
@@ -165,7 +138,7 @@ export const buildLinearTextToImageGraph = (
},
{
source: {
- node_id: MODEL_LOADER,
+ node_id: PIPELINE_MODEL_LOADER,
field: 'vae',
},
destination: {
@@ -173,26 +146,6 @@ export const buildLinearTextToImageGraph = (
field: 'vae',
},
},
- {
- source: {
- node_id: RANGE_OF_SIZE,
- field: 'collection',
- },
- destination: {
- node_id: ITERATE,
- field: 'collection',
- },
- },
- {
- source: {
- node_id: ITERATE,
- field: 'item',
- },
- destination: {
- node_id: NOISE,
- field: 'seed',
- },
- },
{
source: {
node_id: NOISE,
@@ -206,27 +159,10 @@ export const buildLinearTextToImageGraph = (
],
};
- // handle seed
- if (shouldRandomizeSeed) {
- // Random int node to generate the starting seed
- const randomIntNode: RandomIntInvocation = {
- id: RANDOM_INT,
- type: 'rand_int',
- };
+ // add dynamic prompts, mutating `graph`
+ addDynamicPromptsToGraph(graph, state);
- graph.nodes[RANDOM_INT] = randomIntNode;
-
- // Connect random int to the start of the range of size so the range starts on the random first seed
- graph.edges.push({
- source: { node_id: RANDOM_INT, field: 'a' },
- destination: { node_id: RANGE_OF_SIZE, field: 'start' },
- });
- } else {
- // User specified seed, so set the start of the range of size to the seed
- (graph.nodes[RANGE_OF_SIZE] as RangeOfSizeInvocation).start = seed;
- }
-
- // add controlnet
+ // add controlnet, mutating `graph`
addControlNetToLinearGraph(graph, TEXT_TO_LATENTS, state);
return graph;
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts
index 7d4469bc41..d6ab33a6ea 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts
@@ -7,12 +7,13 @@ export const NOISE = 'noise';
export const RANDOM_INT = 'rand_int';
export const RANGE_OF_SIZE = 'range_of_size';
export const ITERATE = 'iterate';
-export const MODEL_LOADER = 'pipeline_model_loader';
+export const PIPELINE_MODEL_LOADER = 'pipeline_model_loader';
export const IMAGE_TO_LATENTS = 'image_to_latents';
export const LATENTS_TO_LATENTS = 'latents_to_latents';
export const RESIZE = 'resize_image';
export const INPAINT = 'inpaint';
export const CONTROL_NET_COLLECT = 'control_net_collect';
+export const DYNAMIC_PROMPT = 'dynamic_prompt';
// friendly graph ids
export const TEXT_TO_IMAGE_GRAPH = 'text_to_image_graph';
diff --git a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildCompelNode.ts b/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildCompelNode.ts
deleted file mode 100644
index 8499c21f0b..0000000000
--- a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildCompelNode.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { v4 as uuidv4 } from 'uuid';
-import { RootState } from 'app/store/store';
-import { CompelInvocation } from 'services/api/types';
-import { O } from 'ts-toolbelt';
-
-export const buildCompelNode = (
- prompt: string,
- state: RootState,
- overrides: O.Partial = {}
-): CompelInvocation => {
- const nodeId = uuidv4();
- const { generation } = state;
-
- const { model } = generation;
-
- const compelNode: CompelInvocation = {
- id: nodeId,
- type: 'compel',
- prompt,
- model,
- };
-
- Object.assign(compelNode, overrides);
-
- return compelNode;
-};
diff --git a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildImageToImageNode.ts b/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildImageToImageNode.ts
deleted file mode 100644
index 0e0e498370..0000000000
--- a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildImageToImageNode.ts
+++ /dev/null
@@ -1,107 +0,0 @@
-import { v4 as uuidv4 } from 'uuid';
-import { RootState } from 'app/store/store';
-import {
- Edge,
- ImageToImageInvocation,
- TextToImageInvocation,
-} from 'services/api/types';
-import { O } from 'ts-toolbelt';
-import { activeTabNameSelector } from 'features/ui/store/uiSelectors';
-
-export const buildImg2ImgNode = (
- state: RootState,
- overrides: O.Partial = {}
-): ImageToImageInvocation => {
- const nodeId = uuidv4();
- const { generation } = state;
-
- const activeTabName = activeTabNameSelector(state);
-
- const {
- positivePrompt: prompt,
- negativePrompt: negativePrompt,
- seed,
- steps,
- width,
- height,
- cfgScale,
- scheduler,
- model,
- img2imgStrength: strength,
- shouldFitToWidthHeight: fit,
- shouldRandomizeSeed,
- initialImage,
- } = generation;
-
- // const initialImage = initialImageSelector(state);
-
- const imageToImageNode: ImageToImageInvocation = {
- id: nodeId,
- type: 'img2img',
- prompt: `${prompt} [${negativePrompt}]`,
- steps,
- width,
- height,
- cfg_scale: cfgScale,
- scheduler,
- model,
- strength,
- fit,
- };
-
- // on Canvas tab, we do not manually specific init image
- if (activeTabName !== 'unifiedCanvas') {
- if (!initialImage) {
- // TODO: handle this more better
- throw 'no initial image';
- }
-
- imageToImageNode.image = {
- image_name: initialImage.imageName,
- };
- }
-
- if (!shouldRandomizeSeed) {
- imageToImageNode.seed = seed;
- }
-
- Object.assign(imageToImageNode, overrides);
-
- return imageToImageNode;
-};
-
-type hiresReturnType = {
- node: Record;
- edge: Edge;
-};
-
-export const buildHiResNode = (
- baseNode: Record,
- strength?: number
-): hiresReturnType => {
- const nodeId = uuidv4();
- const baseNodeId = Object.keys(baseNode)[0];
- const baseNodeValues = Object.values(baseNode)[0];
-
- return {
- node: {
- [nodeId]: {
- ...baseNodeValues,
- id: nodeId,
- type: 'img2img',
- strength,
- fit: true,
- },
- },
- edge: {
- source: {
- field: 'image',
- node_id: baseNodeId,
- },
- destination: {
- field: 'image',
- node_id: nodeId,
- },
- },
- };
-};
diff --git a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildInpaintNode.ts b/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildInpaintNode.ts
deleted file mode 100644
index 91b5128931..0000000000
--- a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildInpaintNode.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import { v4 as uuidv4 } from 'uuid';
-import { RootState } from 'app/store/store';
-import { InpaintInvocation } from 'services/api/types';
-import { O } from 'ts-toolbelt';
-
-export const buildInpaintNode = (
- state: RootState,
- overrides: O.Partial = {}
-): InpaintInvocation => {
- const nodeId = uuidv4();
-
- const {
- positivePrompt: prompt,
- negativePrompt: negativePrompt,
- seed,
- steps,
- width,
- height,
- cfgScale,
- scheduler,
- model,
- img2imgStrength: strength,
- shouldFitToWidthHeight: fit,
- shouldRandomizeSeed,
- } = state.generation;
-
- const inpaintNode: InpaintInvocation = {
- id: nodeId,
- type: 'inpaint',
- prompt: `${prompt} [${negativePrompt}]`,
- steps,
- width,
- height,
- cfg_scale: cfgScale,
- scheduler,
- model,
- strength,
- fit,
- };
-
- if (!shouldRandomizeSeed) {
- inpaintNode.seed = seed;
- }
-
- Object.assign(inpaintNode, overrides);
-
- return inpaintNode;
-};
diff --git a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildIterateNode.ts b/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildIterateNode.ts
deleted file mode 100644
index 12e4e0e6e3..0000000000
--- a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildIterateNode.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { v4 as uuidv4 } from 'uuid';
-
-import { IterateInvocation } from 'services/api/types';
-
-export const buildIterateNode = (): IterateInvocation => {
- const nodeId = uuidv4();
- return {
- id: nodeId,
- type: 'iterate',
- // collection: [],
- // index: 0,
- };
-};
diff --git a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildRangeNode.ts b/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildRangeNode.ts
deleted file mode 100644
index a18a210f20..0000000000
--- a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildRangeNode.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { v4 as uuidv4 } from 'uuid';
-
-import { RootState } from 'app/store/store';
-import { RandomRangeInvocation, RangeInvocation } from 'services/api/types';
-
-export const buildRangeNode = (
- state: RootState
-): RangeInvocation | RandomRangeInvocation => {
- const nodeId = uuidv4();
- const { shouldRandomizeSeed, iterations, seed } = state.generation;
-
- if (shouldRandomizeSeed) {
- return {
- id: nodeId,
- type: 'random_range',
- size: iterations,
- };
- }
-
- return {
- id: nodeId,
- type: 'range',
- start: seed,
- stop: seed + iterations,
- };
-};
diff --git a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildTextToImageNode.ts b/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildTextToImageNode.ts
deleted file mode 100644
index efe5f50d9c..0000000000
--- a/invokeai/frontend/web/src/features/nodes/util/nodeBuilders/buildTextToImageNode.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { v4 as uuidv4 } from 'uuid';
-import { RootState } from 'app/store/store';
-import { TextToImageInvocation } from 'services/api/types';
-import { O } from 'ts-toolbelt';
-
-export const buildTxt2ImgNode = (
- state: RootState,
- overrides: O.Partial = {}
-): TextToImageInvocation => {
- const nodeId = uuidv4();
- const { generation } = state;
-
- const {
- positivePrompt: prompt,
- negativePrompt: negativePrompt,
- seed,
- steps,
- width,
- height,
- cfgScale: cfg_scale,
- scheduler,
- shouldRandomizeSeed,
- model,
- } = generation;
-
- const textToImageNode: NonNullable = {
- id: nodeId,
- type: 'txt2img',
- prompt: `${prompt} [${negativePrompt}]`,
- steps,
- width,
- height,
- cfg_scale,
- scheduler,
- model,
- };
-
- if (!shouldRandomizeSeed) {
- textToImageNode.seed = seed;
- }
-
- Object.assign(textToImageNode, overrides);
-
- return textToImageNode;
-};
diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamIterations.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamIterations.tsx
index 5a5b782c04..8dce097d82 100644
--- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamIterations.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Core/ParamIterations.tsx
@@ -1,4 +1,5 @@
import { createSelector } from '@reduxjs/toolkit';
+import { stateSelector } from 'app/store/store';
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
import IAINumberInput from 'common/components/IAINumberInput';
import IAISlider from 'common/components/IAISlider';
@@ -10,27 +11,26 @@ import { uiSelector } from 'features/ui/store/uiSelectors';
import { memo, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
-const selector = createSelector(
- [generationSelector, configSelector, uiSelector, hotkeysSelector],
- (generation, config, ui, hotkeys) => {
- const { initial, min, sliderMax, inputMax, fineStep, coarseStep } =
- config.sd.iterations;
- const { iterations } = generation;
- const { shouldUseSliders } = ui;
+const selector = createSelector([stateSelector], (state) => {
+ const { initial, min, sliderMax, inputMax, fineStep, coarseStep } =
+ state.config.sd.iterations;
+ const { iterations } = state.generation;
+ const { shouldUseSliders } = state.ui;
+ const isDisabled = state.dynamicPrompts.isEnabled;
- const step = hotkeys.shift ? fineStep : coarseStep;
+ const step = state.hotkeys.shift ? fineStep : coarseStep;
- return {
- iterations,
- initial,
- min,
- sliderMax,
- inputMax,
- step,
- shouldUseSliders,
- };
- }
-);
+ return {
+ iterations,
+ initial,
+ min,
+ sliderMax,
+ inputMax,
+ step,
+ shouldUseSliders,
+ isDisabled,
+ };
+});
const ParamIterations = () => {
const {
@@ -41,6 +41,7 @@ const ParamIterations = () => {
inputMax,
step,
shouldUseSliders,
+ isDisabled,
} = useAppSelector(selector);
const dispatch = useAppDispatch();
const { t } = useTranslation();
@@ -58,6 +59,7 @@ const ParamIterations = () => {
return shouldUseSliders ? (
{
/>
) : (
{
return (
@@ -16,6 +17,7 @@ const ImageToImageTabParameters = () => {
+
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabParameters.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabParameters.tsx
index a28fa71407..bcc6c91ae6 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabParameters.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/TextToImage/TextToImageTabParameters.tsx
@@ -9,6 +9,7 @@ import ParamHiresCollapse from 'features/parameters/components/Parameters/Hires/
import ParamSeamlessCollapse from 'features/parameters/components/Parameters/Seamless/ParamSeamlessCollapse';
import TextToImageTabCoreParameters from './TextToImageTabCoreParameters';
import ParamControlNetCollapse from 'features/parameters/components/Parameters/ControlNet/ParamControlNetCollapse';
+import ParamDynamicPromptsCollapse from 'features/dynamicPrompts/components/ParamDynamicPromptsCollapse';
const TextToImageTabParameters = () => {
return (
@@ -17,6 +18,7 @@ const TextToImageTabParameters = () => {
+
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasParameters.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasParameters.tsx
index 8e17ff066c..061ebb962e 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasParameters.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasParameters.tsx
@@ -8,6 +8,7 @@ import { memo } from 'react';
import ParamPositiveConditioning from 'features/parameters/components/Parameters/Core/ParamPositiveConditioning';
import ParamNegativeConditioning from 'features/parameters/components/Parameters/Core/ParamNegativeConditioning';
import ParamControlNetCollapse from 'features/parameters/components/Parameters/ControlNet/ParamControlNetCollapse';
+import ParamDynamicPromptsCollapse from 'features/dynamicPrompts/components/ParamDynamicPromptsCollapse';
const UnifiedCanvasParameters = () => {
return (
@@ -16,6 +17,7 @@ const UnifiedCanvasParameters = () => {
+
diff --git a/invokeai/frontend/web/src/services/api/endpoints/images.ts b/invokeai/frontend/web/src/services/api/endpoints/images.ts
index 0094af4e39..5090fc4fc1 100644
--- a/invokeai/frontend/web/src/services/api/endpoints/images.ts
+++ b/invokeai/frontend/web/src/services/api/endpoints/images.ts
@@ -15,6 +15,7 @@ export const imagesApi = api.injectEndpoints({
}
return tags;
},
+ keepUnusedDataFor: 86400, // 24 hours
}),
}),
});
diff --git a/invokeai/frontend/web/src/services/api/types.d.ts b/invokeai/frontend/web/src/services/api/types.d.ts
index 5fa6870bc3..a995d9c298 100644
--- a/invokeai/frontend/web/src/services/api/types.d.ts
+++ b/invokeai/frontend/web/src/services/api/types.d.ts
@@ -47,6 +47,15 @@ export type InpaintInvocation = Invocation<'InpaintInvocation'>;
export type ImageResizeInvocation = Invocation<'ImageResizeInvocation'>;
export type RandomIntInvocation = Invocation<'RandomIntInvocation'>;
export type CompelInvocation = Invocation<'CompelInvocation'>;
+export type DynamicPromptInvocation = Invocation<'DynamicPromptInvocation'>;
+export type NoiseInvocation = Invocation<'NoiseInvocation'>;
+export type TextToLatentsInvocation = Invocation<'TextToLatentsInvocation'>;
+export type LatentsToLatentsInvocation =
+ Invocation<'LatentsToLatentsInvocation'>;
+export type ImageToLatentsInvocation = Invocation<'ImageToLatentsInvocation'>;
+export type LatentsToImageInvocation = Invocation<'LatentsToImageInvocation'>;
+export type PipelineModelLoaderInvocation =
+ Invocation<'PipelineModelLoaderInvocation'>;
// ControlNet Nodes
export type ControlNetInvocation = Invocation<'ControlNetInvocation'>;
From 6ccf62a863bd7e7589587ffd1abde3dc1550dfab Mon Sep 17 00:00:00 2001
From: psychedelicious <4822129+psychedelicious@users.noreply.github.com>
Date: Mon, 26 Jun 2023 19:20:05 +1000
Subject: [PATCH 6/7] feat(ui): only show canvas image fallback on loading
error
---
.../web/src/features/canvas/components/IAICanvasImage.tsx | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/invokeai/frontend/web/src/features/canvas/components/IAICanvasImage.tsx b/invokeai/frontend/web/src/features/canvas/components/IAICanvasImage.tsx
index ca838d9922..07cad52173 100644
--- a/invokeai/frontend/web/src/features/canvas/components/IAICanvasImage.tsx
+++ b/invokeai/frontend/web/src/features/canvas/components/IAICanvasImage.tsx
@@ -9,10 +9,12 @@ type IAICanvasImageProps = {
};
const IAICanvasImage = (props: IAICanvasImageProps) => {
const { width, height, x, y, imageName } = props.canvasImage;
- const { currentData: imageDTO } = useGetImageDTOQuery(imageName ?? skipToken);
+ const { currentData: imageDTO, isError } = useGetImageDTOQuery(
+ imageName ?? skipToken
+ );
const [image] = useImage(imageDTO?.image_url ?? '', 'anonymous');
- if (!imageDTO) {
+ if (isError) {
return ;
}
From befd95eb19eab6e3080111d296a07075b0ee8ab3 Mon Sep 17 00:00:00 2001
From: Lincoln Stein
Date: Mon, 26 Jun 2023 13:52:25 -0400
Subject: [PATCH 7/7] rename root_dir to root_path attributes to emphasize
return of a Path
---
invokeai/backend/model_management/models/stable_diffusion.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/invokeai/backend/model_management/models/stable_diffusion.py b/invokeai/backend/model_management/models/stable_diffusion.py
index f169326571..6bc58b328d 100644
--- a/invokeai/backend/model_management/models/stable_diffusion.py
+++ b/invokeai/backend/model_management/models/stable_diffusion.py
@@ -279,8 +279,8 @@ def _convert_ckpt_and_cache(
raise Exception(f"Model variant {model_config.variant} not supported for {version}")
- weights = app_config.root_dir / model_config.path
- config_file = app_config.root_dir / model_config.config
+ weights = app_config.root_path / model_config.path
+ config_file = app_config.root_path / model_config.config
output_path = Path(output_path)
if version == BaseModelType.StableDiffusion1: