setFiles.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. 'use strict';
  2. // It is not possible to create a real FileList programmatically.
  3. // Therefore assigning `files` property with a programmatically created FileList results in an error.
  4. // Just assigning the property (as per fireEvent) breaks the interweaving with the `value` property.
  5. const fakeFiles = Symbol('files and value properties are mocked');
  6. function restoreProperty(obj, prop, descriptor) {
  7. if (descriptor) {
  8. Object.defineProperty(obj, prop, descriptor);
  9. } else {
  10. // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
  11. delete obj[prop];
  12. }
  13. }
  14. function setFiles(el, files) {
  15. var _el_fakeFiles;
  16. (_el_fakeFiles = el[fakeFiles]) === null || _el_fakeFiles === undefined ? undefined : _el_fakeFiles.restore();
  17. const typeDescr = Object.getOwnPropertyDescriptor(el, 'type');
  18. const valueDescr = Object.getOwnPropertyDescriptor(el, 'value');
  19. const filesDescr = Object.getOwnPropertyDescriptor(el, 'files');
  20. function restore() {
  21. restoreProperty(el, 'type', typeDescr);
  22. restoreProperty(el, 'value', valueDescr);
  23. restoreProperty(el, 'files', filesDescr);
  24. }
  25. el[fakeFiles] = {
  26. restore
  27. };
  28. Object.defineProperties(el, {
  29. files: {
  30. configurable: true,
  31. get: ()=>files
  32. },
  33. value: {
  34. configurable: true,
  35. get: ()=>files.length ? `C:\\fakepath\\${files[0].name}` : '',
  36. set (v) {
  37. if (v === '') {
  38. restore();
  39. } else {
  40. var _valueDescr_set;
  41. valueDescr === null || valueDescr === undefined ? undefined : (_valueDescr_set = valueDescr.set) === null || _valueDescr_set === undefined ? undefined : _valueDescr_set.call(el, v);
  42. }
  43. }
  44. },
  45. type: {
  46. configurable: true,
  47. get: ()=>'file',
  48. set (v) {
  49. if (v !== 'file') {
  50. restore();
  51. el.type = v;
  52. }
  53. }
  54. }
  55. });
  56. }
  57. exports.setFiles = setFiles;