From bb2c99749ac8eda51df6f458a7344504f166aa15 Mon Sep 17 00:00:00 2001 From: Rizumu Ayaka Date: Thu, 13 Nov 2025 17:12:07 +0800 Subject: [PATCH] refactor: load extensions dynamically according to the configuration file --- src/components/load3d/Load3DControls.vue | 2 +- .../load3d/controls/CameraControls.vue | 2 +- .../load3d/controls/LightControls.vue | 2 +- .../load3d/controls/ModelControls.vue | 2 +- .../load3d/controls/SceneControls.vue | 2 +- .../controls/viewer/ViewerCameraControls.vue | 2 +- .../controls/viewer/ViewerModelControls.vue | 2 +- src/composables/useLoad3d.ts | 6 +- src/composables/useLoad3dDrag.ts | 2 +- src/composables/useLoad3dViewer.ts | 6 +- .../clipspace/index.ts} | 6 +- .../cloudBadges/comfy.ext.config.ts | 5 ++ .../cloudBadges/index.ts} | 0 .../comfy.ext.config.ts | 5 ++ .../cloudFeedbackTopbarButton/index.ts} | 0 .../cloudRemoteConfig/comfy.ext.config.ts | 5 ++ .../cloudRemoteConfig/index.ts} | 0 .../cloudSessionCookie/comfy.ext.config.ts | 5 ++ .../cloudSessionCookie/index.ts} | 0 .../cloudSubscription/comfy.ext.config.ts | 7 +++ .../cloudSubscription/index.ts} | 0 .../contextMenuFilter/index.ts} | 2 +- .../dynamicPrompts/index.ts} | 0 .../editAttention/index.ts} | 2 +- .../electronAdapter/index.ts} | 0 .../groupNode/index.ts} | 8 +-- .../groupNodeManage}/groupNodeManage.css | 0 .../groupNodeManage/index.ts} | 10 ++-- .../groupOptions/index.ts} | 2 +- .../load3d/AnimationManager.ts | 2 +- .../{ => extensions}/load3d/CameraManager.ts | 0 .../load3d/ControlsManager.ts | 0 .../{ => extensions}/load3d/EventManager.ts | 0 .../load3d/LightingManager.ts | 0 .../load3d/Load3DConfiguration.ts | 6 +- .../core/{ => extensions}/load3d/Load3d.ts | 0 .../{ => extensions}/load3d/Load3dUtils.ts | 0 .../{ => extensions}/load3d/LoaderManager.ts | 0 .../{ => extensions}/load3d/ModelExporter.ts | 0 .../{ => extensions}/load3d/NodeStorage.ts | 0 .../load3d/RecordingManager.ts | 0 .../{ => extensions}/load3d/SceneManager.ts | 0 .../load3d/SceneModelManager.ts | 0 .../load3d/ViewHelperManager.ts | 0 .../load3d/exportMenuHelper.ts | 2 +- .../{load3d.ts => extensions/load3d/index.ts} | 6 +- .../{ => extensions}/load3d/interfaces.ts | 0 .../maskeditor/CanvasHistory.ts | 0 .../maskeditor/MaskEditorDialog.ts | 6 +- .../{ => extensions}/maskeditor/constants.ts | 0 .../maskeditor/index.ts} | 12 ++-- .../maskeditor/managers/KeyboardManager.ts | 0 .../maskeditor/managers/MessageBroker.ts | 0 .../maskeditor/managers/PanAndZoomManager.ts | 0 .../maskeditor/managers/ToolManager.ts | 0 .../maskeditor/managers/UIManager.ts | 0 .../maskeditor/managers/index.ts | 0 .../{ => extensions}/maskeditor/styles.ts | 0 .../maskeditor/tools/BrushTool.ts | 0 .../maskeditor/tools/ColorSelectTool.ts | 0 .../maskeditor/tools/PaintBucketTool.ts | 0 .../maskeditor/tools/index.ts | 0 .../core/{ => extensions}/maskeditor/types.ts | 0 .../maskeditor/utils/brushCache.ts | 0 .../maskeditor/utils/canvas.ts | 0 .../maskeditor/utils/clipspace.ts | 0 .../maskeditor/utils/image.ts | 0 .../maskeditor/utils/index.ts | 0 .../utils/maskEditorLayerFilenames.ts | 0 .../matchType/index.ts} | 0 .../nodeTemplates/index.ts} | 8 +-- .../noteNode/index.ts} | 4 +- .../previewAny/index.ts} | 0 .../rerouteNode/index.ts} | 4 +- .../saveImageExtraOutput/index.ts} | 2 +- .../saveMesh/index.ts} | 4 +- .../selectionBorder/index.ts} | 0 .../simpleTouchSupport/index.ts} | 2 +- .../slotDefaults/index.ts} | 4 +- .../uploadAudio/index.ts} | 4 +- .../uploadImage/index.ts} | 2 +- .../webcamCapture/index.ts} | 4 +- .../widgetInputs/index.ts} | 0 src/extensions/core/index.ts | 45 ++++---------- src/extensions/core/maskEditorOld.ts | 2 +- src/extensions/dispatch.ts | 32 ++++++++++ src/extensions/types.ts | 30 ++++++++++ src/extensions/utils.ts | 59 +++++++++++++++++++ src/renderer/utils/nodeTypeGuards.ts | 2 +- src/services/extensionService.ts | 3 +- src/services/load3dService.ts | 2 +- src/utils/executableGroupNodeChildDTO.ts | 2 +- tests-ui/tests/composables/useLoad3d.test.ts | 8 +-- .../tests/composables/useLoad3dViewer.test.ts | 8 +-- tests-ui/tests/maskeditor.test.ts | 2 +- .../utils/executableGroupNodeChildDTO.test.ts | 2 +- 96 files changed, 240 insertions(+), 114 deletions(-) rename src/extensions/core/{clipspace.ts => extensions/clipspace/index.ts} (97%) create mode 100644 src/extensions/core/extensions/cloudBadges/comfy.ext.config.ts rename src/extensions/core/{cloudBadges.ts => extensions/cloudBadges/index.ts} (100%) create mode 100644 src/extensions/core/extensions/cloudFeedbackTopbarButton/comfy.ext.config.ts rename src/extensions/core/{cloudFeedbackTopbarButton.ts => extensions/cloudFeedbackTopbarButton/index.ts} (100%) create mode 100644 src/extensions/core/extensions/cloudRemoteConfig/comfy.ext.config.ts rename src/extensions/core/{cloudRemoteConfig.ts => extensions/cloudRemoteConfig/index.ts} (100%) create mode 100644 src/extensions/core/extensions/cloudSessionCookie/comfy.ext.config.ts rename src/extensions/core/{cloudSessionCookie.ts => extensions/cloudSessionCookie/index.ts} (100%) create mode 100644 src/extensions/core/extensions/cloudSubscription/comfy.ext.config.ts rename src/extensions/core/{cloudSubscription.ts => extensions/cloudSubscription/index.ts} (100%) rename src/extensions/core/{contextMenuFilter.ts => extensions/contextMenuFilter/index.ts} (99%) rename src/extensions/core/{dynamicPrompts.ts => extensions/dynamicPrompts/index.ts} (100%) rename src/extensions/core/{editAttention.ts => extensions/editAttention/index.ts} (99%) rename src/extensions/core/{electronAdapter.ts => extensions/electronAdapter/index.ts} (100%) rename src/extensions/core/{groupNode.ts => extensions/groupNode/index.ts} (99%) rename src/extensions/core/{ => extensions/groupNodeManage}/groupNodeManage.css (100%) rename src/extensions/core/{groupNodeManage.ts => extensions/groupNodeManage/index.ts} (98%) rename src/extensions/core/{groupOptions.ts => extensions/groupOptions/index.ts} (99%) rename src/extensions/core/{ => extensions}/load3d/AnimationManager.ts (98%) rename src/extensions/core/{ => extensions}/load3d/CameraManager.ts (100%) rename src/extensions/core/{ => extensions}/load3d/ControlsManager.ts (100%) rename src/extensions/core/{ => extensions}/load3d/EventManager.ts (100%) rename src/extensions/core/{ => extensions}/load3d/LightingManager.ts (100%) rename src/extensions/core/{ => extensions}/load3d/Load3DConfiguration.ts (97%) rename src/extensions/core/{ => extensions}/load3d/Load3d.ts (100%) rename src/extensions/core/{ => extensions}/load3d/Load3dUtils.ts (100%) rename src/extensions/core/{ => extensions}/load3d/LoaderManager.ts (100%) rename src/extensions/core/{ => extensions}/load3d/ModelExporter.ts (100%) rename src/extensions/core/{ => extensions}/load3d/NodeStorage.ts (100%) rename src/extensions/core/{ => extensions}/load3d/RecordingManager.ts (100%) rename src/extensions/core/{ => extensions}/load3d/SceneManager.ts (100%) rename src/extensions/core/{ => extensions}/load3d/SceneModelManager.ts (100%) rename src/extensions/core/{ => extensions}/load3d/ViewHelperManager.ts (100%) rename src/extensions/core/{ => extensions}/load3d/exportMenuHelper.ts (97%) rename src/extensions/core/{load3d.ts => extensions/load3d/index.ts} (98%) rename src/extensions/core/{ => extensions}/load3d/interfaces.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/CanvasHistory.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/MaskEditorDialog.ts (98%) rename src/extensions/core/{ => extensions}/maskeditor/constants.ts (100%) rename src/extensions/core/{maskeditor.ts => extensions/maskeditor/index.ts} (93%) rename src/extensions/core/{ => extensions}/maskeditor/managers/KeyboardManager.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/managers/MessageBroker.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/managers/PanAndZoomManager.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/managers/ToolManager.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/managers/UIManager.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/managers/index.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/styles.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/tools/BrushTool.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/tools/ColorSelectTool.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/tools/PaintBucketTool.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/tools/index.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/types.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/utils/brushCache.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/utils/canvas.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/utils/clipspace.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/utils/image.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/utils/index.ts (100%) rename src/extensions/core/{ => extensions}/maskeditor/utils/maskEditorLayerFilenames.ts (100%) rename src/extensions/core/{matchType.ts => extensions/matchType/index.ts} (100%) rename src/extensions/core/{nodeTemplates.ts => extensions/nodeTemplates/index.ts} (98%) rename src/extensions/core/{noteNode.ts => extensions/noteNode/index.ts} (95%) rename src/extensions/core/{previewAny.ts => extensions/previewAny/index.ts} (100%) rename src/extensions/core/{rerouteNode.ts => extensions/rerouteNode/index.ts} (99%) rename src/extensions/core/{saveImageExtraOutput.ts => extensions/saveImageExtraOutput/index.ts} (97%) rename src/extensions/core/{saveMesh.ts => extensions/saveMesh/index.ts} (93%) rename src/extensions/core/{selectionBorder.ts => extensions/selectionBorder/index.ts} (100%) rename src/extensions/core/{simpleTouchSupport.ts => extensions/simpleTouchSupport/index.ts} (99%) rename src/extensions/core/{slotDefaults.ts => extensions/slotDefaults/index.ts} (97%) rename src/extensions/core/{uploadAudio.ts => extensions/uploadAudio/index.ts} (99%) rename src/extensions/core/{uploadImage.ts => extensions/uploadImage/index.ts} (96%) rename src/extensions/core/{webcamCapture.ts => extensions/webcamCapture/index.ts} (98%) rename src/extensions/core/{widgetInputs.ts => extensions/widgetInputs/index.ts} (100%) create mode 100644 src/extensions/dispatch.ts create mode 100644 src/extensions/types.ts create mode 100644 src/extensions/utils.ts diff --git a/src/components/load3d/Load3DControls.vue b/src/components/load3d/Load3DControls.vue index d587d79d8..ad7f910b1 100644 --- a/src/components/load3d/Load3DControls.vue +++ b/src/components/load3d/Load3DControls.vue @@ -88,7 +88,7 @@ import type { LightConfig, ModelConfig, SceneConfig -} from '@/extensions/core/load3d/interfaces' +} from '@/extensions/core/extensions/load3d/interfaces' const sceneConfig = defineModel('sceneConfig') const modelConfig = defineModel('modelConfig') diff --git a/src/components/load3d/controls/CameraControls.vue b/src/components/load3d/controls/CameraControls.vue index fb2d153b7..2e9ff7d88 100644 --- a/src/components/load3d/controls/CameraControls.vue +++ b/src/components/load3d/controls/CameraControls.vue @@ -22,7 +22,7 @@ import Button from 'primevue/button' import { computed } from 'vue' import PopupSlider from '@/components/load3d/controls/PopupSlider.vue' -import type { CameraType } from '@/extensions/core/load3d/interfaces' +import type { CameraType } from '@/extensions/core/extensions/load3d/interfaces' const cameraType = defineModel('cameraType') const fov = defineModel('fov') diff --git a/src/components/load3d/controls/LightControls.vue b/src/components/load3d/controls/LightControls.vue index 1c662af85..f90381e2f 100644 --- a/src/components/load3d/controls/LightControls.vue +++ b/src/components/load3d/controls/LightControls.vue @@ -35,7 +35,7 @@ import Button from 'primevue/button' import Slider from 'primevue/slider' import { computed, onMounted, onUnmounted, ref } from 'vue' -import type { MaterialMode } from '@/extensions/core/load3d/interfaces' +import type { MaterialMode } from '@/extensions/core/extensions/load3d/interfaces' import { useSettingStore } from '@/platform/settings/settingStore' const lightIntensity = defineModel('lightIntensity') diff --git a/src/components/load3d/controls/ModelControls.vue b/src/components/load3d/controls/ModelControls.vue index eae0092e9..755e93968 100644 --- a/src/components/load3d/controls/ModelControls.vue +++ b/src/components/load3d/controls/ModelControls.vue @@ -68,7 +68,7 @@ import { computed, onMounted, onUnmounted, ref } from 'vue' import type { MaterialMode, UpDirection -} from '@/extensions/core/load3d/interfaces' +} from '@/extensions/core/extensions/load3d/interfaces' import { t } from '@/i18n' const materialMode = defineModel('materialMode') diff --git a/src/components/load3d/controls/SceneControls.vue b/src/components/load3d/controls/SceneControls.vue index 62c57efb8..91d2fad9a 100644 --- a/src/components/load3d/controls/SceneControls.vue +++ b/src/components/load3d/controls/SceneControls.vue @@ -95,7 +95,7 @@ import Button from 'primevue/button' import { computed, ref } from 'vue' import PopupSlider from '@/components/load3d/controls/PopupSlider.vue' -import type { BackgroundRenderModeType } from '@/extensions/core/load3d/interfaces' +import type { BackgroundRenderModeType } from '@/extensions/core/extensions/load3d/interfaces' const emit = defineEmits<{ (e: 'updateBackgroundImage', file: File | null): void diff --git a/src/components/load3d/controls/viewer/ViewerCameraControls.vue b/src/components/load3d/controls/viewer/ViewerCameraControls.vue index d675ab77a..360ce3fc3 100644 --- a/src/components/load3d/controls/viewer/ViewerCameraControls.vue +++ b/src/components/load3d/controls/viewer/ViewerCameraControls.vue @@ -31,7 +31,7 @@ import Select from 'primevue/select' import Slider from 'primevue/slider' import { computed } from 'vue' -import type { CameraType } from '@/extensions/core/load3d/interfaces' +import type { CameraType } from '@/extensions/core/extensions/load3d/interfaces' import { t } from '@/i18n' const cameras = [ diff --git a/src/components/load3d/controls/viewer/ViewerModelControls.vue b/src/components/load3d/controls/viewer/ViewerModelControls.vue index 24ba78808..962568751 100644 --- a/src/components/load3d/controls/viewer/ViewerModelControls.vue +++ b/src/components/load3d/controls/viewer/ViewerModelControls.vue @@ -29,7 +29,7 @@ import { computed } from 'vue' import type { MaterialMode, UpDirection -} from '@/extensions/core/load3d/interfaces' +} from '@/extensions/core/extensions/load3d/interfaces' import { t } from '@/i18n' const upDirection = defineModel('upDirection') diff --git a/src/composables/useLoad3d.ts b/src/composables/useLoad3d.ts index 30cfd0cf1..bed6e0c23 100644 --- a/src/composables/useLoad3d.ts +++ b/src/composables/useLoad3d.ts @@ -2,8 +2,8 @@ import { toRef } from '@vueuse/core' import type { MaybeRef } from '@vueuse/core' import { nextTick, ref, toRaw, watch } from 'vue' -import Load3d from '@/extensions/core/load3d/Load3d' -import Load3dUtils from '@/extensions/core/load3d/Load3dUtils' +import Load3d from '@/extensions/core/extensions/load3d/Load3d' +import Load3dUtils from '@/extensions/core/extensions/load3d/Load3dUtils' import type { AnimationItem, CameraConfig, @@ -13,7 +13,7 @@ import type { ModelConfig, SceneConfig, UpDirection -} from '@/extensions/core/load3d/interfaces' +} from '@/extensions/core/extensions/load3d/interfaces' import { t } from '@/i18n' import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode' import { useToastStore } from '@/platform/updates/common/toastStore' diff --git a/src/composables/useLoad3dDrag.ts b/src/composables/useLoad3dDrag.ts index d7d5ea7f0..4557e309f 100644 --- a/src/composables/useLoad3dDrag.ts +++ b/src/composables/useLoad3dDrag.ts @@ -1,7 +1,7 @@ import { computed, ref, toValue } from 'vue' import type { MaybeRefOrGetter } from 'vue' -import { SUPPORTED_EXTENSIONS } from '@/extensions/core/load3d/interfaces' +import { SUPPORTED_EXTENSIONS } from '@/extensions/core/extensions/load3d/interfaces' import { t } from '@/i18n' import { useToastStore } from '@/platform/updates/common/toastStore' diff --git a/src/composables/useLoad3dViewer.ts b/src/composables/useLoad3dViewer.ts index 93364a8ca..7ab9ddca1 100644 --- a/src/composables/useLoad3dViewer.ts +++ b/src/composables/useLoad3dViewer.ts @@ -1,13 +1,13 @@ import { ref, toRaw, watch } from 'vue' -import Load3d from '@/extensions/core/load3d/Load3d' -import Load3dUtils from '@/extensions/core/load3d/Load3dUtils' +import Load3d from '@/extensions/core/extensions/load3d/Load3d' +import Load3dUtils from '@/extensions/core/extensions/load3d/Load3dUtils' import type { BackgroundRenderModeType, CameraType, MaterialMode, UpDirection -} from '@/extensions/core/load3d/interfaces' +} from '@/extensions/core/extensions/load3d/interfaces' import { t } from '@/i18n' import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode' import { useToastStore } from '@/platform/updates/common/toastStore' diff --git a/src/extensions/core/clipspace.ts b/src/extensions/core/extensions/clipspace/index.ts similarity index 97% rename from src/extensions/core/clipspace.ts rename to src/extensions/core/extensions/clipspace/index.ts index bc644d8d7..dffa61bf8 100644 --- a/src/extensions/core/clipspace.ts +++ b/src/extensions/core/extensions/clipspace/index.ts @@ -1,6 +1,6 @@ -import { app } from '../../scripts/app' -import { ComfyApp } from '../../scripts/app' -import { $el, ComfyDialog } from '../../scripts/ui' +import { app } from '@/scripts/app' +import { ComfyApp } from '@/scripts/app' +import { $el, ComfyDialog } from '@/scripts/ui' export class ClipspaceDialog extends ComfyDialog { static items: Array< diff --git a/src/extensions/core/extensions/cloudBadges/comfy.ext.config.ts b/src/extensions/core/extensions/cloudBadges/comfy.ext.config.ts new file mode 100644 index 000000000..e6cde655b --- /dev/null +++ b/src/extensions/core/extensions/cloudBadges/comfy.ext.config.ts @@ -0,0 +1,5 @@ +import { defineComfyExtConfig } from '@/extensions/utils' + +export default defineComfyExtConfig({ + comfyCloud: true, +}) diff --git a/src/extensions/core/cloudBadges.ts b/src/extensions/core/extensions/cloudBadges/index.ts similarity index 100% rename from src/extensions/core/cloudBadges.ts rename to src/extensions/core/extensions/cloudBadges/index.ts diff --git a/src/extensions/core/extensions/cloudFeedbackTopbarButton/comfy.ext.config.ts b/src/extensions/core/extensions/cloudFeedbackTopbarButton/comfy.ext.config.ts new file mode 100644 index 000000000..e6cde655b --- /dev/null +++ b/src/extensions/core/extensions/cloudFeedbackTopbarButton/comfy.ext.config.ts @@ -0,0 +1,5 @@ +import { defineComfyExtConfig } from '@/extensions/utils' + +export default defineComfyExtConfig({ + comfyCloud: true, +}) diff --git a/src/extensions/core/cloudFeedbackTopbarButton.ts b/src/extensions/core/extensions/cloudFeedbackTopbarButton/index.ts similarity index 100% rename from src/extensions/core/cloudFeedbackTopbarButton.ts rename to src/extensions/core/extensions/cloudFeedbackTopbarButton/index.ts diff --git a/src/extensions/core/extensions/cloudRemoteConfig/comfy.ext.config.ts b/src/extensions/core/extensions/cloudRemoteConfig/comfy.ext.config.ts new file mode 100644 index 000000000..e6cde655b --- /dev/null +++ b/src/extensions/core/extensions/cloudRemoteConfig/comfy.ext.config.ts @@ -0,0 +1,5 @@ +import { defineComfyExtConfig } from '@/extensions/utils' + +export default defineComfyExtConfig({ + comfyCloud: true, +}) diff --git a/src/extensions/core/cloudRemoteConfig.ts b/src/extensions/core/extensions/cloudRemoteConfig/index.ts similarity index 100% rename from src/extensions/core/cloudRemoteConfig.ts rename to src/extensions/core/extensions/cloudRemoteConfig/index.ts diff --git a/src/extensions/core/extensions/cloudSessionCookie/comfy.ext.config.ts b/src/extensions/core/extensions/cloudSessionCookie/comfy.ext.config.ts new file mode 100644 index 000000000..e6cde655b --- /dev/null +++ b/src/extensions/core/extensions/cloudSessionCookie/comfy.ext.config.ts @@ -0,0 +1,5 @@ +import { defineComfyExtConfig } from '@/extensions/utils' + +export default defineComfyExtConfig({ + comfyCloud: true, +}) diff --git a/src/extensions/core/cloudSessionCookie.ts b/src/extensions/core/extensions/cloudSessionCookie/index.ts similarity index 100% rename from src/extensions/core/cloudSessionCookie.ts rename to src/extensions/core/extensions/cloudSessionCookie/index.ts diff --git a/src/extensions/core/extensions/cloudSubscription/comfy.ext.config.ts b/src/extensions/core/extensions/cloudSubscription/comfy.ext.config.ts new file mode 100644 index 000000000..059f2284f --- /dev/null +++ b/src/extensions/core/extensions/cloudSubscription/comfy.ext.config.ts @@ -0,0 +1,7 @@ +import { defineComfyExtConfig } from '@/extensions/utils' + +export default defineComfyExtConfig({ + comfyCloud: { + subscriptionRequired: true, + }, +}) diff --git a/src/extensions/core/cloudSubscription.ts b/src/extensions/core/extensions/cloudSubscription/index.ts similarity index 100% rename from src/extensions/core/cloudSubscription.ts rename to src/extensions/core/extensions/cloudSubscription/index.ts diff --git a/src/extensions/core/contextMenuFilter.ts b/src/extensions/core/extensions/contextMenuFilter/index.ts similarity index 99% rename from src/extensions/core/contextMenuFilter.ts rename to src/extensions/core/extensions/contextMenuFilter/index.ts index 5cb0e98c5..48b6cae6d 100644 --- a/src/extensions/core/contextMenuFilter.ts +++ b/src/extensions/core/extensions/contextMenuFilter/index.ts @@ -4,7 +4,7 @@ import { isComboWidget } from '@/lib/litegraph/src/litegraph' -import { app } from '../../scripts/app' +import { app } from '@/scripts/app' // Adds filtering to combo context menus diff --git a/src/extensions/core/dynamicPrompts.ts b/src/extensions/core/extensions/dynamicPrompts/index.ts similarity index 100% rename from src/extensions/core/dynamicPrompts.ts rename to src/extensions/core/extensions/dynamicPrompts/index.ts diff --git a/src/extensions/core/editAttention.ts b/src/extensions/core/extensions/editAttention/index.ts similarity index 99% rename from src/extensions/core/editAttention.ts rename to src/extensions/core/extensions/editAttention/index.ts index 119b27758..5c5fcb656 100644 --- a/src/extensions/core/editAttention.ts +++ b/src/extensions/core/extensions/editAttention/index.ts @@ -1,4 +1,4 @@ -import { app } from '../../scripts/app' +import { app } from '@/scripts/app' // Allows you to edit the attention weight by holding ctrl (or cmd) and using the up/down arrow keys diff --git a/src/extensions/core/electronAdapter.ts b/src/extensions/core/extensions/electronAdapter/index.ts similarity index 100% rename from src/extensions/core/electronAdapter.ts rename to src/extensions/core/extensions/electronAdapter/index.ts diff --git a/src/extensions/core/groupNode.ts b/src/extensions/core/extensions/groupNode/index.ts similarity index 99% rename from src/extensions/core/groupNode.ts rename to src/extensions/core/extensions/groupNode/index.ts index 5b4146c2d..76e8ff7ee 100644 --- a/src/extensions/core/groupNode.ts +++ b/src/extensions/core/extensions/groupNode/index.ts @@ -25,10 +25,10 @@ import { ExecutableGroupNodeChildDTO } from '@/utils/executableGroupNodeChildDTO import { GROUP } from '@/utils/executableGroupNodeDto' import { deserialiseAndCreate, serialise } from '@/utils/vintageClipboard' -import { api } from '../../scripts/api' -import { app } from '../../scripts/app' -import { ManageGroupDialog } from './groupNodeManage' -import { mergeIfValid } from './widgetInputs' +import { api } from '@/scripts/api' +import { app } from '@/scripts/app' +import { ManageGroupDialog } from '../groupNodeManage' +import { mergeIfValid } from '../widgetInputs' type GroupNodeWorkflowData = { external: ComfyLink[] diff --git a/src/extensions/core/groupNodeManage.css b/src/extensions/core/extensions/groupNodeManage/groupNodeManage.css similarity index 100% rename from src/extensions/core/groupNodeManage.css rename to src/extensions/core/extensions/groupNodeManage/groupNodeManage.css diff --git a/src/extensions/core/groupNodeManage.ts b/src/extensions/core/extensions/groupNodeManage/index.ts similarity index 98% rename from src/extensions/core/groupNodeManage.ts rename to src/extensions/core/extensions/groupNodeManage/index.ts index 8e52ffccc..de763df1d 100644 --- a/src/extensions/core/groupNodeManage.ts +++ b/src/extensions/core/extensions/groupNodeManage/index.ts @@ -6,11 +6,11 @@ import { } from '@/lib/litegraph/src/litegraph' import { useToastStore } from '@/platform/updates/common/toastStore' -import { type ComfyApp, app } from '../../scripts/app' -import { $el } from '../../scripts/ui' -import { ComfyDialog } from '../../scripts/ui/dialog' -import { DraggableList } from '../../scripts/ui/draggableList' -import { GroupNodeConfig, GroupNodeHandler } from './groupNode' +import { type ComfyApp, app } from '@/scripts/app' +import { $el } from '@/scripts/ui' +import { ComfyDialog } from '@/scripts/ui/dialog' +import { DraggableList } from '@/scripts/ui/draggableList' +import { GroupNodeConfig, GroupNodeHandler } from '../groupNode' import './groupNodeManage.css' const ORDER: symbol = Symbol() diff --git a/src/extensions/core/groupOptions.ts b/src/extensions/core/extensions/groupOptions/index.ts similarity index 99% rename from src/extensions/core/groupOptions.ts rename to src/extensions/core/extensions/groupOptions/index.ts index 7e3240bcf..5c95b509b 100644 --- a/src/extensions/core/groupOptions.ts +++ b/src/extensions/core/extensions/groupOptions/index.ts @@ -10,7 +10,7 @@ import { import { useSettingStore } from '@/platform/settings/settingStore' import type { ComfyExtension } from '@/types/comfy' -import { app } from '../../scripts/app' +import { app } from '@/scripts/app' function setNodeMode(node: LGraphNode, mode: number) { node.mode = mode diff --git a/src/extensions/core/load3d/AnimationManager.ts b/src/extensions/core/extensions/load3d/AnimationManager.ts similarity index 98% rename from src/extensions/core/load3d/AnimationManager.ts rename to src/extensions/core/extensions/load3d/AnimationManager.ts index a451da8cd..6b79ac789 100644 --- a/src/extensions/core/load3d/AnimationManager.ts +++ b/src/extensions/core/extensions/load3d/AnimationManager.ts @@ -4,7 +4,7 @@ import { type AnimationItem, type AnimationManagerInterface, type EventManagerInterface -} from '@/extensions/core/load3d/interfaces' +} from './interfaces' export class AnimationManager implements AnimationManagerInterface { currentAnimation: THREE.AnimationMixer | null = null diff --git a/src/extensions/core/load3d/CameraManager.ts b/src/extensions/core/extensions/load3d/CameraManager.ts similarity index 100% rename from src/extensions/core/load3d/CameraManager.ts rename to src/extensions/core/extensions/load3d/CameraManager.ts diff --git a/src/extensions/core/load3d/ControlsManager.ts b/src/extensions/core/extensions/load3d/ControlsManager.ts similarity index 100% rename from src/extensions/core/load3d/ControlsManager.ts rename to src/extensions/core/extensions/load3d/ControlsManager.ts diff --git a/src/extensions/core/load3d/EventManager.ts b/src/extensions/core/extensions/load3d/EventManager.ts similarity index 100% rename from src/extensions/core/load3d/EventManager.ts rename to src/extensions/core/extensions/load3d/EventManager.ts diff --git a/src/extensions/core/load3d/LightingManager.ts b/src/extensions/core/extensions/load3d/LightingManager.ts similarity index 100% rename from src/extensions/core/load3d/LightingManager.ts rename to src/extensions/core/extensions/load3d/LightingManager.ts diff --git a/src/extensions/core/load3d/Load3DConfiguration.ts b/src/extensions/core/extensions/load3d/Load3DConfiguration.ts similarity index 97% rename from src/extensions/core/load3d/Load3DConfiguration.ts rename to src/extensions/core/extensions/load3d/Load3DConfiguration.ts index a914de388..e9c363ea2 100644 --- a/src/extensions/core/load3d/Load3DConfiguration.ts +++ b/src/extensions/core/extensions/load3d/Load3DConfiguration.ts @@ -1,11 +1,11 @@ -import Load3d from '@/extensions/core/load3d/Load3d' -import Load3dUtils from '@/extensions/core/load3d/Load3dUtils' +import Load3d from './Load3d' +import Load3dUtils from './Load3dUtils' import type { CameraConfig, LightConfig, ModelConfig, SceneConfig -} from '@/extensions/core/load3d/interfaces' +} from './interfaces' import type { IBaseWidget } from '@/lib/litegraph/src/types/widgets' import { useSettingStore } from '@/platform/settings/settingStore' import { api } from '@/scripts/api' diff --git a/src/extensions/core/load3d/Load3d.ts b/src/extensions/core/extensions/load3d/Load3d.ts similarity index 100% rename from src/extensions/core/load3d/Load3d.ts rename to src/extensions/core/extensions/load3d/Load3d.ts diff --git a/src/extensions/core/load3d/Load3dUtils.ts b/src/extensions/core/extensions/load3d/Load3dUtils.ts similarity index 100% rename from src/extensions/core/load3d/Load3dUtils.ts rename to src/extensions/core/extensions/load3d/Load3dUtils.ts diff --git a/src/extensions/core/load3d/LoaderManager.ts b/src/extensions/core/extensions/load3d/LoaderManager.ts similarity index 100% rename from src/extensions/core/load3d/LoaderManager.ts rename to src/extensions/core/extensions/load3d/LoaderManager.ts diff --git a/src/extensions/core/load3d/ModelExporter.ts b/src/extensions/core/extensions/load3d/ModelExporter.ts similarity index 100% rename from src/extensions/core/load3d/ModelExporter.ts rename to src/extensions/core/extensions/load3d/ModelExporter.ts diff --git a/src/extensions/core/load3d/NodeStorage.ts b/src/extensions/core/extensions/load3d/NodeStorage.ts similarity index 100% rename from src/extensions/core/load3d/NodeStorage.ts rename to src/extensions/core/extensions/load3d/NodeStorage.ts diff --git a/src/extensions/core/load3d/RecordingManager.ts b/src/extensions/core/extensions/load3d/RecordingManager.ts similarity index 100% rename from src/extensions/core/load3d/RecordingManager.ts rename to src/extensions/core/extensions/load3d/RecordingManager.ts diff --git a/src/extensions/core/load3d/SceneManager.ts b/src/extensions/core/extensions/load3d/SceneManager.ts similarity index 100% rename from src/extensions/core/load3d/SceneManager.ts rename to src/extensions/core/extensions/load3d/SceneManager.ts diff --git a/src/extensions/core/load3d/SceneModelManager.ts b/src/extensions/core/extensions/load3d/SceneModelManager.ts similarity index 100% rename from src/extensions/core/load3d/SceneModelManager.ts rename to src/extensions/core/extensions/load3d/SceneModelManager.ts diff --git a/src/extensions/core/load3d/ViewHelperManager.ts b/src/extensions/core/extensions/load3d/ViewHelperManager.ts similarity index 100% rename from src/extensions/core/load3d/ViewHelperManager.ts rename to src/extensions/core/extensions/load3d/ViewHelperManager.ts diff --git a/src/extensions/core/load3d/exportMenuHelper.ts b/src/extensions/core/extensions/load3d/exportMenuHelper.ts similarity index 97% rename from src/extensions/core/load3d/exportMenuHelper.ts rename to src/extensions/core/extensions/load3d/exportMenuHelper.ts index d87146cc3..15aaae9f1 100644 --- a/src/extensions/core/load3d/exportMenuHelper.ts +++ b/src/extensions/core/extensions/load3d/exportMenuHelper.ts @@ -1,7 +1,7 @@ import { t } from '@/i18n' import type { IContextMenuValue } from '@/lib/litegraph/src/interfaces' import { useToastStore } from '@/platform/updates/common/toastStore' -import Load3d from '@/extensions/core/load3d/Load3d' +import Load3d from './Load3d' import { LiteGraph } from '@/lib/litegraph/src/litegraph' const EXPORT_FORMATS = [ diff --git a/src/extensions/core/load3d.ts b/src/extensions/core/extensions/load3d/index.ts similarity index 98% rename from src/extensions/core/load3d.ts rename to src/extensions/core/extensions/load3d/index.ts index 143054c65..7487b9299 100644 --- a/src/extensions/core/load3d.ts +++ b/src/extensions/core/extensions/load3d/index.ts @@ -3,9 +3,9 @@ import { nextTick } from 'vue' import Load3D from '@/components/load3d/Load3D.vue' import Load3DViewerContent from '@/components/load3d/Load3dViewerContent.vue' import { nodeToLoad3dMap, useLoad3d } from '@/composables/useLoad3d' -import { createExportMenuItems } from '@/extensions/core/load3d/exportMenuHelper' -import Load3DConfiguration from '@/extensions/core/load3d/Load3DConfiguration' -import Load3dUtils from '@/extensions/core/load3d/Load3dUtils' +import { createExportMenuItems } from './exportMenuHelper' +import Load3DConfiguration from './Load3DConfiguration' +import Load3dUtils from './Load3dUtils' import { t } from '@/i18n' import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode' import type { IContextMenuValue } from '@/lib/litegraph/src/interfaces' diff --git a/src/extensions/core/load3d/interfaces.ts b/src/extensions/core/extensions/load3d/interfaces.ts similarity index 100% rename from src/extensions/core/load3d/interfaces.ts rename to src/extensions/core/extensions/load3d/interfaces.ts diff --git a/src/extensions/core/maskeditor/CanvasHistory.ts b/src/extensions/core/extensions/maskeditor/CanvasHistory.ts similarity index 100% rename from src/extensions/core/maskeditor/CanvasHistory.ts rename to src/extensions/core/extensions/maskeditor/CanvasHistory.ts diff --git a/src/extensions/core/maskeditor/MaskEditorDialog.ts b/src/extensions/core/extensions/maskeditor/MaskEditorDialog.ts similarity index 98% rename from src/extensions/core/maskeditor/MaskEditorDialog.ts rename to src/extensions/core/extensions/maskeditor/MaskEditorDialog.ts index 1362069aa..b9d4d85d8 100644 --- a/src/extensions/core/maskeditor/MaskEditorDialog.ts +++ b/src/extensions/core/extensions/maskeditor/MaskEditorDialog.ts @@ -1,7 +1,7 @@ import { t } from '@/i18n' -import { api } from '../../../scripts/api' -import { ComfyApp } from '../../../scripts/app' -import { $el, ComfyDialog } from '../../../scripts/ui' +import { api } from '@/scripts/api' +import { ComfyApp } from '@/scripts/app' +import { $el, ComfyDialog } from '@/scripts/ui' import { ClipspaceDialog } from '../clipspace' import { imageLayerFilenamesByTimestamp } from './utils/maskEditorLayerFilenames' import { CanvasHistory } from './CanvasHistory' diff --git a/src/extensions/core/maskeditor/constants.ts b/src/extensions/core/extensions/maskeditor/constants.ts similarity index 100% rename from src/extensions/core/maskeditor/constants.ts rename to src/extensions/core/extensions/maskeditor/constants.ts diff --git a/src/extensions/core/maskeditor.ts b/src/extensions/core/extensions/maskeditor/index.ts similarity index 93% rename from src/extensions/core/maskeditor.ts rename to src/extensions/core/extensions/maskeditor/index.ts index dd51be475..b280deb57 100644 --- a/src/extensions/core/maskeditor.ts +++ b/src/extensions/core/extensions/maskeditor/index.ts @@ -1,13 +1,13 @@ import _ from 'es-toolkit/compat' -import { app } from '../../scripts/app' -import { ComfyApp } from '../../scripts/app' -import { ClipspaceDialog } from './clipspace' -import { MaskEditorDialog } from './maskeditor/MaskEditorDialog' -import { MaskEditorDialogOld } from './maskEditorOld' +import { app } from '@/scripts/app' +import { ComfyApp } from '@/scripts/app' +import { ClipspaceDialog } from '../clipspace' +import { MaskEditorDialog } from './MaskEditorDialog' +import { MaskEditorDialogOld } from '../../maskEditorOld' // Import styles to inject into document -import './maskeditor/styles' +import './styles' // Function to open the mask editor function openMaskEditor(): void { diff --git a/src/extensions/core/maskeditor/managers/KeyboardManager.ts b/src/extensions/core/extensions/maskeditor/managers/KeyboardManager.ts similarity index 100% rename from src/extensions/core/maskeditor/managers/KeyboardManager.ts rename to src/extensions/core/extensions/maskeditor/managers/KeyboardManager.ts diff --git a/src/extensions/core/maskeditor/managers/MessageBroker.ts b/src/extensions/core/extensions/maskeditor/managers/MessageBroker.ts similarity index 100% rename from src/extensions/core/maskeditor/managers/MessageBroker.ts rename to src/extensions/core/extensions/maskeditor/managers/MessageBroker.ts diff --git a/src/extensions/core/maskeditor/managers/PanAndZoomManager.ts b/src/extensions/core/extensions/maskeditor/managers/PanAndZoomManager.ts similarity index 100% rename from src/extensions/core/maskeditor/managers/PanAndZoomManager.ts rename to src/extensions/core/extensions/maskeditor/managers/PanAndZoomManager.ts diff --git a/src/extensions/core/maskeditor/managers/ToolManager.ts b/src/extensions/core/extensions/maskeditor/managers/ToolManager.ts similarity index 100% rename from src/extensions/core/maskeditor/managers/ToolManager.ts rename to src/extensions/core/extensions/maskeditor/managers/ToolManager.ts diff --git a/src/extensions/core/maskeditor/managers/UIManager.ts b/src/extensions/core/extensions/maskeditor/managers/UIManager.ts similarity index 100% rename from src/extensions/core/maskeditor/managers/UIManager.ts rename to src/extensions/core/extensions/maskeditor/managers/UIManager.ts diff --git a/src/extensions/core/maskeditor/managers/index.ts b/src/extensions/core/extensions/maskeditor/managers/index.ts similarity index 100% rename from src/extensions/core/maskeditor/managers/index.ts rename to src/extensions/core/extensions/maskeditor/managers/index.ts diff --git a/src/extensions/core/maskeditor/styles.ts b/src/extensions/core/extensions/maskeditor/styles.ts similarity index 100% rename from src/extensions/core/maskeditor/styles.ts rename to src/extensions/core/extensions/maskeditor/styles.ts diff --git a/src/extensions/core/maskeditor/tools/BrushTool.ts b/src/extensions/core/extensions/maskeditor/tools/BrushTool.ts similarity index 100% rename from src/extensions/core/maskeditor/tools/BrushTool.ts rename to src/extensions/core/extensions/maskeditor/tools/BrushTool.ts diff --git a/src/extensions/core/maskeditor/tools/ColorSelectTool.ts b/src/extensions/core/extensions/maskeditor/tools/ColorSelectTool.ts similarity index 100% rename from src/extensions/core/maskeditor/tools/ColorSelectTool.ts rename to src/extensions/core/extensions/maskeditor/tools/ColorSelectTool.ts diff --git a/src/extensions/core/maskeditor/tools/PaintBucketTool.ts b/src/extensions/core/extensions/maskeditor/tools/PaintBucketTool.ts similarity index 100% rename from src/extensions/core/maskeditor/tools/PaintBucketTool.ts rename to src/extensions/core/extensions/maskeditor/tools/PaintBucketTool.ts diff --git a/src/extensions/core/maskeditor/tools/index.ts b/src/extensions/core/extensions/maskeditor/tools/index.ts similarity index 100% rename from src/extensions/core/maskeditor/tools/index.ts rename to src/extensions/core/extensions/maskeditor/tools/index.ts diff --git a/src/extensions/core/maskeditor/types.ts b/src/extensions/core/extensions/maskeditor/types.ts similarity index 100% rename from src/extensions/core/maskeditor/types.ts rename to src/extensions/core/extensions/maskeditor/types.ts diff --git a/src/extensions/core/maskeditor/utils/brushCache.ts b/src/extensions/core/extensions/maskeditor/utils/brushCache.ts similarity index 100% rename from src/extensions/core/maskeditor/utils/brushCache.ts rename to src/extensions/core/extensions/maskeditor/utils/brushCache.ts diff --git a/src/extensions/core/maskeditor/utils/canvas.ts b/src/extensions/core/extensions/maskeditor/utils/canvas.ts similarity index 100% rename from src/extensions/core/maskeditor/utils/canvas.ts rename to src/extensions/core/extensions/maskeditor/utils/canvas.ts diff --git a/src/extensions/core/maskeditor/utils/clipspace.ts b/src/extensions/core/extensions/maskeditor/utils/clipspace.ts similarity index 100% rename from src/extensions/core/maskeditor/utils/clipspace.ts rename to src/extensions/core/extensions/maskeditor/utils/clipspace.ts diff --git a/src/extensions/core/maskeditor/utils/image.ts b/src/extensions/core/extensions/maskeditor/utils/image.ts similarity index 100% rename from src/extensions/core/maskeditor/utils/image.ts rename to src/extensions/core/extensions/maskeditor/utils/image.ts diff --git a/src/extensions/core/maskeditor/utils/index.ts b/src/extensions/core/extensions/maskeditor/utils/index.ts similarity index 100% rename from src/extensions/core/maskeditor/utils/index.ts rename to src/extensions/core/extensions/maskeditor/utils/index.ts diff --git a/src/extensions/core/maskeditor/utils/maskEditorLayerFilenames.ts b/src/extensions/core/extensions/maskeditor/utils/maskEditorLayerFilenames.ts similarity index 100% rename from src/extensions/core/maskeditor/utils/maskEditorLayerFilenames.ts rename to src/extensions/core/extensions/maskeditor/utils/maskEditorLayerFilenames.ts diff --git a/src/extensions/core/matchType.ts b/src/extensions/core/extensions/matchType/index.ts similarity index 100% rename from src/extensions/core/matchType.ts rename to src/extensions/core/extensions/matchType/index.ts diff --git a/src/extensions/core/nodeTemplates.ts b/src/extensions/core/extensions/nodeTemplates/index.ts similarity index 98% rename from src/extensions/core/nodeTemplates.ts rename to src/extensions/core/extensions/nodeTemplates/index.ts index c16ebed72..92f7627ba 100644 --- a/src/extensions/core/nodeTemplates.ts +++ b/src/extensions/core/extensions/nodeTemplates/index.ts @@ -7,10 +7,10 @@ import { useDialogService } from '@/services/dialogService' import type { ComfyExtension } from '@/types/comfy' import { deserialiseAndCreate } from '@/utils/vintageClipboard' -import { api } from '../../scripts/api' -import { app } from '../../scripts/app' -import { $el, ComfyDialog } from '../../scripts/ui' -import { GroupNodeConfig, GroupNodeHandler } from './groupNode' +import { api } from '@/scripts/api' +import { app } from '@/scripts/app' +import { $el, ComfyDialog } from '@/scripts/ui' +import { GroupNodeConfig, GroupNodeHandler } from '../groupNode' // Adds the ability to save and add multiple nodes as a template // To save: diff --git a/src/extensions/core/noteNode.ts b/src/extensions/core/extensions/noteNode/index.ts similarity index 95% rename from src/extensions/core/noteNode.ts rename to src/extensions/core/extensions/noteNode/index.ts index 8b2d9ed99..5e5af5ca5 100644 --- a/src/extensions/core/noteNode.ts +++ b/src/extensions/core/extensions/noteNode/index.ts @@ -1,8 +1,8 @@ import { LGraphCanvas, LiteGraph } from '@/lib/litegraph/src/litegraph' import { LGraphNode } from '@/lib/litegraph/src/litegraph' -import { app } from '../../scripts/app' -import { ComfyWidgets } from '../../scripts/widgets' +import { app } from '@/scripts/app' +import { ComfyWidgets } from '@/scripts/widgets' // Node that add notes to your project diff --git a/src/extensions/core/previewAny.ts b/src/extensions/core/extensions/previewAny/index.ts similarity index 100% rename from src/extensions/core/previewAny.ts rename to src/extensions/core/extensions/previewAny/index.ts diff --git a/src/extensions/core/rerouteNode.ts b/src/extensions/core/extensions/rerouteNode/index.ts similarity index 99% rename from src/extensions/core/rerouteNode.ts rename to src/extensions/core/extensions/rerouteNode/index.ts index 44c3f3150..f597b7a78 100644 --- a/src/extensions/core/rerouteNode.ts +++ b/src/extensions/core/extensions/rerouteNode/index.ts @@ -6,8 +6,8 @@ import { } from '@/lib/litegraph/src/litegraph' import type { ISlotType } from '@/lib/litegraph/src/interfaces' -import { app } from '../../scripts/app' -import { getWidgetConfig, mergeIfValid, setWidgetConfig } from './widgetInputs' +import { app } from '@/scripts/app' +import { getWidgetConfig, mergeIfValid, setWidgetConfig } from '../widgetInputs' // Node that allows you to redirect connections for cleaner graphs diff --git a/src/extensions/core/saveImageExtraOutput.ts b/src/extensions/core/extensions/saveImageExtraOutput/index.ts similarity index 97% rename from src/extensions/core/saveImageExtraOutput.ts rename to src/extensions/core/extensions/saveImageExtraOutput/index.ts index f216f31a7..313bac438 100644 --- a/src/extensions/core/saveImageExtraOutput.ts +++ b/src/extensions/core/extensions/saveImageExtraOutput/index.ts @@ -1,6 +1,6 @@ import { applyTextReplacements } from '@/utils/searchAndReplace' -import { app } from '../../scripts/app' +import { app } from '@/scripts/app' const saveNodeTypes = new Set([ 'SaveImage', diff --git a/src/extensions/core/saveMesh.ts b/src/extensions/core/extensions/saveMesh/index.ts similarity index 93% rename from src/extensions/core/saveMesh.ts rename to src/extensions/core/extensions/saveMesh/index.ts index 0955fe4cc..d16f4bcc1 100644 --- a/src/extensions/core/saveMesh.ts +++ b/src/extensions/core/extensions/saveMesh/index.ts @@ -2,8 +2,8 @@ import { nextTick } from 'vue' import Load3D from '@/components/load3d/Load3D.vue' import { useLoad3d } from '@/composables/useLoad3d' -import { createExportMenuItems } from '@/extensions/core/load3d/exportMenuHelper' -import Load3DConfiguration from '@/extensions/core/load3d/Load3DConfiguration' +import { createExportMenuItems } from '../load3d/exportMenuHelper' +import Load3DConfiguration from '../load3d/Load3DConfiguration' import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode' import type { IContextMenuValue } from '@/lib/litegraph/src/interfaces' import { type CustomInputSpec } from '@/schemas/nodeDef/nodeDefSchemaV2' diff --git a/src/extensions/core/selectionBorder.ts b/src/extensions/core/extensions/selectionBorder/index.ts similarity index 100% rename from src/extensions/core/selectionBorder.ts rename to src/extensions/core/extensions/selectionBorder/index.ts diff --git a/src/extensions/core/simpleTouchSupport.ts b/src/extensions/core/extensions/simpleTouchSupport/index.ts similarity index 99% rename from src/extensions/core/simpleTouchSupport.ts rename to src/extensions/core/extensions/simpleTouchSupport/index.ts index c129711ec..742d24735 100644 --- a/src/extensions/core/simpleTouchSupport.ts +++ b/src/extensions/core/extensions/simpleTouchSupport/index.ts @@ -1,6 +1,6 @@ import { LGraphCanvas, LiteGraph } from '@/lib/litegraph/src/litegraph' -import { app } from '../../scripts/app' +import { app } from '@/scripts/app' let touchZooming = false let touchCount = 0 diff --git a/src/extensions/core/slotDefaults.ts b/src/extensions/core/extensions/slotDefaults/index.ts similarity index 97% rename from src/extensions/core/slotDefaults.ts rename to src/extensions/core/extensions/slotDefaults/index.ts index f7ca293a4..63d91f70e 100644 --- a/src/extensions/core/slotDefaults.ts +++ b/src/extensions/core/extensions/slotDefaults/index.ts @@ -1,7 +1,7 @@ import { LiteGraph } from '@/lib/litegraph/src/litegraph' -import { app } from '../../scripts/app' -import { ComfyWidgets } from '../../scripts/widgets' +import { app } from '@/scripts/app' +import { ComfyWidgets } from '@/scripts/widgets' // Adds defaults for quickly adding nodes with middle click on the input/output diff --git a/src/extensions/core/uploadAudio.ts b/src/extensions/core/extensions/uploadAudio/index.ts similarity index 99% rename from src/extensions/core/uploadAudio.ts rename to src/extensions/core/extensions/uploadAudio/index.ts index dfefc88a0..a6523b6e6 100644 --- a/src/extensions/core/uploadAudio.ts +++ b/src/extensions/core/extensions/uploadAudio/index.ts @@ -21,8 +21,8 @@ import { useAudioService } from '@/services/audioService' import { type NodeLocatorId } from '@/types' import { getNodeByLocatorId } from '@/utils/graphTraversalUtil' -import { api } from '../../scripts/api' -import { app } from '../../scripts/app' +import { api } from '@/scripts/api' +import { app } from '@/scripts/app' async function uploadFile( audioWidget: IStringWidget, diff --git a/src/extensions/core/uploadImage.ts b/src/extensions/core/extensions/uploadImage/index.ts similarity index 96% rename from src/extensions/core/uploadImage.ts rename to src/extensions/core/extensions/uploadImage/index.ts index 4cb910dae..9849d393f 100644 --- a/src/extensions/core/uploadImage.ts +++ b/src/extensions/core/extensions/uploadImage/index.ts @@ -4,7 +4,7 @@ import { isComboInputSpecV1 } from '@/schemas/nodeDefSchema' -import { app } from '../../scripts/app' +import { app } from '@/scripts/app' // Adds an upload button to the nodes diff --git a/src/extensions/core/webcamCapture.ts b/src/extensions/core/extensions/webcamCapture/index.ts similarity index 98% rename from src/extensions/core/webcamCapture.ts rename to src/extensions/core/extensions/webcamCapture/index.ts index f429ddda4..fee4562a5 100644 --- a/src/extensions/core/webcamCapture.ts +++ b/src/extensions/core/extensions/webcamCapture/index.ts @@ -1,8 +1,8 @@ import { t } from '@/i18n' import { useToastStore } from '@/platform/updates/common/toastStore' -import { api } from '../../scripts/api' -import { app } from '../../scripts/app' +import { api } from '@/scripts/api' +import { app } from '@/scripts/app' const WEBCAM_READY = Symbol() diff --git a/src/extensions/core/widgetInputs.ts b/src/extensions/core/extensions/widgetInputs/index.ts similarity index 100% rename from src/extensions/core/widgetInputs.ts rename to src/extensions/core/extensions/widgetInputs/index.ts diff --git a/src/extensions/core/index.ts b/src/extensions/core/index.ts index 4171dce89..54d02399f 100644 --- a/src/extensions/core/index.ts +++ b/src/extensions/core/index.ts @@ -1,38 +1,15 @@ -import { isCloud } from '@/platform/distribution/types' +import { dispatchComfyExtensions } from '../dispatch' -import './clipspace' -import './contextMenuFilter' -import './dynamicPrompts' -import './editAttention' -import './electronAdapter' -import './groupNode' -import './groupNodeManage' -import './groupOptions' -import './load3d' -import './maskeditor' -import './matchType' -import './nodeTemplates' -import './noteNode' -import './previewAny' -import './rerouteNode' -import './saveImageExtraOutput' -import './saveMesh' -import './selectionBorder' -import './simpleTouchSupport' -import './slotDefaults' -import './uploadAudio' -import './uploadImage' -import './webcamCapture' -import './widgetInputs' +export async function importExtensions() { + console.log('importExtensions running...') -// Cloud-only extensions - tree-shaken in OSS builds -if (isCloud) { - await import('./cloudRemoteConfig') - await import('./cloudBadges') - await import('./cloudSessionCookie') - await import('./cloudFeedbackTopbarButton') + const extConfigs = import.meta.glob(`./extensions/*/comfy.ext.config.ts`, { + // Since each config is small, we only import the default export and use eager mode for better tree-shaking and performance. + import: 'default', + eager: true, + }) + const extensionEntrance = import.meta.glob(`./extensions/*/index.ts`) - if (window.__CONFIG__?.subscription_required) { - await import('./cloudSubscription') - } + dispatchComfyExtensions({ configs: extConfigs, entrance: extensionEntrance }) } + diff --git a/src/extensions/core/maskEditorOld.ts b/src/extensions/core/maskEditorOld.ts index e34c3f225..b849ebaa1 100644 --- a/src/extensions/core/maskEditorOld.ts +++ b/src/extensions/core/maskEditorOld.ts @@ -2,7 +2,7 @@ import { api } from '../../scripts/api' import { app } from '../../scripts/app' import { ComfyApp } from '../../scripts/app' import { $el, ComfyDialog } from '../../scripts/ui' -import { ClipspaceDialog } from './clipspace' +import { ClipspaceDialog } from './extensions/clipspace' // Helper function to convert a data URL to a Blob object // @ts-expect-error fixme ts strict error diff --git a/src/extensions/dispatch.ts b/src/extensions/dispatch.ts new file mode 100644 index 000000000..3b81e5848 --- /dev/null +++ b/src/extensions/dispatch.ts @@ -0,0 +1,32 @@ +import { isCloud } from '@/platform/distribution/types' +import type { + ComfyExtensionConfigs, + ComfyExtensionEntrance, + ComfyExtensionLoadContext +} from './types' +import { formatExtensions, shouldLoadExtension } from './utils' + +const extLoadContext: ComfyExtensionLoadContext = { + get isCloud() { + return isCloud + }, + get subscriptionRequired() { + return !!window.__CONFIG__?.subscription_required + } +} + +export async function dispatchComfyExtensions(options: { + configs: ComfyExtensionConfigs + entrance: ComfyExtensionEntrance +}) { + const { configs, entrance } = options + const extensions = formatExtensions(entrance, configs) + for (const extension of Object.values(extensions)) { + if (shouldLoadExtension(extLoadContext, extension.config)) { + const module = await extension.entry() + console.log('✅ extension', extension.name, 'loaded', extension, module) + } else { + console.log('❌ extension', extension.name, 'disabled', extension.config) + } + } +} diff --git a/src/extensions/types.ts b/src/extensions/types.ts new file mode 100644 index 000000000..aa12c3415 --- /dev/null +++ b/src/extensions/types.ts @@ -0,0 +1,30 @@ +export interface ComfyExtensionConfig { + comfyCloud?: + | boolean + | { + subscriptionRequired: boolean + } +} +export type ComfyExtensionConfigs = Record< + string, + ComfyExtensionConfig | undefined +> + +export interface ComfyExtensionLoadContext { + readonly isCloud: boolean + readonly subscriptionRequired: boolean +} + +export type ComfyExtensionEntry = () => Promise> +export type ComfyExtensionEntrance = Record< + string, + ComfyExtensionEntry | undefined +> + +export interface ComfyExtensionPackage { + name?: string + path?: string + config?: ComfyExtensionConfig + entry: ComfyExtensionEntry +} +export type ComfyExtensionPackages = Record diff --git a/src/extensions/utils.ts b/src/extensions/utils.ts new file mode 100644 index 000000000..cdad268e8 --- /dev/null +++ b/src/extensions/utils.ts @@ -0,0 +1,59 @@ +import type { + ComfyExtensionConfig, + ComfyExtensionConfigs, + ComfyExtensionEntrance, + ComfyExtensionLoadContext, + ComfyExtensionPackages +} from './types' + +export function defineComfyExtConfig( + config: ComfyExtensionConfig +): ComfyExtensionConfig { + return config +} + +export function formatExtensions( + entrance: ComfyExtensionEntrance, + configs: ComfyExtensionConfigs +): ComfyExtensionPackages { + const pkgs: ComfyExtensionPackages = {} + for (const [entryPath, entry] of Object.entries(entrance)) { + const pathArr = entryPath.split('/') + const name = pathArr.at(-2)! + const path = pathArr.slice(0, -1).join('/') + if (!name) { + console.error(`Extension`, path, `has no name`) + continue + } + if (!entry) { + console.error(`Extension`, path, `has no entrance`) + continue + } + + const config = configs[`${path}/comfy.ext.config.ts`] + if (!config) { + console.warn(`⚠️ Extension`, path, `has no config`) + } + pkgs[name] = { name, path, config, entry } + } + return pkgs +} + +export function shouldLoadExtension( + ctx: ComfyExtensionLoadContext, + extConfig: ComfyExtensionConfig | undefined +): boolean { + // No Config -> Load Extension + if (!extConfig) return true + + // Cloud Only Extension + const { comfyCloud } = extConfig + if (comfyCloud) { + if (!ctx.isCloud) return false + if (comfyCloud === true) return true + return comfyCloud.subscriptionRequired && ctx.subscriptionRequired + } + + // Default Extension -> Load Extension + return true +} diff --git a/src/renderer/utils/nodeTypeGuards.ts b/src/renderer/utils/nodeTypeGuards.ts index 9a13edfb5..619c1a4f4 100644 --- a/src/renderer/utils/nodeTypeGuards.ts +++ b/src/renderer/utils/nodeTypeGuards.ts @@ -1,4 +1,4 @@ -import type { PrimitiveNode } from '@/extensions/core/widgetInputs' +import type { PrimitiveNode } from '@/extensions/core/extensions/widgetInputs' import type { LGraphNode } from '@/lib/litegraph/src/litegraph' export const isPrimitiveNode = ( diff --git a/src/services/extensionService.ts b/src/services/extensionService.ts index 75b159e11..8e15ad137 100644 --- a/src/services/extensionService.ts +++ b/src/services/extensionService.ts @@ -35,7 +35,8 @@ export const useExtensionService = () => { // Need to load core extensions first as some custom extensions // may depend on them. - await import('../extensions/core/index') + const { importExtensions } = await import('../extensions/core/index') + await importExtensions() extensionStore.captureCoreExtensions() await Promise.all( extensions diff --git a/src/services/load3dService.ts b/src/services/load3dService.ts index e910f4b4d..d7be9aa74 100644 --- a/src/services/load3dService.ts +++ b/src/services/load3dService.ts @@ -2,7 +2,7 @@ import { toRaw } from 'vue' import { nodeToLoad3dMap } from '@/composables/useLoad3d' import { useLoad3dViewer } from '@/composables/useLoad3dViewer' -import type Load3d from '@/extensions/core/load3d/Load3d' +import type Load3d from '@/extensions/core/extensions/load3d/Load3d' import type { LGraphNode } from '@/lib/litegraph/src/litegraph' import type { NodeId } from '@/platform/workflow/validation/schemas/workflowSchema' diff --git a/src/utils/executableGroupNodeChildDTO.ts b/src/utils/executableGroupNodeChildDTO.ts index b129f2d10..d42daafa1 100644 --- a/src/utils/executableGroupNodeChildDTO.ts +++ b/src/utils/executableGroupNodeChildDTO.ts @@ -1,4 +1,4 @@ -import type { GroupNodeHandler } from '@/extensions/core/groupNode' +import type { GroupNodeHandler } from '@/extensions/core/extensions/groupNode' import { ExecutableNodeDTO } from '@/lib/litegraph/src/litegraph' import type { ExecutableLGraphNode, diff --git a/tests-ui/tests/composables/useLoad3d.test.ts b/tests-ui/tests/composables/useLoad3d.test.ts index fadafa4f8..1ed282036 100644 --- a/tests-ui/tests/composables/useLoad3d.test.ts +++ b/tests-ui/tests/composables/useLoad3d.test.ts @@ -2,16 +2,16 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { nextTick, ref } from 'vue' import { nodeToLoad3dMap, useLoad3d } from '@/composables/useLoad3d' -import Load3d from '@/extensions/core/load3d/Load3d' -import Load3dUtils from '@/extensions/core/load3d/Load3dUtils' +import Load3d from '@/extensions/core/extensions/load3d/Load3d' +import Load3dUtils from '@/extensions/core/extensions/load3d/Load3dUtils' import { useToastStore } from '@/platform/updates/common/toastStore' import { api } from '@/scripts/api' -vi.mock('@/extensions/core/load3d/Load3d', () => ({ +vi.mock('@/extensions/core/extensions/load3d/Load3d', () => ({ default: vi.fn() })) -vi.mock('@/extensions/core/load3d/Load3dUtils', () => ({ +vi.mock('@/extensions/core/extensions/load3d/Load3dUtils', () => ({ default: { splitFilePath: vi.fn(), getResourceURL: vi.fn(), diff --git a/tests-ui/tests/composables/useLoad3dViewer.test.ts b/tests-ui/tests/composables/useLoad3dViewer.test.ts index 4ec2d7798..7b65d51e1 100644 --- a/tests-ui/tests/composables/useLoad3dViewer.test.ts +++ b/tests-ui/tests/composables/useLoad3dViewer.test.ts @@ -2,8 +2,8 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { nextTick } from 'vue' import { useLoad3dViewer } from '@/composables/useLoad3dViewer' -import Load3d from '@/extensions/core/load3d/Load3d' -import Load3dUtils from '@/extensions/core/load3d/Load3dUtils' +import Load3d from '@/extensions/core/extensions/load3d/Load3d' +import Load3dUtils from '@/extensions/core/extensions/load3d/Load3dUtils' import { useToastStore } from '@/platform/updates/common/toastStore' import { useLoad3dService } from '@/services/load3dService' @@ -15,7 +15,7 @@ vi.mock('@/platform/updates/common/toastStore', () => ({ useToastStore: vi.fn() })) -vi.mock('@/extensions/core/load3d/Load3dUtils', () => ({ +vi.mock('@/extensions/core/extensions/load3d/Load3dUtils', () => ({ default: { uploadFile: vi.fn() } @@ -25,7 +25,7 @@ vi.mock('@/i18n', () => ({ t: vi.fn((key) => key) })) -vi.mock('@/extensions/core/load3d/Load3d', () => ({ +vi.mock('@/extensions/core/extensions/load3d/Load3d', () => ({ default: vi.fn() })) diff --git a/tests-ui/tests/maskeditor.test.ts b/tests-ui/tests/maskeditor.test.ts index 448c2cb42..4b6079200 100644 --- a/tests-ui/tests/maskeditor.test.ts +++ b/tests-ui/tests/maskeditor.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { imageLayerFilenamesIfApplicable } from '@/extensions/core/maskeditor/utils/maskEditorLayerFilenames' +import { imageLayerFilenamesIfApplicable } from '@/extensions/core/extensions/maskeditor/utils/maskEditorLayerFilenames' describe('imageLayerFilenamesIfApplicable', () => { // In case the naming scheme changes, this test will ensure CI fails if developers forget to support the old naming scheme. (Causing MaskEditor to lose layer data for previously-saved images.) diff --git a/tests-ui/tests/utils/executableGroupNodeChildDTO.test.ts b/tests-ui/tests/utils/executableGroupNodeChildDTO.test.ts index 6b2fb3ffa..497fc211f 100644 --- a/tests-ui/tests/utils/executableGroupNodeChildDTO.test.ts +++ b/tests-ui/tests/utils/executableGroupNodeChildDTO.test.ts @@ -1,6 +1,6 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' -import type { GroupNodeHandler } from '@/extensions/core/groupNode' +import type { GroupNodeHandler } from '@/extensions/core/extensions/groupNode' import type { ExecutableLGraphNode, ExecutionId,