@dreamboard-games/sdk 0.4.0-alpha.6 → 0.4.0-alpha.8

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 (61) hide show
  1. package/REFERENCE.md +561 -59
  2. package/dist/authoring/index.d.ts +5 -4
  3. package/dist/authoring/index.js +4 -4
  4. package/dist/authoring/index.js.map +1 -1
  5. package/dist/{chunk-52DH7VQF.js → chunk-2TAKLJJD.js} +5 -2
  6. package/dist/{chunk-52DH7VQF.js.map → chunk-2TAKLJJD.js.map} +1 -1
  7. package/dist/{chunk-TGMXBRKY.js → chunk-3BLN5POZ.js} +5 -3
  8. package/dist/chunk-3BLN5POZ.js.map +1 -0
  9. package/dist/{chunk-OV6JC2BM.js → chunk-44N3T2A5.js} +19 -15
  10. package/dist/chunk-44N3T2A5.js.map +1 -0
  11. package/dist/chunk-5CQIJHGF.js +663 -0
  12. package/dist/chunk-5CQIJHGF.js.map +1 -0
  13. package/dist/chunk-IYX5OO2K.js +565 -0
  14. package/dist/chunk-IYX5OO2K.js.map +1 -0
  15. package/dist/{chunk-SOBNI363.js → chunk-VTK4TIXC.js} +11 -6
  16. package/dist/{chunk-SOBNI363.js.map → chunk-VTK4TIXC.js.map} +1 -1
  17. package/dist/{chunk-HK3WN4U7.js → chunk-VTNEWMWJ.js} +2 -2
  18. package/dist/{chunk-HK3WN4U7.js.map → chunk-VTNEWMWJ.js.map} +1 -1
  19. package/dist/{chunk-PAPIAMYX.js → chunk-XV27IQHA.js} +6 -4
  20. package/dist/{chunk-PAPIAMYX.js.map → chunk-XV27IQHA.js.map} +1 -1
  21. package/dist/{chunk-DDST4U2P.js → chunk-YGQTL63W.js} +2 -2
  22. package/dist/chunk-ZYONCTZ2.js +564 -0
  23. package/dist/chunk-ZYONCTZ2.js.map +1 -0
  24. package/dist/codegen.js +1 -1
  25. package/dist/{stale-contract-artifact-error-BelRiIDR.d.ts → diagnostics-1BWjRo6-.d.ts} +1 -18
  26. package/dist/{index.d-DMASeF6M.d.ts → index.d-C0PKOVbh.d.ts} +25 -4
  27. package/dist/index.js +2 -2
  28. package/dist/package-set.d.ts +2 -2
  29. package/dist/package-set.js +2 -2
  30. package/dist/{protocol-835hEGne.d.ts → protocol-nS2ojsGr.d.ts} +5 -0
  31. package/dist/reducer/advanced.d.ts +2 -2
  32. package/dist/reducer-contract.d.ts +1 -1
  33. package/dist/reducer-contract.js +2 -2
  34. package/dist/reducer.d.ts +26 -22
  35. package/dist/reducer.js +136 -89
  36. package/dist/reducer.js.map +1 -1
  37. package/dist/reference-games/index.d.ts +223 -0
  38. package/dist/reference-games/index.js +230 -0
  39. package/dist/reference-games/index.js.map +1 -0
  40. package/dist/runtime/primitives.js +4 -3
  41. package/dist/runtime/workspace-contract.js +5 -4
  42. package/dist/runtime.d.ts +3 -3
  43. package/dist/runtime.js +15 -205
  44. package/dist/runtime.js.map +1 -1
  45. package/dist/stale-contract-artifact-error-C5AaZPJ8.d.ts +18 -0
  46. package/dist/testing-runtime.d.ts +42 -0
  47. package/dist/testing-runtime.js +153 -0
  48. package/dist/testing-runtime.js.map +1 -0
  49. package/dist/testing.d.ts +8 -194
  50. package/dist/testing.js +22 -640
  51. package/dist/testing.js.map +1 -1
  52. package/dist/types-B_3pObUV.d.ts +192 -0
  53. package/dist/{types-aI4V9CWe.d.ts → types-CTeN_QAk.d.ts} +1 -1
  54. package/dist/types.d.ts +4 -0
  55. package/dist/{views-32rSsfeU.d.ts → views-Qx-EHBP8.d.ts} +27 -10
  56. package/package.json +13 -3
  57. package/dist/chunk-OV6JC2BM.js.map +0 -1
  58. package/dist/chunk-TGMXBRKY.js.map +0 -1
  59. package/dist/chunk-UUQNOGZV.js +0 -1266
  60. package/dist/chunk-UUQNOGZV.js.map +0 -1
  61. /package/dist/{chunk-DDST4U2P.js.map → chunk-YGQTL63W.js.map} +0 -0
@@ -56,10 +56,11 @@ declare function materializeManifest(manifest: unknown): JsonValue;
56
56
  declare function generateWorkspaceArtifacts(manifest: unknown): readonly GeneratedArtifactV1[];
57
57
  declare function generateTestArtifacts(input: GenerateTestArtifactsInputV1): readonly GeneratedArtifactV1[];
58
58
  declare const GENERATED_WORKSPACE_PATHS: readonly [...string[], "test/generated/base-state.json"];
