* gzip --> decompress * strictSSL --> https.rejectUnauthorized * auth --> username/password * qs --> searchParams * fix base service auth docs * completely remove requestOptions2GotOptions layer * update the docs Co-authored-by: repo-ranger[bot] <39074581+repo-ranger[bot]@users.noreply.github.com>
76 lines
2.1 KiB
JavaScript
76 lines
2.1 KiB
JavaScript
import Joi from 'joi'
|
|
import validate from '../core/base-service/validate.js'
|
|
import { InvalidResponse } from './index.js'
|
|
|
|
const optionalStringWhenNamedLogoPresent = Joi.alternatives().conditional(
|
|
'namedLogo',
|
|
{
|
|
is: Joi.string().required(),
|
|
then: Joi.string(),
|
|
}
|
|
)
|
|
|
|
const optionalNumberWhenAnyLogoPresent = Joi.alternatives()
|
|
.conditional('namedLogo', { is: Joi.string().required(), then: Joi.number() })
|
|
.conditional('logoSvg', { is: Joi.string().required(), then: Joi.number() })
|
|
|
|
const endpointSchema = Joi.object({
|
|
schemaVersion: 1,
|
|
label: Joi.string().allow('').required(),
|
|
message: Joi.string().required(),
|
|
color: Joi.string(),
|
|
labelColor: Joi.string(),
|
|
isError: Joi.boolean().default(false),
|
|
namedLogo: Joi.string(),
|
|
logoSvg: Joi.string(),
|
|
logoColor: optionalStringWhenNamedLogoPresent,
|
|
logoWidth: optionalNumberWhenAnyLogoPresent,
|
|
logoPosition: optionalNumberWhenAnyLogoPresent,
|
|
style: Joi.string(),
|
|
cacheSeconds: Joi.number().integer().min(0),
|
|
})
|
|
// `namedLogo` or `logoSvg`; not both.
|
|
.oxor('namedLogo', 'logoSvg')
|
|
.required()
|
|
|
|
// Strictly validate according to the endpoint schema. This rejects unknown /
|
|
// invalid keys. Optionally it prints those keys in the message in order to
|
|
// provide detailed feedback.
|
|
function validateEndpointData(
|
|
data,
|
|
{ prettyErrorMessage = 'invalid response data', includeKeys = false } = {}
|
|
) {
|
|
return validate(
|
|
{
|
|
ErrorClass: InvalidResponse,
|
|
prettyErrorMessage,
|
|
includeKeys,
|
|
traceErrorMessage: 'Response did not match schema',
|
|
traceSuccessMessage: 'Response after validation',
|
|
allowAndStripUnknownKeys: false,
|
|
},
|
|
data,
|
|
endpointSchema
|
|
)
|
|
}
|
|
|
|
const anySchema = Joi.any()
|
|
|
|
async function fetchEndpointData(
|
|
serviceInstance,
|
|
{ url, errorMessages, validationPrettyErrorMessage, includeKeys }
|
|
) {
|
|
const json = await serviceInstance._requestJson({
|
|
schema: anySchema,
|
|
url,
|
|
errorMessages,
|
|
options: { decompress: true },
|
|
})
|
|
return validateEndpointData(json, {
|
|
prettyErrorMessage: validationPrettyErrorMessage,
|
|
includeKeys,
|
|
})
|
|
}
|
|
|
|
export { validateEndpointData, fetchEndpointData }
|