All files / utils parseDataUrl.ts

100% Statements 4/4
60% Branches 3/5
100% Functions 1/1
100% Lines 4/4

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49        23x                                                       15x   15x             15x              
import { dataUrlRegExpBuilder } from '../regexp'
import { LiteralUnion } from '../types'
import { parseUrlQueryString } from './parseUrlQueryString'
 
const regExp = dataUrlRegExpBuilder.build({
  exact: true,
})
 
export interface ParseDataUrlResult {
  mimeType: string
  parameters: Record<
    LiteralUnion<'name' | 'charset' | 'base64', string>,
    string
  >
  content: string
  base64: boolean
}
 
/**
 * 解析 Data URL。
 *
 * @param dataUrl 要解析的 Data URL
 * @returns 返回结果
 */
export function parseDataUrl(dataUrl: string): ParseDataUrlResult {
  const [
    ,
    mimeType = 'text/plain;charset=US-ASCII',
    ,
    ,
    extraParameters = '',
    content = '',
  ] = dataUrl.match(regExp) || []
 
  const parameters = parseUrlQueryString(
    `${mimeType}${extraParameters}`.replace(/^[^;]*;?/, ''),
    {
      partSeparator: ';',
    },
  )
 
  return {
    mimeType: decodeURIComponent(mimeType),
    parameters: parameters,
    content: decodeURIComponent(content),
    base64: parameters.base64 != null,
  }
}