diff --git a/.changeset/funny-planes-visit.md b/.changeset/funny-planes-visit.md new file mode 100644 index 000000000..5f6dc89c4 --- /dev/null +++ b/.changeset/funny-planes-visit.md @@ -0,0 +1,6 @@ +--- +"@gitbook/openapi-parser": patch +"@gitbook/react-openapi": patch +--- + +Support x-enable-proxy at operation level diff --git a/packages/openapi-parser/src/types.ts b/packages/openapi-parser/src/types.ts index 39c5531c5..13edbc0ea 100644 --- a/packages/openapi-parser/src/types.ts +++ b/packages/openapi-parser/src/types.ts @@ -69,6 +69,12 @@ export interface OpenAPICustomOperationProperties { }; }; + /** + * If `true`, the Scalar API client will proxy requests through the server + * to avoid CORS issues. + */ + 'x-enable-proxy'?: boolean; + /** * Stability of the operation. * @enum 'experimental' | 'alpha' | 'beta' diff --git a/packages/react-openapi/src/OpenAPICodeSample.tsx b/packages/react-openapi/src/OpenAPICodeSample.tsx index dd927216b..7df0a6840 100644 --- a/packages/react-openapi/src/OpenAPICodeSample.tsx +++ b/packages/react-openapi/src/OpenAPICodeSample.tsx @@ -243,7 +243,7 @@ function OpenAPICodeSampleFooter(props: { {!hideTryItPanel && hasValidHost && ( { expect(resolved?.['x-enable-proxy']).toBeUndefined(); }); + + it('should be available at the operation level', async () => { + const filesystem = await loadFixture({ + openapi: '3.1.0', + info: { title: 'Test', version: '1.0' }, + paths: { + '/test': { + get: { + 'x-enable-proxy': true, + responses: { '200': { description: 'OK' } }, + }, + }, + }, + }); + const resolved = await resolveOpenAPIOperation(filesystem, { + method: 'get', + path: '/test', + }); + + expect(resolved?.operation['x-enable-proxy']).toBe(true); + }); + + it('should allow operation-level to override spec-level', async () => { + const filesystem = await loadFixture({ + openapi: '3.1.0', + info: { title: 'Test', version: '1.0' }, + 'x-enable-proxy': true, + paths: { + '/test': { + get: { + 'x-enable-proxy': false, + responses: { '200': { description: 'OK' } }, + }, + }, + }, + }); + const resolved = await resolveOpenAPIOperation(filesystem, { + method: 'get', + path: '/test', + }); + + expect(resolved?.['x-enable-proxy']).toBe(true); + expect(resolved?.operation['x-enable-proxy']).toBe(false); + }); + + it('should allow operation-level true to override spec-level false', async () => { + const filesystem = await loadFixture({ + openapi: '3.1.0', + info: { title: 'Test', version: '1.0' }, + 'x-enable-proxy': false, + paths: { + '/test': { + get: { + 'x-enable-proxy': true, + responses: { '200': { description: 'OK' } }, + }, + }, + }, + }); + const resolved = await resolveOpenAPIOperation(filesystem, { + method: 'get', + path: '/test', + }); + + expect(resolved?.['x-enable-proxy']).toBe(false); + expect(resolved?.operation['x-enable-proxy']).toBe(true); + }); }); describe('server precedence', () => {