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
- Set both options, e.g. -DapiPackage=apis -DmodelPackage=models.
- 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
- Always set apiPackage and modelPackage together when enabling separateModelsAndApi.
- Store the three options as one preset so they cannot drift apart.
- Add a pre-flight check for companion-option requirements.
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
- mapNumberTo supports %s
- useJackson3 is only supported for the 'native', 'apache-http
- Invalid microprofileFramework '{microprofileFramework}'. Mus
- Version %s of MicroProfile Rest Client is not supported or i
- Unexpected serializationLibrary value: {serializationLibrary
AI-assisted analysis of OpenAPITools/openapi-generator@fcec517be3 (2026-08-22).
Data as JSON: /api/errors/e9b0ae85e12911bd.
Report an issue: GitHub.