@dreamboard-games/sdk 0.5.0-alpha.2 → 0.5.0-alpha.4

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.
Files changed (151) hide show
  1. package/README.md +186 -45
  2. package/dist/board-target-B0QG6OYx.d.ts +8 -0
  3. package/dist/chunk-3JXUL4VN.js +139 -0
  4. package/dist/chunk-3JXUL4VN.js.map +1 -0
  5. package/dist/{chunk-S2JEDVWH.js → chunk-C77SYIVT.js} +6102 -6505
  6. package/dist/chunk-C77SYIVT.js.map +1 -0
  7. package/dist/chunk-DMFVAZI2.js +16 -0
  8. package/dist/chunk-DMFVAZI2.js.map +1 -0
  9. package/dist/chunk-OOFMBCFF.js +1338 -0
  10. package/dist/chunk-OOFMBCFF.js.map +1 -0
  11. package/dist/chunk-UG2Q4NLG.js +590 -0
  12. package/dist/chunk-UG2Q4NLG.js.map +1 -0
  13. package/dist/chunk-XU6WJW6K.js +847 -0
  14. package/dist/chunk-XU6WJW6K.js.map +1 -0
  15. package/dist/diagnostics-B8d5aLad.d.ts +65 -0
  16. package/dist/extract-gVKcB8Og.d.ts +4736 -0
  17. package/dist/index.d.ts +3782 -1
  18. package/dist/index.js +1096 -6
  19. package/dist/index.js.map +1 -1
  20. package/dist/model-vdpLHrxh.d.ts +432 -0
  21. package/dist/react.d.ts +60 -0
  22. package/dist/react.js +208 -0
  23. package/dist/react.js.map +1 -0
  24. package/dist/reducer.d.ts +1244 -78
  25. package/dist/reducer.js +4204 -121
  26. package/dist/reducer.js.map +1 -1
  27. package/dist/testing.d.ts +520 -564
  28. package/dist/testing.js +2451 -915
  29. package/dist/testing.js.map +1 -1
  30. package/dist/types-Bj5ZLTUV.d.ts +114 -0
  31. package/package.json +40 -142
  32. package/dist/HandView-Bi2lxzQP.d.ts +0 -79
  33. package/dist/ResourceCounter-BFxJknqp.d.ts +0 -98
  34. package/dist/ThemeProvider-CElaL2ik.d.ts +0 -99
  35. package/dist/attributes-DbvyMbXw.d.ts +0 -68
  36. package/dist/browser-interaction.d.ts +0 -910
  37. package/dist/browser-interaction.js +0 -119
  38. package/dist/browser-interaction.js.map +0 -1
  39. package/dist/chunk-32PFKDV7.js +0 -11705
  40. package/dist/chunk-32PFKDV7.js.map +0 -1
  41. package/dist/chunk-3BAD4VC2.js +0 -263
  42. package/dist/chunk-3BAD4VC2.js.map +0 -1
  43. package/dist/chunk-3SKDNDPG.js +0 -104
  44. package/dist/chunk-3SKDNDPG.js.map +0 -1
  45. package/dist/chunk-5YV2WHJ4.js +0 -25
  46. package/dist/chunk-5YV2WHJ4.js.map +0 -1
  47. package/dist/chunk-ANRB4XKA.js +0 -90
  48. package/dist/chunk-ANRB4XKA.js.map +0 -1
  49. package/dist/chunk-BI4G3PM2.js +0 -1864
  50. package/dist/chunk-BI4G3PM2.js.map +0 -1
  51. package/dist/chunk-EVCLTY4Q.js +0 -935
  52. package/dist/chunk-EVCLTY4Q.js.map +0 -1
  53. package/dist/chunk-GDPKTBUR.js +0 -564
  54. package/dist/chunk-GDPKTBUR.js.map +0 -1
  55. package/dist/chunk-H6VDGFL5.js +0 -2903
  56. package/dist/chunk-H6VDGFL5.js.map +0 -1
  57. package/dist/chunk-LR3ZTWQF.js +0 -5960
  58. package/dist/chunk-LR3ZTWQF.js.map +0 -1
  59. package/dist/chunk-PF7L4BMG.js +0 -117
  60. package/dist/chunk-PF7L4BMG.js.map +0 -1
  61. package/dist/chunk-PN5O6GG2.js +0 -32
  62. package/dist/chunk-PN5O6GG2.js.map +0 -1
  63. package/dist/chunk-PZ5AY32C.js +0 -10
  64. package/dist/chunk-PZ5AY32C.js.map +0 -1
  65. package/dist/chunk-S2JEDVWH.js.map +0 -1
  66. package/dist/chunk-T3ZKNUZ7.js +0 -1
  67. package/dist/chunk-T3ZKNUZ7.js.map +0 -1
  68. package/dist/chunk-UGH54WZ2.js +0 -223
  69. package/dist/chunk-UGH54WZ2.js.map +0 -1
  70. package/dist/chunk-VCDWP5VL.js +0 -746
  71. package/dist/chunk-VCDWP5VL.js.map +0 -1
  72. package/dist/chunk-VDXOF4FW.js +0 -69
  73. package/dist/chunk-VDXOF4FW.js.map +0 -1
  74. package/dist/chunk-WHR5UW3F.js +0 -1988
  75. package/dist/chunk-WHR5UW3F.js.map +0 -1
  76. package/dist/chunk-Y75CFE77.js +0 -17
  77. package/dist/chunk-Y75CFE77.js.map +0 -1
  78. package/dist/chunk-Z7QCREWI.js +0 -3435
  79. package/dist/chunk-Z7QCREWI.js.map +0 -1
  80. package/dist/chunk-ZZGN2ATS.js +0 -1941
  81. package/dist/chunk-ZZGN2ATS.js.map +0 -1
  82. package/dist/components-gAbIz7hK.d.ts +0 -1284
  83. package/dist/definitions-BgmV_GhC.d.ts +0 -300
  84. package/dist/diagnostics-DIi3ina7.d.ts +0 -50
  85. package/dist/digest.d.ts +0 -8
  86. package/dist/game-CsZScpcn.d.ts +0 -763
  87. package/dist/hex-board-view-aKkblDp6.d.ts +0 -1228
  88. package/dist/index-CcT9Q7N7.d.ts +0 -193
  89. package/dist/index.d-DjzoK7zn.d.ts +0 -2101
  90. package/dist/package-set.d.ts +0 -13
  91. package/dist/package-set.js +0 -12
  92. package/dist/package-set.js.map +0 -1
  93. package/dist/player-state-Cqpyeql0.d.ts +0 -371
  94. package/dist/plugin-runtime-contract.d.ts +0 -17
  95. package/dist/plugin-runtime-contract.js +0 -92
  96. package/dist/plugin-runtime-contract.js.map +0 -1
  97. package/dist/primitive-props-BNHDkgd7.d.ts +0 -16
  98. package/dist/protocol-dYgafTYY.d.ts +0 -314
  99. package/dist/reducer/advanced.d.ts +0 -82
  100. package/dist/reducer/advanced.js +0 -51
  101. package/dist/reducer/advanced.js.map +0 -1
  102. package/dist/reducer-contract.d.ts +0 -11
  103. package/dist/reducer-contract.js +0 -16
  104. package/dist/reducer-contract.js.map +0 -1
  105. package/dist/reference-games/index.d.ts +0 -31
  106. package/dist/reference-games/index.js +0 -48
  107. package/dist/reference-games/index.js.map +0 -1
  108. package/dist/runtime/primitives.d.ts +0 -250
  109. package/dist/runtime/primitives.js +0 -189
  110. package/dist/runtime/primitives.js.map +0 -1
  111. package/dist/runtime/runtime-api.d.ts +0 -2
  112. package/dist/runtime/runtime-api.js +0 -1
  113. package/dist/runtime/runtime-api.js.map +0 -1
  114. package/dist/runtime/workspace-contract.d.ts +0 -392
  115. package/dist/runtime/workspace-contract.js +0 -28
  116. package/dist/runtime/workspace-contract.js.map +0 -1
  117. package/dist/runtime-RJ5orDJU.d.ts +0 -1699
  118. package/dist/runtime-api-Bz5pwNU_.d.ts +0 -296
  119. package/dist/runtime-json-CQ9QbLZ5.d.ts +0 -5
  120. package/dist/runtime.d.ts +0 -83
  121. package/dist/runtime.js +0 -242
  122. package/dist/runtime.js.map +0 -1
  123. package/dist/schema.d.ts +0 -379
  124. package/dist/stale-contract-artifact-error-XLaweZtF.d.ts +0 -18
  125. package/dist/testing-compiler.d.ts +0 -37
  126. package/dist/testing-compiler.js +0 -272
  127. package/dist/testing-compiler.js.map +0 -1
  128. package/dist/testing-runtime.d.ts +0 -119
  129. package/dist/testing-runtime.js +0 -212
  130. package/dist/testing-runtime.js.map +0 -1
  131. package/dist/types-DJj5MJkl.d.ts +0 -256
  132. package/dist/types-DR7DoB1x.d.ts +0 -28
  133. package/dist/types-JWCYHmu7.d.ts +0 -122
  134. package/dist/types.d.ts +0 -1958
  135. package/dist/types.js +0 -14
  136. package/dist/types.js.map +0 -1
  137. package/dist/ui/components.d.ts +0 -17
  138. package/dist/ui/components.js +0 -216
  139. package/dist/ui/components.js.map +0 -1
  140. package/dist/ui/defaults.d.ts +0 -19
  141. package/dist/ui/defaults.js +0 -104
  142. package/dist/ui/defaults.js.map +0 -1
  143. package/dist/ui/player-state.d.ts +0 -2
  144. package/dist/ui/player-state.js +0 -1
  145. package/dist/ui/player-state.js.map +0 -1
  146. package/dist/ui/plugin-styles.css +0 -2
  147. package/dist/ui-contract-GTUPkf8z.d.ts +0 -1168
  148. package/dist/ui.d.ts +0 -317
  149. package/dist/ui.js +0 -277
  150. package/dist/ui.js.map +0 -1
  151. package/dist/views-BpuWcOyN.d.ts +0 -1641
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/reducer/manifest/hex-geometry.ts","../src/reducer/manifest/preset-card-sets.ts","../src/reducer/manifest/manifest-validation.ts","../src/reducer/manifest/materialize.ts"],"sourcesContent":["import type { HexSpaceSpec, HexVertexRef } from \"@dreamboard-games/sdk-types\";\n\nconst HEX_CORNERS = [\"ne-e\", \"e-se\", \"se-sw\", \"sw-w\", \"w-nw\", \"nw-ne\"] as const;\ntype HexCorner = (typeof HEX_CORNERS)[number];\n\nconst HEX_CORNER_OFFSETS: Record<HexCorner, readonly [number, number, number]> =\n {\n \"ne-e\": [2, -1, -1],\n \"e-se\": [1, -2, 1],\n \"se-sw\": [-1, -1, 2],\n \"sw-w\": [-2, 1, 1],\n \"w-nw\": [-1, 2, -1],\n \"nw-ne\": [1, 1, -2],\n };\n\nfunction cubeFromAxial(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n): readonly [number, number, number] {\n const x = space.q;\n const z = space.r;\n return [x, -x - z, z] as const;\n}\n\nfunction cornerGeometryKey(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n corner: HexCorner,\n): string {\n const [x, y, z] = cubeFromAxial(space);\n const [dx, dy, dz] = HEX_CORNER_OFFSETS[corner];\n return `${3 * x + dx},${3 * y + dy},${3 * z + dz}`;\n}\n\nexport function resolveHexVertexGeometryKey(\n ref: HexVertexRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((left, right) => left.localeCompare(right))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Hex vertex ref references unknown space '${spaceId}'.`,\n );\n }\n return space;\n });\n const keyCounts = new Map<string, number>();\n for (const space of resolvedSpaces) {\n for (const corner of HEX_CORNERS) {\n const key = cornerGeometryKey(space, corner);\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n }\n const candidates = [...keyCounts.entries()]\n .filter(([, count]) => count === resolvedSpaces.length)\n .map(([key]) => key)\n .sort((left, right) => left.localeCompare(right));\n if (candidates.length !== 1) {\n throw new Error(\n `Hex vertex ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared vertex.`,\n );\n }\n const vertexKey = candidates[0];\n if (vertexKey === undefined) {\n throw new Error(\"internal: expected exactly one hex vertex geometry key\");\n }\n return vertexKey;\n}\n","import type {\n BoardCard,\n ComponentHomeSpec,\n GameTopologyManifest,\n ManualCardSetDefinition,\n ObjectSchema,\n PresetCardSetDefinition,\n PropertySchema,\n} from \"@dreamboard-games/sdk-types\";\n\nconst STANDARD_DECK_ID = \"standard_52_deck\";\n\nfunction createEnumPropertySchema(\n enums: string[],\n description: string,\n): PropertySchema {\n return {\n type: \"enum\",\n description,\n enums,\n };\n}\n\nfunction createStringPropertySchema(description: string): PropertySchema {\n return {\n type: \"string\",\n description,\n };\n}\n\nexport function createStandard52CardDeck(\n defaultHome: ComponentHomeSpec = { type: \"detached\" },\n): ManualCardSetDefinition {\n const suits = [\"SPADES\", \"HEARTS\", \"CLUBS\", \"DIAMONDS\"];\n const ranks = [\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n \"8\",\n \"9\",\n \"10\",\n \"J\",\n \"Q\",\n \"K\",\n \"A\",\n \"2\",\n ];\n\n const cards: BoardCard[] = [];\n for (const suit of suits) {\n for (const rank of ranks) {\n cards.push({\n type: `${suit}_${rank}`,\n name: `${rank} of ${suit}`,\n imageUrl: `/cards/${suit.toLowerCase()}_${rank.toLowerCase()}.png`,\n text: `A playing card: ${rank} of ${suit}. Value: ${getBigTwoCardValue(rank)}, Suit value: ${getSuitValue(suit)}`,\n count: 1,\n cardType: `${suit}_${rank}`,\n properties: {\n suit,\n rank,\n },\n });\n }\n }\n\n return {\n id: STANDARD_DECK_ID,\n name: \"Standard 52-Card Deck\",\n type: \"manual\",\n defaultHome,\n cards,\n cardSchema: {\n properties: {\n suit: createEnumPropertySchema(\n [\"SPADES\", \"HEARTS\", \"CLUBS\", \"DIAMONDS\"],\n \"The suit of the card\",\n ),\n rank: createStringPropertySchema(\"The rank of the card\"),\n },\n } satisfies ObjectSchema,\n };\n}\n\nexport function addStandardDecksIfNeeded(\n manifest: GameTopologyManifest,\n): GameTopologyManifest {\n return {\n ...manifest,\n cardSets: manifest.cardSets.map((cardSet) =>\n cardSet.type === \"preset\" && cardSet.presetId === STANDARD_DECK_ID\n ? {\n ...createStandard52CardDeck(cardSet.defaultHome),\n id: cardSet.id,\n name: cardSet.name,\n }\n : cardSet,\n ),\n };\n}\n\nexport function materializePresetCardSet(\n presetCardSet: PresetCardSetDefinition,\n): ManualCardSetDefinition {\n if (presetCardSet.presetId !== STANDARD_DECK_ID) {\n throw new Error(`Unsupported preset deck: ${presetCardSet.presetId}`);\n }\n\n const standardDeck = createStandard52CardDeck(presetCardSet.defaultHome);\n return {\n ...standardDeck,\n id: presetCardSet.id,\n name: presetCardSet.name,\n };\n}\n\nexport function materializeCardSet(\n cardSet: GameTopologyManifest[\"cardSets\"][number],\n): ManualCardSetDefinition {\n return cardSet.type === \"manual\"\n ? cardSet\n : materializePresetCardSet(cardSet);\n}\n\nfunction getBigTwoCardValue(rank: string): number {\n switch (rank) {\n case \"3\":\n return 3;\n case \"4\":\n return 4;\n case \"5\":\n return 5;\n case \"6\":\n return 6;\n case \"7\":\n return 7;\n case \"8\":\n return 8;\n case \"9\":\n return 9;\n case \"10\":\n return 10;\n case \"J\":\n return 11;\n case \"Q\":\n return 12;\n case \"K\":\n return 13;\n case \"A\":\n return 14;\n case \"2\":\n return 15;\n default:\n return 0;\n }\n}\n\nfunction getSuitValue(suit: string): number {\n switch (suit) {\n case \"DIAMONDS\":\n return 1;\n case \"CLUBS\":\n return 2;\n case \"HEARTS\":\n return 3;\n case \"SPADES\":\n return 4;\n default:\n return 0;\n }\n}\n","import type {\n HexBoardSpec,\n HexBoardTemplateSpec,\n HexSpaceSpec,\n HexVertexSpec,\n BoardCard,\n BoardSpec,\n BoardTemplateSpec,\n DieSeedSpec,\n DieTypeSpec,\n GameTopologyManifest,\n PieceSeedSpec,\n PieceTypeSpec,\n PropertySchema,\n SetupOptionSpec,\n ZoneSpec,\n} from \"@dreamboard-games/sdk-types\";\nimport { resolveHexVertexGeometryKey } from \"./hex-geometry.js\";\n\nexport type ManifestAuthoringValidationResult = {\n errors: string[];\n warnings: string[];\n};\n\nfunction isHexBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is Extract<BoardTemplateSpec, { layout: \"hex\" }> {\n return boardTemplate.layout === \"hex\";\n}\n\nfunction isHexBoardSpec(\n board: BoardSpec,\n): board is Extract<BoardSpec, { layout: \"hex\" }> {\n return board.layout === \"hex\";\n}\n\nfunction collectDuplicateIdIssues(options: {\n entries: ReadonlyArray<{ id?: string | null; path: string }>;\n label: string;\n}): string[] {\n const issues: string[] = [];\n const pathsById = new Map<string, string[]>();\n\n for (const entry of options.entries) {\n const id = entry.id?.trim();\n if (!id) {\n continue;\n }\n const paths = pathsById.get(id) ?? [];\n paths.push(entry.path);\n pathsById.set(id, paths);\n }\n\n for (const [id, paths] of pathsById.entries()) {\n if (paths.length > 1) {\n issues.push(`${paths.join(\", \")}: Duplicate ${options.label} '${id}'.`);\n }\n }\n\n return issues;\n}\n\nconst PROTOTYPE_SENSITIVE_KEYS = new Set([\n \"__proto__\",\n \"prototype\",\n \"constructor\",\n]);\n\nfunction validateRecordKey(\n value: string | null | undefined,\n path: string,\n): string[] {\n if (!value || !PROTOTYPE_SENSITIVE_KEYS.has(value)) {\n return [];\n }\n return [\n `${path}: '${value}' is reserved and cannot be used as a generated record key.`,\n ];\n}\n\nfunction collectKeyIssues(\n entries: ReadonlyArray<{ value?: string | null; path: string }>,\n): string[] {\n return entries.flatMap(({ value, path }) => validateRecordKey(value, path));\n}\n\nfunction toHandleKey(input: string): string {\n if (!/[_-]/.test(input)) {\n return input.charAt(0).toLowerCase() + input.slice(1);\n }\n const [first = \"\", ...rest] = input.split(/[_-]/g).filter(Boolean);\n return [\n first.toLowerCase(),\n ...rest.map((part) => {\n const lower = part.toLowerCase();\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n }),\n ].join(\"\");\n}\n\nfunction collectHandleKeyCollisions(\n values: readonly string[],\n label: string,\n): string[] {\n const idsByHandle = new Map<string, string[]>();\n for (const value of values) {\n const handle = toHandleKey(value);\n idsByHandle.set(handle, [...(idsByHandle.get(handle) ?? []), value]);\n }\n return [...idsByHandle.entries()]\n .filter(([, ids]) => ids.length > 1)\n .map(\n ([handle, ids]) =>\n `${label} values ${ids.join(\", \")} all generate handle '${handle}'.`,\n );\n}\n\nfunction dedupeSorted(values: Iterable<string>): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nfunction renderCardInstanceIds(card: BoardCard): string[] {\n return card.count > 1\n ? Array.from(\n { length: card.count },\n (_, index) => `${card.type}-${index + 1}`,\n )\n : [card.type];\n}\n\nfunction collectPropertySchemaKeyIssues(\n schema: PropertySchema | null | undefined,\n path: string,\n): string[] {\n if (!schema) {\n return [];\n }\n const issues: string[] = [];\n if (schema.type === \"object\") {\n for (const [key, property] of Object.entries(schema.properties ?? {})) {\n issues.push(\n ...validateRecordKey(key, `${path}.properties.${key}`),\n ...collectPropertySchemaKeyIssues(\n property,\n `${path}.properties.${key}`,\n ),\n );\n }\n }\n if (schema.type === \"array\") {\n issues.push(\n ...collectPropertySchemaKeyIssues(schema.items, `${path}.items`),\n );\n }\n if (schema.type === \"record\") {\n issues.push(\n ...collectPropertySchemaKeyIssues(schema.values, `${path}.values`),\n );\n }\n return issues;\n}\n\nfunction collectObjectSchemaKeyIssues(\n schema:\n | {\n properties?: Record<string, PropertySchema>;\n }\n | null\n | undefined,\n path: string,\n): string[] {\n const issues: string[] = [];\n for (const [key, property] of Object.entries(schema?.properties ?? {})) {\n issues.push(\n ...validateRecordKey(key, `${path}.properties.${key}`),\n ...collectPropertySchemaKeyIssues(property, `${path}.properties.${key}`),\n );\n }\n return issues;\n}\n\nfunction collectCardSchemaKeyIssues(\n cardSet: GameTopologyManifest[\"cardSets\"][number],\n path: string,\n): string[] {\n if (cardSet.type !== \"manual\") {\n return [];\n }\n const schema = cardSet.cardSchema;\n if (\"variants\" in schema) {\n return [\n ...Object.entries(schema.shared ?? {}).flatMap(([key, property]) => [\n ...validateRecordKey(key, `${path}.cardSchema.shared.${key}`),\n ...collectPropertySchemaKeyIssues(\n property,\n `${path}.cardSchema.shared.${key}`,\n ),\n ]),\n ...Object.entries(schema.variants).flatMap(\n ([variantKey, variantSchema]) => [\n ...validateRecordKey(\n variantKey,\n `${path}.cardSchema.variants.${variantKey}`,\n ),\n ...collectObjectSchemaKeyIssues(\n variantSchema,\n `${path}.cardSchema.variants.${variantKey}`,\n ),\n ],\n ),\n ];\n }\n return collectObjectSchemaKeyIssues(schema, `${path}.cardSchema`);\n}\n\nfunction expandSeedIds<\n Seed extends {\n id?: string | null;\n typeId: string;\n count?: number | null;\n },\n>(seeds: readonly Seed[]): string[] {\n return seeds.flatMap((seed) => {\n const count = seed.count ?? 1;\n const baseId = seed.id ?? seed.typeId;\n return count > 1\n ? Array.from({ length: count }, (_, index) => `${baseId}-${index + 1}`)\n : [baseId];\n });\n}\n\nfunction validateTypeSlotDuplicates(options: {\n pieceTypes: readonly PieceTypeSpec[];\n dieTypes: readonly DieTypeSpec[];\n}): string[] {\n const issues: string[] = [];\n\n for (const [index, pieceType] of options.pieceTypes.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (pieceType.slots ?? []).map((slot, slotIndex) => ({\n id: slot.id,\n path: `manifest.pieceTypes[${index}].slots[${slotIndex}].id`,\n })),\n label: \"piece slot id\",\n }),\n );\n }\n\n for (const [index, dieType] of options.dieTypes.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (dieType.slots ?? []).map((slot, slotIndex) => ({\n id: slot.id,\n path: `manifest.dieTypes[${index}].slots[${slotIndex}].id`,\n })),\n label: \"die slot id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction validateSlotHostsAndHomes(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const pieceTypesById = new Map(\n (manifest.pieceTypes ?? []).map(\n (pieceType) => [pieceType.id, pieceType] as const,\n ),\n );\n const dieTypesById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [dieType.id, dieType] as const),\n );\n const slotIdsByHostKey = new Map<string, Set<string>>();\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n const pieceType = pieceTypesById.get(seed.typeId);\n const slotIds = (pieceType?.slots ?? []).map((slot) => slot.id);\n if (slotIds.length === 0) {\n continue;\n }\n if (typeof seed.id !== \"string\" || seed.id.length === 0) {\n issues.push(\n `manifest.pieceSeeds[${index}].id: Piece seed for slot-bearing type '${seed.typeId}' must declare an explicit id.`,\n );\n continue;\n }\n if ((seed.count ?? 1) !== 1) {\n issues.push(\n `manifest.pieceSeeds[${index}].count: Piece seed '${seed.id}' for slot-bearing type '${seed.typeId}' must omit count or set it to 1.`,\n );\n continue;\n }\n slotIdsByHostKey.set(`piece:${seed.id}`, new Set(slotIds));\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n const dieType = dieTypesById.get(seed.typeId);\n const slotIds = (dieType?.slots ?? []).map((slot) => slot.id);\n if (slotIds.length === 0) {\n continue;\n }\n if (typeof seed.id !== \"string\" || seed.id.length === 0) {\n issues.push(\n `manifest.dieSeeds[${index}].id: Die seed for slot-bearing type '${seed.typeId}' must declare an explicit id.`,\n );\n continue;\n }\n if ((seed.count ?? 1) !== 1) {\n issues.push(\n `manifest.dieSeeds[${index}].count: Die seed '${seed.id}' for slot-bearing type '${seed.typeId}' must omit count or set it to 1.`,\n );\n continue;\n }\n slotIdsByHostKey.set(`die:${seed.id}`, new Set(slotIds));\n }\n\n const validateHome = (\n home: BoardCard[\"home\"] | PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"],\n path: string,\n ) => {\n if (home?.type !== \"slot\") {\n return;\n }\n\n const hostKey = `${home.host.kind}:${home.host.id}`;\n const slotIds = slotIdsByHostKey.get(hostKey);\n if (!slotIds) {\n issues.push(\n `${path}.host: Unknown strict slot host '${home.host.kind}:${home.host.id}'. Hosts must be singleton piece/die seeds whose type declares slots.`,\n );\n return;\n }\n if (!slotIds.has(home.slotId)) {\n issues.push(\n `${path}.slotId: Unknown slot '${home.slotId}' for host '${home.host.kind}:${home.host.id}'.`,\n );\n }\n };\n\n for (const [cardSetIndex, cardSet] of manifest.cardSets.entries()) {\n if (cardSet.type !== \"manual\") {\n continue;\n }\n validateHome(\n cardSet.defaultHome,\n `manifest.cardSets[${cardSetIndex}].defaultHome`,\n );\n for (const [cardIndex, card] of cardSet.cards.entries()) {\n validateHome(\n card.home,\n `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].home`,\n );\n }\n }\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n validateHome(seed.home, `manifest.pieceSeeds[${index}].home`);\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n validateHome(seed.home, `manifest.dieSeeds[${index}].home`);\n }\n\n return issues;\n}\n\nfunction validateSetupProfileReferences(\n manifest: GameTopologyManifest,\n): string[] {\n const issues: string[] = [];\n const optionChoiceIdsByOptionId = new Map<string, Set<string>>(\n (manifest.setupOptions ?? []).map((option, optionIndex) => {\n const choiceIds = new Set<string>();\n for (const choice of option.choices ?? []) {\n choiceIds.add(choice.id);\n }\n if (!option.id) {\n issues.push(\n `manifest.setupOptions[${optionIndex}].id: Missing option id.`,\n );\n }\n return [option.id, choiceIds];\n }),\n );\n\n for (const [profileIndex, profile] of (\n manifest.setupProfiles ?? []\n ).entries()) {\n const optionValues = profile.optionValues ?? {};\n for (const [optionId, choiceId] of Object.entries(optionValues)) {\n const allowedChoices = optionChoiceIdsByOptionId.get(optionId);\n if (!allowedChoices) {\n issues.push(\n `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}: Unknown setup option '${optionId}'.`,\n );\n continue;\n }\n if (!allowedChoices.has(choiceId)) {\n issues.push(\n `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}: Unknown choice '${choiceId}' for setup option '${optionId}'.`,\n );\n }\n }\n }\n\n return issues;\n}\n\nfunction validatePlayerScopedSeedHomes(\n manifest: GameTopologyManifest,\n): string[] {\n const issues: string[] = [];\n const boardScopeById = new Map(\n (manifest.boards ?? []).map((board) => [board.id, board.scope] as const),\n );\n const zoneScopeById = new Map(\n (manifest.zones ?? []).map((zone) => [zone.id, zone.scope] as const),\n );\n\n const validateSeedHome = (\n seed: PieceSeedSpec | DieSeedSpec,\n path: string,\n label: \"Piece seed\" | \"Die seed\",\n ) => {\n const authoredId = seed.id ?? seed.typeId;\n if (seed.ownerId) {\n return;\n }\n\n if (\n homeTargetsBoard(seed.home) &&\n boardScopeById.get(seed.home.boardId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.boardId: ${label} '${authoredId}' requires ownerId because board '${seed.home.boardId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n return;\n }\n\n if (\n seed.home?.type === \"zone\" &&\n zoneScopeById.get(seed.home.zoneId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.zoneId: ${label} '${authoredId}' requires ownerId because zone '${seed.home.zoneId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n };\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n validateSeedHome(seed, `manifest.pieceSeeds[${index}].home`, \"Piece seed\");\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n validateSeedHome(seed, `manifest.dieSeeds[${index}].home`, \"Die seed\");\n }\n\n return issues;\n}\n\nfunction validateCardHomes(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const boardScopeById = new Map(\n (manifest.boards ?? []).map((board) => [board.id, board.scope] as const),\n );\n const zoneScopeById = new Map(\n (manifest.zones ?? []).map((zone) => [zone.id, zone.scope] as const),\n );\n\n for (const [cardSetIndex, cardSet] of manifest.cardSets.entries()) {\n if (!cardSet.defaultHome) {\n issues.push(\n `manifest.cardSets[${cardSetIndex}].defaultHome: ${\n cardSet.type === \"manual\" ? \"Manual\" : \"Preset\"\n } card sets must declare defaultHome.`,\n );\n continue;\n }\n const validateCardHome = (\n home: BoardCard[\"home\"],\n path: string,\n label: string,\n ) => {\n if (\n home?.type === \"zone\" &&\n zoneScopeById.get(home.zoneId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.zoneId: ${label} cannot target per-player zone '${home.zoneId}' because card inventory has no ownerId. Place it during reducer setup instead.`,\n );\n }\n if (\n homeTargetsBoard(home) &&\n boardScopeById.get(home.boardId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.boardId: ${label} cannot target per-player board '${home.boardId}' because card inventory has no ownerId. Place it during reducer setup instead.`,\n );\n }\n };\n\n validateCardHome(\n cardSet.defaultHome,\n `manifest.cardSets[${cardSetIndex}].defaultHome`,\n `Card set '${cardSet.id}' defaultHome`,\n );\n for (const [cardIndex, card] of (cardSet.type === \"manual\"\n ? cardSet.cards\n : []\n ).entries()) {\n const path = `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].home`;\n validateCardHome(card.home, path, `Card '${card.type}'`);\n }\n }\n\n return issues;\n}\n\nfunction homeTargetsBoard(\n home:\n | BoardCard[\"home\"]\n | PieceSeedSpec[\"home\"]\n | DieSeedSpec[\"home\"]\n | undefined,\n): home is Extract<\n NonNullable<BoardCard[\"home\"] | PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"]>,\n { type: \"space\" | \"container\" | \"edge\" | \"vertex\" }\n> {\n return (\n home?.type === \"space\" ||\n home?.type === \"container\" ||\n home?.type === \"edge\" ||\n home?.type === \"vertex\"\n );\n}\n\nfunction validateBoardTemplateDuplicates(\n boardTemplates: readonly BoardTemplateSpec[],\n): string[] {\n const issues: string[] = [];\n\n for (const [index, boardTemplate] of boardTemplates.entries()) {\n if (isHexBoardTemplateSpec(boardTemplate)) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boardTemplates[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n continue;\n }\n\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boardTemplates[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.containers ?? []).map(\n (container, containerIndex) => ({\n id: container.id,\n path: `manifest.boardTemplates[${index}].containers[${containerIndex}].id`,\n }),\n ),\n label: \"container id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.relations ?? []).map(\n (relation, relationIndex) => ({\n id: relation.id,\n path: `manifest.boardTemplates[${index}].relations[${relationIndex}].id`,\n }),\n ),\n label: \"relation id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction validateBoardDuplicates(boards: readonly BoardSpec[]): string[] {\n const issues: string[] = [];\n\n for (const [index, board] of boards.entries()) {\n if (isHexBoardSpec(board)) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boards[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n continue;\n }\n\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boards[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.containers ?? []).map((container, containerIndex) => ({\n id: container.id,\n path: `manifest.boards[${index}].containers[${containerIndex}].id`,\n })),\n label: \"container id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.relations ?? []).map((relation, relationIndex) => ({\n id: relation.id,\n path: `manifest.boards[${index}].relations[${relationIndex}].id`,\n })),\n label: \"relation id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction validateSetupOptionChoiceDuplicates(\n options: readonly SetupOptionSpec[],\n): string[] {\n const issues: string[] = [];\n\n for (const [optionIndex, option] of options.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (option.choices ?? []).map((choice, choiceIndex) => ({\n id: choice.id,\n path: `manifest.setupOptions[${optionIndex}].choices[${choiceIndex}].id`,\n })),\n label: \"setup option choice id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction resolveHexSpaces(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n): HexSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n continue;\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n q: templateSpace.q,\n r: templateSpace.r,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction validateHexVertexRefs(options: {\n ownerPath: string;\n ownerLabel: string;\n spaces: readonly HexSpaceSpec[];\n vertices: readonly HexVertexSpec[];\n}): string[] {\n const issues: string[] = [];\n const spacesById = new Map(\n options.spaces.map((space) => [space.id, space] as const),\n );\n\n for (const [vertexIndex, vertex] of options.vertices.entries()) {\n try {\n resolveHexVertexGeometryKey(vertex.ref, spacesById);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown hex vertex error.\";\n issues.push(\n `${options.ownerPath}.vertices[${vertexIndex}].ref: ${options.ownerLabel} with spaces '${vertex.ref.spaces.join(\", \")}' failed validation. ${message}`,\n );\n }\n }\n\n return issues;\n}\n\nfunction validateHexBoardVertexRefs(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const hexTemplatesById = new Map(\n (manifest.boardTemplates ?? [])\n .filter(isHexBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n\n for (const [templateIndex, template] of (\n manifest.boardTemplates ?? []\n ).entries()) {\n if (!isHexBoardTemplateSpec(template)) {\n continue;\n }\n issues.push(\n ...validateHexVertexRefs({\n ownerPath: `manifest.boardTemplates[${templateIndex}]`,\n ownerLabel: `Hex board template '${template.id}'`,\n spaces: template.spaces ?? [],\n vertices: template.vertices ?? [],\n }),\n );\n }\n\n for (const [boardIndex, board] of (manifest.boards ?? []).entries()) {\n if (!isHexBoardSpec(board)) {\n continue;\n }\n issues.push(\n ...validateHexVertexRefs({\n ownerPath: `manifest.boards[${boardIndex}]`,\n ownerLabel: `Hex board '${board.id}'`,\n spaces: resolveHexSpaces(\n board,\n hexTemplatesById.get(board.templateId ?? \"\"),\n ),\n vertices: board.vertices ?? [],\n }),\n );\n }\n\n return issues;\n}\n\nfunction collectAmbiguousBoardTypeWarnings(\n manifest: GameTopologyManifest,\n): string[] {\n const warnings: string[] = [];\n const boardTemplatesById = new Map(\n (manifest.boardTemplates ?? []).map(\n (template) => [template.id, template] as const,\n ),\n );\n const boardsBySpaceType = new Map<string, Set<string>>();\n const boardsByEdgeType = new Map<string, Set<string>>();\n const boardsByVertexType = new Map<string, Set<string>>();\n\n const addBoardUsage = (\n target: Map<string, Set<string>>,\n typeId: string | null | undefined,\n boardId: string,\n ) => {\n if (!typeId) {\n return;\n }\n const boardIds = target.get(typeId) ?? new Set<string>();\n boardIds.add(boardId);\n target.set(typeId, boardIds);\n };\n\n for (const board of manifest.boards ?? []) {\n const template = board.templateId\n ? boardTemplatesById.get(board.templateId)\n : undefined;\n for (const space of [\n ...((template?.layout === board.layout ? template.spaces : undefined) ??\n []),\n ...(board.spaces ?? []),\n ]) {\n addBoardUsage(boardsBySpaceType, space.typeId, board.id);\n }\n\n if (board.layout === \"hex\" || board.layout === \"square\") {\n for (const edge of [\n ...((template?.layout === board.layout ? template.edges : undefined) ??\n []),\n ...(board.edges ?? []),\n ]) {\n addBoardUsage(boardsByEdgeType, edge.typeId, board.id);\n }\n for (const vertex of [\n ...((template?.layout === board.layout\n ? template.vertices\n : undefined) ?? []),\n ...(board.vertices ?? []),\n ]) {\n addBoardUsage(boardsByVertexType, vertex.typeId, board.id);\n }\n }\n }\n\n const pushWarnings = (\n kind: \"space\" | \"edge\" | \"vertex\",\n boardsByType: Map<string, Set<string>>,\n helperName: string,\n ) => {\n for (const [typeId, boardIds] of boardsByType.entries()) {\n if (boardIds.size < 2) {\n continue;\n }\n warnings.push(\n `Ambiguous ${kind}.typeId '${typeId}' is authored on multiple boards (${Array.from(boardIds).sort().join(\", \")}). Prefer ${helperName} for board-scoped lookups.`,\n );\n }\n };\n\n pushWarnings(\n \"space\",\n boardsBySpaceType,\n \"boardHelpers.spaceIdsByBoardId / boardHelpers.spaceTypeIdByBoardId\",\n );\n pushWarnings(\n \"edge\",\n boardsByEdgeType,\n \"boardHelpers.edgeIdsByBoardIdAndTypeId\",\n );\n pushWarnings(\n \"vertex\",\n boardsByVertexType,\n \"boardHelpers.vertexIdsByBoardIdAndTypeId\",\n );\n\n return warnings;\n}\n\nfunction collectBoardRecordKeyIssues(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const maxPlayers = manifest.players.maxPlayers;\n const playerIds = Array.from(\n { length: maxPlayers },\n (_, index) => `player-${index + 1}`,\n );\n\n for (const [templateIndex, boardTemplate] of (\n manifest.boardTemplates ?? []\n ).entries()) {\n const templatePath = `manifest.boardTemplates[${templateIndex}]`;\n issues.push(\n ...collectKeyIssues([\n { value: boardTemplate.id, path: `${templatePath}.id` },\n { value: boardTemplate.typeId, path: `${templatePath}.typeId` },\n ]),\n ...collectObjectSchemaKeyIssues(\n boardTemplate.boardFieldsSchema,\n `${templatePath}.boardFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n boardTemplate.spaceFieldsSchema,\n `${templatePath}.spaceFieldsSchema`,\n ),\n );\n\n if (boardTemplate.layout !== \"hex\") {\n issues.push(\n ...collectObjectSchemaKeyIssues(\n boardTemplate.relationFieldsSchema,\n `${templatePath}.relationFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n boardTemplate.containerFieldsSchema,\n `${templatePath}.containerFieldsSchema`,\n ),\n ...collectKeyIssues([\n ...(boardTemplate.containers ?? []).flatMap(\n (container, containerIndex) => [\n {\n value: container.id,\n path: `${templatePath}.containers[${containerIndex}].id`,\n },\n {\n value:\n container.host.type === \"space\"\n ? container.host.spaceId\n : undefined,\n path: `${templatePath}.containers[${containerIndex}].host.spaceId`,\n },\n ],\n ),\n ...(boardTemplate.relations ?? []).flatMap(\n (relation, relationIndex) => [\n {\n value: relation.id,\n path: `${templatePath}.relations[${relationIndex}].id`,\n },\n {\n value: relation.typeId,\n path: `${templatePath}.relations[${relationIndex}].typeId`,\n },\n {\n value: relation.fromSpaceId,\n path: `${templatePath}.relations[${relationIndex}].fromSpaceId`,\n },\n {\n value: relation.toSpaceId,\n path: `${templatePath}.relations[${relationIndex}].toSpaceId`,\n },\n ],\n ),\n ]),\n );\n }\n\n if (boardTemplate.layout !== \"generic\") {\n issues.push(\n ...collectObjectSchemaKeyIssues(\n boardTemplate.edgeFieldsSchema,\n `${templatePath}.edgeFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n boardTemplate.vertexFieldsSchema,\n `${templatePath}.vertexFieldsSchema`,\n ),\n ...collectKeyIssues([\n ...(boardTemplate.edges ?? []).map((edge, edgeIndex) => ({\n value: edge.typeId,\n path: `${templatePath}.edges[${edgeIndex}].typeId`,\n })),\n ...(boardTemplate.vertices ?? []).map((vertex, vertexIndex) => ({\n value: vertex.typeId,\n path: `${templatePath}.vertices[${vertexIndex}].typeId`,\n })),\n ]),\n );\n }\n\n issues.push(\n ...collectKeyIssues(\n (boardTemplate.spaces ?? []).flatMap((space, spaceIndex) => [\n {\n value: space.id,\n path: `${templatePath}.spaces[${spaceIndex}].id`,\n },\n {\n value: space.typeId,\n path: `${templatePath}.spaces[${spaceIndex}].typeId`,\n },\n ]),\n ),\n );\n }\n\n for (const [boardIndex, board] of (manifest.boards ?? []).entries()) {\n const boardPath = `manifest.boards[${boardIndex}]`;\n const runtimeBoardIds =\n board.scope === \"perPlayer\"\n ? playerIds.map((playerId) => `${board.id}:${playerId}`)\n : [board.id];\n issues.push(\n ...collectKeyIssues([\n { value: board.id, path: `${boardPath}.id` },\n { value: board.typeId, path: `${boardPath}.typeId` },\n { value: board.templateId, path: `${boardPath}.templateId` },\n ...runtimeBoardIds.map((runtimeBoardId) => ({\n value: runtimeBoardId,\n path: `${boardPath}.runtimeBoardId`,\n })),\n ]),\n ...collectObjectSchemaKeyIssues(\n board.boardFieldsSchema,\n `${boardPath}.boardFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n board.spaceFieldsSchema,\n `${boardPath}.spaceFieldsSchema`,\n ),\n );\n\n if (board.layout !== \"hex\") {\n issues.push(\n ...collectObjectSchemaKeyIssues(\n board.relationFieldsSchema,\n `${boardPath}.relationFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n board.containerFieldsSchema,\n `${boardPath}.containerFieldsSchema`,\n ),\n ...collectKeyIssues([\n ...(board.containers ?? []).flatMap((container, containerIndex) => [\n {\n value: container.id,\n path: `${boardPath}.containers[${containerIndex}].id`,\n },\n {\n value:\n container.host.type === \"space\"\n ? container.host.spaceId\n : undefined,\n path: `${boardPath}.containers[${containerIndex}].host.spaceId`,\n },\n ]),\n ...(board.relations ?? []).flatMap((relation, relationIndex) => [\n {\n value: relation.id,\n path: `${boardPath}.relations[${relationIndex}].id`,\n },\n {\n value: relation.typeId,\n path: `${boardPath}.relations[${relationIndex}].typeId`,\n },\n {\n value: relation.fromSpaceId,\n path: `${boardPath}.relations[${relationIndex}].fromSpaceId`,\n },\n {\n value: relation.toSpaceId,\n path: `${boardPath}.relations[${relationIndex}].toSpaceId`,\n },\n ]),\n ]),\n );\n }\n\n if (board.layout !== \"generic\") {\n issues.push(\n ...collectObjectSchemaKeyIssues(\n board.edgeFieldsSchema,\n `${boardPath}.edgeFieldsSchema`,\n ),\n ...collectObjectSchemaKeyIssues(\n board.vertexFieldsSchema,\n `${boardPath}.vertexFieldsSchema`,\n ),\n ...collectKeyIssues([\n ...(board.edges ?? []).map((edge, edgeIndex) => ({\n value: edge.typeId,\n path: `${boardPath}.edges[${edgeIndex}].typeId`,\n })),\n ...(board.vertices ?? []).map((vertex, vertexIndex) => ({\n value: vertex.typeId,\n path: `${boardPath}.vertices[${vertexIndex}].typeId`,\n })),\n ]),\n );\n }\n\n issues.push(\n ...collectKeyIssues(\n (board.spaces ?? []).flatMap((space, spaceIndex) => [\n {\n value: space.id,\n path: `${boardPath}.spaces[${spaceIndex}].id`,\n },\n {\n value: space.typeId,\n path: `${boardPath}.spaces[${spaceIndex}].typeId`,\n },\n ]),\n ),\n );\n }\n\n return issues;\n}\n\nfunction collectManifestRecordKeyIssues(\n manifest: GameTopologyManifest,\n): string[] {\n const cardSets = manifest.cardSets;\n const manualCards = cardSets.flatMap((cardSet, cardSetIndex) =>\n cardSet.type === \"manual\"\n ? cardSet.cards.flatMap((card, cardIndex) =>\n renderCardInstanceIds(card).map((cardId) => ({\n card,\n cardId,\n cardIndex,\n cardSetIndex,\n })),\n )\n : [],\n );\n\n return [\n ...collectKeyIssues([\n ...cardSets.map((cardSet, index) => ({\n value: cardSet.id,\n path: `manifest.cardSets[${index}].id`,\n })),\n ...manualCards.flatMap(({ card, cardId, cardIndex, cardSetIndex }) => [\n {\n value: card.type,\n path: `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].type`,\n },\n {\n value: card.cardType,\n path: `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].cardType`,\n },\n {\n value: cardId,\n path: `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].runtimeId`,\n },\n ]),\n ...(manifest.zones ?? []).map((zone, index) => ({\n value: zone.id,\n path: `manifest.zones[${index}].id`,\n })),\n ...(manifest.resources ?? []).map((resource, index) => ({\n value: resource.id,\n path: `manifest.resources[${index}].id`,\n })),\n ...(manifest.pieceTypes ?? []).flatMap((pieceType, typeIndex) => [\n {\n value: pieceType.id,\n path: `manifest.pieceTypes[${typeIndex}].id`,\n },\n ...(pieceType.slots ?? []).map((slot, slotIndex) => ({\n value: slot.id,\n path: `manifest.pieceTypes[${typeIndex}].slots[${slotIndex}].id`,\n })),\n ]),\n ...(manifest.dieTypes ?? []).flatMap((dieType, typeIndex) => [\n {\n value: dieType.id,\n path: `manifest.dieTypes[${typeIndex}].id`,\n },\n ...(dieType.slots ?? []).map((slot, slotIndex) => ({\n value: slot.id,\n path: `manifest.dieTypes[${typeIndex}].slots[${slotIndex}].id`,\n })),\n ]),\n ...expandSeedIds(manifest.pieceSeeds ?? []).map((pieceId, index) => ({\n value: pieceId,\n path: `manifest.pieceSeeds[*][${index}]`,\n })),\n ...expandSeedIds(manifest.dieSeeds ?? []).map((dieId, index) => ({\n value: dieId,\n path: `manifest.dieSeeds[*][${index}]`,\n })),\n ...(manifest.setupOptions ?? []).flatMap((option, optionIndex) => [\n {\n value: option.id,\n path: `manifest.setupOptions[${optionIndex}].id`,\n },\n ...(option.choices ?? []).map((choice, choiceIndex) => ({\n value: choice.id,\n path: `manifest.setupOptions[${optionIndex}].choices[${choiceIndex}].id`,\n })),\n ]),\n ...(manifest.setupProfiles ?? []).flatMap((profile, profileIndex) => [\n {\n value: profile.id,\n path: `manifest.setupProfiles[${profileIndex}].id`,\n },\n ...(profile.guidance?.steps ?? []).map((step, stepIndex) => ({\n value: step.id,\n path: `manifest.setupProfiles[${profileIndex}].guidance.steps[${stepIndex}].id`,\n })),\n ...Object.entries(profile.optionValues ?? {}).flatMap(\n ([optionId, choiceId]) => [\n {\n value: optionId,\n path: `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}`,\n },\n {\n value: choiceId,\n path: `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}`,\n },\n ],\n ),\n ]),\n ]),\n ...cardSets.flatMap((cardSet, cardSetIndex) =>\n collectCardSchemaKeyIssues(cardSet, `manifest.cardSets[${cardSetIndex}]`),\n ),\n ...(manifest.pieceTypes ?? []).flatMap((pieceType, typeIndex) =>\n collectObjectSchemaKeyIssues(\n pieceType.fieldsSchema,\n `manifest.pieceTypes[${typeIndex}].fieldsSchema`,\n ),\n ),\n ...(manifest.dieTypes ?? []).flatMap((dieType, typeIndex) =>\n collectObjectSchemaKeyIssues(\n dieType.fieldsSchema,\n `manifest.dieTypes[${typeIndex}].fieldsSchema`,\n ),\n ),\n ...collectBoardRecordKeyIssues(manifest),\n ...collectHandleKeyCollisions(\n dedupeSorted(manualCards.map(({ card }) => card.cardType ?? card.type)),\n \"Card type\",\n ),\n ...collectHandleKeyCollisions(\n dedupeSorted((manifest.zones ?? []).map((zone) => zone.id)),\n \"Zone\",\n ),\n ];\n}\n\nexport function validateManifestAuthoring(\n manifest: GameTopologyManifest,\n): ManifestAuthoringValidationResult {\n const errors: string[] = [];\n\n errors.push(...collectManifestRecordKeyIssues(manifest));\n errors.push(\n ...collectDuplicateIdIssues({\n entries: manifest.cardSets.map((cardSet, index) => ({\n id: cardSet.id,\n path: `manifest.cardSets[${index}].id`,\n })),\n label: \"card set id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: manifest.cardSets.flatMap((cardSet, cardSetIndex) =>\n cardSet.type === \"manual\"\n ? cardSet.cards.flatMap((card, cardIndex) =>\n renderCardInstanceIds(card).map((cardId) => ({\n id: cardId,\n path: `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].type`,\n })),\n )\n : [],\n ),\n label: \"card runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.zones ?? []).map((zone: ZoneSpec, index) => ({\n id: zone.id,\n path: `manifest.zones[${index}].id`,\n })),\n label: \"zone id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.boardTemplates ?? []).map((boardTemplate, index) => ({\n id: boardTemplate.id,\n path: `manifest.boardTemplates[${index}].id`,\n })),\n label: \"board template id\",\n }),\n );\n errors.push(\n ...validateBoardTemplateDuplicates(manifest.boardTemplates ?? []),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.boards ?? []).map((board, index) => ({\n id: board.id,\n path: `manifest.boards[${index}].id`,\n })),\n label: \"board id\",\n }),\n );\n errors.push(...validateBoardDuplicates(manifest.boards ?? []));\n errors.push(\n ...validateTypeSlotDuplicates({\n pieceTypes: manifest.pieceTypes ?? [],\n dieTypes: manifest.dieTypes ?? [],\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.pieceTypes ?? []).map((pieceType, index) => ({\n id: pieceType.id,\n path: `manifest.pieceTypes[${index}].id`,\n })),\n label: \"piece type id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: expandSeedIds(manifest.pieceSeeds ?? []).map(\n (pieceId, index) => ({\n id: pieceId,\n path: `manifest.pieceSeeds[*][${index}]`,\n }),\n ),\n label: \"piece runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.dieTypes ?? []).map((dieType, index) => ({\n id: dieType.id,\n path: `manifest.dieTypes[${index}].id`,\n })),\n label: \"die type id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: expandSeedIds(manifest.dieSeeds ?? []).map((dieId, index) => ({\n id: dieId,\n path: `manifest.dieSeeds[*][${index}]`,\n })),\n label: \"die runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.resources ?? []).map((resource, index) => ({\n id: resource.id,\n path: `manifest.resources[${index}].id`,\n })),\n label: \"resource id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.setupOptions ?? []).map((option, index) => ({\n id: option.id,\n path: `manifest.setupOptions[${index}].id`,\n })),\n label: \"setup option id\",\n }),\n );\n errors.push(\n ...validateSetupOptionChoiceDuplicates(manifest.setupOptions ?? []),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.setupProfiles ?? []).map((profile, index) => ({\n id: profile.id,\n path: `manifest.setupProfiles[${index}].id`,\n })),\n label: \"setup profile id\",\n }),\n );\n for (const [profileIndex, profile] of (\n manifest.setupProfiles ?? []\n ).entries()) {\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (profile.guidance?.steps ?? []).map((step, stepIndex) => ({\n id: step.id,\n path: `manifest.setupProfiles[${profileIndex}].guidance.steps[${stepIndex}].id`,\n })),\n label: `setup profile '${profile.id}' guidance step id`,\n }),\n );\n }\n errors.push(...validateSlotHostsAndHomes(manifest));\n errors.push(...validatePlayerScopedSeedHomes(manifest));\n errors.push(...validateCardHomes(manifest));\n errors.push(...validateSetupProfileReferences(manifest));\n errors.push(...validateHexBoardVertexRefs(manifest));\n\n return {\n errors,\n warnings: collectAmbiguousBoardTypeWarnings(manifest),\n };\n}\n","import type {\n BoardEdgeRef,\n BoardContainerSpec,\n BoardCard,\n BoardRelationSpec,\n BoardSpec,\n BoardSpaceSpec,\n BoardTemplateSpec,\n BoardVertexRef,\n GameTopologyManifest,\n GenericBoardSpec,\n GenericBoardTemplateSpec,\n HexBoardSpec,\n HexBoardTemplateSpec,\n HexEdgeRef,\n HexEdgeSpec,\n HexSpaceSpec,\n HexVertexRef,\n HexVertexSpec,\n DieSeedSpec,\n ManualCardSetDefinition,\n ObjectSchema,\n PieceSeedSpec,\n PropertySchema,\n SquareBoardSpec,\n SquareBoardTemplateSpec,\n SquareEdgeSpec,\n SquareSpaceSpec,\n SquareVertexSpec,\n ZoneSpec,\n} from \"@dreamboard-games/sdk-types\";\n\nimport { resolveHexVertexGeometryKey } from \"./hex-geometry.js\";\n\nimport {\n addStandardDecksIfNeeded,\n materializeCardSet,\n} from \"./preset-card-sets.js\";\n\nimport { validateManifestAuthoring } from \"./manifest-validation.js\";\n\ninterface AnalyzedGenericBoard {\n layout: \"generic\";\n board: GenericBoardSpec;\n template?: GenericBoardTemplateSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n relationFieldsSchema?: ObjectSchema | null;\n containerFieldsSchema?: ObjectSchema | null;\n spaces: BoardSpaceSpec[];\n relations: BoardRelationSpec[];\n containers: BoardContainerSpec[];\n}\n\ninterface AnalyzedHexBoard {\n layout: \"hex\";\n board: HexBoardSpec;\n template?: HexBoardTemplateSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n edgeFieldsSchema?: ObjectSchema | null;\n vertexFieldsSchema?: ObjectSchema | null;\n spaces: HexSpaceSpec[];\n authoredEdges: Array<{\n id: string;\n ref: HexEdgeRef;\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n authoredVertices: Array<{\n id: string;\n ref: HexVertexRef;\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n edges: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n vertices: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n}\n\ninterface AnalyzedSquareBoard {\n layout: \"square\";\n board: SquareBoardSpec;\n template?: SquareBoardTemplateSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n relationFieldsSchema?: ObjectSchema | null;\n containerFieldsSchema?: ObjectSchema | null;\n edgeFieldsSchema?: ObjectSchema | null;\n vertexFieldsSchema?: ObjectSchema | null;\n spaces: SquareSpaceSpec[];\n relations: BoardRelationSpec[];\n containers: BoardContainerSpec[];\n edges: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n vertices: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n}\n\ntype AnalyzedBoard =\n | AnalyzedGenericBoard\n | AnalyzedHexBoard\n | AnalyzedSquareBoard;\n\ninterface ManifestAnalysis {\n manifest: GameTopologyManifest;\n playerIds: string[];\n sharedZones: ZoneSpec[];\n playerZones: ZoneSpec[];\n zoneIds: string[];\n cardSets: ManualCardSetDefinition[];\n cardSetIds: string[];\n cardTypes: string[];\n cardIds: string[];\n cardSetIdByCardId: Map<string, string>;\n cardTypeByCardId: Map<string, string>;\n sharedZoneCardSetIds: Map<string, string[]>;\n sharedZoneIdsByCardSetId: Map<string, string[]>;\n homeSharedZoneIdsByCardType: Map<string, string[]>;\n homeSharedZoneIdByCardType: Map<string, string>;\n playerZoneCardSetIds: Map<string, string[]>;\n zoneCardSetIdsById: Map<string, string[]>;\n zoneVisibilityById: Map<string, string>;\n resourceIds: string[];\n resourcePresentationById: Record<\n string,\n { label: string; icon?: string | null }\n >;\n setupOptionIds: string[];\n setupProfileIds: string[];\n setupChoiceIdsByOptionId: Map<string, string[]>;\n setupOptionsById: Record<\n string,\n {\n id: string;\n name: string;\n description?: string | null;\n choices: ReadonlyArray<{\n id: string;\n label: string;\n description?: string | null;\n }>;\n }\n >;\n setupProfilesById: Record<\n string,\n {\n id: string;\n name: string;\n description?: string | null;\n optionValues?: Record<string, string> | null;\n guidance?: {\n summary?: string | null;\n steps: ReadonlyArray<{\n id: string;\n label: string;\n description?: string | null;\n }>;\n } | null;\n }\n >;\n pieceTypeIds: string[];\n pieceIds: string[];\n pieceTypeIdByPieceId: Map<string, string>;\n dieTypeIds: string[];\n dieIds: string[];\n dieTypeIdByDieId: Map<string, string>;\n strictSlotHosts: Array<{\n kind: \"piece\" | \"die\";\n id: string;\n slotIds: string[];\n }>;\n boardTemplateIds: string[];\n boardBaseIds: string[];\n boardIds: string[];\n boardContainerIds: string[];\n boardTypeIds: string[];\n boardLayoutById: Map<string, string>;\n boardIdsByLayout: Map<string, string[]>;\n boardBaseIdsByLayout: Map<string, string[]>;\n boardIdsByBaseId: Map<string, string[]>;\n boardBaseIdsByTemplateId: Map<string, string[]>;\n boardTemplateLayoutById: Map<string, string>;\n boardIdsByTypeId: Map<string, string[]>;\n spaceIdsByBoardId: Map<string, string[]>;\n spaceTypeIdByBoardId: Map<string, Record<string, string | null>>;\n spaceIdsByTypeId: Map<string, string[]>;\n containerIdsByBoardId: Map<string, string[]>;\n containerHostByBoardId: Map<\n string,\n Record<string, { type: \"board\" } | { type: \"space\"; spaceId: string }>\n >;\n relationTypeIds: string[];\n relationTypeIdsByBoardId: Map<string, string[]>;\n edgeIds: string[];\n edgeTypeIds: string[];\n edgeIdsByTypeId: Map<string, string[]>;\n edgeIdsByBoardIdAndTypeId: Map<string, Record<string, string[]>>;\n vertexIds: string[];\n vertexTypeIds: string[];\n vertexIdsByTypeId: Map<string, string[]>;\n vertexIdsByBoardIdAndTypeId: Map<string, Record<string, string[]>>;\n spaceIds: string[];\n spaceTypeIds: string[];\n analyzedBoards: AnalyzedBoard[];\n pieceTypeSchemasById: Map<string, ObjectSchema | null | undefined>;\n dieTypeSchemasById: Map<string, ObjectSchema | null | undefined>;\n}\n\ntype CardPropertySchemaVariants = {\n shared?: Record<string, PropertySchema>;\n variants: Record<string, ObjectSchema>;\n};\n\ntype CardPropertySchema = ObjectSchema | CardPropertySchemaVariants;\n\nfunction isCardPropertySchemaVariants(\n schema: CardPropertySchema | null | undefined,\n): schema is CardPropertySchemaVariants {\n return Boolean(schema && \"variants\" in schema);\n}\n\nfunction mergeSharedCardProperties(\n schema: CardPropertySchemaVariants,\n cardType: string,\n): ObjectSchema | null {\n const variant = schema.variants[cardType];\n if (!variant) {\n return null;\n }\n return {\n properties: {\n ...(schema.shared ?? {}),\n ...variant.properties,\n },\n };\n}\n\nfunction hasPropertySchemaDefault(\n property: PropertySchema | null | undefined,\n): property is PropertySchema & { default: unknown } {\n return Boolean(property && \"default\" in property);\n}\n\nfunction dedupeSorted(values: Iterable<string>): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nfunction sortedObject<Value>(\n entries: Iterable<readonly [string, Value]>,\n): Record<string, Value> {\n return Object.fromEntries(\n Array.from(entries).sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nfunction createRecord<Value>(): Record<string, Value> {\n return Object.create(null) as Record<string, Value>;\n}\n\nfunction renderCardInstanceIds(card: BoardCard): string[] {\n if (card.count > 1) {\n return Array.from(\n { length: card.count },\n (_, index) => `${card.type}-${index + 1}`,\n );\n }\n return [card.type];\n}\n\nfunction expandSeedIds(\n seeds: ReadonlyArray<\n | PieceSeedSpec\n | { id?: string | null; typeId: string; count?: number | null }\n >,\n): string[] {\n const expanded: string[] = [];\n for (const seed of seeds) {\n const count = seed.count ?? 1;\n const baseId = seed.id ?? seed.typeId;\n if (count <= 1) {\n expanded.push(baseId);\n continue;\n }\n for (let index = 1; index <= count; index += 1) {\n expanded.push(`${baseId}-${index}`);\n }\n }\n return expanded;\n}\n\nfunction isHexBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is HexBoardTemplateSpec {\n return boardTemplate.layout === \"hex\";\n}\n\nfunction isSquareBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is SquareBoardTemplateSpec {\n return boardTemplate.layout === \"square\";\n}\n\nfunction isGenericBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is GenericBoardTemplateSpec {\n return boardTemplate.layout === \"generic\";\n}\n\nfunction isHexBoardSpec(board: BoardSpec): board is HexBoardSpec {\n return board.layout === \"hex\";\n}\n\nfunction isSquareBoardSpec(board: BoardSpec): board is SquareBoardSpec {\n return board.layout === \"square\";\n}\n\nconst HEX_SIDES = [\"e\", \"ne\", \"nw\", \"w\", \"sw\", \"se\"] as const;\n\nconst HEX_CORNERS = [\"ne-e\", \"e-se\", \"se-sw\", \"sw-w\", \"w-nw\", \"nw-ne\"] as const;\n\ntype HexSide = (typeof HEX_SIDES)[number];\n\ntype HexCorner = (typeof HEX_CORNERS)[number];\n\nconst HEX_SIDE_OFFSETS: Record<HexSide, readonly [number, number]> = {\n e: [1, 0],\n ne: [1, -1],\n nw: [0, -1],\n w: [-1, 0],\n sw: [-1, 1],\n se: [0, 1],\n};\n\nconst HEX_CORNER_OFFSETS: Record<HexCorner, readonly [number, number, number]> =\n {\n \"ne-e\": [2, -1, -1],\n \"e-se\": [1, -2, 1],\n \"se-sw\": [-1, -1, 2],\n \"sw-w\": [-2, 1, 1],\n \"w-nw\": [-1, 2, -1],\n \"nw-ne\": [1, 1, -2],\n };\n\nconst HEX_SIDE_CORNERS: Record<HexSide, readonly [HexCorner, HexCorner]> = {\n e: [\"ne-e\", \"e-se\"],\n ne: [\"nw-ne\", \"ne-e\"],\n nw: [\"w-nw\", \"nw-ne\"],\n w: [\"sw-w\", \"w-nw\"],\n sw: [\"se-sw\", \"sw-w\"],\n se: [\"e-se\", \"se-sw\"],\n};\n\nconst HEX_CORNER_SIDES: Record<HexCorner, readonly [HexSide, HexSide]> = {\n \"ne-e\": [\"ne\", \"e\"],\n \"e-se\": [\"e\", \"se\"],\n \"se-sw\": [\"se\", \"sw\"],\n \"sw-w\": [\"sw\", \"w\"],\n \"w-nw\": [\"w\", \"nw\"],\n \"nw-ne\": [\"nw\", \"ne\"],\n};\n\ninterface ResolvedHexEdge {\n id: string;\n geometryKey: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n}\n\ninterface ResolvedHexVertex {\n id: string;\n geometryKey: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n}\n\nfunction cubeFromAxial(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n): readonly [number, number, number] {\n const x = space.q;\n const z = space.r;\n return [x, -x - z, z] as const;\n}\n\nfunction cornerGeometryKey(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n corner: HexCorner,\n) {\n const [x, y, z] = cubeFromAxial(space);\n const [dx, dy, dz] = HEX_CORNER_OFFSETS[corner];\n return `${3 * x + dx},${3 * y + dy},${3 * z + dz}`;\n}\n\nfunction edgeGeometryKey(space: Pick<HexSpaceSpec, \"q\" | \"r\">, side: HexSide) {\n const [leftCorner, rightCorner] = HEX_SIDE_CORNERS[side];\n return [\n cornerGeometryKey(space, leftCorner),\n cornerGeometryKey(space, rightCorner),\n ]\n .sort((left, right) => left.localeCompare(right))\n .join(\"::\");\n}\n\nfunction edgeIdFromGeometryKey(key: string): string {\n return `hex-edge:${key}`;\n}\n\nfunction vertexIdFromGeometryKey(key: string): string {\n return `hex-vertex:${key}`;\n}\n\nconst SQUARE_SIDES = [\"north\", \"east\", \"south\", \"west\"] as const;\n\nconst SQUARE_CORNERS = [\"nw\", \"ne\", \"se\", \"sw\"] as const;\n\ntype SquareSide = (typeof SQUARE_SIDES)[number];\n\ntype SquareCorner = (typeof SQUARE_CORNERS)[number];\n\nfunction squareEdgeIdFromGeometryKey(key: string): string {\n return `square-edge:${key}`;\n}\n\nfunction squareVertexIdFromGeometryKey(key: string): string {\n return `square-vertex:${key}`;\n}\n\nfunction squareCornerGeometryKey(\n space: Pick<SquareSpaceSpec, \"row\" | \"col\">,\n corner: SquareCorner,\n): string {\n switch (corner) {\n case \"nw\":\n return `${space.col},${space.row}`;\n case \"ne\":\n return `${space.col + 1},${space.row}`;\n case \"se\":\n return `${space.col + 1},${space.row + 1}`;\n case \"sw\":\n return `${space.col},${space.row + 1}`;\n }\n}\n\nfunction squareEdgeGeometryKey(\n space: Pick<SquareSpaceSpec, \"row\" | \"col\">,\n side: SquareSide,\n): string {\n const endpoints =\n side === \"north\"\n ? [`${space.col},${space.row}`, `${space.col + 1},${space.row}`]\n : side === \"east\"\n ? [`${space.col + 1},${space.row}`, `${space.col + 1},${space.row + 1}`]\n : side === \"south\"\n ? [\n `${space.col},${space.row + 1}`,\n `${space.col + 1},${space.row + 1}`,\n ]\n : [`${space.col},${space.row}`, `${space.col},${space.row + 1}`];\n return endpoints.sort((left, right) => left.localeCompare(right)).join(\"::\");\n}\n\nfunction geometryKeyFromSquareEdgeRef(\n ref: BoardEdgeRef,\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((a, b) => a.localeCompare(b))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Square edge ref references unknown space '${spaceId}'.`,\n );\n }\n return space;\n });\n const keyCounts = new Map<string, number>();\n for (const space of resolvedSpaces) {\n for (const side of SQUARE_SIDES) {\n const key = squareEdgeGeometryKey(space, side);\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n }\n const candidates = [...keyCounts.entries()]\n .filter(([, count]) => count === resolvedSpaces.length)\n .map(([key]) => key)\n .sort((left, right) => left.localeCompare(right));\n if (candidates.length !== 1) {\n throw new Error(\n `Square edge ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared edge.`,\n );\n }\n const [only] = candidates;\n if (only === undefined) {\n throw new Error(\n \"unreachable: candidates.length === 1 but first is undefined\",\n );\n }\n return only;\n}\n\nfunction geometryKeyFromSquareVertexRef(\n ref: BoardVertexRef,\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((a, b) => a.localeCompare(b))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Square vertex ref references unknown space '${spaceId}'.`,\n );\n }\n return space;\n });\n const keyCounts = new Map<string, number>();\n for (const space of resolvedSpaces) {\n for (const corner of SQUARE_CORNERS) {\n const key = squareCornerGeometryKey(space, corner);\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n }\n const candidates = [...keyCounts.entries()]\n .filter(([, count]) => count === resolvedSpaces.length)\n .map(([key]) => key)\n .sort((left, right) => left.localeCompare(right));\n if (candidates.length !== 1) {\n throw new Error(\n `Square vertex ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared vertex.`,\n );\n }\n const [only] = candidates;\n if (only === undefined) {\n throw new Error(\n \"unreachable: candidates.length === 1 but first is undefined\",\n );\n }\n return only;\n}\n\nfunction geometryKeyFromEdgeRef(\n ref: HexEdgeRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n const [leftId, rightId] = [...ref.spaces].sort((a, b) => a.localeCompare(b));\n if (leftId === undefined || rightId === undefined) {\n throw new Error(\"Hex edge ref must reference exactly two spaces.\");\n }\n const leftSpace = spacesById.get(leftId);\n const rightSpace = spacesById.get(rightId);\n if (!leftSpace || !rightSpace) {\n throw new Error(\n `Hex edge ref references unknown spaces: ${ref.spaces.join(\", \")}.`,\n );\n }\n const [dq, dr] = [rightSpace.q - leftSpace.q, rightSpace.r - leftSpace.r];\n const side = (\n Object.entries(HEX_SIDE_OFFSETS) as Array<\n readonly [HexSide, readonly [number, number]]\n >\n ).find(([, [sideQ, sideR]]) => sideQ === dq && sideR === dr)?.[0];\n if (!side) {\n throw new Error(\n `Hex edge ref spaces '${leftId}' and '${rightId}' are not adjacent.`,\n );\n }\n return edgeGeometryKey(leftSpace, side);\n}\n\nfunction geometryKeyFromVertexRef(\n ref: HexVertexRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n return resolveHexVertexGeometryKey(ref, spacesById);\n}\n\nfunction deriveHexEdges(spaces: readonly HexSpaceSpec[]): ResolvedHexEdge[] {\n const spacesByCoordinate = new Map<string, HexSpaceSpec>();\n for (const space of spaces) {\n spacesByCoordinate.set(`${space.q},${space.r}`, space);\n }\n\n const edgeMap = new Map<string, ResolvedHexEdge>();\n for (const space of spaces) {\n for (const side of HEX_SIDES) {\n const [dq, dr] = HEX_SIDE_OFFSETS[side];\n const neighbor = spacesByCoordinate.get(\n `${space.q + dq},${space.r + dr}`,\n );\n const geometryKey = edgeGeometryKey(space, side);\n const existing = edgeMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ...(neighbor ? [neighbor.id] : []),\n ]);\n edgeMap.set(geometryKey, {\n id: edgeIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n\n return [...edgeMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction deriveHexVertices(\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexVertex[] {\n const spacesByCoordinate = new Map<string, HexSpaceSpec>();\n for (const space of spaces) {\n spacesByCoordinate.set(`${space.q},${space.r}`, space);\n }\n\n const vertexMap = new Map<string, ResolvedHexVertex>();\n for (const space of spaces) {\n for (const corner of HEX_CORNERS) {\n const [leftSide, rightSide] = HEX_CORNER_SIDES[corner];\n const [leftQ, leftR] = HEX_SIDE_OFFSETS[leftSide];\n const [rightQ, rightR] = HEX_SIDE_OFFSETS[rightSide];\n const leftNeighbor = spacesByCoordinate.get(\n `${space.q + leftQ},${space.r + leftR}`,\n );\n const rightNeighbor = spacesByCoordinate.get(\n `${space.q + rightQ},${space.r + rightR}`,\n );\n const geometryKey = cornerGeometryKey(space, corner);\n const existing = vertexMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ...(leftNeighbor ? [leftNeighbor.id] : []),\n ...(rightNeighbor ? [rightNeighbor.id] : []),\n ]);\n vertexMap.set(geometryKey, {\n id: vertexIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n\n return [...vertexMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction mergeBoardSpaces(\n templateSpaces: readonly BoardSpaceSpec[],\n boardSpaces: readonly BoardSpaceSpec[],\n): BoardSpaceSpec[] {\n return Array.from(\n [...templateSpaces, ...boardSpaces]\n .reduce<Map<string, BoardSpaceSpec>>((accumulator, space) => {\n accumulator.set(space.id, space);\n return accumulator;\n }, new Map<string, BoardSpaceSpec>())\n .values(),\n ).sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction mergeBoardContainers(\n templateContainers: readonly BoardContainerSpec[],\n boardContainers: readonly BoardContainerSpec[],\n): BoardContainerSpec[] {\n return Array.from(\n [...templateContainers, ...boardContainers]\n .reduce<Map<string, BoardContainerSpec>>((accumulator, container) => {\n accumulator.set(container.id, container);\n return accumulator;\n }, new Map<string, BoardContainerSpec>())\n .values(),\n ).sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction resolveHexSpaces(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n): HexSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown space '${overrideId}' from template '${template.id}'.`,\n );\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n const templateMatch = templateSpacesById.get(override.id);\n if (!templateMatch) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown space '${override.id}' from template '${template.id}'.`,\n );\n }\n if (templateMatch.q !== override.q || templateMatch.r !== override.r) {\n throw new Error(\n `Hex board '${board.id}' cannot change coordinates for space '${override.id}' from template '${template.id}'.`,\n );\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n q: templateSpace.q,\n r: templateSpace.r,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction resolveAuthoredHexEdges(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): AnalyzedHexBoard[\"authoredEdges\"] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derivedByGeometryKey = new Map(\n deriveHexEdges(spaces).map((edge) => [edge.geometryKey, edge] as const),\n );\n const collectSpecsByGeometryKey = (\n specs: readonly HexEdgeSpec[],\n ownerLabel: string,\n ) => {\n const specsByGeometryKey = new Map<string, HexEdgeSpec>();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromEdgeRef(spec.ref, spacesById);\n if (specsByGeometryKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex edge refs.`);\n }\n specsByGeometryKey.set(geometryKey, spec);\n }\n return specsByGeometryKey;\n };\n\n const templateSpecsByGeometryKey = template\n ? collectSpecsByGeometryKey(\n template.edges ?? [],\n `Hex board template '${template.id}'`,\n )\n : new Map<string, HexEdgeSpec>();\n const overrideSpecsByGeometryKey = collectSpecsByGeometryKey(\n board.edges ?? [],\n `Hex board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideSpecsByGeometryKey.keys()) {\n if (!templateSpecsByGeometryKey.has(overrideKey)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown edge ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedSpecs = template\n ? Array.from(templateSpecsByGeometryKey.entries()).map(\n ([geometryKey, templateSpec]) =>\n [\n geometryKey,\n overrideSpecsByGeometryKey.get(geometryKey) ?? templateSpec,\n ] as const,\n )\n : Array.from(overrideSpecsByGeometryKey.entries());\n\n return mergedSpecs.map(([geometryKey, spec]) => {\n const derivedEdge = derivedByGeometryKey.get(geometryKey);\n if (!derivedEdge) {\n throw new Error(\n `Hex edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n return {\n id: derivedEdge.id,\n ref: cloneJson(spec.ref),\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n };\n });\n}\n\nfunction resolveAuthoredHexVertices(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): AnalyzedHexBoard[\"authoredVertices\"] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derivedByGeometryKey = new Map(\n deriveHexVertices(spaces).map(\n (vertex) => [vertex.geometryKey, vertex] as const,\n ),\n );\n const collectSpecsByGeometryKey = (\n specs: readonly HexVertexSpec[],\n ownerLabel: string,\n ) => {\n const specsByGeometryKey = new Map<string, HexVertexSpec>();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromVertexRef(spec.ref, spacesById);\n if (specsByGeometryKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex vertex refs.`);\n }\n specsByGeometryKey.set(geometryKey, spec);\n }\n return specsByGeometryKey;\n };\n\n const templateSpecsByGeometryKey = template\n ? collectSpecsByGeometryKey(\n template.vertices ?? [],\n `Hex board template '${template.id}'`,\n )\n : new Map<string, HexVertexSpec>();\n const overrideSpecsByGeometryKey = collectSpecsByGeometryKey(\n board.vertices ?? [],\n `Hex board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideSpecsByGeometryKey.keys()) {\n if (!templateSpecsByGeometryKey.has(overrideKey)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown vertex ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedSpecs = template\n ? Array.from(templateSpecsByGeometryKey.entries()).map(\n ([geometryKey, templateSpec]) =>\n [\n geometryKey,\n overrideSpecsByGeometryKey.get(geometryKey) ?? templateSpec,\n ] as const,\n )\n : Array.from(overrideSpecsByGeometryKey.entries());\n\n return mergedSpecs.map(([geometryKey, spec]) => {\n const derivedVertex = derivedByGeometryKey.get(geometryKey);\n if (!derivedVertex) {\n throw new Error(\n `Hex vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n return {\n id: derivedVertex.id,\n ref: cloneJson(spec.ref),\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n };\n });\n}\n\nfunction resolveHexEdges(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexEdge[] {\n const derived = deriveHexEdges(spaces);\n const edgesById = new Map(derived.map((edge) => [edge.id, edge] as const));\n for (const authoredEdge of resolveAuthoredHexEdges(board, template, spaces)) {\n const edge = edgesById.get(authoredEdge.id);\n if (!edge) {\n throw new Error(\n `Hex edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n edgesById.set(authoredEdge.id, {\n ...edge,\n typeId: authoredEdge.typeId ?? null,\n label: authoredEdge.label ?? null,\n fields: authoredEdge.fields ?? null,\n });\n }\n\n return [...edgesById.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveHexVertices(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexVertex[] {\n const derived = deriveHexVertices(spaces);\n const verticesById = new Map(\n derived.map((vertex) => [vertex.id, vertex] as const),\n );\n for (const authoredVertex of resolveAuthoredHexVertices(\n board,\n template,\n spaces,\n )) {\n const vertex = verticesById.get(authoredVertex.id);\n if (!vertex) {\n throw new Error(\n `Hex vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n verticesById.set(authoredVertex.id, {\n ...vertex,\n typeId: authoredVertex.typeId ?? null,\n label: authoredVertex.label ?? null,\n fields: authoredVertex.fields ?? null,\n });\n }\n\n return [...verticesById.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveSquareSpaces(\n board: SquareBoardSpec,\n template: SquareBoardTemplateSpec | undefined,\n): SquareSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown space '${overrideId}' from template '${template.id}'.`,\n );\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n const templateMatch = templateSpacesById.get(override.id);\n if (!templateMatch) {\n throw new Error(\n `Square board '${board.id}' overrides unknown space '${override.id}' from template '${template.id}'.`,\n );\n }\n if (\n templateMatch.row !== override.row ||\n templateMatch.col !== override.col\n ) {\n throw new Error(\n `Square board '${board.id}' cannot change coordinates for space '${override.id}' from template '${template.id}'.`,\n );\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n row: templateSpace.row,\n col: templateSpace.col,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction deriveSquareEdges(\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexEdge[] {\n const edgeMap = new Map<string, ResolvedHexEdge>();\n for (const space of spaces) {\n for (const side of SQUARE_SIDES) {\n const geometryKey = squareEdgeGeometryKey(space, side);\n const existing = edgeMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ]);\n edgeMap.set(geometryKey, {\n id: squareEdgeIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n return [...edgeMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction deriveSquareVertices(\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexVertex[] {\n const vertexMap = new Map<string, ResolvedHexVertex>();\n for (const space of spaces) {\n for (const corner of SQUARE_CORNERS) {\n const geometryKey = squareCornerGeometryKey(space, corner);\n const existing = vertexMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ]);\n vertexMap.set(geometryKey, {\n id: squareVertexIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n return [...vertexMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction indexSquareEdgeMetadata(\n specs: readonly SquareEdgeSpec[],\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromSquareEdgeRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate square edge refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction indexSquareVertexMetadata(\n specs: readonly SquareVertexSpec[],\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromSquareVertexRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate square vertex refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction resolveSquareEdges(\n board: SquareBoardSpec,\n template: SquareBoardTemplateSpec | undefined,\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexEdge[] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derived = deriveSquareEdges(spaces);\n const edgesByGeometryKey = new Map(\n derived.map((edge) => [edge.geometryKey, edge] as const),\n );\n const templateMetadata = template\n ? indexSquareEdgeMetadata(\n template.edges ?? [],\n spacesById,\n `Square board template '${template.id}'`,\n )\n : new Map();\n const overrideMetadata = indexSquareEdgeMetadata(\n board.edges ?? [],\n spacesById,\n `Square board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideMetadata.keys()) {\n if (!templateMetadata.has(overrideKey)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown edge ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedMetadata = template\n ? new Map(\n [...templateMetadata.entries()].map(([key, metadata]) => [\n key,\n {\n ...metadata,\n ...(overrideMetadata.get(key) ?? {}),\n geometryKey: key,\n },\n ]),\n )\n : overrideMetadata;\n\n for (const [geometryKey, metadata] of mergedMetadata.entries()) {\n const edge = edgesByGeometryKey.get(geometryKey);\n if (!edge) {\n throw new Error(\n `Square edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n edgesByGeometryKey.set(geometryKey, {\n ...edge,\n typeId: metadata.typeId ?? null,\n label: metadata.label ?? null,\n fields: metadata.fields ?? null,\n });\n }\n\n return [...edgesByGeometryKey.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveSquareVertices(\n board: SquareBoardSpec,\n template: SquareBoardTemplateSpec | undefined,\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexVertex[] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derived = deriveSquareVertices(spaces);\n const verticesByGeometryKey = new Map(\n derived.map((vertex) => [vertex.geometryKey, vertex] as const),\n );\n const templateMetadata = template\n ? indexSquareVertexMetadata(\n template.vertices ?? [],\n spacesById,\n `Square board template '${template.id}'`,\n )\n : new Map();\n const overrideMetadata = indexSquareVertexMetadata(\n board.vertices ?? [],\n spacesById,\n `Square board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideMetadata.keys()) {\n if (!templateMetadata.has(overrideKey)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown vertex ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedMetadata = template\n ? new Map(\n [...templateMetadata.entries()].map(([key, metadata]) => [\n key,\n {\n ...metadata,\n ...(overrideMetadata.get(key) ?? {}),\n geometryKey: key,\n },\n ]),\n )\n : overrideMetadata;\n\n for (const [geometryKey, metadata] of mergedMetadata.entries()) {\n const vertex = verticesByGeometryKey.get(geometryKey);\n if (!vertex) {\n throw new Error(\n `Square vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n verticesByGeometryKey.set(geometryKey, {\n ...vertex,\n typeId: metadata.typeId ?? null,\n label: metadata.label ?? null,\n fields: metadata.fields ?? null,\n });\n }\n\n return [...verticesByGeometryKey.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction analyzeBoards(manifest: GameTopologyManifest, playerIds: string[]) {\n const boardTemplates = manifest.boardTemplates ?? [];\n const genericTemplateById = new Map(\n boardTemplates\n .filter(isGenericBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n const hexTemplateById = new Map(\n boardTemplates\n .filter(isHexBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n const squareTemplateById = new Map(\n boardTemplates\n .filter(isSquareBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n\n return (manifest.boards ?? []).map((board): AnalyzedBoard => {\n const runtimeBoardIds =\n board.scope === \"perPlayer\"\n ? playerIds.map((playerId) => `${board.id}:${playerId}`)\n : [board.id];\n\n if (isHexBoardSpec(board)) {\n const hexBoard = board;\n const template = board.templateId\n ? hexTemplateById.get(board.templateId)\n : undefined;\n const spaces = resolveHexSpaces(hexBoard, template);\n return {\n layout: \"hex\",\n board: hexBoard,\n template,\n boardTypeId: hexBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n hexBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n hexBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n edgeFieldsSchema:\n hexBoard.edgeFieldsSchema ?? template?.edgeFieldsSchema,\n vertexFieldsSchema:\n hexBoard.vertexFieldsSchema ?? template?.vertexFieldsSchema,\n spaces,\n authoredEdges: resolveAuthoredHexEdges(hexBoard, template, spaces),\n authoredVertices: resolveAuthoredHexVertices(\n hexBoard,\n template,\n spaces,\n ),\n edges: resolveHexEdges(hexBoard, template, spaces),\n vertices: resolveHexVertices(hexBoard, template, spaces),\n };\n }\n\n if (isSquareBoardSpec(board)) {\n const squareBoard = board;\n const template = board.templateId\n ? squareTemplateById.get(board.templateId)\n : undefined;\n const spaces = resolveSquareSpaces(squareBoard, template);\n return {\n layout: \"square\",\n board: squareBoard,\n template,\n boardTypeId: squareBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n squareBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n squareBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n relationFieldsSchema:\n squareBoard.relationFieldsSchema ?? template?.relationFieldsSchema,\n containerFieldsSchema:\n squareBoard.containerFieldsSchema ?? template?.containerFieldsSchema,\n edgeFieldsSchema:\n squareBoard.edgeFieldsSchema ?? template?.edgeFieldsSchema,\n vertexFieldsSchema:\n squareBoard.vertexFieldsSchema ?? template?.vertexFieldsSchema,\n spaces,\n relations: [\n ...(template?.relations ?? []),\n ...(squareBoard.relations ?? []),\n ],\n containers: mergeBoardContainers(\n template?.containers ?? [],\n squareBoard.containers ?? [],\n ),\n edges: resolveSquareEdges(squareBoard, template, spaces),\n vertices: resolveSquareVertices(squareBoard, template, spaces),\n };\n }\n\n const genericBoard = board;\n const template = board.templateId\n ? genericTemplateById.get(board.templateId)\n : undefined;\n return {\n layout: \"generic\",\n board: genericBoard,\n template,\n boardTypeId: genericBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n genericBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n genericBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n relationFieldsSchema:\n genericBoard.relationFieldsSchema ?? template?.relationFieldsSchema,\n containerFieldsSchema:\n genericBoard.containerFieldsSchema ?? template?.containerFieldsSchema,\n spaces: mergeBoardSpaces(\n template?.spaces ?? [],\n genericBoard.spaces ?? [],\n ),\n relations: [\n ...(template?.relations ?? []),\n ...(genericBoard.relations ?? []),\n ],\n containers: mergeBoardContainers(\n template?.containers ?? [],\n genericBoard.containers ?? [],\n ),\n };\n });\n}\n\nfunction isSingletonExplicitSeed(seed: {\n id?: string | null;\n count?: number | null;\n}): seed is typeof seed & { id: string } {\n return (\n typeof seed.id === \"string\" && seed.id.length > 0 && (seed.count ?? 1) === 1\n );\n}\n\nexport function analyzeManifest(\n inputManifest: GameTopologyManifest,\n runtimePlayerIds?: readonly string[],\n): ManifestAnalysis {\n const manifest = addStandardDecksIfNeeded(inputManifest);\n const playerIds = runtimePlayerIds\n ? [...runtimePlayerIds]\n : Array.from(\n { length: manifest.players.maxPlayers },\n (_, index) => `player-${index + 1}`,\n );\n const sharedZones = (manifest.zones ?? []).filter(\n (zone) => zone.scope === \"shared\",\n );\n const playerZones = (manifest.zones ?? []).filter(\n (zone) => zone.scope === \"perPlayer\",\n );\n const zoneIds = dedupeSorted((manifest.zones ?? []).map((zone) => zone.id));\n const cardSets = manifest.cardSets.map(materializeCardSet);\n const cardSetIds = dedupeSorted(cardSets.map((cardSet) => cardSet.id));\n const cardTypes = dedupeSorted(\n cardSets.flatMap((cardSet) => cardSet.cards.map((card) => card.type)),\n );\n const cardIds = dedupeSorted(\n cardSets.flatMap((cardSet) => cardSet.cards.flatMap(renderCardInstanceIds)),\n );\n const cardSetIdByCardId = new Map<string, string>();\n const cardTypeByCardId = new Map<string, string>();\n for (const cardSet of cardSets) {\n for (const card of cardSet.cards) {\n for (const cardId of renderCardInstanceIds(card)) {\n cardSetIdByCardId.set(cardId, cardSet.id);\n cardTypeByCardId.set(cardId, card.cardType ?? card.type);\n }\n }\n }\n\n const sharedZoneCardSetIds = new Map<string, string[]>();\n for (const zone of sharedZones) {\n sharedZoneCardSetIds.set(\n zone.id,\n dedupeSorted(zone.allowedCardSetIds ?? []),\n );\n }\n const playerZoneCardSetIds = new Map<string, string[]>();\n for (const zone of playerZones) {\n playerZoneCardSetIds.set(\n zone.id,\n dedupeSorted(zone.allowedCardSetIds ?? []),\n );\n }\n const zoneCardSetIdsById = new Map<string, string[]>();\n for (const [zoneId, cardSetIds] of sharedZoneCardSetIds.entries()) {\n zoneCardSetIdsById.set(zoneId, cardSetIds);\n }\n for (const [zoneId, cardSetIds] of playerZoneCardSetIds.entries()) {\n zoneCardSetIdsById.set(zoneId, cardSetIds);\n }\n\n const sharedZoneIdsByCardSetId = new Map<string, string[]>(\n cardSetIds.map((cardSetId): [string, string[]] => [cardSetId, []]),\n );\n for (const [zoneId, allowedCardSetIds] of sharedZoneCardSetIds.entries()) {\n for (const cardSetId of allowedCardSetIds) {\n const zoneIds = sharedZoneIdsByCardSetId.get(cardSetId) ?? [];\n zoneIds.push(zoneId);\n sharedZoneIdsByCardSetId.set(cardSetId, zoneIds);\n }\n }\n for (const [cardSetId, zoneIds] of sharedZoneIdsByCardSetId.entries()) {\n sharedZoneIdsByCardSetId.set(cardSetId, dedupeSorted(zoneIds));\n }\n\n const sharedZoneIdSet = new Set(sharedZones.map((zone) => zone.id));\n const homeSharedZoneIdsByCardType = new Map<string, string[]>(\n cardTypes.map((cardType): [string, string[]] => [cardType, []]),\n );\n for (const cardSet of cardSets) {\n for (const card of cardSet.cards) {\n if (\n card.home?.type !== \"zone\" ||\n !sharedZoneIdSet.has(card.home.zoneId)\n ) {\n continue;\n }\n const zoneIds = homeSharedZoneIdsByCardType.get(card.type) ?? [];\n zoneIds.push(card.home.zoneId);\n homeSharedZoneIdsByCardType.set(card.type, zoneIds);\n }\n }\n const homeSharedZoneIdByCardType = new Map<string, string>();\n for (const [cardType, zoneIds] of homeSharedZoneIdsByCardType.entries()) {\n const uniqueZoneIds = dedupeSorted(zoneIds);\n homeSharedZoneIdsByCardType.set(cardType, uniqueZoneIds);\n const [homeZoneId] = uniqueZoneIds;\n if (uniqueZoneIds.length === 1 && homeZoneId !== undefined) {\n homeSharedZoneIdByCardType.set(cardType, homeZoneId);\n }\n }\n\n const zoneVisibilityById = new Map<string, string>(\n (manifest.zones ?? []).map((zone) => [\n zone.id,\n zone.visibility ?? \"public\",\n ]),\n );\n const resourceIds = dedupeSorted(\n (manifest.resources ?? []).map((resource) => resource.id),\n );\n const resourcePresentationById = sortedObject(\n (manifest.resources ?? []).map((resource) => [\n resource.id,\n {\n label: resource.name,\n ...(resource.icon ? { icon: resource.icon } : {}),\n },\n ]),\n );\n const setupOptionIds = dedupeSorted(\n (manifest.setupOptions ?? []).map((option) => option.id),\n );\n const setupProfileIds = dedupeSorted(\n (manifest.setupProfiles ?? []).map((profile) => profile.id),\n );\n const setupChoiceIdsByOptionId = new Map(\n (manifest.setupOptions ?? []).map((option) => [\n option.id,\n dedupeSorted((option.choices ?? []).map((choice) => choice.id)),\n ]),\n );\n const setupOptionsById = Object.fromEntries(\n (manifest.setupOptions ?? [])\n .slice()\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((option) => [\n option.id,\n {\n id: option.id,\n name: option.name,\n description: option.description ?? null,\n choices: (option.choices ?? []).map((choice) => ({\n id: choice.id,\n label: choice.label,\n description: choice.description ?? null,\n })),\n },\n ]),\n );\n const setupProfilesById = Object.fromEntries(\n (manifest.setupProfiles ?? [])\n .slice()\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((profile) => [\n profile.id,\n {\n id: profile.id,\n name: profile.name,\n description: profile.description ?? null,\n optionValues: profile.optionValues\n ? Object.fromEntries(\n Object.entries(profile.optionValues).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === \"string\",\n ),\n )\n : null,\n guidance: profile.guidance\n ? {\n summary: profile.guidance.summary ?? null,\n steps: (profile.guidance.steps ?? []).map((step) => ({\n id: step.id,\n label: step.label,\n description: step.description ?? null,\n })),\n }\n : null,\n },\n ]),\n );\n const pieceTypeIds = dedupeSorted(\n (manifest.pieceTypes ?? []).map((pieceType) => pieceType.id),\n );\n const pieceTypeSchemasById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [\n pieceType.id,\n pieceType.fieldsSchema,\n ]),\n );\n const pieceTypeSlotIdsById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [\n pieceType.id,\n dedupeSorted((pieceType.slots ?? []).map((slot) => slot.id)),\n ]),\n );\n const pieceTypeIdByPieceId = new Map<string, string>();\n for (const seed of manifest.pieceSeeds ?? []) {\n for (const pieceId of expandSeedIds([seed])) {\n pieceTypeIdByPieceId.set(pieceId, seed.typeId);\n }\n }\n const pieceIds = dedupeSorted(pieceTypeIdByPieceId.keys());\n const dieTypeIds = dedupeSorted(\n (manifest.dieTypes ?? []).map((dieType) => dieType.id),\n );\n const dieTypeSchemasById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [\n dieType.id,\n dieType.fieldsSchema,\n ]),\n );\n const dieTypeSlotIdsById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [\n dieType.id,\n dedupeSorted((dieType.slots ?? []).map((slot) => slot.id)),\n ]),\n );\n const dieTypeIdByDieId = new Map<string, string>();\n for (const seed of manifest.dieSeeds ?? []) {\n for (const dieId of expandSeedIds([seed])) {\n dieTypeIdByDieId.set(dieId, seed.typeId);\n }\n }\n const dieIds = dedupeSorted(dieTypeIdByDieId.keys());\n const strictSlotHosts = [\n ...(manifest.pieceSeeds ?? []).flatMap((seed) => {\n if (!isSingletonExplicitSeed(seed)) {\n return [];\n }\n const slotIds = pieceTypeSlotIdsById.get(seed.typeId) ?? [];\n return slotIds.length > 0\n ? [\n {\n kind: \"piece\" as const,\n id: seed.id,\n slotIds,\n },\n ]\n : [];\n }),\n ...(manifest.dieSeeds ?? []).flatMap((seed) => {\n if (!isSingletonExplicitSeed(seed)) {\n return [];\n }\n const slotIds = dieTypeSlotIdsById.get(seed.typeId) ?? [];\n return slotIds.length > 0\n ? [\n {\n kind: \"die\" as const,\n id: seed.id,\n slotIds,\n },\n ]\n : [];\n }),\n ].sort(\n (left, right) =>\n left.kind.localeCompare(right.kind) || left.id.localeCompare(right.id),\n );\n const analyzedBoards = analyzeBoards(manifest, playerIds);\n const boardTemplateIds = dedupeSorted(\n (manifest.boardTemplates ?? []).map((boardTemplate) => boardTemplate.id),\n );\n const boardBaseIds = dedupeSorted(\n analyzedBoards.map(({ board }) => board.id),\n );\n const boardIds = dedupeSorted(\n analyzedBoards.flatMap((entry) => entry.runtimeBoardIds),\n );\n const boardTypeIds = dedupeSorted(\n analyzedBoards\n .map((board) => board.boardTypeId)\n .filter((typeId): typeId is string => typeof typeId === \"string\"),\n );\n const boardLayoutById = new Map<string, string>();\n const boardIdsByLayout = new Map<string, string[]>();\n const boardBaseIdsByLayout = new Map<string, string[]>();\n const boardIdsByBaseId = new Map<string, string[]>();\n const boardBaseIdsByTemplateId = new Map<string, string[]>();\n const boardTemplateLayoutById = new Map<string, string>();\n const boardIdsByTypeId = new Map<string, string[]>();\n const spaceIdsByBoardId = new Map<string, string[]>();\n const spaceTypeIdByBoardId = new Map<string, Record<string, string | null>>();\n const spaceIdsByTypeId = new Map<string, string[]>();\n const containerIdsByBoardId = new Map<string, string[]>();\n const containerHostByBoardId = new Map<\n string,\n Record<string, { type: \"board\" } | { type: \"space\"; spaceId: string }>\n >();\n const relationTypeIdsByBoardId = new Map<string, string[]>();\n const edgeIdsByTypeId = new Map<string, string[]>();\n const edgeIdsByBoardIdAndTypeId = new Map<string, Record<string, string[]>>();\n const vertexIdsByTypeId = new Map<string, string[]>();\n const vertexIdsByBoardIdAndTypeId = new Map<\n string,\n Record<string, string[]>\n >();\n for (const boardTemplate of manifest.boardTemplates ?? []) {\n boardTemplateLayoutById.set(boardTemplate.id, boardTemplate.layout);\n boardBaseIdsByLayout.set(\n boardTemplate.layout,\n dedupeSorted([...(boardBaseIdsByLayout.get(boardTemplate.layout) ?? [])]),\n );\n }\n for (const analyzedBoard of analyzedBoards) {\n boardIdsByBaseId.set(analyzedBoard.board.id, analyzedBoard.runtimeBoardIds);\n boardIdsByLayout.set(\n analyzedBoard.board.layout,\n dedupeSorted([\n ...(boardIdsByLayout.get(analyzedBoard.board.layout) ?? []),\n ...analyzedBoard.runtimeBoardIds,\n ]),\n );\n boardBaseIdsByLayout.set(\n analyzedBoard.board.layout,\n dedupeSorted([\n ...(boardBaseIdsByLayout.get(analyzedBoard.board.layout) ?? []),\n analyzedBoard.board.id,\n ]),\n );\n if (analyzedBoard.board.templateId) {\n boardBaseIdsByTemplateId.set(\n analyzedBoard.board.templateId,\n dedupeSorted([\n ...(boardBaseIdsByTemplateId.get(analyzedBoard.board.templateId) ??\n []),\n analyzedBoard.board.id,\n ]),\n );\n }\n const runtimeSpaceIds = analyzedBoard.spaces.map((space) => space.id);\n const runtimeSpaceTypeIds: Record<string, string | null> = sortedObject(\n analyzedBoard.spaces.map(\n (space) => [space.id, space.typeId ?? null] as const,\n ),\n );\n const runtimeContainerIds =\n analyzedBoard.layout === \"hex\"\n ? []\n : analyzedBoard.containers.map((container) => container.id);\n const runtimeContainerHosts: Record<\n string,\n { type: \"board\" } | { type: \"space\"; spaceId: string }\n > =\n analyzedBoard.layout === \"hex\"\n ? {}\n : sortedObject(\n analyzedBoard.containers.map((container) => [\n container.id,\n container.host.type === \"space\"\n ? { type: \"space\" as const, spaceId: container.host.spaceId }\n : { type: \"board\" as const },\n ]),\n );\n const runtimeRelationTypeIds =\n analyzedBoard.layout === \"hex\"\n ? [\"adjacent\"]\n : analyzedBoard.layout === \"square\"\n ? dedupeSorted([\n \"adjacent\",\n ...analyzedBoard.relations.map((relation) => relation.typeId),\n ])\n : dedupeSorted(\n analyzedBoard.relations.map((relation) => relation.typeId),\n );\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n boardLayoutById.set(runtimeBoardId, analyzedBoard.board.layout);\n spaceIdsByBoardId.set(runtimeBoardId, runtimeSpaceIds);\n spaceTypeIdByBoardId.set(runtimeBoardId, runtimeSpaceTypeIds);\n containerIdsByBoardId.set(runtimeBoardId, runtimeContainerIds);\n containerHostByBoardId.set(runtimeBoardId, runtimeContainerHosts);\n relationTypeIdsByBoardId.set(runtimeBoardId, runtimeRelationTypeIds);\n }\n if (analyzedBoard.boardTypeId) {\n boardIdsByTypeId.set(\n analyzedBoard.boardTypeId,\n dedupeSorted([\n ...(boardIdsByTypeId.get(analyzedBoard.boardTypeId) ?? []),\n ...analyzedBoard.runtimeBoardIds,\n ]),\n );\n }\n for (const space of analyzedBoard.spaces) {\n if (!space.typeId) {\n continue;\n }\n spaceIdsByTypeId.set(\n space.typeId,\n dedupeSorted([...(spaceIdsByTypeId.get(space.typeId) ?? []), space.id]),\n );\n }\n if (analyzedBoard.layout !== \"generic\") {\n const edgeIdsForBoardByType: Record<string, string[]> = {};\n for (const edge of analyzedBoard.edges) {\n if (!edge.typeId) {\n continue;\n }\n edgeIdsByTypeId.set(\n edge.typeId,\n dedupeSorted([...(edgeIdsByTypeId.get(edge.typeId) ?? []), edge.id]),\n );\n edgeIdsForBoardByType[edge.typeId] = dedupeSorted([\n ...(edgeIdsForBoardByType[edge.typeId] ?? []),\n edge.id,\n ]);\n }\n const vertexIdsForBoardByType: Record<string, string[]> = {};\n for (const vertex of analyzedBoard.vertices) {\n if (!vertex.typeId) {\n continue;\n }\n vertexIdsByTypeId.set(\n vertex.typeId,\n dedupeSorted([\n ...(vertexIdsByTypeId.get(vertex.typeId) ?? []),\n vertex.id,\n ]),\n );\n vertexIdsForBoardByType[vertex.typeId] = dedupeSorted([\n ...(vertexIdsForBoardByType[vertex.typeId] ?? []),\n vertex.id,\n ]);\n }\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n edgeIdsByBoardIdAndTypeId.set(runtimeBoardId, edgeIdsForBoardByType);\n vertexIdsByBoardIdAndTypeId.set(\n runtimeBoardId,\n vertexIdsForBoardByType,\n );\n }\n }\n }\n const relationTypeIds = dedupeSorted(\n Array.from(relationTypeIdsByBoardId.values()).flat(),\n );\n const edgeIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"generic\" ? [] : board.edges.map((edge) => edge.id),\n ),\n );\n const edgeTypeIds = dedupeSorted(edgeIdsByTypeId.keys());\n const vertexIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"generic\"\n ? []\n : board.vertices.map((vertex) => vertex.id),\n ),\n );\n const vertexTypeIds = dedupeSorted(vertexIdsByTypeId.keys());\n const boardContainerIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"hex\"\n ? []\n : board.containers.map((container) => container.id),\n ),\n );\n const spaceIds = dedupeSorted(\n analyzedBoards.flatMap((board) => board.spaces.map((space) => space.id)),\n );\n const spaceTypeIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.spaces\n .map((space) => space.typeId)\n .filter((typeId): typeId is string => typeof typeId === \"string\"),\n ),\n );\n\n return {\n manifest,\n playerIds,\n sharedZones,\n playerZones,\n zoneIds,\n cardSets,\n cardSetIds,\n cardTypes,\n cardIds,\n cardSetIdByCardId,\n cardTypeByCardId,\n sharedZoneCardSetIds,\n sharedZoneIdsByCardSetId,\n homeSharedZoneIdsByCardType,\n homeSharedZoneIdByCardType,\n playerZoneCardSetIds,\n zoneCardSetIdsById,\n zoneVisibilityById,\n resourceIds,\n resourcePresentationById,\n setupOptionIds,\n setupProfileIds,\n setupChoiceIdsByOptionId,\n setupOptionsById,\n setupProfilesById,\n pieceTypeIds,\n pieceIds,\n pieceTypeIdByPieceId,\n dieTypeIds,\n dieIds,\n dieTypeIdByDieId,\n strictSlotHosts,\n boardTemplateIds,\n boardBaseIds,\n boardIds,\n boardContainerIds,\n boardTypeIds,\n boardLayoutById,\n boardIdsByLayout,\n boardBaseIdsByLayout,\n boardIdsByBaseId,\n boardBaseIdsByTemplateId,\n boardTemplateLayoutById,\n boardIdsByTypeId,\n spaceIdsByBoardId,\n spaceTypeIdByBoardId,\n spaceIdsByTypeId,\n containerIdsByBoardId,\n containerHostByBoardId,\n relationTypeIds,\n relationTypeIdsByBoardId,\n edgeIds,\n edgeTypeIds,\n edgeIdsByTypeId,\n edgeIdsByBoardIdAndTypeId,\n vertexIds,\n vertexTypeIds,\n vertexIdsByTypeId,\n vertexIdsByBoardIdAndTypeId,\n spaceIds,\n spaceTypeIds,\n analyzedBoards,\n pieceTypeSchemasById,\n dieTypeSchemasById,\n };\n}\n\nfunction cloneJson<Value>(value: Value): Value {\n return JSON.parse(JSON.stringify(value)) as Value;\n}\n\nfunction boardSpaceRefKey(spaceIds: readonly string[]): string {\n return [...spaceIds]\n .sort((left, right) => left.localeCompare(right))\n .join(\"$$\");\n}\n\nfunction materializePropertySchemaDefault(\n property: PropertySchema,\n analysis: ManifestAnalysis,\n runtimeBoardId?: string,\n): unknown {\n if (hasPropertySchemaDefault(property)) {\n return cloneJson(property.default);\n }\n if (property.optional) {\n return undefined;\n }\n if (property.nullable) {\n return null;\n }\n\n switch (property.type) {\n case \"string\":\n return \"\";\n case \"integer\":\n case \"number\":\n return 0;\n case \"boolean\":\n return false;\n case \"enum\":\n return property.enums?.[0] ?? \"\";\n case \"array\":\n return [];\n case \"object\":\n return materializeObjectSchemaDefaults(\n property.properties ? { properties: property.properties } : undefined,\n analysis,\n runtimeBoardId,\n );\n case \"record\":\n return {};\n case \"zoneId\":\n return analysis.zoneIds[0] ?? \"\";\n case \"cardId\":\n return analysis.cardIds[0] ?? \"\";\n case \"playerId\":\n return analysis.playerIds[0] ?? \"\";\n case \"boardId\":\n return runtimeBoardId ?? analysis.boardIds[0] ?? \"\";\n case \"edgeId\":\n return analysis.edgeIds[0] ?? \"\";\n case \"vertexId\":\n return analysis.vertexIds[0] ?? \"\";\n case \"spaceId\":\n return (\n (runtimeBoardId\n ? analysis.spaceIdsByBoardId.get(runtimeBoardId)?.[0]\n : undefined) ??\n analysis.spaceIds[0] ??\n \"\"\n );\n case \"pieceId\":\n return analysis.pieceIds[0] ?? \"\";\n case \"dieId\":\n return analysis.dieIds[0] ?? \"\";\n case \"resourceId\":\n return analysis.resourceIds[0] ?? \"\";\n }\n}\n\nfunction materializeObjectSchemaDefaults(\n schema: ObjectSchema | null | undefined,\n analysis: ManifestAnalysis,\n runtimeBoardId?: string,\n): Record<string, unknown> {\n if (!schema?.properties) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(schema.properties).flatMap(([key, property]) => {\n const value = materializePropertySchemaDefault(\n property,\n analysis,\n runtimeBoardId,\n );\n return value === undefined ? [] : [[key, value]];\n }),\n );\n}\n\nfunction materializeCardPropertiesDefaults(\n schema: CardPropertySchema | null | undefined,\n cardType: string,\n analysis: ManifestAnalysis,\n): Record<string, unknown> {\n const objectSchema = isCardPropertySchemaVariants(schema)\n ? mergeSharedCardProperties(schema, cardType)\n : schema;\n return materializeObjectSchemaDefaults(objectSchema, analysis);\n}\n\nexport function materializeManifestTable(options: {\n manifest: GameTopologyManifest;\n playerIds: readonly string[];\n shuffleItems: <Value>(values: readonly Value[]) => Value[];\n}): Record<string, unknown> {\n const validation = validateManifestAuthoring(options.manifest);\n if (validation.errors.length > 0) {\n throw new Error(\n `Cannot materialize invalid topology manifest:\\n${validation.errors.join(\"\\n\")}`,\n );\n }\n\n const analysis = analyzeManifest(options.manifest, options.playerIds);\n const manifest = analysis.manifest;\n const playerIds = [...options.playerIds];\n\n const cards = createRecord<Record<string, unknown>>();\n const pieces = createRecord<Record<string, unknown>>();\n const dice = createRecord<Record<string, unknown>>();\n const componentLocations = createRecord<Record<string, unknown>>();\n const locationOrder = new Map<string, number>();\n\n const boardAnalysisByBaseId = new Map(\n analysis.analyzedBoards.map((board) => [board.board.id, board] as const),\n );\n const edgeIdByBoardBaseIdAndSpaces = new Map<string, Map<string, string>>();\n const vertexIdByBoardBaseIdAndSpaces = new Map<string, Map<string, string>>();\n\n for (const analyzedBoard of analysis.analyzedBoards) {\n if (analyzedBoard.layout === \"generic\") {\n continue;\n }\n edgeIdByBoardBaseIdAndSpaces.set(\n analyzedBoard.board.id,\n new Map(\n analyzedBoard.edges.map((edge) => [\n boardSpaceRefKey(edge.spaceIds),\n edge.id,\n ]),\n ),\n );\n vertexIdByBoardBaseIdAndSpaces.set(\n analyzedBoard.board.id,\n new Map(\n analyzedBoard.vertices.map((vertex) => [\n boardSpaceRefKey(vertex.spaceIds),\n vertex.id,\n ]),\n ),\n );\n }\n\n const nextLocationPosition = (location: Record<string, unknown>): number => {\n const key = JSON.stringify(location);\n const position = locationOrder.get(key) ?? 0;\n locationOrder.set(key, position + 1);\n return position;\n };\n const zoneScopeById = new Map<string, \"shared\" | \"perPlayer\">([\n ...analysis.sharedZones.map((zone) => [zone.id, \"shared\"] as const),\n ...analysis.playerZones.map((zone) => [zone.id, \"perPlayer\"] as const),\n ]);\n const resolveRuntimeBoardId = (\n boardBaseId: string,\n ownerId: string | null | undefined,\n context?: string,\n ) => {\n const analyzedBoard = boardAnalysisByBaseId.get(boardBaseId);\n if (!analyzedBoard) {\n throw new Error(\n `${context ?? \"Component home\"}.boardId: Unknown board '${boardBaseId}'.`,\n );\n }\n if (analyzedBoard?.board.scope === \"perPlayer\") {\n if (!ownerId) {\n throw new Error(\n `${context ?? `Home on board '${boardBaseId}'`} requires ownerId because board '${boardBaseId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n return `${boardBaseId}:${ownerId}`;\n }\n return boardBaseId;\n };\n\n const resolveBoardEdgeId = (\n boardBaseId: string,\n spaceIds: readonly string[],\n ) => {\n const edgeId = edgeIdByBoardBaseIdAndSpaces\n .get(boardBaseId)\n ?.get(boardSpaceRefKey(spaceIds));\n if (!edgeId) {\n throw new Error(\n `Unknown edge on board '${boardBaseId}' for spaces [${spaceIds.join(\", \")}].`,\n );\n }\n return edgeId;\n };\n\n const resolveBoardVertexId = (\n boardBaseId: string,\n spaceIds: readonly string[],\n ) => {\n const vertexId = vertexIdByBoardBaseIdAndSpaces\n .get(boardBaseId)\n ?.get(boardSpaceRefKey(spaceIds));\n if (!vertexId) {\n throw new Error(\n `Unknown vertex on board '${boardBaseId}' for spaces [${spaceIds.join(\", \")}].`,\n );\n }\n return vertexId;\n };\n\n const materializeComponentLocation = (\n home: NonNullable<BoardCard[\"home\"]>,\n context: {\n path: string;\n label: string;\n },\n ): Record<string, unknown> => {\n if (home.type === \"detached\") {\n return { type: \"Detached\" };\n }\n\n if (home.type === \"slot\") {\n return {\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n position: nextLocationPosition({\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n }),\n };\n }\n\n if (home.type === \"zone\") {\n const zoneScope = zoneScopeById.get(home.zoneId);\n if (!zoneScope) {\n throw new Error(\n `${context.path}.zoneId: ${context.label} targets unknown zone '${home.zoneId}'.`,\n );\n }\n if (zoneScope === \"perPlayer\") {\n throw new Error(\n `${context.path}.zoneId: ${context.label} cannot target per-player zone '${home.zoneId}' because card inventory has no ownerId. Place it during reducer setup instead.`,\n );\n }\n return {\n type: \"InDeck\",\n deckId: home.zoneId,\n playedBy: null,\n position: nextLocationPosition({\n type: \"InDeck\",\n deckId: home.zoneId,\n playedBy: null,\n }),\n };\n }\n\n if (home.type === \"space\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n null,\n `${context.path}.boardId: ${context.label}`,\n );\n if (\n !analysis.spaceIdsByBoardId.get(home.boardId)?.includes(home.spaceId)\n ) {\n throw new Error(\n `${context.path}.spaceId: ${context.label} targets unknown space '${home.spaceId}' on board '${home.boardId}'.`,\n );\n }\n return {\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n position: nextLocationPosition({\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n }),\n };\n }\n\n if (home.type === \"container\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n null,\n `${context.path}.boardId: ${context.label}`,\n );\n if (\n !analysis.containerIdsByBoardId\n .get(home.boardId)\n ?.includes(home.containerId)\n ) {\n throw new Error(\n `${context.path}.containerId: ${context.label} targets unknown container '${home.containerId}' on board '${home.boardId}'.`,\n );\n }\n return {\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n position: nextLocationPosition({\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n }),\n };\n }\n\n if (home.type === \"edge\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n null,\n `${context.path}.boardId: ${context.label}`,\n );\n const edgeId = resolveBoardEdgeId(home.boardId, home.ref.spaces);\n return {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position: nextLocationPosition({\n type: \"OnEdge\",\n boardId,\n edgeId,\n }),\n };\n }\n\n if (home.type === \"vertex\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n null,\n `${context.path}.boardId: ${context.label}`,\n );\n const vertexId = resolveBoardVertexId(home.boardId, home.ref.spaces);\n return {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position: nextLocationPosition({\n type: \"OnVertex\",\n boardId,\n vertexId,\n }),\n };\n }\n\n const exhaustive: never = home;\n throw new Error(\n `Unsupported component home: ${JSON.stringify(exhaustive)}`,\n );\n };\n\n for (const [cardSetIndex, cardSet] of manifest.cardSets.entries()) {\n const materializedCardSet = materializeCardSet(cardSet);\n for (const [cardIndex, card] of materializedCardSet.cards.entries()) {\n const cardInstanceIds = renderCardInstanceIds(card);\n for (const [instanceIndex, cardId] of cardInstanceIds.entries()) {\n cards[cardId] = {\n id: cardId,\n cardSetId: materializedCardSet.id,\n cardType: card.type,\n name: card.name,\n text: card.text,\n properties: {\n ...materializeCardPropertiesDefaults(\n materializedCardSet.cardSchema,\n card.type,\n analysis,\n ),\n ...(card.properties ?? {}),\n },\n };\n const resolvedHome = card.home ?? materializedCardSet.defaultHome;\n const path =\n card.home === undefined\n ? `manifest.cardSets[${cardSetIndex}].defaultHome`\n : `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].home`;\n componentLocations[cardId] = materializeComponentLocation(\n resolvedHome,\n {\n path,\n label: `Card '${card.type}' instance ${instanceIndex + 1}`,\n },\n );\n }\n }\n }\n\n if (Object.keys(cards).length !== analysis.cardIds.length) {\n throw new Error(\n \"Materialized card record cardinality drifted from analysis.\",\n );\n }\n if (Object.keys(componentLocations).length !== analysis.cardIds.length) {\n throw new Error(\n \"Materialized card locations drifted from analysis before seed placement.\",\n );\n }\n\n const pieceTypesById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [pieceType.id, pieceType]),\n );\n const dieTypesById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [dieType.id, dieType]),\n );\n\n const assignSeedLocation = (\n componentId: string,\n ownerId: string | null | undefined,\n home: PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"] | undefined,\n context: {\n path: string;\n label: string;\n },\n ) => {\n if (!home) {\n componentLocations[componentId] = { type: \"Detached\" };\n return;\n }\n\n if (home.type === \"slot\") {\n componentLocations[componentId] = {\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n position: nextLocationPosition({\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n }),\n };\n return;\n }\n\n if (home.type === \"zone\") {\n if (zoneScopeById.get(home.zoneId) === \"perPlayer\") {\n if (!ownerId) {\n throw new Error(\n `${context.path}.zoneId: ${context.label} requires ownerId because zone '${home.zoneId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n componentLocations[componentId] = {\n type: \"InHand\",\n handId: home.zoneId,\n playerId: ownerId,\n position: nextLocationPosition({\n type: \"InHand\",\n handId: home.zoneId,\n playerId: ownerId,\n }),\n };\n return;\n }\n\n componentLocations[componentId] = {\n type: \"InZone\",\n zoneId: home.zoneId,\n playedBy: null,\n position: nextLocationPosition({\n type: \"InZone\",\n zoneId: home.zoneId,\n }),\n };\n return;\n }\n\n if (home.type === \"space\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n position: nextLocationPosition({\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n }),\n };\n return;\n }\n\n if (home.type === \"container\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n componentLocations[componentId] = {\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n position: nextLocationPosition({\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n }),\n };\n return;\n }\n\n if (home.type === \"edge\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n const edgeId = resolveBoardEdgeId(home.boardId, home.ref.spaces);\n componentLocations[componentId] = {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position: nextLocationPosition({\n type: \"OnEdge\",\n boardId,\n edgeId,\n }),\n };\n return;\n }\n\n if (home.type === \"vertex\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n const vertexId = resolveBoardVertexId(home.boardId, home.ref.spaces);\n componentLocations[componentId] = {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position: nextLocationPosition({\n type: \"OnVertex\",\n boardId,\n vertexId,\n }),\n };\n return;\n }\n\n componentLocations[componentId] = { type: \"Detached\" };\n };\n\n for (const [seedIndex, seed] of (manifest.pieceSeeds ?? []).entries()) {\n const pieceType = pieceTypesById.get(seed.typeId);\n for (const componentId of expandSeedIds([seed])) {\n pieces[componentId] = {\n componentType: \"piece\",\n id: componentId,\n pieceTypeId: seed.typeId,\n pieceName: pieceType?.name ?? seed.typeId,\n ownerId: seed.ownerId ?? null,\n properties: {\n ...materializeObjectSchemaDefaults(\n analysis.pieceTypeSchemasById.get(seed.typeId),\n analysis,\n ),\n ...(seed.fields ?? {}),\n },\n };\n assignSeedLocation(componentId, seed.ownerId, seed.home, {\n path: `manifest.pieceSeeds[${seedIndex}].home`,\n label: `Piece seed '${seed.id ?? seed.typeId}'`,\n });\n }\n }\n\n for (const [seedIndex, seed] of (manifest.dieSeeds ?? []).entries()) {\n const dieType = dieTypesById.get(seed.typeId);\n for (const componentId of expandSeedIds([seed])) {\n dice[componentId] = {\n componentType: \"die\",\n id: componentId,\n dieTypeId: seed.typeId,\n dieName: dieType?.name ?? seed.typeId,\n ownerId: seed.ownerId ?? null,\n sides: dieType?.sides ?? 6,\n value: null,\n properties: {\n ...materializeObjectSchemaDefaults(\n analysis.dieTypeSchemasById.get(seed.typeId),\n analysis,\n ),\n ...(seed.fields ?? {}),\n },\n };\n assignSeedLocation(componentId, seed.ownerId, seed.home, {\n path: `manifest.dieSeeds[${seedIndex}].home`,\n label: `Die seed '${seed.id ?? seed.typeId}'`,\n });\n }\n }\n\n const boardStatesById = createRecord<Record<string, unknown>>();\n const hexBoardStatesById = createRecord<Record<string, unknown>>();\n const squareBoardStatesById = createRecord<Record<string, unknown>>();\n\n for (const analyzedBoard of analysis.analyzedBoards) {\n const sharedBoardState = {\n baseId: analyzedBoard.board.id,\n layout: analyzedBoard.layout,\n typeId: analyzedBoard.boardTypeId ?? null,\n scope: analyzedBoard.board.scope,\n templateId: analyzedBoard.board.templateId ?? null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.boardFieldsSchema,\n analysis,\n ),\n ...(analyzedBoard.board.fields ?? {}),\n },\n };\n\n const buildSpaces = () =>\n Object.fromEntries(\n analyzedBoard.spaces.map((space) => {\n const spaceId = space.id;\n const baseSpaceState = {\n id: spaceId,\n name: \"name\" in space ? (space.name ?? null) : null,\n typeId: space?.typeId ?? null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.spaceFieldsSchema,\n analysis,\n ),\n ...(space.fields ?? {}),\n },\n zoneId: \"zoneId\" in space ? (space.zoneId ?? null) : null,\n };\n\n if (analyzedBoard.layout === \"hex\") {\n const hexSpace = space as HexSpaceSpec;\n return [\n spaceId,\n {\n ...baseSpaceState,\n q: hexSpace.q,\n r: hexSpace.r,\n },\n ];\n }\n\n if (analyzedBoard.layout === \"square\") {\n const squareSpace = space as SquareSpaceSpec;\n return [\n spaceId,\n {\n ...baseSpaceState,\n row: squareSpace.row,\n col: squareSpace.col,\n },\n ];\n }\n\n return [spaceId, baseSpaceState];\n }),\n );\n\n const relations =\n analyzedBoard.layout === \"hex\"\n ? []\n : analyzedBoard.relations.map((relation) => ({\n id: relation.id ?? null,\n typeId: relation.typeId,\n fromSpaceId: relation.fromSpaceId,\n toSpaceId: relation.toSpaceId,\n directed: relation.directed ?? false,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.relationFieldsSchema,\n analysis,\n ),\n ...(relation.fields ?? {}),\n },\n }));\n\n const buildContainers = (runtimeBoardId: string) =>\n analyzedBoard.layout === \"hex\"\n ? {}\n : Object.fromEntries(\n analyzedBoard.containers.map((container) => {\n const containerId = container.id;\n return [\n containerId,\n {\n id: containerId,\n name: container.name ?? containerId,\n host:\n container.host.type === \"space\"\n ? { type: \"space\", spaceId: container.host.spaceId }\n : { type: \"board\" },\n allowedCardSetIds: container.allowedCardSetIds,\n zoneId: `board:${runtimeBoardId}:container:${containerId}`,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.containerFieldsSchema,\n analysis,\n runtimeBoardId,\n ),\n ...(container.fields ?? {}),\n },\n },\n ];\n }),\n );\n\n const edges =\n analyzedBoard.layout === \"generic\"\n ? []\n : analyzedBoard.edges.map((edge) => ({\n id: edge.id,\n spaceIds: [...edge.spaceIds],\n typeId: edge.typeId ?? null,\n label: edge.label ?? null,\n ownerId: null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.edgeFieldsSchema,\n analysis,\n ),\n ...(edge.fields ?? {}),\n },\n }));\n\n const vertices =\n analyzedBoard.layout === \"generic\"\n ? []\n : analyzedBoard.vertices.map((vertex) => ({\n id: vertex.id,\n spaceIds: [...vertex.spaceIds],\n typeId: vertex.typeId ?? null,\n label: vertex.label ?? null,\n ownerId: null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.vertexFieldsSchema,\n analysis,\n ),\n ...(vertex.fields ?? {}),\n },\n }));\n\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n const playerId =\n analyzedBoard.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(analyzedBoard.board.id.length + 1)\n : null;\n const boardState = {\n id: runtimeBoardId,\n ...sharedBoardState,\n playerId,\n spaces: cloneJson(buildSpaces()),\n relations: cloneJson(relations),\n containers: cloneJson(buildContainers(runtimeBoardId)),\n ...(analyzedBoard.layout === \"hex\"\n ? {\n orientation: analyzedBoard.board.orientation ?? \"pointy-top\",\n edges: cloneJson(edges),\n vertices: cloneJson(vertices),\n }\n : analyzedBoard.layout === \"square\"\n ? {\n edges: cloneJson(edges),\n vertices: cloneJson(vertices),\n }\n : {}),\n };\n\n boardStatesById[runtimeBoardId] = boardState;\n if (analyzedBoard.layout === \"hex\") {\n hexBoardStatesById[runtimeBoardId] = boardState;\n }\n if (analyzedBoard.layout === \"square\") {\n squareBoardStatesById[runtimeBoardId] = boardState;\n }\n }\n }\n\n const sharedZones = Object.fromEntries(\n analysis.sharedZones.map((zone) => [zone.id, [] as string[]]),\n );\n const perPlayerZones = Object.fromEntries(\n analysis.playerZones.map((zone) => [\n zone.id,\n Object.fromEntries(\n playerIds.map((playerId) => [playerId, [] as string[]]),\n ),\n ]),\n );\n const zoneVisibility = Object.fromEntries(\n (manifest.zones ?? []).map((zone) => [\n zone.id,\n zone.visibility ?? \"public\",\n ]),\n );\n const zoneCardSetIdsByZoneId = Object.fromEntries(\n Array.from(analysis.zoneCardSetIdsById.entries()).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n );\n const handVisibility = Object.fromEntries(\n analysis.playerZones.map((zone) => [\n zone.id,\n zone.visibility ?? \"ownerOnly\",\n ]),\n );\n const componentSortPosition = (position: unknown) =>\n typeof position === \"number\" ? position : Number.MAX_SAFE_INTEGER;\n const pushSharedComponent = (zoneId: string, componentId: string) => {\n const zone = sharedZones[zoneId];\n if (!zone) {\n return;\n }\n zone.push(componentId);\n zone.sort(\n (left, right) =>\n componentSortPosition(componentLocations[left]?.position) -\n componentSortPosition(componentLocations[right]?.position),\n );\n };\n const pushPlayerComponent = (\n zoneId: string,\n playerId: string,\n componentId: string,\n ) => {\n const zone = perPlayerZones[zoneId]?.[playerId];\n if (!zone) {\n return;\n }\n zone.push(componentId);\n zone.sort(\n (left, right) =>\n componentSortPosition(componentLocations[left]?.position) -\n componentSortPosition(componentLocations[right]?.position),\n );\n };\n\n for (const [componentId, location] of Object.entries(componentLocations)) {\n switch (location.type) {\n case \"InDeck\":\n pushSharedComponent(location.deckId as string, componentId);\n break;\n case \"InHand\":\n pushPlayerComponent(\n location.handId as string,\n location.playerId as string,\n componentId,\n );\n break;\n case \"InZone\":\n pushSharedComponent(location.zoneId as string, componentId);\n break;\n default:\n break;\n }\n }\n const ownerOfCard = Object.fromEntries(\n Object.keys(cards).map((cardId) => [cardId, null]),\n );\n const visibility = Object.fromEntries(\n Object.keys(cards).map((cardId) => [cardId, { faceUp: true }]),\n );\n const resourcesByPlayer = Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n Object.fromEntries(\n analysis.resourceIds.map((resourceId) => [resourceId, 0]),\n ),\n ]),\n );\n // PerPlayer<T> wire shape only: { __perPlayer: true, entries: [[playerId, value], ...] }.\n const toPerPlayerWireFormat = <Value>(\n entries: Record<string, Value>,\n ): {\n readonly __perPlayer: true;\n readonly entries: ReadonlyArray<readonly [string, Value]>;\n } => ({\n __perPlayer: true,\n entries: playerIds.map(\n (playerId) => [playerId, entries[playerId] as Value] as const,\n ),\n });\n\n const perPlayerZonesWire = Object.fromEntries(\n Object.entries(perPlayerZones).map(([zoneId, entries]) => [\n zoneId,\n toPerPlayerWireFormat(entries),\n ]),\n );\n const resourcesWire = toPerPlayerWireFormat(resourcesByPlayer);\n\n return cloneJson({\n playerOrder: playerIds,\n zones: {\n shared: sharedZones,\n perPlayer: perPlayerZonesWire,\n visibility: zoneVisibility,\n cardSetIdsByZoneId: zoneCardSetIdsByZoneId,\n },\n decks: cloneJson(sharedZones),\n hands: cloneJson(perPlayerZonesWire),\n handVisibility,\n cards,\n pieces,\n componentLocations,\n ownerOfCard,\n visibility,\n resources: resourcesWire,\n boards: {\n byId: boardStatesById,\n hex: hexBoardStatesById,\n square: squareBoardStatesById,\n network: {},\n track: {},\n },\n dice,\n });\n}\n"],"mappings":"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","names":["dedupeSorted","renderCardInstanceIds","expandSeedIds","isHexBoardTemplateSpec","isHexBoardSpec","HEX_CORNERS","HEX_CORNER_OFFSETS","cubeFromAxial","cornerGeometryKey","resolveHexSpaces","template","cardSetIds","zoneIds"]}