@@ -2,7 +2,7 @@ import cookie from 'cookie';
22import { isPlainObject } from 'is-plain-object' ;
33import { url } from '@swagger-api/apidom-reference/configuration/empty' ;
44
5- import { DEFAULT_BASE_URL } from '../constants.js' ;
5+ import { DEFAULT_BASE_URL , DEFAULT_OPENAPI_3_SERVER } from '../constants.js' ;
66import stockHttp , { mergeInQueryOrForm } from '../http/index.js' ;
77import createError from '../specmap/lib/create-error.js' ;
88import SWAGGER2_PARAMETER_BUILDERS from './swagger2/parameter-builders.js' ;
@@ -319,40 +319,47 @@ export function baseUrl(obj) {
319319 return specIsOAS3 ? oas3BaseUrl ( obj ) : swagger2BaseUrl ( obj ) ;
320320}
321321
322- function oas3BaseUrl ( { spec, pathName, method, server, contextUrl, serverVariables = { } } ) {
323- const servers =
324- spec ?. paths ?. [ pathName ] ?. [ ( method || '' ) . toLowerCase ( ) ] ?. servers ||
325- spec ?. paths ?. [ pathName ] ?. servers ||
326- spec ?. servers ;
322+ const isNonEmptyServerList = ( value ) => Array . isArray ( value ) && value . length > 0 ;
327323
324+ function oas3BaseUrl ( { spec, pathName, method, server, contextUrl, serverVariables = { } } ) {
325+ let servers = [ ] ;
328326 let selectedServerUrl = '' ;
329- let selectedServerObj = null ;
330-
331- if ( server && servers && servers . length ) {
332- const serverUrls = servers . map ( ( srv ) => srv . url ) ;
333-
334- if ( serverUrls . indexOf ( server ) > - 1 ) {
335- selectedServerUrl = server ;
336- selectedServerObj = servers [ serverUrls . indexOf ( server ) ] ;
337- }
327+ let selectedServerObj ;
328+
329+ // compute the servers (this will be taken care of by ApiDOM refrator plugins in future
330+ const operationLevelServers = spec ?. paths ?. [ pathName ] ?. [ ( method || '' ) . toLowerCase ( ) ] ?. servers ;
331+ const pathItemLevelServers = spec ?. paths ?. [ pathName ] ?. servers ;
332+ const rootLevelServers = spec ?. servers ;
333+ servers = isNonEmptyServerList ( operationLevelServers ) // eslint-disable-line no-nested-ternary
334+ ? operationLevelServers
335+ : isNonEmptyServerList ( pathItemLevelServers ) // eslint-disable-line no-nested-ternary
336+ ? pathItemLevelServers
337+ : isNonEmptyServerList ( rootLevelServers )
338+ ? rootLevelServers
339+ : [ DEFAULT_OPENAPI_3_SERVER ] ;
340+
341+ // pick the first server that matches the server url
342+ if ( server ) {
343+ selectedServerObj = servers . find ( ( srv ) => srv . url === server ) ;
344+ if ( selectedServerObj ) selectedServerUrl = server ;
338345 }
339346
340- if ( ! selectedServerUrl && servers && servers . length ) {
341- // default to the first server if we don't have one by now
342- selectedServerUrl = servers [ 0 ] . url ; // eslint-disable-line semi
343- [ selectedServerObj ] = servers ;
347+ // default to the first server if we don't have one by now
348+ if ( ! selectedServerUrl ) {
349+ selectedServerObj = servers . at ( 0 ) ;
350+ selectedServerUrl = selectedServerObj . url ;
344351 }
345352
346353 if ( selectedServerUrl . includes ( '{' ) ) {
347354 // do variable substitution
348355 const varNames = getVariableTemplateNames ( selectedServerUrl ) ;
349- varNames . forEach ( ( vari ) => {
350- if ( selectedServerObj . variables && selectedServerObj . variables [ vari ] ) {
356+ varNames . forEach ( ( variable ) => {
357+ if ( selectedServerObj . variables && selectedServerObj . variables [ variable ] ) {
351358 // variable is defined in server
352- const variableDefinition = selectedServerObj . variables [ vari ] ;
353- const variableValue = serverVariables [ vari ] || variableDefinition . default ;
359+ const variableDefinition = selectedServerObj . variables [ variable ] ;
360+ const variableValue = serverVariables [ variable ] || variableDefinition . default ;
354361
355- const re = new RegExp ( `{${ vari } }` , 'g' ) ;
362+ const re = new RegExp ( `{${ variable } }` , 'g' ) ;
356363 selectedServerUrl = selectedServerUrl . replace ( re , variableValue ) ;
357364 }
358365 } ) ;
@@ -378,7 +385,7 @@ function buildOas3UrlWithContext(ourUrl = '', contextUrl = '') {
378385 if ( computedScheme && computedHost ) {
379386 res = `${ computedScheme } ://${ computedHost + computedPath } ` ;
380387
381- // If last character is '/', trim it off
388+ // if last character is '/', trim it off
382389 } else {
383390 res = computedPath ;
384391 }
0 commit comments