board-game-engine 1.0.5 → 2.0.1

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 (254) hide show
  1. package/.github/workflows/ci.yml +33 -0
  2. package/dist/board-game-engine.cjs +463 -349
  3. package/dist/board-game-engine.js +463 -349
  4. package/dist/board-game-engine.min.js +22 -22
  5. package/dist/board-game-engine.mjs +461 -348
  6. package/dist/client/client.d.ts +76 -0
  7. package/dist/client/client.d.ts.map +1 -0
  8. package/dist/game-factory/bank/bank-slot.d.ts +30 -0
  9. package/dist/game-factory/bank/bank-slot.d.ts.map +1 -0
  10. package/dist/game-factory/bank/bank.d.ts +34 -0
  11. package/dist/game-factory/bank/bank.d.ts.map +1 -0
  12. package/dist/game-factory/board.d.ts +4 -0
  13. package/dist/game-factory/board.d.ts.map +1 -0
  14. package/dist/game-factory/condition/condition-factory.d.ts +4 -0
  15. package/dist/game-factory/condition/condition-factory.d.ts.map +1 -0
  16. package/dist/game-factory/condition/condition.d.ts +13 -0
  17. package/dist/game-factory/condition/condition.d.ts.map +1 -0
  18. package/dist/game-factory/condition/contains-condition.d.ts +8 -0
  19. package/dist/game-factory/condition/contains-condition.d.ts.map +1 -0
  20. package/dist/game-factory/condition/contains-same-condition.d.ts +7 -0
  21. package/dist/game-factory/condition/contains-same-condition.d.ts.map +1 -0
  22. package/dist/game-factory/condition/evaluate-condition.d.ts +8 -0
  23. package/dist/game-factory/condition/evaluate-condition.d.ts.map +1 -0
  24. package/dist/game-factory/condition/every-condition.d.ts +12 -0
  25. package/dist/game-factory/condition/every-condition.d.ts.map +1 -0
  26. package/dist/game-factory/condition/has-line-condition.d.ts +8 -0
  27. package/dist/game-factory/condition/has-line-condition.d.ts.map +1 -0
  28. package/dist/game-factory/condition/in-line-condition.d.ts +8 -0
  29. package/dist/game-factory/condition/in-line-condition.d.ts.map +1 -0
  30. package/dist/game-factory/condition/is-condition.d.ts +8 -0
  31. package/dist/game-factory/condition/is-condition.d.ts.map +1 -0
  32. package/dist/game-factory/condition/is-full-condition.d.ts +7 -0
  33. package/dist/game-factory/condition/is-full-condition.d.ts.map +1 -0
  34. package/dist/game-factory/condition/no-possible-moves-condition.d.ts +7 -0
  35. package/dist/game-factory/condition/no-possible-moves-condition.d.ts.map +1 -0
  36. package/dist/game-factory/condition/not-condition.d.ts +7 -0
  37. package/dist/game-factory/condition/not-condition.d.ts.map +1 -0
  38. package/dist/game-factory/condition/or-condition.d.ts +7 -0
  39. package/dist/game-factory/condition/or-condition.d.ts.map +1 -0
  40. package/dist/game-factory/condition/position-condition.d.ts +7 -0
  41. package/dist/game-factory/condition/position-condition.d.ts.map +1 -0
  42. package/dist/game-factory/condition/some-condition.d.ts +8 -0
  43. package/dist/game-factory/condition/some-condition.d.ts.map +1 -0
  44. package/dist/game-factory/condition/would-condition.d.ts +8 -0
  45. package/dist/game-factory/condition/would-condition.d.ts.map +1 -0
  46. package/dist/game-factory/entity.d.ts +13 -0
  47. package/dist/game-factory/entity.d.ts.map +1 -0
  48. package/dist/game-factory/expand-game-rules.d.ts +3 -0
  49. package/dist/game-factory/expand-game-rules.d.ts.map +1 -0
  50. package/dist/game-factory/game-factory.d.ts +10 -0
  51. package/dist/game-factory/game-factory.d.ts.map +1 -0
  52. package/{src/game-factory/move/end-turn.js → dist/game-factory/move/end-turn.d.ts} +2 -4
  53. package/dist/game-factory/move/end-turn.d.ts.map +1 -0
  54. package/dist/game-factory/move/for-each.d.ts +5 -0
  55. package/dist/game-factory/move/for-each.d.ts.map +1 -0
  56. package/dist/game-factory/move/index.d.ts +6 -0
  57. package/dist/game-factory/move/index.d.ts.map +1 -0
  58. package/dist/game-factory/move/move-entity.d.ts +7 -0
  59. package/dist/game-factory/move/move-entity.d.ts.map +1 -0
  60. package/dist/game-factory/move/move-factory.d.ts +18 -0
  61. package/dist/game-factory/move/move-factory.d.ts.map +1 -0
  62. package/dist/game-factory/move/move.d.ts +54 -0
  63. package/dist/game-factory/move/move.d.ts.map +1 -0
  64. package/dist/game-factory/move/pass-turn.d.ts +5 -0
  65. package/dist/game-factory/move/pass-turn.d.ts.map +1 -0
  66. package/{src/game-factory/move/pass.js → dist/game-factory/move/pass.d.ts} +2 -4
  67. package/dist/game-factory/move/pass.d.ts.map +1 -0
  68. package/dist/game-factory/move/place-new.d.ts +5 -0
  69. package/dist/game-factory/move/place-new.d.ts.map +1 -0
  70. package/dist/game-factory/move/remove-entity.d.ts +5 -0
  71. package/dist/game-factory/move/remove-entity.d.ts.map +1 -0
  72. package/dist/game-factory/move/set-active-players.d.ts +5 -0
  73. package/dist/game-factory/move/set-active-players.d.ts.map +1 -0
  74. package/dist/game-factory/move/set-state.d.ts +5 -0
  75. package/dist/game-factory/move/set-state.d.ts.map +1 -0
  76. package/dist/game-factory/move/shuffle.d.ts +5 -0
  77. package/dist/game-factory/move/shuffle.d.ts.map +1 -0
  78. package/dist/game-factory/move/take-from.d.ts +11 -0
  79. package/dist/game-factory/move/take-from.d.ts.map +1 -0
  80. package/dist/game-factory/space/space.d.ts +10 -0
  81. package/dist/game-factory/space/space.d.ts.map +1 -0
  82. package/dist/game-factory/space-group/grid.d.ts +15 -0
  83. package/dist/game-factory/space-group/grid.d.ts.map +1 -0
  84. package/dist/game-factory/space-group/space-group.d.ts +20 -0
  85. package/dist/game-factory/space-group/space-group.d.ts.map +1 -0
  86. package/dist/index.d.ts +6 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/registry.d.ts +17 -0
  89. package/dist/registry.d.ts.map +1 -0
  90. package/dist/types/bagel-types.d.ts +339 -0
  91. package/dist/types/bagel-types.d.ts.map +1 -0
  92. package/dist/types/index.d.ts +3 -0
  93. package/dist/types/index.d.ts.map +1 -0
  94. package/dist/types/rule-with-conditions.d.ts +9 -0
  95. package/dist/types/rule-with-conditions.d.ts.map +1 -0
  96. package/dist/utils/any-valid-moves.d.ts +2 -0
  97. package/dist/utils/any-valid-moves.d.ts.map +1 -0
  98. package/dist/utils/bgio-resolve-types.d.ts +25 -0
  99. package/dist/utils/bgio-resolve-types.d.ts.map +1 -0
  100. package/dist/utils/check-conditions.d.ts +7 -0
  101. package/dist/utils/check-conditions.d.ts.map +1 -0
  102. package/dist/utils/create-payload.d.ts +5 -0
  103. package/dist/utils/create-payload.d.ts.map +1 -0
  104. package/dist/utils/deserialize-bgio-arguments.d.ts +3 -0
  105. package/dist/utils/deserialize-bgio-arguments.d.ts.map +1 -0
  106. package/dist/utils/do-moves.d.ts +8 -0
  107. package/dist/utils/do-moves.d.ts.map +1 -0
  108. package/dist/utils/entity-matches.d.ts +6 -0
  109. package/dist/utils/entity-matches.d.ts.map +1 -0
  110. package/dist/utils/find-met-condition.d.ts +6 -0
  111. package/dist/utils/find-met-condition.d.ts.map +1 -0
  112. package/dist/utils/get-current-moves.d.ts +24 -0
  113. package/dist/utils/get-current-moves.d.ts.map +1 -0
  114. package/dist/utils/get-scenario-results.d.ts +3 -0
  115. package/dist/utils/get-scenario-results.d.ts.map +1 -0
  116. package/dist/utils/get-steps.d.ts +13 -0
  117. package/dist/utils/get-steps.d.ts.map +1 -0
  118. package/dist/utils/get.d.ts +7 -0
  119. package/dist/utils/get.d.ts.map +1 -0
  120. package/dist/utils/grid-contains-sequence.d.ts +27 -0
  121. package/dist/utils/grid-contains-sequence.d.ts.map +1 -0
  122. package/dist/utils/json-transformer.d.ts +8 -0
  123. package/dist/utils/json-transformer.d.ts.map +1 -0
  124. package/dist/utils/prepare-payload.d.ts +2 -0
  125. package/dist/utils/prepare-payload.d.ts.map +1 -0
  126. package/dist/utils/resolve-entity.d.ts +3 -0
  127. package/dist/utils/resolve-entity.d.ts.map +1 -0
  128. package/dist/utils/resolve-expression.d.ts +6 -0
  129. package/dist/utils/resolve-expression.d.ts.map +1 -0
  130. package/dist/utils/resolve-properties.d.ts +4 -0
  131. package/dist/utils/resolve-properties.d.ts.map +1 -0
  132. package/dist/utils/simulate-move.d.ts +16 -0
  133. package/dist/utils/simulate-move.d.ts.map +1 -0
  134. package/examples/checkers.json +2 -2
  135. package/examples/connect-four.json +1 -1
  136. package/examples/eights.json +15 -15
  137. package/package.json +9 -3
  138. package/playwright-report/index.html +1 -1
  139. package/scripts/build.mjs +2 -2
  140. package/src/client/client.ts +306 -0
  141. package/src/game-factory/bank/bank-slot.ts +81 -0
  142. package/src/game-factory/bank/bank.ts +125 -0
  143. package/src/game-factory/{board.js → board.ts} +1 -1
  144. package/src/game-factory/condition/condition-factory.ts +59 -0
  145. package/src/game-factory/condition/condition.ts +50 -0
  146. package/src/game-factory/condition/{contains-condition.js → contains-condition.ts} +5 -4
  147. package/src/game-factory/condition/{contains-same-condition.js → contains-same-condition.ts} +8 -5
  148. package/src/game-factory/condition/{evaluate-condition.js → evaluate-condition.ts} +4 -3
  149. package/src/game-factory/condition/every-condition.ts +27 -0
  150. package/src/game-factory/condition/has-line-condition.ts +15 -0
  151. package/src/game-factory/condition/in-line-condition.ts +25 -0
  152. package/src/game-factory/condition/is-condition.ts +24 -0
  153. package/src/game-factory/condition/is-full-condition.ts +10 -0
  154. package/src/game-factory/condition/{no-possible-moves-condition.js → no-possible-moves-condition.ts} +3 -2
  155. package/src/game-factory/condition/{not-condition.js → not-condition.ts} +3 -2
  156. package/src/game-factory/condition/{or-condition.js → or-condition.ts} +3 -2
  157. package/src/game-factory/condition/position-condition.ts +13 -0
  158. package/src/game-factory/condition/{some-condition.js → some-condition.ts} +5 -3
  159. package/src/game-factory/condition/would-condition.ts +104 -0
  160. package/src/game-factory/entity.ts +37 -0
  161. package/src/game-factory/expand-game-rules.ts +263 -0
  162. package/src/game-factory/game-factory.ts +263 -0
  163. package/src/game-factory/move/end-turn.ts +7 -0
  164. package/src/game-factory/move/for-each.ts +20 -0
  165. package/src/game-factory/move/move-entity.ts +18 -0
  166. package/src/game-factory/move/move-factory.ts +107 -0
  167. package/src/game-factory/move/move.ts +147 -0
  168. package/src/game-factory/move/pass-turn.ts +15 -0
  169. package/src/game-factory/move/pass.ts +7 -0
  170. package/src/game-factory/move/place-new.ts +42 -0
  171. package/src/game-factory/move/remove-entity.ts +11 -0
  172. package/src/game-factory/move/set-active-players.ts +26 -0
  173. package/src/game-factory/move/set-state.ts +14 -0
  174. package/src/game-factory/move/shuffle.ts +9 -0
  175. package/src/game-factory/move/take-from.ts +12 -0
  176. package/src/game-factory/space/space.ts +36 -0
  177. package/src/game-factory/space-group/grid.ts +48 -0
  178. package/src/game-factory/space-group/space-group.ts +44 -0
  179. package/src/index.ts +5 -0
  180. package/src/types/bagel-types.ts +449 -0
  181. package/src/types/boardgame-io-core.d.ts +7 -0
  182. package/src/types/index.ts +70 -0
  183. package/src/types/rule-with-conditions.ts +9 -0
  184. package/src/utils/{any-valid-moves.js → any-valid-moves.ts} +54 -49
  185. package/src/utils/bgio-resolve-types.ts +27 -0
  186. package/src/utils/check-conditions.ts +28 -0
  187. package/src/utils/create-payload.ts +19 -0
  188. package/src/utils/deserialize-bgio-arguments.ts +10 -0
  189. package/src/utils/do-moves.ts +22 -0
  190. package/src/utils/entity-matches.ts +30 -0
  191. package/src/utils/expr-eval.d.ts +6 -0
  192. package/src/utils/find-met-condition.ts +23 -0
  193. package/src/utils/get-current-moves.ts +39 -0
  194. package/src/utils/get-scenario-results.ts +30 -0
  195. package/src/utils/get-steps.ts +38 -0
  196. package/src/utils/get.ts +28 -0
  197. package/src/utils/{grid-contains-sequence.js → grid-contains-sequence.ts} +71 -33
  198. package/src/utils/json-transformer.ts +17 -0
  199. package/src/utils/prepare-payload.ts +20 -0
  200. package/src/utils/resolve-entity.ts +15 -0
  201. package/src/utils/resolve-expression.ts +16 -0
  202. package/src/utils/resolve-properties.ts +172 -0
  203. package/src/utils/simulate-move.ts +32 -0
  204. package/src/wackson.d.ts +4 -0
  205. package/tsconfig.build.json +14 -0
  206. package/tsconfig.json +21 -0
  207. package/src/client/client.js +0 -224
  208. package/src/game-factory/bank/bank-slot.js +0 -69
  209. package/src/game-factory/bank/bank.js +0 -114
  210. package/src/game-factory/condition/condition-factory.js +0 -52
  211. package/src/game-factory/condition/condition.js +0 -39
  212. package/src/game-factory/condition/every-condition.js +0 -25
  213. package/src/game-factory/condition/has-line-condition.js +0 -14
  214. package/src/game-factory/condition/in-line-condition.js +0 -19
  215. package/src/game-factory/condition/is-condition.js +0 -23
  216. package/src/game-factory/condition/is-full-condition.js +0 -9
  217. package/src/game-factory/condition/position-condition.js +0 -12
  218. package/src/game-factory/condition/would-condition.js +0 -94
  219. package/src/game-factory/entity.js +0 -29
  220. package/src/game-factory/expand-game-rules.js +0 -271
  221. package/src/game-factory/game-factory.js +0 -239
  222. package/src/game-factory/move/for-each.js +0 -18
  223. package/src/game-factory/move/move-entity.js +0 -16
  224. package/src/game-factory/move/move-factory.js +0 -89
  225. package/src/game-factory/move/move.js +0 -131
  226. package/src/game-factory/move/pass-turn.js +0 -10
  227. package/src/game-factory/move/place-new.js +0 -33
  228. package/src/game-factory/move/remove-entity.js +0 -7
  229. package/src/game-factory/move/set-active-players.js +0 -23
  230. package/src/game-factory/move/set-state.js +0 -11
  231. package/src/game-factory/move/shuffle.js +0 -7
  232. package/src/game-factory/move/take-from.js +0 -7
  233. package/src/game-factory/space/space.js +0 -30
  234. package/src/game-factory/space-group/grid.js +0 -43
  235. package/src/game-factory/space-group/space-group.js +0 -29
  236. package/src/index.js +0 -2
  237. package/src/utils/check-conditions.js +0 -28
  238. package/src/utils/create-payload.js +0 -16
  239. package/src/utils/deserialize-bgio-arguments.js +0 -8
  240. package/src/utils/do-moves.js +0 -18
  241. package/src/utils/entity-matches.js +0 -20
  242. package/src/utils/find-met-condition.js +0 -22
  243. package/src/utils/get-current-moves.js +0 -12
  244. package/src/utils/get-scenario-results.js +0 -23
  245. package/src/utils/get-steps.js +0 -29
  246. package/src/utils/get.js +0 -25
  247. package/src/utils/json-transformer.js +0 -12
  248. package/src/utils/prepare-payload.js +0 -16
  249. package/src/utils/resolve-entity.js +0 -9
  250. package/src/utils/resolve-expression.js +0 -10
  251. package/src/utils/resolve-properties.js +0 -149
  252. package/src/utils/simulate-move.js +0 -25
  253. /package/src/game-factory/move/{index.js → index.ts} +0 -0
  254. /package/src/{registry.js → registry.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-met-condition.d.ts","sourceRoot":"","sources":["../../src/utils/find-met-condition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE1E,MAAM,CAAC,OAAO,UAAU,gBAAgB,CACtC,aAAa,EAAE,OAAO,EACtB,UAAU,EAAE,aAAa,EAAE,YAAK,EAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;mBAEF,OAAO;cAatC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Minimal shape of the boardgame.io client (or stand-in) used to resolve the active move set.
3
+ */
4
+ export interface GetCurrentMovesClient {
5
+ game: {
6
+ phases?: Record<string, unknown>;
7
+ moves?: Record<string, unknown>;
8
+ turn?: {
9
+ stages?: Record<string, unknown>;
10
+ };
11
+ };
12
+ playerID?: string;
13
+ stageName?: string;
14
+ }
15
+ /** `state` shape expected by {@link getCurrentMoves} (boardgame.io match state). */
16
+ export interface GetCurrentMovesState {
17
+ ctx: {
18
+ phase?: string;
19
+ activePlayers?: Record<string, string>;
20
+ currentPlayer?: string;
21
+ };
22
+ }
23
+ export default function getCurrentMoves(state: GetCurrentMovesState, client: GetCurrentMovesClient): Record<string, unknown>;
24
+ //# sourceMappingURL=get-current-moves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-current-moves.d.ts","sourceRoot":"","sources":["../../src/utils/get-current-moves.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE;QACJ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CAAC;KAC7C,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,oFAAoF;AACpF,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAID,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,qBAAqB,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB"}
@@ -0,0 +1,3 @@
1
+ import type { BgioResolveState } from "./bgio-resolve-types.js";
2
+ export default function getScenarioResults(bgioArguments: BgioResolveState, scenarios: unknown[]): unknown;
3
+ //# sourceMappingURL=get-scenario-results.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-scenario-results.d.ts","sourceRoot":"","sources":["../../src/utils/get-scenario-results.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,CAAC,OAAO,UAAU,kBAAkB,CACxC,aAAa,EAAE,gBAAgB,EAC/B,SAAS,EAAE,OAAO,EAAE,WAuBrB"}
@@ -0,0 +1,13 @@
1
+ import { type BgioResolveState } from "./bgio-resolve-types.js";
2
+ export default function getSteps(bgioState: BgioResolveState, moveRule: {
3
+ moveType: string;
4
+ arguments: Record<string, {
5
+ playerChoice?: boolean;
6
+ possibleValues?: unknown[];
7
+ [k: string]: unknown;
8
+ }>;
9
+ }): {
10
+ argName: string;
11
+ getClickable: (context: Record<string, unknown>) => unknown[];
12
+ }[];
13
+ //# sourceMappingURL=get-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-steps.d.ts","sourceRoot":"","sources":["../../src/utils/get-steps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAYxE,MAAM,CAAC,OAAO,UAAU,QAAQ,CAC9B,SAAS,EAAE,gBAAgB,EAC3B,QAAQ,EAAE;IACR,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;CACzG;;4BAciB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAM1C"}
@@ -0,0 +1,7 @@
1
+ type PathStep = string | number | {
2
+ flatten: boolean;
3
+ map?: (string | number)[];
4
+ };
5
+ export default function get(obj: unknown, pathArray: PathStep[]): unknown;
6
+ export {};
7
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/utils/get.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;CAAE,CAAC;AAElF,MAAM,CAAC,OAAO,UAAU,GAAG,CAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAyBzE"}
@@ -0,0 +1,27 @@
1
+ import type { Condition } from "../types/bagel-types.js";
2
+ export type SequenceChunk = {
3
+ count?: number;
4
+ minCount?: number;
5
+ maxCount?: number;
6
+ conditions?: Condition[];
7
+ };
8
+ type GridEntity = {
9
+ entities?: unknown[];
10
+ [k: string]: unknown;
11
+ };
12
+ type GridSpace = {
13
+ entities?: GridEntity[];
14
+ [k: string]: unknown;
15
+ };
16
+ export type GridLike = {
17
+ attributes: {
18
+ width: number;
19
+ height: number;
20
+ };
21
+ entities?: GridSpace[];
22
+ areCoordinatesValid: (c: number[]) => boolean;
23
+ getSpace: (c: number[]) => unknown;
24
+ };
25
+ export default function gridContainsSequence(bgioArguments: unknown, grid: GridLike, sequencePattern: SequenceChunk[], context: Record<string, unknown>): unknown;
26
+ export {};
27
+ //# sourceMappingURL=grid-contains-sequence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid-contains-sequence.d.ts","sourceRoot":"","sources":["../../src/utils/grid-contains-sequence.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;CAC1B,CAAC;AAEF,KAAK,UAAU,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AACjE,KAAK,SAAS,GAAG;IAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AACnE,MAAM,MAAM,QAAQ,GAAG;IACrB,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IACvB,mBAAmB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;IAC9C,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;CACpC,CAAC;AAwLF,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAC1C,aAAa,EAAE,OAAO,EACtB,IAAI,EAAE,QAAQ,EACd,eAAe,EAAE,aAAa,EAAE,EAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAwDjC"}
@@ -0,0 +1,8 @@
1
+ type TransformRule = {
2
+ test: (val: unknown) => boolean;
3
+ replace: (val: unknown) => unknown;
4
+ };
5
+ /** Recurse and replace. Circular references not allowed. */
6
+ export default function transformJSON(data: unknown, rules: TransformRule[]): unknown;
7
+ export {};
8
+ //# sourceMappingURL=json-transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-transformer.d.ts","sourceRoot":"","sources":["../../src/utils/json-transformer.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IAChC,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;CACpC,CAAC;AAEF,4DAA4D;AAC5D,MAAM,CAAC,OAAO,UAAU,aAAa,CAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAUrF"}
@@ -0,0 +1,2 @@
1
+ export default function preparePayload(payload: unknown): unknown;
2
+ //# sourceMappingURL=prepare-payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-payload.d.ts","sourceRoot":"","sources":["../../src/utils/prepare-payload.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,UAAU,cAAc,CAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAgBjE"}
@@ -0,0 +1,3 @@
1
+ import { type BgioResolveState } from "./bgio-resolve-types.js";
2
+ export default function resolveEntity(bgioArguments: BgioResolveState, target: unknown, context: unknown, targetName: string | undefined): unknown;
3
+ //# sourceMappingURL=resolve-entity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-entity.d.ts","sourceRoot":"","sources":["../../src/utils/resolve-entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIxE,MAAM,CAAC,OAAO,UAAU,aAAa,CACnC,aAAa,EAAE,gBAAgB,EAC/B,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAIT"}
@@ -0,0 +1,6 @@
1
+ import type { BgioResolveState } from "./bgio-resolve-types.js";
2
+ export default function resolveExpression(bgioArguments: BgioResolveState, rule: {
3
+ expression: string;
4
+ arguments?: unknown;
5
+ }, context: Record<string, unknown>): unknown;
6
+ //# sourceMappingURL=resolve-expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-expression.d.ts","sourceRoot":"","sources":["../../src/utils/resolve-expression.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE,MAAM,CAAC,OAAO,UAAU,iBAAiB,CACvC,aAAa,EAAE,gBAAgB,EAC/B,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,EACjD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAGT"}
@@ -0,0 +1,4 @@
1
+ import { type BgioResolveState } from "./bgio-resolve-types.js";
2
+ export type { BgioResolveState };
3
+ export default function resolveProperties(bgioArguments: BgioResolveState, obj: unknown, context?: Record<string, unknown>, key?: string): unknown;
4
+ //# sourceMappingURL=resolve-properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-properties.d.ts","sourceRoot":"","sources":["../../src/utils/resolve-properties.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAExE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AASjC,MAAM,CAAC,OAAO,UAAU,iBAAiB,CACvC,aAAa,EAAE,gBAAgB,EAC/B,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACrC,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CA6BT"}
@@ -0,0 +1,16 @@
1
+ import type { BgioResolveState } from "./bgio-resolve-types.js";
2
+ export default function simulateMove(bgioArguments: BgioResolveState, payload: {
3
+ arguments: Record<string, {
4
+ abstract?: boolean;
5
+ entityId?: unknown;
6
+ } | number>;
7
+ }, context: {
8
+ moveInstance: {
9
+ doMove: (...args: unknown[]) => unknown;
10
+ };
11
+ }): {
12
+ bank: {
13
+ locate: (id: unknown) => unknown;
14
+ };
15
+ };
16
+ //# sourceMappingURL=simulate-move.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate-move.d.ts","sourceRoot":"","sources":["../../src/utils/simulate-move.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,CAAC,OAAO,UAAU,YAAY,CAClC,aAAa,EAAE,gBAAgB,EAC/B,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,CAAC,CAAA;CAAE,EAC3F,OAAO,EAAE;IAAE,YAAY,EAAE;QAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;KAAE,CAAA;CAAE;UAG9D;QAAE,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAA;KAAE;EAqB7C"}
@@ -719,7 +719,7 @@
719
719
  "expression": "(player == '0' and destinationCoordinates[1] == 0) or (player == '1' and destinationCoordinates[1] == 7)",
720
720
  "arguments": {
721
721
  "player": {
722
- "type": "RelativePath",
722
+ "type": "relativePath",
723
723
  "target": {
724
724
  "type": "contextPath",
725
725
  "path": ["originalTarget"]
@@ -727,7 +727,7 @@
727
727
  "path": ["entities", 0, "rule", "player"]
728
728
  },
729
729
  "destinationCoordinates": {
730
- "type": "Coordinates",
730
+ "type": "coordinates",
731
731
  "target": {
732
732
  "type": "contextPath",
733
733
  "path": ["target"]
@@ -107,7 +107,7 @@
107
107
  "conditions": [
108
108
  {
109
109
  "conditionType": "Is",
110
- "target": { "type": "Parent" },
110
+ "target": { "type": "parent" },
111
111
  "matcher": { "name": "mainGrid" }
112
112
  }
113
113
  ]
@@ -161,7 +161,7 @@
161
161
  "conditions": [
162
162
  {
163
163
  "conditionType": "Is",
164
- "target": { "type": "Parent" },
164
+ "target": { "type": "parent" },
165
165
  "matcher": { "name": "stock" }
166
166
  },
167
167
  {
@@ -195,7 +195,7 @@
195
195
  "conditions": [
196
196
  {
197
197
  "conditionType": "Is",
198
- "target": { "type": "Parent" },
198
+ "target": { "type": "parent" },
199
199
  "matcher": { "name": "stock" }
200
200
  },
201
201
  {
@@ -231,7 +231,7 @@
231
231
  "conditions": [
232
232
  {
233
233
  "conditionType": "Is",
234
- "target": { "type": "Parent" },
234
+ "target": { "type": "parent" },
235
235
  "matcher": { "name": "discard" }
236
236
  },
237
237
  {
@@ -298,7 +298,7 @@
298
298
  "conditions": [
299
299
  {
300
300
  "conditionType": "Is",
301
- "target": { "type": "Parent" },
301
+ "target": { "type": "parent" },
302
302
  "matcher": {
303
303
  "name": "hand",
304
304
  "player": {
@@ -319,13 +319,13 @@
319
319
  {
320
320
  "conditionType": "Is",
321
321
  "matcher": {
322
- "type": "Pick",
322
+ "type": "pick",
323
323
  "properties": ["suit"],
324
324
  "target": {
325
325
  "conditions": [
326
326
  {
327
327
  "conditionType": "Is",
328
- "target": { "type": "Parent" },
328
+ "target": { "type": "parent" },
329
329
  "matcher": { "name": "discard" }
330
330
  },
331
331
  {
@@ -339,13 +339,13 @@
339
339
  {
340
340
  "conditionType": "Is",
341
341
  "matcher": {
342
- "type": "Pick",
342
+ "type": "pick",
343
343
  "properties": ["value"],
344
344
  "target": {
345
345
  "conditions": [
346
346
  {
347
347
  "conditionType": "Is",
348
- "target": { "type": "Parent" },
348
+ "target": { "type": "parent" },
349
349
  "matcher": { "name": "discard" }
350
350
  },
351
351
  {
@@ -452,7 +452,7 @@
452
452
  "conditions": [
453
453
  {
454
454
  "conditionType": "Is",
455
- "target": { "type": "Parent" },
455
+ "target": { "type": "parent" },
456
456
  "matcher": { "name": "discard" }
457
457
  },
458
458
  {
@@ -512,7 +512,7 @@
512
512
  "matcher": {
513
513
  "name": "score",
514
514
  "player": {
515
- "type": "RelativePath",
515
+ "type": "relativePath",
516
516
  "target": {
517
517
  "conditions": [
518
518
  {
@@ -538,7 +538,7 @@
538
538
  "expression": "existingScore + sum(faceValues)",
539
539
  "arguments": {
540
540
  "existingScore": {
541
- "type": "RelativePath",
541
+ "type": "relativePath",
542
542
  "target": {
543
543
  "conditions": [
544
544
  {
@@ -546,7 +546,7 @@
546
546
  "matcher": {
547
547
  "name": "score",
548
548
  "player": {
549
- "type": "RelativePath",
549
+ "type": "relativePath",
550
550
  "target": {
551
551
  "conditions": [
552
552
  {
@@ -574,7 +574,7 @@
574
574
  "conditions": [
575
575
  {
576
576
  "conditionType": "Is",
577
- "target": { "type": "Parent" },
577
+ "target": { "type": "parent" },
578
578
  "matcher": {
579
579
  "name": "hand",
580
580
  "player": {
@@ -590,7 +590,7 @@
590
590
  "expression": "cardValue == 8 ? 50 : (cardValue >= 10 and cardValue <= 13) ? 10 : cardValue",
591
591
  "arguments": {
592
592
  "cardValue": {
593
- "conditionType": "RelativePath",
593
+ "type": "relativePath",
594
594
  "target": {
595
595
 
596
596
  "type": "contextPath",
@@ -627,7 +627,7 @@
627
627
  "expression": "score >= numPlayers * 50",
628
628
  "arguments": {
629
629
  "score": {
630
- "type": "RelativePath",
630
+ "type": "relativePath",
631
631
  "target": {
632
632
  "type": "contextPath",
633
633
  "path": ["loopTarget"]
package/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "board-game-engine",
3
- "version": "1.0.5",
3
+ "version": "2.0.1",
4
4
  "description": "wip board game engine",
5
5
  "main": "dist/board-game-engine.cjs",
6
6
  "module": "dist/board-game-engine.mjs",
7
+ "types": "dist/index.d.ts",
7
8
  "exports": {
8
9
  ".": {
10
+ "types": "./dist/index.d.ts",
9
11
  "import": "./dist/board-game-engine.mjs",
10
12
  "require": "./dist/board-game-engine.cjs"
11
13
  }
@@ -19,12 +21,16 @@
19
21
  "test:e2e:install": "playwright install firefox",
20
22
  "serve": "http-server . -p 5174 -c-1",
21
23
  "lint": "eslint .",
22
- "build": "node scripts/build.mjs",
24
+ "build": "node scripts/build.mjs && npm run build:types",
25
+ "build:types": "tsc -p tsconfig.build.json",
26
+ "typecheck": "tsc --noEmit",
23
27
  "prepublishOnly": "npm run build"
24
28
  },
25
29
  "author": "Matthew Broatch",
26
30
  "license": "ISC",
27
31
  "devDependencies": {
32
+ "@playwright/test": "^1.49.0",
33
+ "@types/lodash": "^4.17.24",
28
34
  "cross-env": "^7.0.3",
29
35
  "esbuild": "^0.24.0",
30
36
  "esbuild-plugin-istanbul": "^0.3.0",
@@ -34,7 +40,7 @@
34
40
  "http-server": "^14.1.1",
35
41
  "nyc": "^15.1.0",
36
42
  "standard": "^16.0.4",
37
- "@playwright/test": "^1.49.0"
43
+ "typescript": "^5.9.3"
38
44
  },
39
45
  "dependencies": {
40
46
  "@mnbroatch/boardgame.io": "0.0.1",
@@ -82,4 +82,4 @@ Error generating stack: `+a.message+`
82
82
  <div id='root'></div>
83
83
  </body>
84
84
  </html>
85
- <script id="playwrightReportBase64" type="application/zip">data:application/zip;base64,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</script>
85
+ <script id="playwrightReportBase64" type="application/zip">data:application/zip;base64,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</script>
package/scripts/build.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as esbuild from 'esbuild'
2
2
  import { esbuildPluginIstanbul } from 'esbuild-plugin-istanbul'
3
3
 
4
- const entry = 'src/index.js'
4
+ const entry = 'src/index.ts'
5
5
  const outdir = 'dist'
6
6
  const globalName = 'BoardGameEngine'
7
7
  const coverage = process.env.COVERAGE === '1'
@@ -24,7 +24,7 @@ if (coverage) {
24
24
  esbuildPluginIstanbul({
25
25
  name: 'istanbul',
26
26
  filter: /\.(js|ts)$/,
27
- include: ['src/**/*.js'],
27
+ include: ['src/**/*.{js,ts}'],
28
28
  exclude: ['**/*.spec.js', '**/node_modules/**'],
29
29
  }),
30
30
  ],