You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.9 KiB
98 lines
2.9 KiB
'use strict'
|
|
|
|
const Ajv = require('ajv')
|
|
const fs = require('fs')
|
|
const path = require('path')
|
|
const pack = require('ajv-pack')
|
|
|
|
const ajv = new Ajv({
|
|
sourceCode: true, // this option is required by ajv-pack
|
|
removeAdditional: true,
|
|
useDefaults: true,
|
|
coerceTypes: true
|
|
})
|
|
|
|
const defaultInitOptions = {
|
|
bodyLimit: 1024 * 1024, // 1 MiB
|
|
caseSensitive: true,
|
|
disableRequestLogging: false,
|
|
ignoreTrailingSlash: false,
|
|
maxParamLength: 100,
|
|
onProtoPoisoning: 'error',
|
|
// TODO v3: default should be 'error'
|
|
onConstructorPoisoning: 'ignore',
|
|
pluginTimeout: 10000,
|
|
requestIdHeader: 'request-id',
|
|
requestIdLogLabel: 'reqId',
|
|
http2SessionTimeout: 5000
|
|
}
|
|
|
|
function customRule0 (schemaParamValue, validatedParamValue, validationSchemaObject, currentDataPath, validatedParamObject, validatedParam) {
|
|
validatedParamObject[validatedParam] = schemaParamValue
|
|
return true
|
|
}
|
|
|
|
// We add a keyword that allow us to set default values
|
|
ajv.addKeyword('setDefaultValue', {
|
|
modifying: true,
|
|
validate: customRule0,
|
|
errors: false
|
|
})
|
|
|
|
const schema = {
|
|
type: 'object',
|
|
additionalProperties: false,
|
|
properties: {
|
|
bodyLimit: { type: 'integer', default: defaultInitOptions.bodyLimit },
|
|
caseSensitive: { type: 'boolean', default: defaultInitOptions.caseSensitive },
|
|
http2: { type: 'boolean' },
|
|
https: {
|
|
if: {
|
|
not: {
|
|
oneOf: [
|
|
{ type: 'boolean' },
|
|
{ type: 'null' },
|
|
{
|
|
type: 'object',
|
|
additionalProperties: false,
|
|
required: ['allowHTTP1'],
|
|
properties: {
|
|
allowHTTP1: { type: 'boolean' }
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
then: { setDefaultValue: true }
|
|
},
|
|
ignoreTrailingSlash: { type: 'boolean', default: defaultInitOptions.ignoreTrailingSlash },
|
|
disableRequestLogging: {
|
|
type: 'boolean',
|
|
default: false
|
|
},
|
|
maxParamLength: { type: 'integer', default: defaultInitOptions.maxParamLength },
|
|
onProtoPoisoning: { type: 'string', default: defaultInitOptions.onProtoPoisoning },
|
|
onConstructorPoisoning: { type: 'string', default: defaultInitOptions.onConstructorPoisoning },
|
|
pluginTimeout: { type: 'integer', default: defaultInitOptions.pluginTimeout },
|
|
requestIdHeader: { type: 'string', default: defaultInitOptions.requestIdHeader },
|
|
requestIdLogLabel: { type: 'string', default: defaultInitOptions.requestIdLogLabel },
|
|
http2SessionTimeout: { type: 'integer', default: defaultInitOptions.http2SessionTimeout }
|
|
}
|
|
}
|
|
|
|
const validate = ajv.compile(schema)
|
|
|
|
const moduleCode = `// This file is autogenerated by ${__filename.replace(__dirname, 'build')}, do not edit
|
|
/* istanbul ignore file */
|
|
// constant needed for customRule0 to work
|
|
const self = {}
|
|
|
|
${pack(ajv, validate)}
|
|
|
|
${customRule0.toString()}
|
|
|
|
module.exports.defaultInitOptions = ${JSON.stringify(defaultInitOptions)}
|
|
`
|
|
|
|
fs.writeFileSync(path.join(__dirname, '..', 'lib', 'configValidator.js'), moduleCode)
|