From 48eb1e0bbcbdb223699deb72a5072f792524e86b Mon Sep 17 00:00:00 2001 From: tvillaren Date: Wed, 17 May 2023 18:46:46 +0200 Subject: [PATCH 1/3] test: failing test case --- src/core/generate.test.ts | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/core/generate.test.ts b/src/core/generate.test.ts index 5a810a3..61e1113 100644 --- a/src/core/generate.test.ts +++ b/src/core/generate.test.ts @@ -478,4 +478,33 @@ describe("generate", () => { expect(errors).toEqual([]); }); }); + + describe("with @strict tag", () => { + it("should generate strict keyword", () => { + const sourceText = ` + /** + * @strict + */ + export interface Superman { + name: string; + age: number; + } + `; + + const { getZodSchemasFile } = generate({ + sourceText, + }); + + expect(getZodSchemasFile("./source")).toMatchInlineSnapshot(` + "// Generated by ts-to-zod + import { z } from \\"zod\\"; + + export const supermanSchema = z.object({ + name: z.string(), + age: z.number() + }).strict(); + " + `); + }); + }); }); From 1adb27f4a87bf77409c0f0c4715b85e34527a0df Mon Sep 17 00:00:00 2001 From: tvillaren Date: Thu, 18 May 2023 09:23:52 +0200 Subject: [PATCH 2/3] fix: missing strict() on root schemas --- src/core/generateZodSchema.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/core/generateZodSchema.ts b/src/core/generateZodSchema.ts index e5925cf3..6c780f8 100644 --- a/src/core/generateZodSchema.ts +++ b/src/core/generateZodSchema.ts @@ -108,6 +108,20 @@ export function generateZodSchemaVariableStatement({ schemaExtensionClauses, skipParseJSDoc, }); + + if (!skipParseJSDoc) { + const jsDocTags = getJSDocTags(node, sourceFile); + if (jsDocTags.strict) { + schema = f.createCallExpression( + f.createPropertyAccessExpression( + schema, + f.createIdentifier("strict") + ), + undefined, + undefined + ); + } + } } if (ts.isTypeAliasDeclaration(node)) { From 1fc4314b87759623194e941fb22b554c482d2ae5 Mon Sep 17 00:00:00 2001 From: tvillaren Date: Thu, 18 May 2023 09:31:03 +0200 Subject: [PATCH 3/3] test: additional test case --- src/core/generate.test.ts | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/core/generate.test.ts b/src/core/generate.test.ts index 61e1113..6da4cfd 100644 --- a/src/core/generate.test.ts +++ b/src/core/generate.test.ts @@ -489,6 +489,17 @@ describe("generate", () => { name: string; age: number; } + + export interface Villain { + name: string; + /** + * @strict + */ + nemesis: { + name: string; + ref: Superman + }; + } `; const { getZodSchemasFile } = generate({ @@ -496,14 +507,22 @@ describe("generate", () => { }); expect(getZodSchemasFile("./source")).toMatchInlineSnapshot(` - "// Generated by ts-to-zod - import { z } from \\"zod\\"; - - export const supermanSchema = z.object({ - name: z.string(), - age: z.number() - }).strict(); - " + "// Generated by ts-to-zod + import { z } from \\"zod\\"; + + export const supermanSchema = z.object({ + name: z.string(), + age: z.number() + }).strict(); + + export const villainSchema = z.object({ + name: z.string(), + nemesis: z.object({ + name: z.string(), + ref: supermanSchema + }).strict() + }); + " `); }); });