Switch to zod/mini

This commit is contained in:
Michael Telatynski
2025-09-23 17:06:57 +01:00
parent d8da6652b8
commit 8cba4eaf8b
5 changed files with 42 additions and 39 deletions
@@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details. Please see LICENSE files in the repository root for full details.
*/ */
import { z } from "zod"; import { z } from "zod/mini";
import { StaticConfig } from "../config"; import { StaticConfig } from "../config";
@@ -44,7 +44,7 @@ const UniventionCentralNavigation = z.object({
/** /**
* Its usually empty. * Its usually empty.
*/ */
keywords: z.object({}).optional(), keywords: z.optional(z.object({})),
}), }),
), ),
}), }),
+14 -12
View File
@@ -5,10 +5,12 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details. Please see LICENSE files in the repository root for full details.
*/ */
import { z, ZodSchema, ZodTypeDef } from "zod"; import { z, ZodMiniType, input } from "zod/mini";
import { Theme } from "./theme.ts"; import { Theme } from "./theme.ts";
z.config(z.locales.en());
const StaticConfig = z.object({ const StaticConfig = z.object({
type: z.literal("static"), type: z.literal("static"),
@@ -16,7 +18,7 @@ const StaticConfig = z.object({
* Alternative logo URL to display in the popover menu. * Alternative logo URL to display in the popover menu.
* Will use the main logo url if omitted. * Will use the main logo url if omitted.
*/ */
logo_url: z.string().url().optional(), logo_url: z.optional(z.url()),
/** /**
* Categories of links to display in the menu. * Categories of links to display in the menu.
@@ -35,7 +37,7 @@ const StaticConfig = z.object({
/** /**
* The URL to the icon. * The URL to the icon.
*/ */
icon_uri: z.string().url(), icon_uri: z.url(),
/** /**
* The label of the link. * The label of the link.
*/ */
@@ -43,11 +45,11 @@ const StaticConfig = z.object({
/** /**
* The destination URL of the link. * The destination URL of the link.
*/ */
link_url: z.string().url(), link_url: z.url(),
/** /**
* The browsing context in which the browser opens the link. * The browsing context in which the browser opens the link.
*/ */
target: z.string().optional(), target: z.optional(z.string()),
}), }),
), ),
}), }),
@@ -63,13 +65,13 @@ const UniventionConfig = z.object({
* Alternative logo URL to display in the popover menu. * Alternative logo URL to display in the popover menu.
* Will use the main logo url if omitted. * Will use the main logo url if omitted.
*/ */
logo_url: z.string().url().optional(), logo_url: z.optional(z.url()),
/** /**
* Base URL to an Intercom Service * Base URL to an Intercom Service
* https://docs.software-univention.de/intercom-service/latest/architecture.html#endpoints * https://docs.software-univention.de/intercom-service/latest/architecture.html#endpoints
*/ */
ics_url: z.string().url(), ics_url: z.url(),
}); });
export type UniventionConfig = z.infer<typeof UniventionConfig>; export type UniventionConfig = z.infer<typeof UniventionConfig>;
@@ -79,13 +81,13 @@ export const ModuleConfig = z.object({
* The URL of the portal logo.svg file. * The URL of the portal logo.svg file.
* @example `https://example.com/logo.svg` * @example `https://example.com/logo.svg`
*/ */
logo_url: z.string().url(), logo_url: z.url(),
/** /**
* The URL of the portal. * The URL of the portal.
* @example `https://example.com` * @example `https://example.com`
*/ */
logo_link_url: z.string().url(), logo_link_url: z.url(),
/** /**
* Configuration for the menu. * Configuration for the menu.
@@ -95,17 +97,17 @@ export const ModuleConfig = z.object({
/** /**
* Theme variable overrides, optional. * Theme variable overrides, optional.
*/ */
theme: Theme.default({}), theme: z.prefault(Theme, {}),
}); });
export type ModuleConfig = z.infer<typeof ModuleConfig>; export type ModuleConfig = z.infer<typeof ModuleConfig>;
export type ConfigSchema = ZodSchema<z.output<typeof ModuleConfig>, ZodTypeDef, z.input<typeof ModuleConfig>>; export type ConfigSchema = ZodMiniType<z.output<typeof ModuleConfig>, z.input<typeof ModuleConfig>>;
export const CONFIG_KEY = "io.element.element-web-modules.banner"; export const CONFIG_KEY = "io.element.element-web-modules.banner";
declare module "@element-hq/element-web-module-api" { declare module "@element-hq/element-web-module-api" {
export interface Config { export interface Config {
[CONFIG_KEY]: ConfigSchema["_input"]; [CONFIG_KEY]: input<ConfigSchema>;
} }
} }
+15 -15
View File
@@ -5,23 +5,23 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details. Please see LICENSE files in the repository root for full details.
*/ */
import { z } from "zod"; import { z } from "zod/mini";
export const Theme = z.object({ export const Theme = z.object({
textColor: z.string().default("var(--cpd-color-text-primary)"), textColor: z.prefault(z.string(), "var(--cpd-color-text-primary)"),
subheadingColor: z.string().default("var(--cpd-color-text-secondary)"), subheadingColor: z.prefault(z.string(), "var(--cpd-color-text-secondary)"),
bannerBackgroundColor: z.string().default("var(--cpd-color-bg-canvas-default)"), bannerBackgroundColor: z.prefault(z.string(), "var(--cpd-color-bg-canvas-default)"),
bannerHeight: z.string().default("60px"), bannerHeight: z.prefault(z.string(), "60px"),
triggerWidth: z.string().default("68px"), triggerWidth: z.prefault(z.string(), "68px"),
triggerBackgroundColor: z.string().default("var(--cpd-color-bg-subtle-secondary)"), triggerBackgroundColor: z.prefault(z.string(), "var(--cpd-color-bg-subtle-secondary)"),
triggerBackgroundColorHover: z.string().default("var(--cpd-color-bg-accent-hovered)"), triggerBackgroundColorHover: z.prefault(z.string(), "var(--cpd-color-bg-accent-hovered)"),
triggerBackgroundColorPressed: z.string().default("var(--cpd-color-bg-accent-pressed)"), triggerBackgroundColorPressed: z.prefault(z.string(), "var(--cpd-color-bg-accent-pressed)"),
triggerColor: z.string().default("var(--cpd-color-icon-primary)"), triggerColor: z.prefault(z.string(), "var(--cpd-color-icon-primary)"),
triggerColorContrast: z.string().default("var(--cpd-color-icon-on-solid-primary)"), triggerColorContrast: z.prefault(z.string(), "var(--cpd-color-icon-on-solid-primary)"),
menuWidth: z.string().default("320px"), menuWidth: z.prefault(z.string(), "320px"),
menuBackgroundColor: z.string().default("var(--cpd-color-bg-canvas-default)"), menuBackgroundColor: z.prefault(z.string(), "var(--cpd-color-bg-canvas-default)"),
menuButtonBackgroundColorHover: z.string().default("var(--cpd-color-bg-action-secondary-hovered)"), menuButtonBackgroundColorHover: z.prefault(z.string(), "var(--cpd-color-bg-action-secondary-hovered)"),
menuButtonBackgroundColorPressed: z.string().default("var(--cpd-color-bg-action-secondary-pressed)"), menuButtonBackgroundColorPressed: z.prefault(z.string(), "var(--cpd-color-bg-action-secondary-pressed)"),
}); });
export type Theme = z.infer<typeof Theme>; export type Theme = z.infer<typeof Theme>;
@@ -5,6 +5,8 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details. Please see LICENSE files in the repository root for full details.
*/ */
import { input } from "zod/mini";
import { test as base, expect } from "../../../../playwright/element-web-test.ts"; import { test as base, expect } from "../../../../playwright/element-web-test.ts";
import { type ConfigSchema } from "../src/config.ts"; import { type ConfigSchema } from "../src/config.ts";
@@ -39,7 +41,7 @@ test.describe("Banner", () => {
// We don't take a screenshot as we don't want to assert Element's styling, only our own // We don't take a screenshot as we don't want to assert Element's styling, only our own
}); });
const configs: ConfigSchema["_input"][] = [ const configs: input<ConfigSchema>[] = [
{ {
logo_url: "http://localhost:8080/logo.svg", logo_url: "http://localhost:8080/logo.svg",
logo_link_url: "https://example.com/portal", logo_link_url: "https://example.com/portal",
@@ -5,7 +5,9 @@ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details. Please see LICENSE files in the repository root for full details.
*/ */
import { z, ZodSchema, ZodTypeDef } from "zod"; import { z, ZodMiniType, input } from "zod/mini";
z.config(z.locales.en());
export const ModuleConfig = z.object({ export const ModuleConfig = z.object({
/** /**
@@ -13,33 +15,30 @@ export const ModuleConfig = z.object({
* must have the `synapse-restricted-guests-module` installed. * must have the `synapse-restricted-guests-module` installed.
* @example `https://synapse.local` * @example `https://synapse.local`
*/ */
guest_user_homeserver_url: z.string().url(), guest_user_homeserver_url: z.url(),
/** /**
* The username prefix that identifies guest users. * The username prefix that identifies guest users.
* @defaultValue `@guest-` * @defaultValue `@guest-`
*/ */
guest_user_prefix: z guest_user_prefix: z._default(z.string().check(z.regex(/@[a-zA-Z-_1-9]+/)), "@guest-"),
.string()
.regex(/@[a-zA-Z-_1-9]+/)
.default("@guest-"),
/** /**
* If true, the user will be forwarded to the login page instead of to the SSO * If true, the user will be forwarded to the login page instead of to the SSO
* login. This is only required if the home server has no SSO support. * login. This is only required if the home server has no SSO support.
* @defaultValue `false` * @defaultValue `false`
*/ */
skip_single_sign_on: z.boolean().default(false), skip_single_sign_on: z._default(z.boolean(), false),
}); });
export type ModuleConfig = z.infer<typeof ModuleConfig>; export type ModuleConfig = z.infer<typeof ModuleConfig>;
type ConfigSchema = ZodSchema<z.output<typeof ModuleConfig>, ZodTypeDef, z.input<typeof ModuleConfig>>; type ConfigSchema = ZodMiniType<z.output<typeof ModuleConfig>, z.input<typeof ModuleConfig>>;
export const CONFIG_KEY = "io.element.element-web-modules.restricted-guests"; export const CONFIG_KEY = "io.element.element-web-modules.restricted-guests";
declare module "@element-hq/element-web-module-api" { declare module "@element-hq/element-web-module-api" {
export interface Config { export interface Config {
[CONFIG_KEY]: ConfigSchema["_input"]; [CONFIG_KEY]: input<ConfigSchema>;
} }
} }