@metamask/snaps-utils
Version:
A collection of utilities for MetaMask Snaps
1 lines • 3.82 kB
Source Map (JSON)
{"version":3,"file":"icon.cjs","sourceRoot":"","sources":["../src/icon.ts"],"names":[],"mappings":";;;AAAA,2CAAwD;AAExD,mCAAwC;AAG3B,QAAA,iBAAiB,GAAG,MAAO,CAAC;AAC5B,QAAA,sBAAsB,GAAG,GAAG,IAAI,CAAC,KAAK,CACjD,yBAAiB,GAAG,IAAI,CACzB,IAAI,CAAC;AAEN;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,IAAiB;IAChD,IAAA,cAAM,EAAC,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,IAAA,qBAAa,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU;QACtC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;IAE5B,IAAA,cAAM,EACJ,UAAU,IAAI,yBAAiB,EAC/B,sDAAsD,8BAAsB,GAAG,CAChF,CAAC;IAEF,IAAA,cAAM,EAAC,IAAA,WAAK,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,gCAAgC,CAAC,CAAC;AACnE,CAAC;AAdD,4CAcC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,GAAW;IAI1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,cAAQ,EAAC,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,IAAA,cAAM,EAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;gBACzD,IAAA,cAAM,EAAC,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;AArCD,4CAqCC","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"]}