acacode / acacode/swagger-typescript-api

Fix: Response object mutation fails in ESM environments with node-fetch v3

Aberta
#1,429 0 comentários 0 reações 0 responsáveis Ver no GitHub
bug
Linguagem predominante
TypeScript
Estrelas
4.1k
Forks
436
Métricas de merge de PRs
Nenhum PR com merge em 30d

Descrição

## Problem
The generated Fetch client attempts to directly mutate the Response object by adding `data` and `error` properties. This fails in ESM environments using node-fetch v3 because Response objects are read-only.

## Error
```
TypeError: Cannot set property data of # which has only a getter
at /node_modules/.pnpm/@oars+roleauth-api@1.0.53765/node_modules/@oars/v1.ts:1237:13
```

## Environment
- Node.js with ESM modules (`"type": "module"` in package.json)
- node-fetch v3.x (ESM-only version)
- swagger-typescript-api v13.0.23 (also confirmed in v13.2.13)

## Root Cause
In `templates/base/http-clients/fetch-http-client.ejs` (lines 187-189), the code attempts to directly mutate the Response object:

```javascript
const r = response as HttpResponse;
r.data = (null as unknown) as T;
r.error = (null as unknown) as E;
```

This works in CommonJS environments but fails in ESM with node-fetch v3 where Response objects are truly read-only and cannot have new properties added.

## Impact
Anyone migrating to ESM modules or using node-fetch v3 cannot use the generated Fetch client without workarounds.

## Current Workaround
Users must wrap fetch with a Proxy to make Response properties writable:

```javascript
const wrappedFetch = async (...args) => {
const response = await fetch(...args);
return new Proxy(response, {
set(target, prop, value) {
if (prop === 'data' || prop === 'error') {
target[prop] = value;
return true;
}
return Reflect.set(target, prop, value);
},
get(target, prop) {
if (prop === 'data' || prop === 'error') {
return target[prop];
}
const value = target[prop];
if (typeof value === 'function') {
return value.bind(target);
}
return value;
}
});
};
```

## Proposed Solution
Create a wrapper object instead of mutating the Response directly. This maintains backward compatibility while supporting modern ESM environments.

I'll be submitting a PR with a fix shortly.

Guia de contribuição

Nenhum guia de contribuição indexado para este repositório

Avaliação

Esta issue ainda não foi avaliada.

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.