From 2570dda5c4642d421e5d9331335cd4aa6f1bda7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Gangs=C3=B8?= Date: Mon, 8 Jul 2024 22:09:39 +0200 Subject: [PATCH] feat: graceful error handling of invalid svgs --- src/module.ts | 48 +++++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/module.ts b/src/module.ts index 71b6f40b..d55ac339 100644 --- a/src/module.ts +++ b/src/module.ts @@ -125,8 +125,8 @@ export default defineNuxtModule({ ...(isBundling ? [] : [ - `import { createRequire } from 'module'`, - `const require = createRequire(import.meta.url)`, + `import { createRequire } from 'module'`, + `const require = createRequire(import.meta.url)`, ] ), `export const collections = {`, @@ -202,27 +202,33 @@ async function resolveCollection(nuxt: Nuxt, collection: string | IconifyJSON | const files = (await fg('*.svg', { cwd: dir, onlyFiles: true })) .sort() - const json: IconifyJSON = { - ...collection, - icons: Object.fromEntries(await Promise.all(files.map(async (file) => { - const name = basename(file, '.svg') - let svg = await fs.readFile(join(dir, file), 'utf-8') - const cleanupIdx = svg.indexOf(' 0) - svg = svg.slice(cleanupIdx) - const data = convertParsedSVG(parseSVGContent(svg)!)! - if (data.top === 0) - delete data.top - if (data.left === 0) - delete data.left - return [name, data] - }))), - } + const parsedIcons = await Promise.all(files.map(async (file) => { + const name = basename(file, '.svg') + let svg = await fs.readFile(join(dir, file), 'utf-8') + const cleanupIdx = svg.indexOf(' 0) + svg = svg.slice(cleanupIdx) + const data = convertParsedSVG(parseSVGContent(svg)!) + if (!data) { + logger.error(`Nuxt Icon could not parse the SVG content for icon \`${name}\``) + return [name, {}] + } + if (data.top === 0) + delete data.top + if (data.left === 0) + delete data.left + return [name, data] + })) + + const successfulIcons = parsedIcons.filter(([_, data]) => Object.keys(data).length > 0) // @ts-expect-error remove extra properties - delete json.dir + delete collection.dir - logger.success(`Nuxt Icon loaded local collection \`${json.prefix}\` with ${files.length} icons`) - return json + logger.success(`Nuxt Icon loaded local collection \`${collection.prefix}\` with ${successfulIcons.length} icons`) + return { + ...collection, + icons: Object.fromEntries(successfulIcons), + } } return collection }