Skip to content

Commit 2db7211

Browse files
authored
Fix OpenAPI error (#3408)
1 parent b60039b commit 2db7211

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

packages/gitbook/src/lib/openapi/fetch.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
import { parseOpenAPI } from '@gitbook/openapi-parser';
1+
import { OpenAPIParseError, parseOpenAPI } from '@gitbook/openapi-parser';
22

33
import { noCacheFetchOptions } from '@/lib/data';
44
import { resolveContentRef } from '@/lib/references';
5+
import { unstable_cacheLife as cacheLife } from 'next/cache';
56
import { assert } from 'ts-essentials';
67
import { enrichFilesystem } from './enrich';
78
import type {
@@ -37,6 +38,10 @@ export async function fetchOpenAPIFilesystem(
3738
return fetchFilesystem(resolved.href);
3839
})();
3940

41+
if ('error' in filesystem) {
42+
throw new OpenAPIParseError(filesystem.error.message, { code: filesystem.error.code });
43+
}
44+
4045
return {
4146
filesystem,
4247
specUrl: resolved.href,
@@ -45,7 +50,17 @@ export async function fetchOpenAPIFilesystem(
4550

4651
const fetchFilesystem = async (url: string) => {
4752
'use cache';
48-
return fetchFilesystemUncached(url);
53+
try {
54+
return await fetchFilesystemUncached(url);
55+
} catch (error) {
56+
// Throwing an error inside a "use cache" function obfuscates the error,
57+
// so we need to handle it here and recreates the error outside the cache function.
58+
if (error instanceof OpenAPIParseError) {
59+
cacheLife('seconds');
60+
return { error: { code: error.code, message: error.message } };
61+
}
62+
throw error;
63+
}
4964
};
5065

5166
async function fetchFilesystemUncached(

packages/gitbook/src/lib/openapi/resolveOpenAPIOperationBlock.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { fetchOpenAPIFilesystem } from '@/lib/openapi/fetch';
2-
import type { OpenAPIParseError } from '@gitbook/openapi-parser';
2+
import { OpenAPIParseError } from '@gitbook/openapi-parser';
33
import { type OpenAPIOperationData, resolveOpenAPIOperation } from '@gitbook/react-openapi';
44
import type {
55
AnyOpenAPIOperationsBlock,
@@ -55,8 +55,8 @@ async function baseResolveOpenAPIOperationBlock(
5555

5656
return { data, specUrl };
5757
} catch (error) {
58-
if (error instanceof Error && error.name === 'OpenAPIParseError') {
59-
return { error: error as OpenAPIParseError };
58+
if (error instanceof OpenAPIParseError) {
59+
return { error };
6060
}
6161

6262
throw error;

0 commit comments

Comments
 (0)