Sha256: 4470315075a54661e1d284b23226e0cfadaa423228f65d85b089cee83b89cc4a

Contents?: true

Size: 1.65 KB

Versions: 26

Compression:

Stored size: 1.65 KB

Contents

"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 (e) {
    mimeTypeRecord = new MIMEType("text/plain;charset=US-ASCII");
  }

  return {
    mimeType: mimeTypeRecord,
    body
  };
};

Version data entries

26 entries across 26 versions & 1 rubygems

Version Path
clapton-0.0.26 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.25 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.24 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.23 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.22 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.21 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.20 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.19 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.18 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.17 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.16 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.15 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.14 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.13 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.12 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.11 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.10 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.9 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.8 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js
clapton-0.0.7 lib/clapton/javascripts/node_modules/data-urls/lib/parser.js