Skip to content

Commit d993cea

Browse files
committed
implement M2
1 parent dba9178 commit d993cea

16 files changed

Lines changed: 718 additions & 92 deletions

File tree

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@ import { faker, type Faker } from '@faker-js/faker';
44

55
import type { Bar, Foo } from '../types.gen';
66

7-
export const fakeFoo = (options?: {
7+
export type Options = {
88
faker?: Faker;
9-
}): Foo => ({
10-
name: (options?.faker ?? faker).string.sample(),
11-
age: (options?.faker ?? faker).number.int(),
12-
active: (options?.faker ?? faker).datatype.boolean()
9+
includeOptional?: 'always' | 'random' | false;
10+
useDefault?: 'always' | 'random' | false;
11+
};
12+
13+
const resolveCondition = (condition: 'always' | 'random' | false, faker: Faker): boolean => condition === 'always' || condition === 'random' && faker.datatype.boolean();
14+
15+
const ensureFaker = (options?: Options): Faker => options?.faker ?? faker;
16+
17+
export const fakeFoo = (options?: Options): Foo => ({
18+
name: ensureFaker(options).string.sample(),
19+
age: ensureFaker(options).number.int(),
20+
...!resolveCondition(options?.includeOptional ?? 'always', ensureFaker(options)) ? {} : { active: ensureFaker(options).datatype.boolean() }
1321
});
1422

15-
export const fakeBar = (options?: {
16-
faker?: Faker;
17-
}): Bar => (options?.faker ?? faker).helpers.arrayElement(['baz', 'qux']);
23+
export const fakeBar = (options?: Options): Bar => ensureFaker(options).helpers.arrayElement(['baz', 'qux']);

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,20 @@
22

33
import { faker, type Faker } from '@faker-js/faker';
44

5-
export const fakeFoo = (options?: {
5+
export type Options = {
66
faker?: Faker;
7-
}) => ({
8-
name: (options?.faker ?? faker).string.sample(),
9-
age: (options?.faker ?? faker).number.int(),
10-
active: (options?.faker ?? faker).datatype.boolean()
7+
includeOptional?: 'always' | 'random' | false;
8+
useDefault?: 'always' | 'random' | false;
9+
};
10+
11+
const resolveCondition = (condition: 'always' | 'random' | false, faker: Faker): boolean => condition === 'always' || condition === 'random' && faker.datatype.boolean();
12+
13+
const ensureFaker = (options?: Options): Faker => options?.faker ?? faker;
14+
15+
export const fakeFoo = (options?: Options) => ({
16+
name: ensureFaker(options).string.sample(),
17+
age: ensureFaker(options).number.int(),
18+
...!resolveCondition(options?.includeOptional ?? 'always', ensureFaker(options)) ? {} : { active: ensureFaker(options).datatype.boolean() }
1119
});
1220

13-
export const fakeBar = (options?: {
14-
faker?: Faker;
15-
}) => (options?.faker ?? faker).helpers.arrayElement(['baz', 'qux']);
21+
export const fakeBar = (options?: Options) => ensureFaker(options).helpers.arrayElement(['baz', 'qux']);

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

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,64 +4,52 @@ import { faker, type Faker } from '@faker-js/faker';
44

55
import type { Active, Anything, Nothing, NumericEnum, Pet, PetList, PetOrTag, Price, Quantity, StatusWithNull, StringOrNumber, Tag, Tags } from '../types.gen';
66

7-
export const fakePrice = (options?: {
7+
export type Options = {
88
faker?: Faker;
9-
}): Price => (options?.faker ?? faker).number.float();
9+
includeOptional?: 'always' | 'random' | false;
10+
useDefault?: 'always' | 'random' | false;
11+
};
1012

11-
export const fakeQuantity = (options?: {
12-
faker?: Faker;
13-
}): Quantity => (options?.faker ?? faker).number.int();
13+
const resolveCondition = (condition: 'always' | 'random' | false, faker: Faker): boolean => condition === 'always' || condition === 'random' && faker.datatype.boolean();
1414

15-
export const fakeActive = (options?: {
16-
faker?: Faker;
17-
}): Active => (options?.faker ?? faker).datatype.boolean();
15+
const ensureFaker = (options?: Options): Faker => options?.faker ?? faker;
16+
17+
export const fakePrice = (options?: Options): Price => ensureFaker(options).number.float();
18+
19+
export const fakeQuantity = (options?: Options): Quantity => ensureFaker(options).number.int();
20+
21+
export const fakeActive = (options?: Options): Active => ensureFaker(options).datatype.boolean();
1822

1923
export const fakeNothing = (): Nothing => null;
2024

2125
export const fakeAnything = (): Anything => undefined;
2226

23-
export const fakeStatusWithNull = (options?: {
24-
faker?: Faker;
25-
}): StatusWithNull => (options?.faker ?? faker).helpers.arrayElement([
27+
export const fakeStatusWithNull = (options?: Options): StatusWithNull => ensureFaker(options).helpers.arrayElement([
2628
'active',
2729
'inactive',
2830
null
2931
]);
3032

31-
export const fakeNumericEnum = (options?: {
32-
faker?: Faker;
33-
}): NumericEnum => (options?.faker ?? faker).helpers.arrayElement([
33+
export const fakeNumericEnum = (options?: Options): NumericEnum => ensureFaker(options).helpers.arrayElement([
3434
1,
3535
2,
3636
3
3737
]);
3838

39-
export const fakeTags = (options?: {
40-
faker?: Faker;
41-
}): Tags => (options?.faker ?? faker).helpers.multiple(() => (options?.faker ?? faker).string.sample());
39+
export const fakeTags = (options?: Options): Tags => ensureFaker(options).helpers.multiple(() => ensureFaker(options).string.sample());
4240

43-
export const fakeTag = (options?: {
44-
faker?: Faker;
45-
}): Tag => ({
46-
id: (options?.faker ?? faker).number.int(),
47-
label: (options?.faker ?? faker).string.sample()
41+
export const fakeTag = (options?: Options): Tag => ({
42+
id: ensureFaker(options).number.int(),
43+
label: ensureFaker(options).string.sample()
4844
});
4945

50-
export const fakePet = (options?: {
51-
faker?: Faker;
52-
}): Pet => ({
53-
name: (options?.faker ?? faker).string.sample(),
54-
tag: fakeTag(options)
46+
export const fakePet = (options?: Options): Pet => ({
47+
name: ensureFaker(options).string.sample(),
48+
...!resolveCondition(options?.includeOptional ?? 'always', ensureFaker(options)) ? {} : { tag: fakeTag(options) }
5549
});
5650

57-
export const fakePetOrTag = (options?: {
58-
faker?: Faker;
59-
}): PetOrTag => fakePet(options);
51+
export const fakePetOrTag = (options?: Options): PetOrTag => fakePet(options);
6052

61-
export const fakeStringOrNumber = (options?: {
62-
faker?: Faker;
63-
}): StringOrNumber => (options?.faker ?? faker).string.sample();
53+
export const fakeStringOrNumber = (options?: Options): StringOrNumber => ensureFaker(options).string.sample();
6454

65-
export const fakePetList = (options?: {
66-
faker?: Faker;
67-
}): PetList => (options?.faker ?? faker).helpers.multiple(() => fakePet(options));
55+
export const fakePetList = (options?: Options): PetList => ensureFaker(options).helpers.multiple(() => fakePet(options));
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
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 { Address, BoundedFloat, BoundedInt, DateOnly, DateTime, DefaultBool, DefaultInt, DefaultOverridesConstraints, DefaultString, Email, EmailWithLength, ExclusiveFloat, ExclusiveFloatNarrow, ExclusiveInt, IPv4Address, IPv6Address, MaxOnlyArray, MaxOnlyInt, MaxOnlyString, MinOnlyArray, MinOnlyNumber, MinOnlyString, NullableInt, NullableString, ObjectWithDefaultProp, Person, PersonList, ShortName, TagList, Team, UnconstrainedArray, UniqueId, UserProfile, Website, ZipCode } from '../types.gen';
6+
7+
export type Options = {
8+
faker?: Faker;
9+
includeOptional?: 'always' | 'random' | false;
10+
useDefault?: 'always' | 'random' | false;
11+
};
12+
13+
const resolveCondition = (condition: 'always' | 'random' | false, faker: Faker): boolean => condition === 'always' || condition === 'random' && faker.datatype.boolean();
14+
15+
const ensureFaker = (options?: Options): Faker => options?.faker ?? faker;
16+
17+
export const fakeEmail = (options?: Options): Email => ensureFaker(options).internet.email();
18+
19+
export const fakeDateTime = (options?: Options): DateTime => ensureFaker(options).date.recent().toISOString();
20+
21+
export const fakeDateOnly = (options?: Options): DateOnly => ensureFaker(options).date.recent().toISOString().slice(0, 10);
22+
23+
export const fakeUniqueId = (options?: Options): UniqueId => ensureFaker(options).string.uuid();
24+
25+
export const fakeWebsite = (options?: Options): Website => ensureFaker(options).internet.url();
26+
27+
export const fakeIPv4Address = (options?: Options): IPv4Address => ensureFaker(options).internet.ipv4();
28+
29+
export const fakeIPv6Address = (options?: Options): IPv6Address => ensureFaker(options).internet.ipv6();
30+
31+
export const fakeZipCode = (options?: Options): ZipCode => ensureFaker(options).helpers.fromRegExp('^\\d{5}(-\\d{4})?$');
32+
33+
export const fakeShortName = (options?: Options): ShortName => ensureFaker(options).string.alpha({ length: { min: 2, max: 50 } });
34+
35+
export const fakeMinOnlyString = (options?: Options): MinOnlyString => ensureFaker(options).string.alpha({ length: { min: 10, max: 1000 } });
36+
37+
export const fakeMaxOnlyString = (options?: Options): MaxOnlyString => ensureFaker(options).string.alpha({ length: { min: 0, max: 5 } });
38+
39+
export const fakeEmailWithLength = (options?: Options): EmailWithLength => ensureFaker(options).internet.email();
40+
41+
export const fakeBoundedInt = (options?: Options): BoundedInt => ensureFaker(options).number.int({ min: 1, max: 100 });
42+
43+
export const fakeBoundedFloat = (options?: Options): BoundedFloat => ensureFaker(options).number.float({ min: 0, max: 1 });
44+
45+
export const fakeExclusiveInt = (options?: Options): ExclusiveInt => ensureFaker(options).number.int({ min: 1, max: 9 });
46+
47+
export const fakeMinOnlyNumber = (options?: Options): MinOnlyNumber => ensureFaker(options).number.float({ min: 0 });
48+
49+
export const fakeMaxOnlyInt = (options?: Options): MaxOnlyInt => ensureFaker(options).number.int({ max: 999 });
50+
51+
export const fakeTagList = (options?: Options): TagList => ensureFaker(options).helpers.multiple(() => ensureFaker(options).string.sample(), { count: { min: 1, max: 10 } });
52+
53+
export const fakeMinOnlyArray = (options?: Options): MinOnlyArray => ensureFaker(options).helpers.multiple(() => ensureFaker(options).number.int(), { count: { min: 3, max: 1000 } });
54+
55+
export const fakeMaxOnlyArray = (options?: Options): MaxOnlyArray => ensureFaker(options).helpers.multiple(() => ensureFaker(options).string.sample(), { count: { min: 0, max: 5 } });
56+
57+
export const fakeUnconstrainedArray = (options?: Options): UnconstrainedArray => ensureFaker(options).helpers.multiple(() => ensureFaker(options).string.sample());
58+
59+
export const fakeDefaultString = (options?: Options): DefaultString => resolveCondition(options?.useDefault ?? false, ensureFaker(options)) ? 'unknown' : ensureFaker(options).string.sample();
60+
61+
export const fakeDefaultInt = (options?: Options): DefaultInt => resolveCondition(options?.useDefault ?? false, ensureFaker(options)) ? 0 : ensureFaker(options).number.int();
62+
63+
export const fakeDefaultBool = (options?: Options): DefaultBool => resolveCondition(options?.useDefault ?? false, ensureFaker(options)) ? true : ensureFaker(options).datatype.boolean();
64+
65+
export const fakeDefaultOverridesConstraints = (options?: Options): DefaultOverridesConstraints => resolveCondition(options?.useDefault ?? false, ensureFaker(options)) ? 42 : ensureFaker(options).number.int({ min: 1, max: 100 });
66+
67+
export const fakeExclusiveFloat = (options?: Options): ExclusiveFloat => ensureFaker(options).number.float({ min: 0, max: 1 });
68+
69+
export const fakeExclusiveFloatNarrow = (options?: Options): ExclusiveFloatNarrow => ensureFaker(options).number.float({ min: 10.1, max: 10.2 });
70+
71+
export const fakeNullableString = (options?: Options): NullableString => ensureFaker(options).datatype.boolean() ? ensureFaker(options).string.sample() : null;
72+
73+
export const fakeNullableInt = (options?: Options): NullableInt => ensureFaker(options).datatype.boolean() ? ensureFaker(options).number.int() : null;
74+
75+
export const fakeObjectWithDefaultProp = (options?: Options): ObjectWithDefaultProp => ({
76+
name: ensureFaker(options).string.sample(),
77+
...!resolveCondition(options?.includeOptional ?? 'always', ensureFaker(options)) ? {} : { status: resolveCondition(options?.useDefault ?? false, ensureFaker(options)) ? 'active' : ensureFaker(options).string.sample() }
78+
});
79+
80+
export const fakeUserProfile = (options?: Options): UserProfile => ({
81+
id: ensureFaker(options).number.int(),
82+
name: ensureFaker(options).string.sample(),
83+
...!resolveCondition(options?.includeOptional ?? 'always', ensureFaker(options)) ? {} : { bio: ensureFaker(options).string.sample() },
84+
...!resolveCondition(options?.includeOptional ?? 'always', ensureFaker(options)) ? {} : { age: ensureFaker(options).number.int() }
85+
});
86+
87+
export const fakeAddress = (options?: Options): Address => ({
88+
street: ensureFaker(options).string.alpha({ length: { min: 1, max: 200 } }),
89+
zip: fakeZipCode(options)
90+
});
91+
92+
export const fakePerson = (options?: Options): Person => ({
93+
name: fakeShortName(options),
94+
email: fakeEmail(options),
95+
...!resolveCondition(options?.includeOptional ?? 'always', ensureFaker(options)) ? {} : { address: fakeAddress(options) }
96+
});
97+
98+
export const fakePersonList = (options?: Options): PersonList => ensureFaker(options).helpers.multiple(() => fakePerson(options), { count: { min: 1, max: 20 } });
99+
100+
export const fakeTeam = (options?: Options): Team => ({
101+
lead: fakePerson(options),
102+
config: fakeObjectWithDefaultProp(options)
103+
});
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 { Address, BoundedFloat, BoundedInt, ClientOptions, DateOnly, DateTime, DefaultBool, DefaultInt, DefaultOverridesConstraints, DefaultString, Email, EmailWithLength, ExclusiveFloat, ExclusiveFloatNarrow, ExclusiveInt, IPv4Address, IPv6Address, MaxOnlyArray, MaxOnlyInt, MaxOnlyString, MinOnlyArray, MinOnlyNumber, MinOnlyString, NullableInt, NullableString, ObjectWithDefaultProp, Person, PersonList, ShortName, TagList, Team, UnconstrainedArray, UniqueId, UserProfile, Website, ZipCode } from './types.gen';
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
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 Email = string;
8+
9+
export type DateTime = string;
10+
11+
export type DateOnly = string;
12+
13+
export type UniqueId = string;
14+
15+
export type Website = string;
16+
17+
export type IPv4Address = string;
18+
19+
export type IPv6Address = string;
20+
21+
export type ZipCode = string;
22+
23+
export type ShortName = string;
24+
25+
export type MinOnlyString = string;
26+
27+
export type MaxOnlyString = string;
28+
29+
export type EmailWithLength = string;
30+
31+
export type BoundedInt = number;
32+
33+
export type BoundedFloat = number;
34+
35+
export type ExclusiveInt = number;
36+
37+
export type MinOnlyNumber = number;
38+
39+
export type MaxOnlyInt = number;
40+
41+
export type TagList = Array<string>;
42+
43+
export type MinOnlyArray = Array<number>;
44+
45+
export type MaxOnlyArray = Array<string>;
46+
47+
export type UnconstrainedArray = Array<string>;
48+
49+
export type DefaultString = string;
50+
51+
export type DefaultInt = number;
52+
53+
export type DefaultBool = boolean;
54+
55+
export type DefaultOverridesConstraints = number;
56+
57+
export type ExclusiveFloat = number;
58+
59+
export type ExclusiveFloatNarrow = number;
60+
61+
export type NullableString = string | null;
62+
63+
export type NullableInt = number | null;
64+
65+
export type ObjectWithDefaultProp = {
66+
name: string;
67+
status?: string;
68+
};
69+
70+
export type UserProfile = {
71+
id: number;
72+
name: string;
73+
bio?: string;
74+
age?: number;
75+
};
76+
77+
export type Address = {
78+
street: string;
79+
zip: ZipCode;
80+
};
81+
82+
export type Person = {
83+
name: ShortName;
84+
email: Email;
85+
address?: Address;
86+
};
87+
88+
export type PersonList = Array<Person>;
89+
90+
export type Team = {
91+
lead: Person;
92+
config: ObjectWithDefaultProp;
93+
};

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
@@ -38,6 +38,15 @@ describe(`OpenAPI ${version}`, () => {
3838
}),
3939
description: 'handles number, null, enum-with-null, array, $ref, and union schemas',
4040
},
41+
{
42+
config: createConfig({
43+
input: 'faker-m2.yaml',
44+
output: 'faker-m2',
45+
plugins: ['@hey-api/typescript', '@faker-js/faker'],
46+
}),
47+
description:
48+
'handles string formats, numeric constraints, array constraints, and default values',
49+
},
4150
];
4251

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

packages/openapi-ts/src/plugins/@faker-js/faker/shared/export.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,6 @@ export function exportAst({
3434
}),
3535
);
3636

37-
const fakerTypeSymbol = plugin.external('@faker-js/faker.Faker');
38-
39-
// { faker?: Faker }
40-
const optionsType = $.type
41-
.object()
42-
.prop('faker', (p) => p.optional().type($.type(fakerTypeSymbol)));
43-
4437
// Look up the TypeScript type for this schema (e.g. Foo, Bar)
4538
const typeSymbol = plugin.querySymbol({
4639
category: 'type',
@@ -52,7 +45,7 @@ export function exportAst({
5245
// Build arrow function, only adding options param when the expression uses faker
5346
const arrowFn = $.func()
5447
.arrow()
55-
.$if(final.usesFaker, (f) => f.param('options', (p) => p.optional().type(optionsType)))
48+
.$if(final.usesFaker, (f) => f.param('options', (p) => p.optional().type('Options')))
5649
.$if(typeSymbol, (f) => f.returns($.type(typeSymbol!)))
5750
.do($.return(final.expression));
5851

0 commit comments

Comments
 (0)