--- import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; import type { LogoType } from '@webtypes/Config'; import type { HTMLAttributes } from 'astro/types'; export interface Props extends HTMLAttributes<'svg'> { logo: LogoType size?: number | [number, number] silent?: boolean } const { logo, size = undefined, ...attr } = Astro.props; let svg: string | undefined; try { if (logo === undefined) return; const dir = new URL(join('..', '..', '..', 'public', 'media'), import.meta.url).pathname; svg = (await readFile(`${dir}/${logo.replaceAll('.', '/')}.svg`, { encoding: 'utf8' })); if (svg === undefined) return; if (typeof size == 'number' || Array.isArray(size)) { // SVG main element regex const svgElementRegex = /]*>/; svg = svg.replace(svgElementRegex, (match) => { let newMatch = match; if (typeof size == 'number') { newMatch = newMatch.replace(/width="[^"]*"/, `width="${size}"`); newMatch = newMatch.replace(/height="[^"]*"/, `height="${size}"`); } else if (Array.isArray(size)) { newMatch = newMatch.replace(/width="[^"]*"/, `width="${size[0]}"`); newMatch = newMatch.replace(/height="[^"]*"/, `height="${size[1]}"`); } return newMatch; }); } svg = svg.replace(/ `${key}="${value}"`).join(' ')}`); } catch (err) { console.error(`Error occurred while loading SVG. Logo name is ${logo}.`); console.error(err); } ---