Skip to content

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

@scscgit

Description

@scscgit

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"

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions