* add helper functions for generating Open API path/query params with defaults * tweak Open API schema - make description optional - allow null example + allowEmptyValue (for boolean query params) * convert examples --> openApi in amo * convert examples --> openApi in ansible * convert examples --> openApi in appveyor build/job * add re-usable Open API query param for test-results badges we can use these for all the 'test results' badges * convert examples --> openApi in appveyor tests * DRY up existing dynamic/endpoint param definitions * DRY up queryParam * allow enum param in serviceDefinition schema * improve misleading param name * check route and openApi are consistent on service load * fix mistake in ansible role route * documentation --> description * add pathParams and queryParams helpers +docstrings * give everything a search-friendly summary, check for duplicate summary * prettier fixup
97 lines
2.7 KiB
JavaScript
97 lines
2.7 KiB
JavaScript
import Joi from 'joi'
|
|
|
|
const arrayOfStrings = Joi.array().items(Joi.string()).min(0).required()
|
|
|
|
const objectOfKeyValues = Joi.object()
|
|
.pattern(/./, Joi.string().allow(null))
|
|
.required()
|
|
|
|
const serviceDefinition = Joi.object({
|
|
category: Joi.string().required(),
|
|
name: Joi.string().required(),
|
|
isDeprecated: Joi.boolean().required(),
|
|
route: Joi.alternatives().try(
|
|
Joi.object({
|
|
pattern: Joi.string().required(),
|
|
queryParams: arrayOfStrings,
|
|
}),
|
|
Joi.object({
|
|
format: Joi.string().required(),
|
|
queryParams: arrayOfStrings,
|
|
}),
|
|
),
|
|
examples: Joi.array()
|
|
.items(
|
|
Joi.object({
|
|
title: Joi.string().required(),
|
|
example: Joi.object({
|
|
pattern: Joi.string(),
|
|
namedParams: objectOfKeyValues,
|
|
queryParams: objectOfKeyValues,
|
|
}).required(),
|
|
preview: Joi.object({
|
|
label: Joi.string(),
|
|
message: Joi.string().allow('').required(),
|
|
color: Joi.string().required(),
|
|
style: Joi.string(),
|
|
namedLogo: Joi.string(),
|
|
}).required(),
|
|
keywords: arrayOfStrings,
|
|
documentation: Joi.object({
|
|
__html: Joi.string().required(), // Valid HTML.
|
|
}),
|
|
}),
|
|
)
|
|
.default([]),
|
|
openApi: Joi.object().pattern(
|
|
/./,
|
|
Joi.object({
|
|
get: Joi.object({
|
|
summary: Joi.string().required(),
|
|
description: Joi.string(),
|
|
parameters: Joi.array()
|
|
.items(
|
|
Joi.object({
|
|
name: Joi.string().required(),
|
|
description: Joi.string(),
|
|
in: Joi.string().valid('query', 'path').required(),
|
|
required: Joi.boolean().required(),
|
|
schema: Joi.object({
|
|
type: Joi.string().required(),
|
|
enum: Joi.array(),
|
|
}).required(),
|
|
allowEmptyValue: Joi.boolean(),
|
|
example: Joi.string().allow(null),
|
|
}),
|
|
)
|
|
.min(1)
|
|
.required(),
|
|
}).required(),
|
|
}).required(),
|
|
),
|
|
}).required()
|
|
|
|
function assertValidServiceDefinition(service, message = undefined) {
|
|
Joi.assert(service, serviceDefinition, message)
|
|
}
|
|
|
|
const serviceDefinitionExport = Joi.object({
|
|
schemaVersion: Joi.equal('0').required(),
|
|
categories: Joi.array()
|
|
.items(
|
|
Joi.object({
|
|
id: Joi.string().required(),
|
|
name: Joi.string().required(),
|
|
keywords: arrayOfStrings,
|
|
}),
|
|
)
|
|
.required(),
|
|
services: Joi.array().items(serviceDefinition).required(),
|
|
}).required()
|
|
|
|
function assertValidServiceDefinitionExport(examples, message = undefined) {
|
|
Joi.assert(examples, serviceDefinitionExport, message)
|
|
}
|
|
|
|
export { assertValidServiceDefinition, assertValidServiceDefinitionExport }
|