import { Arbitrary, shuffledSubarray } from 'fast-check'; import { SafeParseSuccess, ZodSchema } from 'zod'; import { ZodFastCheck } from 'zod-fast-check'; import { ConfigSchema, DEFAULT_ORDER } from '../contexts/index.js'; import { PackageJSONSchema } from '../models/index.js'; const filterUndefinedKeys = >(x: T): T => Object.keys(x ?? {}) .filter(key => x[key] !== undefined && key !== '__proto__') .reduce( (acc, key) => ({ ...acc, [key]: typeof x[key] === 'object' && !Array.isArray(x[key]) && x[key] != null ? filterUndefinedKeys(x[key] as Record) : x[key], }), {} as T ); export function createArbitraryFromZodObject>(schema: ZodSchema): Arbitrary { return ZodFastCheck() .inputOf(schema) .filter(x => schema.safeParse(x).success) .map(x => (schema.safeParse(x) as SafeParseSuccess).data) .map(filterUndefinedKeys); } export const PackageJSONArbitrary = createArbitraryFromZodObject(PackageJSONSchema); export const OrderArbitrary = shuffledSubarray(DEFAULT_ORDER, { minLength: 1 }); export const ConfigArbitrary = createArbitraryFromZodObject(ConfigSchema);