Skip to content
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Master

# 2.0.5 - 4 March, 2021
### Improvements
- Added support for relative URLs and variables in servers #59

# 2.0.4 - 26 Nov, 2020
### Improvements
- Nullable is now fully supported
Expand Down
21 changes: 18 additions & 3 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,29 @@ function buildSchemaSync(pathOrSchema, options) {
return buildValidations(jsonSchema, dereferencedSchema, options);
}

function getBasePaths(dereferenced) {
return dereferenced.servers && dereferenced.servers.length
? dereferenced.servers.map(({ url, variables = {} }) => {
// replace variables with deafault values
Object.keys(variables).forEach((key) => {
url = url.replace(new RegExp(`{${key}}`), variables[key].default);
});

// replace leading '//' with 'http://' (in cases such as //api.example.com)
url = url.replace(/^\/\//, 'http://');

// return base path
return (/\/\//.test(url)) ? new URL(url).pathname : url;
})
: [dereferenced.basePath || '/'];
}

function buildValidations(referenced, dereferenced, receivedOptions) {
const options = getOptions(receivedOptions);

const schemas = {};

const basePaths = dereferenced.servers && dereferenced.servers.length
? dereferenced.servers.map(({ url }) => new URL(url).pathname)
: [dereferenced.basePath || '/'];
const basePaths = getBasePaths(dereferenced);

Object.keys(dereferenced.paths).forEach(currentPath => {
const operationSchemas = {};
Expand Down
14 changes: 14 additions & 0 deletions test/openapi3/general/pets-general.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,20 @@ paths:
servers:
- url: http://petstore.swagger.io
- url: http://petstore.swagger.io/staging/
- url: /staging
- url: '{protocol}://petstore.swagger.io/{env}'
variables:
protocol:
enum:
- http
- https
default: http
env:
enum:
- staging
- ''
default: staging
- url: //petstore.swagger.io
components:
schemas:
Error:
Expand Down