From 0f45933791fc9ea66dac8eda404c4ffef8e049d0 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Tue, 7 May 2024 16:45:07 +1000 Subject: [PATCH] feat(ui): extend zod with a `is` typeguard` method Feels dangerous, but it's very handy. --- invokeai/frontend/web/src/extend-zod.ts | 8 ++++++++ invokeai/frontend/web/src/main.tsx | 2 ++ invokeai/frontend/web/src/zod-extensions.d.ts | 8 ++++++++ 3 files changed, 18 insertions(+) create mode 100644 invokeai/frontend/web/src/extend-zod.ts create mode 100644 invokeai/frontend/web/src/zod-extensions.d.ts diff --git a/invokeai/frontend/web/src/extend-zod.ts b/invokeai/frontend/web/src/extend-zod.ts new file mode 100644 index 0000000000..b1c155062d --- /dev/null +++ b/invokeai/frontend/web/src/extend-zod.ts @@ -0,0 +1,8 @@ +import { assert } from 'tsafe'; +import { z } from 'zod'; + +assert(!Object.hasOwn(z.ZodType.prototype, 'is')); + +z.ZodType.prototype.is = function (val: unknown): val is z.infer { + return this.safeParse(val).success; +}; diff --git a/invokeai/frontend/web/src/main.tsx b/invokeai/frontend/web/src/main.tsx index acf9491778..129d1bc9e5 100644 --- a/invokeai/frontend/web/src/main.tsx +++ b/invokeai/frontend/web/src/main.tsx @@ -1,3 +1,5 @@ +import 'extend-zod'; + import ReactDOM from 'react-dom/client'; import InvokeAIUI from './app/components/InvokeAIUI'; diff --git a/invokeai/frontend/web/src/zod-extensions.d.ts b/invokeai/frontend/web/src/zod-extensions.d.ts new file mode 100644 index 0000000000..0abab07a19 --- /dev/null +++ b/invokeai/frontend/web/src/zod-extensions.d.ts @@ -0,0 +1,8 @@ +import 'zod'; + +declare module 'zod' { + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + export interface ZodType { + is(val: unknown): val is Output; + } +}