{"record":{"id":"e9b0ae85e12911bd","repo":"OpenAPITools/openapi-generator","slug":"apipackage-and-modelpackage-must-be-defined","errorCode":null,"errorMessage":"apiPackage and modelPackage must be defined","messagePattern":"apiPackage and modelPackage must be defined","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAxiosClientCodegen.java","lineNumber":162,"sourceCode":"        additionalProperties.put(\"modelDocPath\", modelDocPath);\n\n        modelDocTemplateFiles.put(\"model_doc.mustache\", \".md\");\n        apiDocTemplateFiles.put(\"api_doc.mustache\", \".md\");\n\n        supportingFiles.add(new SupportingFile(\"index.mustache\", \"\", \"index.ts\"));\n        supportingFiles.add(new SupportingFile(\"baseApi.mustache\", \"\", \"base.ts\"));\n        supportingFiles.add(new SupportingFile(\"common.mustache\", \"\", \"common.ts\"));\n        supportingFiles.add(new SupportingFile(\"api.mustache\", \"\", \"api.ts\"));\n        supportingFiles.add(new SupportingFile(\"configuration.mustache\", \"\", \"configuration.ts\"));\n        supportingFiles.add(new SupportingFile(\"git_push.sh.mustache\", \"\", \"git_push.sh\"));\n        supportingFiles.add(new SupportingFile(\"gitignore\", \"\", \".gitignore\"));\n        supportingFiles.add(new SupportingFile(\"npmignore\", \"\", \".npmignore\"));\n\n        if (additionalProperties.containsKey(SEPARATE_MODELS_AND_API)) {\n            boolean separateModelsAndApi = Boolean.parseBoolean(additionalProperties.get(SEPARATE_MODELS_AND_API).toString());\n            if (separateModelsAndApi) {\n                if (StringUtils.isAnyBlank(modelPackage, apiPackage)) {\n                    throw new RuntimeException(\"apiPackage and modelPackage must be defined\");\n                }\n                modelTemplateFiles.put(\"model.mustache\", \".ts\");\n                apiTemplateFiles.put(\"apiInner.mustache\", \".ts\");\n                supportingFiles.add(new SupportingFile(\"modelIndex.mustache\", tsModelPackage, \"index.ts\"));\n            }\n        }\n\n        if (additionalProperties.containsKey(STRING_ENUMS)) {\n            this.stringEnums = Boolean.parseBoolean(additionalProperties.get(STRING_ENUMS).toString());\n            additionalProperties.put(\"stringEnums\", this.stringEnums);\n        }\n\n        if (additionalProperties.containsKey(IMPORT_FILE_EXTENSION_SWITCH)) {\n            this.importFileExtension = additionalProperties.get(IMPORT_FILE_EXTENSION_SWITCH).toString();\n            if (!this.importFileExtension.isEmpty() && !this.importFileExtension.startsWith(\".\")) {\n                this.importFileExtension = \".\" + this.importFileExtension;\n            }\n            additionalProperties.put(\"importFileExtension\", this.importFileExtension);","sourceCodeStart":144,"sourceCodeEnd":180,"githubUrl":"https://github.com/OpenAPITools/openapi-generator/blob/fcec517be3cf5b7964296bcba25fbc97541484e7/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptAxiosClientCodegen.java#L144-L180","documentation":"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.","triggerScenarios":"-g typescript-axios -DseparateModelsAndApi=true without setting apiPackage and modelPackage (or leaving one of them empty).","commonSituations":"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.","solutions":["Set both options, e.g. -DapiPackage=apis -DmodelPackage=models.","Or remove separateModelsAndApi to generate models and APIs side by side in one tree."],"exampleFix":"# before\nopenapi-generator generate -g typescript-axios -i api.yaml -DseparateModelsAndApi=true\n\n# after\nopenapi-generator generate -g typescript-axios -i api.yaml -DseparateModelsAndApi=true -DapiPackage=apis -DmodelPackage=models","handlingStrategy":"validation","validationCode":"// node: separateModelsAndApi requires both packages\nif (opts.separateModelsAndApi === true && (!opts.apiPackage || !opts.modelPackage))\n  throw new Error('separateModelsAndApi requires apiPackage and modelPackage to be set');","typeGuard":"const canSeparate = (o: { separateModelsAndApi?: boolean; apiPackage?: string; modelPackage?: string }): boolean =>\n  o.separateModelsAndApi !== true || Boolean(o.apiPackage && o.modelPackage);","tryCatchPattern":"// Java\ntry { new DefaultGenerator().opts(input).generate(); }\ncatch (RuntimeException e) {\n    // missing package options: set apiPackage/modelPackage and rerun once\n}","preventionTips":["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."],"tags":["typescript","axios","configuration","openapi-generator"],"backgroundTag":"missing-generator-option","analyzedSha":"fcec517be3cf5b7964296bcba25fbc97541484e7","analyzedAt":"2026-08-22T11:13:11.613Z","schemaVersion":2},"datasetVersion":"2026-08-22T14:17:55.899Z"}