Compare commits
2 Commits
main
...
0be8ff5d80
Author | SHA1 | Date | |
---|---|---|---|
0be8ff5d80 | |||
80406ea9fc |
10
app/components/Flow/Nodes/Delay/index.ts
Normal file
10
app/components/Flow/Nodes/Delay/index.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import type { NodeDefinition } from "~/types/flow";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: "delay",
|
||||||
|
label: "延时",
|
||||||
|
category: "控制",
|
||||||
|
inputs: [{ id: "in", label: "In", type: "flow" }],
|
||||||
|
outputs: [{ id: "out", label: "Out", type: "flow" }],
|
||||||
|
defaultConfig: { milliseconds: 1000 }
|
||||||
|
} as NodeDefinition;
|
81
app/components/Flow/Nodes/DelayNode.vue
Normal file
81
app/components/Flow/Nodes/DelayNode.vue
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
<template>
|
||||||
|
<div class="delay-node" :style="{ borderColor: node.data?.color || '#ff6b35' }">
|
||||||
|
<div class="node-header">
|
||||||
|
<svg class="node-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
|
||||||
|
<circle cx="12" cy="12" r="10" stroke-width="2" />
|
||||||
|
<path d="M12 6v6l4 2" stroke-width="2" stroke-linecap="round" />
|
||||||
|
</svg>
|
||||||
|
<span class="node-title">延时</span>
|
||||||
|
</div>
|
||||||
|
<div class="node-content">
|
||||||
|
<span class="delay-time">{{ node.data?.config?.milliseconds || 1000 }}ms</span>
|
||||||
|
</div>
|
||||||
|
<Handle
|
||||||
|
id="in"
|
||||||
|
type="target"
|
||||||
|
:position="Position.Top"
|
||||||
|
class="handle"
|
||||||
|
/>
|
||||||
|
<Handle
|
||||||
|
id="out"
|
||||||
|
type="source"
|
||||||
|
:position="Position.Bottom"
|
||||||
|
class="handle"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { Handle, Position } from "@vue-flow/core";
|
||||||
|
|
||||||
|
const _props = defineProps<{
|
||||||
|
node: any
|
||||||
|
}>();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.delay-node {
|
||||||
|
background: white;
|
||||||
|
border: 2px solid #ff6b35;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 12px;
|
||||||
|
min-width: 120px;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-icon {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
color: #ff6b35;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-title {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-content {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.delay-time {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.handle {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
background: #fff;
|
||||||
|
border: 2px solid #ff6b35;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
</style>
|
10
app/components/Flow/Nodes/Log/index.ts
Normal file
10
app/components/Flow/Nodes/Log/index.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import type { NodeDefinition } from "~/types/flow";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
type: "log",
|
||||||
|
label: "日志",
|
||||||
|
category: "工具",
|
||||||
|
inputs: [{ id: "in", label: "In", type: "flow" }],
|
||||||
|
outputs: [{ id: "out", label: "Out", type: "flow" }],
|
||||||
|
defaultConfig: { message: "Hello World" }
|
||||||
|
} as NodeDefinition;
|
84
app/components/Flow/Nodes/LogNode.vue
Normal file
84
app/components/Flow/Nodes/LogNode.vue
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
<template>
|
||||||
|
<div class="log-node" :style="{ borderColor: node.data?.color || '#10b981' }">
|
||||||
|
<div class="node-header">
|
||||||
|
<svg class="node-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
|
||||||
|
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" stroke-width="2" />
|
||||||
|
<path d="M14 2v6h6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
|
||||||
|
<path d="M16 13H8" stroke-width="2" stroke-linecap="round" />
|
||||||
|
<path d="M16 17H8" stroke-width="2" stroke-linecap="round" />
|
||||||
|
<path d="M10 9H8" stroke-width="2" stroke-linecap="round" />
|
||||||
|
</svg>
|
||||||
|
<span class="node-title">日志</span>
|
||||||
|
</div>
|
||||||
|
<div class="node-content">
|
||||||
|
<span class="log-message">{{ node.data?.config?.message || '输出日志' }}</span>
|
||||||
|
</div>
|
||||||
|
<Handle
|
||||||
|
id="in"
|
||||||
|
type="target"
|
||||||
|
:position="Position.Top"
|
||||||
|
class="handle"
|
||||||
|
/>
|
||||||
|
<Handle
|
||||||
|
id="out"
|
||||||
|
type="source"
|
||||||
|
:position="Position.Bottom"
|
||||||
|
class="handle"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { Handle, Position } from "@vue-flow/core";
|
||||||
|
|
||||||
|
const _props = defineProps<{
|
||||||
|
node: any
|
||||||
|
}>();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.log-node {
|
||||||
|
background: white;
|
||||||
|
border: 2px solid #10b981;
|
||||||
|
border-radius: 8px;
|
||||||
|
padding: 12px;
|
||||||
|
min-width: 120px;
|
||||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-icon {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
color: #10b981;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-title {
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node-content {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.log-message {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.handle {
|
||||||
|
width: 8px;
|
||||||
|
height: 8px;
|
||||||
|
background: #fff;
|
||||||
|
border: 2px solid #10b981;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
</style>
|
20
app/components/Flow/Nodes/index.ts
Normal file
20
app/components/Flow/Nodes/index.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import type { NodeDefinition } from "~/types/flow";
|
||||||
|
|
||||||
|
const nodeModules = import.meta.glob("./*/index.ts", { eager: true });
|
||||||
|
|
||||||
|
export const flowNodes: NodeDefinition[] = Object.values(nodeModules).map(
|
||||||
|
(module: any) => module.default
|
||||||
|
);
|
||||||
|
|
||||||
|
export const getNodeDefinitionsByCategory = () => {
|
||||||
|
const categories: Record<string, NodeDefinition[]> = {};
|
||||||
|
|
||||||
|
flowNodes.forEach((node) => {
|
||||||
|
if (!categories[node.category]) {
|
||||||
|
categories[node.category] = [];
|
||||||
|
}
|
||||||
|
categories[node.category].push(node);
|
||||||
|
});
|
||||||
|
|
||||||
|
return categories;
|
||||||
|
};
|
5
app/layouts/flow.vue
Normal file
5
app/layouts/flow.vue
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
@@ -44,9 +44,9 @@
|
|||||||
|
|
||||||
<div class="flex justify-center">
|
<div class="flex justify-center">
|
||||||
<UButton
|
<UButton
|
||||||
:to="app.repo"
|
to="/workflows/flow"
|
||||||
>
|
>
|
||||||
Star on GitHub
|
进入工作流
|
||||||
</UButton>
|
</UButton>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
154
app/pages/workflows/flow.vue
Normal file
154
app/pages/workflows/flow.vue
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
<template>
|
||||||
|
<div class="h-screen flex flex-col">
|
||||||
|
<!-- Toolbar -->
|
||||||
|
<div class="h-12 bg-gray-100 border-b border-gray-200 flex items-center px-4 gap-3">
|
||||||
|
<UButton @click="saveFlow">
|
||||||
|
保存
|
||||||
|
</UButton>
|
||||||
|
<UButton @click="importFlow">
|
||||||
|
导入
|
||||||
|
</UButton>
|
||||||
|
<UButton color="primary" @click="executeNodes">
|
||||||
|
执行
|
||||||
|
</UButton>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-1 overflow-hidden">
|
||||||
|
<!-- Node Panel -->
|
||||||
|
<div class="w-80 bg-white border-r border-gray-200 overflow-y-auto p-4">
|
||||||
|
<h2 class="text-lg font-semibold mb-4">
|
||||||
|
节点库
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<div v-for="(nodes, category) in nodeCategories" :key="category" class="mb-6">
|
||||||
|
<h3 class="text-sm font-medium text-gray-700 mb-2">
|
||||||
|
{{ category }}
|
||||||
|
</h3>
|
||||||
|
<div class="space-y-2">
|
||||||
|
<div
|
||||||
|
v-for="node in nodes"
|
||||||
|
:key="node.type"
|
||||||
|
class="p-3 border border-gray-200 rounded-md cursor-move bg-white hover:bg-gray-50 transition-colors"
|
||||||
|
draggable="true"
|
||||||
|
@dragstart="(e) => onDragStart(e, node)"
|
||||||
|
>
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<div class="w-4 h-4 bg-blue-100 rounded" />
|
||||||
|
<span class="text-sm font-medium">{{ node.label }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="text-xs text-gray-500 mt-1">
|
||||||
|
{{ node.inputs.length }}输入 / {{ node.outputs.length }}输出
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Flow Canvas -->
|
||||||
|
<div class="flex-1 relative">
|
||||||
|
<VueFlow
|
||||||
|
v-model:nodes="nodes"
|
||||||
|
v-model:edges="edges"
|
||||||
|
:node-types="nodeTypes"
|
||||||
|
:fit-view-on-init="true"
|
||||||
|
@dragover.prevent
|
||||||
|
@drop="onDrop"
|
||||||
|
@node-double-click="(event: NodeMouseEvent) => onNodeDoubleClick(event)"
|
||||||
|
>
|
||||||
|
<Background />
|
||||||
|
<Controls />
|
||||||
|
<MiniMap />
|
||||||
|
</VueFlow>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { NodeMouseEvent } from "@vue-flow/core";
|
||||||
|
import type { Component } from "vue";
|
||||||
|
import type { FlowNode } from "~/types/flow";
|
||||||
|
import { Background } from "@vue-flow/background";
|
||||||
|
import { Controls } from "@vue-flow/controls";
|
||||||
|
import { useVueFlow, VueFlow } from "@vue-flow/core";
|
||||||
|
import { MiniMap } from "@vue-flow/minimap";
|
||||||
|
|
||||||
|
import { v4 as uuidv4 } from "uuid";
|
||||||
|
import { computed, defineAsyncComponent, ref } from "vue";
|
||||||
|
import { getNodeDefinitionsByCategory } from "~/components/Flow/Nodes";
|
||||||
|
|
||||||
|
definePageMeta({
|
||||||
|
layout: "flow"
|
||||||
|
});
|
||||||
|
|
||||||
|
const nodeCategories = ref(getNodeDefinitionsByCategory());
|
||||||
|
const { nodes, edges, addNodes, project } = useVueFlow();
|
||||||
|
|
||||||
|
// 注册节点类型
|
||||||
|
const nodeTypes: Record<string, Component> = {
|
||||||
|
delay: defineAsyncComponent(() => import("~/components/Flow/Nodes/DelayNode.vue")),
|
||||||
|
log: defineAsyncComponent(() => import("~/components/Flow/Nodes/LogNode.vue"))
|
||||||
|
};
|
||||||
|
|
||||||
|
const allNodeDefinitions = computed(() => {
|
||||||
|
const categories = nodeCategories.value;
|
||||||
|
return Object.values(categories).flat();
|
||||||
|
});
|
||||||
|
|
||||||
|
const onDragStart = (event: DragEvent, node: any) => {
|
||||||
|
event.dataTransfer?.setData("application/vueflow", node.type);
|
||||||
|
event.dataTransfer!.effectAllowed = "move";
|
||||||
|
};
|
||||||
|
|
||||||
|
const onDrop = (event: DragEvent) => {
|
||||||
|
const nodeType = event.dataTransfer?.getData("application/vueflow");
|
||||||
|
if (!nodeType) return;
|
||||||
|
|
||||||
|
const position = project({ x: event.clientX, y: event.clientY });
|
||||||
|
|
||||||
|
const nodeDefinition = allNodeDefinitions.value.find((n) => n.type === nodeType);
|
||||||
|
if (!nodeDefinition) return;
|
||||||
|
|
||||||
|
const newNode: FlowNode = {
|
||||||
|
id: uuidv4(),
|
||||||
|
type: nodeType,
|
||||||
|
position,
|
||||||
|
data: {
|
||||||
|
config: { ...nodeDefinition.defaultConfig }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
addNodes([newNode]);
|
||||||
|
};
|
||||||
|
|
||||||
|
const onNodeDoubleClick = (event: NodeMouseEvent) => {
|
||||||
|
console.log("编辑节点:", event.node);
|
||||||
|
// 这里可以打开右侧抽屉或弹窗编辑节点配置
|
||||||
|
};
|
||||||
|
|
||||||
|
const saveFlow = () => {
|
||||||
|
const flowData = {
|
||||||
|
nodes: nodes.value,
|
||||||
|
edges: edges.value
|
||||||
|
};
|
||||||
|
console.log("保存", flowData);
|
||||||
|
};
|
||||||
|
|
||||||
|
const importFlow = () => {
|
||||||
|
console.log("导入");
|
||||||
|
// 这里可以实现文件选择器读取 JSON 并还原画布
|
||||||
|
};
|
||||||
|
|
||||||
|
const executeNodes = () => {
|
||||||
|
const flowData = {
|
||||||
|
nodes: nodes.value,
|
||||||
|
edges: edges.value
|
||||||
|
};
|
||||||
|
console.log("执行", flowData);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
@import '@vue-flow/core/dist/style.css';
|
||||||
|
@import '@vue-flow/core/dist/theme-default.css';
|
||||||
|
</style>
|
32
app/types/flow.ts
Normal file
32
app/types/flow.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
export interface NodeDefinition {
|
||||||
|
type: string
|
||||||
|
label: string
|
||||||
|
category: string
|
||||||
|
inputs: PortDefinition[]
|
||||||
|
outputs: PortDefinition[]
|
||||||
|
defaultConfig: Record<string, any>
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PortDefinition {
|
||||||
|
id: string
|
||||||
|
label: string
|
||||||
|
type: "flow" | "data"
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FlowNode {
|
||||||
|
id: string
|
||||||
|
type: string
|
||||||
|
position: { x: number, y: number }
|
||||||
|
data: {
|
||||||
|
config: Record<string, any>
|
||||||
|
color?: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FlowEdge {
|
||||||
|
id: string
|
||||||
|
source: string
|
||||||
|
target: string
|
||||||
|
sourceHandle?: string
|
||||||
|
targetHandle?: string
|
||||||
|
}
|
@@ -30,7 +30,13 @@
|
|||||||
"@tauri-apps/plugin-os": "^2.3.0",
|
"@tauri-apps/plugin-os": "^2.3.0",
|
||||||
"@tauri-apps/plugin-shell": "^2.3.0",
|
"@tauri-apps/plugin-shell": "^2.3.0",
|
||||||
"@tauri-apps/plugin-store": "^2.3.0",
|
"@tauri-apps/plugin-store": "^2.3.0",
|
||||||
|
"@types/uuid": "^10.0.0",
|
||||||
|
"@vue-flow/background": "^1.3.2",
|
||||||
|
"@vue-flow/controls": "^1.1.3",
|
||||||
|
"@vue-flow/core": "^1.46.0",
|
||||||
|
"@vue-flow/minimap": "^1.5.4",
|
||||||
"nuxt": "^4.0.0",
|
"nuxt": "^4.0.0",
|
||||||
|
"uuid": "^11.1.0",
|
||||||
"vue": "^3.5.17",
|
"vue": "^3.5.17",
|
||||||
"vue-router": "^4.5.1",
|
"vue-router": "^4.5.1",
|
||||||
"zod": "^4.0.5"
|
"zod": "^4.0.5"
|
||||||
|
156
pnpm-lock.yaml
generated
156
pnpm-lock.yaml
generated
@@ -32,9 +32,27 @@ importers:
|
|||||||
'@tauri-apps/plugin-store':
|
'@tauri-apps/plugin-store':
|
||||||
specifier: ^2.3.0
|
specifier: ^2.3.0
|
||||||
version: 2.3.0
|
version: 2.3.0
|
||||||
|
'@types/uuid':
|
||||||
|
specifier: ^10.0.0
|
||||||
|
version: 10.0.0
|
||||||
|
'@vue-flow/background':
|
||||||
|
specifier: ^1.3.2
|
||||||
|
version: 1.3.2(@vue-flow/core@1.46.0(vue@3.5.17(tslite@5.7.3)))(vue@3.5.17(tslite@5.7.3))
|
||||||
|
'@vue-flow/controls':
|
||||||
|
specifier: ^1.1.3
|
||||||
|
version: 1.1.3(@vue-flow/core@1.46.0(vue@3.5.17(tslite@5.7.3)))(vue@3.5.17(tslite@5.7.3))
|
||||||
|
'@vue-flow/core':
|
||||||
|
specifier: ^1.46.0
|
||||||
|
version: 1.46.0(vue@3.5.17(tslite@5.7.3))
|
||||||
|
'@vue-flow/minimap':
|
||||||
|
specifier: ^1.5.4
|
||||||
|
version: 1.5.4(@vue-flow/core@1.46.0(vue@3.5.17(tslite@5.7.3)))(vue@3.5.17(tslite@5.7.3))
|
||||||
nuxt:
|
nuxt:
|
||||||
specifier: ^4.0.0
|
specifier: ^4.0.0
|
||||||
version: 4.0.0(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.0.13)(@vue/compiler-sfc@3.5.17)(db0@0.3.2)(eslint@9.31.0(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.45.0)(terser@5.43.1)(tslite@5.7.3)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0))(yaml@2.8.0)
|
version: 4.0.0(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@24.0.13)(@vue/compiler-sfc@3.5.17)(db0@0.3.2)(eslint@9.31.0(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.45.0)(terser@5.43.1)(tslite@5.7.3)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0))(yaml@2.8.0)
|
||||||
|
uuid:
|
||||||
|
specifier: ^11.1.0
|
||||||
|
version: 11.1.0
|
||||||
vue:
|
vue:
|
||||||
specifier: ^3.5.17
|
specifier: ^3.5.17
|
||||||
version: 3.5.17(tslite@5.7.3)
|
version: 3.5.17(tslite@5.7.3)
|
||||||
@@ -1880,6 +1898,9 @@ packages:
|
|||||||
'@types/unist@3.0.3':
|
'@types/unist@3.0.3':
|
||||||
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
|
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
|
||||||
|
|
||||||
|
'@types/uuid@10.0.0':
|
||||||
|
resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==}
|
||||||
|
|
||||||
'@types/web-bluetooth@0.0.20':
|
'@types/web-bluetooth@0.0.20':
|
||||||
resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
|
resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
|
||||||
|
|
||||||
@@ -2048,6 +2069,29 @@ packages:
|
|||||||
vitest:
|
vitest:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
'@vue-flow/background@1.3.2':
|
||||||
|
resolution: {integrity: sha512-eJPhDcLj1wEo45bBoqTXw1uhl0yK2RaQGnEINqvvBsAFKh/camHJd5NPmOdS1w+M9lggc9igUewxaEd3iCQX2w==}
|
||||||
|
peerDependencies:
|
||||||
|
'@vue-flow/core': ^1.23.0
|
||||||
|
vue: ^3.3.0
|
||||||
|
|
||||||
|
'@vue-flow/controls@1.1.3':
|
||||||
|
resolution: {integrity: sha512-XCf+G+jCvaWURdFlZmOjifZGw3XMhN5hHlfMGkWh9xot+9nH9gdTZtn+ldIJKtarg3B21iyHU8JjKDhYcB6JMw==}
|
||||||
|
peerDependencies:
|
||||||
|
'@vue-flow/core': ^1.23.0
|
||||||
|
vue: ^3.3.0
|
||||||
|
|
||||||
|
'@vue-flow/core@1.46.0':
|
||||||
|
resolution: {integrity: sha512-vNIeFcbHuDgl1PSjABL/p+PHlTZYwt1NfZ+htjYlZtqzPfCSkP9URk/TY9ahORBWd/UvgxaNY+AQQoV2O49rtA==}
|
||||||
|
peerDependencies:
|
||||||
|
vue: ^3.3.0
|
||||||
|
|
||||||
|
'@vue-flow/minimap@1.5.4':
|
||||||
|
resolution: {integrity: sha512-l4C+XTAXnRxsRpUdN7cAVFBennC1sVRzq4bDSpVK+ag7tdMczAnhFYGgbLkUw3v3sY6gokyWwMl8CDonp8eB2g==}
|
||||||
|
peerDependencies:
|
||||||
|
'@vue-flow/core': ^1.23.0
|
||||||
|
vue: ^3.3.0
|
||||||
|
|
||||||
'@vue-macros/common@3.0.0-beta.15':
|
'@vue-macros/common@3.0.0-beta.15':
|
||||||
resolution: {integrity: sha512-DMgq/rIh1H20WYNWU7krIbEfJRYDDhy7ix64GlT4AVUJZZWCZ5pxiYVJR3A3GmWQPkn7Pg7i3oIiGqu4JGC65w==}
|
resolution: {integrity: sha512-DMgq/rIh1H20WYNWU7krIbEfJRYDDhy7ix64GlT4AVUJZZWCZ5pxiYVJR3A3GmWQPkn7Pg7i3oIiGqu4JGC65w==}
|
||||||
engines: {node: '>=20.18.0'}
|
engines: {node: '>=20.18.0'}
|
||||||
@@ -2698,6 +2742,44 @@ packages:
|
|||||||
csstype@3.1.3:
|
csstype@3.1.3:
|
||||||
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
|
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
|
||||||
|
|
||||||
|
d3-color@3.1.0:
|
||||||
|
resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
d3-dispatch@3.0.1:
|
||||||
|
resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
d3-drag@3.0.0:
|
||||||
|
resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
d3-ease@3.0.1:
|
||||||
|
resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
d3-interpolate@3.0.1:
|
||||||
|
resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
d3-selection@3.0.0:
|
||||||
|
resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
d3-timer@3.0.1:
|
||||||
|
resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
d3-transition@3.0.1:
|
||||||
|
resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
peerDependencies:
|
||||||
|
d3-selection: 2 - 3
|
||||||
|
|
||||||
|
d3-zoom@3.0.0:
|
||||||
|
resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
data-uri-to-buffer@4.0.1:
|
data-uri-to-buffer@4.0.1:
|
||||||
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
|
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
|
||||||
engines: {node: '>= 12'}
|
engines: {node: '>= 12'}
|
||||||
@@ -5794,7 +5876,7 @@ snapshots:
|
|||||||
'@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.31.0(jiti@2.4.2))
|
'@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.31.0(jiti@2.4.2))
|
||||||
'@eslint/markdown': 7.0.0
|
'@eslint/markdown': 7.0.0
|
||||||
'@stylistic/eslint-plugin': 5.1.0(eslint@9.31.0(jiti@2.4.2))
|
'@stylistic/eslint-plugin': 5.1.0(eslint@9.31.0(jiti@2.4.2))
|
||||||
'@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.36.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3))(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
'@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3))(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
||||||
'@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
'@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
||||||
'@vitest/eslint-plugin': 1.3.4(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
'@vitest/eslint-plugin': 1.3.4(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
||||||
ansis: 4.1.0
|
ansis: 4.1.0
|
||||||
@@ -7750,6 +7832,8 @@ snapshots:
|
|||||||
|
|
||||||
'@types/unist@3.0.3': {}
|
'@types/unist@3.0.3': {}
|
||||||
|
|
||||||
|
'@types/uuid@10.0.0': {}
|
||||||
|
|
||||||
'@types/web-bluetooth@0.0.20': {}
|
'@types/web-bluetooth@0.0.20': {}
|
||||||
|
|
||||||
'@types/web-bluetooth@0.0.21': {}
|
'@types/web-bluetooth@0.0.21': {}
|
||||||
@@ -7776,10 +7860,10 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.36.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3))(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)':
|
'@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3))(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/regexpp': 4.12.1
|
'@eslint-community/regexpp': 4.12.1
|
||||||
'@typescript-eslint/parser': 8.36.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
'@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
||||||
'@typescript-eslint/scope-manager': 8.37.0
|
'@typescript-eslint/scope-manager': 8.37.0
|
||||||
'@typescript-eslint/type-utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
'@typescript-eslint/type-utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
||||||
'@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
'@typescript-eslint/utils': 8.37.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
||||||
@@ -8001,6 +8085,34 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
'@vue-flow/background@1.3.2(@vue-flow/core@1.46.0(vue@3.5.17(tslite@5.7.3)))(vue@3.5.17(tslite@5.7.3))':
|
||||||
|
dependencies:
|
||||||
|
'@vue-flow/core': 1.46.0(vue@3.5.17(tslite@5.7.3))
|
||||||
|
vue: 3.5.17(tslite@5.7.3)
|
||||||
|
|
||||||
|
'@vue-flow/controls@1.1.3(@vue-flow/core@1.46.0(vue@3.5.17(tslite@5.7.3)))(vue@3.5.17(tslite@5.7.3))':
|
||||||
|
dependencies:
|
||||||
|
'@vue-flow/core': 1.46.0(vue@3.5.17(tslite@5.7.3))
|
||||||
|
vue: 3.5.17(tslite@5.7.3)
|
||||||
|
|
||||||
|
'@vue-flow/core@1.46.0(vue@3.5.17(tslite@5.7.3))':
|
||||||
|
dependencies:
|
||||||
|
'@vueuse/core': 10.11.1(vue@3.5.17(tslite@5.7.3))
|
||||||
|
d3-drag: 3.0.0
|
||||||
|
d3-interpolate: 3.0.1
|
||||||
|
d3-selection: 3.0.0
|
||||||
|
d3-zoom: 3.0.0
|
||||||
|
vue: 3.5.17(tslite@5.7.3)
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- '@vue/composition-api'
|
||||||
|
|
||||||
|
'@vue-flow/minimap@1.5.4(@vue-flow/core@1.46.0(vue@3.5.17(tslite@5.7.3)))(vue@3.5.17(tslite@5.7.3))':
|
||||||
|
dependencies:
|
||||||
|
'@vue-flow/core': 1.46.0(vue@3.5.17(tslite@5.7.3))
|
||||||
|
d3-selection: 3.0.0
|
||||||
|
d3-zoom: 3.0.0
|
||||||
|
vue: 3.5.17(tslite@5.7.3)
|
||||||
|
|
||||||
'@vue-macros/common@3.0.0-beta.15(vue@3.5.17(tslite@5.7.3))':
|
'@vue-macros/common@3.0.0-beta.15(vue@3.5.17(tslite@5.7.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@vue/compiler-sfc': 3.5.17
|
'@vue/compiler-sfc': 3.5.17
|
||||||
@@ -8744,6 +8856,42 @@ snapshots:
|
|||||||
|
|
||||||
csstype@3.1.3: {}
|
csstype@3.1.3: {}
|
||||||
|
|
||||||
|
d3-color@3.1.0: {}
|
||||||
|
|
||||||
|
d3-dispatch@3.0.1: {}
|
||||||
|
|
||||||
|
d3-drag@3.0.0:
|
||||||
|
dependencies:
|
||||||
|
d3-dispatch: 3.0.1
|
||||||
|
d3-selection: 3.0.0
|
||||||
|
|
||||||
|
d3-ease@3.0.1: {}
|
||||||
|
|
||||||
|
d3-interpolate@3.0.1:
|
||||||
|
dependencies:
|
||||||
|
d3-color: 3.1.0
|
||||||
|
|
||||||
|
d3-selection@3.0.0: {}
|
||||||
|
|
||||||
|
d3-timer@3.0.1: {}
|
||||||
|
|
||||||
|
d3-transition@3.0.1(d3-selection@3.0.0):
|
||||||
|
dependencies:
|
||||||
|
d3-color: 3.1.0
|
||||||
|
d3-dispatch: 3.0.1
|
||||||
|
d3-ease: 3.0.1
|
||||||
|
d3-interpolate: 3.0.1
|
||||||
|
d3-selection: 3.0.0
|
||||||
|
d3-timer: 3.0.1
|
||||||
|
|
||||||
|
d3-zoom@3.0.0:
|
||||||
|
dependencies:
|
||||||
|
d3-dispatch: 3.0.1
|
||||||
|
d3-drag: 3.0.0
|
||||||
|
d3-interpolate: 3.0.1
|
||||||
|
d3-selection: 3.0.0
|
||||||
|
d3-transition: 3.0.1(d3-selection@3.0.0)
|
||||||
|
|
||||||
data-uri-to-buffer@4.0.1: {}
|
data-uri-to-buffer@4.0.1: {}
|
||||||
|
|
||||||
db0@0.3.2: {}
|
db0@0.3.2: {}
|
||||||
@@ -9213,7 +9361,7 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
eslint: 9.31.0(jiti@2.4.2)
|
eslint: 9.31.0(jiti@2.4.2)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.36.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3))(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
'@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3))(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3)
|
||||||
|
|
||||||
eslint-plugin-vue@10.3.0(@typescript-eslint/parser@8.36.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3))(eslint@9.31.0(jiti@2.4.2))(vue-eslint-parser@10.2.0(eslint@9.31.0(jiti@2.4.2))):
|
eslint-plugin-vue@10.3.0(@typescript-eslint/parser@8.36.0(eslint@9.31.0(jiti@2.4.2))(tslite@5.7.3))(eslint@9.31.0(jiti@2.4.2))(vue-eslint-parser@10.2.0(eslint@9.31.0(jiti@2.4.2))):
|
||||||
dependencies:
|
dependencies:
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"main":{"identifier":"main","description":"Capabilities for the app window","local":true,"windows":["main","secondary"],"permissions":["core:path:default","core:event:default","core:window:default","core:app:default","core:resources:default","core:menu:default","core:tray:default","shell:allow-open",{"identifier":"shell:allow-execute","allow":[{"args":["-c",{"validator":"\\S+"}],"cmd":"sh","name":"exec-sh","sidecar":false}]},"notification:default","os:allow-platform","os:allow-arch","os:allow-family","os:allow-version","os:allow-locale","fs:allow-document-read","fs:allow-document-write","store:default","core:webview:allow-create-webview","core:webview:allow-create-webview-window"]}}
|
{ "main": { "identifier": "main", "description": "Capabilities for the app window", "local": true, "windows": ["main", "secondary"], "permissions": ["core:path:default", "core:event:default", "core:window:default", "core:app:default", "core:resources:default", "core:menu:default", "core:tray:default", "shell:allow-open", { "identifier": "shell:allow-execute", "allow": [{ "args": ["-c", { "validator": "\\S+" }], "cmd": "sh", "name": "exec-sh", "sidecar": false }] }, "notification:default", "os:allow-platform", "os:allow-arch", "os:allow-family", "os:allow-version", "os:allow-locale", "fs:allow-document-read", "fs:allow-document-write", "store:default", "core:webview:allow-create-webview", "core:webview:allow-create-webview-window"] } }
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1
tsconfig.tsbuildinfo
Normal file
1
tsconfig.tsbuildinfo
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"fileNames":[],"fileInfos":[],"root":[],"options":{"composite":true,"module":99,"target":99},"version":"5.7.3"}
|
Reference in New Issue
Block a user