Skip to content

Commit e55dbf6

Browse files
committed
Fix website deployment
1 parent 0100a57 commit e55dbf6

File tree

7 files changed

+103
-67
lines changed

7 files changed

+103
-67
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@
8686
"micromatch": "4.0.8",
8787
"node-forge": "1.3.3",
8888
"dompurify": "3.3.1",
89+
"jws": "4.0.1",
90+
"mdast-util-to-hast": "13.2.1",
8991
"webpack": "5.103.0",
9092
"axios": "1.13.2",
9193
"undici": "5.29.0",

pnpm-lock.yaml

Lines changed: 15 additions & 30 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

website/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
out/

website/next-env.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/// <reference types="next" />
22
/// <reference types="next/image-types/global" />
3+
/// <reference path="./.next/types/routes.d.ts" />
34

45
// NOTE: This file should not be edited
56
// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.

website/src/components/plugins-page.tsx

Lines changed: 34 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import { useMemo } from 'react';
22
import { StaticImageData } from 'next/image';
33
import { compareDesc } from 'date-fns';
44
import { useData } from 'nextra/hooks';
5+
import { fetchPackageInfoCachedAndRetried } from '@/lib/fetch-package-info-cached-and-retried';
56
import { ALL_TAGS, PLUGINS } from '@/lib/plugins';
6-
import { cn, fetchPackageInfo, MarketplaceSearch } from '@theguild/components';
7+
import { cn, MarketplaceSearch } from '@theguild/components';
78

89
type Plugin = {
910
title: string;
@@ -18,43 +19,40 @@ type Plugin = {
1819
className?: string;
1920
};
2021

21-
function retry<T>(fn: () => Promise<T>, retriesLeft = 3, interval = 1000): Promise<T> {
22-
return fn().catch(error => {
23-
if (retriesLeft === 1) {
24-
throw error;
25-
}
26-
return new Promise<T>(resolve => {
27-
setTimeout(() => {
28-
resolve(retry(fn, retriesLeft - 1, interval));
29-
}, interval);
30-
});
31-
});
32-
}
33-
3422
export const getStaticProps = async () => {
35-
const plugins: Plugin[] = [];
36-
await Promise.all(
37-
PLUGINS.map(({ identifier, npmPackage, title, icon, tags, githubReadme, className = '' }) =>
38-
retry(() => fetchPackageInfo(npmPackage, githubReadme))
39-
.then(({ readme, createdAt, updatedAt, description, weeklyNPMDownloads = 0 }) => {
40-
plugins.push({
41-
title,
42-
readme,
43-
createdAt,
44-
updatedAt,
45-
description,
46-
linkHref: `/plugins/${identifier}`,
47-
weeklyNPMDownloads,
48-
icon,
49-
tags,
50-
className,
51-
});
52-
})
53-
.catch(err => {
54-
console.warn(`failed to fetch package info for ${npmPackage}`, err);
55-
}),
23+
const plugins: Plugin[] = await Promise.all(
24+
PLUGINS.map(
25+
async ({ identifier, npmPackage, title, icon, tags, githubReadme, className = '' }) => {
26+
const {
27+
readme,
28+
createdAt,
29+
updatedAt,
30+
description,
31+
weeklyNPMDownloads = 0,
32+
} = await fetchPackageInfoCachedAndRetried(npmPackage, githubReadme);
33+
const actualReadme = githubReadme ? 'TODO' : readme;
34+
35+
return {
36+
title,
37+
readme: actualReadme,
38+
createdAt,
39+
updatedAt,
40+
description,
41+
linkHref: `/plugins/${identifier}`,
42+
weeklyNPMDownloads,
43+
icon,
44+
tags,
45+
className,
46+
};
47+
},
5648
),
57-
);
49+
).catch(err => {
50+
console.error('failed to fetch plugins', err);
51+
if (process.env.NODE_ENV === 'development') {
52+
return []; // flakily fails on HMR
53+
}
54+
throw err;
55+
});
5856

5957
return {
6058
props: {
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { fetchPackageInfo } from '@theguild/components';
2+
3+
const cache = new Map<string, Awaited<ReturnType<typeof fetchPackageInfo>>>();
4+
5+
export async function fetchPackageInfoCachedAndRetried(
6+
packageName: string,
7+
githubReadme?: { repo: string; path: string },
8+
retriesLeft = 3,
9+
interval = 1000,
10+
): Promise<Awaited<ReturnType<typeof fetchPackageInfo>>> {
11+
const cacheKey = githubReadme
12+
? `${packageName}::${githubReadme.repo}::${githubReadme.path}`
13+
: packageName;
14+
if (cache.has(cacheKey)) {
15+
return Promise.resolve(cache.get(cacheKey)!);
16+
}
17+
try {
18+
const result = await retry(
19+
() => fetchPackageInfo(packageName, githubReadme),
20+
retriesLeft,
21+
interval,
22+
);
23+
cache.set(cacheKey, result);
24+
return result;
25+
} catch (error) {
26+
console.warn(`failed to fetch package info for ${packageName}`, error);
27+
return {
28+
readme: 'Readme not available',
29+
createdAt: new Date().toISOString(),
30+
updatedAt: new Date().toISOString(),
31+
description: 'Description not available',
32+
weeklyNPMDownloads: 0,
33+
};
34+
}
35+
}
36+
37+
function retry<T>(fn: () => Promise<T>, retriesLeft = 3, interval = 1000): Promise<T> {
38+
return fn().catch(error => {
39+
if (retriesLeft === 1) {
40+
throw error;
41+
}
42+
return new Promise<T>(resolve => {
43+
setTimeout(() => {
44+
resolve(retry(fn, retriesLeft - 1, interval));
45+
}, interval);
46+
});
47+
});
48+
}

website/src/lib/plugin-get-static-props.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { GetStaticPaths, GetStaticProps } from 'next';
22
import { format } from 'date-fns';
33
import { buildDynamicMDX, buildDynamicMeta } from 'nextra/remote';
44
import { fetchPackageInfo } from '@theguild/components';
5+
import { fetchPackageInfoCachedAndRetried } from './fetch-package-info-cached-and-retried';
56
import { PLUGINS } from './plugins';
67

78
export const getStaticPaths: GetStaticPaths = () => ({
@@ -19,7 +20,7 @@ export const getStaticProps: GetStaticProps = async ctx => {
1920
throw new Error(`Unknown "${pluginPath}" plugin identifier`);
2021
}
2122
const { npmPackage, githubReadme, title } = plugin;
22-
const { readme, updatedAt } = await fetchPackageInfo(npmPackage, githubReadme);
23+
const { readme, updatedAt } = await fetchPackageInfoCachedAndRetried(npmPackage, githubReadme);
2324

2425
const mdx = await buildDynamicMDX(
2526
`

0 commit comments

Comments
 (0)