@dreamboard-games/sdk 0.4.0-alpha.0 → 0.4.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/REFERENCE.md +1849 -379
- package/dist/{ResourceCounter-BTXklCEZ.d.ts → ResourceCounter-BuiNstXs.d.ts} +5 -1
- package/dist/{ThemeProvider-DvMl17Ny.d.ts → ThemeProvider-B1sIoBlX.d.ts} +1 -1
- package/dist/attributes-DbvyMbXw.d.ts +68 -0
- package/dist/authoring/index.d.ts +66 -0
- package/dist/authoring/index.js +560 -0
- package/dist/authoring/index.js.map +1 -0
- package/dist/browser-interaction.d.ts +246 -44
- package/dist/browser-interaction.js +14 -1
- package/dist/{chunk-Q5O7GPVY.js → chunk-45FI6XII.js} +630 -375
- package/dist/chunk-45FI6XII.js.map +1 -0
- package/dist/{chunk-4G7552LO.js → chunk-6JQFGSLD.js} +216 -47
- package/dist/chunk-6JQFGSLD.js.map +1 -0
- package/dist/{chunk-NBAEEHAU.js → chunk-CP35NPPY.js} +5926 -5266
- package/dist/chunk-CP35NPPY.js.map +1 -0
- package/dist/{chunk-2LDZ5C3T.js → chunk-FWVV2X74.js} +2 -2
- package/dist/{chunk-MNKDSGIA.js → chunk-HWJS3VOJ.js} +6 -2
- package/dist/chunk-HWJS3VOJ.js.map +1 -0
- package/dist/chunk-K5ZRJTZZ.js +328 -0
- package/dist/chunk-K5ZRJTZZ.js.map +1 -0
- package/dist/{chunk-U5KBV2BA.js → chunk-N6ZDIMRB.js} +444 -223
- package/dist/chunk-N6ZDIMRB.js.map +1 -0
- package/dist/chunk-O6M6PN4E.js +1225 -0
- package/dist/chunk-O6M6PN4E.js.map +1 -0
- package/dist/chunk-PF7L4BMG.js +117 -0
- package/dist/chunk-PF7L4BMG.js.map +1 -0
- package/dist/{chunk-P7F4L2FF.js → chunk-WOWFONLZ.js} +609 -1287
- package/dist/chunk-WOWFONLZ.js.map +1 -0
- package/dist/{chunk-QLG6VEMW.js → chunk-WUIVY2KE.js} +318 -21
- package/dist/chunk-WUIVY2KE.js.map +1 -0
- package/dist/chunk-ZAS2SENW.js +12 -0
- package/dist/chunk-ZAS2SENW.js.map +1 -0
- package/dist/codegen.d.ts +11 -1
- package/dist/codegen.js +1 -1
- package/dist/{components-DaIqi9QM.d.ts → components-BbWPnZCF.d.ts} +37 -70
- package/dist/{hex-board-view-UCUjMALd.d.ts → hex-board-view-Kz9Q_zsv.d.ts} +1 -1
- package/dist/index.js +2 -1
- package/dist/package-set.d.ts +2 -2
- package/dist/package-set.js +2 -1
- package/dist/player-state-Cqpyeql0.d.ts +371 -0
- package/dist/protocol-BP193lva.d.ts +267 -0
- package/dist/reducer/advanced.d.ts +2 -2
- package/dist/reducer/advanced.js +1 -1
- package/dist/reducer-contract.js +1 -1
- package/dist/reducer.d.ts +7 -7
- package/dist/reducer.js +190 -183
- package/dist/reducer.js.map +1 -1
- package/dist/runtime/primitives.d.ts +10 -9
- package/dist/runtime/primitives.js +9 -6
- package/dist/runtime/runtime-api.d.ts +2 -2
- package/dist/runtime/workspace-contract.d.ts +28 -76
- package/dist/runtime/workspace-contract.js +7 -5
- package/dist/runtime-api-BJharVaj.d.ts +198 -0
- package/dist/runtime-api-C6aWo9c0.d.ts +95 -0
- package/dist/runtime-json-CQ9QbLZ5.d.ts +5 -0
- package/dist/runtime.d.ts +80 -11
- package/dist/runtime.js +89 -445
- package/dist/runtime.js.map +1 -1
- package/dist/testing.d.ts +643 -22
- package/dist/testing.js +1371 -76
- package/dist/testing.js.map +1 -1
- package/dist/types-CYeN0wLK.d.ts +29 -0
- package/dist/{attributes-BeRyboMS.d.ts → types-DJj5MJkl.d.ts} +32 -55
- package/dist/types.d.ts +14 -7
- package/dist/ui/components.d.ts +4 -5
- package/dist/ui/components.js +19 -1
- package/dist/ui/player-state.d.ts +2 -365
- package/dist/ui/plugin-styles.css +1 -1
- package/dist/{ui-contract-BUC6iS3s.d.ts → ui-contract-CY7cxsCC.d.ts} +17 -26
- package/dist/ui.d.ts +8 -13
- package/dist/ui.js +20 -2
- package/dist/{views-B0hlW6IT.d.ts → views-fn2RuXOx.d.ts} +59 -44
- package/package.json +28 -4
- package/dist/chunk-4G7552LO.js.map +0 -1
- package/dist/chunk-MNKDSGIA.js.map +0 -1
- package/dist/chunk-NBAEEHAU.js.map +0 -1
- package/dist/chunk-P7F4L2FF.js.map +0 -1
- package/dist/chunk-Q5O7GPVY.js.map +0 -1
- package/dist/chunk-QLG6VEMW.js.map +0 -1
- package/dist/chunk-U5KBV2BA.js.map +0 -1
- package/dist/hex-color-MhOyuY-o.d.ts +0 -8
- package/dist/runtime-api-BXd70c2e.d.ts +0 -490
- /package/dist/{chunk-2LDZ5C3T.js.map → chunk-FWVV2X74.js.map} +0 -0
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GENERATED_AUTHORING_METADATA
|
|
3
|
+
} from "../chunk-ZAS2SENW.js";
|
|
4
|
+
import {
|
|
5
|
+
AUTHORITATIVE_GENERATED_FILES,
|
|
6
|
+
SEED_FILES,
|
|
7
|
+
SEED_FILE_PATTERNS,
|
|
8
|
+
generateAuthoritativeFiles,
|
|
9
|
+
generateSeedFiles,
|
|
10
|
+
materializeManifestTable,
|
|
11
|
+
validateManifestAuthoring
|
|
12
|
+
} from "../chunk-CP35NPPY.js";
|
|
13
|
+
import "../chunk-PZ5AY32C.js";
|
|
14
|
+
|
|
15
|
+
// src/authoring/adapter.ts
|
|
16
|
+
import { createHash } from "crypto";
|
|
17
|
+
|
|
18
|
+
// src/authoring/manifest-conformance-cases.ts
|
|
19
|
+
function baseManifest(cardSet, overrides = {}) {
|
|
20
|
+
return {
|
|
21
|
+
players: {
|
|
22
|
+
minPlayers: 2,
|
|
23
|
+
maxPlayers: 2,
|
|
24
|
+
optimalPlayers: 2
|
|
25
|
+
},
|
|
26
|
+
cardSets: [cardSet],
|
|
27
|
+
zones: [],
|
|
28
|
+
boardTemplates: [],
|
|
29
|
+
boards: [],
|
|
30
|
+
pieceTypes: [],
|
|
31
|
+
pieceSeeds: [],
|
|
32
|
+
dieTypes: [],
|
|
33
|
+
dieSeeds: [],
|
|
34
|
+
resources: [],
|
|
35
|
+
setupOptions: [],
|
|
36
|
+
setupProfiles: [],
|
|
37
|
+
...overrides
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function manualCardSet(id, defaultHome, cards) {
|
|
41
|
+
const cardSet = {
|
|
42
|
+
id,
|
|
43
|
+
name: id,
|
|
44
|
+
type: "manual",
|
|
45
|
+
cardSchema: { properties: {} },
|
|
46
|
+
defaultHome,
|
|
47
|
+
cards
|
|
48
|
+
};
|
|
49
|
+
return cardSet;
|
|
50
|
+
}
|
|
51
|
+
var sharedZone = {
|
|
52
|
+
id: "shared-zone",
|
|
53
|
+
name: "Shared Zone",
|
|
54
|
+
scope: "shared",
|
|
55
|
+
allowedCardSetIds: ["cards"]
|
|
56
|
+
};
|
|
57
|
+
var sharedBoard = {
|
|
58
|
+
id: "square-board",
|
|
59
|
+
name: "Square Board",
|
|
60
|
+
layout: "square",
|
|
61
|
+
scope: "shared",
|
|
62
|
+
spaces: [
|
|
63
|
+
{ id: "a1", row: 0, col: 0 },
|
|
64
|
+
{ id: "a2", row: 0, col: 1 },
|
|
65
|
+
{ id: "b1", row: 1, col: 0 },
|
|
66
|
+
{ id: "b2", row: 1, col: 1 }
|
|
67
|
+
],
|
|
68
|
+
relations: [],
|
|
69
|
+
containers: [
|
|
70
|
+
{
|
|
71
|
+
id: "display-row",
|
|
72
|
+
name: "Display Row",
|
|
73
|
+
host: { type: "board" }
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
edges: [],
|
|
77
|
+
vertices: []
|
|
78
|
+
};
|
|
79
|
+
var sharedTopology = {
|
|
80
|
+
boards: [sharedBoard],
|
|
81
|
+
pieceTypes: [
|
|
82
|
+
{
|
|
83
|
+
id: "holder",
|
|
84
|
+
name: "Holder",
|
|
85
|
+
slots: [{ id: "pocket" }]
|
|
86
|
+
}
|
|
87
|
+
],
|
|
88
|
+
pieceSeeds: [{ id: "holder-a", typeId: "holder" }]
|
|
89
|
+
};
|
|
90
|
+
var fixtures = [
|
|
91
|
+
{
|
|
92
|
+
id: "manual-default-detached",
|
|
93
|
+
manifest: baseManifest(
|
|
94
|
+
manualCardSet("cards", { type: "detached" }, [
|
|
95
|
+
{ type: "marker", name: "Marker", count: 1, properties: {} }
|
|
96
|
+
])
|
|
97
|
+
),
|
|
98
|
+
expected: {
|
|
99
|
+
valid: true,
|
|
100
|
+
transportValid: true,
|
|
101
|
+
materializedSha256: "ed6f7ce2ff4fbe697e49134f1d59157cf146e202db29a77be50e8326585f535c"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: "manual-default-shared-zone",
|
|
106
|
+
manifest: baseManifest(
|
|
107
|
+
manualCardSet("cards", { type: "zone", zoneId: "shared-zone" }, [
|
|
108
|
+
{ type: "coin", name: "Coin", count: 2, properties: {} }
|
|
109
|
+
]),
|
|
110
|
+
{ zones: [sharedZone] }
|
|
111
|
+
),
|
|
112
|
+
expected: {
|
|
113
|
+
valid: true,
|
|
114
|
+
transportValid: true,
|
|
115
|
+
materializedSha256: "75028d28dbc415c81db5e2d780d55b04c4db36378a149bc02b0194d94a8cc2b9"
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: "preset-default-shared-zone",
|
|
120
|
+
manifest: baseManifest(
|
|
121
|
+
{
|
|
122
|
+
id: "cards",
|
|
123
|
+
name: "Preset Cards",
|
|
124
|
+
type: "preset",
|
|
125
|
+
presetId: "standard_52_deck",
|
|
126
|
+
defaultHome: { type: "zone", zoneId: "shared-zone" }
|
|
127
|
+
},
|
|
128
|
+
{ zones: [sharedZone] }
|
|
129
|
+
),
|
|
130
|
+
expected: {
|
|
131
|
+
valid: true,
|
|
132
|
+
transportValid: true,
|
|
133
|
+
materializedSha256: "b3471c577ed266667b16799f75aa9b7358100a94108aa46a31ad16a0291f67ca"
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
id: "manual-per-card-detached-override",
|
|
138
|
+
manifest: baseManifest(
|
|
139
|
+
manualCardSet("cards", { type: "zone", zoneId: "shared-zone" }, [
|
|
140
|
+
{
|
|
141
|
+
type: "removed",
|
|
142
|
+
name: "Removed",
|
|
143
|
+
count: 1,
|
|
144
|
+
home: { type: "detached" },
|
|
145
|
+
properties: {}
|
|
146
|
+
}
|
|
147
|
+
]),
|
|
148
|
+
{ zones: [sharedZone] }
|
|
149
|
+
),
|
|
150
|
+
expected: {
|
|
151
|
+
valid: true,
|
|
152
|
+
transportValid: true,
|
|
153
|
+
materializedSha256: "fdcb2de78fc391e11aca1f266fd8bbb348a82faa0fbbac1d8eb1defd8697a0e9"
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
id: "manual-per-card-shared-zone-override",
|
|
158
|
+
manifest: baseManifest(
|
|
159
|
+
manualCardSet("cards", { type: "detached" }, [
|
|
160
|
+
{
|
|
161
|
+
type: "dealt",
|
|
162
|
+
name: "Dealt",
|
|
163
|
+
count: 1,
|
|
164
|
+
home: { type: "zone", zoneId: "shared-zone" },
|
|
165
|
+
properties: {}
|
|
166
|
+
}
|
|
167
|
+
]),
|
|
168
|
+
{ zones: [sharedZone] }
|
|
169
|
+
),
|
|
170
|
+
expected: {
|
|
171
|
+
valid: true,
|
|
172
|
+
transportValid: true,
|
|
173
|
+
materializedSha256: "b6bee1db85f16e8a12a7136c7d524591f925427c8ec04d64b07905c5bc859d7a"
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: "manual-compatible-zones-no-inference",
|
|
178
|
+
manifest: baseManifest(
|
|
179
|
+
manualCardSet("cards", { type: "detached" }, [
|
|
180
|
+
{ type: "token", name: "Token", count: 1, properties: {} }
|
|
181
|
+
]),
|
|
182
|
+
{
|
|
183
|
+
zones: [
|
|
184
|
+
sharedZone,
|
|
185
|
+
{
|
|
186
|
+
...sharedZone,
|
|
187
|
+
id: "second-compatible-zone",
|
|
188
|
+
name: "Second Compatible Zone"
|
|
189
|
+
}
|
|
190
|
+
]
|
|
191
|
+
}
|
|
192
|
+
),
|
|
193
|
+
expected: {
|
|
194
|
+
valid: true,
|
|
195
|
+
transportValid: true,
|
|
196
|
+
materializedSha256: "2727728ba3743d2b1874b2bc573b48c88f962fdcbdcdf20c62bed551d6d955c4"
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
id: "manual-per-player-zone-rejected",
|
|
201
|
+
manifest: baseManifest(
|
|
202
|
+
manualCardSet("cards", { type: "zone", zoneId: "hand" }, [
|
|
203
|
+
{ type: "secret", name: "Secret", count: 1, properties: {} }
|
|
204
|
+
]),
|
|
205
|
+
{
|
|
206
|
+
zones: [
|
|
207
|
+
{
|
|
208
|
+
id: "hand",
|
|
209
|
+
name: "Hand",
|
|
210
|
+
scope: "perPlayer",
|
|
211
|
+
allowedCardSetIds: ["cards"]
|
|
212
|
+
}
|
|
213
|
+
]
|
|
214
|
+
}
|
|
215
|
+
),
|
|
216
|
+
expected: {
|
|
217
|
+
valid: false,
|
|
218
|
+
transportValid: true,
|
|
219
|
+
diagnosticCodes: ["CARD_HOME_PER_PLAYER_ZONE_REJECTED"]
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: "manual-space-home",
|
|
224
|
+
manifest: baseManifest(
|
|
225
|
+
manualCardSet(
|
|
226
|
+
"cards",
|
|
227
|
+
{ type: "space", boardId: "square-board", spaceId: "a1" },
|
|
228
|
+
[{ type: "space-card", name: "Space", count: 1, properties: {} }]
|
|
229
|
+
),
|
|
230
|
+
sharedTopology
|
|
231
|
+
),
|
|
232
|
+
expected: {
|
|
233
|
+
valid: true,
|
|
234
|
+
transportValid: true,
|
|
235
|
+
materializedSha256: "429abfb3276c67cdca59d3dc077fc73022a9716bccef2c43f6805ff5cce0f2c2"
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
id: "manual-container-home",
|
|
240
|
+
manifest: baseManifest(
|
|
241
|
+
manualCardSet(
|
|
242
|
+
"cards",
|
|
243
|
+
{
|
|
244
|
+
type: "container",
|
|
245
|
+
boardId: "square-board",
|
|
246
|
+
containerId: "display-row"
|
|
247
|
+
},
|
|
248
|
+
[
|
|
249
|
+
{
|
|
250
|
+
type: "container-card",
|
|
251
|
+
name: "Container",
|
|
252
|
+
count: 1,
|
|
253
|
+
properties: {}
|
|
254
|
+
}
|
|
255
|
+
]
|
|
256
|
+
),
|
|
257
|
+
sharedTopology
|
|
258
|
+
),
|
|
259
|
+
expected: {
|
|
260
|
+
valid: true,
|
|
261
|
+
transportValid: true,
|
|
262
|
+
materializedSha256: "eff372263227b316d064a519cf282a6cc1d2d8df4ac04673b7f47ac518d7a2a3"
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
id: "manual-slot-home",
|
|
267
|
+
manifest: baseManifest(
|
|
268
|
+
manualCardSet(
|
|
269
|
+
"cards",
|
|
270
|
+
{
|
|
271
|
+
type: "slot",
|
|
272
|
+
host: { kind: "piece", id: "holder-a" },
|
|
273
|
+
slotId: "pocket"
|
|
274
|
+
},
|
|
275
|
+
[{ type: "slot-card", name: "Slot", count: 1, properties: {} }]
|
|
276
|
+
),
|
|
277
|
+
sharedTopology
|
|
278
|
+
),
|
|
279
|
+
expected: {
|
|
280
|
+
valid: true,
|
|
281
|
+
transportValid: true,
|
|
282
|
+
materializedSha256: "af3111f8d861ae69b77f2f46ba3df9f2f698f3306c412efc91095544e8121ab6"
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
id: "manual-edge-home",
|
|
287
|
+
manifest: baseManifest(
|
|
288
|
+
manualCardSet(
|
|
289
|
+
"cards",
|
|
290
|
+
{
|
|
291
|
+
type: "edge",
|
|
292
|
+
boardId: "square-board",
|
|
293
|
+
ref: { spaces: ["a1", "a2"] }
|
|
294
|
+
},
|
|
295
|
+
[{ type: "edge-card", name: "Edge", count: 1, properties: {} }]
|
|
296
|
+
),
|
|
297
|
+
sharedTopology
|
|
298
|
+
),
|
|
299
|
+
expected: {
|
|
300
|
+
valid: true,
|
|
301
|
+
transportValid: true,
|
|
302
|
+
materializedSha256: "f8606ea25f52d9bf801aa4fee9f558b60d7f39bcd601d57bdfccdf1ddbf4c500"
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
id: "manual-vertex-home",
|
|
307
|
+
manifest: baseManifest(
|
|
308
|
+
manualCardSet(
|
|
309
|
+
"cards",
|
|
310
|
+
{
|
|
311
|
+
type: "vertex",
|
|
312
|
+
boardId: "square-board",
|
|
313
|
+
ref: { spaces: ["a1", "a2", "b1", "b2"] }
|
|
314
|
+
},
|
|
315
|
+
[{ type: "vertex-card", name: "Vertex", count: 1, properties: {} }]
|
|
316
|
+
),
|
|
317
|
+
sharedTopology
|
|
318
|
+
),
|
|
319
|
+
expected: {
|
|
320
|
+
valid: true,
|
|
321
|
+
transportValid: true,
|
|
322
|
+
materializedSha256: "e84a4920ea8b71052acd42accf11101380ab982e493ebe207113dd4d243034de"
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
id: "manual-invalid-target-id",
|
|
327
|
+
manifest: baseManifest(
|
|
328
|
+
manualCardSet("cards", { type: "zone", zoneId: "missing-zone" }, [
|
|
329
|
+
{ type: "lost", name: "Lost", count: 1, properties: {} }
|
|
330
|
+
])
|
|
331
|
+
),
|
|
332
|
+
expected: {
|
|
333
|
+
valid: false,
|
|
334
|
+
transportValid: true,
|
|
335
|
+
diagnosticCodes: ["AUTHORING_VALIDATION_ERROR"]
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
id: "manual-count-order",
|
|
340
|
+
manifest: baseManifest(
|
|
341
|
+
manualCardSet("cards", { type: "zone", zoneId: "shared-zone" }, [
|
|
342
|
+
{ type: "first", name: "First", count: 3, properties: {} },
|
|
343
|
+
{ type: "second", name: "Second", count: 2, properties: {} }
|
|
344
|
+
]),
|
|
345
|
+
{ zones: [sharedZone] }
|
|
346
|
+
),
|
|
347
|
+
expected: {
|
|
348
|
+
valid: true,
|
|
349
|
+
transportValid: true,
|
|
350
|
+
materializedSha256: "2e4ced71909d4c36053317311c9ceaf3bf3adba875bff3fe9596bbea47746423"
|
|
351
|
+
}
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
id: "manual-generated-scenario-base",
|
|
355
|
+
manifest: baseManifest(
|
|
356
|
+
manualCardSet("cards", { type: "zone", zoneId: "shared-zone" }, [
|
|
357
|
+
{ type: "alpha", name: "Alpha", count: 2, properties: {} },
|
|
358
|
+
{ type: "beta", name: "Beta", count: 1, properties: {} }
|
|
359
|
+
]),
|
|
360
|
+
{ zones: [sharedZone] }
|
|
361
|
+
),
|
|
362
|
+
expected: {
|
|
363
|
+
valid: true,
|
|
364
|
+
transportValid: true,
|
|
365
|
+
materializedSha256: "b1b65d708b503036a49434c64c6f4aab3bedd295681bd103b69c4b98fdd5e2bb"
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
id: "manual-default-required",
|
|
370
|
+
manifest: {
|
|
371
|
+
...baseManifest(
|
|
372
|
+
manualCardSet("cards", { type: "detached" }, [
|
|
373
|
+
{ type: "card", name: "Card", count: 1, properties: {} }
|
|
374
|
+
])
|
|
375
|
+
),
|
|
376
|
+
cardSets: [
|
|
377
|
+
{
|
|
378
|
+
id: "cards",
|
|
379
|
+
name: "Cards",
|
|
380
|
+
type: "manual",
|
|
381
|
+
cardSchema: { properties: {} },
|
|
382
|
+
cards: [{ type: "card", name: "Card", count: 1, properties: {} }]
|
|
383
|
+
}
|
|
384
|
+
]
|
|
385
|
+
},
|
|
386
|
+
expected: {
|
|
387
|
+
valid: false,
|
|
388
|
+
transportValid: false,
|
|
389
|
+
diagnosticCodes: ["MANUAL_CARD_SET_DEFAULT_HOME_REQUIRED"]
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
];
|
|
393
|
+
function deepFreeze(value) {
|
|
394
|
+
if (value && typeof value === "object" && !Object.isFrozen(value)) {
|
|
395
|
+
for (const entry of Object.values(value)) {
|
|
396
|
+
deepFreeze(entry);
|
|
397
|
+
}
|
|
398
|
+
Object.freeze(value);
|
|
399
|
+
}
|
|
400
|
+
return value;
|
|
401
|
+
}
|
|
402
|
+
function diagnosticCodesForValidationErrors(errors) {
|
|
403
|
+
return [...new Set(errors.map(diagnosticCodeForValidationError))].sort();
|
|
404
|
+
}
|
|
405
|
+
function diagnosticCodeForValidationError(error) {
|
|
406
|
+
if (error.includes(".defaultHome: Manual card sets must declare defaultHome")) {
|
|
407
|
+
return "MANUAL_CARD_SET_DEFAULT_HOME_REQUIRED";
|
|
408
|
+
}
|
|
409
|
+
if (error.includes("cannot target per-player zone")) {
|
|
410
|
+
return "CARD_HOME_PER_PLAYER_ZONE_REJECTED";
|
|
411
|
+
}
|
|
412
|
+
if (error.includes("cannot target per-player board")) {
|
|
413
|
+
return "CARD_HOME_PER_PLAYER_BOARD_REJECTED";
|
|
414
|
+
}
|
|
415
|
+
return "AUTHORING_VALIDATION_ERROR";
|
|
416
|
+
}
|
|
417
|
+
function createManifestConformanceCases() {
|
|
418
|
+
return deepFreeze(
|
|
419
|
+
fixtures
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// src/authoring/adapter.ts
|
|
424
|
+
var PLAYER_IDS = ["player-1", "player-2"];
|
|
425
|
+
function stableJson(value) {
|
|
426
|
+
if (value === void 0) {
|
|
427
|
+
return "null";
|
|
428
|
+
}
|
|
429
|
+
if (value === null || typeof value !== "object") {
|
|
430
|
+
return JSON.stringify(value);
|
|
431
|
+
}
|
|
432
|
+
if (Array.isArray(value)) {
|
|
433
|
+
return `[${value.map((item) => stableJson(item)).join(",")}]`;
|
|
434
|
+
}
|
|
435
|
+
return `{${Object.entries(value).filter(([, entry]) => entry !== void 0).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`).join(",")}}`;
|
|
436
|
+
}
|
|
437
|
+
function sha256(value) {
|
|
438
|
+
return createHash("sha256").update(value).digest("hex");
|
|
439
|
+
}
|
|
440
|
+
function assertManifest(manifest) {
|
|
441
|
+
if (!manifest || typeof manifest !== "object") {
|
|
442
|
+
throw new Error("Expected a manifest object.");
|
|
443
|
+
}
|
|
444
|
+
return manifest;
|
|
445
|
+
}
|
|
446
|
+
function normalizeArtifact(path, content, ownership) {
|
|
447
|
+
if (path.length === 0 || path.startsWith("/") || path.includes("\\") || path.split("/").some((segment) => !segment || segment === "." || segment === "..")) {
|
|
448
|
+
throw new Error(`Generated artifact path '${path}' is not normalized.`);
|
|
449
|
+
}
|
|
450
|
+
return {
|
|
451
|
+
path,
|
|
452
|
+
ownership,
|
|
453
|
+
content,
|
|
454
|
+
contentSha256: sha256(content)
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
function normalizeArtifacts(entries, ownership) {
|
|
458
|
+
return Object.entries(entries).map(([path, content]) => normalizeArtifact(path, content, ownership)).sort((left, right) => left.path.localeCompare(right.path));
|
|
459
|
+
}
|
|
460
|
+
function validateNoDuplicateArtifactPaths(artifacts) {
|
|
461
|
+
const seen = /* @__PURE__ */ new Set();
|
|
462
|
+
for (const artifact of artifacts) {
|
|
463
|
+
if (seen.has(artifact.path)) {
|
|
464
|
+
throw new Error(
|
|
465
|
+
`Generated artifact path '${artifact.path}' was emitted twice.`
|
|
466
|
+
);
|
|
467
|
+
}
|
|
468
|
+
seen.add(artifact.path);
|
|
469
|
+
if (artifact.contentSha256 !== sha256(artifact.content)) {
|
|
470
|
+
throw new Error(
|
|
471
|
+
`Generated artifact '${artifact.path}' has a stale hash.`
|
|
472
|
+
);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
function validateManifest(manifest) {
|
|
477
|
+
try {
|
|
478
|
+
const gameManifest = assertManifest(manifest);
|
|
479
|
+
const result = validateManifestAuthoring(gameManifest);
|
|
480
|
+
const errors = [...result.errors];
|
|
481
|
+
if (errors.length === 0) {
|
|
482
|
+
try {
|
|
483
|
+
materializeManifest(gameManifest);
|
|
484
|
+
} catch (error) {
|
|
485
|
+
errors.push(error instanceof Error ? error.message : String(error));
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
return {
|
|
489
|
+
valid: errors.length === 0,
|
|
490
|
+
errors,
|
|
491
|
+
warnings: result.warnings
|
|
492
|
+
};
|
|
493
|
+
} catch (error) {
|
|
494
|
+
return {
|
|
495
|
+
valid: false,
|
|
496
|
+
errors: [error instanceof Error ? error.message : String(error)],
|
|
497
|
+
warnings: []
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
function materializeManifest(manifest) {
|
|
502
|
+
return materializeManifestTable({
|
|
503
|
+
manifest: assertManifest(manifest),
|
|
504
|
+
playerIds: PLAYER_IDS,
|
|
505
|
+
shuffleItems: (values) => [...values]
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
function generateWorkspaceArtifacts(manifest) {
|
|
509
|
+
const gameManifest = assertManifest(manifest);
|
|
510
|
+
const artifacts = [
|
|
511
|
+
...normalizeArtifacts(
|
|
512
|
+
generateAuthoritativeFiles(gameManifest),
|
|
513
|
+
"authoritative"
|
|
514
|
+
),
|
|
515
|
+
...normalizeArtifacts(generateSeedFiles(gameManifest), "seed")
|
|
516
|
+
].sort((left, right) => left.path.localeCompare(right.path));
|
|
517
|
+
validateNoDuplicateArtifactPaths(artifacts);
|
|
518
|
+
return artifacts;
|
|
519
|
+
}
|
|
520
|
+
function generateTestArtifacts(input) {
|
|
521
|
+
const materialized = materializeManifest(input.manifest);
|
|
522
|
+
return [
|
|
523
|
+
normalizeArtifact(
|
|
524
|
+
"test/generated/base-state.json",
|
|
525
|
+
`${stableJson(materialized)}
|
|
526
|
+
`,
|
|
527
|
+
"derived-test"
|
|
528
|
+
)
|
|
529
|
+
];
|
|
530
|
+
}
|
|
531
|
+
var GENERATED_WORKSPACE_PATHS = [
|
|
532
|
+
...AUTHORITATIVE_GENERATED_FILES,
|
|
533
|
+
...SEED_FILES,
|
|
534
|
+
"test/generated/base-state.json"
|
|
535
|
+
];
|
|
536
|
+
var GENERATED_WORKSPACE_PATH_PATTERNS = SEED_FILE_PATTERNS;
|
|
537
|
+
var MANIFEST_CONFORMANCE_CASES = createManifestConformanceCases();
|
|
538
|
+
var projectAuthoringAdapter = {
|
|
539
|
+
protocolVersion: 1,
|
|
540
|
+
metadata: GENERATED_AUTHORING_METADATA,
|
|
541
|
+
generatedPaths: GENERATED_WORKSPACE_PATHS,
|
|
542
|
+
generatedPathPatterns: GENERATED_WORKSPACE_PATH_PATTERNS,
|
|
543
|
+
manifestConformanceCases: MANIFEST_CONFORMANCE_CASES,
|
|
544
|
+
validateManifest,
|
|
545
|
+
materializeManifest,
|
|
546
|
+
generateWorkspaceArtifacts,
|
|
547
|
+
generateTestArtifacts
|
|
548
|
+
};
|
|
549
|
+
export {
|
|
550
|
+
GENERATED_WORKSPACE_PATHS,
|
|
551
|
+
GENERATED_WORKSPACE_PATH_PATTERNS,
|
|
552
|
+
MANIFEST_CONFORMANCE_CASES,
|
|
553
|
+
diagnosticCodesForValidationErrors,
|
|
554
|
+
generateTestArtifacts,
|
|
555
|
+
generateWorkspaceArtifacts,
|
|
556
|
+
materializeManifest,
|
|
557
|
+
projectAuthoringAdapter,
|
|
558
|
+
validateManifest
|
|
559
|
+
};
|
|
560
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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":[]}
|