Skip to content

Commit

Permalink
Merge pull request #129 from premieroctet/feature/add-level-option-fo…
Browse files Browse the repository at this point in the history
…rmatter

Add one level of access model in optionFormatter option
  • Loading branch information
cregourd authored Jan 24, 2024
2 parents 629fbd2 + e3ee58a commit 0a0c052
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 18 deletions.
5 changes: 5 additions & 0 deletions .changeset/slow-mugs-juggle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@premieroctet/next-admin": patch
---

Add one level of access model in optionFormatter option
47 changes: 31 additions & 16 deletions packages/next-admin/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,39 @@ export type ScalarField<T extends ModelName> =
export type ObjectField<T extends ModelName> =
Prisma.TypeMap["model"][T]["payload"]["objects"];

export type Payload = Prisma.TypeMap["model"][ModelName]["payload"];

export type ModelFromPayload<
P extends Payload,
T extends object | number = object,> = {
[Property in keyof P["scalars"]]: P["scalars"][Property]
} & {
[Property in keyof P["objects"]]: P["objects"][Property] extends { scalars: infer S }
? T extends object
? S
: T
: never | P["objects"][Property] extends { scalars: infer S }[]
? T extends object
? S[]
: T[]
: never | P["objects"][Property] extends { scalars: infer S } | null
? T extends object
? S | null
: T | null
: never;
};

export type Model<
M extends ModelName,
T extends object | number = object,
> = ScalarField<M> & {
[P in keyof ObjectField<M>]: ObjectField<M>[P] extends { scalars: infer S }
? T extends object
? S
: T
: never | ObjectField<M>[P] extends { scalars: infer S }[]
? T extends object
? S[]
: T[]
: never | ObjectField<M>[P] extends { scalars: infer S } | null
? T extends object
? S | null
: T | null
: never;
};
> = ModelFromPayload<Prisma.TypeMap["model"][M]["payload"], T>;

export type PropertyPayload<M extends ModelName, P extends keyof ObjectField<M>> =
Prisma.TypeMap["model"][M]["payload"]["objects"][P] extends Array<infer T> ? T : never |
Prisma.TypeMap["model"][M]["payload"]["objects"][P] extends infer T | null ? T : never |
Prisma.TypeMap["model"][M]["payload"]["objects"][P]

export type ModelFromProperty<M extends ModelName, P extends keyof ObjectField<M>> = PropertyPayload<M, P> extends Payload ? ModelFromPayload<PropertyPayload<M,P>> : never

export type ModelWithoutRelationships<M extends ModelName> = Model<M, number>;

Expand All @@ -57,7 +72,7 @@ export type EditFieldsOptions<T extends ModelName> = {
input?: React.ReactElement;
} & (
P extends keyof ObjectField<T> ? {
optionFormatter?: (item: Model<T>[P] extends Array<infer U> ? U : Model<T>[P]) => string;
optionFormatter?: (item: ModelFromProperty<T, P>) => string;
} : {}
)
};
Expand Down
4 changes: 2 additions & 2 deletions packages/next-admin/src/utils/validator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import { validate } from "../utils/validator";
describe("validator", () => {
it("should not validate if there is no config", () => {
expect(() =>
validate({
id: "1",
validate<"User">({
id: 1,
email: "[email protected]",
})
).not.toThrow();
Expand Down

0 comments on commit 0a0c052

Please sign in to comment.