Skip to content

Commit 0f46a9c

Browse files
committed
feat(codegen-core): add isRegistered() method to file and symbol registry
1 parent 69783d1 commit 0f46a9c

File tree

23 files changed

+168
-141
lines changed

23 files changed

+168
-141
lines changed

.changeset/wet-glasses-sleep.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@hey-api/codegen-core': patch
3+
---
4+
5+
feat: add `isRegistered()` method to file and symbol registry

packages/codegen-core/src/__tests__/files.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ describe('FileRegistry', () => {
2828
expect(registry.get(file1.id)).toEqual(file1);
2929
expect(registry.get(['foo'])).toEqual(file1);
3030

31+
// isRegistered should be true for explicitly registered files
32+
expect(registry.isRegistered(file1.id)).toBe(true);
33+
expect(registry.isRegistered(['foo'])).toBe(true);
34+
3135
// Registering again with same selector returns same file
3236
const file1b = registry.register({ selector: ['foo'] });
3337
expect(file1b).toEqual(file1);
@@ -76,6 +80,17 @@ describe('FileRegistry', () => {
7680
expect(referenced).toContainEqual(file3);
7781
// Once registered, file1 is not in referenced set
7882
expect(referenced).not.toContainEqual(file1);
83+
84+
// Referenced-only file should not be considered registered
85+
expect(registry.isRegistered(file3.id)).toBe(false);
86+
// Once registered, file3 becomes registered and no longer appears in referenced()
87+
const file3Registered = registry.register({
88+
name: 'Baz',
89+
selector: ['baz'],
90+
});
91+
expect(registry.isRegistered(file3Registered.id)).toBe(true);
92+
const referencedAfter = Array.from(registry.referenced());
93+
expect(referencedAfter).not.toContainEqual(file3Registered);
7994
});
8095

8196
it('throws on invalid register or reference', () => {

packages/codegen-core/src/__tests__/symbols.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ describe('SymbolRegistry', () => {
2727
expect(registry.get(symbol1.id)).toEqual(symbol1);
2828
expect(registry.get(['foo'])).toEqual(symbol1);
2929

30+
// isRegistered should be true for explicitly registered symbols
31+
expect(registry.isRegistered(symbol1.id)).toBe(true);
32+
expect(registry.isRegistered(['foo'])).toBe(true);
33+
3034
// Registering again with same selector returns same symbol
3135
const symbol1b = registry.register({ selector: ['foo'] });
3236
expect(symbol1b).toEqual(symbol1);
@@ -75,6 +79,15 @@ describe('SymbolRegistry', () => {
7579
registry.setValue(symbol1.id, 42);
7680
expect(registry.hasValue(symbol1.id)).toBe(true);
7781
expect(registry.getValue(symbol1.id)).toBe(42);
82+
83+
// referenced-only symbol should not be registered until register() with data
84+
const symRef = registry.reference(['qux']);
85+
expect(registry.isRegistered(symRef.id)).toBe(false);
86+
const symRegistered = registry.register({
87+
placeholder: 'Qux',
88+
selector: ['qux'],
89+
});
90+
expect(registry.isRegistered(symRegistered.id)).toBe(true);
7891
});
7992

8093
it('throws on invalid register or reference', () => {

packages/codegen-core/src/files/registry.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ export class FileRegistry implements IFileRegistry {
4343
: { selector: symbolIdOrSelector };
4444
}
4545

46+
isRegistered(fileIdOrSelector: number | ISelector): boolean {
47+
const file = this.get(fileIdOrSelector);
48+
return file ? this.registerOrder.has(file.id) : false;
49+
}
50+
4651
reference(fileIdOrSelector: number | ISelector): IFileOut {
4752
const file = this.idOrSelector(fileIdOrSelector);
4853
return this.register(file);
@@ -104,6 +109,9 @@ export class FileRegistry implements IFileRegistry {
104109

105110
if (hasOtherKeys) {
106111
this.registerOrder.add(id);
112+
if (this.referenceOrder.has(id)) {
113+
this.referenceOrder.delete(id);
114+
}
107115
} else {
108116
this.referenceOrder.add(id);
109117
}

packages/codegen-core/src/files/types.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,13 @@ export interface IFileRegistry {
8282
* @returns File ID before being incremented
8383
*/
8484
readonly id: number;
85+
/**
86+
* Returns whether a file is registered in the registry.
87+
*
88+
* @param fileIdOrSelector File ID or selector to check.
89+
* @returns True if the file is registered, false otherwise.
90+
*/
91+
isRegistered(fileIdOrSelector: number | ISelector): boolean;
8592
/**
8693
* Returns a file by ID or selector, registering it if it doesn't exist.
8794
*

packages/codegen-core/src/symbols/registry.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ export class SymbolRegistry implements ISymbolRegistry {
5151
: { selector: symbolIdOrSelector };
5252
}
5353

54+
isRegistered(symbolIdOrSelector: number | ISelector): boolean {
55+
const symbol = this.get(symbolIdOrSelector);
56+
return symbol ? this.registerOrder.has(symbol.id) : false;
57+
}
58+
5459
reference(symbolIdOrSelector: number | ISelector): ISymbolOut {
5560
const symbol = this.idOrSelector(symbolIdOrSelector);
5661
return this.register(symbol);

packages/codegen-core/src/symbols/types.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@ export interface ISymbolRegistry {
113113
* @returns Symbol ID before being incremented.
114114
*/
115115
readonly id: number;
116+
/**
117+
* Returns whether a symbol is registered in the registry.
118+
*
119+
* @param symbolIdOrSelector Symbol ID or selector to check.
120+
* @returns True if the symbol is registered, false otherwise.
121+
*/
122+
isRegistered(symbolIdOrSelector: number | ISelector): boolean;
116123
/**
117124
* Returns a symbol by ID or selector, registering it if it doesn't exist.
118125
*

packages/openapi-ts-tests/main/test/openapi-ts.config.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ export default defineConfig(() => {
3434
// },
3535
path: path.resolve(
3636
getSpecsPath(),
37-
// '3.0.x',
38-
'3.1.x',
39-
// 'circular.yaml',
37+
'3.0.x',
38+
// '3.1.x',
39+
'circular.yaml',
4040
// 'dutchie.json',
4141
// 'invalid',
4242
// 'openai.yaml',
@@ -46,7 +46,7 @@ export default defineConfig(() => {
4646
// 'string-with-format.yaml',
4747
// 'transformers.json',
4848
// 'type-format.yaml',
49-
'validators.yaml',
49+
// 'validators.yaml',
5050
// 'validators-circular-ref.json',
5151
// 'validators-circular-ref-2.yaml',
5252
// 'zoom-video-sdk.json',

packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/circular/zod.gen.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ export const zCorge = z.object({
1515
});
1616

1717
export const zFoo = z.object({
18-
quux: z.optional(zQuux)
18+
get quux() {
19+
return z.optional(z.lazy((): any => {
20+
return zQuux;
21+
}));
22+
}
1923
});
2024

2125
export const zQux = z.union([

packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/circular/zod.gen.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ export const zCorge = z.object({
1212
baz: z.array(zBaz).optional()
1313
});
1414

15-
export const zFoo = z.object({
16-
quux: zQuux.optional()
15+
export const zFoo: z.AnyZodObject = z.object({
16+
quux: z.lazy(() => {
17+
return zQuux;
18+
}).optional()
1719
});
1820

1921
export const zQux = z.union([

0 commit comments

Comments
 (0)