Skip to content

fix(typescript-axios): add useErasableSyntax support for erasableSyntaxOnly compatibility#23247

Open
thobed wants to merge 4 commits intoOpenAPITools:masterfrom
thobed:fix/issue-22540
Open

fix(typescript-axios): add useErasableSyntax support for erasableSyntaxOnly compatibility#23247
thobed wants to merge 4 commits intoOpenAPITools:masterfrom
thobed:fix/issue-22540

Conversation

@thobed
Copy link

@thobed thobed commented Mar 14, 2026

Summary

Fixes #22540 — [BUG] Typescript-axios code generated is not compatible with erasableSyntaxOnly

TypeScript 5.8 introduced the erasableSyntaxOnly compiler option, which disallows parameter properties (protected/public in constructor parameters). The typescript-axios generator produces code in base.ts that uses parameter properties in both BaseAPI and RequiredError constructors, making the generated code incompatible with this flag.

This PR adds a new useErasableSyntax generator option that, when enabled, replaces parameter properties with explicit field declarations and constructor assignments.

Problem

The generated base.ts contains parameter properties like:

// BaseAPI
constructor(configuration?: Configuration, protected basePath: string = BASE_PATH, protected axios: AxiosInstance = globalAxios) { ... }

// RequiredError
constructor(public field: string, msg?: string) { ... }

These fail compilation when erasableSyntaxOnly: true is set in tsconfig.json (TypeScript 5.8+).

Changes

1. Java Generator (TypeScriptAxiosClientCodegen.java)

  • Added useErasableSyntax CLI option (boolean, defaults to false)
  • Parses and passes the option through to Mustache templates via additionalProperties

