Skip to content

Commit

Permalink
add .fromBase64 method
Browse files Browse the repository at this point in the history
  • Loading branch information
zloirock committed Dec 4, 2023
1 parent 319c69a commit a75c128
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 6 deletions.
4 changes: 2 additions & 2 deletions packages/core-js/internals/array-from-constructor-and-list.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
'use strict';
var lengthOfArrayLike = require('../internals/length-of-array-like');

module.exports = function (Constructor, list) {
module.exports = function (Constructor, list, $length) {
var index = 0;
var length = lengthOfArrayLike(list);
var length = arguments.length > 2 ? $length : lengthOfArrayLike(list);
var result = new Constructor(length);
while (length > index) result[index] = list[index++];
return result;
Expand Down
70 changes: 67 additions & 3 deletions packages/core-js/modules/esnext.uint8-array.from-base64.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,80 @@
'use strict';
var $ = require('../internals/export');
var global = require('../internals/global');
var uncurryThis = require('../internals/function-uncurry-this');
var aString = require('../internals/a-string');
var isObject = require('../internals/is-object');
var has = require('../internals/has-own-property');
var arrayFromConstructorAndList = require('../internals/array-from-constructor-and-list');
var base64Map = require('../internals/base64-map');

var base64Alphabet = base64Map.c2i;
var base64UrlAlphabet = base64Map.c2iUrl;

var Uint8Array = global.Uint8Array;
var SyntaxError = global.SyntaxError;
var TypeError = global.TypeError;
var charAt = uncurryThis(''.charAt);
var replace = uncurryThis(''.replace);
var stringSlice = uncurryThis(''.slice);
var push = uncurryThis([].push);
var SPACES = /[\t\n\f\r ]/g;
var BASE64 = 'base64';
var EXTRA_BITS = 'Extra bits';

// `Uint8Array.fromBase64` method
// https://github.com/tc39/proposal-arraybuffer-base64
if (Uint8Array) $({ target: 'Uint8Array', stat: true, forced: true }, {
fromBase64: function fromBase64(string) {
fromBase64: function fromBase64(string /* , options */) {
aString(string);
// TODO
return new Uint8Array(8);
var options = arguments.length > 1 ? arguments[1] : undefined;
if (options !== undefined && !isObject(options)) throw new TypeError('Incorrect options');
var $alphabet = options && options.alphabet;
if ($alphabet === undefined) $alphabet = BASE64;
if ($alphabet !== BASE64 && $alphabet !== 'base64url') throw new TypeError('Incorrect `alphabet` option');
var alphabet = $alphabet === BASE64 ? base64Alphabet : base64UrlAlphabet;
var $strict = options ? !!options.strict : false;

var input = $strict ? string : replace(string, SPACES, '');

if (input.length % 4 === 0) {
if (stringSlice(input, -2) === '==') input = stringSlice(input, 0, -2);
else if (stringSlice(input, -1) === '=') input = stringSlice(input, 0, -1);
} else if ($strict) throw new SyntaxError('Input is not correctly padded');

var lastChunkSize = input.length % 4;

switch (lastChunkSize) {
case 1: throw new SyntaxError('Bad input length');
case 2: input += 'A'; // break omitted
case 3: input += 'A'; // 'AA' for 2
}

var bytes = [];
var i = 0;
var inputLength = input.length;

var get = function (shift) {
var chr = charAt(input, i + shift);
if (!has(alphabet, chr)) throw new SyntaxError('Bad char in input: "' + chr + '"');
return alphabet[chr] << (18 - 6 * shift);
};

for (; i < inputLength; i += 4) {
var triplet = get(0) + get(1) + get(2) + get(3);
push(bytes, (triplet >> 16) & 255, (triplet >> 8) & 255, triplet & 255);
}

var byteLength = bytes.length;

if (lastChunkSize === 2) {
if ($strict && bytes[byteLength - 2] !== 0) throw new SyntaxError(EXTRA_BITS);
byteLength -= 2;
} else if (lastChunkSize === 3) {
if ($strict && bytes[byteLength - 1] !== 0) throw new SyntaxError(EXTRA_BITS);
byteLength--;
}

return arrayFromConstructorAndList(Uint8Array, bytes, byteLength);
}
});
3 changes: 2 additions & 1 deletion packages/core-js/modules/esnext.uint8-array.to-base64.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ var BASE64 = 'base64';
// `Uint8Array..prototype.toBase64` method
// https://github.com/tc39/proposal-arraybuffer-base64
if (Uint8Array) $({ target: 'Uint8Array', proto: true, forced: true }, {
toBase64: function toBase64(options) {
toBase64: function toBase64(/* options */) {
var array = anUint8Array(this);
var options = arguments.length ? arguments[0] : undefined;
if (options !== undefined && !isObject(options)) throw new TypeError('Incorrect options');
var $alphabet = options && options.alphabet;
if ($alphabet === undefined) $alphabet = BASE64;
Expand Down

0 comments on commit a75c128

Please sign in to comment.