diff --git a/README.md b/README.md
index 300fbbb..e129434 100644
--- a/README.md
+++ b/README.md
@@ -83,7 +83,7 @@ To use as a [ES-module](https://developer.mozilla.org/en-US/docs/Web/JavaScript/
```html
diff --git a/docs/base64.js.html b/docs/base64.js.html
index 22d4da7..b30a3e4 100644
--- a/docs/base64.js.html
+++ b/docs/base64.js.html
@@ -271,6 +271,33 @@
return base64.fromArrayBuffer(new TextEncoder().encode(str), urlMode);
};
+/**
+ * Function to validate base64
+ * @public
+ * @param {string} encoded - Base64 or Base64url encoded data
+ * @param {boolean} [urlMode] - If set to true, base64url will be expected
+ * @returns {boolean} - Valid base64/base64url?
+ */
+base64.validate = (encoded, urlMode) => {
+
+ // Bail out if not string
+ if (!(typeof encoded === "string" || encoded instanceof String)) {
+ return false;
+ }
+
+ // Go on validate
+ try {
+ if (urlMode) {
+ return /^[-A-Za-z0-9\-_]*$/.test(encoded);
+ } else {
+ return /^[-A-Za-z0-9+/]*={0,3}$/.test(encoded);
+ }
+ } catch (_e) {
+ return false;
+ }
+};
+
+base64.base64 = base64;
export default base64;
export { base64 };
diff --git a/docs/index.html b/docs/index.html
index 1bb05ee..4e5191f 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -128,13 +128,14 @@
Probably the only JavaScript base64 library you'll ever need.
@hexagon/base64
-
Base64 and base64url to string or arraybuffer, and back. Works in Node, Deno or browser.
-
+
Encode, decode and validate base64 and base64url to string or arraybuffer, and back. Works in Node, Deno or browser.
+
- Supports regular base64, as well as base64url
- Convert to/from string or arraybuffer
+- Validate / identify base64 and base64url
- Works in Node.js >=4.0 (both require and import).
- Works in Deno >=1.16.
- Works in browsers as standalone, UMD or ES-module.
@@ -180,7 +181,7 @@ CDN
To use as a ES-module
<script type="module">
- import base64 from "https://cdn.jsdelivr.net/npm/@hexagon/base64@/dist/base64.min.mjs";
+ import base64 from "https://cdn.jsdelivr.net/npm/hexagon/base64@1/dist/base64.min.mjs";
// ... see usage section ...
</script>
@@ -208,21 +209,31 @@ Examples
const example2dec = base64.toString("SGVsbMO2IFfDtnJsZCwgaG93IGFyZSB5b3UgZG9pbmcgdG9kYXk_IQ", true);
console.log(example2dec);
// > Hellö Wörld, how are you doing today?!
+
+// Check if string is base64url (setting the second parameter to true validates base64url)
+const example3valid = base64.validate("SGVsbMO2IFfDtnJsZCwgaG93IGFyZSB5b3UgZG9pbmcgdG9kYXk_IQ", true);
+console.log(example3valid);
+// > true
+
+// Check if string is base64
+const example4valid = base64.validate("SGVsbMO2IFfDtnJsZCwgaG93IGFyZSB5b3UgZG9pbmcgdG9kYXk_IQ");
+console.log(example4valid);
+// > false
+
+// Check if string is base64
+const example5valid = base64.validate("SGVsbMO2IFfDtnJsZCwgaG93IGFyZSB5b3UgZG9pbmcgdG9kYXk/IQ==");
+console.log(example5valid);
+// > true
+
Full API
The library encodes and decodes base64/base64url to and from ArrayBuffers
-
-
fromArrayBuffer(buffer) - Encodes ArrayBuffer
into base64 string
-
--
-
toArrayBuffer(str) - Decodes base64 string to ArrayBuffer
-
--
-
fromArrayBuffer(buffer, true) - Encodes ArrayBuffer
into base64url string
+fromArrayBuffer(buffer, urlMode) - Encodes ArrayBuffer
into base64 or base64url if urlMode (optional) is true
-
-
toArrayBuffer(str, true) - Decodes base64url string to ArrayBuffer
+toArrayBuffer(str, urlMode) - Decodes base64url string (or base64url string if urlMode is true) to ArrayBuffer
-
fromString(str) - Encodes String
into base64 string
@@ -231,10 +242,7 @@ Full API
toString(str) - Decodes base64 string to String
-
-
fromString(buffer, true) - Encodes String
into base64url string
-
--
-
toString(str, true) - Decodes base64url string to String
+validate(str, urlMode) - Returns true if String
str is valid base64/base64 dependending on urlMode
Contributing
diff --git a/package-lock.json b/package-lock.json
index cb3034f..9220a67 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@hexagon/base64",
- "version": "1.1.21",
+ "version": "1.1.22",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@hexagon/base64",
- "version": "1.1.21",
+ "version": "1.1.22",
"license": "MIT",
"devDependencies": {
"c8": "^7.10.0",
@@ -20,9 +20,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.18.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz",
- "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz",
+ "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -87,24 +87,24 @@
}
},
"node_modules/@jridgewell/resolve-uri": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
- "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz",
+ "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==",
"dev": true,
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
- "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==",
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
"dev": true
},
"node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
- "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
+ "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
"dev": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
@@ -655,9 +655,9 @@
}
},
"node_modules/flatted": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
- "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz",
+ "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==",
"dev": true
},
"node_modules/foreground-child": {
@@ -979,9 +979,9 @@
}
},
"node_modules/kleur": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz",
- "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==",
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
"dev": true,
"engines": {
"node": ">=6"
@@ -1308,9 +1308,9 @@
}
},
"node_modules/rollup": {
- "version": "2.75.6",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz",
- "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==",
+ "version": "2.75.7",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz",
+ "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==",
"dev": true,
"bin": {
"rollup": "dist/bin/rollup"
@@ -1523,9 +1523,9 @@
}
},
"node_modules/uvu": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.3.tgz",
- "integrity": "sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==",
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.4.tgz",
+ "integrity": "sha512-x1CyUjcP9VKaNPhjeB3FIc/jqgLsz2Q9LFhRzUTu/jnaaHILEGNuE0XckQonl8ISLcwyk9I2EZvWlYsQnwxqvQ==",
"dev": true,
"dependencies": {
"dequal": "^2.0.0",
@@ -1547,12 +1547,12 @@
"dev": true
},
"node_modules/v8-to-istanbul": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz",
- "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz",
+ "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==",
"dev": true,
"dependencies": {
- "@jridgewell/trace-mapping": "^0.3.7",
+ "@jridgewell/trace-mapping": "^0.3.12",
"@types/istanbul-lib-coverage": "^2.0.1",
"convert-source-map": "^1.6.0"
},
@@ -1664,9 +1664,9 @@
},
"dependencies": {
"@babel/parser": {
- "version": "7.18.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz",
- "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==",
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz",
+ "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==",
"dev": true
},
"@bcoe/v8-coverage": {
@@ -1716,21 +1716,21 @@
"dev": true
},
"@jridgewell/resolve-uri": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
- "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz",
+ "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==",
"dev": true
},
"@jridgewell/sourcemap-codec": {
- "version": "1.4.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
- "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==",
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
"dev": true
},
"@jridgewell/trace-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
- "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
+ "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
"dev": true,
"requires": {
"@jridgewell/resolve-uri": "^3.0.3",
@@ -2155,9 +2155,9 @@
}
},
"flatted": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
- "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz",
+ "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==",
"dev": true
},
"foreground-child": {
@@ -2405,9 +2405,9 @@
"dev": true
},
"kleur": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz",
- "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==",
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
"dev": true
},
"levn": {
@@ -2641,9 +2641,9 @@
}
},
"rollup": {
- "version": "2.75.6",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz",
- "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==",
+ "version": "2.75.7",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz",
+ "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==",
"dev": true,
"requires": {
"fsevents": "~2.3.2"
@@ -2798,9 +2798,9 @@
}
},
"uvu": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.3.tgz",
- "integrity": "sha512-brFwqA3FXzilmtnIyJ+CxdkInkY/i4ErvP7uV0DnUVxQcQ55reuHphorpF+tZoVHK2MniZ/VJzI7zJQoc9T9Yw==",
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.4.tgz",
+ "integrity": "sha512-x1CyUjcP9VKaNPhjeB3FIc/jqgLsz2Q9LFhRzUTu/jnaaHILEGNuE0XckQonl8ISLcwyk9I2EZvWlYsQnwxqvQ==",
"dev": true,
"requires": {
"dequal": "^2.0.0",
@@ -2816,12 +2816,12 @@
"dev": true
},
"v8-to-istanbul": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz",
- "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz",
+ "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==",
"dev": true,
"requires": {
- "@jridgewell/trace-mapping": "^0.3.7",
+ "@jridgewell/trace-mapping": "^0.3.12",
"@types/istanbul-lib-coverage": "^2.0.1",
"convert-source-map": "^1.6.0"
}
diff --git a/package.json b/package.json
index aa7b228..c56d6dc 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@hexagon/base64",
- "version": "1.1.21",
+ "version": "1.1.22",
"description": "Base64 and base64url to string or arraybuffer, and back. Node, Deno or browser.",
"author": "Hexagon ",
"contributors": [{