59
- declare const GENERATED_WORKSPACE_PATH_PATTERNS: {
60
- prefix: string;
61
- suffix: string;
62
- }[];
59
+ type GeneratedWorkspacePathPattern = {
60
+ readonly prefix: string;
61
+ readonly suffix: string;
62
+ };
63
+ declare const GENERATED_WORKSPACE_PATH_PATTERNS: readonly GeneratedWorkspacePathPattern[];
63
64
  declare const MANIFEST_CONFORMANCE_CASES: readonly AuthoringManifestConformanceCaseV1[];
64
65
  declare const projectAuthoringAdapter: ProjectAuthoringAdapterV1;
65
66
 
@@ -1,6 +1,3 @@
1
- import {
2
- GENERATED_AUTHORING_METADATA
3
- } from "../chunk-HK3WN4U7.js";
4
1
  import {
5
2
  AUTHORITATIVE_GENERATED_FILES,
6
3
  SEED_FILES,
@@ -9,7 +6,10 @@ import {
9
6
  generateSeedFiles,
10
7
  materializeManifestTable,
11
8
  validateManifestAuthoring
12
- } from "../chunk-52DH7VQF.js";
9
+ } from "../chunk-2TAKLJJD.js";
10
+ import {
11
+ GENERATED_AUTHORING_METADATA
12
+ } from "../chunk-VTNEWMWJ.js";
13
13
  import "../chunk-PZ5AY32C.js";
14
14
 
