From 1f744570925aaf4b52bcb77a4c9fe2ca82a57923 Mon Sep 17 00:00:00 2001 From: Aleksandr Yackovlev Date: Fri, 28 Aug 2020 16:10:29 +0300 Subject: [PATCH] feat(generator): add middleware option for configuring json-schema-faker --- src/index.ts | 6 ++++-- src/operations/operations.ts | 10 +++++++--- src/utils/generator.ts | 15 +++++++++++---- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/index.ts b/src/index.ts index 2e43f85..49328ac 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,13 +12,14 @@ import { validateQuery, validateBody, } from './middleware'; -import { JSFOptions } from './utils'; +import { JSFOptions, JSFCallback } from './utils'; export interface MiddlewareOptions { file: string; locale?: string; options?: Partial; cors?: CorsOptions; + jsfCallback?: JSFCallback; } export const createMockMiddleware = ({ @@ -32,13 +33,14 @@ export const createMockMiddleware = ({ methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization', 'Origin', 'Accept'], }, + jsfCallback, }: MiddlewareOptions): express.Router => { if (!fs.existsSync(file)) { throw new Error('File with the openapi docs does not exist'); } const router = createRouter(cors); - const operations = createOperations({ file, locale, options }); + const operations = createOperations({ file, locale, options, callback: jsfCallback }); router.use('/{0,}', async (req, res, next) => { res.locals.operation = await operations.match(req); diff --git a/src/operations/operations.ts b/src/operations/operations.ts index d81e6e0..0d0cf8f 100644 --- a/src/operations/operations.ts +++ b/src/operations/operations.ts @@ -7,7 +7,7 @@ import { Request } from 'express'; import SwaggerParser from '@apidevtools/swagger-parser'; import { get, toPairs } from 'lodash'; -import { createGenerator, JSFOptions, JSF } from '../utils'; +import { createGenerator, JSFOptions, JSF, JSFCallback } from '../utils'; import { Operation, createOperation } from './operation'; @@ -24,15 +24,17 @@ export class Operations { file, locale, options, + callback, }: { file: string; locale: string; options: Partial; + callback?: JSFCallback; }) { this.file = file; this.locale = locale; this.watch(); - this.generator = createGenerator(locale, options); + this.generator = createGenerator(locale, options, callback); } reset(): void { @@ -97,8 +99,10 @@ export const createOperations = ({ file, locale, options, + callback, }: { file: string; locale: string; options: Partial; -}): Operations => new Operations({ file, locale, options }); + callback?: JSFCallback; +}): Operations => new Operations({ file, locale, options, callback }); diff --git a/src/utils/generator.ts b/src/utils/generator.ts index 493894f..865a796 100644 --- a/src/utils/generator.ts +++ b/src/utils/generator.ts @@ -3,6 +3,8 @@ import faker from 'faker'; export { JSONSchema, JSFOptions, JSF } from 'json-schema-faker'; +export type JSFCallback = (jsf: JSF, fakerObject: typeof faker) => void; + const defaultOptions = { optionalsProbability: 0.5, }; @@ -18,10 +20,12 @@ export const handleExamples = (value: any): any => { }; /* eslint-enable @typescript-eslint/no-explicit-any */ -export const createGenerator: (locale?: string, options?: Partial) => JSF = ( - locale = 'en', - options = defaultOptions -) => { +/* eslint-disable @typescript-eslint/no-empty-function */ +export const createGenerator: ( + locale?: string, + options?: Partial, + callback?: JSFCallback +) => JSF = (locale = 'en', options = defaultOptions, callback = (() => {})) => { jsf.option({ ...defaultOptions, ...options, @@ -38,5 +42,8 @@ export const createGenerator: (locale?: string, options?: Partial) = jsf.define('examples', handleExamples); + callback(jsf, faker); + return jsf; }; +/* eslint-enable @typescript-eslint/no-empty-function */