Skip to content

Commit ef305ed

Browse files
committed
implement M4: property name based faker inference
1 parent 2a8cd87 commit ef305ed

13 files changed

Lines changed: 553 additions & 38 deletions

File tree

packages/openapi-ts-tests/faker/v1/__snapshots__/3.1.x/faker-basic-typed/@faker-js/faker.gen.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const ensureFaker = (options?: Options): Faker => options?.faker ?? faker;
2626

2727
export const fakeFoo = (options?: Options): Foo => ({
2828
name: ensureFaker(options).string.sample(),
29-
age: ensureFaker(options).number.int(),
29+
age: ensureFaker(options).number.int({ min: 1, max: 120 }),
3030
...!resolveCondition(options?.includeOptional ?? true, ensureFaker(options)) ? {} : { active: ensureFaker(options).datatype.boolean() }
3131
});
3232

packages/openapi-ts-tests/faker/v1/__snapshots__/3.1.x/faker-basic/@faker-js/faker.gen.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const ensureFaker = (options?: Options): Faker => options?.faker ?? faker;
2424

2525
export const fakeFoo = (options?: Options) => ({
2626
name: ensureFaker(options).string.sample(),
27-
age: ensureFaker(options).number.int(),
27+
age: ensureFaker(options).number.int({ min: 1, max: 120 }),
2828
...!resolveCondition(options?.includeOptional ?? true, ensureFaker(options)) ? {} : { active: ensureFaker(options).datatype.boolean() }
2929
});
3030

packages/openapi-ts-tests/faker/v1/__snapshots__/3.1.x/faker-m2/@faker-js/faker.gen.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,12 @@ export const fakeObjectWithDefaultProp = (options?: Options): ObjectWithDefaultP
9090
export const fakeUserProfile = (options?: Options): UserProfile => ({
9191
id: ensureFaker(options).number.int(),
9292
name: ensureFaker(options).string.sample(),
93-
...!resolveCondition(options?.includeOptional ?? true, ensureFaker(options)) ? {} : { bio: ensureFaker(options).string.sample() },
94-
...!resolveCondition(options?.includeOptional ?? true, ensureFaker(options)) ? {} : { age: ensureFaker(options).number.int() }
93+
...!resolveCondition(options?.includeOptional ?? true, ensureFaker(options)) ? {} : { bio: ensureFaker(options).lorem.sentence() },
94+
...!resolveCondition(options?.includeOptional ?? true, ensureFaker(options)) ? {} : { age: ensureFaker(options).number.int({ min: 1, max: 120 }) }
9595
});
9696

9797
export const fakeAddress = (options?: Options): Address => ({
98-
street: ensureFaker(options).string.alpha({ length: { min: 1, max: 200 } }),
98+
street: ensureFaker(options).location.streetAddress(),
9999
zip: fakeZipCode(options)
100100
});
101101

packages/openapi-ts-tests/faker/v1/__snapshots__/3.1.x/faker-m3/@faker-js/faker.gen.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const ensureFaker = (options?: Options): Faker => options?.faker ?? faker;
2424

2525
export const fakePet = (options?: Options): Pet => ({
2626
name: ensureFaker(options).string.sample(),
27-
age: ensureFaker(options).number.int()
27+
age: ensureFaker(options).number.int({ min: 1, max: 120 })
2828
});
2929

