2.3.1 ā€¢ Published 17 days ago

@castore/command-zod v2.3.1

Weekly downloads
-
License
MIT
Repository
github
Last release
17 days ago

Zod Command

DRY Castore Command definition using zod.

šŸ“„ Installation

# npm
npm install @castore/command-zod

# yarn
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
npm install @castore/core zod

# yarn
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(),
});

// šŸ‘‡ generics are correctly inferred
const pokemonAppearCommand = new ZodCommand({
  commandId: 'POKEMON_APPEAR',
  requiredEventStores: tuple(pokemonsEventStore),
  inputSchema: pokemonAppearedInputSchema,
  outputSchema: pokemonAppearedOutputSchema,
  // šŸ‘‡ handler input/output types are correctly inferred
  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]) => {
    // ...same code
  },
});

āš™ļø 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;
// => pokemonAppearedInputSchema
  • outputSchema (?object): The command output zod schema
const outputSchema = pokemonAppearCommand.outputSchema;
// => pokemonAppearedOutputSchema
2.3.1

17 days ago

2.3.0

2 months ago

2.2.0

4 months ago

2.1.0

6 months ago