filepond-plugin-file-validate-size.esm.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*!
  2. * FilePondPluginFileValidateSize 2.2.8
  3. * Licensed under MIT, https://opensource.org/licenses/MIT/
  4. * Please visit https://pqina.nl/filepond/ for details.
  5. */
  6. /* eslint-disable */
  7. const plugin = ({ addFilter, utils }) => {
  8. // get quick reference to Type utils
  9. const { Type, replaceInString, toNaturalFileSize } = utils;
  10. // filtering if an item is allowed in hopper
  11. addFilter('ALLOW_HOPPER_ITEM', (file, { query }) => {
  12. if (!query('GET_ALLOW_FILE_SIZE_VALIDATION')) {
  13. return true;
  14. }
  15. const sizeMax = query('GET_MAX_FILE_SIZE');
  16. if (sizeMax !== null && file.size > sizeMax) {
  17. return false;
  18. }
  19. const sizeMin = query('GET_MIN_FILE_SIZE');
  20. if (sizeMin !== null && file.size < sizeMin) {
  21. return false;
  22. }
  23. return true;
  24. });
  25. // called for each file that is loaded
  26. // right before it is set to the item state
  27. // should return a promise
  28. addFilter(
  29. 'LOAD_FILE',
  30. (file, { query }) =>
  31. new Promise((resolve, reject) => {
  32. // if not allowed, all fine, exit
  33. if (!query('GET_ALLOW_FILE_SIZE_VALIDATION')) {
  34. return resolve(file);
  35. }
  36. // check if file should be filtered
  37. const fileFilter = query('GET_FILE_VALIDATE_SIZE_FILTER');
  38. if (fileFilter && !fileFilter(file)) {
  39. return resolve(file);
  40. }
  41. // reject or resolve based on file size
  42. const sizeMax = query('GET_MAX_FILE_SIZE');
  43. if (sizeMax !== null && file.size > sizeMax) {
  44. reject({
  45. status: {
  46. main: query('GET_LABEL_MAX_FILE_SIZE_EXCEEDED'),
  47. sub: replaceInString(query('GET_LABEL_MAX_FILE_SIZE'), {
  48. filesize: toNaturalFileSize(
  49. sizeMax,
  50. '.',
  51. query('GET_FILE_SIZE_BASE'),
  52. query('GET_FILE_SIZE_LABELS', query)
  53. ),
  54. }),
  55. },
  56. });
  57. return;
  58. }
  59. // reject or resolve based on file size
  60. const sizeMin = query('GET_MIN_FILE_SIZE');
  61. if (sizeMin !== null && file.size < sizeMin) {
  62. reject({
  63. status: {
  64. main: query('GET_LABEL_MIN_FILE_SIZE_EXCEEDED'),
  65. sub: replaceInString(query('GET_LABEL_MIN_FILE_SIZE'), {
  66. filesize: toNaturalFileSize(
  67. sizeMin,
  68. '.',
  69. query('GET_FILE_SIZE_BASE'),
  70. query('GET_FILE_SIZE_LABELS', query)
  71. ),
  72. }),
  73. },
  74. });
  75. return;
  76. }
  77. // returns the current option value
  78. const totalSizeMax = query('GET_MAX_TOTAL_FILE_SIZE');
  79. if (totalSizeMax !== null) {
  80. // get the current total file size
  81. const currentTotalSize = query('GET_ACTIVE_ITEMS').reduce((total, item) => {
  82. return total + item.fileSize;
  83. }, 0);
  84. // get the size of the new file
  85. if (currentTotalSize > totalSizeMax) {
  86. reject({
  87. status: {
  88. main: query('GET_LABEL_MAX_TOTAL_FILE_SIZE_EXCEEDED'),
  89. sub: replaceInString(query('GET_LABEL_MAX_TOTAL_FILE_SIZE'), {
  90. filesize: toNaturalFileSize(
  91. totalSizeMax,
  92. '.',
  93. query('GET_FILE_SIZE_BASE'),
  94. query('GET_FILE_SIZE_LABELS', query)
  95. ),
  96. }),
  97. },
  98. });
  99. return;
  100. }
  101. }
  102. // file is fine, let's pass it back
  103. resolve(file);
  104. })
  105. );
  106. return {
  107. options: {
  108. // Enable or disable file type validation
  109. allowFileSizeValidation: [true, Type.BOOLEAN],
  110. // Max individual file size in bytes
  111. maxFileSize: [null, Type.INT],
  112. // Min individual file size in bytes
  113. minFileSize: [null, Type.INT],
  114. // Max total file size in bytes
  115. maxTotalFileSize: [null, Type.INT],
  116. // Filter the files that need to be validated for size
  117. fileValidateSizeFilter: [null, Type.FUNCTION],
  118. // error labels
  119. labelMinFileSizeExceeded: ['File is too small', Type.STRING],
  120. labelMinFileSize: ['Minimum file size is {filesize}', Type.STRING],
  121. labelMaxFileSizeExceeded: ['File is too large', Type.STRING],
  122. labelMaxFileSize: ['Maximum file size is {filesize}', Type.STRING],
  123. labelMaxTotalFileSizeExceeded: ['Maximum total size exceeded', Type.STRING],
  124. labelMaxTotalFileSize: ['Maximum total file size is {filesize}', Type.STRING],
  125. },
  126. };
  127. };
  128. // fire pluginloaded event if running in browser, this allows registering the plugin when using async script tags
  129. const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';
  130. if (isBrowser) {
  131. document.dispatchEvent(new CustomEvent('FilePond:pluginloaded', { detail: plugin }));
  132. }
  133. export default plugin;