Zod Command
DRY Castore Command
definition using zod
.
📥 Installation
npm install @castore/command-zod
yarn add @castore/command-zod
This package has @castore/core
and zod
(above v3) as peer dependencies, so you will have to install them as well:
npm install @castore/core zod
yarn add @castore/core zod
👩💻 Usage
import z from 'zod';
import { ZodCommand } from '@castore/command-zod';
import { tuple } from '@castore/core';
const pokemonAppearedInputSchema = z.object({
name: z.string(),
level: z.number(),
});
const pokemonAppearedOutputSchema = z.object({
pokemonId: z.string().uuid(),
});
const pokemonAppearCommand = new ZodCommand({
commandId: 'POKEMON_APPEAR',
requiredEventStores: tuple(pokemonsEventStore),
inputSchema: pokemonAppearedInputSchema,
outputSchema: pokemonAppearedOutputSchema,
handler: async (
commandInput,
[pokemonsEventStore],
{ generateUuid }: { generateUuid: () => string },
) => {
const { name, level } = commandInput;
const pokemonId = generateUuid();
await pokemonsEventStore.pushEvent({
aggregateId: pokemonId,
version: 1,
type: 'POKEMON_APPEARED',
payload: { name, level },
});
return { pokemonId };
},
});
👇 Equivalent to:
import { Command } from '@castore/core';
type RequiredEventStores = [typeof pokemonsEventStore];
type CommandInput = { name: string; level: number };
type CommandOutput = { pokemonId: string };
const pokemonAppearCommand = new Command<
RequiredEventStores,
RequiredEventStores,
CommandInput,
CommandOutput
>({
commandId: 'POKEMON_APPEAR',
requiredEventStores: [pokemonsEventStore],
handler: async (commandInput, [pokemonsEventStore]) => {
},
});
⚙️ Properties & Methods
ZodCommand
implements the Command
class and adds the following properties to it:
inputSchema (?object)
: The command input zod schema
const inputSchema = pokemonAppearCommand.inputSchema;
outputSchema (?object)
: The command output zod schema
const outputSchema = pokemonAppearCommand.outputSchema;