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