You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

downloadJSON.web.ts 1.0KB

1234567891011121314151617181920212223242526272829303132333435
  1. /**
  2. * Downloads a JSON object.
  3. *
  4. * @param {Object} json - The JSON object to download.
  5. * @param {string} filename - The filename to give to the downloaded file.
  6. * @returns {void}
  7. */
  8. export function downloadJSON(json: Object, filename: string): void {
  9. const replacer = () => {
  10. const seen = new WeakSet();
  11. return (_: any, value: any) => {
  12. if (typeof value === 'object' && value !== null) {
  13. if (seen.has(value)) {
  14. return '[circular ref]';
  15. }
  16. seen.add(value);
  17. }
  18. return value;
  19. };
  20. };
  21. const data = encodeURIComponent(JSON.stringify(json, replacer(), ' '));
  22. const elem = document.createElement('a');
  23. elem.download = filename;
  24. elem.href = `data:application/json;charset=utf-8,\n${data}`;
  25. elem.dataset.downloadurl = [ 'text/json', elem.download, elem.href ].join(':');
  26. elem.dispatchEvent(new MouseEvent('click', {
  27. view: window,
  28. bubbles: true,
  29. cancelable: false
  30. }));
  31. }