2. Mustache Template (baseApi.mustache)

  • Added conditional blocks using {{#useErasableSyntax}} / {{^useErasableSyntax}}
  • When enabled: BaseAPI declares basePath and axios as explicit protected fields, assigns them in the constructor body. RequiredError declares field as a public field, assigns it in the constructor body.
  • When disabled: behavior is unchanged (existing parameter property syntax)

3. Tests (TypeScriptAxiosClientCodegenTest.java)

  • Added testUseErasableSyntaxConfig() test that generates code with both useErasableSyntax: true and useErasableSyntax: false
  • Verifies erasable mode produces explicit field declarations and assignments
  • Verifies non-erasable mode retains parameter property syntax
  • Verifies erasable mode does NOT contain parameter properties

Files Changed

 .../languages/TypeScriptAxiosClientCodegen.java    |  9 +++++
 .../resources/typescript-axios/baseApi.mustache    | 25 +++++++++++++
 .../axios/TypeScriptAxiosClientCodegenTest.java    | 41 ++++++++++++++++++++++
 3 files changed, 75 insertions(+)

Usage

# In your OpenAPI Generator config
generatorName: typescript-axios
additionalProperties:
  useErasableSyntax: "true"

Or via CLI:

openapi-generator-cli generate -g typescript-axios --additional-properties=useErasableSyntax=true -i spec.yaml -o output/

Test Plan

  • Build passes: ./mvnw clean install -DskipTests
  • TypeScriptAxiosClientCodegenTest.testUseErasableSyntaxConfig passes
  • Generated code with useErasableSyntax=true compiles with erasableSyntaxOnly: true
  • Generated code without the flag remains unchanged (backward compatible)
  • Affected samples regenerated (if applicable)

Summary by cubic

Adds a useErasableSyntax option to the typescript-axios generator so base.ts compiles with TypeScript 5.8 erasableSyntaxOnly. Warns when used with stringEnums; tests verify parameter properties (including axios) are removed. Fixes #22540.

  • New Features

    • Adds useErasableSyntax (default false).
    • When enabled, BaseAPI and RequiredError use explicit fields and constructor assignments; disabled keeps existing output.
    • Logs a warning if combined with stringEnums.
    • Enable via --additional-properties=useErasableSyntax=true or config additionalProperties.
  • Refactors

    • Make the generator logger non-static to align with project ArchUnit rules.

Written for commit 30f7c22. Summary will update on new commits.

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 3 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/axios/TypeScriptAxiosClientCodegenTest.java">

<violation number="1" location="modules/openapi-generator/src/test/java/org/openapitools/codegen/typescript/axios/TypeScriptAxiosClientCodegenTest.java:213">
P2: The new erasable-syntax test does not assert that the `axios` parameter property is absent, leaving a regression gap for the feature it intends to protect.</violation>
</file>

<file name="modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAxiosClientCodegen.java">

<violation number="1" location="modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAxiosClientCodegen.java:186">
P2: `useErasableSyntax` is not reconciled with `stringEnums`, allowing generation of `export enum` despite claiming erasable-syntax compatibility.</violation>
</file>

Since this is your first cubic review, here's how it works:

  • cubic automatically reviews your code and comments on bugs and improvements
  • Teach cubic by replying to its comments. cubic learns from your replies and gets better over time
  • Add one-off context when rerunning by tagging @cubic-dev-ai with guidance or docs links (including llms.txt)
  • Ask questions if you need clarification on any suggestion

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.


if (additionalProperties.containsKey(USE_ERASABLE_SYNTAX)) {
this.useErasableSyntax = Boolean.parseBoolean(additionalProperties.get(USE_ERASABLE_SYNTAX).toString());
additionalProperties.put(USE_ERASABLE_SYNTAX, this.useErasableSyntax);
Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: useErasableSyntax is not reconciled with stringEnums, allowing generation of export enum despite claiming erasable-syntax compatibility.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAxiosClientCodegen.java, line 186:

<comment>`useErasableSyntax` is not reconciled with `stringEnums`, allowing generation of `export enum` despite claiming erasable-syntax compatibility.</comment>

<file context>
@@ -177,6 +181,11 @@ public void processOpts() {
 
+        if (additionalProperties.containsKey(USE_ERASABLE_SYNTAX)) {
+            this.useErasableSyntax = Boolean.parseBoolean(additionalProperties.get(USE_ERASABLE_SYNTAX).toString());
+            additionalProperties.put(USE_ERASABLE_SYNTAX, this.useErasableSyntax);
+        }
+
</file context>
Suggested change
additionalProperties.put(USE_ERASABLE_SYNTAX, this.useErasableSyntax);
additionalProperties.put(USE_ERASABLE_SYNTAX, this.useErasableSyntax);
if (Boolean.TRUE.equals(this.useErasableSyntax) && Boolean.TRUE.equals(this.stringEnums)) {
this.stringEnums = false;
additionalProperties.put("stringEnums", false);
}
Fix with Cubic

Copy link
Author

@thobed thobed Mar 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 0acb15c — added a runtime warning when both useErasableSyntax and stringEnums are enabled. The warning explains that enum declarations are not erasable syntax and recommends disabling stringEnums (the default generates erasable-compatible as const objects).

chose a warning over a hard error to avoid breaking existing configs — users may have valid reasons to enable both (e.g. migrating incrementally).

@thobed
Copy link
Author

thobed commented Mar 14, 2026

Thanks for the review!

Finding #1 (missing axios assertion): Fixed in 740a777 — added assertFileNotContains(baseTsPath, "protected axios: AxiosInstance = globalAxios") to the erasable syntax test.

Finding #2 (stringEnums + useErasableSyntax): Looking into this now. When stringEnums=true, the generator produces export enum declarations which are also non-erasable syntax under TypeScript 5.8's erasableSyntaxOnly. Will evaluate whether to add a warning/validation or handle it in this PR.

thobed added 3 commits March 14, 2026 09:32
…axOnly compatibility

Add useErasableSyntax option to the typescript-axios generator so that
generated base.ts avoids TypeScript parameter properties (protected/public
in constructor params), which are incompatible with TypeScript 5.8's
erasableSyntaxOnly flag.

Closes OpenAPITools#22540
Adds assertFileNotContains check for the axios parameter property
in erasable syntax mode to close the regression gap.
…e both enabled

TypeScript enum declarations are not erasable syntax and will fail
with erasableSyntaxOnly. Log a warning guiding users to disable
stringEnums (the default generates erasable-compatible const objects).
The project enforces that Logger fields must not be static to avoid
unnecessary memory consumption, since generators are used once per
program lifetime (see PR OpenAPITools#8799).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] Typescript-axios code generated is not compatiable is erasableSyntaxOnly

1 participant