54 lines
1.6 KiB
JavaScript
54 lines
1.6 KiB
JavaScript
|
import { isFunction } from 'min-dash';
|
||
|
|
||
|
// TODO(nikku): remove with future bpmn-js version
|
||
|
|
||
|
/**
|
||
|
* Wraps APIs to check:
|
||
|
*
|
||
|
* 1) If a callback is passed -> Warn users about callback deprecation.
|
||
|
* 2) If Promise class is implemented in current environment.
|
||
|
*
|
||
|
* @private
|
||
|
*/
|
||
|
export function wrapForCompatibility(api) {
|
||
|
|
||
|
return function() {
|
||
|
|
||
|
if (!window.Promise) {
|
||
|
throw new Error('Promises is not supported in this environment. Consider polyfilling.');
|
||
|
}
|
||
|
|
||
|
var argLen = arguments.length;
|
||
|
if (argLen >= 1 && isFunction(arguments[argLen - 1])) {
|
||
|
|
||
|
var callback = arguments[argLen - 1];
|
||
|
|
||
|
console.warn(new Error(
|
||
|
'Passing callbacks to ' + api.name + ' is deprecated and will be removed in a future major release.' +
|
||
|
'Please switch to promises, cf. https://bpmn.io/l/moving-to-promises.html'
|
||
|
));
|
||
|
|
||
|
var argsWithoutCallback = Array.prototype.slice.call(arguments, 0, -1);
|
||
|
|
||
|
api.apply(this, argsWithoutCallback).then(function(result) {
|
||
|
|
||
|
var firstKey = Object.keys(result)[0];
|
||
|
|
||
|
// The APIs we are wrapping all resolve a single item depending on the API.
|
||
|
// For instance, importXML resolves { warnings } and saveXML returns { xml }.
|
||
|
// That's why we can call the callback with the first item of result.
|
||
|
return callback(null, result[firstKey]);
|
||
|
|
||
|
// Passing a second paramter instead of catch because we don't want to
|
||
|
// catch errors thrown by callback().
|
||
|
}, function(err) {
|
||
|
|
||
|
return callback(err, err.warnings);
|
||
|
});
|
||
|
} else {
|
||
|
|
||
|
return api.apply(this, arguments);
|
||
|
}
|
||
|
};
|
||
|
}
|