diff --git a/src/client/index.test.ts b/src/client/index.test.ts index c4de6d70..1dc5ead4 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -6,67 +6,69 @@ import { RequestSchema, NotificationSchema, ResultSchema } from "../types.js"; /* Test that custom request/notification/result schemas can be used with the Client class. */ -const GetWeatherRequestSchema = RequestSchema.extend({ - method: z.literal("weather/get"), - params: z.object({ - city: z.string(), - }), -}); +test("should typecheck", () => { + const GetWeatherRequestSchema = RequestSchema.extend({ + method: z.literal("weather/get"), + params: z.object({ + city: z.string(), + }), + }); -const GetForecastRequestSchema = RequestSchema.extend({ - method: z.literal("weather/forecast"), - params: z.object({ - city: z.string(), - days: z.number(), - }), -}); + const GetForecastRequestSchema = RequestSchema.extend({ + method: z.literal("weather/forecast"), + params: z.object({ + city: z.string(), + days: z.number(), + }), + }); -const WeatherForecastNotificationSchema = NotificationSchema.extend({ - method: z.literal("weather/alert"), - params: z.object({ - severity: z.enum(["warning", "watch"]), - message: z.string(), - }), -}); + const WeatherForecastNotificationSchema = NotificationSchema.extend({ + method: z.literal("weather/alert"), + params: z.object({ + severity: z.enum(["warning", "watch"]), + message: z.string(), + }), + }); -const WeatherRequestSchema = GetWeatherRequestSchema.or( - GetForecastRequestSchema, -); -const WeatherNotificationSchema = WeatherForecastNotificationSchema; -const WeatherResultSchema = ResultSchema.extend({ - temperature: z.number(), - conditions: z.string(), -}); + const WeatherRequestSchema = GetWeatherRequestSchema.or( + GetForecastRequestSchema, + ); + const WeatherNotificationSchema = WeatherForecastNotificationSchema; + const WeatherResultSchema = ResultSchema.extend({ + temperature: z.number(), + conditions: z.string(), + }); -type WeatherRequest = z.infer; -type WeatherNotification = z.infer; -type WeatherResult = z.infer; + type WeatherRequest = z.infer; + type WeatherNotification = z.infer; + type WeatherResult = z.infer; -// Create a typed Client for weather data -const weatherClient = new Client< - WeatherRequest, - WeatherNotification, - WeatherResult ->({ - name: "WeatherClient", - version: "1.0.0", -}); + // Create a typed Client for weather data + const weatherClient = new Client< + WeatherRequest, + WeatherNotification, + WeatherResult + >({ + name: "WeatherClient", + version: "1.0.0", + }); -// Typecheck that only valid weather requests/notifications/results are allowed -weatherClient.request( - { - method: "weather/get", - params: { - city: "Seattle", + // Typecheck that only valid weather requests/notifications/results are allowed + weatherClient.request( + { + method: "weather/get", + params: { + city: "Seattle", + }, }, - }, - WeatherResultSchema, -); + WeatherResultSchema, + ); -weatherClient.notification({ - method: "weather/alert", - params: { - severity: "warning", - message: "Storm approaching", - }, + weatherClient.notification({ + method: "weather/alert", + params: { + severity: "warning", + message: "Storm approaching", + }, + }); }); diff --git a/src/server/index.test.ts b/src/server/index.test.ts index 4a9ac59e..e75edbed 100644 --- a/src/server/index.test.ts +++ b/src/server/index.test.ts @@ -6,63 +6,65 @@ import { RequestSchema, NotificationSchema, ResultSchema } from "../types.js"; /* Test that custom request/notification/result schemas can be used with the Server class. */ -const GetWeatherRequestSchema = RequestSchema.extend({ - method: z.literal("weather/get"), - params: z.object({ - city: z.string(), - }), +test("should typecheck", () => { + const GetWeatherRequestSchema = RequestSchema.extend({ + method: z.literal("weather/get"), + params: z.object({ + city: z.string(), + }), + }); + + const GetForecastRequestSchema = RequestSchema.extend({ + method: z.literal("weather/forecast"), + params: z.object({ + city: z.string(), + days: z.number(), + }), + }); + + const WeatherForecastNotificationSchema = NotificationSchema.extend({ + method: z.literal("weather/alert"), + params: z.object({ + severity: z.enum(["warning", "watch"]), + message: z.string(), + }), + }); + + const WeatherRequestSchema = GetWeatherRequestSchema.or( + GetForecastRequestSchema, + ); + const WeatherNotificationSchema = WeatherForecastNotificationSchema; + const WeatherResultSchema = ResultSchema.extend({ + temperature: z.number(), + conditions: z.string(), + }); + + type WeatherRequest = z.infer; + type WeatherNotification = z.infer; + type WeatherResult = z.infer; + + // Create a typed Server for weather data + const weatherServer = new Server< + WeatherRequest, + WeatherNotification, + WeatherResult + >({ + name: "WeatherServer", + version: "1.0.0", + }); + + // Typecheck that only valid weather requests/notifications/results are allowed + weatherServer.setRequestHandler(GetWeatherRequestSchema, (request) => { + return { + temperature: 72, + conditions: "sunny", + }; + }); + + weatherServer.setNotificationHandler( + WeatherForecastNotificationSchema, + (notification) => { + console.log(`Weather alert: ${notification.params.message}`); + }, + ); }); - -const GetForecastRequestSchema = RequestSchema.extend({ - method: z.literal("weather/forecast"), - params: z.object({ - city: z.string(), - days: z.number(), - }), -}); - -const WeatherForecastNotificationSchema = NotificationSchema.extend({ - method: z.literal("weather/alert"), - params: z.object({ - severity: z.enum(["warning", "watch"]), - message: z.string(), - }), -}); - -const WeatherRequestSchema = GetWeatherRequestSchema.or( - GetForecastRequestSchema, -); -const WeatherNotificationSchema = WeatherForecastNotificationSchema; -const WeatherResultSchema = ResultSchema.extend({ - temperature: z.number(), - conditions: z.string(), -}); - -type WeatherRequest = z.infer; -type WeatherNotification = z.infer; -type WeatherResult = z.infer; - -// Create a typed Server for weather data -const weatherServer = new Server< - WeatherRequest, - WeatherNotification, - WeatherResult ->({ - name: "WeatherServer", - version: "1.0.0", -}); - -// Typecheck that only valid weather requests/notifications/results are allowed -weatherServer.setRequestHandler(GetWeatherRequestSchema, (request) => { - return { - temperature: 72, - conditions: "sunny", - }; -}); - -weatherServer.setNotificationHandler( - WeatherForecastNotificationSchema, - (notification) => { - console.log(`Weather alert: ${notification.params.message}`); - }, -);