json.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { mapValues, isFunction } from './utils.js';
  2. function stringifyFunction(fn) {
  3. return {
  4. $function: fn.toString()
  5. };
  6. }
  7. function getStateNodeId(stateNode) {
  8. return "#".concat(stateNode.id);
  9. } // derive config from machine
  10. function machineToJSON(stateNode) {
  11. var config = {
  12. type: stateNode.type,
  13. initial: stateNode.initial === undefined ? undefined : String(stateNode.initial),
  14. id: stateNode.id,
  15. key: stateNode.key,
  16. entry: stateNode.onEntry,
  17. exit: stateNode.onExit,
  18. on: mapValues(stateNode.on, function (transition) {
  19. return transition.map(function (t) {
  20. return {
  21. target: t.target ? t.target.map(getStateNodeId) : [],
  22. source: getStateNodeId(t.source),
  23. actions: t.actions,
  24. cond: t.cond,
  25. eventType: t.eventType
  26. };
  27. });
  28. }),
  29. invoke: stateNode.invoke,
  30. states: {}
  31. };
  32. Object.values(stateNode.states).forEach(function (sn) {
  33. config.states[sn.key] = machineToJSON(sn);
  34. });
  35. return config;
  36. }
  37. function stringify(machine) {
  38. return JSON.stringify(machineToJSON(machine), function (_, value) {
  39. if (isFunction(value)) {
  40. return {
  41. $function: value.toString()
  42. };
  43. }
  44. return value;
  45. });
  46. }
  47. function parse(machineString) {
  48. var config = JSON.parse(machineString, function (_, value) {
  49. if (typeof value === 'object' && '$function' in value) {
  50. return new Function(value.value);
  51. }
  52. return value;
  53. });
  54. return config;
  55. }
  56. function jsonify(value) {
  57. Object.defineProperty(value, 'toJSON', {
  58. value: function () {
  59. return mapValues(value, function (subValue) {
  60. if (isFunction(subValue)) {
  61. return stringifyFunction(subValue);
  62. } else if (typeof subValue === 'object' && !Array.isArray(subValue)) {
  63. // mostly for assignments
  64. return mapValues(subValue, function (subSubValue) {
  65. if (isFunction(subSubValue)) {
  66. return stringifyFunction(subSubValue);
  67. }
  68. return subSubValue;
  69. });
  70. }
  71. return subValue;
  72. });
  73. }
  74. });
  75. return value;
  76. }
  77. export { jsonify, machineToJSON, parse, stringify, stringifyFunction };