OpenAPITools/openapi-generator · error · RuntimeException

apiPackage and modelPackage must be defined

Error message

apiPackage and modelPackage must be defined

What it means

When separateModelsAndApi=true, the typescript-axios generator writes models and APIs into separate folders driven by the apiPackage and modelPackage options. If either option is blank at supporting-file setup time, generation throws because the output paths cannot be computed.

Source

Thrown at modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAxiosClientCodegen.java:162

        additionalProperties.put("modelDocPath", modelDocPath);

        modelDocTemplateFiles.put("model_doc.mustache", ".md");
        apiDocTemplateFiles.put("api_doc.mustache", ".md");

        supportingFiles.add(new SupportingFile("index.mustache", "", "index.ts"));
        supportingFiles.add(new SupportingFile("baseApi.mustache", "", "base.ts"));
        supportingFiles.add(new SupportingFile("common.mustache", "", "common.ts"));
        supportingFiles.add(new SupportingFile("api.mustache", "", "api.ts"));
        supportingFiles.add(new SupportingFile("configuration.mustache", "", "configuration.ts"));
        supportingFiles.add(new SupportingFile("git_push.sh.mustache", "", "git_push.sh"));
        supportingFiles.add(new SupportingFile("gitignore", "", ".gitignore"));
        supportingFiles.add(new SupportingFile("npmignore", "", ".npmignore"));

        if (additionalProperties.containsKey(SEPARATE_MODELS_AND_API)) {
            boolean separateModelsAndApi = Boolean.parseBoolean(additionalProperties.get(SEPARATE_MODELS_AND_API).toString());
            if (separateModelsAndApi) {
                if (StringUtils.isAnyBlank(modelPackage, apiPackage)) {
                    throw new RuntimeException("apiPackage and modelPackage must be defined");
                }
                modelTemplateFiles.put("model.mustache", ".ts");
                apiTemplateFiles.put("apiInner.mustache", ".ts");
                supportingFiles.add(new SupportingFile("modelIndex.mustache", tsModelPackage, "index.ts"));
            }
        }

        if (additionalProperties.containsKey(STRING_ENUMS)) {
            this.stringEnums = Boolean.parseBoolean(additionalProperties.get(STRING_ENUMS).toString());
            additionalProperties.put("stringEnums", this.stringEnums);
        }

        if (additionalProperties.containsKey(IMPORT_FILE_EXTENSION_SWITCH)) {
            this.importFileExtension = additionalProperties.get(IMPORT_FILE_EXTENSION_SWITCH).toString();
            if (!this.importFileExtension.isEmpty() && !this.importFileExtension.startsWith(".")) {
                this.importFileExtension = "." + this.importFileExtension;
            }
            additionalProperties.put("importFileExtension", this.importFileExtension);

View on GitHub (pinned to fcec517be3)

Solutions

  1. Set both options, e.g. -DapiPackage=apis -DmodelPackage=models.
  2. Or remove separateModelsAndApi to generate models and APIs side by side in one tree.

Example fix

# before
openapi-generator generate -g typescript-axios -i api.yaml -DseparateModelsAndApi=true

# after
openapi-generator generate -g typescript-axios -i api.yaml -DseparateModelsAndApi=true -DapiPackage=apis -DmodelPackage=models
Defensive patterns

Strategy: validation

Validate before calling

// node: separateModelsAndApi requires both packages
if (opts.separateModelsAndApi === true && (!opts.apiPackage || !opts.modelPackage))
  throw new Error('separateModelsAndApi requires apiPackage and modelPackage to be set');

Type guard

const canSeparate = (o: { separateModelsAndApi?: boolean; apiPackage?: string; modelPackage?: string }): boolean =>
  o.separateModelsAndApi !== true || Boolean(o.apiPackage && o.modelPackage);

Try / catch

// Java
try { new DefaultGenerator().opts(input).generate(); }
catch (RuntimeException e) {
    // missing package options: set apiPackage/modelPackage and rerun once
}

Prevention

When it happens

Trigger: -g typescript-axios -DseparateModelsAndApi=true without setting apiPackage and modelPackage (or leaving one of them empty).

Common situations: Enabling the flag after a tutorial without reading its companion options; configs where apiPackage is set but modelPackage is missed; refactoring options into a shared config file and dropping one key.

Related errors


AI-assisted analysis of OpenAPITools/openapi-generator@fcec517be3 (2026-08-22). Data as JSON: /api/errors/e9b0ae85e12911bd. Report an issue: GitHub.