CoolFace
Apppublic

strong-tie/inbound-calls

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
build-validation.js150 linesDownload Raw Back to build
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