├── .babelrc ├── .gitignore ├── .travis.yml ├── package.js ├── bower.json ├── test ├── yoshinoya.js ├── large.js ├── es6.js ├── es5.js ├── index.html └── dankogai.js ├── package.json ├── LICENSE.md ├── base64.html ├── README.md ├── base64.min.js ├── old └── base64-1.7.js ├── base64_utf8 └── base64.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ "es2015" ] 3 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *,v 2 | attic/**/* 3 | node_modules/**/* 4 | tmp/**/* 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "node" 4 | 5 | 6 | -------------------------------------------------------------------------------- /package.js: -------------------------------------------------------------------------------- 1 | Package.describe({ 2 | summary: "Yet another Base64 transcoder" 3 | }) 4 | 5 | Package.on_use(function(api){ 6 | api.export('Base64'); 7 | 8 | api.add_files(['base64.js'], 'server'); 9 | }); -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-base64", 3 | "version": "2.4.3", 4 | "license": "BSD-3-Clause", 5 | "main": [ 6 | "./base64.js" 7 | ], 8 | "ignore": [ 9 | "old", 10 | "test", 11 | ".gitignore", 12 | ".travis.yml", 13 | "base64.html", 14 | "package.json" 15 | ], 16 | "dependencies": { 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /test/yoshinoya.js: -------------------------------------------------------------------------------- 1 | /* 2 | * use mocha to test me 3 | * http://visionmedia.github.com/mocha/ 4 | */ 5 | var assert = assert || require("assert"); 6 | var Base64 = Base64 || require('../base64.js').Base64; 7 | var is = function (a, e, m) { 8 | return function () { 9 | assert.equal(a, e, m) 10 | } 11 | }; 12 | 13 | describe('Yoshinoya', function () { 14 | it('.encode', is(Base64.encode('𠮷野家'), '8KCut+mHjuWutg==')); 15 | it('.encodeURI', is(Base64.encodeURI('𠮷野家'), '8KCut-mHjuWutg')); 16 | it('.decode', is(Base64.decode('8KCut+mHjuWutg=='), '𠮷野家')); 17 | it('.decode', is(Base64.decode('8KCut-mHjuWutg'), '𠮷野家')); 18 | /* it('.decode', is(Base64.decode('7aGC7b636YeO5a62'), '𠮷野家')); */ 19 | }); 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-base64", 3 | "version": "2.4.3", 4 | "description": "Yet another Base64 transcoder in pure-JS", 5 | "main": "base64.js", 6 | "directories": { 7 | "test": "test" 8 | }, 9 | "scripts": { 10 | "test": "mocha --compilers js:babel-register" 11 | }, 12 | "devDependencies": { 13 | "babel-preset-es2015": "^6.24.1", 14 | "babel-register": "^6.26.0", 15 | "mocha": "*" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git://github.com/dankogai/js-base64.git" 20 | }, 21 | "keywords": [ 22 | "base64" 23 | ], 24 | "author": "Dan Kogai", 25 | "license": "BSD-3-Clause", 26 | "readmeFilename": "README.md", 27 | "gitHead": "8bfa436f733bec60c95c720e1d720c28b43ae0b2" 28 | } 29 | -------------------------------------------------------------------------------- /test/large.js: -------------------------------------------------------------------------------- 1 | /* 2 | * $Id: large.js,v 0.3 2012/08/23 19:14:37 dankogai Exp dankogai $ 3 | * 4 | * use mocha to test me 5 | * http://visionmedia.github.com/mocha/ 6 | */ 7 | var assert = assert || require("assert"); 8 | var Base64 = Base64 || require('../base64.js').Base64; 9 | var is = function (a, e, m) { 10 | return function () { 11 | assert.equal(a, e, m) 12 | } 13 | }; 14 | var seed = function () { 15 | var a, i; 16 | for (a = [], i = 0; i < 256; i++) { 17 | a.push(String.fromCharCode(i)); 18 | } 19 | return a.join(''); 20 | }(); 21 | describe('Base64', function () { 22 | for (var i = 0, str = seed; i < 16; str += str, i++) { 23 | it(''+str.length, is(Base64.decode(Base64.encode(str)), str)); 24 | } 25 | }); 26 | -------------------------------------------------------------------------------- /test/es6.js: -------------------------------------------------------------------------------- 1 | /* 2 | * $Id: es6.js,v 0.1 2017/11/29 21:43:17 ufolux Exp ufolux $ 3 | * 4 | * use mocha to test me 5 | * http://visionmedia.github.com/mocha/ 6 | */ 7 | import {Base64} from '../base64' 8 | 9 | var assert = assert || require("assert"); 10 | var is = function (a, e, m) { 11 | return function () { 12 | assert.equal(a, e, m) 13 | } 14 | }; 15 | 16 | if ('extendString' in Base64){ 17 | Base64.extendString(); 18 | describe('String', function () { 19 | it('.toBase64', is('小飼弾'.toBase64(), '5bCP6aO85by+')); 20 | it('.toBase64', is('小飼弾'.toBase64(true), '5bCP6aO85by-')); 21 | it('.toBase64URI', is('小飼弾'.toBase64URI(), '5bCP6aO85by-')); 22 | it('.fromBase64', is('5bCP6aO85by+'.fromBase64(), '小飼弾')); 23 | it('.fromBase64', is('5bCP6aO85by-'.fromBase64(), '小飼弾')); 24 | }); 25 | } 26 | -------------------------------------------------------------------------------- /test/es5.js: -------------------------------------------------------------------------------- 1 | /* 2 | * $Id: es5.js,v 0.1 2012/08/23 19:43:17 dankogai Exp dankogai $ 3 | * 4 | * use mocha to test me 5 | * http://visionmedia.github.com/mocha/ 6 | */ 7 | var assert = assert || require("assert"); 8 | var Base64 = Base64 || require('../base64.js').Base64; 9 | var is = function (a, e, m) { 10 | return function () { 11 | assert.equal(a, e, m) 12 | } 13 | }; 14 | 15 | if ('extendString' in Base64){ 16 | Base64.extendString(); 17 | describe('String', function () { 18 | it('.toBase64', is('小飼弾'.toBase64(), '5bCP6aO85by+')); 19 | it('.toBase64', is('小飼弾'.toBase64(true), '5bCP6aO85by-')); 20 | it('.toBase64URI', is('小飼弾'.toBase64URI(), '5bCP6aO85by-')); 21 | it('.fromBase64', is('5bCP6aO85by+'.fromBase64(), '小飼弾')); 22 | it('.fromBase64', is('5bCP6aO85by-'.fromBase64(), '小飼弾')); 23 | }); 24 | } 25 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Mocha Tests 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 16 | 17 | 25 | 26 | 27 | 28 | 29 | 34 | 35 | 36 | $Id: index.html,v 0.3 2017/09/11 08:43:43 dankogai Exp dankogai $ 37 |
38 | 39 | 40 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014, Dan Kogai 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | * Neither the name of {{{project}}} nor the names of its 15 | contributors may be used to endorse or promote products derived from 16 | this software without specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /base64.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Test for base64.js 7 | 8 | 9 |

Test for base64.js

10 |

$Id: base64.html,v 1.1 2009/03/01 22:00:28 dankogai Exp dankogai $

11 | 12 | 14 | 15 | 17 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
TextBase64 13 | (URL Safe )
Roundtripiframe w/ data: (no IE)
29 | 30 | 31 | 32 | 46 | 47 | -------------------------------------------------------------------------------- /test/dankogai.js: -------------------------------------------------------------------------------- 1 | /* 2 | * $Id: dankogai.js,v 0.4 2012/08/24 05:23:18 dankogai Exp dankogai $ 3 | * 4 | * use mocha to test me 5 | * http://visionmedia.github.com/mocha/ 6 | */ 7 | var assert = assert || require("assert"); 8 | var Base64 = Base64 || require('../base64.js').Base64; 9 | var is = function (a, e, m) { 10 | return function () { 11 | assert.equal(a, e, m) 12 | } 13 | }; 14 | 15 | describe('basic', function () { 16 | it('d', is(Base64.encode('d'), 'ZA==')); 17 | it('da', is(Base64.encode('da'), 'ZGE=')); 18 | it('dan', is(Base64.encode('dan'), 'ZGFu')); 19 | it('ZA==', is(Base64.decode('ZA=='), 'd' )); 20 | it('ZGE=', is(Base64.decode('ZGE='), 'da' )); 21 | it('ZGFu', is(Base64.decode('ZGFu'), 'dan' )); 22 | }); 23 | 24 | describe('whitespace', function () { 25 | it('Z A==', is(Base64.decode('ZA =='), 'd' )); 26 | it('ZG E=', is(Base64.decode('ZG E='), 'da' )); 27 | it('ZGF u', is(Base64.decode('ZGF u'), 'dan' )); 28 | }); 29 | 30 | describe('null', function () { 31 | it('\\0', is(Base64.encode('\0'), 'AA==')); 32 | it('\\0\\0', is(Base64.encode('\0\0'), 'AAA=')); 33 | it('\\0\\0\\0', is(Base64.encode('\0\0\0'), 'AAAA')); 34 | it('AA==', is(Base64.decode('AA=='), '\0' )); 35 | it('AAA=', is(Base64.decode('AAA='), '\0\0' )); 36 | it('AAAA', is(Base64.decode('AAAA'), '\0\0\0')); 37 | }); 38 | 39 | describe('Base64', function () { 40 | it('.encode', is(Base64.encode('小飼弾'), '5bCP6aO85by+')); 41 | it('.encodeURI', is(Base64.encodeURI('小飼弾'), '5bCP6aO85by-')); 42 | it('.decode', is(Base64.decode('5bCP6aO85by+'), '小飼弾')); 43 | it('.decode', is(Base64.decode('5bCP6aO85by-'), '小飼弾')); 44 | }); 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![build status](https://secure.travis-ci.org/dankogai/js-base64.png)](http://travis-ci.org/dankogai/js-base64) 2 | 3 | # base64.js 4 | 5 | Yet another Base64 transcoder 6 | 7 | ## Usage 8 | 9 | ### In Browser 10 | 11 | ```html 12 | 13 | ``` 14 | 15 | ### node.js 16 | 17 | ```javascript 18 | var Base64 = require('js-base64').Base64; 19 | ``` 20 | 21 | ## es6+ 22 | 23 | ```javascript 24 | import { Base64 } from 'js-base64'; 25 | ``` 26 | 27 | ### npm 28 | 29 | ```javascript 30 | $ npm install --save js-base64 31 | ``` 32 | 33 | 34 | ## SYNOPSIS 35 | 36 | ```javascript 37 | Base64.encode('dankogai'); // ZGFua29nYWk= 38 | Base64.encode('小飼弾'); // 5bCP6aO85by+ 39 | Base64.encodeURI('小飼弾'); // 5bCP6aO85by- 40 | 41 | Base64.decode('ZGFua29nYWk='); // dankogai 42 | Base64.decode('5bCP6aO85by+'); // 小飼弾 43 | // note .decodeURI() is unnecessary since it accepts both flavors 44 | Base64.decode('5bCP6aO85by-'); // 小飼弾 45 | ``` 46 | 47 | ### String Extension for ES5 48 | 49 | ```javascript 50 | if (Base64.extendString) { 51 | // you have to explicitly extend String.prototype 52 | Base64.extendString(); 53 | // once extended, you can do the following 54 | 'dankogai'.toBase64(); // ZGFua29nYWk= 55 | '小飼弾'.toBase64(); // 5bCP6aO85by+ 56 | '小飼弾'.toBase64(true); // 5bCP6aO85by- 57 | '小飼弾'.toBase64URI(); // 5bCP6aO85by- 58 | 'ZGFua29nYWk='.fromBase64(); // dankogai 59 | '5bCP6aO85by+'.fromBase64(); // 小飼弾 60 | '5bCP6aO85by-'.fromBase64(); // 小飼弾 61 | } 62 | ``` 63 | 64 | ### TypeScript 65 | 66 | TypeScript 2.0 type definition was added to the [DefinitelyTyped repository](https://github.com/DefinitelyTyped/DefinitelyTyped). 67 | 68 | ```bash 69 | $ npm install --save @types/js-base64 70 | ``` 71 | 72 | ## `.decode()` vs `.atob` (and `.encode()` vs `btoa()`) 73 | 74 | Suppose you have: 75 | 76 | ``` 77 | var pngBase64 = 78 | "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII="; 79 | ``` 80 | 81 | Which is a Base64-encoded 1x1 transparent PNG, **DO NOT USE** `Base64.decode(pngBase64)`.  Use `Base64.atob(pngBase64)` instead.  `Base64.decode()` decodes to UTF-8 string while `Base64.atob()` decodes to bytes, which is compatible to browser built-in `atob()` (Which is absent in node.js).  The same rule applies to the opposite direction. 82 | 83 | 84 | ## SEE ALSO 85 | 86 | + http://en.wikipedia.org/wiki/Base64 87 | -------------------------------------------------------------------------------- /base64.min.js: -------------------------------------------------------------------------------- 1 | (function(global,factory){typeof exports==="object"&&typeof module!=="undefined"?module.exports=factory(global):typeof define==="function"&&define.amd?define(factory):factory(global)})(typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:this,function(global){"use strict";var _Base64=global.Base64;var version="2.4.3";var buffer;if(typeof module!=="undefined"&&module.exports){try{buffer=require("buffer").Buffer}catch(err){}}var b64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64tab=function(bin){var t={};for(var i=0,l=bin.length;i>>6)+fromCharCode(128|cc&63):fromCharCode(224|cc>>>12&15)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}else{var cc=65536+(c.charCodeAt(0)-55296)*1024+(c.charCodeAt(1)-56320);return fromCharCode(240|cc>>>18&7)+fromCharCode(128|cc>>>12&63)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}};var re_utob=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;var utob=function(u){return u.replace(re_utob,cb_utob)};var cb_encode=function(ccc){var padlen=[0,2,1][ccc.length%3],ord=ccc.charCodeAt(0)<<16|(ccc.length>1?ccc.charCodeAt(1):0)<<8|(ccc.length>2?ccc.charCodeAt(2):0),chars=[b64chars.charAt(ord>>>18),b64chars.charAt(ord>>>12&63),padlen>=2?"=":b64chars.charAt(ord>>>6&63),padlen>=1?"=":b64chars.charAt(ord&63)];return chars.join("")};var btoa=global.btoa?function(b){return global.btoa(b)}:function(b){return b.replace(/[\s\S]{1,3}/g,cb_encode)};var _encode=buffer?buffer.from&&buffer.from!==Uint8Array.from?function(u){return(u.constructor===buffer.constructor?u:buffer.from(u)).toString("base64")}:function(u){return(u.constructor===buffer.constructor?u:new buffer(u)).toString("base64")}:function(u){return btoa(utob(u))};var encode=function(u,urisafe){return!urisafe?_encode(String(u)):_encode(String(u)).replace(/[+\/]/g,function(m0){return m0=="+"?"-":"_"}).replace(/=/g,"")};var encodeURI=function(u){return encode(u,true)};var re_btou=new RegExp(["[À-ß][€-¿]","[à-ï][€-¿]{2}","[ð-÷][€-¿]{3}"].join("|"),"g");var cb_btou=function(cccc){switch(cccc.length){case 4:var cp=(7&cccc.charCodeAt(0))<<18|(63&cccc.charCodeAt(1))<<12|(63&cccc.charCodeAt(2))<<6|63&cccc.charCodeAt(3),offset=cp-65536;return fromCharCode((offset>>>10)+55296)+fromCharCode((offset&1023)+56320);case 3:return fromCharCode((15&cccc.charCodeAt(0))<<12|(63&cccc.charCodeAt(1))<<6|63&cccc.charCodeAt(2));default:return fromCharCode((31&cccc.charCodeAt(0))<<6|63&cccc.charCodeAt(1))}};var btou=function(b){return b.replace(re_btou,cb_btou)};var cb_decode=function(cccc){var len=cccc.length,padlen=len%4,n=(len>0?b64tab[cccc.charAt(0)]<<18:0)|(len>1?b64tab[cccc.charAt(1)]<<12:0)|(len>2?b64tab[cccc.charAt(2)]<<6:0)|(len>3?b64tab[cccc.charAt(3)]:0),chars=[fromCharCode(n>>>16),fromCharCode(n>>>8&255),fromCharCode(n&255)];chars.length-=[0,0,2,1][padlen];return chars.join("")};var atob=global.atob?function(a){return global.atob(a)}:function(a){return a.replace(/[\s\S]{1,4}/g,cb_decode)};var _decode=buffer?buffer.from&&buffer.from!==Uint8Array.from?function(a){return(a.constructor===buffer.constructor?a:buffer.from(a,"base64")).toString()}:function(a){return(a.constructor===buffer.constructor?a:new buffer(a,"base64")).toString()}:function(a){return btou(atob(a))};var decode=function(a){return _decode(String(a).replace(/[-_]/g,function(m0){return m0=="-"?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))};var noConflict=function(){var Base64=global.Base64;global.Base64=_Base64;return Base64};global.Base64={VERSION:version,atob:atob,btoa:btoa,fromBase64:decode,toBase64:encode,utob:utob,encode:encode,encodeURI:encodeURI,btou:btou,decode:decode,noConflict:noConflict};if(typeof Object.defineProperty==="function"){var noEnum=function(v){return{value:v,enumerable:false,writable:true,configurable:true}};global.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",noEnum(function(){return decode(this)}));Object.defineProperty(String.prototype,"toBase64",noEnum(function(urisafe){return encode(this,urisafe)}));Object.defineProperty(String.prototype,"toBase64URI",noEnum(function(){return encode(this,true)}))}}if(global["Meteor"]){Base64=global.Base64}if(typeof module!=="undefined"&&module.exports){module.exports.Base64=global.Base64}else if(typeof define==="function"&&define.amd){define([],function(){return global.Base64})}return{Base64:global.Base64}}); -------------------------------------------------------------------------------- /old/base64-1.7.js: -------------------------------------------------------------------------------- 1 | /* 2 | * $Id: base64.js,v 1.7 2012/08/23 10:30:18 dankogai Exp dankogai $ 3 | * 4 | * Licensed under the MIT license. 5 | * http://www.opensource.org/licenses/mit-license.php 6 | * 7 | * References: 8 | * http://en.wikipedia.org/wiki/Base64 9 | */ 10 | 11 | (function(global){ 12 | 13 | var b64chars 14 | = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 15 | 16 | var b64charcodes = function(){ 17 | var a = []; 18 | var codeA = 'A'.charCodeAt(0); 19 | var codea = 'a'.charCodeAt(0); 20 | var code0 = '0'.charCodeAt(0); 21 | for (var i = 0; i < 26; i ++) a.push(codeA + i); 22 | for (var i = 0; i < 26; i ++) a.push(codea + i); 23 | for (var i = 0; i < 10; i ++) a.push(code0 + i); 24 | a.push('+'.charCodeAt(0)); 25 | a.push('/'.charCodeAt(0)); 26 | return a; 27 | }(); 28 | 29 | var b64tab = function(bin){ 30 | var t = {}; 31 | for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i; 32 | return t; 33 | }(b64chars); 34 | 35 | var stringToArray = function(s){ 36 | var a = []; 37 | for (var i = 0, l = s.length; i < l; i ++) a[i] = s.charCodeAt(i); 38 | return a; 39 | }; 40 | 41 | var convertUTF8ArrayToBase64 = function(bin){ 42 | var padlen = 0; 43 | while (bin.length % 3){ 44 | bin.push(0); 45 | padlen++; 46 | }; 47 | var b64 = []; 48 | for (var i = 0, l = bin.length; i < l; i += 3){ 49 | var c0 = bin[i], c1 = bin[i+1], c2 = bin[i+2]; 50 | if (c0 >= 256 || c1 >= 256 || c2 >= 256) 51 | throw 'unsupported character found'; 52 | var n = (c0 << 16) | (c1 << 8) | c2; 53 | b64.push( 54 | b64charcodes[ n >>> 18], 55 | b64charcodes[(n >>> 12) & 63], 56 | b64charcodes[(n >>> 6) & 63], 57 | b64charcodes[ n & 63] 58 | ); 59 | } 60 | while (padlen--) b64[b64.length - padlen - 1] = '='.charCodeAt(0); 61 | return chunkStringFromCharCodeApply(b64); 62 | }; 63 | 64 | var convertBase64ToUTF8Array = function(b64){ 65 | b64 = b64.replace(/[^A-Za-z0-9+\/]+/g, ''); 66 | var bin = []; 67 | var padlen = b64.length % 4; 68 | for (var i = 0, l = b64.length; i < l; i += 4){ 69 | var n = ((b64tab[b64.charAt(i )] || 0) << 18) 70 | | ((b64tab[b64.charAt(i+1)] || 0) << 12) 71 | | ((b64tab[b64.charAt(i+2)] || 0) << 6) 72 | | ((b64tab[b64.charAt(i+3)] || 0)); 73 | bin.push( 74 | ( n >> 16 ), 75 | ( (n >> 8) & 0xff ), 76 | ( n & 0xff ) 77 | ); 78 | } 79 | bin.length -= [0,0,2,1][padlen]; 80 | return bin; 81 | }; 82 | 83 | var convertUTF16ArrayToUTF8Array = function(uni){ 84 | var bin = []; 85 | for (var i = 0, l = uni.length; i < l; i++){ 86 | var n = uni[i]; 87 | if (n < 0x80) 88 | bin.push(n); 89 | else if (n < 0x800) 90 | bin.push( 91 | 0xc0 | (n >>> 6), 92 | 0x80 | (n & 0x3f)); 93 | else 94 | bin.push( 95 | 0xe0 | ((n >>> 12) & 0x0f), 96 | 0x80 | ((n >>> 6) & 0x3f), 97 | 0x80 | (n & 0x3f)); 98 | } 99 | return bin; 100 | }; 101 | 102 | var convertUTF8ArrayToUTF16Array = function(bin){ 103 | var uni = []; 104 | for (var i = 0, l = bin.length; i < l; i++){ 105 | var c0 = bin[i]; 106 | if (c0 < 0x80){ 107 | uni.push(c0); 108 | }else{ 109 | var c1 = bin[++i]; 110 | if (c0 < 0xe0){ 111 | uni.push(((c0 & 0x1f) << 6) | (c1 & 0x3f)); 112 | }else{ 113 | var c2 = bin[++i]; 114 | uni.push( 115 | ((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | (c2 & 0x3f) 116 | ); 117 | } 118 | } 119 | } 120 | return uni; 121 | }; 122 | 123 | var convertUTF8StringToBase64 = function(bin){ 124 | return convertUTF8ArrayToBase64(stringToArray(bin)); 125 | }; 126 | 127 | var convertBase64ToUTF8String = function(b64){ 128 | return chunkStringFromCharCodeApply(convertBase64ToUTF8Array(b64)); 129 | }; 130 | 131 | var convertUTF8StringToUTF16Array = function(bin){ 132 | return convertUTF8ArrayToUTF16Array(stringToArray(bin)); 133 | }; 134 | 135 | var convertUTF8ArrayToUTF16String = function(bin){ 136 | return chunkStringFromCharCodeApply(convertUTF8ArrayToUTF16Array(bin)); 137 | }; 138 | 139 | var convertUTF8StringToUTF16String = function(bin){ 140 | return chunkStringFromCharCodeApply( 141 | convertUTF8ArrayToUTF16Array(stringToArray(bin)) 142 | ); 143 | }; 144 | 145 | var convertUTF16StringToUTF8Array = function(uni){ 146 | return convertUTF16ArrayToUTF8Array(stringToArray(uni)); 147 | }; 148 | 149 | var convertUTF16ArrayToUTF8String = function(uni){ 150 | return chunkStringFromCharCodeApply(convertUTF16ArrayToUTF8Array(uni)); 151 | }; 152 | 153 | var convertUTF16StringToUTF8String = function(uni){ 154 | return chunkStringFromCharCodeApply( 155 | convertUTF16ArrayToUTF8Array(stringToArray(uni)) 156 | ); 157 | }; 158 | 159 | /* 160 | * String.fromCharCode.apply will only handle arrays as big as 65536, 161 | * after that it'll return a truncated string with no warning. 162 | */ 163 | var chunkStringFromCharCodeApply = function(arr){ 164 | var strs = [], i; 165 | for (i = 0; i < arr.length; i += 65536){ 166 | strs.push(String.fromCharCode.apply(String, arr.slice(i, i+65536))); 167 | } 168 | return strs.join(''); 169 | }; 170 | 171 | if (global.btoa){ 172 | var btoa = global.btoa; 173 | var convertUTF16StringToBase64 = function (uni){ 174 | return btoa(convertUTF16StringToUTF8String(uni)); 175 | }; 176 | } 177 | else { 178 | var btoa = convertUTF8StringToBase64; 179 | var convertUTF16StringToBase64 = function (uni){ 180 | return convertUTF8ArrayToBase64(convertUTF16StringToUTF8Array(uni)); 181 | }; 182 | } 183 | 184 | if (global.atob){ 185 | var atob = global.atob; 186 | var convertBase64ToUTF16String = function (b64){ 187 | return convertUTF8StringToUTF16String(atob(b64)); 188 | }; 189 | } 190 | else { 191 | var atob = convertBase64ToUTF8String; 192 | var convertBase64ToUTF16String = function (b64){ 193 | return convertUTF8ArrayToUTF16String(convertBase64ToUTF8Array(b64)); 194 | }; 195 | } 196 | 197 | global.Base64 = { 198 | convertUTF8ArrayToBase64:convertUTF8ArrayToBase64, 199 | convertByteArrayToBase64:convertUTF8ArrayToBase64, 200 | convertBase64ToUTF8Array:convertBase64ToUTF8Array, 201 | convertBase64ToByteArray:convertBase64ToUTF8Array, 202 | convertUTF16ArrayToUTF8Array:convertUTF16ArrayToUTF8Array, 203 | convertUTF16ArrayToByteArray:convertUTF16ArrayToUTF8Array, 204 | convertUTF8ArrayToUTF16Array:convertUTF8ArrayToUTF16Array, 205 | convertByteArrayToUTF16Array:convertUTF8ArrayToUTF16Array, 206 | convertUTF8StringToBase64:convertUTF8StringToBase64, 207 | convertBase64ToUTF8String:convertBase64ToUTF8String, 208 | convertUTF8StringToUTF16Array:convertUTF8StringToUTF16Array, 209 | convertUTF8ArrayToUTF16String:convertUTF8ArrayToUTF16String, 210 | convertByteArrayToUTF16String:convertUTF8ArrayToUTF16String, 211 | convertUTF8StringToUTF16String:convertUTF8StringToUTF16String, 212 | convertUTF16StringToUTF8Array:convertUTF16StringToUTF8Array, 213 | convertUTF16StringToByteArray:convertUTF16StringToUTF8Array, 214 | convertUTF16ArrayToUTF8String:convertUTF16ArrayToUTF8String, 215 | convertUTF16StringToUTF8String:convertUTF16StringToUTF8String, 216 | convertUTF16StringToBase64:convertUTF16StringToBase64, 217 | convertBase64ToUTF16String:convertBase64ToUTF16String, 218 | fromBase64:convertBase64ToUTF8String, 219 | toBase64:convertUTF8StringToBase64, 220 | atob:atob, 221 | btoa:btoa, 222 | utob:convertUTF16StringToUTF8String, 223 | btou:convertUTF8StringToUTF16String, 224 | encode:convertUTF16StringToBase64, 225 | encodeURI:function(u){ 226 | return convertUTF16StringToBase64(u).replace(/[+\/]/g, function(m0){ 227 | return m0 == '+' ? '-' : '_'; 228 | }).replace(/=+$/, ''); 229 | }, 230 | decode:function(a){ 231 | return convertBase64ToUTF16String(a.replace(/[-_]/g, function(m0){ 232 | return m0 == '-' ? '+' : '/'; 233 | })); 234 | } 235 | }; 236 | 237 | })(this); 238 | -------------------------------------------------------------------------------- /base64_utf8: -------------------------------------------------------------------------------- 1 | ;(function (global, factory) { 2 | typeof exports === 'object' && typeof module !== 'undefined' 3 | ? module.exports = factory(global) 4 | : typeof define === 'function' && define.amd 5 | ? define(factory) : factory(global) 6 | }(( 7 | typeof self !== 'undefined' ? self 8 | : typeof window !== 'undefined' ? window 9 | : typeof global !== 'undefined' ? global 10 | : this 11 | ), function(global) { 12 | 'use strict'; 13 | // existing version for noConflict() 14 | var _Base64 = global.Base64; 15 | var version = "2.4.3"; 16 | // if node.js, we use Buffer 17 | var buffer; 18 | if (typeof module !== 'undefined' && module.exports) { 19 | try { 20 | buffer = require('buffer').Buffer; 21 | } catch (err) {} 22 | } 23 | // constants 24 | var b64chars 25 | = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 26 | var b64tab = function(bin) { 27 | var t = {}; 28 | for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i; 29 | return t; 30 | }(b64chars); 31 | var fromCharCode = String.fromCharCode; 32 | // encoder stuff 33 | var cb_utob = function(c) { 34 | if (c.length < 2) { 35 | var cc = c.charCodeAt(0); 36 | return cc < 0x80 ? c 37 | : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6)) 38 | + fromCharCode(0x80 | (cc & 0x3f))) 39 | : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) 40 | + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) 41 | + fromCharCode(0x80 | ( cc & 0x3f))); 42 | } else { 43 | var cc = 0x10000 44 | + (c.charCodeAt(0) - 0xD800) * 0x400 45 | + (c.charCodeAt(1) - 0xDC00); 46 | return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07)) 47 | + fromCharCode(0x80 | ((cc >>> 12) & 0x3f)) 48 | + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) 49 | + fromCharCode(0x80 | ( cc & 0x3f))); 50 | } 51 | }; 52 | var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; 53 | var utob = function(u) { 54 | return u.replace(re_utob, cb_utob); 55 | }; 56 | var cb_encode = function(ccc) { 57 | var padlen = [0, 2, 1][ccc.length % 3], 58 | ord = ccc.charCodeAt(0) << 16 59 | | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) 60 | | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)), 61 | chars = [ 62 | b64chars.charAt( ord >>> 18), 63 | b64chars.charAt((ord >>> 12) & 63), 64 | padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63), 65 | padlen >= 1 ? '=' : b64chars.charAt(ord & 63) 66 | ]; 67 | return chars.join(''); 68 | }; 69 | var btoa = global.btoa ? function(b) { 70 | return global.btoa(b); 71 | } : function(b) { 72 | return b.replace(/[\s\S]{1,3}/g, cb_encode); 73 | }; 74 | var _encode = buffer ? 75 | buffer.from && buffer.from !== Uint8Array.from ? function (u) { 76 | return (u.constructor === buffer.constructor ? u : buffer.from(u)) 77 | .toString('base64') 78 | } 79 | : function (u) { 80 | return (u.constructor === buffer.constructor ? u : new buffer(u)) 81 | .toString('base64') 82 | } 83 | : function (u) { return btoa(utob(u)) } 84 | ; 85 | var encode = function(u, urisafe) { 86 | return !urisafe 87 | ? _encode(String(u)) 88 | : _encode(String(u)).replace(/[+\/]/g, function(m0) { 89 | return m0 == '+' ? '-' : '_'; 90 | }).replace(/=/g, ''); 91 | }; 92 | var encodeURI = function(u) { return encode(u, true) }; 93 | // decoder stuff 94 | var re_btou = new RegExp([ 95 | '[\xC0-\xDF][\x80-\xBF]', 96 | '[\xE0-\xEF][\x80-\xBF]{2}', 97 | '[\xF0-\xF7][\x80-\xBF]{3}' 98 | ].join('|'), 'g'); 99 | var cb_btou = function(cccc) { 100 | switch(cccc.length) { 101 | case 4: 102 | var cp = ((0x07 & cccc.charCodeAt(0)) << 18) 103 | | ((0x3f & cccc.charCodeAt(1)) << 12) 104 | | ((0x3f & cccc.charCodeAt(2)) << 6) 105 | | (0x3f & cccc.charCodeAt(3)), 106 | offset = cp - 0x10000; 107 | return (fromCharCode((offset >>> 10) + 0xD800) 108 | + fromCharCode((offset & 0x3FF) + 0xDC00)); 109 | case 3: 110 | return fromCharCode( 111 | ((0x0f & cccc.charCodeAt(0)) << 12) 112 | | ((0x3f & cccc.charCodeAt(1)) << 6) 113 | | (0x3f & cccc.charCodeAt(2)) 114 | ); 115 | default: 116 | return fromCharCode( 117 | ((0x1f & cccc.charCodeAt(0)) << 6) 118 | | (0x3f & cccc.charCodeAt(1)) 119 | ); 120 | } 121 | }; 122 | var btou = function(b) { 123 | return b.replace(re_btou, cb_btou); 124 | }; 125 | var cb_decode = function(cccc) { 126 | var len = cccc.length, 127 | padlen = len % 4, 128 | n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) 129 | | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) 130 | | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0) 131 | | (len > 3 ? b64tab[cccc.charAt(3)] : 0), 132 | chars = [ 133 | fromCharCode( n >>> 16), 134 | fromCharCode((n >>> 8) & 0xff), 135 | fromCharCode( n & 0xff) 136 | ]; 137 | chars.length -= [0, 0, 2, 1][padlen]; 138 | return chars.join(''); 139 | }; 140 | var atob = global.atob ? function(a) { 141 | return global.atob(a); 142 | } : function(a){ 143 | return a.replace(/[\s\S]{1,4}/g, cb_decode); 144 | }; 145 | var _decode = buffer ? 146 | buffer.from && buffer.from !== Uint8Array.from ? function(a) { 147 | return (a.constructor === buffer.constructor 148 | ? a : buffer.from(a, 'base64')).toString(); 149 | } 150 | : function(a) { 151 | return (a.constructor === buffer.constructor 152 | ? a : new buffer(a, 'base64')).toString(); 153 | } 154 | : function(a) { return btou(atob(a)) }; 155 | var decode = function(a){ 156 | return _decode( 157 | String(a).replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' }) 158 | .replace(/[^A-Za-z0-9\+\/]/g, '') 159 | ); 160 | }; 161 | var noConflict = function() { 162 | var Base64 = global.Base64; 163 | global.Base64 = _Base64; 164 | return Base64; 165 | }; 166 | // export Base64 167 | global.Base64 = { 168 | VERSION: version, 169 | atob: atob, 170 | btoa: btoa, 171 | fromBase64: decode, 172 | toBase64: encode, 173 | utob: utob, 174 | encode: encode, 175 | encodeURI: encodeURI, 176 | btou: btou, 177 | decode: decode, 178 | noConflict: noConflict 179 | }; 180 | // if ES5 is available, make Base64.extendString() available 181 | if (typeof Object.defineProperty === 'function') { 182 | var noEnum = function(v){ 183 | return {value:v,enumerable:false,writable:true,configurable:true}; 184 | }; 185 | global.Base64.extendString = function () { 186 | Object.defineProperty( 187 | String.prototype, 'fromBase64', noEnum(function () { 188 | return decode(this) 189 | })); 190 | Object.defineProperty( 191 | String.prototype, 'toBase64', noEnum(function (urisafe) { 192 | return encode(this, urisafe) 193 | })); 194 | Object.defineProperty( 195 | String.prototype, 'toBase64URI', noEnum(function () { 196 | return encode(this, true) 197 | })); 198 | }; 199 | } 200 | // 201 | // export Base64 to the namespace 202 | // 203 | if (global['Meteor']) { // Meteor.js 204 | Base64 = global.Base64; 205 | } 206 | // module.exports and AMD are mutually exclusive. 207 | // module.exports has precedence. 208 | if (typeof module !== 'undefined' && module.exports) { 209 | module.exports.Base64 = global.Base64; 210 | } 211 | else if (typeof define === 'function' && define.amd) { 212 | // AMD. Register as an anonymous module. 213 | define([], function(){ return global.Base64 }); 214 | } 215 | // that's it! 216 | return {Base64: global.Base64} 217 | })); 218 | -------------------------------------------------------------------------------- /base64.js: -------------------------------------------------------------------------------- 1 | /* 2 | * base64.js 3 | * 4 | * Licensed under the BSD 3-Clause License. 5 | * http://opensource.org/licenses/BSD-3-Clause 6 | * 7 | * References: 8 | * http://en.wikipedia.org/wiki/Base64 9 | */ 10 | ;(function (global, factory) { 11 | typeof exports === 'object' && typeof module !== 'undefined' 12 | ? module.exports = factory(global) 13 | : typeof define === 'function' && define.amd 14 | ? define(factory) : factory(global) 15 | }(( 16 | typeof self !== 'undefined' ? self 17 | : typeof window !== 'undefined' ? window 18 | : typeof global !== 'undefined' ? global 19 | : this 20 | ), function(global) { 21 | 'use strict'; 22 | // existing version for noConflict() 23 | var _Base64 = global.Base64; 24 | var version = "2.4.3"; 25 | // if node.js, we use Buffer 26 | var buffer; 27 | if (typeof module !== 'undefined' && module.exports) { 28 | try { 29 | buffer = require('buffer').Buffer; 30 | } catch (err) {} 31 | } 32 | // constants 33 | var b64chars 34 | = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 35 | var b64tab = function(bin) { 36 | var t = {}; 37 | for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i; 38 | return t; 39 | }(b64chars); 40 | var fromCharCode = String.fromCharCode; 41 | // encoder stuff 42 | var cb_utob = function(c) { 43 | if (c.length < 2) { 44 | var cc = c.charCodeAt(0); 45 | return cc < 0x80 ? c 46 | : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6)) 47 | + fromCharCode(0x80 | (cc & 0x3f))) 48 | : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) 49 | + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) 50 | + fromCharCode(0x80 | ( cc & 0x3f))); 51 | } else { 52 | var cc = 0x10000 53 | + (c.charCodeAt(0) - 0xD800) * 0x400 54 | + (c.charCodeAt(1) - 0xDC00); 55 | return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07)) 56 | + fromCharCode(0x80 | ((cc >>> 12) & 0x3f)) 57 | + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) 58 | + fromCharCode(0x80 | ( cc & 0x3f))); 59 | } 60 | }; 61 | var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; 62 | var utob = function(u) { 63 | return u.replace(re_utob, cb_utob); 64 | }; 65 | var cb_encode = function(ccc) { 66 | var padlen = [0, 2, 1][ccc.length % 3], 67 | ord = ccc.charCodeAt(0) << 16 68 | | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) 69 | | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)), 70 | chars = [ 71 | b64chars.charAt( ord >>> 18), 72 | b64chars.charAt((ord >>> 12) & 63), 73 | padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63), 74 | padlen >= 1 ? '=' : b64chars.charAt(ord & 63) 75 | ]; 76 | return chars.join(''); 77 | }; 78 | var btoa = global.btoa ? function(b) { 79 | return global.btoa(b); 80 | } : function(b) { 81 | return b.replace(/[\s\S]{1,3}/g, cb_encode); 82 | }; 83 | var _encode = buffer ? 84 | buffer.from && Uint8Array && buffer.from !== Uint8Array.from 85 | ? function (u) { 86 | return (u.constructor === buffer.constructor ? u : buffer.from(u)) 87 | .toString('base64') 88 | } 89 | : function (u) { 90 | return (u.constructor === buffer.constructor ? u : new buffer(u)) 91 | .toString('base64') 92 | } 93 | : function (u) { return btoa(utob(u)) } 94 | ; 95 | var encode = function(u, urisafe) { 96 | return !urisafe 97 | ? _encode(String(u)) 98 | : _encode(String(u)).replace(/[+\/]/g, function(m0) { 99 | return m0 == '+' ? '-' : '_'; 100 | }).replace(/=/g, ''); 101 | }; 102 | var encodeURI = function(u) { return encode(u, true) }; 103 | // decoder stuff 104 | var re_btou = new RegExp([ 105 | '[\xC0-\xDF][\x80-\xBF]', 106 | '[\xE0-\xEF][\x80-\xBF]{2}', 107 | '[\xF0-\xF7][\x80-\xBF]{3}' 108 | ].join('|'), 'g'); 109 | var cb_btou = function(cccc) { 110 | switch(cccc.length) { 111 | case 4: 112 | var cp = ((0x07 & cccc.charCodeAt(0)) << 18) 113 | | ((0x3f & cccc.charCodeAt(1)) << 12) 114 | | ((0x3f & cccc.charCodeAt(2)) << 6) 115 | | (0x3f & cccc.charCodeAt(3)), 116 | offset = cp - 0x10000; 117 | return (fromCharCode((offset >>> 10) + 0xD800) 118 | + fromCharCode((offset & 0x3FF) + 0xDC00)); 119 | case 3: 120 | return fromCharCode( 121 | ((0x0f & cccc.charCodeAt(0)) << 12) 122 | | ((0x3f & cccc.charCodeAt(1)) << 6) 123 | | (0x3f & cccc.charCodeAt(2)) 124 | ); 125 | default: 126 | return fromCharCode( 127 | ((0x1f & cccc.charCodeAt(0)) << 6) 128 | | (0x3f & cccc.charCodeAt(1)) 129 | ); 130 | } 131 | }; 132 | var btou = function(b) { 133 | return b.replace(re_btou, cb_btou); 134 | }; 135 | var cb_decode = function(cccc) { 136 | var len = cccc.length, 137 | padlen = len % 4, 138 | n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) 139 | | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) 140 | | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0) 141 | | (len > 3 ? b64tab[cccc.charAt(3)] : 0), 142 | chars = [ 143 | fromCharCode( n >>> 16), 144 | fromCharCode((n >>> 8) & 0xff), 145 | fromCharCode( n & 0xff) 146 | ]; 147 | chars.length -= [0, 0, 2, 1][padlen]; 148 | return chars.join(''); 149 | }; 150 | var atob = global.atob ? function(a) { 151 | return global.atob(a); 152 | } : function(a){ 153 | return a.replace(/[\s\S]{1,4}/g, cb_decode); 154 | }; 155 | var _decode = buffer ? 156 | buffer.from && Uint8Array && buffer.from !== Uint8Array.from 157 | ? function(a) { 158 | return (a.constructor === buffer.constructor 159 | ? a : buffer.from(a, 'base64')).toString(); 160 | } 161 | : function(a) { 162 | return (a.constructor === buffer.constructor 163 | ? a : new buffer(a, 'base64')).toString(); 164 | } 165 | : function(a) { return btou(atob(a)) }; 166 | var decode = function(a){ 167 | return _decode( 168 | String(a).replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' }) 169 | .replace(/[^A-Za-z0-9\+\/]/g, '') 170 | ); 171 | }; 172 | var noConflict = function() { 173 | var Base64 = global.Base64; 174 | global.Base64 = _Base64; 175 | return Base64; 176 | }; 177 | // export Base64 178 | global.Base64 = { 179 | VERSION: version, 180 | atob: atob, 181 | btoa: btoa, 182 | fromBase64: decode, 183 | toBase64: encode, 184 | utob: utob, 185 | encode: encode, 186 | encodeURI: encodeURI, 187 | btou: btou, 188 | decode: decode, 189 | noConflict: noConflict 190 | }; 191 | // if ES5 is available, make Base64.extendString() available 192 | if (typeof Object.defineProperty === 'function') { 193 | var noEnum = function(v){ 194 | return {value:v,enumerable:false,writable:true,configurable:true}; 195 | }; 196 | global.Base64.extendString = function () { 197 | Object.defineProperty( 198 | String.prototype, 'fromBase64', noEnum(function () { 199 | return decode(this) 200 | })); 201 | Object.defineProperty( 202 | String.prototype, 'toBase64', noEnum(function (urisafe) { 203 | return encode(this, urisafe) 204 | })); 205 | Object.defineProperty( 206 | String.prototype, 'toBase64URI', noEnum(function () { 207 | return encode(this, true) 208 | })); 209 | }; 210 | } 211 | // 212 | // export Base64 to the namespace 213 | // 214 | if (global['Meteor']) { // Meteor.js 215 | Base64 = global.Base64; 216 | } 217 | // module.exports and AMD are mutually exclusive. 218 | // module.exports has precedence. 219 | if (typeof module !== 'undefined' && module.exports) { 220 | module.exports.Base64 = global.Base64; 221 | } 222 | else if (typeof define === 'function' && define.amd) { 223 | // AMD. Register as an anonymous module. 224 | define([], function(){ return global.Base64 }); 225 | } 226 | // that's it! 227 | return {Base64: global.Base64} 228 | })); 229 | --------------------------------------------------------------------------------