@castore/json-schema-command
TypeScript icon, indicating that this package has built-in type declarations

1.25.3 • Public • Published

JSON Schema Command

DRY Castore Command definition using JSON Schemas and json-schema-to-ts.

📥 Installation

# npm
npm install @castore/json-schema-command

# yarn
yarn add @castore/json-schema-command

This package has @castore/core and json-schema-to-ts (above v2) as peer dependencies, so you will have to install them as well:

# npm
npm install @castore/core json-schema-to-ts

# yarn
yarn add @castore/core json-schema-to-ts

👩‍💻 Usage

import { tuple } from '@castore/core';
import { JSONSchemaCommand } from '@castore/json-schema-command';

const pokemonAppearedInputSchema = {
  type: 'object',
  properties: {
    name: { type: 'string' },
    level: { type: 'integer' },
  },
  required: ['name', 'level'],
  additionalProperties: false,
} as const; // 👈 Don't forget the "as const" statement
// (Cf json-schema-to-ts documentation)

const pokemonAppearedOutputSchema = {
  type: 'object',
  properties: {
    pokemonId: { type: 'string', format: 'uuid' },
  },
  required: ['pokemonId'],
  additionalProperties: false,
} as const;

// 👇 generics are correctly inferred
const pokemonAppearCommand = new JSONSchemaCommand({
  commandId: 'POKEMON_APPEAR',
  requiredEventStores: tuple(pokemonsEventStore),
  inputSchema: pokemonAppearedInputSchema,
  outputSchema: pokemonAppearedOutputSchema,
  // 👇 handler input/output types are correctly inferred
  handler: async (commandInput, [pokemonsEventStore]) => {
    const { name, level } = commandInput;
    const pokemonId = generateUuid();

    await pokemonsEventStore.pushEvent({
      aggregateId: pokemonId,
      version: 1,
      type: 'POKEMON_APPEARED',
      timestamp: new Date().toISOString(),
      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

JSONSchemaCommand implements the Command class and adds the following properties to it:

  • inputSchema (?object): The command input JSON schema
const inputSchema = pokemonAppearCommand.inputSchema;
// => pokemonAppearedInputSchema
  • outputSchema (?object): The command output JSON schema
const outputSchema = pokemonAppearCommand.outputSchema;
// => pokemonAppearedOutputSchema

Dependents (0)

Package Sidebar

Install

npm i @castore/json-schema-command

Weekly Downloads

119

Version

1.25.3

License

MIT

Unpacked Size

127 kB

Total Files

21

Last publish

Collaborators

  • thomasaribart
  • valentinbeggi
  • charlesgery
  • julietteff