@operato/flow 9.0.1 → 9.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/src/api/tasks.d.ts +7 -0
  3. package/dist/src/api/tasks.js +2517 -0
  4. package/dist/src/api/tasks.js.map +1 -0
  5. package/dist/src/base/anchor-instance.d.ts +30 -0
  6. package/dist/src/base/anchor-instance.js +82 -0
  7. package/dist/src/base/anchor-instance.js.map +1 -0
  8. package/dist/src/base/flow-edge-instance.d.ts +31 -0
  9. package/dist/src/base/flow-edge-instance.js +170 -0
  10. package/dist/src/base/flow-edge-instance.js.map +1 -0
  11. package/dist/src/base/flow-node-abstract.d.ts +49 -0
  12. package/dist/src/base/flow-node-abstract.js +199 -0
  13. package/dist/src/base/flow-node-abstract.js.map +1 -0
  14. package/dist/src/components/flow-debug-panel.d.ts +22 -0
  15. package/dist/src/components/flow-debug-panel.js +156 -0
  16. package/dist/src/components/flow-debug-panel.js.map +1 -0
  17. package/dist/src/components/flow-executor.d.ts +29 -0
  18. package/dist/src/components/flow-executor.js +88 -0
  19. package/dist/src/components/flow-executor.js.map +1 -0
  20. package/dist/src/components/flow-options-builder.d.ts +18 -0
  21. package/dist/src/components/flow-options-builder.js +145 -0
  22. package/dist/src/components/flow-options-builder.js.map +1 -0
  23. package/dist/src/components/flow-properties-panel.d.ts +22 -0
  24. package/dist/src/components/flow-properties-panel.js +232 -0
  25. package/dist/src/components/flow-properties-panel.js.map +1 -0
  26. package/dist/src/components/flow-side-panel.d.ts +9 -0
  27. package/dist/src/components/flow-side-panel.js +83 -0
  28. package/dist/src/components/flow-side-panel.js.map +1 -0
  29. package/dist/src/components/flow-sidebar.d.ts +7 -0
  30. package/dist/src/components/flow-sidebar.js +84 -0
  31. package/dist/src/components/flow-sidebar.js.map +1 -0
  32. package/dist/src/components/flow-toolbar.d.ts +15 -0
  33. package/dist/src/components/flow-toolbar.js +161 -0
  34. package/dist/src/components/flow-toolbar.js.map +1 -0
  35. package/dist/src/components/property-editor.d.ts +35 -0
  36. package/dist/src/components/property-editor.js +78 -0
  37. package/dist/src/components/property-editor.js.map +1 -0
  38. package/dist/src/components/property-panel/data-mapper-popup.d.ts +11 -0
  39. package/dist/src/components/property-panel/data-mapper-popup.js +86 -0
  40. package/dist/src/components/property-panel/data-mapper-popup.js.map +1 -0
  41. package/dist/src/components/property-panel/task-selection-popup.d.ts +10 -0
  42. package/dist/src/components/property-panel/task-selection-popup.js +106 -0
  43. package/dist/src/components/property-panel/task-selection-popup.js.map +1 -0
  44. package/dist/src/context/flow-context.d.ts +21 -0
  45. package/dist/src/context/flow-context.js +3 -0
  46. package/dist/src/context/flow-context.js.map +1 -0
  47. package/dist/src/context/flow-debug-context.d.ts +16 -0
  48. package/dist/src/context/flow-debug-context.js +3 -0
  49. package/dist/src/context/flow-debug-context.js.map +1 -0
  50. package/dist/src/context/flow-edit-context.d.ts +11 -0
  51. package/dist/src/context/flow-edit-context.js +3 -0
  52. package/dist/src/context/flow-edit-context.js.map +1 -0
  53. package/dist/src/handlers/dnd-event-handler.d.ts +9 -0
  54. package/dist/src/handlers/dnd-event-handler.js +41 -0
  55. package/dist/src/handlers/dnd-event-handler.js.map +1 -0
  56. package/dist/src/handlers/flow-event-handler.d.ts +20 -0
  57. package/dist/src/handlers/flow-event-handler.js +75 -0
  58. package/dist/src/handlers/flow-event-handler.js.map +1 -0
  59. package/dist/src/handlers/keydown-event-handler.d.ts +6 -0
  60. package/dist/src/handlers/keydown-event-handler.js +24 -0
  61. package/dist/src/handlers/keydown-event-handler.js.map +1 -0
  62. package/dist/src/handlers/pointer-event-handler.d.ts +9 -0
  63. package/dist/src/handlers/pointer-event-handler.js +118 -0
  64. package/dist/src/handlers/pointer-event-handler.js.map +1 -0
  65. package/dist/src/index.d.ts +2 -0
  66. package/dist/src/index.js +3 -0
  67. package/dist/src/index.js.map +1 -0
  68. package/dist/src/nodes/decision.d.ts +16 -0
  69. package/dist/src/nodes/decision.js +43 -0
  70. package/dist/src/nodes/decision.js.map +1 -0
  71. package/dist/src/nodes/end-event.d.ts +14 -0
  72. package/dist/src/nodes/end-event.js +47 -0
  73. package/dist/src/nodes/end-event.js.map +1 -0
  74. package/dist/src/nodes/index.d.ts +5 -0
  75. package/dist/src/nodes/index.js +19 -0
  76. package/dist/src/nodes/index.js.map +1 -0
  77. package/dist/src/nodes/intermediate-event.d.ts +14 -0
  78. package/dist/src/nodes/intermediate-event.js +52 -0
  79. package/dist/src/nodes/intermediate-event.js.map +1 -0
  80. package/dist/src/nodes/iterator.d.ts +12 -0
  81. package/dist/src/nodes/iterator.js +29 -0
  82. package/dist/src/nodes/iterator.js.map +1 -0
  83. package/dist/src/nodes/select.d.ts +17 -0
  84. package/dist/src/nodes/select.js +71 -0
  85. package/dist/src/nodes/select.js.map +1 -0
  86. package/dist/src/nodes/start-event.d.ts +15 -0
  87. package/dist/src/nodes/start-event.js +46 -0
  88. package/dist/src/nodes/start-event.js.map +1 -0
  89. package/dist/src/nodes/subflow.d.ts +12 -0
  90. package/dist/src/nodes/subflow.js +30 -0
  91. package/dist/src/nodes/subflow.js.map +1 -0
  92. package/dist/src/nodes/task.d.ts +17 -0
  93. package/dist/src/nodes/task.js +60 -0
  94. package/dist/src/nodes/task.js.map +1 -0
  95. package/dist/src/ox-flow-editor.d.ts +94 -0
  96. package/dist/src/ox-flow-editor.js +426 -0
  97. package/dist/src/ox-flow-editor.js.map +1 -0
  98. package/dist/src/ox-flow-monitor.d.ts +24 -0
  99. package/dist/src/ox-flow-monitor.js +117 -0
  100. package/dist/src/ox-flow-monitor.js.map +1 -0
  101. package/dist/src/property-editors/ox-input-anchors.d.ts +12 -0
  102. package/dist/src/property-editors/ox-input-anchors.js +163 -0
  103. package/dist/src/property-editors/ox-input-anchors.js.map +1 -0
  104. package/dist/src/property-editors/ox-property-editor-anchors.d.ts +6 -0
  105. package/dist/src/property-editors/ox-property-editor-anchors.js +25 -0
  106. package/dist/src/property-editors/ox-property-editor-anchors.js.map +1 -0
  107. package/dist/src/types.d.ts +97 -0
  108. package/dist/src/types.js +2 -0
  109. package/dist/src/types.js.map +1 -0
  110. package/dist/src/utils/generate-mapping-scheme.d.ts +6 -0
  111. package/dist/src/utils/generate-mapping-scheme.js +50 -0
  112. package/dist/src/utils/generate-mapping-scheme.js.map +1 -0
  113. package/package.json +5 -5
