@dreamboard-games/sdk 0.5.0-alpha.2 → 0.5.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +462 -53
- package/dist/board-element-CqtxU5VZ.d.ts +13 -0
- package/dist/chunk-3RFGPBES.js +1792 -0
- package/dist/chunk-3RFGPBES.js.map +1 -0
- package/dist/chunk-CZRPUWCT.js +1602 -0
- package/dist/chunk-CZRPUWCT.js.map +1 -0
- package/dist/chunk-DMSXVMYY.js +7199 -0
- package/dist/chunk-DMSXVMYY.js.map +1 -0
- package/dist/chunk-U6R7FAH4.js +630 -0
- package/dist/chunk-U6R7FAH4.js.map +1 -0
- package/dist/chunk-YT3RPO5J.js +635 -0
- package/dist/chunk-YT3RPO5J.js.map +1 -0
- package/dist/diagnostics-ZAPEBlJP.d.ts +64 -0
- package/dist/extract-CwJWDrSD.d.ts +6850 -0
- package/dist/index.d.ts +5177 -1
- package/dist/index.js +1990 -6
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +158 -0
- package/dist/react.js +1119 -0
- package/dist/react.js.map +1 -0
- package/dist/reducer.d.ts +1028 -97
- package/dist/reducer.js +4892 -125
- package/dist/reducer.js.map +1 -1
- package/dist/shortcuts-B_RrufOM.d.ts +822 -0
- package/dist/testing.d.ts +529 -569
- package/dist/testing.js +2588 -934
- package/dist/testing.js.map +1 -1
- package/dist/types-BxXRINRF.d.ts +118 -0
- package/package.json +39 -144
- package/dist/HandView-Bi2lxzQP.d.ts +0 -79
- package/dist/ResourceCounter-BFxJknqp.d.ts +0 -98
- package/dist/ThemeProvider-CElaL2ik.d.ts +0 -99
- package/dist/attributes-DbvyMbXw.d.ts +0 -68
- package/dist/browser-interaction.d.ts +0 -910
- package/dist/browser-interaction.js +0 -119
- package/dist/browser-interaction.js.map +0 -1
- package/dist/chunk-32PFKDV7.js +0 -11705
- package/dist/chunk-32PFKDV7.js.map +0 -1
- package/dist/chunk-3BAD4VC2.js +0 -263
- package/dist/chunk-3BAD4VC2.js.map +0 -1
- package/dist/chunk-3SKDNDPG.js +0 -104
- package/dist/chunk-3SKDNDPG.js.map +0 -1
- package/dist/chunk-5YV2WHJ4.js +0 -25
- package/dist/chunk-5YV2WHJ4.js.map +0 -1
- package/dist/chunk-ANRB4XKA.js +0 -90
- package/dist/chunk-ANRB4XKA.js.map +0 -1
- package/dist/chunk-BI4G3PM2.js +0 -1864
- package/dist/chunk-BI4G3PM2.js.map +0 -1
- package/dist/chunk-EVCLTY4Q.js +0 -935
- package/dist/chunk-EVCLTY4Q.js.map +0 -1
- package/dist/chunk-GDPKTBUR.js +0 -564
- package/dist/chunk-GDPKTBUR.js.map +0 -1
- package/dist/chunk-H6VDGFL5.js +0 -2903
- package/dist/chunk-H6VDGFL5.js.map +0 -1
- package/dist/chunk-LR3ZTWQF.js +0 -5960
- package/dist/chunk-LR3ZTWQF.js.map +0 -1
- package/dist/chunk-PF7L4BMG.js +0 -117
- package/dist/chunk-PF7L4BMG.js.map +0 -1
- package/dist/chunk-PN5O6GG2.js +0 -32
- package/dist/chunk-PN5O6GG2.js.map +0 -1
- package/dist/chunk-PZ5AY32C.js +0 -10
- package/dist/chunk-PZ5AY32C.js.map +0 -1
- package/dist/chunk-S2JEDVWH.js +0 -7165
- package/dist/chunk-S2JEDVWH.js.map +0 -1
- package/dist/chunk-T3ZKNUZ7.js +0 -1
- package/dist/chunk-T3ZKNUZ7.js.map +0 -1
- package/dist/chunk-UGH54WZ2.js +0 -223
- package/dist/chunk-UGH54WZ2.js.map +0 -1
- package/dist/chunk-VCDWP5VL.js +0 -746
- package/dist/chunk-VCDWP5VL.js.map +0 -1
- package/dist/chunk-VDXOF4FW.js +0 -69
- package/dist/chunk-VDXOF4FW.js.map +0 -1
- package/dist/chunk-WHR5UW3F.js +0 -1988
- package/dist/chunk-WHR5UW3F.js.map +0 -1
- package/dist/chunk-Y75CFE77.js +0 -17
- package/dist/chunk-Y75CFE77.js.map +0 -1
- package/dist/chunk-Z7QCREWI.js +0 -3435
- package/dist/chunk-Z7QCREWI.js.map +0 -1
- package/dist/chunk-ZZGN2ATS.js +0 -1941
- package/dist/chunk-ZZGN2ATS.js.map +0 -1
- package/dist/components-gAbIz7hK.d.ts +0 -1284
- package/dist/definitions-BgmV_GhC.d.ts +0 -300
- package/dist/diagnostics-DIi3ina7.d.ts +0 -50
- package/dist/digest.d.ts +0 -8
- package/dist/game-CsZScpcn.d.ts +0 -763
- package/dist/hex-board-view-aKkblDp6.d.ts +0 -1228
- package/dist/index-CcT9Q7N7.d.ts +0 -193
- package/dist/index.d-DjzoK7zn.d.ts +0 -2101
- package/dist/package-set.d.ts +0 -13
- package/dist/package-set.js +0 -12
- package/dist/package-set.js.map +0 -1
- package/dist/player-state-Cqpyeql0.d.ts +0 -371
- package/dist/plugin-runtime-contract.d.ts +0 -17
- package/dist/plugin-runtime-contract.js +0 -92
- package/dist/plugin-runtime-contract.js.map +0 -1
- package/dist/primitive-props-BNHDkgd7.d.ts +0 -16
- package/dist/protocol-dYgafTYY.d.ts +0 -314
- package/dist/reducer/advanced.d.ts +0 -82
- package/dist/reducer/advanced.js +0 -51
- package/dist/reducer/advanced.js.map +0 -1
- package/dist/reducer-contract.d.ts +0 -11
- package/dist/reducer-contract.js +0 -16
- package/dist/reducer-contract.js.map +0 -1
- package/dist/reference-games/index.d.ts +0 -31
- package/dist/reference-games/index.js +0 -48
- package/dist/reference-games/index.js.map +0 -1
- package/dist/runtime/primitives.d.ts +0 -250
- package/dist/runtime/primitives.js +0 -189
- package/dist/runtime/primitives.js.map +0 -1
- package/dist/runtime/runtime-api.d.ts +0 -2
- package/dist/runtime/runtime-api.js +0 -1
- package/dist/runtime/runtime-api.js.map +0 -1
- package/dist/runtime/workspace-contract.d.ts +0 -392
- package/dist/runtime/workspace-contract.js +0 -28
- package/dist/runtime/workspace-contract.js.map +0 -1
- package/dist/runtime-RJ5orDJU.d.ts +0 -1699
- package/dist/runtime-api-Bz5pwNU_.d.ts +0 -296
- package/dist/runtime-json-CQ9QbLZ5.d.ts +0 -5
- package/dist/runtime.d.ts +0 -83
- package/dist/runtime.js +0 -242
- package/dist/runtime.js.map +0 -1
- package/dist/schema.d.ts +0 -379
- package/dist/stale-contract-artifact-error-XLaweZtF.d.ts +0 -18
- package/dist/testing-compiler.d.ts +0 -37
- package/dist/testing-compiler.js +0 -272
- package/dist/testing-compiler.js.map +0 -1
- package/dist/testing-runtime.d.ts +0 -119
- package/dist/testing-runtime.js +0 -212
- package/dist/testing-runtime.js.map +0 -1
- package/dist/types-DJj5MJkl.d.ts +0 -256
- package/dist/types-DR7DoB1x.d.ts +0 -28
- package/dist/types-JWCYHmu7.d.ts +0 -122
- package/dist/types.d.ts +0 -1958
- package/dist/types.js +0 -14
- package/dist/types.js.map +0 -1
- package/dist/ui/components.d.ts +0 -17
- package/dist/ui/components.js +0 -216
- package/dist/ui/components.js.map +0 -1
- package/dist/ui/defaults.d.ts +0 -19
- package/dist/ui/defaults.js +0 -104
- package/dist/ui/defaults.js.map +0 -1
- package/dist/ui/player-state.d.ts +0 -2
- package/dist/ui/player-state.js +0 -1
- package/dist/ui/player-state.js.map +0 -1
- package/dist/ui/plugin-styles.css +0 -2
- package/dist/ui-contract-GTUPkf8z.d.ts +0 -1168
- package/dist/ui.d.ts +0 -317
- package/dist/ui.js +0 -277
- package/dist/ui.js.map +0 -1
- package/dist/views-BpuWcOyN.d.ts +0 -1641
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/domain/per-player-instance.ts","../src/shared/domain/board-element.ts","../src/shared/domain/tile-space.ts","../src/shared/runtime-json.ts","../src/shared/protocol/json.ts","../src/shared/position-target.ts","../src/shared/immutable.ts","../src/shared/domain/board-coordinates.ts","../src/shared/hex-board.ts","../src/shared/board-topology.ts","../src/shared/board-topology-schema.ts","../src/shared/domain/player-identity.ts","../src/shared/domain/seat-reference.ts","../src/shared/tile-appearance.ts","../src/shared/seat-topology-schema.ts","../src/shared/domain/tile-disclosure.ts","../src/shared/domain/tile-placement.ts","../src/shared/lookup.ts","../src/shared/board-target.ts","../src/shared/input-domain.ts"],"sourcesContent":["import * as z from \"zod\";\n\n/** Authored identities exclude this prefix; canonical generated instances own it. */\nexport const GENERATED_ID_PREFIX = \"@db/\";\n\nconst instanceTuple = z.tuple([\n z.enum([\"board\", \"card\", \"piece\", \"die\", \"tile\"]),\n z.string().min(1),\n z.string().min(1),\n]);\nexport type PerPlayerInstanceFamily = z.infer<typeof instanceTuple>[0];\n\ndeclare const instanceIdentity: unique symbol;\nexport type PerPlayerInstanceId<\n Family extends PerPlayerInstanceFamily = PerPlayerInstanceFamily,\n BaseId extends string = string,\n> = string & {\n readonly [instanceIdentity]: {\n readonly family: Family;\n readonly baseId: BaseId;\n };\n};\n\n/** The base already includes seed expansion; roster membership is a separate check. */\nexport function perPlayerInstanceId<\n Family extends PerPlayerInstanceFamily,\n BaseId extends string,\n>(\n family: Family,\n baseId: BaseId,\n playerId: string,\n): PerPlayerInstanceId<Family, BaseId> {\n instanceTuple.parse([family, baseId, playerId]);\n // Only this validated encoder constructs the identity's phantom witness.\n return `${GENERATED_ID_PREFIX}${JSON.stringify([family, baseId, playerId])}` as PerPlayerInstanceId<\n Family,\n BaseId\n >;\n}\n\nexport interface ParsedPerPlayerInstance {\n readonly id: PerPlayerInstanceId;\n readonly family: PerPlayerInstanceFamily;\n readonly baseId: string;\n readonly playerId: string;\n}\n\n/** Decode canonical syntax only. A decoded identity may still be absent from a table. */\nexport function parsePerPlayerInstanceId(\n value: unknown,\n): ParsedPerPlayerInstance | null {\n if (typeof value !== \"string\" || !value.startsWith(GENERATED_ID_PREFIX))\n return null;\n let candidate: unknown;\n try {\n candidate = JSON.parse(value.slice(GENERATED_ID_PREFIX.length));\n } catch {\n return null;\n }\n const parsed = instanceTuple.safeParse(candidate);\n if (!parsed.success) return null;\n const [family, baseId, playerId] = parsed.data;\n const id = perPlayerInstanceId(family, baseId, playerId);\n if (id !== value) return null;\n return { id, family, baseId, playerId };\n}\n\n/** Admit canonical instances only for one declared family and expanded base set. */\nexport function perPlayerInstanceSchema<\n Family extends PerPlayerInstanceFamily,\n BaseId extends string,\n>(family: Family, bases: readonly BaseId[]) {\n const known = new Set<string>(bases);\n return z.custom<PerPlayerInstanceId<Family, BaseId>>(\n (value): value is PerPlayerInstanceId<Family, BaseId> => {\n const parsed = parsePerPlayerInstanceId(value);\n return parsed?.family === family && known.has(parsed.baseId);\n },\n { error: \"Expected a canonical instance of a declared family and base.\" },\n );\n}\n","import * as z from \"zod\";\nimport { GENERATED_ID_PREFIX } from \"./per-player-instance.js\";\nimport type { BoardEdgeId, BoardVertexId } from \"./board-identities.js\";\n\nconst elementTuple = z.tuple([\n z.enum([\"board-edge\", \"board-vertex\"]),\n z.enum([\"hex\", \"square\"]),\n z.string().min(1),\n z.string().min(1),\n]);\nfunction validLattice(\n kind: \"board-edge\" | \"board-vertex\",\n layout: \"hex\" | \"square\",\n value: string,\n): boolean {\n const pattern =\n layout === \"hex\"\n ? kind === \"board-edge\"\n ? /^(-?\\d+),(-?\\d+):e[012]$/\n : /^(-?\\d+),(-?\\d+):v[01]$/\n : kind === \"board-edge\"\n ? /^(-?\\d+),(-?\\d+):[hv]$/\n : /^(-?\\d+),(-?\\d+)$/;\n const match = pattern.exec(value);\n return (\n match !== null &&\n [match[1], match[2]].every(\n (part) =>\n Number.isSafeInteger(Number(part)) && String(Number(part)) === part,\n )\n );\n}\nfunction encode(\n kind: \"board-edge\" | \"board-vertex\",\n layout: \"hex\" | \"square\",\n boardId: string,\n latticeId: string,\n): string {\n elementTuple.parse([kind, layout, boardId, latticeId]);\n if (!validLattice(kind, layout, latticeId))\n throw new Error(\"Invalid canonical board lattice identity.\");\n return `${GENERATED_ID_PREFIX}${JSON.stringify([kind, layout, boardId, latticeId])}`;\n}\nexport function boardEdgeId<BoardId extends string>(\n layout: \"hex\" | \"square\",\n boardId: BoardId,\n latticeId: string,\n): BoardEdgeId<BoardId> {\n return encode(\n \"board-edge\",\n layout,\n boardId,\n latticeId,\n ) as BoardEdgeId<BoardId>;\n}\nexport function boardVertexId<BoardId extends string>(\n layout: \"hex\" | \"square\",\n boardId: BoardId,\n latticeId: string,\n): BoardVertexId<BoardId> {\n return encode(\n \"board-vertex\",\n layout,\n boardId,\n latticeId,\n ) as BoardVertexId<BoardId>;\n}\n/** Syntax proves namespace only; current placement owns element membership. */\nexport function parseBoardElementId(value: unknown): {\n kind: \"edge\" | \"vertex\";\n layout: \"hex\" | \"square\";\n boardId: string;\n latticeId: string;\n} | null {\n if (typeof value !== \"string\" || !value.startsWith(GENERATED_ID_PREFIX))\n return null;\n let candidate: unknown;\n try {\n candidate = JSON.parse(value.slice(GENERATED_ID_PREFIX.length));\n } catch {\n return null;\n }\n const parsed = elementTuple.safeParse(candidate);\n if (!parsed.success) return null;\n const [kind, layout, boardId, latticeId] = parsed.data;\n if (\n !validLattice(kind, layout, latticeId) ||\n encode(kind, layout, boardId, latticeId) !== value\n )\n return null;\n return {\n kind: kind === \"board-edge\" ? \"edge\" : \"vertex\",\n layout,\n boardId,\n latticeId,\n };\n}\n","import * as z from \"zod\";\nimport { GENERATED_ID_PREFIX } from \"./per-player-instance.js\";\n\nconst tileSpaceTuple = z.tuple([\n z.literal(\"tile-space\"),\n z.string().min(1),\n z.string().min(1),\n]);\ndeclare const tileSpaceIdentity: unique symbol;\nexport type TileSpaceId<\n TileId extends string = string,\n CellId extends string = string,\n> = string & {\n readonly [tileSpaceIdentity]: {\n readonly tileId: TileId;\n readonly cellId: CellId;\n };\n};\n\n/** Encode stable cell identity; membership and placement are admitted against current state. */\nexport function tileSpaceId<TileId extends string, CellId extends string>(\n tileId: TileId,\n cellId: CellId,\n): TileSpaceId<TileId, CellId> {\n tileSpaceTuple.parse([\"tile-space\", tileId, cellId]);\n\n return `${GENERATED_ID_PREFIX}${JSON.stringify([\"tile-space\", tileId, cellId])}` as TileSpaceId<\n TileId,\n CellId\n >;\n}\n\n/** Decode canonical syntax only; membership and placement require current state admission. */\nexport function parseTileSpaceId(\n value: unknown,\n): { readonly tileId: string; readonly cellId: string } | null {\n if (typeof value !== \"string\" || !value.startsWith(GENERATED_ID_PREFIX))\n return null;\n let candidate: unknown;\n try {\n candidate = JSON.parse(value.slice(GENERATED_ID_PREFIX.length));\n } catch {\n return null;\n }\n const parsed = tileSpaceTuple.safeParse(candidate);\n if (!parsed.success) return null;\n const [, tileId, cellId] = parsed.data;\n if (tileSpaceId(tileId, cellId) !== value) return null;\n return { tileId, cellId };\n}\n","import * as z from \"zod\";\nimport { en } from \"zod/locales\";\n\n// Preserve English errors without retaining Zod's complete locale namespace.\nz.config(en());\n\n/** JSON values shared by protocol and game-owned runtime state. */\nexport const RuntimeJsonSchema = z.json();\nexport type RuntimeJson = z.infer<typeof RuntimeJsonSchema>;\n\n/** Recursive JSON presentation values without expanding the schema's recursive inference. */\nexport type ReadonlyRuntimeJson =\n | string\n | number\n | boolean\n | null\n | readonly ReadonlyRuntimeJson[]\n | { readonly [key: string]: ReadonlyRuntimeJson };\ntype ReadonlyMembers<T> = T extends string | number | boolean | null | undefined\n ? T\n : T extends readonly unknown[]\n ? { readonly [K in keyof T]: ReadonlyRuntimeData<T[K]> }\n : T extends object\n ? { readonly [K in keyof T]: ReadonlyRuntimeData<T[K]> }\n : T;\n/** Preserve exact fields, tuple members and branded primitives while freezing data. */\nexport type ReadonlyRuntimeData<T> = RuntimeJson extends T\n ? [T] extends [RuntimeJson]\n ? ReadonlyRuntimeJson\n : ReadonlyMembers<T>\n : ReadonlyRuntimeJson extends T\n ? [T] extends [ReadonlyRuntimeJson]\n ? ReadonlyRuntimeJson\n : ReadonlyMembers<T>\n : ReadonlyMembers<T>;\n","import { sha256 } from \"@noble/hashes/sha2.js\";\nimport { bytesToHex, utf8ToBytes } from \"@noble/hashes/utils.js\";\n\nimport { RuntimeJsonSchema, type RuntimeJson } from \"../runtime-json.js\";\n\nexport function canonicalizePluginRuntimeJson(value: unknown): RuntimeJson {\n return canonicalizeJson(\n RuntimeJsonSchema.parse(omitOptionalProperties(value)),\n );\n}\n\nexport function encodeCanonicalPluginRuntimeJson(value: unknown): string {\n return JSON.stringify(canonicalizePluginRuntimeJson(value));\n}\n\nexport function digestPluginRuntimeJson(value: unknown): string {\n return `sha256:${sha256Hex(encodeCanonicalPluginRuntimeJson(value))}`;\n}\n\nfunction canonicalizeJson(value: RuntimeJson): RuntimeJson {\n if (\n value === null ||\n typeof value === \"boolean\" ||\n typeof value === \"string\"\n ) {\n return value;\n }\n if (typeof value === \"number\") return value;\n if (Array.isArray(value)) {\n return value.map((item) => canonicalizeJson(item));\n }\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))\n .map(([key, item]) => [key, canonicalizeJson(item)]),\n );\n}\n\n// Authored descriptors may explicitly carry undefined optional properties.\n// Omit only those JSON object fields; z.json rejects every other unsupported value.\nfunction omitOptionalProperties(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(omitOptionalProperties);\n if (\n value !== null &&\n typeof value === \"object\" &&\n (Object.getPrototypeOf(value) === Object.prototype ||\n Object.getPrototypeOf(value) === null)\n ) {\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, item]) => item !== undefined)\n .map(([key, item]) => [key, omitOptionalProperties(item)]),\n );\n }\n return value;\n}\n\nfunction sha256Hex(input: string): string {\n return bytesToHex(sha256(utf8ToBytes(input)));\n}\n","import * as z from \"zod\";\n\n/**\n * An insertion point in one zone host's order. `index` counts the\n * components there now: 0 is before the first, the zone's size after the\n * last. Moving a component within its own zone, both points beside it leave\n * it where it is.\n */\nexport type PositionTarget<\n ZoneId extends string = string,\n HostId extends string = string,\n> = {\n readonly zoneId: ZoneId;\n readonly hostId: HostId;\n readonly index: number;\n};\n\nexport const PositionTargetSchema = z.strictObject({\n zoneId: z.string(),\n hostId: z.string(),\n index: z.number().int().nonnegative(),\n});\n\nexport function isPositionTarget(value: unknown): value is PositionTarget {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Object.keys(value).length === 3 &&\n \"zoneId\" in value &&\n typeof value.zoneId === \"string\" &&\n \"hostId\" in value &&\n typeof value.hostId === \"string\" &&\n \"index\" in value &&\n Number.isSafeInteger(value.index) &&\n (value.index as number) >= 0\n );\n}\n\n/** Every insertion point in the given zone hosts, in zone order. */\nexport function zonePositions(\n zones: readonly {\n readonly zoneId: string;\n readonly hostId: string;\n readonly size: number;\n }[],\n): PositionTarget[] {\n return zones.flatMap(({ zoneId, hostId, size }) =>\n Array.from({ length: size + 1 }, (_, index) => ({ zoneId, hostId, index })),\n );\n}\n","/** Runtime snapshots and derived data cannot be changed by their caller. */\nexport function immutableCopy<T>(value: T): T {\n return freeze(structuredClone(value));\n}\nfunction freeze<T>(value: T): T {\n if (value !== null && typeof value === \"object\") {\n for (const child of Object.values(value)) freeze(child);\n Object.freeze(value);\n }\n return value;\n}\n","/** Coordinate sums and pairwise differences remain exact inside this domain. */\nexport const MAXIMUM_BOARD_COORDINATE = Math.floor(Number.MAX_SAFE_INTEGER / 4);\n","import { boardEdgeId, boardVertexId } from \"./domain/board-element.js\";\nimport { MAXIMUM_BOARD_COORDINATE } from \"./domain/board-coordinates.js\";\nimport type { BoardEdgeId, BoardVertexId } from \"./domain/board-identities.js\";\nimport {\n defineHex,\n Grid,\n Orientation,\n ring as ringTraversal,\n line as lineTraversal,\n type Point,\n} from \"honeycomb-grid\";\n\nexport type AxialCoordinate = { readonly q: number; readonly r: number };\nexport type HexBoardOrientation =\n import(\"./board-topology-schema.js\").HexBoardTopology[\"orientation\"];\nexport type HexBoardSpace<Id extends string = string> = AxialCoordinate & {\n id: Id;\n};\n// Cube-coordinate sums and pairwise differences remain exact in this domain.\nconst maximumCoordinate = MAXIMUM_BOARD_COORDINATE;\nconst coordinateKey = ({ q, r }: AxialCoordinate) => `${q},${r}`;\nconst directions: readonly AxialCoordinate[] = [\n { q: 1, r: 0 },\n { q: 0, r: 1 },\n { q: -1, r: 1 },\n { q: -1, r: 0 },\n { q: 0, r: -1 },\n { q: 1, r: -1 },\n];\nconst add = (a: AxialCoordinate, b: AxialCoordinate): AxialCoordinate => ({\n q: a.q + b.q,\n r: a.r + b.r,\n});\nfunction edgeKey(hex: AxialCoordinate, side: number): string {\n return side < 3\n ? `${coordinateKey(hex)}:e${side}`\n : edgeKey(add(hex, directions[side]), side - 3);\n}\nfunction vertexCoordinates(hex: AxialCoordinate, corner: number) {\n return [\n hex,\n add(hex, directions[corner]),\n add(hex, directions[(corner + 1) % 6]),\n ];\n}\nfunction vertexKey(hex: AxialCoordinate, corner: number): string {\n const hexes = vertexCoordinates(hex, corner);\n for (const base of hexes) {\n for (let shape = 0; shape < 2; shape++) {\n if (\n [directions[shape], directions[shape + 1]].every((offset) =>\n hexes.some(\n (hex) => coordinateKey(hex) === coordinateKey(add(base, offset)),\n ),\n )\n )\n return `${coordinateKey(base)}:v${shape}`;\n }\n }\n throw new Error(\"Invalid hex vertex.\");\n}\nconst compare = (a: string, b: string) => (a < b ? -1 : a > b ? 1 : 0);\n\nfunction hexClass(orientation: HexBoardOrientation, dimensions = 1) {\n return defineHex({\n dimensions,\n orientation: orientation === \"flat\" ? Orientation.FLAT : Orientation.POINTY,\n origin: { x: 0, y: 0 },\n });\n}\n\nexport type HexTopologyEdge<BoardId extends string> = {\n id: BoardEdgeId<BoardId>;\n spaceIds: string[];\n vertexIds: [BoardVertexId<BoardId>, BoardVertexId<BoardId>];\n};\nexport type HexTopologyVertex<BoardId extends string> = {\n id: BoardVertexId<BoardId>;\n spaceIds: string[];\n edgeIds: BoardEdgeId<BoardId>[];\n};\n\n/** One immutable topology for materialization, rules, layout, and hit testing. */\nexport function createHexTopology<\n const BoardId extends string,\n SpaceId extends string,\n>(board: {\n id: BoardId;\n orientation?: HexBoardOrientation;\n spaces: readonly HexBoardSpace<SpaceId>[];\n}) {\n const boardId = board.id;\n const spaces = board.spaces\n .map(({ id, q, r }) => ({ id, q, r }))\n .sort((a, b) => compare(a.id, b.id));\n for (const space of spaces) {\n if (!Number.isSafeInteger(space.q) || !Number.isSafeInteger(space.r))\n throw new Error(\"Hex coordinates must be safe integers.\");\n if (\n Math.abs(space.q) > maximumCoordinate ||\n Math.abs(space.r) > maximumCoordinate\n )\n throw new Error(\n `Hex coordinates must be within +/-${maximumCoordinate} for exact cube arithmetic and safe one-step neighbours.`,\n );\n }\n const orientation = board.orientation ?? \"pointy\";\n const grid = new Grid(hexClass(orientation), spaces);\n const spacesById = new Map(spaces.map((space) => [space.id, space]));\n if (spacesById.size !== spaces.length || grid.size !== spaces.length)\n throw new Error(\n `Hex board '${boardId}' contains duplicate space IDs or coordinates.`,\n );\n const spacesByCoordinate = new Map(\n spaces.map((space) => [coordinateKey(space), space]),\n );\n const cornersBySpace = new Map<SpaceId, BoardVertexId<BoardId>[]>();\n const edgesBySpace = new Map<SpaceId, BoardEdgeId<BoardId>[]>();\n const edgesById = new Map<BoardEdgeId<BoardId>, HexTopologyEdge<BoardId>>();\n const verticesById = new Map<\n BoardVertexId<BoardId>,\n HexTopologyVertex<BoardId>\n >();\n const vertexPoints = new Map<BoardVertexId<BoardId>, Point>();\n const Tile = hexClass(orientation);\n const cornerId = (space: AxialCoordinate, corner: number) =>\n boardVertexId(\"hex\", boardId, vertexKey(space, corner));\n for (const space of spaces) {\n const cornerIds = Array.from({ length: 6 }, (_, corner) =>\n cornerId(space, corner),\n );\n cornersBySpace.set(space.id, cornerIds);\n const edgeIds = Array.from({ length: 6 }, (_, side) => {\n const id = boardEdgeId(\"hex\", boardId, edgeKey(space, side));\n let edge = edgesById.get(id);\n if (!edge) {\n edge = {\n id,\n spaceIds: [],\n vertexIds: [cornerIds[(side + 5) % 6], cornerIds[side]].sort(\n compare,\n ) as [BoardVertexId<BoardId>, BoardVertexId<BoardId>],\n };\n edgesById.set(id, edge);\n }\n edge.spaceIds.push(space.id);\n return id;\n });\n edgesBySpace.set(space.id, edgeIds);\n cornerIds.forEach((id, corner) => {\n let vertex = verticesById.get(id);\n if (!vertex) {\n vertex = { id, spaceIds: [], edgeIds: [] };\n verticesById.set(id, vertex);\n const centers = vertexCoordinates(space, corner).map(\n (coordinate) => new Tile(coordinate),\n );\n vertexPoints.set(id, {\n x: centers.reduce((sum, hex) => sum + hex.x, 0) / 3,\n y: centers.reduce((sum, hex) => sum + hex.y, 0) / 3,\n });\n }\n vertex.spaceIds.push(space.id);\n for (const edgeId of [edgeIds[corner], edgeIds[(corner + 1) % 6]])\n if (!vertex.edgeIds.includes(edgeId)) vertex.edgeIds.push(edgeId);\n });\n }\n const edges = Object.freeze(\n [...edgesById.values()]\n .sort((a, b) => compare(a.id, b.id))\n .map((edge) =>\n Object.freeze({\n ...edge,\n spaceIds: Object.freeze(edge.spaceIds),\n vertexIds: Object.freeze(edge.vertexIds),\n }),\n ),\n );\n const vertices = Object.freeze(\n [...verticesById.values()]\n .sort((a, b) => compare(a.id, b.id))\n .map((vertex) =>\n Object.freeze({\n ...vertex,\n spaceIds: Object.freeze(vertex.spaceIds),\n edgeIds: Object.freeze(vertex.edgeIds.sort(compare)),\n }),\n ),\n );\n const requireSpace = (id: SpaceId) => {\n const space = spacesById.get(id);\n if (!space) throw new Error(`Unknown space '${id}' on board '${boardId}'.`);\n return space;\n };\n const selectedIds = (coordinates: Iterable<AxialCoordinate>): SpaceId[] =>\n Array.from(coordinates).flatMap((coordinate) => {\n const space = spacesByCoordinate.get(coordinateKey(coordinate));\n return space ? [space.id] : [];\n });\n const topology = {\n edges,\n vertices,\n neighbors(id: SpaceId) {\n const space = requireSpace(id);\n return directions.flatMap((direction) => {\n const neighbor = spacesByCoordinate.get(\n coordinateKey(add(space, direction)),\n );\n return neighbor ? [neighbor.id] : [];\n });\n },\n distance(from: SpaceId, to: SpaceId) {\n requireSpace(from);\n requireSpace(to);\n const queue = [from];\n const distances = new Map<SpaceId, number>([[from, 0]]);\n for (let index = 0; index < queue.length; index++) {\n const id = queue[index];\n const distance = distances.get(id)!;\n if (id === to) return distance;\n const space = requireSpace(id);\n for (const direction of directions) {\n const neighbor = spacesByCoordinate.get(\n coordinateKey(add(space, direction)),\n );\n if (neighbor && !distances.has(neighbor.id)) {\n distances.set(neighbor.id, distance + 1);\n queue.push(neighbor.id);\n }\n }\n }\n return Infinity;\n },\n gridDistance(from: SpaceId, to: SpaceId) {\n return grid.distance(requireSpace(from), requireSpace(to));\n },\n ring(id: SpaceId, radius: number) {\n return selectedIds(\n new Grid(\n hexClass(orientation),\n ringTraversal({ center: requireSpace(id), radius }),\n ),\n );\n },\n line(from: SpaceId, to: SpaceId) {\n return selectedIds(\n new Grid(\n hexClass(orientation),\n lineTraversal({ start: requireSpace(from), stop: requireSpace(to) }),\n ),\n );\n },\n edgesOf(id: SpaceId) {\n requireSpace(id);\n return [...edgesBySpace.get(id)!];\n },\n verticesOf(id: SpaceId) {\n requireSpace(id);\n return [...cornersBySpace.get(id)!];\n },\n edgeAt(id: SpaceId, side: 0 | 1 | 2 | 3 | 4 | 5) {\n requireSpace(id);\n const key = edgesBySpace.get(id)![side];\n if (!key)\n throw new Error(\"Hex side must be an integer from 0 through 5.\");\n return key;\n },\n vertexAt(id: SpaceId, corner: 0 | 1 | 2 | 3 | 4 | 5) {\n requireSpace(id);\n const key = cornersBySpace.get(id)![corner];\n if (!key)\n throw new Error(\"Hex corner must be an integer from 0 through 5.\");\n return key;\n },\n edge(a: SpaceId, b: SpaceId) {\n requireSpace(a);\n requireSpace(b);\n const edge = edgesBySpace\n .get(a)!\n .map((id) => edgesById.get(id)!)\n .find((edge) => edge.spaceIds.includes(b));\n if (!edge || a === b)\n throw new Error(`Spaces '${a}' and '${b}' do not share an edge.`);\n return edge.id;\n },\n vertex(a: SpaceId, b: SpaceId, c: SpaceId) {\n requireSpace(a);\n requireSpace(b);\n requireSpace(c);\n const vertex = cornersBySpace\n .get(a)!\n .map((id) => verticesById.get(id)!)\n .find(\n (vertex) =>\n vertex.spaceIds.includes(b) && vertex.spaceIds.includes(c),\n );\n if (!vertex || new Set([a, b, c]).size !== 3)\n throw new Error(\"Spaces do not share exactly one vertex.\");\n return vertex.id;\n },\n incidentEdges(vertexId: BoardVertexId<BoardId>) {\n const vertex = verticesById.get(vertexId);\n if (!vertex) throw new Error(`Unknown vertex '${vertexId}'.`);\n return [...vertex.edgeIds];\n },\n incidentVertices(edgeId: BoardEdgeId<BoardId>) {\n const edge = edgesById.get(edgeId);\n if (!edge) throw new Error(`Unknown edge '${edgeId}'.`);\n return [...edge.vertexIds] as [\n BoardVertexId<BoardId>,\n BoardVertexId<BoardId>,\n ];\n },\n spacesAt(vertexId: BoardVertexId<BoardId>) {\n const vertex = verticesById.get(vertexId);\n if (!vertex) throw new Error(`Unknown vertex '${vertexId}'.`);\n return [...vertex.spaceIds] as SpaceId[];\n },\n spacesAlong(edgeId: BoardEdgeId<BoardId>) {\n const edge = edgesById.get(edgeId);\n if (!edge) throw new Error(`Unknown edge '${edgeId}'.`);\n return [...edge.spaceIds] as SpaceId[];\n },\n getLayout({\n hexSize,\n origin: suppliedOrigin = { x: 0, y: 0 },\n }: {\n hexSize: number;\n origin?: Point;\n }) {\n const origin = { x: suppliedOrigin.x, y: suppliedOrigin.y };\n if (!Number.isFinite(hexSize) || hexSize <= 0)\n throw new Error(\"hexSize must be positive and finite.\");\n if (![origin.x, origin.y].every(Number.isFinite))\n throw new Error(\"Layout origin must be finite.\");\n const scaled = new Grid(hexClass(orientation, hexSize), spaces);\n const layoutSpaces = spaces.map((space) => {\n const hex = scaled.getHex(space)!;\n return {\n id: space.id,\n center: { x: hex.x + origin.x, y: hex.y + origin.y },\n corners: hex.corners.map((point) => ({\n x: point.x + origin.x,\n y: point.y + origin.y,\n })),\n };\n });\n const points = layoutSpaces.flatMap((space) => space.corners);\n const minX = points.length\n ? Math.min(...points.map((point) => point.x))\n : 0;\n const minY = points.length\n ? Math.min(...points.map((point) => point.y))\n : 0;\n const maxX = points.length\n ? Math.max(...points.map((point) => point.x))\n : 0;\n const maxY = points.length\n ? Math.max(...points.map((point) => point.y))\n : 0;\n const scaledVertexPoints = new Map(\n [...vertexPoints].map(([id, point]) => [\n id,\n { x: point.x * hexSize + origin.x, y: point.y * hexSize + origin.y },\n ]),\n );\n return {\n viewBox: Object.freeze({\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n }),\n spaces: Object.freeze(\n layoutSpaces.map((space) =>\n Object.freeze({\n ...space,\n center: Object.freeze(space.center),\n corners: Object.freeze(\n space.corners.map((point) => Object.freeze(point)),\n ),\n }),\n ),\n ),\n edges: Object.freeze(\n edges.map((edge) =>\n Object.freeze({\n id: edge.id,\n from: Object.freeze(scaledVertexPoints.get(edge.vertexIds[0])!),\n to: Object.freeze(scaledVertexPoints.get(edge.vertexIds[1])!),\n }),\n ),\n ),\n vertices: Object.freeze(\n vertices.map((vertex) =>\n Object.freeze({\n id: vertex.id,\n center: Object.freeze(scaledVertexPoints.get(vertex.id)!),\n }),\n ),\n ),\n pointToSpace(point: Point) {\n const hex = scaled.pointToHex(\n { x: point.x - origin.x, y: point.y - origin.y },\n { allowOutside: false },\n );\n return hex\n ? spacesByCoordinate.get(coordinateKey(hex))?.id\n : undefined;\n },\n };\n },\n };\n let cachedLayout:\n { key: string; value: ReturnType<typeof topology.getLayout> } | undefined;\n const buildLayout = topology.getLayout;\n topology.getLayout = (options) => {\n const key = JSON.stringify([\n options.hexSize,\n options.origin?.x ?? 0,\n options.origin?.y ?? 0,\n ]);\n if (cachedLayout?.key !== key) {\n const value = buildLayout(options);\n cachedLayout = { key, value: Object.freeze(value) };\n }\n return cachedLayout.value;\n };\n return Object.freeze(topology);\n}\n\n/** Geometry cache scoped to its consumer; metadata is never part of topology. */\nexport function createHexTopologyCache() {\n const entries = new Map<\n string,\n {\n orientation: HexBoardOrientation;\n spaces: Map<string, AxialCoordinate>;\n value: ReturnType<typeof createHexTopology>;\n }\n >();\n return (board: Parameters<typeof createHexTopology>[0]) => {\n const orientation = board.orientation ?? \"pointy\";\n const cached = entries.get(board.id);\n if (\n cached?.orientation === orientation &&\n cached.spaces.size === board.spaces.length\n ) {\n const seen = new Set<string>();\n const equal = board.spaces.every((space) => {\n const previous = cached.spaces.get(space.id);\n if (seen.has(space.id)) return false;\n seen.add(space.id);\n return previous?.q === space.q && previous?.r === space.r;\n });\n if (equal) return cached.value;\n }\n const value = createHexTopology(board);\n // Keep a bounded working set when games or private board identities change.\n if (!entries.has(board.id) && entries.size >= 64)\n entries.delete(entries.keys().next().value!);\n entries.set(board.id, {\n orientation,\n spaces: new Map(board.spaces.map(({ id, q, r }) => [id, { q, r }])),\n value,\n });\n return value;\n };\n}\n","import { immutableCopy } from \"./immutable.js\";\nimport type { TilePlacement } from \"./domain/tile-placement.js\";\nimport { boardEdgeId, boardVertexId } from \"./domain/board-element.js\";\nimport type {\n GenericBoardTopology,\n HexBoardTopology,\n SquareBoardTopology,\n BoardRelation,\n BoardTopology,\n BoardEdge,\n BoardVertex,\n HexSpace,\n SquareSpace,\n TopologyFields,\n} from \"./board-topology-schema.js\";\nexport type {\n BoardRelation,\n BoardTopology,\n BoardEdge,\n BoardVertex,\n BoardSpace,\n TileCellSpace,\n HexSpace,\n SquareSpace,\n GenericBoardTopology,\n HexBoardTopology,\n SquareBoardTopology,\n TiledBoardTopology,\n TopologyFields,\n} from \"./board-topology-schema.js\";\nimport type { TopologyDefinitions } from \"./domain/topology-definitions.js\";\nimport { tileSpaceId } from \"./domain/tile-space.js\";\nimport { createHexTopology } from \"./hex-board.js\";\nimport { MAXIMUM_BOARD_COORDINATE } from \"./domain/board-coordinates.js\";\nimport { encodeCanonicalPluginRuntimeJson } from \"./protocol/json.js\";\nimport { parsePerPlayerInstanceId } from \"./domain/per-player-instance.js\";\n\n/** A session stores identity and authored relation state, never derived geometry. */\nexport type BoardInstance = {\n readonly baseId: string;\n readonly relations: readonly BoardRelation[];\n};\nexport type { TilePlacement } from \"./domain/tile-placement.js\";\nexport type TopologyTable = {\n readonly boards: Readonly<Record<string, BoardInstance>>;\n readonly tiles: Readonly<\n Record<string, { readonly id: string; readonly tileTypeId: string }>\n >;\n readonly componentLocations: Readonly<\n Record<string, TilePlacement | { readonly type: string }>\n >;\n};\n\n/** Expected rejection of an invalid current board graph, distinct from implementation failures. */\nexport class BoardTopologyError extends Error {\n override readonly name = \"BoardTopologyError\";\n}\n\nfunction coordinate(value: number): number {\n if (\n !Number.isSafeInteger(value) ||\n Math.abs(value) > MAXIMUM_BOARD_COORDINATE\n )\n throw new BoardTopologyError(\n `Board coordinate must be an integer within +/-${MAXIMUM_BOARD_COORDINATE}.`,\n );\n return value === 0 ? 0 : value;\n}\n/** Positive rotations follow axial side order (east, south-east, south-west). */\nexport function rotateHex(q: number, r: number, rotation: number) {\n coordinate(q);\n coordinate(r);\n if (!Number.isInteger(rotation) || rotation < 0 || rotation > 5)\n throw new BoardTopologyError(\n \"Hex rotation must be an integer from 0 through 5.\",\n );\n for (let step = 0; step < rotation; step++) [q, r] = [-r, q + r];\n return { q: coordinate(q), r: coordinate(r) };\n}\n/** Square sides are east, south, west, north; corners are south-east onward. */\nexport function rotateSquare(col: number, row: number, rotation: number) {\n coordinate(col);\n coordinate(row);\n if (!Number.isInteger(rotation) || rotation < 0 || rotation > 3)\n throw new BoardTopologyError(\n \"Square rotation must be an integer from 0 through 3.\",\n );\n for (let step = 0; step < rotation; step++) [col, row] = [-row, col];\n return { col: coordinate(col), row: coordinate(row) };\n}\ntype Annotation = {\n readonly typeId?: string;\n readonly label?: string;\n readonly fields: TopologyFields;\n};\nfunction annotate<T extends BoardEdge | BoardVertex>(\n element: T,\n annotation: Annotation,\n): T {\n const merge = (key: \"typeId\" | \"label\") => {\n const before = element[key];\n const after = annotation[key];\n if (before !== undefined && after !== undefined && before !== after)\n throw new BoardTopologyError(\n `Conflicting ${key} metadata on '${element.id}'.`,\n );\n return after ?? before;\n };\n const fields = { ...element.fields };\n for (const [key, value] of Object.entries(annotation.fields)) {\n if (\n Object.hasOwn(fields, key) &&\n encodeCanonicalPluginRuntimeJson(fields[key]) !==\n encodeCanonicalPluginRuntimeJson(value)\n )\n throw new BoardTopologyError(\n `Conflicting field '${key}' metadata on '${element.id}'.`,\n );\n Object.defineProperty(fields, key, {\n value,\n enumerable: true,\n writable: true,\n configurable: true,\n });\n }\n return { ...element, typeId: merge(\"typeId\"), label: merge(\"label\"), fields };\n}\n\n/** Derive one board from admitted definitions and the current authoritative placements. */\nexport function deriveBoardTopology(\n table: TopologyTable,\n definitions: TopologyDefinitions,\n boardId: string,\n): BoardTopology {\n if (!Object.hasOwn(table.boards, boardId))\n throw new BoardTopologyError(`Unknown board '${boardId}'.`);\n const instance = table.boards[boardId];\n if (!Object.hasOwn(definitions.boardDefinitions, instance.baseId))\n throw new BoardTopologyError(\n `Unknown board definition '${instance.baseId}'.`,\n );\n const definition = definitions.boardDefinitions[instance.baseId];\n const playerId =\n definition.scope === \"perPlayer\"\n ? parsePerPlayerInstanceId(boardId)?.playerId\n : undefined;\n const base = {\n id: boardId,\n baseId: instance.baseId,\n name: definition.name,\n scope: definition.scope,\n ...(playerId === undefined ? {} : { playerId }),\n typeId: definition.typeId,\n fields: definition.fields,\n relations: instance.relations,\n };\n if (definition.layout === \"generic\") {\n for (const tileId of Object.keys(table.tiles)) {\n const location = table.componentLocations[tileId];\n if (\n location?.type === \"OnBoard\" &&\n \"boardId\" in location &&\n location.boardId === boardId\n )\n throw new BoardTopologyError(\n `Tile '${tileId}' cannot be placed on generic board '${boardId}'.`,\n );\n }\n const result: GenericBoardTopology = {\n ...base,\n layout: \"generic\",\n spaces: definition.spaces,\n };\n validateRelations(result);\n return immutableCopy(result);\n }\n const hexSpaces: Record<string, HexSpace> = {};\n const squareSpaces: Record<string, SquareSpace> = {};\n const occupied = new Map<string, string>();\n const placed: {\n tileId: string;\n definition: TopologyDefinitions[\"tileDefinitions\"][string];\n placement: TilePlacement;\n }[] = [];\n for (const [tileId, tile] of Object.entries(table.tiles).sort(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0,\n )) {\n const location = table.componentLocations[tileId];\n if (\n location?.type !== \"OnBoard\" ||\n !(\"boardId\" in location) ||\n location.boardId !== boardId\n )\n continue;\n if (!Object.hasOwn(definitions.tileDefinitions, tile.tileTypeId))\n throw new BoardTopologyError(`Unknown tile type '${tile.tileTypeId}'.`);\n const tileDefinition = definitions.tileDefinitions[tile.tileTypeId];\n if (\n !(\"layout\" in location) ||\n location.layout !== definition.layout ||\n tileDefinition.layout !== definition.layout\n )\n throw new BoardTopologyError(\n `Tile '${tileId}' layout does not match board '${boardId}'.`,\n );\n // The placement discriminator was admitted by the runtime schema; validate its numbers below too.\n const placement = location;\n placed.push({ tileId, definition: tileDefinition, placement });\n if (tileDefinition.layout === \"hex\" && placement.layout === \"hex\") {\n coordinate(placement.q);\n coordinate(placement.r);\n for (const cell of tileDefinition.cells) {\n const rotated = rotateHex(cell.at.q, cell.at.r, placement.rotation);\n const q = coordinate(rotated.q + placement.q),\n r = coordinate(rotated.r + placement.r);\n const key = `${q},${r}`;\n if (occupied.has(key))\n throw new BoardTopologyError(\n `Overlapping tile cells from tiles '${occupied.get(key)}' and '${tileId}' on board '${boardId}' at ${key}.`,\n );\n occupied.set(key, tileId);\n const id = tileSpaceId(tileId, cell.id);\n hexSpaces[id] = {\n id,\n tileId,\n localCellId: cell.id,\n q,\n r,\n name: cell.name,\n typeId: cell.typeId,\n fields: cell.fields,\n };\n }\n } else if (\n tileDefinition.layout === \"square\" &&\n placement.layout === \"square\"\n ) {\n coordinate(placement.col);\n coordinate(placement.row);\n for (const cell of tileDefinition.cells) {\n const rotated = rotateSquare(\n cell.at.col,\n cell.at.row,\n placement.rotation,\n );\n const col = coordinate(rotated.col + placement.col),\n row = coordinate(rotated.row + placement.row);\n const key = `${col},${row}`;\n if (occupied.has(key))\n throw new BoardTopologyError(\n `Overlapping tile cells from tiles '${occupied.get(key)}' and '${tileId}' on board '${boardId}' at ${key}.`,\n );\n occupied.set(key, tileId);\n const id = tileSpaceId(tileId, cell.id);\n squareSpaces[id] = {\n id,\n tileId,\n localCellId: cell.id,\n col,\n row,\n name: cell.name,\n typeId: cell.typeId,\n fields: cell.fields,\n };\n }\n }\n }\n if (definition.layout === \"hex\") {\n const lattice = createHexTopology({\n id: boardId,\n orientation: definition.orientation,\n spaces: Object.values(hexSpaces),\n });\n const edges = new Map<string, BoardEdge>(\n lattice.edges.map((edge) => [edge.id, { ...edge, fields: {} }]),\n );\n const vertices = new Map<string, BoardVertex>(\n lattice.vertices.map((vertex) => [vertex.id, { ...vertex, fields: {} }]),\n );\n for (const tile of placed) {\n if (tile.definition.layout !== \"hex\" || tile.placement.layout !== \"hex\")\n continue;\n for (const annotation of tile.definition.edges) {\n const id = lattice.edgeAt(\n tileSpaceId(tile.tileId, annotation.cellId),\n hexSide(annotation.side + tile.placement.rotation),\n );\n edges.set(id, annotate(edges.get(id)!, annotation));\n }\n for (const annotation of tile.definition.vertices) {\n const id = lattice.vertexAt(\n tileSpaceId(tile.tileId, annotation.cellId),\n hexSide(annotation.corner + tile.placement.rotation),\n );\n vertices.set(id, annotate(vertices.get(id)!, annotation));\n }\n }\n const result: HexBoardTopology = {\n ...base,\n layout: \"hex\",\n orientation: definition.orientation,\n spaces: hexSpaces,\n edges: [...edges.values()].sort((a, b) =>\n a.id < b.id ? -1 : a.id > b.id ? 1 : 0,\n ),\n vertices: [...vertices.values()].sort((a, b) =>\n a.id < b.id ? -1 : a.id > b.id ? 1 : 0,\n ),\n };\n validateRelations(result);\n return immutableCopy(result);\n }\n const lattice = squareLattice(boardId, Object.values(squareSpaces));\n for (const tile of placed) {\n if (\n tile.definition.layout !== \"square\" ||\n tile.placement.layout !== \"square\"\n )\n continue;\n for (const annotation of tile.definition.edges) {\n const id = lattice.edgeAt(\n squareSpaces[tileSpaceId(tile.tileId, annotation.cellId)],\n (annotation.side + tile.placement.rotation) % 4,\n );\n lattice.edges.set(id, annotate(lattice.edges.get(id)!, annotation));\n }\n for (const annotation of tile.definition.vertices) {\n const id = lattice.vertexAt(\n squareSpaces[tileSpaceId(tile.tileId, annotation.cellId)],\n (annotation.corner + tile.placement.rotation) % 4,\n );\n lattice.vertices.set(id, annotate(lattice.vertices.get(id)!, annotation));\n }\n }\n const result: SquareBoardTopology = {\n ...base,\n layout: \"square\",\n spaces: squareSpaces,\n edges: [...lattice.edges.values()].sort((a, b) =>\n a.id < b.id ? -1 : a.id > b.id ? 1 : 0,\n ),\n vertices: [...lattice.vertices.values()].sort((a, b) =>\n a.id < b.id ? -1 : a.id > b.id ? 1 : 0,\n ),\n };\n validateRelations(result);\n return immutableCopy(result);\n}\nfunction hexSide(value: number): 0 | 1 | 2 | 3 | 4 | 5 {\n const side = value % 6;\n switch (side) {\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n return side;\n default:\n throw new BoardTopologyError(\"Invalid hex side.\");\n }\n}\nfunction validateRelations(board: BoardTopology): void {\n const identities = new Set<string>();\n for (const relation of board.relations) {\n if (typeof relation.id !== \"string\" || relation.id.length === 0)\n throw new BoardTopologyError(\n `Relation identity must be nonempty on board '${board.id}'.`,\n );\n if (identities.has(relation.id))\n throw new BoardTopologyError(\n `Duplicate relation identity '${relation.id}' on board '${board.id}'.`,\n );\n identities.add(relation.id);\n if (\n !Object.hasOwn(board.spaces, relation.fromSpaceId) ||\n !Object.hasOwn(board.spaces, relation.toSpaceId)\n )\n throw new BoardTopologyError(\n `Relation on board '${board.id}' references an absent space.`,\n );\n }\n}\n\nfunction squareLattice(boardId: string, spaces: readonly SquareSpace[]) {\n const edges = new Map<string, BoardEdge>();\n const vertices = new Map<string, BoardVertex>();\n const corners = [\n [1, 1],\n [0, 1],\n [0, 0],\n [1, 0],\n ] as const;\n const vertexAt = (space: SquareSpace, corner: number) => {\n const offset = corners[corner];\n if (!space || !offset)\n throw new BoardTopologyError(\"Unknown square cell or corner.\");\n return boardVertexId(\n \"square\",\n boardId,\n `${space.col + offset[0]},${space.row + offset[1]}`,\n );\n };\n const edgeAt = (space: SquareSpace, side: number) => {\n if (!space || !Number.isInteger(side) || side < 0 || side > 3)\n throw new BoardTopologyError(\"Unknown square cell or side.\");\n switch (side) {\n case 0:\n return boardEdgeId(\n \"square\",\n boardId,\n `${space.col + 1},${space.row}:v`,\n );\n case 1:\n return boardEdgeId(\n \"square\",\n boardId,\n `${space.col},${space.row + 1}:h`,\n );\n case 2:\n return boardEdgeId(\"square\", boardId, `${space.col},${space.row}:v`);\n default:\n return boardEdgeId(\"square\", boardId, `${space.col},${space.row}:h`);\n }\n };\n for (const space of spaces) {\n for (let side = 0; side < 4; side++) {\n const id = edgeAt(space, side);\n const vertexIds: [\n ReturnType<typeof boardVertexId>,\n ReturnType<typeof boardVertexId>,\n ] = [vertexAt(space, (side + 3) % 4), vertexAt(space, side)];\n const before = edges.get(id);\n edges.set(id, {\n id,\n spaceIds: [...(before?.spaceIds ?? []), space.id].sort(),\n vertexIds: vertexIds.sort(),\n fields: {},\n });\n for (const vertexId of vertexIds) {\n const vertex = vertices.get(vertexId);\n vertices.set(vertexId, {\n id: vertexId,\n spaceIds: [\n ...new Set([...(vertex?.spaceIds ?? []), space.id]),\n ].sort(),\n edgeIds: [...new Set([...(vertex?.edgeIds ?? []), id])].sort(),\n fields: {},\n });\n }\n }\n }\n return { edges, vertices, edgeAt, vertexAt };\n}\n\n/** A bounded content cache also shares geometry across cloned and restored tables. */\nexport function createBoardTopologyCache() {\n const entries = new Map<string, { key: string; topology: BoardTopology }>();\n return (\n table: TopologyTable,\n definitions: TopologyDefinitions,\n boardId: string,\n ): BoardTopology => {\n if (!Object.hasOwn(table.boards, boardId))\n throw new BoardTopologyError(`Unknown board '${boardId}'.`);\n const instance = table.boards[boardId];\n const placements = Object.entries(table.tiles)\n .flatMap(([id, tile]) => {\n const location = table.componentLocations[id];\n return location?.type === \"OnBoard\" &&\n \"boardId\" in location &&\n location.boardId === boardId\n ? [\n {\n id,\n tileTypeId: tile.tileTypeId,\n location,\n definition: definitions.tileDefinitions[tile.tileTypeId],\n },\n ]\n : [];\n })\n .sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n const key = encodeCanonicalPluginRuntimeJson({\n instance,\n definition: definitions.boardDefinitions[instance.baseId],\n placements,\n });\n const previous = entries.get(boardId);\n if (previous?.key === key) return previous.topology;\n const topology = deriveBoardTopology(table, definitions, boardId);\n if (!entries.has(boardId) && entries.size >= 64)\n entries.delete(entries.keys().next().value!);\n entries.set(boardId, { key, topology });\n return topology;\n };\n}\n","import { parsePerPlayerInstanceId } from \"./domain/per-player-instance.js\";\nimport { parseBoardElementId } from \"./domain/board-element.js\";\nimport type { BoardEdgeId, BoardVertexId } from \"./domain/board-identities.js\";\nimport { MAXIMUM_BOARD_COORDINATE } from \"./domain/board-coordinates.js\";\nimport * as z from \"zod\";\nimport { RuntimeJsonSchema, type ReadonlyRuntimeData } from \"./runtime-json.js\";\nimport { parseTileSpaceId, type TileSpaceId } from \"./domain/tile-space.js\";\n\nconst coordinate = z\n .number()\n .int()\n .min(-MAXIMUM_BOARD_COORDINATE)\n .max(MAXIMUM_BOARD_COORDINATE);\nconst fields = z.record(z.string(), RuntimeJsonSchema);\nexport const BoardRelationSchema = z.strictObject({\n id: z.string().min(1),\n typeId: z.string().min(1),\n fromSpaceId: z.string().min(1),\n toSpaceId: z.string().min(1),\n directed: z.boolean(),\n fields,\n});\nexport const BoardSpaceSchema = z.strictObject({\n id: z.string().min(1),\n name: z.string().nullable().optional(),\n typeId: z.string().min(1).nullable().optional(),\n fields,\n});\nconst tileCell = BoardSpaceSchema.extend({\n id: z.custom<TileSpaceId>((value) => parseTileSpaceId(value) !== null),\n tileId: z.string().min(1),\n localCellId: z.string().min(1),\n});\nfunction checkTileCell(cell: z.output<typeof tileCell>, ctx: z.RefinementCtx) {\n const identity = parseTileSpaceId(cell.id);\n if (identity?.tileId !== cell.tileId || identity?.cellId !== cell.localCellId)\n ctx.addIssue({\n code: \"custom\",\n path: [\"id\"],\n message: \"Tile space identity must match tileId and localCellId.\",\n });\n}\nexport const HexSpaceSchema = tileCell\n .extend({ q: coordinate, r: coordinate })\n .superRefine(checkTileCell);\nexport const SquareSpaceSchema = tileCell\n .extend({ col: coordinate, row: coordinate })\n .superRefine(checkTileCell);\nconst edgeId = z.custom<BoardEdgeId>(\n (value) => parseBoardElementId(value)?.kind === \"edge\",\n);\nconst vertexId = z.custom<BoardVertexId>(\n (value) => parseBoardElementId(value)?.kind === \"vertex\",\n);\nexport const BoardEdgeSchema = z.strictObject({\n id: edgeId,\n spaceIds: z.array(z.string().min(1)).min(1),\n vertexIds: z.tuple([vertexId, vertexId]),\n typeId: z.string().min(1).optional(),\n label: z.string().optional(),\n fields,\n});\nexport const BoardVertexSchema = z.strictObject({\n id: vertexId,\n spaceIds: z.array(z.string().min(1)).min(1),\n edgeIds: z.array(edgeId).min(1),\n typeId: z.string().min(1).optional(),\n label: z.string().optional(),\n fields,\n});\nexport function identityRecord<T extends z.ZodType<{ id: string }>>(schema: T) {\n return z.record(z.string().min(1), schema).superRefine((entries, ctx) => {\n for (const [key, value] of Object.entries(entries)) {\n if (value.id !== key)\n ctx.addIssue({\n code: \"custom\",\n path: [key, \"id\"],\n message: \"Record key must match item identity.\",\n });\n }\n });\n}\nconst board = z.strictObject({\n id: z.string().min(1),\n baseId: z.string().min(1),\n name: z.string(),\n scope: z.enum([\"shared\", \"perPlayer\"]),\n playerId: z.string().min(1).optional(),\n typeId: z.string().min(1).optional(),\n fields,\n relations: z.array(BoardRelationSchema),\n});\nexport const GenericBoardTopologySchema = board.extend({\n layout: z.literal(\"generic\"),\n spaces: identityRecord(BoardSpaceSchema),\n});\nexport const HexBoardTopologySchema = board.extend({\n layout: z.literal(\"hex\"),\n orientation: z.enum([\"pointy\", \"flat\"]),\n spaces: identityRecord(HexSpaceSchema),\n edges: z.array(BoardEdgeSchema),\n vertices: z.array(BoardVertexSchema),\n});\nexport const SquareBoardTopologySchema = board.extend({\n layout: z.literal(\"square\"),\n spaces: identityRecord(SquareSpaceSchema),\n edges: z.array(BoardEdgeSchema),\n vertices: z.array(BoardVertexSchema),\n});\ntype TopologyGraph = Pick<\n z.output<typeof board>,\n \"id\" | \"baseId\" | \"scope\" | \"playerId\" | \"relations\"\n> & { readonly spaces: Readonly<Record<string, { readonly id: string }>> } & (\n | { readonly layout: \"generic\" }\n | {\n readonly layout: \"hex\" | \"square\";\n readonly edges: readonly BoardEdge[];\n readonly vertices: readonly BoardVertex[];\n }\n );\n\n/** Both authoritative and seat topology must admit the same graph invariants. */\nexport function validateTopologyGraph(\n topology: TopologyGraph,\n ctx: z.RefinementCtx,\n): void {\n const issue = (path: (string | number)[], message: string) =>\n ctx.addIssue({ code: \"custom\", path, message });\n const replica = parsePerPlayerInstanceId(topology.id);\n if (topology.scope === \"perPlayer\") {\n if (\n replica?.family !== \"board\" ||\n replica.baseId !== topology.baseId ||\n replica.playerId !== topology.playerId\n )\n issue(\n [\"playerId\"],\n \"Per-player board identity must match baseId and playerId.\",\n );\n } else if (\n topology.playerId !== undefined ||\n replica !== null ||\n topology.id !== topology.baseId\n ) {\n issue(\n [\"playerId\"],\n \"Shared board identity must match baseId and cannot carry a player identity.\",\n );\n }\n const spaces = new Set(Object.keys(topology.spaces));\n const relationIds = new Set<string>();\n for (const [index, relation] of topology.relations.entries()) {\n if (!spaces.has(relation.fromSpaceId) || !spaces.has(relation.toSpaceId))\n issue(\n [\"relations\", index],\n \"Relation endpoints must belong to this topology.\",\n );\n if (relation.id != null) {\n if (relationIds.has(relation.id))\n issue(\n [\"relations\", index, \"id\"],\n \"Relation identities must be unique.\",\n );\n relationIds.add(relation.id);\n }\n }\n if (topology.layout === \"generic\") return;\n const edges = new Map(topology.edges.map((edge) => [edge.id, edge]));\n const vertices = new Map(\n topology.vertices.map((vertex) => [vertex.id, vertex]),\n );\n if (edges.size !== topology.edges.length)\n issue([\"edges\"], \"Edge identities must be unique.\");\n if (vertices.size !== topology.vertices.length)\n issue([\"vertices\"], \"Vertex identities must be unique.\");\n const references = (\n ids: readonly string[],\n known: ReadonlySet<string>,\n path: (string | number)[],\n ) => {\n const seen = new Set<string>();\n for (const [index, id] of ids.entries()) {\n if (seen.has(id))\n issue([...path, index], \"Incidence references must be unique.\");\n if (!known.has(id))\n issue(\n [...path, index],\n \"Incidence reference must belong to this topology.\",\n );\n seen.add(id);\n }\n };\n const edgeIds = new Set(edges.keys());\n const vertexIds = new Set(vertices.keys());\n const vertexEdges = new Map(\n topology.vertices.map((vertex) => [vertex.id, new Set(vertex.edgeIds)]),\n );\n for (const [index, edge] of topology.edges.entries()) {\n references(edge.spaceIds, spaces, [\"edges\", index, \"spaceIds\"]);\n references(edge.vertexIds, vertexIds, [\"edges\", index, \"vertexIds\"]);\n for (const vertexId of edge.vertexIds) {\n if (vertices.has(vertexId) && !vertexEdges.get(vertexId)?.has(edge.id))\n issue(\n [\"edges\", index, \"vertexIds\"],\n \"Edge and vertex incidence must agree.\",\n );\n }\n }\n for (const [index, vertex] of topology.vertices.entries()) {\n references(vertex.spaceIds, spaces, [\"vertices\", index, \"spaceIds\"]);\n references(vertex.edgeIds, edgeIds, [\"vertices\", index, \"edgeIds\"]);\n for (const edgeId of vertex.edgeIds) {\n const edge = edges.get(edgeId);\n if (edge && !edge.vertexIds.includes(vertex.id))\n issue(\n [\"vertices\", index, \"edgeIds\"],\n \"Edge and vertex incidence must agree.\",\n );\n }\n }\n for (const [kind, items] of [\n [\"edges\", topology.edges],\n [\"vertices\", topology.vertices],\n ] as const) {\n for (const [index, item] of items.entries()) {\n const ids = [\n item.id,\n ...(\"vertexIds\" in item ? item.vertexIds : item.edgeIds),\n ];\n if (\n ids.some((id) => {\n const identity = parseBoardElementId(id);\n return (\n identity?.boardId !== topology.id ||\n identity?.layout !== topology.layout\n );\n })\n )\n ctx.addIssue({\n code: \"custom\",\n path: [kind, index],\n message: \"World element identity must match its board and layout.\",\n });\n }\n }\n}\n\nexport const BoardTopologySchema = z\n .discriminatedUnion(\"layout\", [\n GenericBoardTopologySchema,\n HexBoardTopologySchema,\n SquareBoardTopologySchema,\n ])\n .superRefine(validateTopologyGraph);\n\nexport const BoardTopologyMapSchema = identityRecord(BoardTopologySchema);\n\nexport type ReadonlyTopology<T> = ReadonlyRuntimeData<T>;\nexport type TopologyFields = ReadonlyTopology<z.output<typeof fields>>;\nexport type BoardRelation = ReadonlyTopology<\n z.output<typeof BoardRelationSchema>\n>;\nexport type BoardSpace = ReadonlyTopology<z.output<typeof BoardSpaceSchema>>;\nexport type HexSpace = ReadonlyTopology<z.output<typeof HexSpaceSchema>>;\nexport type SquareSpace = ReadonlyTopology<z.output<typeof SquareSpaceSchema>>;\nexport type TileCellSpace = Omit<HexSpace, \"q\" | \"r\">;\nexport type BoardEdge = ReadonlyTopology<z.output<typeof BoardEdgeSchema>>;\nexport type BoardVertex = ReadonlyTopology<z.output<typeof BoardVertexSchema>>;\nexport type GenericBoardTopology = ReadonlyTopology<\n z.output<typeof GenericBoardTopologySchema>\n>;\nexport type HexBoardTopology = ReadonlyTopology<\n z.output<typeof HexBoardTopologySchema>\n>;\nexport type SquareBoardTopology = ReadonlyTopology<\n z.output<typeof SquareBoardTopologySchema>\n>;\nexport type TiledBoardTopology = HexBoardTopology | SquareBoardTopology;\nexport type BoardTopology = ReadonlyTopology<\n z.output<typeof BoardTopologySchema>\n>;\n","import * as z from \"zod\";\n\n/** Live player keys must survive ordinary record parsers without being dropped. */\nexport function isPlayerIdValue(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0 && value !== \"__proto__\";\n}\nexport const PlayerIdSchema = z\n .string()\n .min(1)\n .refine((value) => isPlayerIdValue(value), {\n error:\n \"Player id '__proto__' is reserved for record/parser interoperability.\",\n });\nexport const PlayerRosterSchema = z\n .array(PlayerIdSchema)\n .refine((ids) => new Set(ids).size === ids.length, {\n error: \"Duplicate player id\",\n });\n","import * as z from \"zod\";\n\n/** Client references name one disclosure in one seat frame, never an inventory identity. */\nexport const SeatTileRefSchema = z\n .string()\n .regex(/^tile-ref:sha256:[0-9a-f]{64}$/)\n .brand<\"SeatTileRef\">();\nexport type SeatTileRef = z.output<typeof SeatTileRefSchema>;\n\nexport const SeatSpaceRefSchema = z\n .string()\n .regex(/^space-ref:sha256:[0-9a-f]{64}$/)\n .brand<\"SeatSpaceRef\">();\nexport type SeatSpaceRef = z.output<typeof SeatSpaceRefSchema>;\n","import { rotateHex, rotateSquare } from \"./board-topology.js\";\nimport { MAXIMUM_BOARD_COORDINATE } from \"./domain/board-coordinates.js\";\nimport type { PublicTileAppearance } from \"./domain/tile-disclosure.js\";\nimport type { TilePlacement } from \"./domain/tile-placement.js\";\nimport type { ReadonlyRuntimeData } from \"./runtime-json.js\";\n\ntype Placement = TilePlacement extends infer P\n ? P extends TilePlacement\n ? Omit<P, \"type\" | \"boardId\">\n : never\n : never;\n\nfunction coordinate(value: number): number {\n if (\n !Number.isSafeInteger(value) ||\n Math.abs(value) > MAXIMUM_BOARD_COORDINATE\n )\n throw new Error(\n \"Public tile footprint exceeds the board coordinate domain.\",\n );\n return value === 0 ? 0 : value;\n}\n\n/** Transform only the independently public footprint, never assigned face geometry. */\nexport function getPublicTileFootprint(\n appearance: ReadonlyRuntimeData<PublicTileAppearance>,\n placement: Placement,\n) {\n if (appearance.layout === \"hex\" && placement.layout === \"hex\")\n return {\n layout: \"hex\" as const,\n cells: appearance.cells.map((cell) => {\n const rotated = rotateHex(cell.q, cell.r, placement.rotation);\n return {\n q: coordinate(rotated.q + placement.q),\n r: coordinate(rotated.r + placement.r),\n };\n }),\n };\n if (appearance.layout === \"square\" && placement.layout === \"square\")\n return {\n layout: \"square\" as const,\n cells: appearance.cells.map((cell) => {\n const rotated = rotateSquare(cell.col, cell.row, placement.rotation);\n return {\n col: coordinate(rotated.col + placement.col),\n row: coordinate(rotated.row + placement.row),\n };\n }),\n };\n throw new Error(\n \"Tile public appearance must match its board placement layout.\",\n );\n}\n","import { getPublicTileFootprint } from \"./tile-appearance.js\";\nimport * as z from \"zod\";\nimport {\n BoardSpaceSchema,\n GenericBoardTopologySchema,\n HexBoardTopologySchema,\n SquareBoardTopologySchema,\n identityRecord,\n validateTopologyGraph,\n} from \"./board-topology-schema.js\";\nimport { PublicTileAppearanceSchema } from \"./domain/tile-disclosure.js\";\nimport {\n SeatSpaceRefSchema,\n SeatTileRefSchema,\n} from \"./domain/seat-reference.js\";\nimport { TilePlacementSchema } from \"./domain/tile-placement.js\";\nimport { RuntimeJsonSchema, type ReadonlyRuntimeData } from \"./runtime-json.js\";\nimport { MAXIMUM_BOARD_COORDINATE } from \"./domain/board-coordinates.js\";\n\nconst coordinate = z\n .int()\n .min(-MAXIMUM_BOARD_COORDINATE)\n .max(MAXIMUM_BOARD_COORDINATE);\nconst fields = z.record(z.string(), RuntimeJsonSchema);\nexport const ProjectedTileSchema = z.discriminatedUnion(\"disclosure\", [\n z.strictObject({\n disclosure: z.literal(\"visible\"),\n ref: SeatTileRefSchema,\n tileTypeId: z.string().min(1),\n name: z.string(),\n frontImage: z.string().optional(),\n ownerId: z.string().min(1).nullable(),\n fields,\n properties: fields,\n }),\n z.strictObject({\n disclosure: z.literal(\"concealed\"),\n ref: SeatTileRefSchema,\n appearance: PublicTileAppearanceSchema,\n }),\n]);\nexport type ProjectedTile = ReadonlyRuntimeData<\n z.output<typeof ProjectedTileSchema>\n>;\n\nconst placement = z.discriminatedUnion(\"layout\", [\n TilePlacementSchema.options[0].omit({ type: true, boardId: true }),\n TilePlacementSchema.options[1].omit({ type: true, boardId: true }),\n]);\nconst placedTile = z.discriminatedUnion(\"disclosure\", [\n ProjectedTileSchema.options[0].extend({ placement }),\n ProjectedTileSchema.options[1].extend({ placement }),\n]);\nconst cell = BoardSpaceSchema.extend({\n id: SeatSpaceRefSchema,\n tileRef: SeatTileRefSchema,\n localCellId: z.string().min(1),\n});\nexport const SeatHexSpaceSchema = cell.extend({ q: coordinate, r: coordinate });\nexport const SeatSquareSpaceSchema = cell.extend({\n col: coordinate,\n row: coordinate,\n});\nexport const SeatBoardTopologySchema = z\n .discriminatedUnion(\"layout\", [\n GenericBoardTopologySchema,\n HexBoardTopologySchema.extend({\n spaces: identityRecord(SeatHexSpaceSchema),\n tiles: z.array(placedTile),\n }),\n SquareBoardTopologySchema.extend({\n spaces: identityRecord(SeatSquareSpaceSchema),\n tiles: z.array(placedTile),\n }),\n ])\n .superRefine((board, ctx) => {\n validateTopologyGraph(board, ctx);\n if (board.layout === \"generic\") return;\n const tiles = new Map(board.tiles.map((tile) => [tile.ref, tile]));\n if (tiles.size !== board.tiles.length)\n ctx.addIssue({\n code: \"custom\",\n path: [\"tiles\"],\n message: \"Tile references must be unique.\",\n });\n for (const [index, tile] of board.tiles.entries()) {\n if (\n tile.placement.layout !== board.layout ||\n (tile.disclosure === \"concealed\" &&\n tile.appearance.layout !== board.layout)\n )\n ctx.addIssue({\n code: \"custom\",\n path: [\"tiles\", index],\n message: \"Tile presentation must match its board layout.\",\n });\n }\n for (const [index, tile] of board.tiles.entries()) {\n if (tile.disclosure !== \"concealed\") continue;\n try {\n getPublicTileFootprint(tile.appearance, tile.placement);\n } catch (error) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"tiles\", index, \"appearance\"],\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n const cellsByTile = new Map<string, Set<string>>();\n for (const [id, space] of Object.entries<\n | z.output<typeof SeatHexSpaceSchema>\n | z.output<typeof SeatSquareSpaceSchema>\n >(board.spaces)) {\n const cells = cellsByTile.get(space.tileRef) ?? new Set<string>();\n if (cells.has(space.localCellId))\n ctx.addIssue({\n code: \"custom\",\n path: [\"spaces\", id],\n message: \"A visible tile cell may be projected only once.\",\n });\n cells.add(space.localCellId);\n cellsByTile.set(space.tileRef, cells);\n if (tiles.get(space.tileRef)?.disclosure !== \"visible\")\n ctx.addIssue({\n code: \"custom\",\n path: [\"spaces\", id],\n message: \"A projected cell must belong to a visible tile.\",\n });\n }\n for (const [index, tile] of board.tiles.entries())\n if (tile.disclosure === \"visible\" && !cellsByTile.get(tile.ref)?.size)\n ctx.addIssue({\n code: \"custom\",\n path: [\"tiles\", index],\n message: \"A visible tile requires at least one projected cell.\",\n });\n });\nexport const BoardProjectionSchema = identityRecord(SeatBoardTopologySchema);\nexport type SeatBoardTopology = ReadonlyRuntimeData<\n z.output<typeof SeatBoardTopologySchema>\n>;\n","import * as z from \"zod\";\nimport { MAXIMUM_BOARD_COORDINATE } from \"./board-coordinates.js\";\nimport { PlayerIdSchema } from \"./player-identity.js\";\n\nconst coordinate = z\n .int()\n .min(-MAXIMUM_BOARD_COORDINATE)\n .max(MAXIMUM_BOARD_COORDINATE);\nconst backImage = z\n .string()\n .regex(\n /^assets\\/(?:[\\w-][\\w.-]*\\/)*[\\w-][\\w.-]*\\.(?:avif|gif|jpe?g|png|svg|webp)$/i,\n { error: \"Tile back image must be an image path under assets/.\" },\n );\nexport const PublicTileAppearanceSchema = z\n .discriminatedUnion(\"layout\", [\n z.strictObject({\n layout: z.literal(\"hex\"),\n cells: z\n .array(z.strictObject({ q: coordinate, r: coordinate }))\n .nonempty(),\n backImage: backImage.optional(),\n }),\n z.strictObject({\n layout: z.literal(\"square\"),\n cells: z\n .array(z.strictObject({ col: coordinate, row: coordinate }))\n .nonempty(),\n backImage: backImage.optional(),\n }),\n ])\n .superRefine((appearance, ctx) => {\n const seen = new Set<string>();\n for (const [index, cell] of appearance.cells.entries()) {\n const key =\n \"q\" in cell ? `${cell.q},${cell.r}` : `${cell.col},${cell.row}`;\n if (seen.has(key))\n ctx.addIssue({\n code: \"custom\",\n path: [\"cells\", index],\n message: \"Public footprint coordinates must be unique.\",\n });\n seen.add(key);\n }\n });\nconst publicFace = z.strictObject({ audience: z.literal(\"public\") });\nconst ownerFace = z.strictObject({ audience: z.literal(\"owner\") });\nconst noFace = z.strictObject({ audience: z.literal(\"none\") });\nexport const AuthoredTileFaceAudienceSchema = z.discriminatedUnion(\"audience\", [\n publicFace,\n ownerFace,\n noFace,\n]);\nexport const TileFaceAudienceSchema = z.discriminatedUnion(\"audience\", [\n publicFace,\n ownerFace,\n noFace,\n z\n .strictObject({\n audience: z.literal(\"seats\"),\n playerIds: z.array(PlayerIdSchema).nonempty(),\n })\n .superRefine((face, ctx) => {\n if (new Set(face.playerIds).size !== face.playerIds.length)\n ctx.addIssue({\n code: \"custom\",\n path: [\"playerIds\"],\n message: \"Face audience seats must be unique.\",\n });\n }),\n]);\nexport const AuthoredTileDisclosureSchema = z.strictObject({\n face: AuthoredTileFaceAudienceSchema,\n appearance: PublicTileAppearanceSchema.optional(),\n});\nexport const TileDisclosureSchema = z.strictObject({\n face: TileFaceAudienceSchema,\n appearance: PublicTileAppearanceSchema.optional(),\n});\nexport type PublicTileAppearance = z.infer<typeof PublicTileAppearanceSchema>;\nexport type TileFaceAudience = z.infer<typeof TileFaceAudienceSchema>;\nexport type AuthoredTileFaceAudience = z.infer<\n typeof AuthoredTileFaceAudienceSchema\n>;\nexport type TileDisclosure = z.infer<typeof TileDisclosureSchema>;\nexport type AuthoredTileDisclosure = z.infer<\n typeof AuthoredTileDisclosureSchema\n>;\n","import * as z from \"zod\";\nimport { MAXIMUM_BOARD_COORDINATE } from \"./board-coordinates.js\";\nconst coordinate = z\n .number()\n .int()\n .min(-MAXIMUM_BOARD_COORDINATE)\n .max(MAXIMUM_BOARD_COORDINATE);\nexport const TilePlacementSchema = z.discriminatedUnion(\"layout\", [\n z.strictObject({\n type: z.literal(\"OnBoard\"),\n layout: z.literal(\"hex\"),\n boardId: z.string().min(1),\n q: coordinate,\n r: coordinate,\n rotation: z.union([\n z.literal(0),\n z.literal(1),\n z.literal(2),\n z.literal(3),\n z.literal(4),\n z.literal(5),\n ]),\n }),\n z.strictObject({\n type: z.literal(\"OnBoard\"),\n layout: z.literal(\"square\"),\n boardId: z.string().min(1),\n col: coordinate,\n row: coordinate,\n rotation: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3)]),\n }),\n]);\nexport type TilePlacement = Readonly<z.output<typeof TilePlacementSchema>>;\n","/** Assert presence at a mutable table or projected-snapshot lookup boundary. */\nexport function requireLookup<T>(\n value: T | undefined,\n kind: string,\n id: string,\n): T {\n if (value === undefined) throw new Error(`${kind} \"${id}\" is not present.`);\n return value;\n}\n","import * as z from \"zod\";\n\n/** A space addressed by its canonical runtime board instance. */\nexport type BoardSpaceTarget<\n BoardId extends string = string,\n SpaceId extends string = string,\n> = {\n readonly boardId: BoardId;\n readonly spaceId: SpaceId;\n};\n\nexport const BoardSpaceTargetSchema = z.strictObject({\n boardId: z.string(),\n spaceId: z.string(),\n});\n\nexport function isBoardSpaceTarget(value: unknown): value is BoardSpaceTarget {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Object.keys(value).length === 2 &&\n \"boardId\" in value &&\n typeof value.boardId === \"string\" &&\n \"spaceId\" in value &&\n typeof value.spaceId === \"string\"\n );\n}\n\nexport function sameBoardSpaceTarget(\n left: BoardSpaceTarget,\n right: BoardSpaceTarget,\n): boolean {\n return left.boardId === right.boardId && left.spaceId === right.spaceId;\n}\n","import { isBoardSpaceTarget, sameBoardSpaceTarget } from \"./board-target\";\nimport { isPositionTarget } from \"./position-target\";\nimport type {\n InputDomainDescriptor,\n InputSelectionDescriptor,\n} from \"../reducer/model/spec/inputs\";\n\n/** Projected domain rules only; schemas and authored target checks remain server-owned. */\nexport function inputDomainErrors(\n domain: InputDomainDescriptor,\n value: unknown,\n selection?: InputSelectionDescriptor,\n options: { ignoreMinimum?: boolean } = {},\n): string[] {\n if (selection?.mode === \"many\") {\n if (!Array.isArray(value)) return [\"Expected a list of values.\"];\n const errors = cardinalityErrors(\n value,\n selection.min,\n selection.max,\n \"value\",\n options.ignoreMinimum,\n );\n if (\n selection.distinct &&\n new Set(value.map(inputValueKey)).size !== value.length\n )\n errors.push(\"Choose each value only once.\");\n if (\n value.some(\n (item) =>\n inputDomainErrors(domain, item, undefined, options).length > 0,\n )\n )\n errors.push(ineligibleMessage(domain));\n return errors;\n }\n switch (domain.type) {\n case \"choice\":\n return inputTargetInDomain(domain, value)\n ? []\n : [ineligibleMessage(domain)];\n case \"choiceList\": {\n if (!Array.isArray(value)) return [\"Expected a list of choices.\"];\n const errors = cardinalityErrors(\n value,\n domain.min ?? 0,\n domain.max ?? domain.choices.length,\n \"option\",\n options.ignoreMinimum,\n );\n if (value.some((item) => !inputTargetInDomain(domain, item)))\n errors.push(ineligibleMessage(domain));\n return errors;\n }\n case \"tileTarget\":\n case \"cardTarget\":\n case \"boardTarget\":\n case \"zonePosition\":\n return inputTargetInDomain(domain, value)\n ? []\n : [ineligibleMessage(domain)];\n case \"boundedNumber\":\n return typeof value === \"number\" &&\n value >= domain.min &&\n value <= domain.max &&\n Math.abs(\n (value - domain.min) / (domain.step ?? 1) -\n Math.round((value - domain.min) / (domain.step ?? 1)),\n ) < 1e-9\n ? []\n : [\"Value is outside the current input domain.\"];\n case \"resourceMap\":\n return typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.keys(value).every((key) =>\n domain.resources.some((entry) => entry.resourceId === key),\n ) &&\n domain.resources.every((entry) => {\n const amount =\n (value as Record<string, unknown>)[entry.resourceId] ?? 0;\n return (\n typeof amount === \"number\" &&\n Number.isInteger(amount) &&\n amount >= (entry.min ?? 0) &&\n amount <= (entry.max ?? Infinity)\n );\n })\n ? []\n : [\"Value is outside the current input domain.\"];\n }\n}\n\nexport function inputValueInDomain(\n domain: InputDomainDescriptor,\n value: unknown,\n selection?: InputSelectionDescriptor,\n options: { ignoreMinimum?: boolean } = {},\n): boolean {\n return inputDomainErrors(domain, value, selection, options).length === 0;\n}\n\n/** One selectable option, including an option within a choiceList or many input. */\nexport function inputTargetInDomain(\n domain: InputDomainDescriptor,\n value: unknown,\n): boolean {\n switch (domain.type) {\n case \"choice\":\n case \"choiceList\":\n return domain.choices.some(\n (choice) => !choice.disabled && Object.is(choice.value, value),\n );\n case \"tileTarget\":\n case \"cardTarget\":\n return (\n typeof value === \"string\" && domain.eligibleTargets.includes(value)\n );\n case \"boardTarget\":\n return domain.valueKind === \"board-space\"\n ? isBoardSpaceTarget(value) &&\n domain.eligibleTargets.some((candidate) =>\n sameBoardSpaceTarget(candidate, value),\n )\n : typeof value === \"string\" && domain.eligibleTargets.includes(value);\n case \"zonePosition\":\n return (\n isPositionTarget(value) &&\n domain.zones.some(\n (zone) =>\n zone.zoneId === value.zoneId &&\n zone.hostId === value.hostId &&\n value.index <= zone.size,\n )\n );\n default:\n return inputValueInDomain(domain, value);\n }\n}\n\nfunction cardinalityErrors(\n value: readonly unknown[],\n min: number,\n max: number | undefined,\n unit: string,\n ignoreMinimum = false,\n): string[] {\n const errors: string[] = [];\n if (!ignoreMinimum && value.length < min)\n errors.push(`Choose at least ${min} ${pluralize(unit, min)}.`);\n if (max !== undefined && value.length > max)\n errors.push(`Choose at most ${max} ${pluralize(unit, max)}.`);\n return errors;\n}\n\nfunction ineligibleMessage(domain: InputDomainDescriptor): string {\n return domain.type === \"choice\" || domain.type === \"choiceList\"\n ? \"Selected choice is not eligible.\"\n : domain.type === \"cardTarget\" ||\n domain.type === \"tileTarget\" ||\n domain.type === \"boardTarget\" ||\n domain.type === \"zonePosition\"\n ? \"Selected target is not eligible.\"\n : \"Value is outside the current input domain.\";\n}\n\n/** Matches the reducer's JSON value identity for projected distinct selections. */\nexport function inputValueKey(value: unknown): string {\n if (value === null) return \"null\";\n if (isBoardSpaceTarget(value))\n return `board-space:${JSON.stringify([value.boardId, value.spaceId])}`;\n if (isPositionTarget(value))\n return `position:${JSON.stringify([value.zoneId, value.hostId, value.index])}`;\n switch (typeof value) {\n case \"string\":\n return `string:${value}`;\n case \"number\":\n case \"boolean\":\n case \"undefined\":\n return `${typeof value}:${String(value)}`;\n default:\n return `json:${JSON.stringify(value)}`;\n }\n}\n\nfunction pluralize(word: string, count: number): string {\n return count === 1 ? word : `${word}s`;\n}\n"],"mappings":"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","names":["z","z","z","z","hex","board","coordinate","edgeId","edge","vertex","vertexId","fields","result","placement","cell","lattice","board","vertexId","z","coordinate","cell","vertexId","edgeId","z","z","coordinate","placement","cell","z","z","coordinate","cell","z","coordinate","coordinate","fields","board","z"]}
|