json.js 2.3 KB

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