{"version":3,"file":"icon.mjs","sourceRoot":"","sources":["../src/icon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,wBAAwB;AAExD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAc;AAGxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAO,CAAC;AACzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,IAAI,CAAC,KAAK,CACjD,iBAAiB,GAAG,IAAI,CACzB,IAAI,CAAC;AAEN;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,sCAAsC,CAAC,CAAC;IAE3E,MAAM,UAAU,GACd,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;QAC5B,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU;QACtC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;IAE5B,MAAM,CACJ,UAAU,IAAI,iBAAiB,EAC/B,sDAAsD,sBAAsB,GAAG,CAChF,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,gCAAgC,CAAC,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAI1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE7B,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAEhC,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YACpB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,6DAA6D;YAC7D,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEvE,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;gBAClC,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBAC/C,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;gBACzD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;gBAE3D,OAAO;oBACL,KAAK,EAAE,WAAW;oBAClB,MAAM,EAAE,YAAY;iBACrB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import { assert, stringToBytes } from '@metamask/utils';\n\nimport { isSvg, parseSvg } from './svg';\nimport type { VirtualFile } from './virtual-file';\n\nexport const SVG_MAX_BYTE_SIZE = 100_000;\nexport const SVG_MAX_BYTE_SIZE_TEXT = `${Math.floor(\n  SVG_MAX_BYTE_SIZE / 1000,\n)}kb`;\n\n/**\n * Assert that a virtual file containing a Snap icon is valid.\n *\n * @param icon - A virtual file containing a Snap icon.\n */\nexport function assertIsSnapIcon(icon: VirtualFile) {\n  assert(icon.path.endsWith('.svg'), 'Expected snap icon to end in \".svg\".');\n\n  const byteLength =\n    typeof icon.value === 'string'\n      ? stringToBytes(icon.value).byteLength\n      : icon.value.byteLength;\n\n  assert(\n    byteLength <= SVG_MAX_BYTE_SIZE,\n    `The specified SVG icon exceeds the maximum size of ${SVG_MAX_BYTE_SIZE_TEXT}.`,\n  );\n\n  assert(isSvg(icon.toString()), 'Snap icon must be a valid SVG.');\n}\n\n/**\n * Extract the dimensions of an image from an SVG string if possible.\n *\n * @param svg - An SVG string.\n * @returns The height and width of the SVG or null.\n */\nexport function getSvgDimensions(svg: string): {\n  height: number;\n  width: number;\n} | null {\n  try {\n    const parsed = parseSvg(svg);\n\n    const height = parsed['@_height'];\n    const width = parsed['@_width'];\n\n    if (height && width) {\n      return { height, width };\n    }\n\n    const viewBox = parsed['@_viewBox'];\n    if (viewBox) {\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n      const [_minX, _minY, viewBoxWidth, viewBoxHeight] = viewBox.split(' ');\n\n      if (viewBoxWidth && viewBoxHeight) {\n        const parsedWidth = parseInt(viewBoxWidth, 10);\n        const parsedHeight = parseInt(viewBoxHeight, 10);\n\n        assert(Number.isInteger(parsedWidth) && parsedWidth > 0);\n        assert(Number.isInteger(parsedHeight) && parsedHeight > 0);\n\n        return {\n          width: parsedWidth,\n          height: parsedHeight,\n        };\n      }\n    }\n  } catch {\n    throw new Error('Snap icon must be a valid SVG.');\n  }\n\n  return null;\n}\n"]}