UNPKG

openapi-contract-validator-server

Version:

Use an HTTP proxy to validate HTTP interactions against an OpenAPI Schema

92 lines (81 loc) 2.36 kB
/** * @memberof module.endpoint * @typedef {{ * protocol: string, * location: string, * uri: string, * full: openApiSchema * }} contract */ const _ = require('lodash'); const contractDownloader = require('./contract-downloader'); /** * An endpoint definition. * * @memberof module:endpoint */ class Endpoint { /** * @param {object} raw * @param {serverConfig} config */ constructor(raw, config) { this.endpoint = raw.endpoint; this.validate = _.defaultTo(raw.validate, true); if (!_.isEmpty(raw.contract)) { this.contract = this._parseContractUri(raw.contract); this.contract.full = _.memoize(() => { return contractDownloader.download(_.omit(this.contract, ['full']), config); }); } } /** * Parse the contract uri into its properties * * @param {string} uri * @return {contract} */ _parseContractUri(uri) { if (/^https?:\/\//.test(uri)) { if (uri.includes('apiary.io')) { return this._parseContractApiaryUri(uri); } return { protocol: 'http', uri: uri, location: uri, }; } return { protocol: 'file', uri: `file://${uri}`, location: uri, }; } /** * Extra parsing for Apiary URIs * * @param {string} uri * @throws {Error} when given an unsupported Apiary URI * @return {contract} */ _parseContractApiaryUri(uri) { const contract = { protocol: 'apiary', }; if (uri.includes('://app.apiary.io')) { const id = /^\w+:\/\/app\.apiary\.io\/(\w+)\/.+$/.exec(uri)[1]; contract.location = id; } else if (uri.includes('.docs.apiary.io')) { const id = /^\w+:\/\/(\w+)\.docs\.apiary\.io.*$/.exec(uri)[1]; contract.location = id; } else { throw new Error(`Apiary url format not supported for url '${uri}'`); } contract.uri = `${contract.protocol}://${contract.location}`; return contract; } } module.exports = Endpoint;