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

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

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

Conversation

@thobed

@thobedthobed commented Mar 14, 2026

Copy link
Copy Markdown

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:

// BaseAPIconstructor(configuration?: Configuration,protectedbasePath: string =BASE_PATH,protectedaxios: AxiosInstance=globalAxios){ ... }// RequiredErrorconstructor(publicfield: 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 configgeneratorName: typescript-axiosadditionalProperties:
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.

@cubic-dev-aicubic-dev-aiBot left a comment

Copy link
Copy Markdown
Contributor

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);

@cubic-dev-aicubic-dev-aiBotMar 14, 2026

Copy link
Copy Markdown
Contributor

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

@thobedthobedMar 14, 2026

Copy link
Copy Markdown
Author

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
Copy Markdown
Author

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.

…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.
ClosesOpenAPITools#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).
@wing328

Copy link
Copy Markdown
Member

cc @TiFu (2017/07) @taxpon (2017/07) @sebastianhaas (2017/07) @kenisteward (2017/07) @Vrolijkx (2017/09) @macjohnny (2018/01) @topce (2018/10) @akehir (2019/07) @petejohansonxo (2019/11) @amakhrov (2020/02) @davidgamero (2022/03) @mkusaka (2022/04) @joscha (2024/10) @dennisameling (2026/02)

}
}
{{/useErasableSyntax}}
{{#useErasableSyntax}}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this code would also be compatible with the {{^useErasableSyntax}} case, right? so lets just keep this branch to avoid duplication, same below.

that would also mean we dont need the additional CLI option, right?

you can also add a comment here in the mustache template to let future editors know the code should be compatible to the erasable syntax, wdyt?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

3 participants

@thobed@wing328@macjohnny
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

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

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

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

Conversation

@thobed

@thobedthobed commented Mar 14, 2026

Copy link
Copy Markdown

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:

// BaseAPIconstructor(configuration?: Configuration,protectedbasePath: string =BASE_PATH,protectedaxios: AxiosInstance=globalAxios){ ... }// RequiredErrorconstructor(publicfield: 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 configgeneratorName: typescript-axiosadditionalProperties:
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.

@cubic-dev-aicubic-dev-aiBot left a comment

Copy link
Copy Markdown
Contributor

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);

@cubic-dev-aicubic-dev-aiBotMar 14, 2026

Copy link
Copy Markdown
Contributor

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

@thobedthobedMar 14, 2026

Copy link
Copy Markdown
Author

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
Copy Markdown
Author

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.

…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.
ClosesOpenAPITools#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).
@wing328

Copy link
Copy Markdown
Member

cc @TiFu (2017/07) @taxpon (2017/07) @sebastianhaas (2017/07) @kenisteward (2017/07) @Vrolijkx (2017/09) @macjohnny (2018/01) @topce (2018/10) @akehir (2019/07) @petejohansonxo (2019/11) @amakhrov (2020/02) @davidgamero (2022/03) @mkusaka (2022/04) @joscha (2024/10) @dennisameling (2026/02)

}
}
{{/useErasableSyntax}}
{{#useErasableSyntax}}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this code would also be compatible with the {{^useErasableSyntax}} case, right? so lets just keep this branch to avoid duplication, same below.

that would also mean we dont need the additional CLI option, right?

you can also add a comment here in the mustache template to let future editors know the code should be compatible to the erasable syntax, wdyt?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

3 participants

@thobed@wing328@macjohnny
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

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

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

Conversation

@thobed

@thobedthobed commented Mar 14, 2026

Copy link
Copy Markdown

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:

// BaseAPIconstructor(configuration?: Configuration,protectedbasePath: string =BASE_PATH,protectedaxios: AxiosInstance=globalAxios){ ... }// RequiredErrorconstructor(publicfield: 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 configgeneratorName: typescript-axiosadditionalProperties:
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.

@cubic-dev-aicubic-dev-aiBot left a comment

Copy link
Copy Markdown
Contributor

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);

@cubic-dev-aicubic-dev-aiBotMar 14, 2026

Copy link
Copy Markdown
Contributor

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

@thobedthobedMar 14, 2026

Copy link
Copy Markdown
Author

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
Copy Markdown
Author

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.

…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.
ClosesOpenAPITools#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).
@wing328

Copy link
Copy Markdown
Member

cc @TiFu (2017/07) @taxpon (2017/07) @sebastianhaas (2017/07) @kenisteward (2017/07) @Vrolijkx (2017/09) @macjohnny (2018/01) @topce (2018/10) @akehir (2019/07) @petejohansonxo (2019/11) @amakhrov (2020/02) @davidgamero (2022/03) @mkusaka (2022/04) @joscha (2024/10) @dennisameling (2026/02)

}
}
{{/useErasableSyntax}}
{{#useErasableSyntax}}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this code would also be compatible with the {{^useErasableSyntax}} case, right? so lets just keep this branch to avoid duplication, same below.

that would also mean we dont need the additional CLI option, right?

you can also add a comment here in the mustache template to let future editors know the code should be compatible to the erasable syntax, wdyt?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

3 participants

@thobed@wing328@macjohnny
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

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

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

Conversation

@thobed

@thobedthobed commented Mar 14, 2026

Copy link
Copy Markdown

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:

// BaseAPIconstructor(configuration?: Configuration,protectedbasePath: string =BASE_PATH,protectedaxios: AxiosInstance=globalAxios){ ... }// RequiredErrorconstructor(publicfield: 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 configgeneratorName: typescript-axiosadditionalProperties:
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.

@cubic-dev-aicubic-dev-aiBot left a comment

Copy link
Copy Markdown
Contributor

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);

@cubic-dev-aicubic-dev-aiBotMar 14, 2026

Copy link
Copy Markdown
Contributor

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

@thobedthobedMar 14, 2026

Copy link
Copy Markdown
Author

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
Copy Markdown
Author

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.

…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.
ClosesOpenAPITools#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).
@wing328

Copy link
Copy Markdown
Member

cc @TiFu (2017/07) @taxpon (2017/07) @sebastianhaas (2017/07) @kenisteward (2017/07) @Vrolijkx (2017/09) @macjohnny (2018/01) @topce (2018/10) @akehir (2019/07) @petejohansonxo (2019/11) @amakhrov (2020/02) @davidgamero (2022/03) @mkusaka (2022/04) @joscha (2024/10) @dennisameling (2026/02)

}
}
{{/useErasableSyntax}}
{{#useErasableSyntax}}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this code would also be compatible with the {{^useErasableSyntax}} case, right? so lets just keep this branch to avoid duplication, same below.

that would also mean we dont need the additional CLI option, right?

you can also add a comment here in the mustache template to let future editors know the code should be compatible to the erasable syntax, wdyt?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

3 participants

@thobed@wing328@macjohnny
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

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

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

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

Conversation

@thobed

@thobedthobed commented Mar 14, 2026

Copy link
Copy Markdown

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:

// BaseAPIconstructor(configuration?: Configuration,protectedbasePath: string =BASE_PATH,protectedaxios: AxiosInstance=globalAxios){ ... }// RequiredErrorconstructor(publicfield: 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 configgeneratorName: typescript-axiosadditionalProperties:
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.

@cubic-dev-aicubic-dev-aiBot left a comment

Copy link
Copy Markdown
Contributor

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);

@cubic-dev-aicubic-dev-aiBotMar 14, 2026

Copy link
Copy Markdown
Contributor

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

@thobedthobedMar 14, 2026

Copy link
Copy Markdown
Author

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
Copy Markdown
Author

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.

…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.
ClosesOpenAPITools#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).
@wing328

Copy link
Copy Markdown
Member

cc @TiFu (2017/07) @taxpon (2017/07) @sebastianhaas (2017/07) @kenisteward (2017/07) @Vrolijkx (2017/09) @macjohnny (2018/01) @topce (2018/10) @akehir (2019/07) @petejohansonxo (2019/11) @amakhrov (2020/02) @davidgamero (2022/03) @mkusaka (2022/04) @joscha (2024/10) @dennisameling (2026/02)

}
}
{{/useErasableSyntax}}
{{#useErasableSyntax}}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this code would also be compatible with the {{^useErasableSyntax}} case, right? so lets just keep this branch to avoid duplication, same below.

that would also mean we dont need the additional CLI option, right?

you can also add a comment here in the mustache template to let future editors know the code should be compatible to the erasable syntax, wdyt?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

3 participants

@thobed@wing328@macjohnny
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

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

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

Conversation

@thobed

@thobedthobed commented Mar 14, 2026

Copy link
Copy Markdown

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:

// BaseAPIconstructor(configuration?: Configuration,protectedbasePath: string =BASE_PATH,protectedaxios: AxiosInstance=globalAxios){ ... }// RequiredErrorconstructor(publicfield: 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 configgeneratorName: typescript-axiosadditionalProperties:
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.

@cubic-dev-aicubic-dev-aiBot left a comment

Copy link
Copy Markdown
Contributor

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);

@cubic-dev-aicubic-dev-aiBotMar 14, 2026

Copy link
Copy Markdown
Contributor

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

@thobedthobedMar 14, 2026

Copy link
Copy Markdown
Author

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
Copy Markdown
Author

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.

…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.
ClosesOpenAPITools#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).
@wing328

Copy link
Copy Markdown
Member

cc @TiFu (2017/07) @taxpon (2017/07) @sebastianhaas (2017/07) @kenisteward (2017/07) @Vrolijkx (2017/09) @macjohnny (2018/01) @topce (2018/10) @akehir (2019/07) @petejohansonxo (2019/11) @amakhrov (2020/02) @davidgamero (2022/03) @mkusaka (2022/04) @joscha (2024/10) @dennisameling (2026/02)

}
}
{{/useErasableSyntax}}
{{#useErasableSyntax}}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this code would also be compatible with the {{^useErasableSyntax}} case, right? so lets just keep this branch to avoid duplication, same below.

that would also mean we dont need the additional CLI option, right?

you can also add a comment here in the mustache template to let future editors know the code should be compatible to the erasable syntax, wdyt?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

3 participants

@thobed@wing328@macjohnny
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

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

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

Conversation

@thobed

@thobedthobed commented Mar 14, 2026

Copy link
Copy Markdown

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:

// BaseAPIconstructor(configuration?: Configuration,protectedbasePath: string =BASE_PATH,protectedaxios: AxiosInstance=globalAxios){ ... }// RequiredErrorconstructor(publicfield: 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 configgeneratorName: typescript-axiosadditionalProperties:
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.

@cubic-dev-aicubic-dev-aiBot left a comment

Copy link
Copy Markdown
Contributor

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);

@cubic-dev-aicubic-dev-aiBotMar 14, 2026

Copy link
Copy Markdown
Contributor

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

@thobedthobedMar 14, 2026

Copy link
Copy Markdown
Author

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
Copy Markdown
Author

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.

…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.
ClosesOpenAPITools#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).
@wing328

Copy link
Copy Markdown
Member

cc @TiFu (2017/07) @taxpon (2017/07) @sebastianhaas (2017/07) @kenisteward (2017/07) @Vrolijkx (2017/09) @macjohnny (2018/01) @topce (2018/10) @akehir (2019/07) @petejohansonxo (2019/11) @amakhrov (2020/02) @davidgamero (2022/03) @mkusaka (2022/04) @joscha (2024/10) @dennisameling (2026/02)

}
}
{{/useErasableSyntax}}
{{#useErasableSyntax}}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this code would also be compatible with the {{^useErasableSyntax}} case, right? so lets just keep this branch to avoid duplication, same below.

that would also mean we dont need the additional CLI option, right?

you can also add a comment here in the mustache template to let future editors know the code should be compatible to the erasable syntax, wdyt?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

3 participants

@thobed@wing328@macjohnny
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

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

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

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

Conversation

@thobed

@thobedthobed commented Mar 14, 2026

Copy link
Copy Markdown

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:

// BaseAPIconstructor(configuration?: Configuration,protectedbasePath: string =BASE_PATH,protectedaxios: AxiosInstance=globalAxios){ ... }// RequiredErrorconstructor(publicfield: 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 configgeneratorName: typescript-axiosadditionalProperties:
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.

@cubic-dev-aicubic-dev-aiBot left a comment

Copy link
Copy Markdown
Contributor

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);

@cubic-dev-aicubic-dev-aiBotMar 14, 2026

Copy link
Copy Markdown
Contributor

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

@thobedthobedMar 14, 2026

Copy link
Copy Markdown
Author

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
Copy Markdown
Author

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.

…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.
ClosesOpenAPITools#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).
@wing328

Copy link
Copy Markdown
Member

cc @TiFu (2017/07) @taxpon (2017/07) @sebastianhaas (2017/07) @kenisteward (2017/07) @Vrolijkx (2017/09) @macjohnny (2018/01) @topce (2018/10) @akehir (2019/07) @petejohansonxo (2019/11) @amakhrov (2020/02) @davidgamero (2022/03) @mkusaka (2022/04) @joscha (2024/10) @dennisameling (2026/02)

}
}
{{/useErasableSyntax}}
{{#useErasableSyntax}}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

this code would also be compatible with the {{^useErasableSyntax}} case, right? so lets just keep this branch to avoid duplication, same below.

that would also mean we dont need the additional CLI option, right?

you can also add a comment here in the mustache template to let future editors know the code should be compatible to the erasable syntax, wdyt?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

3 participants

@thobed@wing328@macjohnny