11const cds = require ( "@sap/cds/lib" ) ;
22const { compile : openapi } = require ( "@cap-js/openapi" ) ;
33const { compile : asyncapi } = require ( "@cap-js/asyncapi" ) ;
4- const { COMPILER_TYPES } = require ( "./constants" ) ;
4+ const { COMPILER_TYPES , OPENAPI_SERVERS_ANNOTATION } = require ( "./constants" ) ;
55const Logger = require ( "./logger" ) ;
66const { interopCSN } = require ( "./interopCsn.js" ) ;
77const cdsc = require ( "@sap/cds-compiler/lib/main" ) ;
88const { isMCPPluginReady, buildMcpServerDefinition } = require ( "./mcpAdapter" ) ;
99
10+ /**
11+ * Read @OpenAPI.servers annotation from service definition
12+ * @param {object } csn - The CSN model
13+ * @param {string } serviceName - The service name
14+ * @returns {string|undefined } - JSON string of servers array or undefined
15+ */
16+ const _getServersFromAnnotation = ( csn , serviceName ) => {
17+ const servers = csn ?. definitions ?. [ serviceName ] ?. [ OPENAPI_SERVERS_ANNOTATION ] ;
18+ const isValidServers = Array . isArray ( servers ) && servers . length > 0 ;
19+ return isValidServers ? JSON . stringify ( servers ) : undefined ;
20+ } ;
21+
1022const getMetadata = async ( url , model = null ) => {
1123 const parts = url
1224 ?. split ( "/" )
@@ -23,7 +35,16 @@ const getMetadata = async (url, model = null) => {
2335 switch ( compilerType ) {
2436 case COMPILER_TYPES . oas3 :
2537 try {
26- responseFile = openapi ( csn , { ...options , ...( compileOptions ?. openapi || { } ) } ) ;
38+ // Check for service-level @OpenAPI.servers annotation
39+ const serversFromAnnotation = _getServersFromAnnotation ( csn , serviceName ) ;
40+ const openapiOptions = { ...options , ...( compileOptions ?. openapi || { } ) } ;
41+
42+ // Service-level annotation takes precedence over global config
43+ if ( serversFromAnnotation ) {
44+ openapiOptions [ "openapi:servers" ] = serversFromAnnotation ;
45+ }
46+
47+ responseFile = openapi ( csn , openapiOptions ) ;
2748 } catch ( error ) {
2849 Logger . error ( "OpenApi error:" , error . message ) ;
2950 throw error ;
0 commit comments