From 76cb9c2a39d477a64824a985ade40507e3bbade1 Mon Sep 17 00:00:00 2001 From: Adam Mathes Date: Fri, 13 Feb 2026 21:34:48 -0800 Subject: feat(vanilla): add testing infrastructure and tests (NK-wjnczv) --- vanilla/node_modules/data-urls/lib/parser.js | 69 ++++++++++++++++++++++++++++ vanilla/node_modules/data-urls/lib/utils.js | 20 ++++++++ 2 files changed, 89 insertions(+) create mode 100644 vanilla/node_modules/data-urls/lib/parser.js create mode 100644 vanilla/node_modules/data-urls/lib/utils.js (limited to 'vanilla/node_modules/data-urls/lib') diff --git a/vanilla/node_modules/data-urls/lib/parser.js b/vanilla/node_modules/data-urls/lib/parser.js new file mode 100644 index 0000000..f3f708f --- /dev/null +++ b/vanilla/node_modules/data-urls/lib/parser.js @@ -0,0 +1,69 @@ +"use strict"; +const { MIMEType } = require("whatwg-mimetype"); +const { parseURL, serializeURL, percentDecodeString } = require("whatwg-url"); +const { stripLeadingAndTrailingASCIIWhitespace, isomorphicDecode, forgivingBase64Decode } = require("./utils.js"); + +module.exports = stringInput => { + const urlRecord = parseURL(stringInput); + + if (urlRecord === null) { + return null; + } + + return module.exports.fromURLRecord(urlRecord); +}; + +module.exports.fromURLRecord = urlRecord => { + if (urlRecord.scheme !== "data") { + return null; + } + + const input = serializeURL(urlRecord, true).substring("data:".length); + + let position = 0; + + let mimeType = ""; + while (position < input.length && input[position] !== ",") { + mimeType += input[position]; + ++position; + } + mimeType = stripLeadingAndTrailingASCIIWhitespace(mimeType); + + if (position === input.length) { + return null; + } + + ++position; + + const encodedBody = input.substring(position); + + let body = percentDecodeString(encodedBody); + + // Can't use /i regexp flag because it isn't restricted to ASCII. + const mimeTypeBase64MatchResult = /(.*); *[Bb][Aa][Ss][Ee]64$/u.exec(mimeType); + if (mimeTypeBase64MatchResult) { + const stringBody = isomorphicDecode(body); + body = forgivingBase64Decode(stringBody); + + if (body === null) { + return null; + } + mimeType = mimeTypeBase64MatchResult[1]; + } + + if (mimeType.startsWith(";")) { + mimeType = `text/plain${mimeType}`; + } + + let mimeTypeRecord; + try { + mimeTypeRecord = new MIMEType(mimeType); + } catch { + mimeTypeRecord = new MIMEType("text/plain;charset=US-ASCII"); + } + + return { + mimeType: mimeTypeRecord, + body + }; +}; diff --git a/vanilla/node_modules/data-urls/lib/utils.js b/vanilla/node_modules/data-urls/lib/utils.js new file mode 100644 index 0000000..8f5a424 --- /dev/null +++ b/vanilla/node_modules/data-urls/lib/utils.js @@ -0,0 +1,20 @@ +"use strict"; + +exports.stripLeadingAndTrailingASCIIWhitespace = string => { + return string.replace(/^[ \t\n\f\r]+/u, "").replace(/[ \t\n\f\r]+$/u, ""); +}; + +exports.isomorphicDecode = input => { + return Array.from(input, byte => String.fromCodePoint(byte)).join(""); +}; + +exports.forgivingBase64Decode = data => { + let asString; + try { + asString = atob(data); + } catch { + return null; + } + + return Uint8Array.from(asString, c => c.codePointAt(0)); +}; -- cgit v1.2.3