[BUG][typescript-fetch] runtime.ts does not compile with noUncheckedIndexedAccess since 7.26.0 (TS2345/TS2532)

Aperta Adatta ai principianti
#25,643 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
80/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
typescript
Ambito
backend

Direzione di ricerca

Inizia da modules/openapi-generator/src/main/resources/typescript-fetch/runtime.mustache, il template menzionato nell’issue, e ispeziona i tre accessi indicizzati ai gruppi di cattura regex in decodeExtValue e parseHeaderParameters. Genera la spec minima descritta nell’issue ed esegui il relativo controllo TypeScript con --noUncheckedIndexedAccess. Il lavoro è concluso quando il runtime.ts generato compila con questa opzione e mantiene il comportamento di parsing descritto.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Issue: Bug
Bug Report Checklist
  • Have you provided a full/minimal spec to reproduce the issue?
  • Have you validated the input using an OpenAPI validator?
  • Have you tested with the latest master to confirm the issue still exists?
  • Have you searched for related issues/PRs?
  • What's the actual output vs expected output?
  • [Optional] Sponsorship to speed up the bug fix or feature request (example)
Description

Since 7.26.0 the generated runtime.ts no longer compiles in a project that enables the TypeScript compiler option noUncheckedIndexedAccess. The Content-Disposition parsing added in #24957 and #24974 reads regex capture groups by index without a guard, and under this option every indexed access has the type string | undefined.

runtime.ts(536,43): error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  Type 'undefined' is not assignable to type 'string'.
runtime.ts(552,22): error TS2532: Object is possibly 'undefined'.
runtime.ts(554,90): error TS2532: Object is possibly 'undefined'.

The three lines are:

return match ? decodeURIComponent(match[1]) : undefined;                                                    // decodeExtValue
const name = match[1].toLowerCase();                                                                        // parseHeaderParameters
params.set(name, match[2] !== undefined ? match[2].replace(/\\(.)/g, '$1') : match[3].trim());              // parseHeaderParameters

The generated client is compiled as part of the consuming project, so the project's compiler options apply to it. The runtime compiled cleanly under this option up to 7.25.0, so the update breaks the build of such projects.

openapi-generator version

Regression. 7.25.0 compiles. 7.26.0, 7.27.0 and 7.28.0-SNAPSHOT (build 20261111.130840-62) fail.

OpenAPI declaration file content or url

Any spec reproduces it, because the code is in the static runtime.

openapi: 3.0.3
info:
  title: runtime strictness
  version: 1.0.0
paths:
  /ping:
    get:
      operationId: ping
      responses:
        '204':
          description: No content
Generation Details
java -jar openapi-generator-cli.jar generate -i spec.yaml -g typescript-fetch -o out
npx -p [email protected] tsc --ignoreConfig --noEmit --strict --noUncheckedIndexedAccess \
  --target es2020 --module esnext --moduleResolution bundler --lib es2020,dom out/runtime.ts
Steps to reproduce
  1. Generate with the spec and command above.
  2. Type-check out/runtime.ts with the tsc command above.

Expected: no errors, as with 7.25.0. Actual: the three errors above. Without --noUncheckedIndexedAccess the file compiles.

Related issues/PRs
  • #24957 and #24974 added the code (feature request #24956). I found no existing report.
Suggest a fix

Guard the three accesses in typescript-fetch/runtime.mustache. The following compiles with and without the option and keeps the behaviour, because the groups in question always participate in a successful match:

return match?.[1] !== undefined ? decodeURIComponent(match[1]) : undefined;
const name = (match[1] ?? '').toLowerCase();
if (!params.has(name)) {
    params.set(name, match[2] !== undefined ? match[2].replace(/\\(.)/g, '$1') : (match[3] ?? '').trim());
}

It may also be worth enabling noUncheckedIndexedAccess in the tsconfig.json of one typescript-fetch sample, so that CI catches this class of error.

Lingua principale
Java
Stelle
26.9k
Fork
7.8k
Merge medio
2g 10h
PR unite (30g)
180

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di OpenAPITools/openapi-generator

Tutte le issue di OpenAPITools/openapi-generator

Issue simili

Altre issue su Java

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.