123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- /*!
- * FilePondPluginFileValidateType 1.2.8
- * Licensed under MIT, https://opensource.org/licenses/MIT/
- * Please visit https://pqina.nl/filepond/ for details.
- */
- /* eslint-disable */
- (function(global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined'
- ? (module.exports = factory())
- : typeof define === 'function' && define.amd
- ? define(factory)
- : ((global = global || self),
- (global.FilePondPluginFileValidateType = factory()));
- })(this, function() {
- 'use strict';
- var plugin = function plugin(_ref) {
- var addFilter = _ref.addFilter,
- utils = _ref.utils;
- // get quick reference to Type utils
- var Type = utils.Type,
- isString = utils.isString,
- replaceInString = utils.replaceInString,
- guesstimateMimeType = utils.guesstimateMimeType,
- getExtensionFromFilename = utils.getExtensionFromFilename,
- getFilenameFromURL = utils.getFilenameFromURL;
- var mimeTypeMatchesWildCard = function mimeTypeMatchesWildCard(
- mimeType,
- wildcard
- ) {
- var mimeTypeGroup = (/^[^/]+/.exec(mimeType) || []).pop(); // image/png -> image
- var wildcardGroup = wildcard.slice(0, -2); // image/* -> image
- return mimeTypeGroup === wildcardGroup;
- };
- var isValidMimeType = function isValidMimeType(
- acceptedTypes,
- userInputType
- ) {
- return acceptedTypes.some(function(acceptedType) {
- // accepted is wildcard mime type
- if (/\*$/.test(acceptedType)) {
- return mimeTypeMatchesWildCard(userInputType, acceptedType);
- }
- // is normal mime type
- return acceptedType === userInputType;
- });
- };
- var getItemType = function getItemType(item) {
- // if the item is a url we guess the mime type by the extension
- var type = '';
- if (isString(item)) {
- var filename = getFilenameFromURL(item);
- var extension = getExtensionFromFilename(filename);
- if (extension) {
- type = guesstimateMimeType(extension);
- }
- } else {
- type = item.type;
- }
- return type;
- };
- var validateFile = function validateFile(
- item,
- acceptedFileTypes,
- typeDetector
- ) {
- // no types defined, everything is allowed \o/
- if (acceptedFileTypes.length === 0) {
- return true;
- }
- // gets the item type
- var type = getItemType(item);
- // no type detector, test now
- if (!typeDetector) {
- return isValidMimeType(acceptedFileTypes, type);
- }
- // use type detector
- return new Promise(function(resolve, reject) {
- typeDetector(item, type)
- .then(function(detectedType) {
- if (isValidMimeType(acceptedFileTypes, detectedType)) {
- resolve();
- } else {
- reject();
- }
- })
- .catch(reject);
- });
- };
- var applyMimeTypeMap = function applyMimeTypeMap(map) {
- return function(acceptedFileType) {
- return map[acceptedFileType] === null
- ? false
- : map[acceptedFileType] || acceptedFileType;
- };
- };
- // setup attribute mapping for accept
- addFilter('SET_ATTRIBUTE_TO_OPTION_MAP', function(map) {
- return Object.assign(map, {
- accept: 'acceptedFileTypes'
- });
- });
- // filtering if an item is allowed in hopper
- addFilter('ALLOW_HOPPER_ITEM', function(file, _ref2) {
- var query = _ref2.query;
- // if we are not doing file type validation exit
- if (!query('GET_ALLOW_FILE_TYPE_VALIDATION')) {
- return true;
- }
- // we validate the file against the accepted file types
- return validateFile(file, query('GET_ACCEPTED_FILE_TYPES'));
- });
- // called for each file that is loaded
- // right before it is set to the item state
- // should return a promise
- addFilter('LOAD_FILE', function(file, _ref3) {
- var query = _ref3.query;
- return new Promise(function(resolve, reject) {
- if (!query('GET_ALLOW_FILE_TYPE_VALIDATION')) {
- resolve(file);
- return;
- }
- var acceptedFileTypes = query('GET_ACCEPTED_FILE_TYPES');
- // custom type detector method
- var typeDetector = query('GET_FILE_VALIDATE_TYPE_DETECT_TYPE');
- // if invalid, exit here
- var validationResult = validateFile(
- file,
- acceptedFileTypes,
- typeDetector
- );
- var handleRejection = function handleRejection() {
- var acceptedFileTypesMapped = acceptedFileTypes
- .map(
- applyMimeTypeMap(
- query('GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES_MAP')
- )
- )
- .filter(function(label) {
- return label !== false;
- });
- var acceptedFileTypesMapped_unique = acceptedFileTypesMapped.filter(
- function(item, index) {
- return acceptedFileTypesMapped.indexOf(item) === index;
- }
- );
- reject({
- status: {
- main: query('GET_LABEL_FILE_TYPE_NOT_ALLOWED'),
- sub: replaceInString(
- query('GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES'),
- {
- allTypes: acceptedFileTypesMapped_unique.join(', '),
- allButLastType: acceptedFileTypesMapped_unique
- .slice(0, -1)
- .join(', '),
- lastType:
- acceptedFileTypesMapped_unique[
- acceptedFileTypesMapped.length - 1
- ]
- }
- )
- }
- });
- };
- // has returned new filename immidiately
- if (typeof validationResult === 'boolean') {
- if (!validationResult) {
- return handleRejection();
- }
- return resolve(file);
- }
- // is promise
- validationResult
- .then(function() {
- resolve(file);
- })
- .catch(handleRejection);
- });
- });
- // expose plugin
- return {
- // default options
- options: {
- // Enable or disable file type validation
- allowFileTypeValidation: [true, Type.BOOLEAN],
- // What file types to accept
- acceptedFileTypes: [[], Type.ARRAY],
- // - must be comma separated
- // - mime types: image/png, image/jpeg, image/gif
- // - extensions: .png, .jpg, .jpeg ( not enabled yet )
- // - wildcards: image/*
- // label to show when a type is not allowed
- labelFileTypeNotAllowed: ['File is of invalid type', Type.STRING],
- // nicer label
- fileValidateTypeLabelExpectedTypes: [
- 'Expects {allButLastType} or {lastType}',
- Type.STRING
- ],
- // map mime types to extensions
- fileValidateTypeLabelExpectedTypesMap: [{}, Type.OBJECT],
- // Custom function to detect type of file
- fileValidateTypeDetectType: [null, Type.FUNCTION]
- }
- };
- };
- // fire pluginloaded event if running in browser, this allows registering the plugin when using async script tags
- var isBrowser =
- typeof window !== 'undefined' && typeof window.document !== 'undefined';
- if (isBrowser) {
- document.dispatchEvent(
- new CustomEvent('FilePond:pluginloaded', { detail: plugin })
- );
- }
- return plugin;
- });
|