function exportToJson() { const _states = JSON.parse(JSON.stringify(states)); const _connections = JSON.parse(JSON.stringify(connections)).map((conn, index) => { conn.type = connections[index].constructor.name; return conn; }); const data = { states: _states, connections: _connections.filter(conn => conn.type === 'Connection').map(conn => { conn.stateA = conn.stateA.id; conn.stateB = conn.stateB.id; return conn; }), startConnections: _connections.filter(conn => conn.type === 'StartConnection').map(conn => { conn.state = conn.state.id; return conn; }), selfConnections: _connections.filter(conn => conn.type === 'SelfConnection').map(conn => { conn.state = conn.state.id; return conn; }), settings, }; return JSON.stringify(data); } function importFromJson(json) { const data = JSON.parse(json); states.push(...data.states.map(state => Object.setPrototypeOf(state, State.prototype))); connections.push(...data.connections.map(conn => Object.setPrototypeOf(conn, Connection.prototype)).map(conn => { conn.stateA = states.find(state => state.id === conn.stateA); conn.stateB = states.find(state => state.id === conn.stateB); return conn; })); connections.push(...data.startConnections.map(conn => Object.setPrototypeOf(conn, StartConnection.prototype)).map(conn => { conn.state = states.find(state => state.id === conn.state); return conn; })); connections.push(...data.selfConnections.map(conn => Object.setPrototypeOf(conn, SelfConnection.prototype)).map(conn => { conn.state = states.find(state => state.id === conn.state); return conn; })); } function exportToFile() { const name = 'placeholder.fsm'; const json = exportToJson(); console.log(json); downloadFile(name, json, 'application/json'); } function downloadFile(name, content, type) { const element = document.createElement('a'); element.setAttribute('href', `data:${type},charset=utf-8,${content}`); element.setAttribute('download', name); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); }