{"version":3,"file":"format-data-uri.mjs","names":[],"sources":["../src/format-data-uri.ts"],"sourcesContent":["/* -------------------------------------------------------------------\n\n                       ⚡ Storm Software - Stryke\n\n This code was released as part of the Stryke project. Stryke\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/stryke.\n\n Website:                  https://stormsoftware.com\n Repository:               https://github.com/storm-software/stryke\n Documentation:            https://docs.stormsoftware.com/projects/stryke\n Contact:                  https://stormsoftware.com/contact\n\n SPDX-License-Identifier:  Apache-2.0\n\n ------------------------------------------------------------------- */\n\n/**\n * Creates a data URI from a string of data.\n *\n * @param data - The data to convert to a data URI.\n * @param mime - The MIME type of the data.\n * @returns The data URI.\n */\nexport const formatDataURI = (data: string, mime: string): string =>\n  `data:${mime};utf8,${encodeURIComponent(data)}`;\n\nexport interface ParsedDataURI {\n  type: string;\n  typeFull: string;\n  charset: string;\n  buffer: ArrayBuffer;\n}\n\nexport interface BufferConversionsInterface {\n  base64ToArrayBuffer: (base64: string) => ArrayBuffer;\n  stringToBuffer: (str: string) => ArrayBuffer;\n}\n\n/**\n * Returns a `Buffer` instance from the given data URI `uri`.\n *\n *  @example\n * ```typescript\n * import { makeDataUriToBuffer } from \"@stryke/core/http\";\n *\n * const dataUriToBuffer = makeDataUriToBuffer({\n *   base64ToArrayBuffer: (base64) => Buffer.from(base64, \"base64\").buffer,\n *   stringToBuffer: (str) => Buffer.from(str, \"utf8\")https://avatars.githubusercontent.com/u/99053093?s=64&v=4.buffer,\n * });\n * const parsed = dataUriToBuffer(\"data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==\");\n * console.log(parsed);\n * // {\n * //   type: 'text/plain',\n * //   typeFull: 'text/plain;base64',\n * //   charset: '',\n * //   buffer: ArrayBuffer { ... }\n * // }\n * console.log(Buffer.from(parsed.buffer).toString(\"utf8\"));\n * // Hello, World!\n * ```\n *\n * @param convert - Conversion functions\n * @returns An object containing the parsed data URI properties and the decoded data as a Buffer instance.\n * @throws `TypeError` if `uri` is not a valid Data URI\n */\nexport const makeDataUriToBuffer =\n  (convert: BufferConversionsInterface) =>\n  (uri: string | URL): ParsedDataURI => {\n    uri = String(uri);\n\n    if (!/^data:/i.test(uri)) {\n      throw new Error(\n        '`uri` does not appear to be a Data URI (must begin with \"data:\")'\n      );\n    }\n\n    // strip newlines\n    uri = uri.replace(/\\r?\\n/g, \"\");\n\n    // split the URI up into the \"metadata\" and the \"data\" portions\n    const firstComma = uri.indexOf(\",\");\n    if (firstComma === -1 || firstComma <= 4) {\n      throw new Error(\"malformed data: URI\");\n    }\n\n    // remove the \"data:\" scheme and parse the metadata\n    const meta = uri.substring(5, firstComma).split(\";\");\n\n    let charset = \"\";\n    let base64 = false;\n    const type = meta[0] || \"text/plain\";\n    let typeFull = type;\n    for (let i = 1; i < meta.length; i++) {\n      if (meta[i] === \"base64\") {\n        base64 = true;\n      } else if (meta[i]) {\n        typeFull += `;${meta[i]}`;\n        if (meta[i]?.indexOf(\"charset=\") === 0) {\n          charset = meta[i]!.substring(8);\n        }\n      }\n    }\n\n    // defaults to US-ASCII only if type is not provided\n    if (!meta[0] && !charset.length) {\n      typeFull += \";charset=US-ASCII\";\n      charset = \"US-ASCII\";\n    }\n\n    // get the encoded data portion and decode URI-encoded chars\n    const data = unescape(uri.substring(firstComma + 1));\n    const buffer = base64\n      ? convert.base64ToArrayBuffer(data)\n      : convert.stringToBuffer(data);\n\n    return {\n      type,\n      typeFull,\n      charset,\n      buffer\n    };\n  };\n"],"mappings":";;;;;;;;AAyBA,MAAa,iBAAiB,MAAc,SAC1C,QAAQ,KAAK,QAAQ,mBAAmB,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyC/C,MAAa,uBACV,aACA,QAAqC;AACpC,OAAM,OAAO,IAAI;AAEjB,KAAI,CAAC,UAAU,KAAK,IAAI,CACtB,OAAM,IAAI,MACR,qEACD;AAIH,OAAM,IAAI,QAAQ,UAAU,GAAG;CAG/B,MAAM,aAAa,IAAI,QAAQ,IAAI;AACnC,KAAI,eAAe,MAAM,cAAc,EACrC,OAAM,IAAI,MAAM,sBAAsB;CAIxC,MAAM,OAAO,IAAI,UAAU,GAAG,WAAW,CAAC,MAAM,IAAI;CAEpD,IAAI,UAAU;CACd,IAAI,SAAS;CACb,MAAM,OAAO,KAAK,MAAM;CACxB,IAAI,WAAW;AACf,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,KAAI,KAAK,OAAO,SACd,UAAS;UACA,KAAK,IAAI;AAClB,cAAY,IAAI,KAAK;AACrB,MAAI,KAAK,IAAI,QAAQ,WAAW,KAAK,EACnC,WAAU,KAAK,GAAI,UAAU,EAAE;;AAMrC,KAAI,CAAC,KAAK,MAAM,CAAC,QAAQ,QAAQ;AAC/B,cAAY;AACZ,YAAU;;CAIZ,MAAM,OAAO,SAAS,IAAI,UAAU,aAAa,EAAE,CAAC;CACpD,MAAM,SAAS,SACX,QAAQ,oBAAoB,KAAK,GACjC,QAAQ,eAAe,KAAK;AAEhC,QAAO;EACL;EACA;EACA;EACA;EACD"}