Skip to content

Commit 8e2c4b1

Browse files
committed
fix: include orphans when explicitly requested
1 parent bb6c491 commit 8e2c4b1

3 files changed

Lines changed: 321 additions & 80 deletions

File tree

.changeset/bright-rooms-tease.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@hey-api/shared": patch
3+
"@hey-api/openapi-ts": patch
4+
---
5+
6+
**parser**: fix: keep orphans when explicitly included in filters
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
import type { Logger } from '@hey-api/codegen-core';
2+
3+
import type { ResourceMetadata } from '../../graph/meta';
4+
import { createFilteredDependencies, type Filters } from '../filter';
5+
6+
const loggerStub = {
7+
timeEvent: () => ({ timeEnd: () => {} }),
8+
} as unknown as Logger;
9+
10+
function createFilters(): Filters {
11+
return {
12+
deprecated: true,
13+
operations: {
14+
exclude: new Set(),
15+
include: new Set(),
16+
},
17+
orphans: false,
18+
parameters: {
19+
exclude: new Set(),
20+
include: new Set(),
21+
},
22+
preserveOrder: false,
23+
requestBodies: {
24+
exclude: new Set(),
25+
include: new Set(),
26+
},
27+
responses: {
28+
exclude: new Set(),
29+
include: new Set(),
30+
},
31+
schemas: {
32+
exclude: new Set(),
33+
include: new Set(),
34+
},
35+
tags: {
36+
exclude: new Set(),
37+
include: new Set(),
38+
},
39+
};
40+
}
41+
42+
function createResourceMetadata(): ResourceMetadata {
43+
return {
44+
operations: new Map([
45+
[
46+
'operation/GET /v1/foo',
47+
{
48+
dependencies: new Set(['response/UsedResponse']),
49+
deprecated: false,
50+
tags: new Set(),
51+
},
52+
],
53+
]),
54+
parameters: new Map(),
55+
requestBodies: new Map([
56+
[
57+
'body/IncludedBody',
58+
{
59+
dependencies: new Set(['schema/Baz']),
60+
deprecated: false,
61+
},
62+
],
63+
]),
64+
responses: new Map([
65+
[
66+
'response/UsedResponse',
67+
{
68+
dependencies: new Set(),
69+
deprecated: false,
70+
},
71+
],
72+
]),
73+
schemas: new Map([
74+
[
75+
'schema/Foo',
76+
{
77+
dependencies: new Set(['schema/Baz']),
78+
deprecated: false,
79+
},
80+
],
81+
[
82+
'schema/Baz',
83+
{
84+
dependencies: new Set(),
85+
deprecated: false,
86+
},
87+
],
88+
]),
89+
};
90+
}
91+
92+
describe('createFilteredDependencies', () => {
93+
it('keeps explicitly included schemas and their dependencies when dropping orphans', () => {
94+
const filters = createFilters();
95+
filters.schemas.include.add('schema/Foo');
96+
97+
const { schemas } = createFilteredDependencies({
98+
filters,
99+
logger: loggerStub,
100+
resourceMetadata: createResourceMetadata(),
101+
});
102+
103+
expect(schemas).toEqual(new Set(['schema/Foo', 'schema/Baz']));
104+
});
105+
106+
it('keeps explicitly included request bodies and their schema dependencies when dropping orphans', () => {
107+
const filters = createFilters();
108+
filters.requestBodies.include.add('body/IncludedBody');
109+
110+
const { requestBodies, schemas } = createFilteredDependencies({
111+
filters,
112+
logger: loggerStub,
113+
resourceMetadata: createResourceMetadata(),
114+
});
115+
116+
expect(requestBodies).toEqual(new Set(['body/IncludedBody']));
117+
expect(schemas).toEqual(new Set(['schema/Baz']));
118+
});
119+
120+
it('prioritizes excludes when the same schema is explicitly included and excluded', () => {
121+
const filters = createFilters();
122+
filters.schemas.include.add('schema/Foo');
123+
filters.schemas.exclude.add('schema/Foo');
124+
125+
const { schemas } = createFilteredDependencies({
126+
filters,
127+
logger: loggerStub,
128+
resourceMetadata: createResourceMetadata(),
129+
});
130+
131+
expect(schemas).toEqual(new Set());
132+
});
133+
});

0 commit comments

Comments
 (0)