strong-tie/inbound-calls
0
1'use strict'2 3const AjvStandaloneCompiler = require('@fastify/ajv-compiler/standalone')4const { _ } = require('ajv')5const fs = require('node:fs')6const path = require('node:path')7 8const factory = AjvStandaloneCompiler({9 readMode: false,10 storeFunction (routeOpts, schemaValidationCode) {11 const moduleCode = `// This file is autogenerated by build/build-validation.js, do not edit12/* c8 ignore start */13${schemaValidationCode}14 15module.exports.defaultInitOptions = ${JSON.stringify(defaultInitOptions)}16/* c8 ignore stop */17`18 19 const file = path.join(__dirname, '..', 'lib', 'configValidator.js')20 fs.writeFileSync(file, moduleCode)21 console.log(`Saved ${file} file successfully`)22 }23})24 25const defaultInitOptions = {26 connectionTimeout: 0, // 0 sec27 keepAliveTimeout: 72000, // 72 seconds28 forceCloseConnections: undefined, // keep-alive connections29 maxRequestsPerSocket: 0, // no limit30 requestTimeout: 0, // no limit31 bodyLimit: 1024 * 1024, // 1 MiB32 caseSensitive: true,33 allowUnsafeRegex: false,34 disableRequestLogging: false,35 ignoreTrailingSlash: false,36 ignoreDuplicateSlashes: false,37 maxParamLength: 100,38 onProtoPoisoning: 'error',39 onConstructorPoisoning: 'error',40 pluginTimeout: 10000,41 requestIdHeader: false,42 requestIdLogLabel: 'reqId',43 http2SessionTimeout: 72000, // 72 seconds44 exposeHeadRoutes: true,45 useSemicolonDelimiter: false46}47 48const schema = {49 type: 'object',50 additionalProperties: false,51 properties: {52 connectionTimeout: { type: 'integer', default: defaultInitOptions.connectionTimeout },53 keepAliveTimeout: { type: 'integer', default: defaultInitOptions.keepAliveTimeout },54 forceCloseConnections: {55 oneOf: [56 {57 type: 'string',58 pattern: 'idle'59 },60 {61 type: 'boolean'62 }63 ]64 },65 maxRequestsPerSocket: { type: 'integer', default: defaultInitOptions.maxRequestsPerSocket, nullable: true },66 requestTimeout: { type: 'integer', default: defaultInitOptions.requestTimeout },67 bodyLimit: { type: 'integer', default: defaultInitOptions.bodyLimit },68 caseSensitive: { type: 'boolean', default: defaultInitOptions.caseSensitive },69 allowUnsafeRegex: { type: 'boolean', default: defaultInitOptions.allowUnsafeRegex },70 http2: { type: 'boolean' },71 https: {72 if: {73 not: {74 oneOf: [75 { type: 'boolean' },76 { type: 'null' },77 {78 type: 'object',79 additionalProperties: false,80 required: ['allowHTTP1'],81 properties: {82 allowHTTP1: { type: 'boolean' }83 }84 }85 ]86 }87 },88 then: { setDefaultValue: true }89 },90 ignoreTrailingSlash: { type: 'boolean', default: defaultInitOptions.ignoreTrailingSlash },91 ignoreDuplicateSlashes: { type: 'boolean', default: defaultInitOptions.ignoreDuplicateSlashes },92 disableRequestLogging: {93 type: 'boolean',94 default: false95 },96 maxParamLength: { type: 'integer', default: defaultInitOptions.maxParamLength },97 onProtoPoisoning: { type: 'string', default: defaultInitOptions.onProtoPoisoning },98 onConstructorPoisoning: { type: 'string', default: defaultInitOptions.onConstructorPoisoning },99 pluginTimeout: { type: 'integer', default: defaultInitOptions.pluginTimeout },100 requestIdHeader: { anyOf: [{ type: 'boolean' }, { type: 'string' }], default: defaultInitOptions.requestIdHeader },101 requestIdLogLabel: { type: 'string', default: defaultInitOptions.requestIdLogLabel },102 http2SessionTimeout: { type: 'integer', default: defaultInitOptions.http2SessionTimeout },103 exposeHeadRoutes: { type: 'boolean', default: defaultInitOptions.exposeHeadRoutes },104 useSemicolonDelimiter: { type: 'boolean', default: defaultInitOptions.useSemicolonDelimiter },105 constraints: {106 type: 'object',107 additionalProperties: {108 type: 'object',109 required: ['name', 'storage', 'validate', 'deriveConstraint'],110 additionalProperties: true,111 properties: {112 name: { type: 'string' },113 storage: {},114 validate: {},115 deriveConstraint: {}116 }117 }118 }119 }120}121 122const compiler = factory({}, {123 customOptions: {124 code: {125 source: true,126 lines: true,127 optimize: 3128 },129 removeAdditional: true,130 useDefaults: true,131 coerceTypes: true,132 keywords: [133 {134 keyword: 'setDefaultValue',135 $data: true,136 // error: false,137 modifying: true,138 valid: true,139 code (keywordCxt) {140 const { gen, it, schemaValue } = keywordCxt141 const logicCode = gen.assign(_`${it.parentData}[${it.parentDataProperty}]`, schemaValue)142 return logicCode143 }144 }145 ]146 }147})148 149compiler({ schema })150 