@@ -0,0 +1,163 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+ import { __decorate } from "tslib";
5
+ import '@material/web/icon/icon.js';
6
+ import { css, html } from 'lit';
7
+ import { customElement, property } from 'lit/decorators.js';
8
+ import { OxFormField } from '@operato/input';
9
+ let OxInputAnchors = class OxInputAnchors extends OxFormField {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.value = [];
13
+ }
14
+ render() {
15
+ const anchors = this.value || [];
16
+ return html `
17
+ <fieldset>
18
+ <ul>
19
+ ${anchors.map(({ id, angle, type }) => html `
20
+ <li>
21
+ <div data-id=${id}>${id}</div>
22
+ <div @click=${this.onClick.bind(this)} data-angle=${angle} data-type=${type}>
23
+ ${type == 'in'
24
+ ? html `
25
+ <md-icon ?selected=${angle == 180} data-angle="180">step_into</md-icon>
26
+ <md-icon ?selected=${angle == 90} data-angle="90">step_into</md-icon>
27
+ <md-icon ?selected=${angle == 270} data-angle="270">step_into</md-icon>
28
+ <md-icon ?selected=${angle == 0} data-angle="0">step_into</md-icon>
29
+ `
30
+ : html `
31
+ <md-icon ?selected=${angle == 180} data-angle="180">step_out</md-icon>
32
+ <md-icon ?selected=${angle == 90} data-angle="90">step_out</md-icon>
33
+ <md-icon ?selected=${angle == 270} data-angle="270">step_out</md-icon>
34
+ <md-icon ?selected=${angle == 0} data-angle="0">step_out</md-icon>
35
+ `}
36
+ </div>
37
+ </li>
38
+ `)}
39
+ </ul>
40
+ </fieldset>
41
+ `;
42
+ }
43
+ onClick(e) {
44
+ e.stopPropagation();
45
+ const target = e.target;
46
+ const currentTarget = e.currentTarget;
47
+ if (target === currentTarget || !target.hasAttribute('data-angle')) {
48
+ return;
49
+ }
50
+ const value = target.getAttribute('data-angle');
51
+ currentTarget.setAttribute('data-angle', value);
52
+ const lis = this.renderRoot.querySelectorAll('li');
53
+ this.value = Array.from(lis).map(li => {
54
+ var _a, _b;
55
+ const id = (_a = li.querySelector('[data-id]')) === null || _a === void 0 ? void 0 : _a.getAttribute('data-id');
56
+ const angle = (_b = li.querySelector('div[data-angle]')) === null || _b === void 0 ? void 0 : _b.getAttribute('data-angle');
57
+ const origin = this.value.find(anchor => anchor.id == id);
58
+ return { ...origin, angle: Number(angle) };
59
+ });
60
+ this.dispatchEvent(new CustomEvent('change', {
61
+ bubbles: true,
62
+ composed: true,
63
+ detail: this.value
64
+ }));
65
+ }
66
+ };
67
+ OxInputAnchors.styles = [
68
+ css `
69
+ :host {
70
+ display: flex;
71
+ --md-icon-size: 1.4em;
72
+ }
73
+
74
+ fieldset {
75
+ flex: 1;
76
+ font-size: 0.8em;
77
+ border: 0;
78
+ border-bottom: 1px solid;
79
+ background-color: var(--md-sys-color-surface-variant);
80
+ padding: var(--spacing-medium);
81
+ }
82
+
83
+ ul {
84
+ display: flex;
85
+ flex-direction: column;
86
+ gap: var(--spacing-small);
87
+
88
+ padding: 0;
89
+ margin: 0;
90
+ }
91
+
92
+ li {
93
+ display: flex;
94
+ flex-direction: row;
95
+ align-items: center;
96
+ gap: var(--spacing-large);
97
+ }
98
+
99
+ li > * {
100
+ flex: 1;
101
+ }
102
+
103
+ div[data-id] {
104
+ text-align: right;
105
+ }
106
+
107
+ div[data-angle] {
108
+ display: flex;
109
+ justify-content: space-between;
110
+ }
111
+
112
+ md-icon {
113
+ color: var(--md-sys-color-on-background);
114
+ background-color: var(--md-sys-color-background);
115
+ }
116
+
117
+ md-icon[selected] {
118
+ color: var(--md-sys-color-on-primary);
119
+ background-color: var(--md-sys-color-primary);
120
+ }
121
+
122
+ /* 아이콘 회전 */
123
+ div[data-type='in'] md-icon[data-angle='270'] {
124
+ transform: rotate(0deg);
125
+ }
126
+
127
+ div[data-type='in'] md-icon[data-angle='0'] {
128
+ transform: rotate(90deg);
129
+ }
130
+
131
+ div[data-type='in'] md-icon[data-angle='180'] {
132
+ transform: rotate(-90deg);
133
+ }
134
+
135
+ div[data-type='in'] md-icon[data-angle='90'] {
136
+ transform: rotate(180deg);
137
+ }
138
+
139
+ div[data-type='out'] md-icon[data-angle='270'] {
140
+ transform: rotate(0deg);
141
+ }
142
+
143
+ div[data-type='out'] md-icon[data-angle='0'] {
144
+ transform: rotate(90deg);
145
+ }
146
+
147
+ div[data-type='out'] md-icon[data-angle='180'] {
148
+ transform: rotate(-90deg);
149
+ }
150
+
151
+ div[data-type='out'] md-icon[data-angle='90'] {
152
+ transform: rotate(180deg);
153
+ }
154
+ `
155
+ ];
156
+ __decorate([
157
+ property({ attribute: false })
158
+ ], OxInputAnchors.prototype, "value", void 0);
159
+ OxInputAnchors = __decorate([
160
+ customElement('ox-input-anchors')
161
+ ], OxInputAnchors);
162
+ export { OxInputAnchors };
163
+ //# sourceMappingURL=ox-input-anchors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-input-anchors.js","sourceRoot":"","sources":["../../../src/property-editors/ox-input-anchors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license Copyright © HatioLab Inc. All rights reserved.\n */\n\nimport '@material/web/icon/icon.js'\n\nimport { css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { OxFormField } from '@operato/input'\nimport { AnchorModel } from '../types'\n\n@customElement('ox-input-anchors')\nexport class OxInputAnchors extends OxFormField<AnchorModel[]> {\n static styles = [\n css`\n :host {\n display: flex;\n --md-icon-size: 1.4em;\n }\n\n fieldset {\n flex: 1;\n font-size: 0.8em;\n border: 0;\n border-bottom: 1px solid;\n background-color: var(--md-sys-color-surface-variant);\n padding: var(--spacing-medium);\n }\n\n ul {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-small);\n\n padding: 0;\n margin: 0;\n }\n\n li {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--spacing-large);\n }\n\n li > * {\n flex: 1;\n }\n\n div[data-id] {\n text-align: right;\n }\n\n div[data-angle] {\n display: flex;\n justify-content: space-between;\n }\n\n md-icon {\n color: var(--md-sys-color-on-background);\n background-color: var(--md-sys-color-background);\n }\n\n md-icon[selected] {\n color: var(--md-sys-color-on-primary);\n background-color: var(--md-sys-color-primary);\n }\n\n /* 아이콘 회전 */\n div[data-type='in'] md-icon[data-angle='270'] {\n transform: rotate(0deg);\n }\n\n div[data-type='in'] md-icon[data-angle='0'] {\n transform: rotate(90deg);\n }\n\n div[data-type='in'] md-icon[data-angle='180'] {\n transform: rotate(-90deg);\n }\n\n div[data-type='in'] md-icon[data-angle='90'] {\n transform: rotate(180deg);\n }\n\n div[data-type='out'] md-icon[data-angle='270'] {\n transform: rotate(0deg);\n }\n\n div[data-type='out'] md-icon[data-angle='0'] {\n transform: rotate(90deg);\n }\n\n div[data-type='out'] md-icon[data-angle='180'] {\n transform: rotate(-90deg);\n }\n\n div[data-type='out'] md-icon[data-angle='90'] {\n transform: rotate(180deg);\n }\n `\n ]\n\n @property({ attribute: false }) value: AnchorModel[] = []\n\n render() {\n const anchors = this.value || []\n\n return html`\n <fieldset>\n <ul>\n ${anchors.map(\n ({ id, angle, type }) => html`\n <li>\n <div data-id=${id!}>${id}</div>\n <div @click=${this.onClick.bind(this)} data-angle=${angle!} data-type=${type}>\n ${type == 'in'\n ? html`\n <md-icon ?selected=${angle == 180} data-angle=\"180\">step_into</md-icon>\n <md-icon ?selected=${angle == 90} data-angle=\"90\">step_into</md-icon>\n <md-icon ?selected=${angle == 270} data-angle=\"270\">step_into</md-icon>\n <md-icon ?selected=${angle == 0} data-angle=\"0\">step_into</md-icon>\n `\n : html`\n <md-icon ?selected=${angle == 180} data-angle=\"180\">step_out</md-icon>\n <md-icon ?selected=${angle == 90} data-angle=\"90\">step_out</md-icon>\n <md-icon ?selected=${angle == 270} data-angle=\"270\">step_out</md-icon>\n <md-icon ?selected=${angle == 0} data-angle=\"0\">step_out</md-icon>\n `}\n </div>\n </li>\n `\n )}\n </ul>\n </fieldset>\n `\n }\n\n onClick(e: MouseEvent) {\n e.stopPropagation()\n\n const target = e.target as Element\n const currentTarget = e.currentTarget as Element\n\n if (target === currentTarget || !target.hasAttribute('data-angle')) {\n return\n }\n\n const value = target.getAttribute('data-angle') as string\n\n currentTarget.setAttribute('data-angle', value)\n\n const lis = this.renderRoot.querySelectorAll('li')\n this.value = Array.from(lis).map(li => {\n const id = li.querySelector('[data-id]')?.getAttribute('data-id')!\n const angle = li.querySelector('div[data-angle]')?.getAttribute('data-angle')\n const origin = this.value.find(anchor => anchor.id == id)!\n\n return { ...origin, angle: Number(angle) }\n })\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: this.value\n })\n )\n }\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import './ox-input-anchors';
2
+ import { OxPropertyEditor, PropertySpec } from '@operato/property-editor';
3
+ import { AnchorModel } from '../types';
4
+ export declare class PropertyEditorAnchors extends OxPropertyEditor {
5
+ editorTemplate(value: AnchorModel[], spec: PropertySpec): import("lit-html").TemplateResult<1>;
6
+ }
@@ -0,0 +1,25 @@
1
+ import { __decorate } from "tslib";
2
+ import './ox-input-anchors';
3
+ import { html } from 'lit';
4
+ import { customElement } from 'lit/decorators.js';
5
+ import { OxPropertyEditor } from '@operato/property-editor';
6
+ let PropertyEditorAnchors = class PropertyEditorAnchors extends OxPropertyEditor {
7
+ editorTemplate(value, spec) {
8
+ const { defaultValue = [] } = spec;
9
+ value || (value = []);
10
+ const anchors = defaultValue
11
+ .map(({ id, ...others }) => {
12
+ const anchor = value.find(v => v.id == id);
13
+ if (anchor) {
14
+ return { ...others, ...anchor };
15
+ }
16
+ })
17
+ .filter(Boolean);
18
+ return html ` <ox-input-anchors .value=${anchors} fullwidth></ox-input-anchors> `;
19
+ }
20
+ };
21
+ PropertyEditorAnchors = __decorate([
22
+ customElement('ox-property-editor-anchors')
23
+ ], PropertyEditorAnchors);
24
+ export { PropertyEditorAnchors };
25
+ //# sourceMappingURL=ox-property-editor-anchors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-property-editor-anchors.js","sourceRoot":"","sources":["../../../src/property-editors/ox-property-editor-anchors.ts"],"names":[],"mappings":";AAAA,OAAO,oBAAoB,CAAA;AAE3B,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,gBAAgB,EAAgB,MAAM,0BAA0B,CAAA;AAIlE,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,gBAAgB;IACzD,cAAc,CAAC,KAAoB,EAAE,IAAkB;QACrD,MAAM,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,IAAI,CAAA;QAClC,KAAK,KAAL,KAAK,GAAK,EAAE,EAAA;QAEZ,MAAM,OAAO,GAAI,YAA8B;aAC5C,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE;YACzB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;YAC1C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;YACjC,CAAC;QACH,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAkB,CAAA;QAEnC,OAAO,IAAI,CAAA,6BAA6B,OAAO,iCAAiC,CAAA;IAClF,CAAC;CACF,CAAA;AAhBY,qBAAqB;IADjC,aAAa,CAAC,4BAA4B,CAAC;GAC/B,qBAAqB,CAgBjC","sourcesContent":["import './ox-input-anchors'\n\nimport { html } from 'lit'\nimport { customElement } from 'lit/decorators.js'\n\nimport { OxPropertyEditor, PropertySpec } from '@operato/property-editor'\nimport { AnchorModel } from '../types'\n\n@customElement('ox-property-editor-anchors')\nexport class PropertyEditorAnchors extends OxPropertyEditor {\n editorTemplate(value: AnchorModel[], spec: PropertySpec) {\n const { defaultValue = [] } = spec\n value ||= []\n\n const anchors = (defaultValue as AnchorModel[])\n .map(({ id, ...others }) => {\n const anchor = value.find(v => v.id == id)\n if (anchor) {\n return { ...others, ...anchor }\n }\n })\n .filter(Boolean) as AnchorModel[]\n\n return html` <ox-input-anchors .value=${anchors} fullwidth></ox-input-anchors> `\n }\n}\n"]}
@@ -0,0 +1,97 @@
1
+ import { Mapping } from '@operato/data-mapper';
2
+ import { PropertySpec } from '@operato/property-editor';
3
+ import { SVGTemplateResult } from 'lit';
4
+ export interface FlowDataSchema {
5
+ type: 'object' | 'array' | 'string' | 'number' | 'boolean';
6
+ properties?: {
7
+ [key: string]: FlowDataSchema;
8
+ };
9
+ required?: string[];
10
+ }
11
+ export interface FlowNodeDataSchema {
12
+ inputSchema: FlowDataSchema | undefined;
13
+ outputSchema: FlowDataSchema | undefined;
14
+ dataSourceSchema: FlowDataSchema | undefined;
15
+ }
16
+ export interface FlowEntityModel {
17
+ id: string;
18
+ type: string;
19
+ subtype?: string;
20
+ label?: string;
21
+ options?: {
22
+ [key: string]: any;
23
+ };
24
+ }
25
+ export interface FlowEntity extends FlowEntityModel {
26
+ optionsSpec: PropertySpec[];
27
+ selected: boolean;
28
+ update: (model: Partial<FlowEntityModel>) => void;
29
+ updateOptions: (options: {
30
+ [key: string]: any;
31
+ }) => void;
32
+ }
33
+ /** 앵커 타입 */
34
+ export interface AnchorModel extends FlowEntityModel {
35
+ type: 'in' | 'out';
36
+ pos: {
37
+ x: number;
38
+ y: number;
39
+ };
40
+ angle?: number;
41
+ weight?: number;
42
+ }
43
+ export interface Anchor extends AnchorModel {
44
+ node: FlowNode;
45
+ render(): SVGTemplateResult;
46
+ }
47
+ /** 플로우 노드 */
48
+ export interface FlowNodeModel extends FlowEntityModel, FlowNodeDataSchema {
49
+ pos: {
50
+ x: number;
51
+ y: number;
52
+ };
53
+ size: {
54
+ w: number;
55
+ h: number;
56
+ };
57
+ anchorsOption?: {
58
+ id: string;
59
+ [key: string]: any;
60
+ }[];
61
+ }
62
+ export interface FlowNode extends FlowEntity, FlowNodeModel {
63
+ anchors: Anchor[];
64
+ anchorModels: AnchorModel[];
65
+ findAnchor(id: string): Anchor | undefined;
66
+ render(): SVGTemplateResult;
67
+ renderNode(): SVGTemplateResult;
68
+ }
69
+ export interface AnchorPointer {
70
+ nodeId: string;
71
+ anchorId: string;
72
+ }
73
+ /** 플로우 엣지 */
74
+ export interface FlowEdgeModel extends FlowEntityModel {
75
+ type: string;
76
+ from: AnchorPointer;
77
+ to: AnchorPointer;
78
+ weight?: number;
79
+ dataMappings: Mapping[];
80
+ }
81
+ export interface FlowEdge extends FlowEntity, FlowEdgeModel {
82
+ fromAnchor?: Anchor;
83
+ toAnchor?: Anchor;
84
+ render(): SVGTemplateResult;
85
+ }
86
+ export type EditorMode = 'edit' | 'debug';
87
+ export type FlowModel = {
88
+ nodes: FlowNodeModel[];
89
+ edges: FlowEdgeModel[];
90
+ };
91
+ export type FlowNodeImplementation = new (...args: any[]) => FlowNode;
92
+ export type TaskType = {
93
+ name: string;
94
+ description: string | null;
95
+ help: string | null;
96
+ parameterSpec: PropertySpec[];
97
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Mapping } from '@operato/data-mapper'\nimport { PropertySpec } from '@operato/property-editor'\nimport { SVGTemplateResult } from 'lit'\n\nexport interface FlowDataSchema {\n type: 'object' | 'array' | 'string' | 'number' | 'boolean'\n properties?: { [key: string]: FlowDataSchema }\n required?: string[]\n}\n\nexport interface FlowNodeDataSchema {\n inputSchema: FlowDataSchema | undefined\n outputSchema: FlowDataSchema | undefined\n dataSourceSchema: FlowDataSchema | undefined\n}\n\n// export interface FlowDataMapping {\n// toField: string\n// mappingType: 'direct' | 'expression'\n// fromFields: { nodeId: string; field: string }[] // ⬅ 명확한 데이터 출처 명시\n// expression?: string\n// }\n\nexport interface FlowEntityModel {\n id: string\n type: string\n subtype?: string\n label?: string\n options?: { [key: string]: any }\n}\n\nexport interface FlowEntity extends FlowEntityModel {\n optionsSpec: PropertySpec[]\n selected: boolean\n update: (model: Partial<FlowEntityModel>) => void\n updateOptions: (options: { [key: string]: any }) => void\n}\n\n/** 앵커 타입 */\nexport interface AnchorModel extends FlowEntityModel {\n type: 'in' | 'out'\n pos: { x: number; y: number }\n angle?: number\n weight?: number\n}\n\nexport interface Anchor extends AnchorModel {\n node: FlowNode\n render(): SVGTemplateResult\n}\n\n/** 플로우 노드 */\nexport interface FlowNodeModel extends FlowEntityModel, FlowNodeDataSchema {\n pos: { x: number; y: number }\n size: { w: number; h: number }\n anchorsOption?: { id: string; [key: string]: any }[]\n}\n\nexport interface FlowNode extends FlowEntity, FlowNodeModel {\n anchors: Anchor[]\n anchorModels: AnchorModel[]\n findAnchor(id: string): Anchor | undefined\n render(): SVGTemplateResult\n renderNode(): SVGTemplateResult\n}\n\nexport interface AnchorPointer {\n nodeId: string\n anchorId: string\n}\n\n/** 플로우 엣지 */\nexport interface FlowEdgeModel extends FlowEntityModel {\n type: string\n from: AnchorPointer\n to: AnchorPointer\n weight?: number\n dataMappings: Mapping[]\n}\n\nexport interface FlowEdge extends FlowEntity, FlowEdgeModel {\n fromAnchor?: Anchor\n toAnchor?: Anchor\n render(): SVGTemplateResult\n}\n\nexport type EditorMode = 'edit' | 'debug'\n\nexport type FlowModel = { nodes: FlowNodeModel[]; edges: FlowEdgeModel[] }\n\nexport type FlowNodeImplementation = new (...args: any[]) => FlowNode\n\nexport type TaskType = {\n name: string\n description: string | null\n help: string | null\n parameterSpec: PropertySpec[]\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import { TreeNode } from '@operato/data-mapper';
2
+ import { FlowDataSchema, FlowNode } from '../types.js';
3
+ import { PropertySpec } from '@operato/property-editor';
4
+ export declare function convertNodesToTree(nodes: FlowNode[], except: FlowNode[]): TreeNode;
5
+ export declare function convertSchemaToTree(schema: FlowDataSchema, rootLabel: string): TreeNode;
6
+ export declare function convertPropertySpecsToSchema(propertySpecs: PropertySpec[]): FlowDataSchema;
@@ -0,0 +1,50 @@
1
+ export function convertNodesToTree(nodes, except) {
2
+ const schema = {
3
+ type: 'object',
4
+ properties: nodes
5
+ .filter(node => !except.includes(node))
6
+ .reduce((sum, node) => {
7
+ const { type, subtype, label, outputSchema } = node;
8
+ sum[label || subtype || type] = outputSchema;
9
+ return sum;
10
+ }, {})
11
+ };
12
+ return convertSchemaToTree(schema, 'Context Data');
13
+ }
14
+ export function convertSchemaToTree(schema, rootLabel) {
15
+ const convert = (schema, idPrefix) => {
16
+ return {
17
+ id: idPrefix,
18
+ label: idPrefix || rootLabel,
19
+ multiplicity: schema.type === 'array' ? '*' : '1',
20
+ children: schema.properties
21
+ ? Object.entries(schema.properties).map(([key, subSchema]) => convert(subSchema, `${key}`))
22
+ : undefined
23
+ };
24
+ };
25
+ return convert(schema, rootLabel.toLowerCase());
26
+ }
27
+ export function convertPropertySpecsToSchema(propertySpecs) {
28
+ return {
29
+ type: 'object',
30
+ properties: propertySpecs.reduce((sum, propertySpec) => {
31
+ const { name, type } = propertySpec;
32
+ let schemaType = 'string';
33
+ switch (type) {
34
+ case 'string':
35
+ case 'number':
36
+ case 'boolena':
37
+ schemaType = type;
38
+ break;
39
+ case 'checkbox':
40
+ schemaType = 'boolean';
41
+ break;
42
+ default:
43
+ schemaType = 'object';
44
+ }
45
+ sum[name] = { type: schemaType };
46
+ return sum;
47
+ }, {})
48
+ };
49
+ }
50
+ //# sourceMappingURL=generate-mapping-scheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-mapping-scheme.js","sourceRoot":"","sources":["../../../src/utils/generate-mapping-scheme.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,kBAAkB,CAAC,KAAiB,EAAE,MAAkB;IACtE,MAAM,MAAM,GAAmB;QAC7B,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,KAAK;aACd,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YACpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAI,CAAA;YACnD,GAAG,CAAC,KAAK,IAAI,OAAO,IAAI,IAAI,CAAC,GAAG,YAAY,CAAA;YAC5C,OAAO,GAAG,CAAA;QACZ,CAAC,EAAE,EAAS,CAAC;KAChB,CAAA;IAED,OAAO,mBAAmB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAsB,EAAE,SAAiB;IAC3E,MAAM,OAAO,GAAG,CAAC,MAAsB,EAAE,QAAgB,EAAY,EAAE;QACrE,OAAO;YACL,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,QAAQ,IAAI,SAAS;YAC5B,YAAY,EAAE,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;YACjD,QAAQ,EAAE,MAAM,CAAC,UAAU;gBACzB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;gBAC3F,CAAC,CAAC,SAAS;SACd,CAAA;IACH,CAAC,CAAA;IAED,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,aAA6B;IACxE,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,aAAa,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE;YACpB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,YAAY,CAAA;YACnC,IAAI,UAAU,GAAyD,QAAQ,CAAA;YAE/E,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,QAAQ,CAAC;gBACd,KAAK,QAAQ,CAAC;gBACd,KAAK,SAAS;oBACZ,UAAU,GAAG,IAAW,CAAA;oBACxB,MAAK;gBACP,KAAK,UAAU;oBACb,UAAU,GAAG,SAAS,CAAA;oBACtB,MAAK;gBACP;oBACE,UAAU,GAAG,QAAQ,CAAA;YACzB,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;YAEhC,OAAO,GAAG,CAAA;QACZ,CAAC,EACD,EAAuC,CACxC;KACF,CAAA;AACH,CAAC","sourcesContent":["import { TreeNode } from '@operato/data-mapper'\nimport { FlowDataSchema, FlowNode } from '../types.js'\nimport { PropertySpec } from '@operato/property-editor'\n\nexport function convertNodesToTree(nodes: FlowNode[], except: FlowNode[]): TreeNode {\n const schema: FlowDataSchema = {\n type: 'object',\n properties: nodes\n .filter(node => !except.includes(node))\n .reduce((sum, node) => {\n const { type, subtype, label, outputSchema } = node\n sum[label || subtype || type] = outputSchema\n return sum\n }, {} as any)\n }\n\n return convertSchemaToTree(schema, 'Context Data')\n}\n\nexport function convertSchemaToTree(schema: FlowDataSchema, rootLabel: string): TreeNode {\n const convert = (schema: FlowDataSchema, idPrefix: string): TreeNode => {\n return {\n id: idPrefix,\n label: idPrefix || rootLabel,\n multiplicity: schema.type === 'array' ? '*' : '1',\n children: schema.properties\n ? Object.entries(schema.properties).map(([key, subSchema]) => convert(subSchema, `${key}`))\n : undefined\n }\n }\n\n return convert(schema, rootLabel.toLowerCase())\n}\n\nexport function convertPropertySpecsToSchema(propertySpecs: PropertySpec[]): FlowDataSchema {\n return {\n type: 'object',\n properties: propertySpecs.reduce(\n (sum, propertySpec) => {\n const { name, type } = propertySpec\n let schemaType: 'string' | 'number' | 'boolean' | 'object' | 'array' = 'string'\n\n switch (type) {\n case 'string':\n case 'number':\n case 'boolena':\n schemaType = type as any\n break\n case 'checkbox':\n schemaType = 'boolean'\n break\n default:\n schemaType = 'object'\n }\n\n sum[name] = { type: schemaType }\n\n return sum\n },\n {} as { [key: string]: FlowDataSchema }\n )\n }\n}\n"]}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@operato/flow",
3
- "version": "9.0.1",
3
+ "version": "9.0.2",
4
4
  "description": "Visual Scenario Flow Builder & Viewer",
5
5
  "author": "heartyoh",
6
6
  "type": "module",
7
- "main": "dist/index.js",
8
- "module": "dist/index.js",
7
+ "main": "dist/src/index.js",
8
+ "module": "dist/src/index.js",
9
9
  "license": "MIT",
10
10
  "operato": true,
11
11
  "publishConfig": {
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@lit/context": "1.1.4",
46
- "@operato/data-mapper": "^9.0.1",
46
+ "@operato/data-mapper": "^9.0.2",
47
47
  "@operato/popup": "^9.0.1",
48
48
  "@operato/property-editor": "^9.0.1",
49
49
  "dagre-esm": "^0.8.5",
@@ -86,5 +86,5 @@
86
86
  "prettier --write"
87
87
  ]
88
88
  },
89
- "gitHead": "28e94ba161590458a69c7d68e93aa9283fd95531"
89
+ "gitHead": "595a66745b97ab3f364e870aabff7b05c7bf3da8"
90
90
  }