polyfill-service
Version:
A polyfill combinator
56 lines (42 loc) • 1.7 kB
JavaScript
(function (global) {
var keys = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', keysRe = new RegExp('[^' + keys + ']');
// <Global>.atob
global.atob = function atob(input) {
var output = [], buffer, bufferB, chrs, index = 0, indexB, length = input.length;
if ((keysRe.test(input)) || (/=/.test(input) && (/=[^=]/.test(input) || /={3}/.test(input)))) {
throw new Error('Invalid base64 data');
}
if (length % 4 > 0) {
input += Array(4 - length % 4 + 1).join("=");
length = input.length;
}
while (index < length) {
for (bufferB = [], indexB = index; index < indexB + 4;) {
bufferB.push(keys.indexOf(input.charAt(index++)));
}
buffer = (bufferB[0] << 18) + (bufferB[1] << 12) + ((bufferB[2] & 63) << 6) + (bufferB[3] & 63);
chrs = [(buffer & (255 << 16)) >> 16, bufferB[2] === 64 ? -1 : (buffer & (255 << 8)) >> 8, bufferB[3] === 64 ? -1 : buffer & 255];
for (indexB = 0; indexB < 3; ++indexB) {
if (chrs[indexB] >= 0 || indexB === 0) {
output.push(String.fromCharCode(chrs[indexB]));
}
}
}
return output.join('');
};
// <Global>.btoa
global.btoa = function btoa(input) {
var output = [], buffer, chrs, index = 0, length = input.length;
while (index < length) {
chrs = [input.charCodeAt(index++), input.charCodeAt(index++), input.charCodeAt(index++)];
buffer = (chrs[0] << 16) + ((chrs[1] || 0) << 8) + (chrs[2] || 0);
output.push(
keys.charAt((buffer & (63 << 18)) >> 18),
keys.charAt((buffer & (63 << 12)) >> 12),
keys.charAt(isNaN(chrs[1]) ? 64 : (buffer & (63 << 6)) >> 6),
keys.charAt(isNaN(chrs[2]) ? 64 : (buffer & 63))
);
}
return output.join('');
};
})(this);