setFiles.js 2.0 KB

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