Skip to content

Commit

Permalink
remove all occurrences of dmmf
Browse files Browse the repository at this point in the history
  • Loading branch information
foyarash committed Oct 2, 2024
1 parent 7c624da commit 5a03a7a
Show file tree
Hide file tree
Showing 19 changed files with 554 additions and 468 deletions.
2 changes: 1 addition & 1 deletion packages/generator-prisma/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
"typecheck": "tsc --noEmit"
},
"dependencies": {
"@premieroctet/next-admin-json-schema": "workspace:*",
"@premieroctet/next-admin-json-schema": "workspace:^",
"@prisma/generator-helper": "^5.20.0",
"@prisma/internals": "^5.20.0",
"prisma-json-schema-generator": "5.1.5"
Expand Down
49 changes: 36 additions & 13 deletions packages/generator-prisma/src/dmmf.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import type { DMMF } from "@prisma/generator-helper";
import type { JSONSchema7, JSONSchema7Definition } from "json-schema";
import type { JSONSchema7 } from "json-schema";
import {
injectIntoJsonSchemaDefinition,
type NextAdminJSONSchema,
type NextAdminJsonSchemaDataType,
type NextAdminJsonSchemaRelation,
} from "@premieroctet/next-admin-json-schema";

type DeepMutableField<T> = {
-readonly [P in keyof T]: DeepMutableField<T[P]>;
};

const isFieldDisabled = (field: DMMF.Field) => {
const isDisabled = field.isReadOnly || field.isGenerated || field.isUpdatedAt;

Expand Down Expand Up @@ -83,25 +88,43 @@ export const insertDmmfData = (

const fields = dmmfModel.fields;

if (dmmfModel.primaryKey) {
injectIntoJsonSchemaDefinition(model as NextAdminJSONSchema, {
primaryKeyField: {
name: dmmfModel.primaryKey.fields.join("_"),
fields: dmmfModel.primaryKey.fields as DeepMutableField<
typeof dmmfModel.primaryKey
>["fields"],
},
});
}

Object.entries(properties).forEach(([propertyName, property]) => {
const dmmfField = fields.find((f) => f.name === propertyName);

if (!dmmfField || typeof property !== "object") {
return;
}

injectIntoJsonSchemaDefinition(model.properties![propertyName], {
primaryKey: dmmfField.isId,
kind: dmmfField.kind,
type: dmmfField.type as NextAdminJsonSchemaDataType,
disabled: isFieldDisabled(dmmfField),
isList: dmmfField.isList,
enum:
dmmfField.kind === "enum"
? { $ref: `#/definitions/${dmmfField.type}` }
: undefined,
relation: getRelationData(dmmf, dmmfField, dmmfModel.name),
});
const modelProperty = model.properties![propertyName];

if (typeof modelProperty !== "boolean") {
injectIntoJsonSchemaDefinition(
model.properties![propertyName] as NextAdminJSONSchema,
{
primaryKey: dmmfField.isId,
kind: dmmfField.kind,
type: dmmfField.type as NextAdminJsonSchemaDataType,
disabled: isFieldDisabled(dmmfField),
isList: dmmfField.isList,
enum:
dmmfField.kind === "enum"
? { $ref: `#/definitions/${dmmfField.type}` }
: undefined,
relation: getRelationData(dmmf, dmmfField, dmmfModel.name),
}
);
}
});
});

Expand Down
16 changes: 9 additions & 7 deletions packages/json-schema/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { JSONSchema7Definition } from "json-schema";
import type { JSONSchema7Definition, JSONSchema7 } from "json-schema";

export type NextAdminJsonSchemaDataType =
| "BigInt"
Expand All @@ -19,7 +19,11 @@ export type NextAdminJsonSchemaRelation = {

export type NextAdminJsonSchemaData = {
primaryKey?: boolean;
kind: "scalar" | "object" | "enum" | "unsupported";
primaryKeyField?: {
name: string;
fields?: string[];
};
kind?: "scalar" | "object" | "enum" | "unsupported";
type?: NextAdminJsonSchemaDataType;
disabled?: boolean;
isList?: boolean;
Expand All @@ -29,14 +33,12 @@ export type NextAdminJsonSchemaData = {
relation?: NextAdminJsonSchemaRelation;
};

declare module "json-schema" {
interface JSONSchema7 {
__nextadmin?: NextAdminJsonSchemaData;
}
export interface NextAdminJSONSchema extends JSONSchema7 {
__nextadmin?: NextAdminJsonSchemaData;
}

export const injectIntoJsonSchemaDefinition = (
schema: JSONSchema7Definition,
schema: NextAdminJSONSchema,
data: NextAdminJsonSchemaData
) => {
if (typeof schema !== "object") {
Expand Down
1 change: 1 addition & 0 deletions packages/next-admin/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@
"zod": "^3.23.8"
},
"devDependencies": {
"@premieroctet/next-admin-json-schema": "workspace:^",
"@testing-library/react": "^14.1.2",
"@types/body-parser": "^1.19.2",
"@types/jest": "^29.5.1",
Expand Down
4 changes: 1 addition & 3 deletions packages/next-admin/src/components/Form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ const widgets: RjsfForm["props"]["widgets"] = {
const Form = ({
data,
schema,
dmmfSchema,
resource,
validation: validationProp,
customInputs,
Expand All @@ -109,7 +108,6 @@ const Form = ({
const { edit, id, ...schemas } = getSchemas(
data,
schema,
dmmfSchema,
modelOptions?.edit?.fields as EditFieldsOptions<typeof resource>
);
const { router } = useRouterInternal();
Expand Down Expand Up @@ -549,7 +547,7 @@ const Form = ({
extraErrors={extraErrors}
fields={fields}
disabled={allDisabled}
formContext={{ isPending, dmmfSchema }}
formContext={{ isPending, schema }}
templates={{
...templates,
ButtonTemplates: { SubmitButton: submitButton },
Expand Down
2 changes: 0 additions & 2 deletions packages/next-admin/src/components/FormHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ export default function FormHeader({
resource,
data,
schema,
dmmfSchema,
}: FormProps) {
const { t } = useI18n();
const { basePath, options } = useConfig();
Expand All @@ -36,7 +35,6 @@ export default function FormHeader({
const { edit, id } = getSchemas(
data,
schema,
dmmfSchema,
modelOptions?.edit?.fields as EditFieldsOptions<typeof resource>
);

Expand Down
4 changes: 2 additions & 2 deletions packages/next-admin/src/components/MainLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export const MainLayout = ({
options,
apiBasePath,
resourcesIdProperty,
dmmfSchema,
schema,
}: PropsWithChildren<Props>) => {
const mergedTranslations = merge({ ...defaultTranslations }, translations);
const localePath = locale ? `/${locale}` : "";
Expand All @@ -39,9 +39,9 @@ export const MainLayout = ({
basePath={`${localePath}${basePath}`}
isAppDir={isAppDir}
apiBasePath={apiBasePath}
dmmfSchema={dmmfSchema}
resource={resource}
resourcesIdProperty={resourcesIdProperty!}
schema={schema}
>
<I18nProvider translations={mergedTranslations}>
<ThemeProvider
Expand Down
4 changes: 1 addition & 3 deletions packages/next-admin/src/components/NextAdmin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ export function NextAdmin({
resources,
slug,
total,
dmmfSchema,
dashboard,
validation,
isAppDir,
Expand Down Expand Up @@ -83,7 +82,6 @@ export function NextAdmin({
data={data}
slug={slug}
schema={modelSchema}
dmmfSchema={dmmfSchema!}
resource={resource!}
validation={validation}
title={resourceTitle!}
Expand Down Expand Up @@ -127,8 +125,8 @@ export function NextAdmin({
user={user}
externalLinks={externalLinks}
options={options}
dmmfSchema={dmmfSchema}
resourcesIdProperty={resourcesIdProperty!}
schema={schema}
>
{renderMainComponent()}
</MainLayout>
Expand Down
15 changes: 10 additions & 5 deletions packages/next-admin/src/components/inputs/ArrayField.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
import { FieldProps } from "@rjsf/utils";
import MultiSelectWidget from "./MultiSelect/MultiSelectWidget";
import ScalarArrayField from "./ScalarArray/ScalarArrayField";
import type { Enumeration, FormProps } from "../../types";
import type { Enumeration, FormProps, ModelName } from "../../types";

const ArrayField = (props: FieldProps) => {
const { formData, onChange, name, disabled, schema, required, formContext } =
props;

const dmmfSchema = formContext.dmmfSchema as FormProps["dmmfSchema"];
const resourceDefinition: FormProps["schema"] = formContext.schema;

const dmmfField = dmmfSchema.find((field) => field.name === name);
const field =
resourceDefinition.properties[
name as keyof typeof resourceDefinition.properties
];

if (dmmfField?.kind === "scalar" && dmmfField?.isList) {
if (field?.__nextadmin?.kind === "scalar" && field?.__nextadmin?.isList) {
return (
<ScalarArrayField
name={name}
Expand All @@ -24,7 +27,9 @@ const ArrayField = (props: FieldProps) => {
}

const options =
dmmfField?.kind === "enum" ? (schema.enum as Enumeration[]) : undefined;
field?.__nextadmin?.kind === "enum"
? (schema.enum as Enumeration[])
: undefined;

return (
<MultiSelectWidget
Expand Down
6 changes: 3 additions & 3 deletions packages/next-admin/src/context/ConfigContext.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
"use client";
import { Prisma } from "@prisma/client";
import React, { useContext, useMemo } from "react";
import { ModelName, NextAdminOptions } from "../types";
import { ModelName, NextAdminOptions, Schema } from "../types";

export type ConfigContextType = {
options?: NextAdminOptions;
basePath: string;
isAppDir?: boolean;
apiBasePath: string;
resource?: ModelName;
dmmfSchema?: readonly Prisma.DMMF.Field[];
resourcesIdProperty: Record<ModelName, string> | null;
schema: Schema;
};

const ConfigContext = React.createContext<ConfigContextType>(
Expand All @@ -24,8 +24,8 @@ type ProviderProps = {
children: React.ReactNode;
isAppDir?: boolean;
resource?: ModelName;
dmmfSchema?: readonly Prisma.DMMF.Field[];
resourcesIdProperty: Record<ModelName, string> | null;
schema: Schema;
};

export const ConfigProvider = ({ children, ...props }: ProviderProps) => {
Expand Down
17 changes: 5 additions & 12 deletions packages/next-admin/src/handlers/resources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
ModelName,
NextAdminOptions,
Permission,
Schema,
SubmitResourceResponse,
UploadParameters,
} from "../types";
Expand All @@ -16,7 +17,6 @@ import { getDataItem } from "../utils/prisma";
import {
formattedFormData,
getModelIdProperty,
getPrismaModelForResource,
parseFormData,
} from "../utils/server";
import { uncapitalize } from "../utils/tools";
Expand Down Expand Up @@ -51,7 +51,7 @@ type SubmitResourceParams = {
body: Record<string, string | UploadParameters | null>;
id?: string | number;
options?: NextAdminOptions;
schema: any;
schema: Schema;
};

export const submitResource = async ({
Expand All @@ -64,8 +64,8 @@ export const submitResource = async ({
}: SubmitResourceParams): Promise<SubmitResourceResponse> => {
const { __admin_redirect: redirect, ...formValues } = body;

const dmmfSchema = getPrismaModelForResource(resource);
const parsedFormData = parseFormData(formValues, dmmfSchema?.fields!);
const schemaDefinition = schema.definitions[resource];
const parsedFormData = parseFormData(formValues, schemaDefinition);
const resourceIdField = getModelIdProperty(resource);

const fields = options?.model?.[resource]?.edit?.fields as EditFieldsOptions<
Expand All @@ -76,14 +76,7 @@ export const submitResource = async ({
validate(parsedFormData, fields);

const { formattedData, complementaryFormattedData, errors } =
await formattedFormData(
formValues,
dmmfSchema?.fields!,
schema,
resource,
id,
fields
);
await formattedFormData(formValues, schema, resource, id, fields);

if (errors.length) {
return {
Expand Down
14 changes: 10 additions & 4 deletions packages/next-admin/src/hooks/useSearchPaginatedResource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const useSearchPaginatedResource = ({
initialOptions,
}: UseSearchPaginatedResourceParams) => {
const [isPending, setIsPending] = useState(false);
const { apiBasePath, dmmfSchema, resource } = useConfig();
const { apiBasePath, schema, resource } = useConfig();
const searchPage = useRef(1);
const totalSearchedItems = useRef(0);
const [allOptions, setAllOptions] = useState<Enumeration[]>(
Expand All @@ -23,13 +23,19 @@ const useSearchPaginatedResource = ({
const runSearch = async (query: string, resetOptions = true) => {
const perPage = 25;

const fieldFromDmmf = dmmfSchema?.find((field) => field.name === fieldName);
const schemaResourceProperties = schema.definitions[resource!].properties;

if (!fieldFromDmmf) {
const schemaFieldEntry = Object.entries(schemaResourceProperties).find(
([key]) => key === fieldName
);

if (!schemaFieldEntry) {
return;
}

const model = fieldFromDmmf.type;
const [, schemaField] = schemaFieldEntry;

const model = schemaField.__nextadmin?.type;

try {
setIsPending(true);
Expand Down
1 change: 0 additions & 1 deletion packages/next-admin/src/pageHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import {
getResources,
schema,
} from "./utils/server";
import { getJsonSchema } from "./utils/jsonSchema";

type CreateAppHandlerParams<P extends string = "nextadmin"> = {
/**
Expand Down
Loading

0 comments on commit 5a03a7a

Please sign in to comment.