3030
export const fakeTag = (options?: Options): Tag => ({
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// This file is auto-generated by @hey-api/openapi-ts
2+
3+
import { faker, type Faker } from '@faker-js/faker';
4+
5+
import type { Company, Config, Document, PersonProfile, PersonWithConstraints, User } from '../types.gen';
6+
7+
export type Options = {
8+
faker?: Faker;
9+
/**
10+
* Whether to include optional properties.
11+
* Provide a number between 0 and 1 to randomly include based on that probability.
12+
* @default true
13+
*/
14+
includeOptional?: boolean | number;
15+
/**
16+
* Whether to use schema default values instead of generating fake data.
17+
* Provide a number between 0 and 1 to randomly use defaults based on that probability.
18+
* @default false
19+
*/
20+
useDefault?: boolean | number;
21+
};
22+
23+
const resolveCondition = (condition: boolean | number, faker: Faker): boolean => condition === true || typeof condition === 'number' && faker.datatype.boolean({ probability: condition });
24+
25+
const ensureFaker = (options?: Options): Faker => options?.faker ?? faker;
26+
27+
export const fakePersonProfile = (options?: Options): PersonProfile => ({
28+
firstName: ensureFaker(options).person.firstName(),
29+
last_name: ensureFaker(options).person.lastName(),
30+
email: ensureFaker(options).internet.email(),
31+
phone: ensureFaker(options).phone.number(),
32+
age: ensureFaker(options).number.int({ min: 1, max: 120 }),
33+
city: ensureFaker(options).location.city(),
34+
postalCode: ensureFaker(options).location.zipCode(),
35+
bio: ensureFaker(options).lorem.sentence(),
36+
website: ensureFaker(options).internet.url(),
37+
zipCode: ensureFaker(options).helpers.fromRegExp('^\\d{5}$'),
38+
username: ensureFaker(options).internet.username(),
39+
someRandomField: ensureFaker(options).string.sample()
40+
});
41+
42+
export const fakePersonWithConstraints = (options?: Options): PersonWithConstraints => ({
43+
age: ensureFaker(options).number.int({ min: 18, max: 120 }),
44+
...!resolveCondition(options?.includeOptional ?? true, ensureFaker(options)) ? {} : { seniorAge: ensureFaker(options).number.int({ min: 65, max: 100 }) }
45+
});
46+
47+
export const fakeUser = (options?: Options): User => ({
48+
name: ensureFaker(options).person.fullName(),
49+
email: ensureFaker(options).internet.email()
50+
});
51+
52+
export const fakeCompany = (options?: Options): Company => ({
53+
name: ensureFaker(options).company.name()
54+
});
55+
56+
export const fakeConfig = (options?: Options): Config => ({
57+
name: ensureFaker(options).string.sample()
58+
});
59+
60+
export const fakeDocument = (options?: Options): Document => ({
61+
id: ensureFaker(options).string.uuid(),
62+
_id: ensureFaker(options).string.uuid(),
63+
numericId: ensureFaker(options).number.int()
64+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// This file is auto-generated by @hey-api/openapi-ts
2+
3+
export type { ClientOptions, Company, Config, Document, PersonProfile, PersonWithConstraints, User } from './types.gen';
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// This file is auto-generated by @hey-api/openapi-ts
2+
3+
export type ClientOptions = {
4+
baseUrl: `${string}://${string}` | (string & {});
5+
};
6+
7+
export type PersonProfile = {
8+
firstName: string;
9+
last_name: string;
10+
email: string;
11+
phone: string;
12+
age: number;
13+
city: string;
14+
postalCode: string;
15+
bio: string;
16+
website: string;
17+
zipCode: string;
18+
username: string;
19+
someRandomField: string;
20+
};
21+
22+
export type PersonWithConstraints = {
23+
age: number;
24+
seniorAge?: number;
25+
};
26+
27+
export type User = {
28+
name: string;
29+
email: string;
30+
};
31+
32+
export type Company = {
33+
name: string;
34+
};
35+
36+
export type Config = {
37+
name: string;
38+
};
39+
40+
export type Document = {
41+
id: string;
42+
_id: string;
43+
numericId: number;
44+
};

packages/openapi-ts-tests/faker/v1/test/3.1.x.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ describe(`OpenAPI ${version}`, () => {
5555
}),
5656
description: 'handles union randomization, allOf intersections, and discriminated unions',
5757
},
58+
{
59+
config: createConfig({
60+
input: 'faker-m4.yaml',
61+
output: 'faker-m4',
62+
plugins: ['@hey-api/typescript', '@faker-js/faker'],
63+
}),
64+
description:
65+
'infers faker helpers from property names with ancestor context and constraint merging',
66+
},
5867
];
5968

6069
it.each(scenarios)('$description', async ({ config }) => {

0 commit comments

Comments
 (0)