15
15
  // src/authoring/adapter.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/authoring/adapter.ts","../../src/authoring/manifest-conformance-cases.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type {\n GameTopologyManifest,\n JsonValue,\n} from \"@dreamboard-games/sdk-types\";\nimport {\n AUTHORITATIVE_GENERATED_FILES,\n SEED_FILES,\n SEED_FILE_PATTERNS,\n generateAuthoritativeFiles,\n generateSeedFiles,\n materializeManifestTable,\n validateManifestAuthoring,\n} from \"@dreamboard-games/workspace-codegen\";\nimport { GENERATED_AUTHORING_METADATA } from \"./generated-metadata.js\";\nimport {\n createManifestConformanceCases,\n diagnosticCodesForValidationErrors,\n} from \"./manifest-conformance-cases.js\";\nimport type {\n AuthoringValidationResultV1,\n GenerateTestArtifactsInputV1,\n GeneratedArtifactV1,\n ProjectAuthoringAdapterV1,\n} from \"./types.js\";\n\nconst PLAYER_IDS = [\"player-1\", \"player-2\"] as const;\n\nfunction stableJson(value: unknown): string {\n if (value === undefined) {\n return \"null\";\n }\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableJson(item)).join(\",\")}]`;\n }\n return `{${Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)\n .join(\",\")}}`;\n}\n\nexport function sha256(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction assertManifest(manifest: unknown): GameTopologyManifest {\n if (!manifest || typeof manifest !== \"object\") {\n throw new Error(\"Expected a manifest object.\");\n }\n return manifest as GameTopologyManifest;\n}\n\nfunction normalizeArtifact(\n path: string,\n content: string,\n ownership: GeneratedArtifactV1[\"ownership\"],\n): GeneratedArtifactV1 {\n if (\n path.length === 0 ||\n path.startsWith(\"/\") ||\n path.includes(\"\\\\\") ||\n path\n .split(\"/\")\n .some((segment) => !segment || segment === \".\" || segment === \"..\")\n ) {\n throw new Error(`Generated artifact path '${path}' is not normalized.`);\n }\n return {\n path,\n ownership,\n content,\n contentSha256: sha256(content),\n };\n}\n\nfunction normalizeArtifacts(\n entries: Record<string, string>,\n ownership: GeneratedArtifactV1[\"ownership\"],\n): GeneratedArtifactV1[] {\n return Object.entries(entries)\n .map(([path, content]) => normalizeArtifact(path, content, ownership))\n .sort((left, right) => left.path.localeCompare(right.path));\n}\n\nfunction validateNoDuplicateArtifactPaths(\n artifacts: readonly GeneratedArtifactV1[],\n): void {\n const seen = new Set<string>();\n for (const artifact of artifacts) {\n if (seen.has(artifact.path)) {\n throw new Error(\n `Generated artifact path '${artifact.path}' was emitted twice.`,\n );\n }\n seen.add(artifact.path);\n if (artifact.contentSha256 !== sha256(artifact.content)) {\n throw new Error(\n `Generated artifact '${artifact.path}' has a stale hash.`,\n );\n }\n }\n}\n\nexport function validateManifest(\n manifest: unknown,\n): AuthoringValidationResultV1 {\n try {\n const gameManifest = assertManifest(manifest);\n const result = validateManifestAuthoring(gameManifest);\n const errors = [...result.errors];\n if (errors.length === 0) {\n try {\n materializeManifest(gameManifest);\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n }\n }\n return {\n valid: errors.length === 0,\n errors,\n warnings: result.warnings,\n };\n } catch (error) {\n return {\n valid: false,\n errors: [error instanceof Error ? error.message : String(error)],\n warnings: [],\n };\n }\n}\n\nexport function materializeManifest(manifest: unknown): JsonValue {\n return materializeManifestTable({\n manifest: assertManifest(manifest),\n playerIds: PLAYER_IDS,\n shuffleItems: (values) => [...values],\n }) as JsonValue;\n}\n\nexport function generateWorkspaceArtifacts(\n manifest: unknown,\n): readonly GeneratedArtifactV1[] {\n const gameManifest = assertManifest(manifest);\n const artifacts = [\n ...normalizeArtifacts(\n generateAuthoritativeFiles(gameManifest),\n \"authoritative\",\n ),\n ...normalizeArtifacts(generateSeedFiles(gameManifest), \"seed\"),\n ].sort((left, right) => left.path.localeCompare(right.path));\n validateNoDuplicateArtifactPaths(artifacts);\n return artifacts;\n}\n\nexport function generateTestArtifacts(\n input: GenerateTestArtifactsInputV1,\n): readonly GeneratedArtifactV1[] {\n const materialized = materializeManifest(input.manifest);\n return [\n normalizeArtifact(\n \"test/generated/base-state.json\",\n `${stableJson(materialized)}\\n`,\n \"derived-test\",\n ),\n ];\n}\n\nexport const GENERATED_WORKSPACE_PATHS = [\n ...AUTHORITATIVE_GENERATED_FILES,\n ...SEED_FILES,\n \"test/generated/base-state.json\",\n] as const;\n\nexport const GENERATED_WORKSPACE_PATH_PATTERNS = SEED_FILE_PATTERNS;\n\nexport const MANIFEST_CONFORMANCE_CASES = createManifestConformanceCases();\n\nexport const projectAuthoringAdapter: ProjectAuthoringAdapterV1 = {\n protocolVersion: 1,\n metadata: GENERATED_AUTHORING_METADATA,\n generatedPaths: GENERATED_WORKSPACE_PATHS,\n generatedPathPatterns: GENERATED_WORKSPACE_PATH_PATTERNS,\n manifestConformanceCases: MANIFEST_CONFORMANCE_CASES,\n validateManifest,\n materializeManifest,\n generateWorkspaceArtifacts,\n generateTestArtifacts,\n};\n\nexport { diagnosticCodesForValidationErrors, stableJson };\n","import type {\n BoardCard,\n BoardSpec,\n ComponentHomeSpec,\n GameTopologyManifest,\n PieceSeedSpec,\n PieceTypeSpec,\n ZoneSpec,\n} from \"@dreamboard-games/sdk-types\";\nimport type { AuthoringManifestConformanceCaseV1 } from \"./types.js\";\n\nfunction baseManifest(\n cardSet: GameTopologyManifest[\"cardSets\"][number],\n overrides: Partial<GameTopologyManifest> = {},\n): GameTopologyManifest {\n return {\n players: {\n minPlayers: 2,\n maxPlayers: 2,\n optimalPlayers: 2,\n },\n cardSets: [cardSet],\n zones: [],\n boardTemplates: [],\n boards: [],\n pieceTypes: [],\n pieceSeeds: [],\n dieTypes: [],\n dieSeeds: [],\n resources: [],\n setupOptions: [],\n setupProfiles: [],\n ...overrides,\n };\n}\n\nfunction manualCardSet(\n id: string,\n defaultHome: ComponentHomeSpec,\n cards: BoardCard[],\n): GameTopologyManifest[\"cardSets\"][number] {\n const cardSet = {\n id,\n name: id,\n type: \"manual\",\n cardSchema: { properties: {} },\n defaultHome,\n cards,\n };\n return cardSet as unknown as GameTopologyManifest[\"cardSets\"][number];\n}\n\nconst sharedZone: ZoneSpec = {\n id: \"shared-zone\",\n name: \"Shared Zone\",\n scope: \"shared\",\n allowedCardSetIds: [\"cards\"],\n};\n\nconst sharedBoard: BoardSpec = {\n id: \"square-board\",\n name: \"Square Board\",\n layout: \"square\",\n scope: \"shared\",\n spaces: [\n { id: \"a1\", row: 0, col: 0 },\n { id: \"a2\", row: 0, col: 1 },\n { id: \"b1\", row: 1, col: 0 },\n { id: \"b2\", row: 1, col: 1 },\n ],\n relations: [],\n containers: [\n {\n id: \"display-row\",\n name: \"Display Row\",\n host: { type: \"board\" },\n },\n ],\n edges: [],\n vertices: [],\n};\n\nconst sharedTopology: Partial<GameTopologyManifest> = {\n boards: [sharedBoard],\n pieceTypes: [\n {\n id: \"holder\",\n name: \"Holder\",\n slots: [{ id: \"pocket\" }],\n },\n ] satisfies PieceTypeSpec[],\n pieceSeeds: [{ id: \"holder-a\", typeId: \"holder\" }] satisfies PieceSeedSpec[],\n};\n\nconst fixtures = [\n {\n id: \"manual-default-detached\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"detached\" }, [\n { type: \"marker\", name: \"Marker\", count: 1, properties: {} },\n ]),\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"ed6f7ce2ff4fbe697e49134f1d59157cf146e202db29a77be50e8326585f535c\",\n },\n },\n {\n id: \"manual-default-shared-zone\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"shared-zone\" }, [\n { type: \"coin\", name: \"Coin\", count: 2, properties: {} },\n ]),\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"75028d28dbc415c81db5e2d780d55b04c4db36378a149bc02b0194d94a8cc2b9\",\n },\n },\n {\n id: \"preset-default-shared-zone\",\n manifest: baseManifest(\n {\n id: \"cards\",\n name: \"Preset Cards\",\n type: \"preset\",\n presetId: \"standard_52_deck\",\n defaultHome: { type: \"zone\", zoneId: \"shared-zone\" },\n },\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"b3471c577ed266667b16799f75aa9b7358100a94108aa46a31ad16a0291f67ca\",\n },\n },\n {\n id: \"manual-per-card-detached-override\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"shared-zone\" }, [\n {\n type: \"removed\",\n name: \"Removed\",\n count: 1,\n home: { type: \"detached\" },\n properties: {},\n },\n ]),\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"fdcb2de78fc391e11aca1f266fd8bbb348a82faa0fbbac1d8eb1defd8697a0e9\",\n },\n },\n {\n id: \"manual-per-card-shared-zone-override\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"detached\" }, [\n {\n type: \"dealt\",\n name: \"Dealt\",\n count: 1,\n home: { type: \"zone\", zoneId: \"shared-zone\" },\n properties: {},\n },\n ]),\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"b6bee1db85f16e8a12a7136c7d524591f925427c8ec04d64b07905c5bc859d7a\",\n },\n },\n {\n id: \"manual-compatible-zones-no-inference\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"detached\" }, [\n { type: \"token\", name: \"Token\", count: 1, properties: {} },\n ]),\n {\n zones: [\n sharedZone,\n {\n ...sharedZone,\n id: \"second-compatible-zone\",\n name: \"Second Compatible Zone\",\n },\n ],\n },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"2727728ba3743d2b1874b2bc573b48c88f962fdcbdcdf20c62bed551d6d955c4\",\n },\n },\n {\n id: \"manual-per-player-zone-rejected\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"hand\" }, [\n { type: \"secret\", name: \"Secret\", count: 1, properties: {} },\n ]),\n {\n zones: [\n {\n id: \"hand\",\n name: \"Hand\",\n scope: \"perPlayer\",\n allowedCardSetIds: [\"cards\"],\n },\n ],\n },\n ),\n expected: {\n valid: false,\n transportValid: true,\n diagnosticCodes: [\"CARD_HOME_PER_PLAYER_ZONE_REJECTED\"],\n },\n },\n {\n id: \"manual-space-home\",\n manifest: baseManifest(\n manualCardSet(\n \"cards\",\n { type: \"space\", boardId: \"square-board\", spaceId: \"a1\" },\n [{ type: \"space-card\", name: \"Space\", count: 1, properties: {} }],\n ),\n sharedTopology,\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"429abfb3276c67cdca59d3dc077fc73022a9716bccef2c43f6805ff5cce0f2c2\",\n },\n },\n {\n id: \"manual-container-home\",\n manifest: baseManifest(\n manualCardSet(\n \"cards\",\n {\n type: \"container\",\n boardId: \"square-board\",\n containerId: \"display-row\",\n },\n [\n {\n type: \"container-card\",\n name: \"Container\",\n count: 1,\n properties: {},\n },\n ],\n ),\n sharedTopology,\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"eff372263227b316d064a519cf282a6cc1d2d8df4ac04673b7f47ac518d7a2a3\",\n },\n },\n {\n id: \"manual-slot-home\",\n manifest: baseManifest(\n manualCardSet(\n \"cards\",\n {\n type: \"slot\",\n host: { kind: \"piece\", id: \"holder-a\" },\n slotId: \"pocket\",\n },\n [{ type: \"slot-card\", name: \"Slot\", count: 1, properties: {} }],\n ),\n sharedTopology,\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"af3111f8d861ae69b77f2f46ba3df9f2f698f3306c412efc91095544e8121ab6\",\n },\n },\n {\n id: \"manual-edge-home\",\n manifest: baseManifest(\n manualCardSet(\n \"cards\",\n {\n type: \"edge\",\n boardId: \"square-board\",\n ref: { spaces: [\"a1\", \"a2\"] },\n },\n [{ type: \"edge-card\", name: \"Edge\", count: 1, properties: {} }],\n ),\n sharedTopology,\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"f8606ea25f52d9bf801aa4fee9f558b60d7f39bcd601d57bdfccdf1ddbf4c500\",\n },\n },\n {\n id: \"manual-vertex-home\",\n manifest: baseManifest(\n manualCardSet(\n \"cards\",\n {\n type: \"vertex\",\n boardId: \"square-board\",\n ref: { spaces: [\"a1\", \"a2\", \"b1\", \"b2\"] },\n },\n [{ type: \"vertex-card\", name: \"Vertex\", count: 1, properties: {} }],\n ),\n sharedTopology,\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"e84a4920ea8b71052acd42accf11101380ab982e493ebe207113dd4d243034de\",\n },\n },\n {\n id: \"manual-invalid-target-id\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"missing-zone\" }, [\n { type: \"lost\", name: \"Lost\", count: 1, properties: {} },\n ]),\n ),\n expected: {\n valid: false,\n transportValid: true,\n diagnosticCodes: [\"AUTHORING_VALIDATION_ERROR\"],\n },\n },\n {\n id: \"manual-count-order\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"shared-zone\" }, [\n { type: \"first\", name: \"First\", count: 3, properties: {} },\n { type: \"second\", name: \"Second\", count: 2, properties: {} },\n ]),\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"2e4ced71909d4c36053317311c9ceaf3bf3adba875bff3fe9596bbea47746423\",\n },\n },\n {\n id: \"manual-generated-scenario-base\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"shared-zone\" }, [\n { type: \"alpha\", name: \"Alpha\", count: 2, properties: {} },\n { type: \"beta\", name: \"Beta\", count: 1, properties: {} },\n ]),\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"b1b65d708b503036a49434c64c6f4aab3bedd295681bd103b69c4b98fdd5e2bb\",\n },\n },\n {\n id: \"manual-default-required\",\n manifest: {\n ...baseManifest(\n manualCardSet(\"cards\", { type: \"detached\" }, [\n { type: \"card\", name: \"Card\", count: 1, properties: {} },\n ]),\n ),\n cardSets: [\n {\n id: \"cards\",\n name: \"Cards\",\n type: \"manual\",\n cardSchema: { properties: {} },\n cards: [{ type: \"card\", name: \"Card\", count: 1, properties: {} }],\n },\n ],\n } as unknown as GameTopologyManifest,\n expected: {\n valid: false,\n transportValid: false,\n diagnosticCodes: [\"MANUAL_CARD_SET_DEFAULT_HOME_REQUIRED\"],\n },\n },\n] as const satisfies readonly (Omit<\n AuthoringManifestConformanceCaseV1,\n \"manifest\"\n> & { manifest: GameTopologyManifest })[];\n\nfunction deepFreeze<T>(value: T): T {\n if (value && typeof value === \"object\" && !Object.isFrozen(value)) {\n for (const entry of Object.values(value)) {\n deepFreeze(entry);\n }\n Object.freeze(value);\n }\n return value;\n}\n\nexport function diagnosticCodesForValidationErrors(\n errors: readonly string[],\n): readonly string[] {\n return [...new Set(errors.map(diagnosticCodeForValidationError))].sort();\n}\n\nfunction diagnosticCodeForValidationError(error: string): string {\n if (\n error.includes(\".defaultHome: Manual card sets must declare defaultHome\")\n ) {\n return \"MANUAL_CARD_SET_DEFAULT_HOME_REQUIRED\";\n }\n if (error.includes(\"cannot target per-player zone\")) {\n return \"CARD_HOME_PER_PLAYER_ZONE_REJECTED\";\n }\n if (error.includes(\"cannot target per-player board\")) {\n return \"CARD_HOME_PER_PLAYER_BOARD_REJECTED\";\n }\n return \"AUTHORING_VALIDATION_ERROR\";\n}\n\nexport function createManifestConformanceCases(): readonly AuthoringManifestConformanceCaseV1[] {\n return deepFreeze(\n fixtures,\n ) as unknown as readonly AuthoringManifestConformanceCaseV1[];\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/authoring/adapter.ts","../../src/authoring/manifest-conformance-cases.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type {\n GameTopologyManifest,\n JsonValue,\n} from \"@dreamboard-games/sdk-types\";\nimport {\n AUTHORITATIVE_GENERATED_FILES,\n SEED_FILES,\n SEED_FILE_PATTERNS,\n generateAuthoritativeFiles,\n generateSeedFiles,\n materializeManifestTable,\n validateManifestAuthoring,\n} from \"@dreamboard-games/workspace-codegen\";\nimport { GENERATED_AUTHORING_METADATA } from \"./generated-metadata.js\";\nimport {\n createManifestConformanceCases,\n diagnosticCodesForValidationErrors,\n} from \"./manifest-conformance-cases.js\";\nimport type {\n AuthoringValidationResultV1,\n GenerateTestArtifactsInputV1,\n GeneratedArtifactV1,\n ProjectAuthoringAdapterV1,\n} from \"./types.js\";\n\nconst PLAYER_IDS = [\"player-1\", \"player-2\"] as const;\n\nfunction stableJson(value: unknown): string {\n if (value === undefined) {\n return \"null\";\n }\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableJson(item)).join(\",\")}]`;\n }\n return `{${Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)\n .join(\",\")}}`;\n}\n\nexport function sha256(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction assertManifest(manifest: unknown): GameTopologyManifest {\n if (!manifest || typeof manifest !== \"object\") {\n throw new Error(\"Expected a manifest object.\");\n }\n return manifest as GameTopologyManifest;\n}\n\nfunction normalizeArtifact(\n path: string,\n content: string,\n ownership: GeneratedArtifactV1[\"ownership\"],\n): GeneratedArtifactV1 {\n if (\n path.length === 0 ||\n path.startsWith(\"/\") ||\n path.includes(\"\\\\\") ||\n path\n .split(\"/\")\n .some((segment) => !segment || segment === \".\" || segment === \"..\")\n ) {\n throw new Error(`Generated artifact path '${path}' is not normalized.`);\n }\n return {\n path,\n ownership,\n content,\n contentSha256: sha256(content),\n };\n}\n\nfunction normalizeArtifacts(\n entries: Record<string, string>,\n ownership: GeneratedArtifactV1[\"ownership\"],\n): GeneratedArtifactV1[] {\n return Object.entries(entries)\n .map(([path, content]) => normalizeArtifact(path, content, ownership))\n .sort((left, right) => left.path.localeCompare(right.path));\n}\n\nfunction validateNoDuplicateArtifactPaths(\n artifacts: readonly GeneratedArtifactV1[],\n): void {\n const seen = new Set<string>();\n for (const artifact of artifacts) {\n if (seen.has(artifact.path)) {\n throw new Error(\n `Generated artifact path '${artifact.path}' was emitted twice.`,\n );\n }\n seen.add(artifact.path);\n if (artifact.contentSha256 !== sha256(artifact.content)) {\n throw new Error(\n `Generated artifact '${artifact.path}' has a stale hash.`,\n );\n }\n }\n}\n\nexport function validateManifest(\n manifest: unknown,\n): AuthoringValidationResultV1 {\n try {\n const gameManifest = assertManifest(manifest);\n const result = validateManifestAuthoring(gameManifest);\n const errors = [...result.errors];\n if (errors.length === 0) {\n try {\n materializeManifest(gameManifest);\n } catch (error) {\n errors.push(error instanceof Error ? error.message : String(error));\n }\n }\n return {\n valid: errors.length === 0,\n errors,\n warnings: result.warnings,\n };\n } catch (error) {\n return {\n valid: false,\n errors: [error instanceof Error ? error.message : String(error)],\n warnings: [],\n };\n }\n}\n\nexport function materializeManifest(manifest: unknown): JsonValue {\n return materializeManifestTable({\n manifest: assertManifest(manifest),\n playerIds: PLAYER_IDS,\n shuffleItems: (values) => [...values],\n }) as JsonValue;\n}\n\nexport function generateWorkspaceArtifacts(\n manifest: unknown,\n): readonly GeneratedArtifactV1[] {\n const gameManifest = assertManifest(manifest);\n const artifacts = [\n ...normalizeArtifacts(\n generateAuthoritativeFiles(gameManifest),\n \"authoritative\",\n ),\n ...normalizeArtifacts(generateSeedFiles(gameManifest), \"seed\"),\n ].sort((left, right) => left.path.localeCompare(right.path));\n validateNoDuplicateArtifactPaths(artifacts);\n return artifacts;\n}\n\nexport function generateTestArtifacts(\n input: GenerateTestArtifactsInputV1,\n): readonly GeneratedArtifactV1[] {\n const materialized = materializeManifest(input.manifest);\n return [\n normalizeArtifact(\n \"test/generated/base-state.json\",\n `${stableJson(materialized)}\\n`,\n \"derived-test\",\n ),\n ];\n}\n\nexport const GENERATED_WORKSPACE_PATHS = [\n ...AUTHORITATIVE_GENERATED_FILES,\n ...SEED_FILES,\n \"test/generated/base-state.json\",\n] as const;\n\nexport type GeneratedWorkspacePathPattern = {\n readonly prefix: string;\n readonly suffix: string;\n};\n\nexport const GENERATED_WORKSPACE_PATH_PATTERNS: readonly GeneratedWorkspacePathPattern[] =\n SEED_FILE_PATTERNS;\n\nexport const MANIFEST_CONFORMANCE_CASES = createManifestConformanceCases();\n\nexport const projectAuthoringAdapter: ProjectAuthoringAdapterV1 = {\n protocolVersion: 1,\n metadata: GENERATED_AUTHORING_METADATA,\n generatedPaths: GENERATED_WORKSPACE_PATHS,\n generatedPathPatterns: GENERATED_WORKSPACE_PATH_PATTERNS,\n manifestConformanceCases: MANIFEST_CONFORMANCE_CASES,\n validateManifest,\n materializeManifest,\n generateWorkspaceArtifacts,\n generateTestArtifacts,\n};\n\nexport { diagnosticCodesForValidationErrors, stableJson };\n","import type {\n BoardCard,\n BoardSpec,\n ComponentHomeSpec,\n GameTopologyManifest,\n PieceSeedSpec,\n PieceTypeSpec,\n ZoneSpec,\n} from \"@dreamboard-games/sdk-types\";\nimport type { AuthoringManifestConformanceCaseV1 } from \"./types.js\";\n\nfunction baseManifest(\n cardSet: GameTopologyManifest[\"cardSets\"][number],\n overrides: Partial<GameTopologyManifest> = {},\n): GameTopologyManifest {\n return {\n players: {\n minPlayers: 2,\n maxPlayers: 2,\n optimalPlayers: 2,\n },\n cardSets: [cardSet],\n zones: [],\n boardTemplates: [],\n boards: [],\n pieceTypes: [],\n pieceSeeds: [],\n dieTypes: [],\n dieSeeds: [],\n resources: [],\n setupOptions: [],\n setupProfiles: [],\n ...overrides,\n };\n}\n\nfunction manualCardSet(\n id: string,\n defaultHome: ComponentHomeSpec,\n cards: BoardCard[],\n): GameTopologyManifest[\"cardSets\"][number] {\n const cardSet = {\n id,\n name: id,\n type: \"manual\",\n cardSchema: { properties: {} },\n defaultHome,\n cards,\n };\n return cardSet as unknown as GameTopologyManifest[\"cardSets\"][number];\n}\n\nconst sharedZone: ZoneSpec = {\n id: \"shared-zone\",\n name: \"Shared Zone\",\n scope: \"shared\",\n allowedCardSetIds: [\"cards\"],\n};\n\nconst sharedBoard: BoardSpec = {\n id: \"square-board\",\n name: \"Square Board\",\n layout: \"square\",\n scope: \"shared\",\n spaces: [\n { id: \"a1\", row: 0, col: 0 },\n { id: \"a2\", row: 0, col: 1 },\n { id: \"b1\", row: 1, col: 0 },\n { id: \"b2\", row: 1, col: 1 },\n ],\n relations: [],\n containers: [\n {\n id: \"display-row\",\n name: \"Display Row\",\n host: { type: \"board\" },\n },\n ],\n edges: [],\n vertices: [],\n};\n\nconst sharedTopology: Partial<GameTopologyManifest> = {\n boards: [sharedBoard],\n pieceTypes: [\n {\n id: \"holder\",\n name: \"Holder\",\n slots: [{ id: \"pocket\" }],\n },\n ] satisfies PieceTypeSpec[],\n pieceSeeds: [{ id: \"holder-a\", typeId: \"holder\" }] satisfies PieceSeedSpec[],\n};\n\nconst fixtures = [\n {\n id: \"manual-default-detached\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"detached\" }, [\n { type: \"marker\", name: \"Marker\", count: 1, properties: {} },\n ]),\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"ed6f7ce2ff4fbe697e49134f1d59157cf146e202db29a77be50e8326585f535c\",\n },\n },\n {\n id: \"manual-default-shared-zone\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"shared-zone\" }, [\n { type: \"coin\", name: \"Coin\", count: 2, properties: {} },\n ]),\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"75028d28dbc415c81db5e2d780d55b04c4db36378a149bc02b0194d94a8cc2b9\",\n },\n },\n {\n id: \"preset-default-shared-zone\",\n manifest: baseManifest(\n {\n id: \"cards\",\n name: \"Preset Cards\",\n type: \"preset\",\n presetId: \"standard_52_deck\",\n defaultHome: { type: \"zone\", zoneId: \"shared-zone\" },\n },\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"b3471c577ed266667b16799f75aa9b7358100a94108aa46a31ad16a0291f67ca\",\n },\n },\n {\n id: \"manual-per-card-detached-override\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"shared-zone\" }, [\n {\n type: \"removed\",\n name: \"Removed\",\n count: 1,\n home: { type: \"detached\" },\n properties: {},\n },\n ]),\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"fdcb2de78fc391e11aca1f266fd8bbb348a82faa0fbbac1d8eb1defd8697a0e9\",\n },\n },\n {\n id: \"manual-per-card-shared-zone-override\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"detached\" }, [\n {\n type: \"dealt\",\n name: \"Dealt\",\n count: 1,\n home: { type: \"zone\", zoneId: \"shared-zone\" },\n properties: {},\n },\n ]),\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"b6bee1db85f16e8a12a7136c7d524591f925427c8ec04d64b07905c5bc859d7a\",\n },\n },\n {\n id: \"manual-compatible-zones-no-inference\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"detached\" }, [\n { type: \"token\", name: \"Token\", count: 1, properties: {} },\n ]),\n {\n zones: [\n sharedZone,\n {\n ...sharedZone,\n id: \"second-compatible-zone\",\n name: \"Second Compatible Zone\",\n },\n ],\n },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"2727728ba3743d2b1874b2bc573b48c88f962fdcbdcdf20c62bed551d6d955c4\",\n },\n },\n {\n id: \"manual-per-player-zone-rejected\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"hand\" }, [\n { type: \"secret\", name: \"Secret\", count: 1, properties: {} },\n ]),\n {\n zones: [\n {\n id: \"hand\",\n name: \"Hand\",\n scope: \"perPlayer\",\n allowedCardSetIds: [\"cards\"],\n },\n ],\n },\n ),\n expected: {\n valid: false,\n transportValid: true,\n diagnosticCodes: [\"CARD_HOME_PER_PLAYER_ZONE_REJECTED\"],\n },\n },\n {\n id: \"manual-space-home\",\n manifest: baseManifest(\n manualCardSet(\n \"cards\",\n { type: \"space\", boardId: \"square-board\", spaceId: \"a1\" },\n [{ type: \"space-card\", name: \"Space\", count: 1, properties: {} }],\n ),\n sharedTopology,\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"429abfb3276c67cdca59d3dc077fc73022a9716bccef2c43f6805ff5cce0f2c2\",\n },\n },\n {\n id: \"manual-container-home\",\n manifest: baseManifest(\n manualCardSet(\n \"cards\",\n {\n type: \"container\",\n boardId: \"square-board\",\n containerId: \"display-row\",\n },\n [\n {\n type: \"container-card\",\n name: \"Container\",\n count: 1,\n properties: {},\n },\n ],\n ),\n sharedTopology,\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"eff372263227b316d064a519cf282a6cc1d2d8df4ac04673b7f47ac518d7a2a3\",\n },\n },\n {\n id: \"manual-slot-home\",\n manifest: baseManifest(\n manualCardSet(\n \"cards\",\n {\n type: \"slot\",\n host: { kind: \"piece\", id: \"holder-a\" },\n slotId: \"pocket\",\n },\n [{ type: \"slot-card\", name: \"Slot\", count: 1, properties: {} }],\n ),\n sharedTopology,\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"af3111f8d861ae69b77f2f46ba3df9f2f698f3306c412efc91095544e8121ab6\",\n },\n },\n {\n id: \"manual-edge-home\",\n manifest: baseManifest(\n manualCardSet(\n \"cards\",\n {\n type: \"edge\",\n boardId: \"square-board\",\n ref: { spaces: [\"a1\", \"a2\"] },\n },\n [{ type: \"edge-card\", name: \"Edge\", count: 1, properties: {} }],\n ),\n sharedTopology,\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"f8606ea25f52d9bf801aa4fee9f558b60d7f39bcd601d57bdfccdf1ddbf4c500\",\n },\n },\n {\n id: \"manual-vertex-home\",\n manifest: baseManifest(\n manualCardSet(\n \"cards\",\n {\n type: \"vertex\",\n boardId: \"square-board\",\n ref: { spaces: [\"a1\", \"a2\", \"b1\", \"b2\"] },\n },\n [{ type: \"vertex-card\", name: \"Vertex\", count: 1, properties: {} }],\n ),\n sharedTopology,\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"e84a4920ea8b71052acd42accf11101380ab982e493ebe207113dd4d243034de\",\n },\n },\n {\n id: \"manual-invalid-target-id\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"missing-zone\" }, [\n { type: \"lost\", name: \"Lost\", count: 1, properties: {} },\n ]),\n ),\n expected: {\n valid: false,\n transportValid: true,\n diagnosticCodes: [\"AUTHORING_VALIDATION_ERROR\"],\n },\n },\n {\n id: \"manual-count-order\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"shared-zone\" }, [\n { type: \"first\", name: \"First\", count: 3, properties: {} },\n { type: \"second\", name: \"Second\", count: 2, properties: {} },\n ]),\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"2e4ced71909d4c36053317311c9ceaf3bf3adba875bff3fe9596bbea47746423\",\n },\n },\n {\n id: \"manual-generated-scenario-base\",\n manifest: baseManifest(\n manualCardSet(\"cards\", { type: \"zone\", zoneId: \"shared-zone\" }, [\n { type: \"alpha\", name: \"Alpha\", count: 2, properties: {} },\n { type: \"beta\", name: \"Beta\", count: 1, properties: {} },\n ]),\n { zones: [sharedZone] },\n ),\n expected: {\n valid: true,\n transportValid: true,\n materializedSha256:\n \"b1b65d708b503036a49434c64c6f4aab3bedd295681bd103b69c4b98fdd5e2bb\",\n },\n },\n {\n id: \"manual-default-required\",\n manifest: {\n ...baseManifest(\n manualCardSet(\"cards\", { type: \"detached\" }, [\n { type: \"card\", name: \"Card\", count: 1, properties: {} },\n ]),\n ),\n cardSets: [\n {\n id: \"cards\",\n name: \"Cards\",\n type: \"manual\",\n cardSchema: { properties: {} },\n cards: [{ type: \"card\", name: \"Card\", count: 1, properties: {} }],\n },\n ],\n } as unknown as GameTopologyManifest,\n expected: {\n valid: false,\n transportValid: false,\n diagnosticCodes: [\"MANUAL_CARD_SET_DEFAULT_HOME_REQUIRED\"],\n },\n },\n] as const satisfies readonly (Omit<\n AuthoringManifestConformanceCaseV1,\n \"manifest\"\n> & { manifest: GameTopologyManifest })[];\n\nfunction deepFreeze<T>(value: T): T {\n if (value && typeof value === \"object\" && !Object.isFrozen(value)) {\n for (const entry of Object.values(value)) {\n deepFreeze(entry);\n }\n Object.freeze(value);\n }\n return value;\n}\n\nexport function diagnosticCodesForValidationErrors(\n errors: readonly string[],\n): readonly string[] {\n return [...new Set(errors.map(diagnosticCodeForValidationError))].sort();\n}\n\nfunction diagnosticCodeForValidationError(error: string): string {\n if (\n error.includes(\".defaultHome: Manual card sets must declare defaultHome\")\n ) {\n return \"MANUAL_CARD_SET_DEFAULT_HOME_REQUIRED\";\n }\n if (error.includes(\"cannot target per-player zone\")) {\n return \"CARD_HOME_PER_PLAYER_ZONE_REJECTED\";\n }\n if (error.includes(\"cannot target per-player board\")) {\n return \"CARD_HOME_PER_PLAYER_BOARD_REJECTED\";\n }\n return \"AUTHORING_VALIDATION_ERROR\";\n}\n\nexport function createManifestConformanceCases(): readonly AuthoringManifestConformanceCaseV1[] {\n return deepFreeze(\n fixtures,\n ) as unknown as readonly AuthoringManifestConformanceCaseV1[];\n}\n"],"mappings":"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","names":[]}
@@ -8496,7 +8496,10 @@ export default authoring.game({
8496
8496
  initialPhase: "setup",
8497
8497
  setupProfiles,
8498
8498
  phases,
8499
- views: {},
8499
+ views: {
8500
+ shared: authoring.emptyView(),
8501
+ player: authoring.emptyView(),
8502
+ },
8500
8503
  });
8501
8504
  `;
8502
8505
  }
@@ -8841,4 +8844,4 @@ export {
8841
8844
  generateAuthoritativeFiles,
8842
8845
  generateDynamicGeneratedFiles
8843
8846
  };
8844
- //# sourceMappingURL=chunk-52DH7VQF.js.map
8847
+ //# sourceMappingURL=chunk-2TAKLJJD.js.map