188 lines
6.7 KiB
JavaScript
188 lines
6.7 KiB
JavaScript
/*!
|
|
* FilePondPluginFileEncode 2.1.14
|
|
* 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.FilePondPluginFileEncode = factory()));
|
|
})(this, function() {
|
|
'use strict';
|
|
|
|
var DataURIWorker = function DataURIWorker() {
|
|
// route messages
|
|
self.onmessage = function(e) {
|
|
convert(e.data.message, function(response) {
|
|
self.postMessage({ id: e.data.id, message: response });
|
|
});
|
|
};
|
|
|
|
// convert file to data uri
|
|
var convert = function convert(options, cb) {
|
|
var file = options.file;
|
|
|
|
var reader = new FileReader();
|
|
reader.onloadend = function() {
|
|
cb(reader.result.replace('data:', '').replace(/^.+,/, ''));
|
|
};
|
|
reader.readAsDataURL(file);
|
|
};
|
|
};
|
|
|
|
var plugin = function plugin(_ref) {
|
|
var addFilter = _ref.addFilter,
|
|
utils = _ref.utils;
|
|
// get quick reference to Type utils
|
|
var Type = utils.Type,
|
|
createWorker = utils.createWorker,
|
|
createRoute = utils.createRoute,
|
|
isFile = utils.isFile;
|
|
|
|
var encode = function encode(_ref2) {
|
|
var name = _ref2.name,
|
|
file = _ref2.file;
|
|
return new Promise(function(resolve) {
|
|
var worker = createWorker(DataURIWorker);
|
|
worker.post({ file: file }, function(data) {
|
|
resolve({ name: name, data: data });
|
|
worker.terminate();
|
|
});
|
|
});
|
|
};
|
|
|
|
// holds base64 strings till can be moved to item
|
|
var base64Cache = [];
|
|
addFilter('DID_CREATE_ITEM', function(item, _ref3) {
|
|
var query = _ref3.query;
|
|
if (!query('GET_ALLOW_FILE_ENCODE')) return;
|
|
|
|
item.extend('getFileEncodeBase64String', function() {
|
|
return base64Cache[item.id] && base64Cache[item.id].data;
|
|
});
|
|
|
|
item.extend('getFileEncodeDataURL', function() {
|
|
return (
|
|
base64Cache[item.id] &&
|
|
'data:'.concat(item.fileType, ';base64,').concat(base64Cache[item.id].data)
|
|
);
|
|
});
|
|
});
|
|
|
|
addFilter('SHOULD_PREPARE_OUTPUT', function(shouldPrepareOutput, _ref4) {
|
|
var query = _ref4.query;
|
|
return new Promise(function(resolve) {
|
|
resolve(query('GET_ALLOW_FILE_ENCODE'));
|
|
});
|
|
});
|
|
|
|
addFilter('COMPLETE_PREPARE_OUTPUT', function(file, _ref5) {
|
|
var item = _ref5.item,
|
|
query = _ref5.query;
|
|
return new Promise(function(resolve) {
|
|
// if it's not a file or a list of files, continue
|
|
if (!query('GET_ALLOW_FILE_ENCODE') || (!isFile(file) && !Array.isArray(file))) {
|
|
return resolve(file);
|
|
}
|
|
|
|
// store metadata settings for this cache
|
|
base64Cache[item.id] = {
|
|
metadata: item.getMetadata(),
|
|
data: null,
|
|
};
|
|
|
|
// wait for all file items to be encoded
|
|
Promise.all(
|
|
(file instanceof Blob ? [{ name: null, file: file }] : file).map(encode)
|
|
).then(function(dataItems) {
|
|
base64Cache[item.id].data =
|
|
file instanceof Blob ? dataItems[0].data : dataItems;
|
|
resolve(file);
|
|
});
|
|
});
|
|
});
|
|
|
|
// called for each view that is created right after the 'create' method
|
|
addFilter('CREATE_VIEW', function(viewAPI) {
|
|
// get reference to created view
|
|
var is = viewAPI.is,
|
|
view = viewAPI.view,
|
|
query = viewAPI.query;
|
|
|
|
// only hook up to item view
|
|
if (!is('file-wrapper') || !query('GET_ALLOW_FILE_ENCODE')) {
|
|
return;
|
|
}
|
|
|
|
view.registerWriter(
|
|
createRoute({
|
|
DID_PREPARE_OUTPUT: function DID_PREPARE_OUTPUT(_ref6) {
|
|
var root = _ref6.root,
|
|
action = _ref6.action;
|
|
// only do this if is not uploading async
|
|
if (query('IS_ASYNC')) {
|
|
return;
|
|
}
|
|
|
|
var item = query('GET_ITEM', action.id);
|
|
if (!item) return;
|
|
|
|
// extract base64 string
|
|
var cache = base64Cache[item.id];
|
|
var metadata = cache.metadata;
|
|
var data = cache.data;
|
|
|
|
// create JSON string from encoded data
|
|
var value = JSON.stringify({
|
|
id: item.id,
|
|
name: item.file.name,
|
|
type: item.file.type,
|
|
size: item.file.size,
|
|
metadata: metadata,
|
|
data: data,
|
|
});
|
|
|
|
// for filepond < 4.13.0
|
|
if (root.ref.data) {
|
|
root.ref.data.value = value;
|
|
}
|
|
// newer versions
|
|
else {
|
|
root.dispatch('DID_DEFINE_VALUE', {
|
|
id: item.id,
|
|
value: value,
|
|
});
|
|
}
|
|
},
|
|
DID_REMOVE_ITEM: function DID_REMOVE_ITEM(_ref7) {
|
|
var action = _ref7.action;
|
|
var item = query('GET_ITEM', action.id);
|
|
if (!item) return;
|
|
delete base64Cache[item.id];
|
|
},
|
|
})
|
|
);
|
|
});
|
|
|
|
return {
|
|
options: {
|
|
// Enable or disable file encoding
|
|
allowFileEncode: [true, Type.BOOLEAN],
|
|
},
|
|
};
|
|
};
|
|
|
|
// 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;
|
|
});
|