json-to-bpmn-xml 1.0.0

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.
package/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # json-to-bpmn-xml
2
+
3
+ Convert JSON workflow definitions into BPMN 2.0 XML.
4
+
5
+ ## Features
6
+
7
+ - JSON → BPMN 2.0 XML conversion
8
+ - Supports tasks, gateways, events
9
+ - TypeScript support
10
+ - ESM module
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ npm install json-to-bpmn-xml
16
+ ```
17
+
18
+ ## USAGE
19
+
20
+ ```typescript
21
+ import { convert } from "json-to-bpmn-xml";
22
+
23
+ const model = {
24
+ id: "process_1",
25
+ name: "Simple Process",
26
+ nodes: [
27
+ { id: "start", type: "start" },
28
+ { id: "task1", type: "userTask", name: "Do something" },
29
+ { id: "end", type: "end" }
30
+ ],
31
+ edges: [
32
+ { id: "e1", source: "start", target: "task1" },
33
+ { id: "e2", source: "task1", target: "end" }
34
+ ]
35
+ };
36
+
37
+ const xml = await convert(model);
38
+
39
+ console.log(xml);
40
+ ```
41
+
42
+ ## ProcessModel
43
+
44
+ ```typescript
45
+ type ProcessModel = {
46
+ id: string;
47
+ name: string;
48
+ nodes: {
49
+ id: string;
50
+ type: "start" | "end" | "userTask" | "serviceTask" | "exclusiveGateway";
51
+ name?: string;
52
+ }[];
53
+ edges: {
54
+ id: string;
55
+ source: string;
56
+ target: string;
57
+ }[];
58
+ };
59
+ ```
60
+
61
+ ## Built With
62
+
63
+ This library is built on top of [bpmn-moddle](https://github.com/bpmn-io/bpmn-moddle) and [xml-formatter](https://github.com/chrisbottin/xml-formatter)
64
+
65
+ ## License
66
+
67
+ Use under the terms of the [Apache-2.0](https://opensource.org/license/Apache-2.0).
@@ -0,0 +1,31 @@
1
+ interface ILane {
2
+ id: string;
3
+ name: string;
4
+ nodeIds: string[];
5
+ }
6
+
7
+ type NodeType = "start" | "end" | "userTask" | "serviceTask" | "exclusiveGateway" | "parallelGateway";
8
+ interface INode {
9
+ id: string;
10
+ type: NodeType;
11
+ name?: string;
12
+ }
13
+
14
+ interface IEdge {
15
+ id?: string;
16
+ source: string;
17
+ target: string;
18
+ name?: string;
19
+ }
20
+
21
+ interface ProcessModel {
22
+ id: string;
23
+ name?: string;
24
+ lanes?: ILane[];
25
+ nodes: INode[];
26
+ edges: IEdge[];
27
+ }
28
+
29
+ declare function convert(model: ProcessModel): Promise<string>;
30
+
31
+ export { type ProcessModel, convert };
package/dist/index.js ADDED
@@ -0,0 +1,295 @@
1
+ // src/converter/BpmnConverter.ts
2
+ import { BpmnModdle } from "bpmn-moddle";
3
+
4
+ // src/constants/node-map.ts
5
+ var NODE_MAP = {
6
+ start: "bpmn:StartEvent",
7
+ end: "bpmn:EndEvent",
8
+ userTask: "bpmn:UserTask",
9
+ serviceTask: "bpmn:ServiceTask",
10
+ exclusiveGateway: "bpmn:ExclusiveGateway",
11
+ parallelGateway: "bpmn:ParallelGateway"
12
+ };
13
+
14
+ // src/builders/node.builder.ts
15
+ var NodeBuilder = class {
16
+ constructor(moddle) {
17
+ this.moddle = moddle;
18
+ }
19
+ moddle;
20
+ build(node) {
21
+ const type = NODE_MAP[node.type];
22
+ return this.moddle.create(type, {
23
+ id: node.id,
24
+ name: node.name
25
+ });
26
+ }
27
+ };
28
+
29
+ // src/builders/flow.builder.ts
30
+ var FlowBuilder = class {
31
+ constructor(moddle) {
32
+ this.moddle = moddle;
33
+ }
34
+ moddle;
35
+ build(edge, elementById, index) {
36
+ const source = elementById.get(String(edge.source));
37
+ const target = elementById.get(String(edge.target));
38
+ const flow = this.moddle.create("bpmn:SequenceFlow", {
39
+ id: edge.id ?? `Flow_${index + 1}`,
40
+ name: edge.name,
41
+ sourceRef: source,
42
+ targetRef: target
43
+ });
44
+ if (source) {
45
+ source.outgoing = [...source.outgoing ?? [], flow];
46
+ }
47
+ if (target) {
48
+ target.incoming = [...target.incoming ?? [], flow];
49
+ }
50
+ return flow;
51
+ }
52
+ buildMeta(edge, flow, index) {
53
+ return {
54
+ id: String(edge.id ?? `Flow_${index + 1}`),
55
+ source: String(edge.source),
56
+ target: String(edge.target),
57
+ flow
58
+ };
59
+ }
60
+ };
61
+
62
+ // src/builders/process.builder.ts
63
+ var ProcessBuilder = class {
64
+ constructor(moddle) {
65
+ this.moddle = moddle;
66
+ }
67
+ moddle;
68
+ build(id, name, elements, flows) {
69
+ return this.moddle.create("bpmn:Process", {
70
+ id,
71
+ name,
72
+ isExecutable: false,
73
+ flowElements: [...elements, ...flows]
74
+ });
75
+ }
76
+ };
77
+
78
+ // src/builders/definitions.builder.ts
79
+ var DefinitionsBuilder = class {
80
+ constructor(moddle) {
81
+ this.moddle = moddle;
82
+ }
83
+ moddle;
84
+ build(process) {
85
+ return this.moddle.create("bpmn:Definitions", {
86
+ id: `${process.id}_definitions`,
87
+ targetNamespace: "http://bpmn.io/schema/bpmn",
88
+ rootElements: [process],
89
+ $attrs: {
90
+ "xsi:schemaLocation": "http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
91
+ }
92
+ });
93
+ }
94
+ };
95
+
96
+ // src/elk.layout.ts
97
+ import ELK from "elkjs";
98
+ var elk = new ELK();
99
+ async function layoutGraph(nodes, edges) {
100
+ const graph = {
101
+ id: "root",
102
+ layoutOptions: {
103
+ "elk.algorithm": "layered",
104
+ "elk.direction": "RIGHT",
105
+ "elk.layered.spacing.nodeNodeBetweenLayers": "120",
106
+ "elk.spacing.nodeNode": "80",
107
+ "elk.layered.nodePlacement.strategy": "NETWORK_SIMPLEX",
108
+ "elk.layered.crossingMinimization.strategy": "LAYER_SWEEP",
109
+ "elk.layered.considerModelOrder.strategy": "NODES_AND_EDGES"
110
+ },
111
+ children: nodes.map((n) => ({
112
+ id: n.id,
113
+ width: n.width ?? 120,
114
+ height: n.height ?? 80
115
+ })),
116
+ edges: edges.map((e) => ({
117
+ id: e.id,
118
+ sources: [e.source],
119
+ targets: [e.target],
120
+ junctionPoints: []
121
+ }))
122
+ };
123
+ return await elk.layout(graph);
124
+ }
125
+
126
+ // src/builders/diagram.builder.ts
127
+ var NODE_SIZE = {
128
+ default: { width: 100, height: 80 },
129
+ start: { width: 36, height: 36 },
130
+ end: { width: 36, height: 36 },
131
+ gateway: { width: 50, height: 50 }
132
+ };
133
+ function getBounds(type) {
134
+ if (type === "bpmn:StartEvent" || type === "bpmn:EndEvent") {
135
+ return NODE_SIZE.start;
136
+ }
137
+ if (type.endsWith("Gateway")) {
138
+ return NODE_SIZE.gateway;
139
+ }
140
+ return NODE_SIZE.default;
141
+ }
142
+ var DiagramBuilder = class {
143
+ constructor(moddle) {
144
+ this.moddle = moddle;
145
+ }
146
+ moddle;
147
+ async build(process, elements, flows) {
148
+ const nodes = elements.map((el) => {
149
+ const bounds = getBounds(el.$type);
150
+ return {
151
+ id: String(el.id),
152
+ width: bounds.width,
153
+ height: bounds.height,
154
+ bpmnElement: el
155
+ };
156
+ });
157
+ const edges = flows.map((flow) => ({
158
+ id: String(flow.id),
159
+ source: String(flow.source),
160
+ target: String(flow.target),
161
+ flow: flow.flow
162
+ }));
163
+ const layout = await layoutGraph(nodes, edges);
164
+ const nodeMap = new Map(
165
+ (layout.children ?? []).filter((n) => n && n.id).map((n) => [String(n.id), n])
166
+ );
167
+ const shapes = elements.map((element) => {
168
+ const pos = nodeMap.get(String(element.id));
169
+ if (!pos) return null;
170
+ const bounds = {
171
+ x: Number(pos.x ?? 0),
172
+ y: Number(pos.y ?? 0),
173
+ width: Number(pos.width ?? NODE_SIZE.default.width),
174
+ height: Number(pos.height ?? NODE_SIZE.default.height)
175
+ };
176
+ return this.moddle.create("bpmndi:BPMNShape", {
177
+ id: `${element.id}_di`,
178
+ bpmnElement: element,
179
+ bounds: this.moddle.create("dc:Bounds", bounds)
180
+ });
181
+ }).filter(Boolean);
182
+ const flowById = new Map(edges.map((f) => [String(f.id), f.flow]));
183
+ const edgeWaypoints = (layout.edges ?? []).map((edge) => {
184
+ if (!edge || !edge.id) return null;
185
+ const section = edge.sections?.[0];
186
+ if (!section) return null;
187
+ const points = [
188
+ section.startPoint,
189
+ ...section.bendPoints ?? [],
190
+ section.endPoint
191
+ ].filter(
192
+ (point) => point && point.x !== void 0 && point.y !== void 0 && !Number.isNaN(Number(point.x)) && !Number.isNaN(Number(point.y))
193
+ ).map((point) => ({
194
+ x: Number(point.x),
195
+ y: Number(point.y)
196
+ }));
197
+ if (points.length < 2) return null;
198
+ const flow = flowById.get(String(edge.id)) ?? edges.find(
199
+ (f) => String(f.source) === String(edge.sources?.[0]) && String(f.target) === String(edge.targets?.[0])
200
+ )?.flow;
201
+ if (!flow) return null;
202
+ return this.moddle.create("bpmndi:BPMNEdge", {
203
+ id: `${edge.id}_di`,
204
+ bpmnElement: flow,
205
+ waypoint: points.map(
206
+ (point) => this.moddle.create("dc:Point", {
207
+ x: point.x,
208
+ y: point.y
209
+ })
210
+ )
211
+ });
212
+ }).filter(Boolean);
213
+ const plane = this.moddle.create("bpmndi:BPMNPlane", {
214
+ id: "BPMNPlane_1",
215
+ bpmnElement: process,
216
+ planeElement: [...shapes, ...edgeWaypoints]
217
+ });
218
+ return this.moddle.create("bpmndi:BPMNDiagram", {
219
+ id: "BPMNDiagram_1",
220
+ plane
221
+ });
222
+ }
223
+ };
224
+
225
+ // src/converter/BpmnConverter.ts
226
+ import format from "xml-formatter";
227
+ var BpmnConverter = class {
228
+ moddle;
229
+ nodeBuilder;
230
+ flowBuilder;
231
+ processBuilder;
232
+ definitionsBuilder;
233
+ diagramBuilder;
234
+ constructor() {
235
+ this.moddle = new BpmnModdle();
236
+ this.nodeBuilder = new NodeBuilder(this.moddle);
237
+ this.flowBuilder = new FlowBuilder(this.moddle);
238
+ this.processBuilder = new ProcessBuilder(this.moddle);
239
+ this.definitionsBuilder = new DefinitionsBuilder(this.moddle);
240
+ this.diagramBuilder = new DiagramBuilder(this.moddle);
241
+ }
242
+ async convert(model) {
243
+ const elements = this.buildElements(model);
244
+ const elementById = this.buildElementMap(elements);
245
+ const flows = this.buildFlows(model, elementById);
246
+ const flowMeta = this.buildFlowMeta(model, flows);
247
+ const process = this.processBuilder.build(
248
+ model.id,
249
+ model.name,
250
+ elements,
251
+ flows
252
+ );
253
+ const definitions = this.definitionsBuilder.build(process);
254
+ definitions.diagrams = [
255
+ await this.diagramBuilder.build(process, elements, flowMeta)
256
+ ];
257
+ const { xml } = await this.moddle.toXML(definitions);
258
+ return this.normalizeXml(xml);
259
+ }
260
+ buildElements(model) {
261
+ return model.nodes.map((node) => this.nodeBuilder.build(node));
262
+ }
263
+ buildElementMap(elements) {
264
+ return new Map(
265
+ elements.map((el) => [String(el.id), el])
266
+ );
267
+ }
268
+ buildFlows(model, elementById) {
269
+ return model.edges.map(
270
+ (edge, index) => this.flowBuilder.build(edge, elementById, index)
271
+ );
272
+ }
273
+ buildFlowMeta(model, flows) {
274
+ return model.edges.map(
275
+ (edge, index) => this.flowBuilder.buildMeta(edge, flows[index], index)
276
+ );
277
+ }
278
+ normalizeXml(xml) {
279
+ return format(xml, {
280
+ indentation: " ",
281
+ collapseContent: true,
282
+ lineSeparator: "\n"
283
+ });
284
+ }
285
+ };
286
+
287
+ // src/index.ts
288
+ async function convert(model) {
289
+ const converter = new BpmnConverter();
290
+ return await converter.convert(model);
291
+ }
292
+ export {
293
+ convert
294
+ };
295
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/converter/BpmnConverter.ts","../src/constants/node-map.ts","../src/builders/node.builder.ts","../src/builders/flow.builder.ts","../src/builders/process.builder.ts","../src/builders/definitions.builder.ts","../src/elk.layout.ts","../src/builders/diagram.builder.ts","../src/index.ts"],"sourcesContent":["import { BpmnModdle } from \"bpmn-moddle\";\nimport { NodeBuilder } from \"../builders/node.builder\";\nimport { FlowBuilder } from \"../builders/flow.builder\";\nimport { ProcessBuilder } from \"../builders/process.builder\";\nimport { DefinitionsBuilder } from \"../builders/definitions.builder\";\nimport { DiagramBuilder } from \"../builders/diagram.builder\";\nimport { ProcessModel } from \"../types/process\";\nimport type { BPMNModdle, FlowNode } from \"bpmn-moddle\";\nimport format from \"xml-formatter\";\n\nexport class BpmnConverter {\n private moddle: BPMNModdle;\n private nodeBuilder: NodeBuilder;\n private flowBuilder: FlowBuilder;\n private processBuilder: ProcessBuilder;\n private definitionsBuilder: DefinitionsBuilder;\n private diagramBuilder: DiagramBuilder;\n\n constructor() {\n this.moddle = new BpmnModdle();\n this.nodeBuilder = new NodeBuilder(this.moddle);\n this.flowBuilder = new FlowBuilder(this.moddle);\n this.processBuilder = new ProcessBuilder(this.moddle);\n this.definitionsBuilder = new DefinitionsBuilder(this.moddle);\n this.diagramBuilder = new DiagramBuilder(this.moddle);\n }\n\n async convert(model: ProcessModel): Promise<string> {\n const elements = this.buildElements(model);\n const elementById = this.buildElementMap(elements);\n\n const flows = this.buildFlows(model, elementById);\n const flowMeta = this.buildFlowMeta(model, flows);\n\n const process = this.processBuilder.build(\n model.id,\n model.name,\n elements,\n flows,\n );\n\n const definitions = this.definitionsBuilder.build(process);\n definitions.diagrams = [\n await this.diagramBuilder.build(process, elements, flowMeta),\n ];\n\n const { xml } = await this.moddle.toXML(definitions);\n return this.normalizeXml(xml);\n }\n\n private buildElements(model: ProcessModel) {\n return model.nodes.map((node) => this.nodeBuilder.build(node));\n }\n\n private buildElementMap(elements: any[]) {\n return new Map(\n elements.map((el) => [String(el.id), el] as [string, FlowNode]),\n );\n }\n\n private buildFlows(model: ProcessModel, elementById: Map<string, FlowNode>) {\n return model.edges.map((edge, index) =>\n this.flowBuilder.build(edge, elementById, index),\n );\n }\n\n private buildFlowMeta(model: ProcessModel, flows: any[]) {\n return model.edges.map((edge, index) =>\n this.flowBuilder.buildMeta(edge, flows[index], index),\n );\n }\n\n private normalizeXml(xml: string) {\n return format(xml, {\n indentation: \" \",\n collapseContent: true,\n lineSeparator: \"\\n\",\n });\n }\n}","import { NodeType } from \"../types/Node\";\n\nexport const NODE_MAP: Record<NodeType, string> = {\n start: \"bpmn:StartEvent\",\n end: \"bpmn:EndEvent\",\n userTask: \"bpmn:UserTask\",\n serviceTask: \"bpmn:ServiceTask\",\n exclusiveGateway: \"bpmn:ExclusiveGateway\",\n parallelGateway: \"bpmn:ParallelGateway\",\n};","import type { BPMNModdle as BPMNModdleInstance } from \"bpmn-moddle\";\nimport { NODE_MAP } from \"../constants/node-map\";\nimport { INode } from \"../types/Node\";\n\nexport class NodeBuilder {\n constructor(private moddle: BPMNModdleInstance) {}\n\n build(node: INode) {\n const type = NODE_MAP[node.type];\n\n return this.moddle.create(type, {\n id: node.id,\n name: node.name,\n });\n }\n}\n","import type { BPMNModdle, FlowNode } from \"bpmn-moddle\";\nimport type { IEdge } from \"../types/edge\";\n\nexport interface FlowMeta {\n id: string;\n source: string;\n target: string;\n flow: any;\n}\n\nexport class FlowBuilder {\n constructor(private moddle: BPMNModdle) {}\n\n build(edge: IEdge, elementById: Map<string, FlowNode>, index: number) {\n const source = elementById.get(String(edge.source));\n const target = elementById.get(String(edge.target));\n\n const flow = this.moddle.create(\"bpmn:SequenceFlow\", {\n id: edge.id ?? `Flow_${index + 1}`,\n name: edge.name,\n sourceRef: source,\n targetRef: target,\n });\n\n if (source) {\n source.outgoing = [...(source.outgoing ?? []), flow];\n }\n\n if (target) {\n target.incoming = [...(target.incoming ?? []), flow];\n }\n\n return flow;\n }\n\n buildMeta(edge: IEdge, flow: any, index: number): FlowMeta {\n return {\n id: String(edge.id ?? `Flow_${index + 1}`),\n source: String(edge.source),\n target: String(edge.target),\n flow,\n };\n }\n}","import type { BPMNModdle } from \"bpmn-moddle\";\n\nexport class ProcessBuilder {\n constructor(private moddle: BPMNModdle) {}\n\n build(id: string, name: string | undefined, elements: any[], flows: any[]) {\n return this.moddle.create(\"bpmn:Process\", {\n id,\n name,\n isExecutable: false,\n flowElements: [...elements, ...flows],\n });\n }\n}","import type { BPMNModdle } from \"bpmn-moddle\";\n\nexport class DefinitionsBuilder {\n constructor(private moddle: BPMNModdle) {}\n\n build(process: any) {\n return this.moddle.create(\"bpmn:Definitions\", {\n id: `${process.id}_definitions`,\n targetNamespace: \"http://bpmn.io/schema/bpmn\",\n rootElements: [process],\n $attrs: {\n \"xsi:schemaLocation\":\n \"http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd\",\n },\n });\n }\n}","import ELK from \"elkjs\";\n\nconst elk = new ELK();\n\nexport async function layoutGraph(nodes: any[], edges: any[]) {\n const graph = {\n id: \"root\",\n\n layoutOptions: {\n \"elk.algorithm\": \"layered\",\n \"elk.direction\": \"RIGHT\",\n\n \"elk.layered.spacing.nodeNodeBetweenLayers\": \"120\",\n \"elk.spacing.nodeNode\": \"80\",\n\n \"elk.layered.nodePlacement.strategy\": \"NETWORK_SIMPLEX\",\n \"elk.layered.crossingMinimization.strategy\": \"LAYER_SWEEP\",\n \"elk.layered.considerModelOrder.strategy\": \"NODES_AND_EDGES\",\n },\n\n children: nodes.map((n) => ({\n id: n.id,\n width: n.width ?? 120,\n height: n.height ?? 80,\n })),\n\n edges: edges.map((e) => ({\n id: e.id,\n sources: [e.source],\n targets: [e.target],\n\n junctionPoints: [],\n })),\n };\n\n return await elk.layout(graph);\n}","import type { BPMNModdle } from \"bpmn-moddle\";\nimport { layoutGraph } from \"../elk.layout\";\nimport type { FlowMeta } from \"./flow.builder\";\n\nconst NODE_SIZE = {\n default: { width: 100, height: 80 },\n start: { width: 36, height: 36 },\n end: { width: 36, height: 36 },\n gateway: { width: 50, height: 50 },\n};\n\nfunction getBounds(type: string) {\n if (type === \"bpmn:StartEvent\" || type === \"bpmn:EndEvent\") {\n return NODE_SIZE.start;\n }\n\n if (type.endsWith(\"Gateway\")) {\n return NODE_SIZE.gateway;\n }\n\n return NODE_SIZE.default;\n}\n\nexport class DiagramBuilder {\n constructor(private moddle: BPMNModdle) {}\n\n async build(process: any, elements: any[], flows: FlowMeta[]) {\n const nodes = elements.map((el) => {\n const bounds = getBounds(el.$type);\n\n return {\n id: String(el.id),\n width: bounds.width,\n height: bounds.height,\n bpmnElement: el,\n };\n });\n\n const edges = flows.map((flow) => ({\n id: String(flow.id),\n source: String(flow.source),\n target: String(flow.target),\n flow: flow.flow,\n }));\n\n const layout = await layoutGraph(nodes, edges);\n\n const nodeMap = new Map(\n (layout.children ?? [])\n .filter((n: any) => n && n.id)\n .map((n: any) => [String(n.id), n]),\n );\n\n const shapes = elements\n .map((element) => {\n const pos = nodeMap.get(String(element.id));\n if (!pos) return null;\n\n const bounds = {\n x: Number(pos.x ?? 0),\n y: Number(pos.y ?? 0),\n width: Number(pos.width ?? NODE_SIZE.default.width),\n height: Number(pos.height ?? NODE_SIZE.default.height),\n };\n\n return this.moddle.create(\"bpmndi:BPMNShape\", {\n id: `${element.id}_di`,\n bpmnElement: element,\n bounds: this.moddle.create(\"dc:Bounds\", bounds),\n });\n })\n .filter(Boolean);\n\n const flowById = new Map(edges.map((f) => [String(f.id), f.flow]));\n\n const edgeWaypoints = (layout.edges ?? [])\n .map((edge: any) => {\n if (!edge || !edge.id) return null;\n\n const section = edge.sections?.[0];\n if (!section) return null;\n\n const points = [\n section.startPoint,\n ...(section.bendPoints ?? []),\n section.endPoint,\n ]\n .filter(\n (point) =>\n point &&\n point.x !== undefined &&\n point.y !== undefined &&\n !Number.isNaN(Number(point.x)) &&\n !Number.isNaN(Number(point.y)),\n )\n .map((point: any) => ({\n x: Number(point.x),\n y: Number(point.y),\n }));\n\n if (points.length < 2) return null;\n\n const flow =\n flowById.get(String(edge.id)) ??\n edges.find(\n (f) =>\n String(f.source) === String(edge.sources?.[0]) &&\n String(f.target) === String(edge.targets?.[0]),\n )?.flow;\n\n if (!flow) return null;\n\n return this.moddle.create(\"bpmndi:BPMNEdge\", {\n id: `${edge.id}_di`,\n bpmnElement: flow,\n waypoint: points.map((point) =>\n this.moddle.create(\"dc:Point\", {\n x: point.x,\n y: point.y,\n }),\n ),\n });\n })\n .filter(Boolean);\n\n const plane = this.moddle.create(\"bpmndi:BPMNPlane\", {\n id: \"BPMNPlane_1\",\n bpmnElement: process,\n planeElement: [...shapes, ...edgeWaypoints],\n });\n\n return this.moddle.create(\"bpmndi:BPMNDiagram\", {\n id: \"BPMNDiagram_1\",\n plane,\n });\n }\n}","import { BpmnConverter } from \"./converter/BpmnConverter\";\nimport type { ProcessModel } from \"./types/process\";\n\nexport async function convert(model: ProcessModel): Promise<string> {\n const converter = new BpmnConverter();\n return await converter.convert(model);\n}\n\nexport type { ProcessModel };\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "json-to-bpmn-xml",
3
+ "version": "1.0.0",
4
+ "description": "JSON to BPMN XML converter",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsup",
12
+ "dev": "tsup --watch",
13
+ "test": "vitest",
14
+ "test:watch": "vitest --watch"
15
+ },
16
+ "keywords": [
17
+ "bpmn",
18
+ "xml",
19
+ "converter",
20
+ "json"
21
+ ],
22
+ "author": "Samedov Etibar",
23
+ "license": "Apache-2.0",
24
+ "type": "module",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/ehisamed/json-to-bpmn-xml.git"
28
+ },
29
+ "dependencies": {
30
+ "bpmn-moddle": "^10.0.0",
31
+ "dagre": "^0.8.5",
32
+ "elkjs": "^0.11.1",
33
+ "xml-formatter": "^3.7.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/bpmn-moddle": "^10.0.0",
37
+ "@types/node": "^26.0.0",
38
+ "tsup": "^8.5.1",
39
+ "typescript": "^6.0.3",
40
+ "vitest": "^4.1.9"
41
+ }
42
+ }