Skip to content

Commit 75ba3f2

Browse files
refactor: remove central validation export to improve typescript performance (#2810)
* refactor: remove central validation export to improve typescript performance * fix: missing package exports change in validation package * chore: address pull request feedback
1 parent c1cd563 commit 75ba3f2

File tree

81 files changed

+449
-581
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

81 files changed

+449
-581
lines changed

apps/nextjs/src/app/[locale]/auth/invite/[id]/_registration-form.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { useZodForm } from "@homarr/form";
99
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
1010
import { useScopedI18n } from "@homarr/translation/client";
1111
import { CustomPasswordInput } from "@homarr/ui";
12-
import { validation } from "@homarr/validation";
12+
import { userRegistrationSchema } from "@homarr/validation/user";
1313

1414
interface RegistrationFormProps {
1515
invite: {
@@ -22,15 +22,15 @@ export const RegistrationForm = ({ invite }: RegistrationFormProps) => {
2222
const t = useScopedI18n("user");
2323
const router = useRouter();
2424
const { mutate, isPending } = clientApi.user.register.useMutation();
25-
const form = useZodForm(validation.user.registration, {
25+
const form = useZodForm(userRegistrationSchema, {
2626
initialValues: {
2727
username: "",
2828
password: "",
2929
confirmPassword: "",
3030
},
3131
});
3232

33-
const handleSubmit = (values: z.infer<typeof validation.user.registration>) => {
33+
const handleSubmit = (values: z.infer<typeof userRegistrationSchema>) => {
3434
mutate(
3535
{
3636
...values,

apps/nextjs/src/app/[locale]/auth/login/_login-form.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import type { useForm } from "@homarr/form";
1313
import { useZodForm } from "@homarr/form";
1414
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
1515
import { useScopedI18n } from "@homarr/translation/client";
16-
import { validation } from "@homarr/validation";
16+
import { userSignInSchema } from "@homarr/validation/user";
1717

1818
interface LoginFormProps {
1919
providers: string[];
@@ -22,7 +22,7 @@ interface LoginFormProps {
2222
callbackUrl: string;
2323
}
2424

25-
const extendedValidation = validation.user.signIn.extend({ provider: z.enum(["credentials", "ldap"]) });
25+
const extendedValidation = userSignInSchema.extend({ provider: z.enum(["credentials", "ldap"]) });
2626

2727
export const LoginForm = ({ providers, oidcClientName, isOidcAutoLoginEnabled, callbackUrl }: LoginFormProps) => {
2828
const t = useScopedI18n("user");

apps/nextjs/src/app/[locale]/boards/[name]/settings/_appereance.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { useDisclosure } from "@mantine/hooks";
2020

2121
import { useZodForm } from "@homarr/form";
2222
import { useI18n } from "@homarr/translation/client";
23-
import { validation } from "@homarr/validation";
23+
import { boardSavePartialSettingsSchema } from "@homarr/validation/board";
2424

2525
import type { Board } from "../../_types";
2626
import { generateColors } from "../../(content)/_theme";
@@ -35,7 +35,7 @@ const hexRegex = /^#[0-9a-fA-F]{6}$/;
3535
const progressPercentageLabel = (value: number) => `${value}%`;
3636

3737
export const ColorSettingsContent = ({ board }: Props) => {
38-
const form = useZodForm(validation.board.savePartialSettings, {
38+
const form = useZodForm(boardSavePartialSettingsSchema, {
3939
initialValues: {
4040
primaryColor: board.primaryColor,
4141
secondaryColor: board.secondaryColor,

apps/nextjs/src/app/[locale]/boards/[name]/settings/_background.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import type { TranslationObject } from "@homarr/translation";
1212
import { useI18n } from "@homarr/translation/client";
1313
import type { SelectItemWithDescriptionBadge } from "@homarr/ui";
1414
import { SelectWithDescriptionBadge } from "@homarr/ui";
15-
import { validation } from "@homarr/validation";
15+
import { boardSavePartialSettingsSchema } from "@homarr/validation/board";
1616

1717
import type { Board } from "../../_types";
1818
import { useSavePartialSettingsMutation } from "./_shared";
@@ -24,7 +24,7 @@ export const BackgroundSettingsContent = ({ board }: Props) => {
2424
const t = useI18n();
2525
const { data: session } = useSession();
2626
const { mutate: savePartialSettings, isPending } = useSavePartialSettingsMutation(board);
27-
const form = useZodForm(validation.board.savePartialSettings, {
27+
const form = useZodForm(boardSavePartialSettingsSchema, {
2828
initialValues: {
2929
backgroundImageUrl: board.backgroundImageUrl ?? "",
3030
backgroundImageAttachment: board.backgroundImageAttachment,

apps/nextjs/src/app/[locale]/boards/[name]/settings/_general.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { useUpdateBoard } from "@homarr/boards/updater";
88
import { useZodForm } from "@homarr/form";
99
import { IconPicker } from "@homarr/forms-collection";
1010
import { useI18n } from "@homarr/translation/client";
11-
import { validation } from "@homarr/validation";
11+
import { boardSavePartialSettingsSchema } from "@homarr/validation/board";
1212

1313
import { createMetaTitle } from "~/metadata";
1414
import type { Board } from "../../_types";
@@ -28,7 +28,7 @@ export const GeneralSettingsContent = ({ board }: Props) => {
2828

2929
const { mutate: savePartialSettings, isPending } = useSavePartialSettingsMutation(board);
3030
const form = useZodForm(
31-
validation.board.savePartialSettings
31+
boardSavePartialSettingsSchema
3232
.pick({
3333
pageTitle: true,
3434
logoImageUrl: true,

apps/nextjs/src/app/[locale]/boards/[name]/settings/_layout.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { clientApi } from "@homarr/api/client";
66
import { createId } from "@homarr/db/client";
77
import { useZodForm } from "@homarr/form";
88
import { useI18n } from "@homarr/translation/client";
9-
import { validation } from "@homarr/validation";
9+
import { boardSaveLayoutsSchema } from "@homarr/validation/board";
1010

1111
import type { Board } from "../../_types";
1212

@@ -22,7 +22,7 @@ export const LayoutSettingsContent = ({ board }: Props) => {
2222
void utils.board.getHomeBoard.invalidate();
2323
},
2424
});
25-
const form = useZodForm(validation.board.saveLayouts.omit({ id: true }).required(), {
25+
const form = useZodForm(boardSaveLayoutsSchema.omit({ id: true }).required(), {
2626
initialValues: {
2727
layouts: board.layouts,
2828
},

apps/nextjs/src/app/[locale]/init/_steps/group/init-group.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@ import { clientApi } from "@homarr/api/client";
88
import { revalidatePathActionAsync } from "@homarr/common/client";
99
import { useZodForm } from "@homarr/form";
1010
import { useI18n } from "@homarr/translation/client";
11-
import { validation } from "@homarr/validation";
11+
import { groupCreateSchema } from "@homarr/validation/group";
1212

1313
export const InitGroup = () => {
1414
const t = useI18n();
1515
const { mutateAsync } = clientApi.group.createInitialExternalGroup.useMutation();
16-
const form = useZodForm(validation.group.create, {
16+
const form = useZodForm(groupCreateSchema, {
1717
initialValues: {
1818
name: "",
1919
},
2020
});
2121

22-
const handleSubmitAsync = async (values: z.infer<typeof validation.group.create>) => {
22+
const handleSubmitAsync = async (values: z.infer<typeof groupCreateSchema>) => {
2323
await mutateAsync(values, {
2424
async onSuccess() {
2525
await revalidatePathActionAsync("/init");

apps/nextjs/src/app/[locale]/init/_steps/settings/init-settings.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ import type { CheckboxProps } from "@homarr/form/types";
1212
import { defaultServerSettings } from "@homarr/server-settings";
1313
import type { TranslationObject } from "@homarr/translation";
1414
import { useI18n, useScopedI18n } from "@homarr/translation/client";
15-
import { validation } from "@homarr/validation";
15+
import { settingsInitSchema } from "@homarr/validation/settings";
1616

1717
export const InitSettings = () => {
1818
const tSection = useScopedI18n("management.page.settings.section");
1919
const t = useI18n();
2020
const { mutateAsync } = clientApi.serverSettings.initSettings.useMutation();
21-
const form = useZodForm(validation.settings.init, { initialValues: defaultServerSettings });
21+
const form = useZodForm(settingsInitSchema, { initialValues: defaultServerSettings });
2222

2323
form.watch("analytics.enableGeneral", ({ value }) => {
2424
if (!value) {
@@ -30,7 +30,7 @@ export const InitSettings = () => {
3030
}
3131
});
3232

33-
const handleSubmitAsync = async (values: z.infer<typeof validation.settings.init>) => {
33+
const handleSubmitAsync = async (values: z.infer<typeof settingsInitSchema>) => {
3434
await mutateAsync(values, {
3535
async onSuccess() {
3636
await revalidatePathActionAsync("/init");

apps/nextjs/src/app/[locale]/init/_steps/user/init-user-form.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ import { useZodForm } from "@homarr/form";
1010
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
1111
import { useScopedI18n } from "@homarr/translation/client";
1212
import { CustomPasswordInput } from "@homarr/ui";
13-
import { validation } from "@homarr/validation";
13+
import { userInitSchema } from "@homarr/validation/user";
1414

1515
export const InitUserForm = () => {
1616
const t = useScopedI18n("user");
1717
const tUser = useScopedI18n("init.step.user");
1818
const { mutateAsync, isPending } = clientApi.user.initUser.useMutation();
19-
const form = useZodForm(validation.user.init, {
19+
const form = useZodForm(userInitSchema, {
2020
initialValues: {
2121
username: "",
2222
password: "",
@@ -74,4 +74,4 @@ export const InitUserForm = () => {
7474
);
7575
};
7676

77-
type FormType = z.infer<typeof validation.user.init>;
77+
type FormType = z.infer<typeof userInitSchema>;

apps/nextjs/src/app/[locale]/manage/apps/edit/[id]/_app-edit-form.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { revalidatePathActionAsync } from "@homarr/common/client";
1010
import { AppForm } from "@homarr/forms-collection";
1111
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
1212
import { useI18n, useScopedI18n } from "@homarr/translation/client";
13-
import type { validation } from "@homarr/validation";
13+
import type { appManageSchema } from "@homarr/validation/app";
1414

1515
interface AppEditFormProps {
1616
app: RouterOutputs["app"]["byId"];
@@ -40,7 +40,7 @@ export const AppEditForm = ({ app }: AppEditFormProps) => {
4040
});
4141

4242
const handleSubmit = useCallback(
43-
(values: z.infer<typeof validation.app.manage>) => {
43+
(values: z.infer<typeof appManageSchema>) => {
4444
mutate({
4545
id: app.id,
4646
...values,

apps/nextjs/src/app/[locale]/manage/integrations/edit/[id]/_integration-edit-form.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { convertIntegrationTestConnectionError } from "@homarr/integrations/clie
1414
import { useConfirmModal } from "@homarr/modals";
1515
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
1616
import { useI18n } from "@homarr/translation/client";
17-
import { validation } from "@homarr/validation";
17+
import { integrationUpdateSchema } from "@homarr/validation/integration";
1818

1919
import { SecretCard } from "../../_components/secrets/integration-secret-card";
2020
import { IntegrationSecretInput } from "../../_components/secrets/integration-secret-inputs";
@@ -32,7 +32,7 @@ export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => {
3232
) ?? getDefaultSecretKinds(integration.kind);
3333

3434
const router = useRouter();
35-
const form = useZodForm(validation.integration.update.omit({ id: true }), {
35+
const form = useZodForm(integrationUpdateSchema.omit({ id: true }), {
3636
initialValues: {
3737
name: integration.name,
3838
url: integration.url,
@@ -141,4 +141,4 @@ export const EditIntegrationForm = ({ integration }: EditIntegrationForm) => {
141141
);
142142
};
143143

144-
type FormType = Omit<z.infer<typeof validation.integration.update>, "id">;
144+
type FormType = Omit<z.infer<typeof integrationUpdateSchema>, "id">;

apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,21 @@ import { useZodForm } from "@homarr/form";
2727
import { convertIntegrationTestConnectionError } from "@homarr/integrations/client";
2828
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
2929
import { useI18n, useScopedI18n } from "@homarr/translation/client";
30-
import { validation } from "@homarr/validation";
30+
import { appHrefSchema } from "@homarr/validation/app";
31+
import { integrationCreateSchema } from "@homarr/validation/integration";
3132

3233
import { IntegrationSecretInput } from "../_components/secrets/integration-secret-inputs";
3334

3435
interface NewIntegrationFormProps {
35-
searchParams: Partial<z.infer<typeof validation.integration.create>> & {
36+
searchParams: Partial<z.infer<typeof integrationCreateSchema>> & {
3637
kind: IntegrationKind;
3738
};
3839
}
3940

40-
const formSchema = validation.integration.create.omit({ kind: true }).and(
41+
const formSchema = integrationCreateSchema.omit({ kind: true }).and(
4142
z.object({
4243
createApp: z.boolean(),
43-
appHref: validation.app.manage.shape.href,
44+
appHref: appHrefSchema,
4445
}),
4546
);
4647

apps/nextjs/src/app/[locale]/manage/integrations/new/page.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import type { IntegrationKind } from "@homarr/definitions";
77
import { getIntegrationName, integrationKinds } from "@homarr/definitions";
88
import { getScopedI18n } from "@homarr/translation/server";
99
import { IntegrationAvatar } from "@homarr/ui";
10-
import type { validation } from "@homarr/validation";
10+
import type { integrationCreateSchema } from "@homarr/validation/integration";
1111

1212
import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb";
1313
import { NewIntegrationForm } from "./_integration-new-form";
1414

1515
interface NewIntegrationPageProps {
1616
searchParams: Promise<
17-
Partial<z.infer<typeof validation.integration.create>> & {
17+
Partial<z.infer<typeof integrationCreateSchema>> & {
1818
kind: IntegrationKind;
1919
}
2020
>;

apps/nextjs/src/app/[locale]/manage/search-engines/_form.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import { useZodForm } from "@homarr/form";
1212
import { IconPicker } from "@homarr/forms-collection";
1313
import type { TranslationFunction } from "@homarr/translation";
1414
import { useI18n } from "@homarr/translation/client";
15-
import { validation } from "@homarr/validation";
15+
import { searchEngineManageSchema } from "@homarr/validation/search-engine";
1616

17-
type FormType = z.infer<typeof validation.searchEngine.manage>;
17+
type FormType = z.infer<typeof searchEngineManageSchema>;
1818

1919
interface SearchEngineFormProps {
2020
submitButtonTranslation: (t: TranslationFunction) => string;
@@ -30,7 +30,7 @@ export const SearchEngineForm = (props: SearchEngineFormProps) => {
3030

3131
const [integrationData] = clientApi.integration.allThatSupportSearch.useSuspenseQuery();
3232

33-
const form = useZodForm(validation.searchEngine.manage, {
33+
const form = useZodForm(searchEngineManageSchema, {
3434
initialValues: initialValues ?? {
3535
name: "",
3636
short: "",

apps/nextjs/src/app/[locale]/manage/search-engines/edit/[id]/_search-engine-edit-form.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { revalidatePathActionAsync } from "@homarr/common/client";
1010
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
1111
import type { TranslationFunction } from "@homarr/translation";
1212
import { useScopedI18n } from "@homarr/translation/client";
13-
import type { validation } from "@homarr/validation";
13+
import type { searchEngineManageSchema } from "@homarr/validation/search-engine";
1414

1515
import { SearchEngineForm } from "../../_form";
1616

@@ -41,7 +41,7 @@ export const SearchEngineEditForm = ({ searchEngine }: SearchEngineEditFormProps
4141
});
4242

4343
const handleSubmit = useCallback(
44-
(values: z.infer<typeof validation.searchEngine.manage>) => {
44+
(values: z.infer<typeof searchEngineManageSchema>) => {
4545
mutate({
4646
id: searchEngine.id,
4747
...values,

apps/nextjs/src/app/[locale]/manage/search-engines/new/_search-engine-new-form.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { revalidatePathActionAsync } from "@homarr/common/client";
99
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
1010
import type { TranslationFunction } from "@homarr/translation";
1111
import { useScopedI18n } from "@homarr/translation/client";
12-
import type { validation } from "@homarr/validation";
12+
import type { searchEngineManageSchema } from "@homarr/validation/search-engine";
1313

1414
import { SearchEngineForm } from "../_form";
1515

@@ -35,7 +35,7 @@ export const SearchEngineNewForm = () => {
3535
});
3636

3737
const handleSubmit = useCallback(
38-
(values: z.infer<typeof validation.searchEngine.manage>) => {
38+
(values: z.infer<typeof searchEngineManageSchema>) => {
3939
mutate(values);
4040
},
4141
[mutate],

apps/nextjs/src/app/[locale]/manage/tools/certificates/_components/add-certificate.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { useZodForm } from "@homarr/form";
1010
import { createModal, useModalAction } from "@homarr/modals";
1111
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
1212
import { useI18n } from "@homarr/translation/client";
13-
import { superRefineCertificateFile } from "@homarr/validation";
13+
import { superRefineCertificateFile } from "@homarr/validation/certificates";
1414

1515
export const AddCertificateButton = () => {
1616
const { openModal } = useModalAction(AddCertificateModal);

apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-home-board.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { revalidatePathActionAsync } from "@homarr/common/client";
99
import { useZodForm } from "@homarr/form";
1010
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
1111
import { useI18n } from "@homarr/translation/client";
12-
import { validation } from "@homarr/validation";
12+
import { userChangeHomeBoardsSchema } from "@homarr/validation/user";
1313

1414
import type { Board } from "~/app/[locale]/boards/_types";
1515
import { BoardSelect } from "~/components/board/board-select";
@@ -40,7 +40,7 @@ export const ChangeHomeBoardForm = ({ user, boardsData }: ChangeHomeBoardFormPro
4040
});
4141
},
4242
});
43-
const form = useZodForm(validation.user.changeHomeBoards, {
43+
const form = useZodForm(userChangeHomeBoardsSchema, {
4444
initialValues: {
4545
homeBoardId: user.homeBoardId,
4646
mobileHomeBoardId: user.mobileHomeBoardId,
@@ -82,4 +82,4 @@ export const ChangeHomeBoardForm = ({ user, boardsData }: ChangeHomeBoardFormPro
8282
);
8383
};
8484

85-
type FormType = z.infer<typeof validation.user.changeHomeBoards>;
85+
type FormType = z.infer<typeof userChangeHomeBoardsSchema>;

apps/nextjs/src/app/[locale]/manage/users/[userId]/general/_components/_change-search-preferences.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { revalidatePathActionAsync } from "@homarr/common/client";
99
import { useZodForm } from "@homarr/form";
1010
import { showErrorNotification, showSuccessNotification } from "@homarr/notifications";
1111
import { useI18n } from "@homarr/translation/client";
12-
import { validation } from "@homarr/validation";
12+
import { userChangeSearchPreferencesSchema } from "@homarr/validation/user";
1313

1414
interface ChangeSearchPreferencesFormProps {
1515
user: RouterOutputs["user"]["getById"];
@@ -37,7 +37,7 @@ export const ChangeSearchPreferencesForm = ({ user, searchEnginesData }: ChangeS
3737
});
3838
},
3939
});
40-
const form = useZodForm(validation.user.changeSearchPreferences, {
40+
const form = useZodForm(userChangeSearchPreferencesSchema, {
4141
initialValues: {
4242
defaultSearchEngineId: user.defaultSearchEngineId,
4343
openInNewTab: user.openSearchInNewTab,
@@ -75,4 +75,4 @@ export const ChangeSearchPreferencesForm = ({ user, searchEnginesData }: ChangeS
7575
);
7676
};
7777

78-
type FormType = z.infer<typeof validation.user.changeSearchPreferences>;
78+
type FormType = z.infer<typeof userChangeSearchPreferencesSchema>;

0 commit comments

Comments
 (0)