OpenAPITools / OpenAPITools/openapi-generator

[BUG][typescript-axios] index.ts: Module "./api" has already exported a member named 'Configuration'

Open
#11,717 8 comments 15 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Issue: Bug
Dominant language
Java
Stars
26.8k
Forks
7.7k
PR merge metrics
PR metrics pending

Description

Bug Report Checklist
  • Have you provided a full/minimal spec to reproduce the issue?
  • Have you validated the input using an OpenAPI validator (example)?
  • Have you tested with the latest master to confirm the issue still exists?
  • Have you searched for related issues/PRs?
  • What's the actual output vs expected output?
Description

In the generated index.ts for typescript-axios, there is always the following content:

export * from "./api";
export * from "./configuration";

When our API includes an interface named Configuration in api.ts, it conflicts with the export of Configuration in configuration.ts. This causes the second line to report error TS2308: Module "./api" has already exported a member named 'Configuration'. Consider explicitly re-exporting to resolve the ambiguity.. There is no way to directly resolve the issue without manually editing the files after each code generation, or without hard-coding custom scripts.

Same applies to api.ts where import { Configuration } from './configuration'; causes error Import declaration conflicts with local declaration of 'Configuration'. ts(2440). Here it also causes conflicts in the code, so we aren't able to just find-and-replace.

openapi-generator version

5.4.0

OpenAPI declaration file content or url

Any yaml with Configuration type, for example having:

    Configuration:
      required:
        - name
        - type
        - value
      type: object
      properties:
        type:
          type: string
        name:
          type: string
        value:
          type: object

under

components:
  schemas:

along with all references:
$ref: '#/components/schemas/Configuration'

Generation Details

npx @openapitools/openapi-generator-cli generate -i schemas/configurationapi.yaml -g typescript-axios -o generated/configurationapi --type-mappings DateTime=Date

Steps to reproduce

Perform the generation and build any TypeScript project (for example using Nuxt/Vue template npx create-nuxt-app <project-name>)

Related issues/PRs

No results when searching for the error message.

Suggest a fix
  • When there is a naming conflict between exported declarations, the configuration.ts could automatically rename its own exports.
    • Alternatively, at least there should be a way using some CLI parameters to disable the generation of index.ts altogether.
  • The api.ts could rename the imported variable using any "reserved" keyword that isn't part of the valid output. For example, something like a leading underscore could be enough: import { Configuration as _Configuration } from './configuration';. This needs to be changed in all occurrences, but without renaming the real Configuration.
  • The issue could be acknowledged by suggesting an official workaround for CLI automation, so that we don't have to research cross-platform options like npx replace-in-file or a safe file removal.
    • Even though it's relatively feasible to rename $ref: '#/components/schemas/Configuration' using replace-in-file, I can't imagine how to replace the Configuration: without some dedicated YAML parser to avoid risking side-effects.
      • Update: here is a workaround that seems to be sufficient; using /m multiline mode to match $ end of line so that this doesn't have a risk of accidentally replacing any unrelated text content, and using /g global mode to allow replacing multiple occurrences:
        • npx replace-in-file "/ Configuration:$/m" " ConfigurationType:" schemas/configurationapi.yaml --isRegex && npx replace-in-file "/\$ref: '#\/components\/schemas\/Configuration'/g" "$ref: '#/components/schemas/ConfigurationType'" schemas/configurationapi.yaml --isRegex
        • or when escaped as part of npm script: "npx replace-in-file \"/ Configuration:$/m\" \" ConfigurationType:\" schemas/configurationapi.yaml --isRegex && npx replace-in-file \"/\\$ref: '#\\/components\\/schemas\\/Configuration'/g\" \"$ref: '#/components/schemas/ConfigurationType'\" schemas/configurationapi.yaml --isRegex"

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Generate the provided Configuration schema with the typescript-axios command, then inspect the generated index.ts, api.ts, and configuration.ts files. Build the generated client and verify that a schema named Configuration no longer causes the TS2308 export conflict or the TS2440 import conflict.

Written by the indexing model from the issue text.

Assessment

Tech stack
openapi, typescript
Domain
api, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.