Skip to content

Commit e702883

Browse files
committed
fix(enum-values): access optional prop child props
Fixes: #2138
1 parent be7b54a commit e702883

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

packages/openapi-typescript/src/lib/ts.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ function addIndexedAccess(node: ts.TypeReferenceNode | ts.IndexedAccessTypeNode,
164164
* must check the parameter definition to determine the how to index into
165165
* the openapi-typescript type.
166166
**/
167-
export function oapiRef(path: string, resolved?: OapiRefResolved): ts.TypeNode {
167+
export function oapiRef(path: string, resolved?: OapiRefResolved, deep = false): ts.TypeNode {
168168
const { pointer } = parseRef(path);
169169
if (pointer.length === 0) {
170170
throw new Error(`Error parsing $ref: ${path}. Is this a valid $ref?`);
@@ -179,7 +179,9 @@ export function oapiRef(path: string, resolved?: OapiRefResolved): ts.TypeNode {
179179
const restSegments = pointer.slice(3);
180180

181181
const leadingType = addIndexedAccess(
182-
ts.factory.createTypeReferenceNode(ts.factory.createIdentifier(String(initialSegment))),
182+
ts.factory.createTypeReferenceNode(
183+
ts.factory.createIdentifier(deep ? `DeepRequired<${String(initialSegment)}>` : String(initialSegment)),
184+
),
183185
...leadingSegments,
184186
);
185187

@@ -305,6 +307,16 @@ export function tsArrayLiteralExpression(
305307
let variableName = sanitizeMemberName(name);
306308
variableName = `${variableName[0].toLowerCase()}${variableName.substring(1)}`;
307309

310+
if (
311+
options?.injectFooter &&
312+
!options.injectFooter.some((node) => ts.isTypeAliasDeclaration(node) && node?.name?.escapedText === "DeepRequired")
313+
) {
314+
const helper = stringToAST(
315+
"type DeepRequired<T> = { [K in keyof T]: Required<DeepRequired<T[K]>> };",
316+
)[0] as any;
317+
options.injectFooter.push(helper);
318+
}
319+
308320
const arrayType = options?.readonly
309321
? tsReadonlyArray(elementType, options.injectFooter)
310322
: ts.factory.createArrayTypeNode(elementType);

packages/openapi-typescript/src/transform/schema-object.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ export function transformSchemaObjectWithComposition(
145145

146146
const enumValuesArray = tsArrayLiteralExpression(
147147
enumValuesVariableName,
148-
oapiRef(options.path ?? ""),
148+
oapiRef(options.path ?? "", undefined, true),
149149
schemaObject.enum as (string | number)[],
150150
{
151151
export: true,

0 commit comments

Comments
 (0)