Skip to content

Commit

Permalink
feat(loader): implement error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
oktaysenkan committed Nov 16, 2024
1 parent 2e22671 commit 46d522f
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 29 deletions.
28 changes: 14 additions & 14 deletions apps/docs/public/sitemap-0.xml
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url><loc>https://monicon-docs.vercel.app</loc><lastmod>2024-11-16T00:20:31.858Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/nextjs</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/nuxt</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/qwik</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/react</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/react-native</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/react-rollup</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/react-rspack</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/remix</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/svelte</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/vue</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/troubleshooting/bundle-size</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/troubleshooting/module-resolution</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/troubleshooting/monorepo</loc><lastmod>2024-11-16T00:20:31.859Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app</loc><lastmod>2024-11-16T16:35:45.476Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/nextjs</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/nuxt</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/qwik</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/react</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/react-native</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/react-rollup</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/react-rspack</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/remix</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/svelte</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/installation/vue</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/troubleshooting/bundle-size</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/troubleshooting/module-resolution</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
<url><loc>https://monicon-docs.vercel.app/troubleshooting/monorepo</loc><lastmod>2024-11-16T16:35:45.477Z</lastmod><changefreq>daily</changefreq><priority>0.7</priority></url>
</urlset>
4 changes: 3 additions & 1 deletion packages/loader/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@
"typescript": "^5.3.3"
},
"dependencies": {
"fuuu": "^0.0.8",
"glob": "^11.0.0",
"radashi": "^12.2.3",
"slugify": "^1.6.6"
"slugify": "^1.6.6",
"svgson": "^5.3.1"
}
}
97 changes: 83 additions & 14 deletions packages/loader/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { readFileSync } from "fs";
import slugify from "slugify";
import * as _ from "radashi";
import path from "path";
import * as f from "fuuu";
import { parseSync } from "svgson";

slugify.extend({ "/": "-" });

Expand All @@ -19,16 +21,44 @@ export type JSONLoaderOptions =
options?: RequestInit;
};

type Content = {
name: string;
content: string;
};

const isValidSvg = (svg: string) => {
const parsed = f.syncSafe(() => parseSync(svg));

return !parsed.error;
};

export const JSONLoader: Loader<JSONLoaderOptions> = (input) => async () => {
const url = typeof input === "string" ? input : input.url;

const options = typeof input === "string" ? undefined : input.options;

const response = await fetch(url, options);
const response = await f.safe(() => fetch(url, options));

if (response.error) {
console.warn(`[Monicon] Request to "${url}" failed.`);
return {};
}

const content = await response.json();
const content = await f.safe<LoaderResult>(() => response.data.json());

return content as LoaderResult;
if (content.error) {
console.warn(`[Monicon] Unable to parse response from "${url}".`);
return {};
}

Object.entries(content.data).forEach(([key, value]) => {
if (!isValidSvg(value)) {
console.warn(`[Monicon] The response from "${url}" is not a valid SVG.`);
delete content.data[key];
}
});

return content.data as LoaderResult;
};

export type RemoteLoaderOptions = Record<
Expand All @@ -48,18 +78,37 @@ export const remoteLoader: Loader<RemoteLoaderOptions> =

const options = typeof value === "string" ? undefined : value.options;

const response = await fetch(url, options);
const response = await f.safe(() => fetch(url, options));

if (response.error) {
console.warn(`[Monicon] Request to "${url}" failed.`);
return;
}

const content = await response.text();
const content = await f.safe(() => response.data.text());

return { name: key, content };
if (content.error) {
console.warn(`[Monicon] Unable to parse response from "${url}".`);
return;
}

if (!isValidSvg(content.data)) {
console.warn(
`[Monicon] The response from "${url}" is not a valid SVG.`
);
return;
}

return { name: key, content: content.data } as Content;
})
);

const asArrayFiltered = asArray.filter((item) => !!item) as Content[];

const asObject = _.objectify(
asArray,
(f) => f.name,
(f) => f.content
asArrayFiltered,
(item) => item.name,
(item) => item.content
);

return asObject as LoaderResult;
Expand All @@ -80,8 +129,26 @@ export const localLoader: Loader<LocalLoaderOptions> = (input) => () => {

const filePaths = glob.sync(`${directory}/**/*.svg`);

if (!filePaths.length) {
console.warn(
`[Monicon] No files were found in the directory "${directory}".`
);
}

const files = filePaths.map((filePath) => {
const content = readFileSync(filePath, "utf-8");
const content = f.syncSafe(() => readFileSync(filePath, "utf-8"));

if (content.error) {
console.warn(
`[Monicon] The file "${filePath}" was not found. This file might not exist, or the required icon file might not be in the correct format.`
);
return;
}

if (!isValidSvg(content.data)) {
console.warn(`[Monicon] The file "${filePath}" is not a valid SVG.`);
return;
}

const fileAbsolutePath = path.resolve(filePath);

Expand All @@ -94,13 +161,15 @@ export const localLoader: Loader<LocalLoaderOptions> = (input) => () => {

const slugified = slugify(fileNameWithoutExtension, { lower: true });

return { name: slugified, content };
return { name: slugified, content: content.data } as Content;
});

const filesFiltered = files.filter((item) => !!item) as Content[];

const asObject = _.objectify(
files,
(f) => f.name,
(f) => f.content
filesFiltered,
(item) => item.name,
(item) => item.content
);

return asObject;
Expand Down
5 changes: 5 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -13009,6 +13009,11 @@ functions-have-names@^1.2.3:
resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==

fuuu@^0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/fuuu/-/fuuu-0.0.8.tgz#c2b7ecb59b22348ad3786600c9e95e6af2f3c11a"
integrity sha512-zQFHWeevoaQRBtrXoHJ/qz/HvhkSz5+ZPu1+sIqXQxfh/MlB0Mi1G+1wAfaZS6z4mRtp9BgPqyYOWwBTka96SA==

gauge@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395"
Expand Down

0 comments on commit 46d522f

Please sign in to comment.