ts-forged
Version:
Type-safe fake data generation from DTOs for TypeScript and NestJS
1 lines • 36.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/generators/base-generator.ts","../src/generators/string-generator.ts","../src/generators/number-generator.ts","../src/generators/date-generator.ts","../src/utils/reflection.ts","../src/core/field-generator.ts","../src/core/factory.ts"],"names":["faker","getMetadataStorage"],"mappings":"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","file":"index.mjs","sourcesContent":["import { FieldGeneratorContext } from '../utils/type-helpers';\r\n\r\n/**\r\n * Base class for all generators\r\n */\r\nexport abstract class BaseGenerator<T> {\r\n /**\r\n * Generates a value based on the field context\r\n */\r\n public abstract generate(context: FieldGeneratorContext): T;\r\n\r\n /**\r\n * Gets the generator options from the context\r\n */\r\n protected getOptions(context: unknown): Record<string, unknown> {\r\n if (typeof context === 'object' && context !== null && 'options' in context) {\r\n return (\r\n (context as { options: { overrides?: Record<string, unknown> } }).options.overrides || {}\r\n );\r\n }\r\n return {};\r\n }\r\n\r\n /**\r\n * Gets a specific option value\r\n */\r\n protected getOption<K extends keyof FieldGeneratorContext['options']>(\r\n context: FieldGeneratorContext,\r\n key: K,\r\n ): FieldGeneratorContext['options'][K] | undefined {\r\n return context.options[key];\r\n }\r\n}\r\n","import { faker } from '@faker-js/faker';\r\nimport { BaseGenerator } from './base-generator';\r\nimport { FieldGeneratorContext } from '../utils/type-helpers';\r\n\r\n/**\r\n * Generator for string values\r\n */\r\nexport class StringGenerator extends BaseGenerator<string> {\r\n /**\r\n * Generates a string value based on the field context\r\n */\r\n public generate(context: FieldGeneratorContext): string {\r\n const { fieldName, metadata } = context;\r\n\r\n // Check for class-validator decorators\r\n const isEmail = metadata.decorators.some((d) => d.name === 'IsEmail');\r\n if (isEmail) {\r\n return faker.internet.email();\r\n }\r\n\r\n // Check for specific field name patterns\r\n if (fieldName.toLowerCase().includes('password')) {\r\n return faker.internet.password();\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('username')) {\r\n return faker.internet.userName();\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('domain')) {\r\n return faker.internet.domainName();\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('ip')) {\r\n return faker.internet.ip();\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('color')) {\r\n return faker.internet.color();\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('uuid')) {\r\n return faker.string.uuid();\r\n }\r\n\r\n // Default to a random word\r\n return faker.word.sample();\r\n }\r\n}\r\n","import { faker } from '@faker-js/faker';\r\nimport { BaseGenerator } from './base-generator';\r\nimport { FieldGeneratorContext } from '../utils/type-helpers';\r\nimport { getMetadataStorage } from 'class-validator';\r\n\r\n/**\r\n * Generator for number values\r\n */\r\nexport class NumberGenerator extends BaseGenerator<number> {\r\n /**\r\n * Generates a number value based on the field context\r\n */\r\n public generate(context: FieldGeneratorContext): number {\r\n const { fieldName } = context;\r\n\r\n // Get validation metadata directly from class-validator\r\n const validationMetadatas = getMetadataStorage().getTargetValidationMetadatas(\r\n context.target || Object,\r\n fieldName,\r\n false,\r\n false,\r\n );\r\n\r\n // Find all customValidation constraint numbers for this field only\r\n const constraintNumbers = validationMetadatas\r\n .filter(\r\n (vm) =>\r\n vm.type === 'customValidation' &&\r\n vm.propertyName === fieldName &&\r\n typeof vm.constraints?.[0] === 'number',\r\n )\r\n .map((vm) => vm.constraints[0]);\r\n\r\n let min: number | undefined = undefined;\r\n let max: number | undefined = undefined;\r\n if (constraintNumbers.length > 0) {\r\n min = Math.min(...constraintNumbers);\r\n max = Math.max(...constraintNumbers);\r\n }\r\n\r\n if (min !== undefined && max !== undefined) {\r\n return faker.number.int({ min, max });\r\n }\r\n\r\n // Check for specific field name patterns\r\n if (fieldName.toLowerCase().includes('age')) {\r\n return faker.number.int({ min: 18, max: 80 });\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('price')) {\r\n return faker.number.float({ min: 0, max: 1000, precision: 0.01 });\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('percent')) {\r\n return faker.number.float({ min: 0, max: 100, precision: 0.01 });\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('rating')) {\r\n return faker.number.float({ min: 1, max: 5, precision: 0.1 });\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('count')) {\r\n return faker.number.int({ min: 0, max: 100 });\r\n }\r\n\r\n // Default to a random integer\r\n return faker.number.int();\r\n }\r\n}\r\n","import { faker } from '@faker-js/faker';\r\nimport { BaseGenerator } from './base-generator';\r\nimport { FieldGeneratorContext } from '../utils/type-helpers';\r\n\r\n/**\r\n * Generator for date values\r\n */\r\nexport class DateGenerator extends BaseGenerator<Date> {\r\n /**\r\n * Generates a date value based on the field context\r\n */\r\n public generate(context: FieldGeneratorContext): Date {\r\n const { fieldName, metadata } = context;\r\n\r\n // Check for class-validator decorators\r\n const isDate = metadata.decorators.some((d) => d.name === 'IsDate');\r\n if (isDate) {\r\n return faker.date.anytime();\r\n }\r\n\r\n // Check for specific field name patterns\r\n if (fieldName.toLowerCase().includes('birth')) {\r\n return faker.date.birthdate();\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('future')) {\r\n return faker.date.future();\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('past')) {\r\n return faker.date.past();\r\n }\r\n\r\n if (fieldName.toLowerCase().includes('recent')) {\r\n return faker.date.recent();\r\n }\r\n\r\n // Default to a random date\r\n return faker.date.anytime();\r\n }\r\n}\r\n","import 'reflect-metadata';\nimport { Type, FieldMetadata } from './type-helpers';\nimport { getMetadataStorage } from 'class-validator';\n\nconst SWAGGER_PROPS_KEY = 'swagger/apiModelPropertiesArray';\nconst FAKE_PROPS_KEY = 'ts-forged:props';\n\n/**\n * Decorator to mark a property for fake data generation\n */\nexport function FakeProperty(typeFn?: () => unknown): PropertyDecorator {\n return (target: object, propertyKey: string | symbol) => {\n const props = Reflect.getMetadata(FAKE_PROPS_KEY, target) || [];\n props.push(propertyKey.toString());\n Reflect.defineMetadata(FAKE_PROPS_KEY, props, target);\n if (typeFn) {\n Reflect.defineMetadata('ts-forged:elementType', typeFn(), target, propertyKey);\n }\n };\n}\n\n/**\n * Gets field metadata for a type\n */\nexport function getFieldMetadata<T extends object>(type: Type<T>): FieldMetadata[] {\n const metadata: FieldMetadata[] = [];\n const prototype = type.prototype;\n\n // Collect all property names from all sources\n let swaggerProps: string[] = Reflect.getMetadata(SWAGGER_PROPS_KEY, prototype) || [];\n // Strip colon prefix if present\n swaggerProps = swaggerProps.map((p) => (p.startsWith(':') ? p.slice(1) : p));\n const fakeProps: string[] = Reflect.getMetadata(FAKE_PROPS_KEY, prototype) || [];\n // Use Set to avoid duplicates\n const properties = [...new Set([...swaggerProps, ...fakeProps])];\n\n for (const property of properties) {\n const designType = Reflect.getMetadata('design:type', prototype, property);\n let typeName = 'unknown';\n let isArray = false;\n let elementType: unknown = undefined;\n\n // Get class-validator decorators using metadata storage\n const validationMetadatas = getMetadataStorage().getTargetValidationMetadatas(\n type,\n property,\n false,\n false,\n );\n // Filter metadata for this specific property\n const propertyValidationMetadatas = validationMetadatas.filter(\n (vm) => vm.propertyName === property,\n );\n const decorators = propertyValidationMetadatas.map((vm) => ({\n name: vm.type,\n args: vm.constraints || [],\n }));\n const isOptional = propertyValidationMetadatas.some(\n (vm) => vm.type === 'conditionalValidation' && vm.name === 'isOptional',\n );\n\n // Check for per-property swagger metadata\n const swaggerMeta = Reflect.getMetadata('swagger/apiModelProperties', prototype, property);\n if (swaggerMeta) {\n if (swaggerMeta.enum) {\n typeName = 'String';\n // Pass enum values for use in generation\n elementType = swaggerMeta.enum;\n }\n // Handle arrays robustly\n if (\n swaggerMeta.isArray === true ||\n (Array.isArray(swaggerMeta.type) && swaggerMeta.type.length > 0) ||\n (typeof swaggerMeta.type === 'function' && swaggerMeta.type === Array)\n ) {\n isArray = true;\n typeName = 'Array';\n // Try to get element type from type array or design:type\n if (Array.isArray(swaggerMeta.type) && swaggerMeta.type.length > 0) {\n elementType = swaggerMeta.type[0];\n } else if (typeof swaggerMeta.type === 'function' && swaggerMeta.type === Array) {\n // Try to get element type from design:type or fallback\n const explicitElementType = Reflect.getMetadata(\n 'ts-forged:elementType',\n prototype,\n property,\n );\n if (explicitElementType) {\n elementType = explicitElementType;\n }\n }\n } else if (swaggerMeta.type) {\n if (typeof swaggerMeta.type === 'function') {\n typeName = swaggerMeta.type.name;\n } else if (typeof swaggerMeta.type === 'string') {\n typeName = swaggerMeta.type;\n }\n if (['String', 'Number', 'Boolean', 'Date'].includes(typeName)) {\n typeName = typeName.toLowerCase();\n }\n }\n } else if (designType && typeof designType === 'function' && 'name' in designType) {\n typeName = (designType as { name: string }).name;\n if (typeName === 'Array') {\n isArray = true;\n typeName = 'Array';\n // Prefer explicit element type from ts-forged:elementType metadata\n const explicitElementType = Reflect.getMetadata(\n 'ts-forged:elementType',\n prototype,\n property,\n );\n if (explicitElementType) {\n elementType = explicitElementType;\n } else {\n // fallback: For arrays, try to get the element type from design:type (not reliable)\n const arrayType = Reflect.getMetadata('design:type', prototype, property);\n if (arrayType && arrayType !== Array) {\n elementType = arrayType;\n }\n }\n } else {\n // For nested objects, prefer explicit type from ts-forged:elementType\n const explicitNestedType = Reflect.getMetadata(\n 'ts-forged:elementType',\n prototype,\n property,\n );\n if (explicitNestedType) {\n elementType = explicitNestedType;\n }\n }\n if (['String', 'Number', 'Boolean', 'Date'].includes(typeName)) {\n typeName = typeName.toLowerCase();\n }\n }\n\n metadata.push({\n name: property,\n type: typeName,\n isOptional,\n isArray,\n elementType,\n decorators,\n });\n }\n\n return metadata;\n}\n\n/**\n * Gets the element type for arrays and nested objects\n */\nexport function getElementType<T extends object>(type: Type<T>, property: string): unknown {\n const prototype = type.prototype;\n\n // Prefer explicit element type from ts-forged:elementType metadata\n const explicitElementType = Reflect.getMetadata('ts-forged:elementType', prototype, property);\n if (explicitElementType) {\n return explicitElementType;\n }\n\n // Try to get from Swagger metadata\n const swaggerMetadata = Reflect.getMetadata('swagger/apiProperties', prototype, property);\n if (swaggerMetadata?.items?.type) {\n return swaggerMetadata.items.type;\n }\n\n // For nested objects, prefer explicit type from ts-forged:elementType\n const explicitNestedType = Reflect.getMetadata('ts-forged:elementType', prototype, property);\n if (explicitNestedType) {\n return explicitNestedType;\n }\n\n return undefined;\n}\n","import { faker } from '@faker-js/faker';\nimport { Type, FieldGeneratorContext, FieldGeneratorOptions } from '../utils/type-helpers';\nimport { StringGenerator } from '../generators/string-generator';\nimport { NumberGenerator } from '../generators/number-generator';\nimport { DateGenerator } from '../generators/date-generator';\nimport { getFieldMetadata } from '../utils/reflection';\nimport 'reflect-metadata';\n\nfunction isClassType(value: unknown): value is Type<object> {\n return typeof value === 'function' && value.prototype && value.prototype.constructor === value;\n}\n\n/**\n * Class responsible for generating fake data for fields\n */\nexport class FieldGenerator {\n private readonly stringGenerator: StringGenerator;\n private readonly numberGenerator: NumberGenerator;\n private readonly dateGenerator: DateGenerator;\n\n constructor() {\n this.stringGenerator = new StringGenerator();\n this.numberGenerator = new NumberGenerator();\n this.dateGenerator = new DateGenerator();\n }\n\n /**\n * Generates fake data for all fields in a type\n */\n public generateFields<T extends object>(\n type: Type<T>,\n options: FieldGeneratorOptions = {},\n ): Record<string, unknown> {\n const fields: Record<string, unknown> = {};\n const metadata = getFieldMetadata(type);\n\n for (const field of metadata) {\n const context: FieldGeneratorContext = {\n fieldName: field.name,\n fieldType: field.type,\n metadata: field,\n options,\n target: type,\n };\n\n fields[field.name] = this.generateFieldValue(context);\n }\n\n return fields;\n }\n\n /**\n * Generates a single field value based on its context\n */\n private generateFieldValue(context: FieldGeneratorContext): unknown {\n const { fieldType, metadata } = context;\n\n // Handle optional fields - sometimes return undefined\n if (metadata.isOptional) {\n // 30% chance to return undefined for optional fields\n if (faker.number.int({ min: 1, max: 10 }) <= 3) {\n return undefined;\n }\n }\n\n // Handle arrays\n if (metadata.isArray) {\n return this.generateArrayValue(context);\n }\n\n // Handle enums (elementType is an array of values)\n if (Array.isArray(metadata.elementType) && metadata.elementType.length > 0) {\n // If all values are strings or numbers, treat as enum/union\n if (metadata.elementType.every((v) => typeof v === 'string' || typeof v === 'number')) {\n return faker.helpers.arrayElement(metadata.elementType);\n }\n }\n\n // Use elementType for nested objects if present\n if (isClassType(metadata.elementType)) {\n return this.generateFields(metadata.elementType, context.options);\n }\n\n // Handle smart field name detection\n const smartValue = this.generateSmartValue(context);\n if (smartValue !== undefined) {\n return smartValue;\n }\n\n // Handle basic types\n switch (fieldType.toLowerCase()) {\n case 'string':\n return this.stringGenerator.generate(context);\n case 'number':\n return this.numberGenerator.generate(context);\n case 'boolean':\n return faker.datatype.boolean();\n case 'date':\n return this.dateGenerator.generate(context);\n default:\n return this.generateObjectValue(context);\n }\n }\n\n /**\n * Generates an array of values\n */\n private generateArrayValue(context: FieldGeneratorContext): unknown[] {\n const { metadata } = context;\n const length = faker.number.int({ min: 1, max: 5 });\n const newContext = { ...context, depth: (context.depth || 0) + 1 };\n if (newContext.depth > 3) {\n return [];\n }\n\n // Use the elementType from metadata if available\n if (isClassType(metadata.elementType)) {\n const elementType = metadata.elementType;\n return Array.from({ length }, () => this.generateFields(elementType, context.options));\n }\n\n // For primitive types, generate individual values\n const elementContext = {\n ...newContext,\n fieldType: metadata.type.replace('[]', ''),\n };\n return Array.from({ length }, () => this.generateFieldValue(elementContext));\n }\n\n /**\n * Generates a value based on smart field name detection\n */\n private generateSmartValue(context: FieldGeneratorContext): unknown {\n const { fieldName } = context;\n\n // Name fields\n if (fieldName.toLowerCase().includes('name')) {\n if (fieldName.toLowerCase().includes('first')) {\n return faker.person.firstName();\n }\n if (fieldName.toLowerCase().includes('last')) {\n return faker.person.lastName();\n }\n return faker.person.fullName();\n }\n\n // Email fields\n if (fieldName.toLowerCase().includes('email')) {\n return faker.internet.email();\n }\n\n // Phone fields\n if (fieldName.toLowerCase().includes('phone')) {\n return faker.phone.number();\n }\n\n // Address fields\n if (fieldName.toLowerCase().includes('address')) {\n return faker.location.streetAddress();\n }\n\n // City fields\n if (fieldName.toLowerCase().includes('city')) {\n return faker.location.city();\n }\n\n // Country fields\n if (fieldName.toLowerCase().includes('country')) {\n return faker.location.country();\n }\n\n // URL fields\n if (fieldName.toLowerCase().includes('url')) {\n return faker.internet.url();\n }\n\n return undefined;\n }\n\n /**\n * Generates an object value\n */\n private generateObjectValue(context: FieldGeneratorContext): unknown {\n const { fieldName, fieldType, metadata } = context;\n // Use elementType from metadata if present\n if (isClassType(metadata.elementType)) {\n return this.generateFields(metadata.elementType, context.options);\n }\n // Use design:type metadata to get the constructor\n const prototype = (context.options as Record<string, unknown>)?.prototype || undefined;\n let nestedType: unknown = undefined;\n if (prototype) {\n nestedType = Reflect.getMetadata('design:type', prototype, fieldName);\n }\n if (nestedType && typeof nestedType === 'function' && nestedType !== Object) {\n return this.generateFields(nestedType as Type<object>, context.options);\n }\n // fallback to old logic\n const fallbackType = this.getNestedType(fieldType);\n if (fallbackType && typeof fallbackType === 'function') {\n return this.generateFields(fallbackType as Type<object>, context.options);\n }\n return {};\n }\n\n /**\n * Gets the nested type for a field\n */\n private getNestedType(fieldType: string): Type<object> | undefined {\n // Remove array brackets if present\n const baseType = fieldType.replace('[]', '');\n\n // Try to find the type in the global scope\n const globalType = (global as Record<string, unknown>)[baseType];\n if (globalType && typeof globalType === 'function') {\n return globalType as Type<object>;\n }\n\n // Try to find the type in the current module\n const moduleExports = (module as { exports: Record<string, unknown> }).exports;\n const moduleType = moduleExports[baseType];\n if (moduleType && typeof moduleType === 'function') {\n return moduleType as Type<object>;\n }\n\n return undefined;\n }\n}\n","import { FieldGenerator } from './field-generator';\r\nimport { Type } from '../utils/type-helpers';\r\n\r\n/**\r\n * Factory class for generating fake data from DTOs\r\n */\r\nexport class Factory<T extends object> {\r\n private readonly fieldGenerator: FieldGenerator;\r\n private readonly type: Type<T>;\r\n\r\n private constructor(type: Type<T>) {\r\n this.type = type;\r\n this.fieldGenerator = new FieldGenerator();\r\n }\r\n\r\n /**\r\n * Creates a new factory instance for the given type\r\n */\r\n public static create<T extends object>(type: Type<T>): Factory<T> {\r\n return new Factory(type);\r\n }\r\n\r\n /**\r\n * Builds a single instance with optional overrides\r\n */\r\n public build(overrides: Partial<T> = {}): T {\r\n const instance = new this.type();\r\n const fields = this.fieldGenerator.generateFields(this.type);\r\n\r\n for (const [key, value] of Object.entries(fields)) {\r\n if (key in overrides) {\r\n (instance as Record<string, unknown>)[key] = overrides[key as keyof T];\r\n } else {\r\n (instance as Record<string, unknown>)[key] = value;\r\n }\r\n }\r\n\r\n return instance;\r\n }\r\n\r\n /**\r\n * Builds multiple instances\r\n */\r\n public buildMany(count: number, overrides: Partial<T> = {}): T[] {\r\n return Array.from({ length: count }, () => this.build(overrides));\r\n }\r\n\r\n /**\r\n * Creates a sequence of instances with unique values\r\n */\r\n public sequence(count: number, overrides: Partial<T> = {}): T[] {\r\n return Array.from({ length: count }, (_, index) => {\r\n const sequenceOverrides = {\r\n ...overrides,\r\n id: index + 1,\r\n };\r\n return this.build(sequenceOverrides);\r\n });\r\n }\r\n}\r\n"]}