Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | /** * Matching Pairs Framework - Top-Level Factory * * `defineMatchingPairsGame()` takes a variant definition and produces * a complete GameDefinition, context hook, and validator. */ import { defineGame } from '../game-sdk/define-game' import type { GameManifest } from '../manifest-schema' import type { BaseMatchingCard, BaseMatchingConfig, MatchingPairsGameBundle, MatchingPairsVariant, } from './types' import { createMatchingPairsValidator } from './create-validator' import { createMatchingPairsProvider } from './create-provider' import { createMatchingPairsGameComponent } from './components/GenericGameComponent' export interface DefineMatchingPairsGameOptions< TCard extends BaseMatchingCard, TConfig extends BaseMatchingConfig, > { /** Game manifest (for the game registry) */ manifest: GameManifest /** The variant definition — the main extension point */ variant: MatchingPairsVariant<TCard, TConfig> /** Optional: Runtime config validation function */ validateConfig?: (config: unknown) => config is TConfig } /** * Define a complete matching-pairs game from a variant definition. * * Returns: * - `game`: A GameDefinition for the game registry * - `useMatchingPairs`: Context hook for the game's provider * - `validator`: Server-side validator instance */ export function defineMatchingPairsGame< TCard extends BaseMatchingCard, TConfig extends BaseMatchingConfig, >( options: DefineMatchingPairsGameOptions<TCard, TConfig> ): MatchingPairsGameBundle<TCard, TConfig> { const { manifest, variant, validateConfig } = options // Create the three main pieces const validator = createMatchingPairsValidator(variant) const { Provider, useMatchingPairs } = createMatchingPairsProvider(variant) const GameComponent = createMatchingPairsGameComponent(variant, useMatchingPairs) // Wire into the standard game SDK // Cast defaultConfig and validateConfig to satisfy GameConfig's index signature const game = defineGame({ manifest, Provider, GameComponent, validator: validator as any, // Safe: the validator satisfies GameValidator defaultConfig: variant.defaultConfig as any, validateConfig: validateConfig as any, }) return { game, useMatchingPairs, validator, } } |