Skip to content
This repository has been archived by the owner on May 6, 2023. It is now read-only.

Commit

Permalink
fix(object): reference named object
Browse files Browse the repository at this point in the history
  • Loading branch information
saiichihashimoto committed Jun 7, 2022
1 parent 3c67aff commit bce860a
Show file tree
Hide file tree
Showing 10 changed files with 57 additions and 28 deletions.
4 changes: 2 additions & 2 deletions src/array/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ interface ArrayType<
},
NonEmpty extends boolean
> extends SanityType<
ArrayFieldDef<never, never>,
ArrayFieldDef<any, any>,
z.ZodArray<
"00" extends Positions
? z.ZodUnion<
Expand Down Expand Up @@ -62,7 +62,7 @@ interface ArrayType<
}

type ArrayDef<NonEmpty extends boolean> = Omit<
ArrayFieldDef<never, never>,
ArrayFieldDef<any, any>,
"description" | "of" | "type"
> & {
length?: number;
Expand Down
7 changes: 2 additions & 5 deletions src/block/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,9 @@ import type { Faker } from "@faker-js/faker";
import type { PortableTextBlock } from "@portabletext/types";

interface BlockType
extends SanityType<
BlockFieldDef<never, never>,
z.ZodType<PortableTextBlock>
> {}
extends SanityType<BlockFieldDef<any, any>, z.ZodType<PortableTextBlock>> {}

type BlockDef = Omit<BlockFieldDef<never, never>, "description" | "type">;
type BlockDef = Omit<BlockFieldDef<any, any>, "description" | "type">;

export const block = (
def: BlockDef & {
Expand Down
4 changes: 2 additions & 2 deletions src/document/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export interface DocumentType<
DocumentName extends string,
Fields extends FieldsType<any, any>
> extends SanityType<
DocumentDef<DocumentName, never, InferFieldNames<Fields>, never, never>,
DocumentDef<DocumentName, any, InferFieldNames<Fields>, any, any>,
ZodDocument<DocumentName, Fields>
> {
name: DocumentName;
Expand All @@ -45,7 +45,7 @@ export const document = <
Fields extends FieldsType<any, any>
>(
def: Omit<
DocumentDef<DocumentName, never, InferFieldNames<Fields>, never, never>,
DocumentDef<DocumentName, any, InferFieldNames<Fields>, any, any>,
"fields" | "preview" | "type"
> & {
fields: Fields;
Expand Down
6 changes: 3 additions & 3 deletions src/fields/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ interface FieldOptions<
name: Name;
optional?: Optional;
title?: string;
type: SanityType<FieldTypeFields<never, never, Name>, Zod>;
type: SanityType<FieldTypeFields<any, any, Name>, Zod>;
}

type InferName<T extends FieldOptions<any, any, any>> = T extends FieldOptions<
Expand Down Expand Up @@ -44,7 +44,7 @@ export interface FieldsType<
[field in FieldNames]: FieldOptions<field, any, any>;
}
> extends SanityType<
ObjectFieldDef<never, never, FieldNames, never>["fields"],
ObjectFieldDef<any, any, FieldNames, any>["fields"],
z.ZodObject<
{
[field in FieldNames]: InferOptional<Fields[field]> extends true
Expand Down Expand Up @@ -196,7 +196,7 @@ export type Preview<Value> = ((object: Value) => Selection) | Selection;

export const preview = <Value, FieldNames extends string>(
preview: Preview<Value> | undefined,
fields: ObjectFieldDef<never, never, FieldNames, never>["fields"]
fields: ObjectFieldDef<any, any, FieldNames, any>["fields"]
) =>
!preview
? undefined
Expand Down
4 changes: 2 additions & 2 deletions src/file/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@ type ZodFile<Fields extends FieldsType<any, any>> = z.ZodIntersection<

interface FileType<Fields extends FieldsType<any, any>>
extends SanityType<
FileFieldDef<never, never, InferFieldNames<Fields>>,
FileFieldDef<any, any, InferFieldNames<Fields>>,
ZodFile<Fields>
> {}

export const file = <
Fields extends FieldsType<any, any> = FieldsType<never, Record<never, never>>
>(
def: Omit<
FileFieldDef<never, never, InferFieldNames<Fields>>,
FileFieldDef<any, any, InferFieldNames<Fields>>,
"description" | "fields" | "preview" | "type"
> & {
fields?: Fields;
Expand Down
4 changes: 2 additions & 2 deletions src/image/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ interface ImageType<
Hotspot extends boolean,
Fields extends FieldsType<any, any>
> extends SanityType<
ImageFieldDef<never, never, InferFieldNames<Fields>>,
ImageFieldDef<any, any, InferFieldNames<Fields>>,
ZodImage<Hotspot, Fields>
> {}

Expand All @@ -55,7 +55,7 @@ export const image = <
Fields extends FieldsType<any, any> = FieldsType<never, Record<never, never>>
>(
def: Omit<
ImageFieldDef<never, never, InferFieldNames<Fields>>,
ImageFieldDef<any, any, InferFieldNames<Fields>>,
"description" | "fields" | "preview" | "type"
> & {
fields?: Fields;
Expand Down
4 changes: 2 additions & 2 deletions src/object/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ import type { z } from "zod";

interface ObjectType<Fields extends FieldsType<any, any>>
extends SanityType<
ObjectFieldDef<never, never, InferFieldNames<Fields>, never>,
ObjectFieldDef<any, any, InferFieldNames<Fields>, any>,
InferFieldsZod<Fields>
> {}

export const object = <Fields extends FieldsType<any, any>>(
def: Omit<
ObjectFieldDef<never, never, InferFieldNames<Fields>, never>,
ObjectFieldDef<any, any, InferFieldNames<Fields>, any>,
"description" | "fields" | "preview" | "type"
> & {
fields: Fields;
Expand Down
23 changes: 23 additions & 0 deletions src/objectNamed/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,29 @@ describe("object", () => {
expect(parsedValue).toEqual(value);
});

it("makes a reference", () => {
const type = objectNamed({ name: "foo", fields: fields() });

const type2 = objectNamed({
name: "bar",
fields: fields().field({ name: "foo", type: type.ref() }),
});

const value: ValidateShape<
InferInput<typeof type2>,
{ _type: "bar"; foo: { _type: "foo" } }
> = {
_type: "bar",
foo: { _type: "foo" },
};
const parsedValue: ValidateShape<
InferOutput<typeof type2>,
{ _type: "bar"; foo: { _type: "foo" } }
> = type2.parse(value);

expect(parsedValue).toEqual(value);
});

it("adds fields", () => {
const type = objectNamed({
name: "foo",
Expand Down
21 changes: 18 additions & 3 deletions src/objectNamed/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,21 @@ interface ObjectNamedType<
ObjectNames extends string,
Fields extends FieldsType<any, any>
> extends SanityType<
ObjectDef<ObjectNames, never, InferFieldNames<Fields>, never>,
ObjectDef<ObjectNames, any, InferFieldNames<Fields>, any>,
ZodObjectNamed<ObjectNames, Fields>
> {}
> {
ref: () => SanityType<
FieldDef<any, any> & { type: ObjectNames },
z.ZodObject<{ _type: z.ZodLiteral<ObjectNames> }>
>;
}

export const objectNamed = <
ObjectNames extends string,
Fields extends FieldsType<any, any>
>(
def: Omit<
ObjectDef<ObjectNames, never, InferFieldNames<Fields>, never>,
ObjectDef<ObjectNames, any, InferFieldNames<Fields>, any>,
"description" | "fields" | "preview" | "type"
> & {
fields: Fields;
Expand Down Expand Up @@ -75,5 +80,15 @@ export const objectNamed = <
preview: preview(previewDef, schemaForFields),
};
},
ref: () => {
const zod = z.object({ _type: z.literal(name) });

return {
zod,
parse: zod.parse.bind(zod),
mock: () => ({ _type: name }),
schema: () => ({ type: name }),
};
},
};
};
8 changes: 1 addition & 7 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
import type { z } from "zod";

export interface SanityType<
// TODO Does this need to be strongly typed like this? Can it just be not typed?
Definition extends
| FieldDef<any, any>
| ObjectFieldDef<never, never, string, never>["fields"],
Zod extends z.ZodType<any, any, any>
> {
export interface SanityType<Definition, Zod extends z.ZodType<any, any, any>> {
mock: () => z.input<Zod>;
parse: (data: unknown) => z.infer<Zod>;
schema: () => Definition;
Expand Down

0 comments on commit bce860a

Please sign in to comment.