create-mud 2.2.16 → 2.2.17-0812178a8a873aa728358040d1d494385f78566f

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 (295) hide show
  1. package/README.md +2 -4
  2. package/bin/cli.js +4 -0
  3. package/dist/cli.d.ts +2 -1
  4. package/dist/cli.js +9 -2
  5. package/dist/cli.js.map +1 -1
  6. package/package.json +17 -11
  7. package/templates/react/mprocs.yaml +21 -0
  8. package/{dist/templates/threejs → templates/react}/packages/client/index.html +2 -2
  9. package/{dist/templates → templates}/react/packages/client/package.json +17 -9
  10. package/templates/react/packages/client/postcss.config.cjs +6 -0
  11. package/templates/react/packages/client/src/App.tsx +46 -0
  12. package/templates/react/packages/client/src/Providers.tsx +35 -0
  13. package/templates/react/packages/client/src/common.ts +26 -0
  14. package/templates/react/packages/client/src/game/GameMap.tsx +102 -0
  15. package/templates/react/packages/client/src/game/useKeyboardMovement.ts +26 -0
  16. package/templates/react/packages/client/src/index.tsx +19 -0
  17. package/templates/react/packages/client/src/mud/Explorer.tsx +32 -0
  18. package/templates/react/packages/client/src/mud/Synced.tsx +14 -0
  19. package/templates/react/packages/client/src/mud/stash.ts +4 -0
  20. package/templates/react/packages/client/src/mud/useSyncStatus.ts +21 -0
  21. package/templates/react/packages/client/src/mud/useWorldContract.ts +44 -0
  22. package/templates/react/packages/client/src/ui/AsyncButton.tsx +41 -0
  23. package/templates/react/packages/client/src/ui/ErrorFallback.tsx +58 -0
  24. package/templates/react/packages/client/src/ui/icons/ArrowDownIcon.tsx +22 -0
  25. package/templates/react/packages/client/src/ui/icons/MUDIcon.tsx +25 -0
  26. package/templates/react/packages/client/src/wagmiConfig.ts +49 -0
  27. package/templates/react/packages/client/tailwind.config.ts +10 -0
  28. package/templates/react/packages/client/tsconfig.json +11 -0
  29. package/{dist/templates/threejs → templates/react}/packages/client/vite.config.ts +2 -7
  30. package/templates/react/packages/contracts/mud.config.ts +21 -0
  31. package/templates/react/packages/contracts/out/IWorld.sol/IWorld.abi.json +2021 -0
  32. package/{dist/templates/vanilla → templates/react}/packages/contracts/package.json +1 -0
  33. package/{dist/templates → templates}/react/packages/contracts/script/PostDeploy.s.sol +1 -9
  34. package/templates/react/packages/contracts/src/MoveSystem.sol +26 -0
  35. package/{dist/templates/react/packages/contracts/src/codegen/index.sol → templates/react/packages/contracts/src/codegen/common.sol} +6 -1
  36. package/templates/react/packages/contracts/src/codegen/tables/Position.sol +318 -0
  37. package/templates/react/packages/contracts/src/codegen/world/IMoveSystem.sol +15 -0
  38. package/templates/react/packages/contracts/test/MoveTest.t.sol +27 -0
  39. package/templates/react/packages/contracts/test/WorldTest.t.sol +21 -0
  40. package/templates/react/packages/contracts/worlds.json +5 -0
  41. package/templates/threejs/packages/contracts/src/codegen/index.sol +6 -0
  42. package/{dist/templates/react → templates/threejs}/packages/contracts/src/codegen/world/IWorld.sol +2 -2
  43. package/dist/templates/phaser/gitignore +0 -7
  44. package/dist/templates/phaser/packages/art/gitignore +0 -0
  45. package/dist/templates/phaser/packages/client/gitignore +0 -3
  46. package/dist/templates/phaser/packages/contracts/gitignore +0 -9
  47. package/dist/templates/react/gitignore +0 -7
  48. package/dist/templates/react/packages/client/gitignore +0 -3
  49. package/dist/templates/react/packages/client/src/App.tsx +0 -105
  50. package/dist/templates/react/packages/client/src/index.tsx +0 -34
  51. package/dist/templates/react/packages/client/src/mud/createSystemCalls.ts +0 -56
  52. package/dist/templates/react/packages/client/src/mud/getNetworkConfig.ts +0 -76
  53. package/dist/templates/react/packages/client/src/mud/setup.ts +0 -18
  54. package/dist/templates/react/packages/client/src/mud/setupNetwork.ts +0 -101
  55. package/dist/templates/react/packages/contracts/gitignore +0 -9
  56. package/dist/templates/react/packages/contracts/mud.config.ts +0 -16
  57. package/dist/templates/react/packages/contracts/src/codegen/tables/Tasks.sol +0 -522
  58. package/dist/templates/react/packages/contracts/src/codegen/world/ITasksSystem.sol +0 -19
  59. package/dist/templates/react/packages/contracts/src/systems/TasksSystem.sol +0 -24
  60. package/dist/templates/react/packages/contracts/test/TasksTest.t.sol +0 -30
  61. package/dist/templates/react-ecs/gitignore +0 -7
  62. package/dist/templates/react-ecs/packages/client/gitignore +0 -3
  63. package/dist/templates/react-ecs/packages/contracts/gitignore +0 -9
  64. package/dist/templates/threejs/gitignore +0 -7
  65. package/dist/templates/threejs/packages/client/gitignore +0 -3
  66. package/dist/templates/threejs/packages/client/src/MUDContext.tsx +0 -21
  67. package/dist/templates/threejs/packages/contracts/gitignore +0 -9
  68. package/dist/templates/vanilla/gitignore +0 -7
  69. package/dist/templates/vanilla/mprocs.yaml +0 -13
  70. package/dist/templates/vanilla/packages/client/gitignore +0 -3
  71. package/dist/templates/vanilla/packages/client/src/mud/supportedChains.ts +0 -20
  72. package/dist/templates/vanilla/packages/client/tsconfig.json +0 -11
  73. package/dist/templates/vanilla/packages/contracts/gitignore +0 -9
  74. package/dist/templates/vanilla/packages/contracts/worlds.json +0 -5
  75. /package/{dist/templates → templates}/phaser/.eslintrc +0 -0
  76. /package/{dist/templates → templates}/phaser/.gitattributes +0 -0
  77. /package/{dist/templates → templates}/phaser/.vscode/extensions.json +0 -0
  78. /package/{dist/templates → templates}/phaser/.vscode/settings.json +0 -0
  79. /package/{dist/templates → templates}/phaser/mprocs.yaml +0 -0
  80. /package/{dist/templates → templates}/phaser/package.json +0 -0
  81. /package/{dist/templates → templates}/phaser/packages/art/README.md +0 -0
  82. /package/{dist/templates → templates}/phaser/packages/art/config-sprites.json +0 -0
  83. /package/{dist/templates → templates}/phaser/packages/art/package.json +0 -0
  84. /package/{dist/templates → templates}/phaser/packages/art/scripts/cli.mjs +0 -0
  85. /package/{dist/templates → templates}/phaser/packages/art/scripts/export-tiled-types.ts +0 -0
  86. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/attack/0.png +0 -0
  87. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/attack/1.png +0 -0
  88. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/attack/2.png +0 -0
  89. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/attack/3.png +0 -0
  90. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/attack/4.png +0 -0
  91. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/attack/5.png +0 -0
  92. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/death/0.png +0 -0
  93. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/death/1.png +0 -0
  94. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/death/2.png +0 -0
  95. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/idle/0.png +0 -0
  96. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/idle/1.png +0 -0
  97. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/idle/2.png +0 -0
  98. /package/{dist/templates → templates}/phaser/packages/art/sprites/golem/idle/3.png +0 -0
  99. /package/{dist/templates → templates}/phaser/packages/art/tilesets/images/world.png +0 -0
  100. /package/{dist/templates → templates}/phaser/packages/art/tilesets/world.tsx +0 -0
  101. /package/{dist/templates → templates}/phaser/packages/client/.env +0 -0
  102. /package/{dist/templates → templates}/phaser/packages/client/.eslintrc +0 -0
  103. /package/{dist/templates → templates}/phaser/packages/client/index.html +0 -0
  104. /package/{dist/templates → templates}/phaser/packages/client/package.json +0 -0
  105. /package/{dist/templates → templates}/phaser/packages/client/public/assets/atlases/atlas.json +0 -0
  106. /package/{dist/templates → templates}/phaser/packages/client/public/assets/atlases/atlas.png +0 -0
  107. /package/{dist/templates → templates}/phaser/packages/client/public/assets/tilesets/world.png +0 -0
  108. /package/{dist/templates → templates}/phaser/packages/client/src/artTypes/world.ts +0 -0
  109. /package/{dist/templates → templates}/phaser/packages/client/src/index.tsx +0 -0
  110. /package/{dist/templates → templates}/phaser/packages/client/src/layers/network/createNetworkLayer.ts +0 -0
  111. /package/{dist/templates → templates}/phaser/packages/client/src/layers/phaser/configurePhaser.ts +0 -0
  112. /package/{dist/templates → templates}/phaser/packages/client/src/layers/phaser/constants.ts +0 -0
  113. /package/{dist/templates → templates}/phaser/packages/client/src/layers/phaser/createPhaserLayer.ts +0 -0
  114. /package/{dist/templates → templates}/phaser/packages/client/src/layers/phaser/systems/createCamera.ts +0 -0
  115. /package/{dist/templates → templates}/phaser/packages/client/src/layers/phaser/systems/createMapSystem.ts +0 -0
  116. /package/{dist/templates → templates}/phaser/packages/client/src/layers/phaser/systems/index.ts +0 -0
  117. /package/{dist/templates → templates}/phaser/packages/client/src/layers/phaser/systems/registerSystems.ts +0 -0
  118. /package/{dist/templates → templates}/phaser/packages/client/src/mud/createClientComponents.ts +0 -0
  119. /package/{dist/templates → templates}/phaser/packages/client/src/mud/createSystemCalls.ts +0 -0
  120. /package/{dist/templates → templates}/phaser/packages/client/src/mud/getNetworkConfig.ts +0 -0
  121. /package/{dist/templates → templates}/phaser/packages/client/src/mud/setup.ts +0 -0
  122. /package/{dist/templates → templates}/phaser/packages/client/src/mud/setupNetwork.ts +0 -0
  123. /package/{dist/templates → templates}/phaser/packages/client/src/mud/supportedChains.ts +0 -0
  124. /package/{dist/templates → templates}/phaser/packages/client/src/mud/world.ts +0 -0
  125. /package/{dist/templates → templates}/phaser/packages/client/src/store.ts +0 -0
  126. /package/{dist/templates → templates}/phaser/packages/client/src/ui/App.tsx +0 -0
  127. /package/{dist/templates → templates}/phaser/packages/client/src/ui/LoadingScreen/BootScreen.tsx +0 -0
  128. /package/{dist/templates → templates}/phaser/packages/client/src/ui/LoadingScreen/LoadingBar.tsx +0 -0
  129. /package/{dist/templates → templates}/phaser/packages/client/src/ui/LoadingScreen/LoadingScreen.tsx +0 -0
  130. /package/{dist/templates → templates}/phaser/packages/client/src/ui/LoadingScreen/index.ts +0 -0
  131. /package/{dist/templates → templates}/phaser/packages/client/src/ui/PhaserLayer.tsx +0 -0
  132. /package/{dist/templates → templates}/phaser/packages/client/src/ui/UIRoot.tsx +0 -0
  133. /package/{dist/templates → templates}/phaser/packages/client/src/ui/Wrapper.tsx +0 -0
  134. /package/{dist/templates → templates}/phaser/packages/client/src/ui/hooks/useNetworkLayer.tsx +0 -0
  135. /package/{dist/templates → templates}/phaser/packages/client/src/ui/hooks/usePhaserLayer.tsx +0 -0
  136. /package/{dist/templates → templates}/phaser/packages/client/src/ui/hooks/usePromiseValue.ts +0 -0
  137. /package/{dist/templates → templates}/phaser/packages/client/src/ui/theme/ClickWrapper.tsx +0 -0
  138. /package/{dist/templates → templates}/phaser/packages/client/src/ui/theme/SpriteImage.tsx +0 -0
  139. /package/{dist/templates → templates}/phaser/packages/client/tsconfig.json +0 -0
  140. /package/{dist/templates → templates}/phaser/packages/client/vite.config.ts +0 -0
  141. /package/{dist/templates → templates}/phaser/packages/contracts/.env +0 -0
  142. /package/{dist/templates → templates}/phaser/packages/contracts/.prettierrc +0 -0
  143. /package/{dist/templates → templates}/phaser/packages/contracts/.solhint.json +0 -0
  144. /package/{dist/templates → templates}/phaser/packages/contracts/foundry.toml +0 -0
  145. /package/{dist/templates → templates}/phaser/packages/contracts/mud.config.ts +0 -0
  146. /package/{dist/templates → templates}/phaser/packages/contracts/package.json +0 -0
  147. /package/{dist/templates → templates}/phaser/packages/contracts/remappings.txt +0 -0
  148. /package/{dist/templates → templates}/phaser/packages/contracts/script/PostDeploy.s.sol +0 -0
  149. /package/{dist/templates → templates}/phaser/packages/contracts/src/codegen/index.sol +0 -0
  150. /package/{dist/templates → templates}/phaser/packages/contracts/src/codegen/tables/Counter.sol +0 -0
  151. /package/{dist/templates → templates}/phaser/packages/contracts/src/codegen/world/IIncrementSystem.sol +0 -0
  152. /package/{dist/templates → templates}/phaser/packages/contracts/src/codegen/world/IWorld.sol +0 -0
  153. /package/{dist/templates → templates}/phaser/packages/contracts/src/systems/IncrementSystem.sol +0 -0
  154. /package/{dist/templates → templates}/phaser/packages/contracts/test/CounterTest.t.sol +0 -0
  155. /package/{dist/templates → templates}/phaser/packages/contracts/tsconfig.json +0 -0
  156. /package/{dist/templates → templates}/phaser/packages/contracts/worlds.json +0 -0
  157. /package/{dist/templates → templates}/phaser/packages/contracts/worlds.json.d.ts +0 -0
  158. /package/{dist/templates → templates}/phaser/pnpm-workspace.yaml +0 -0
  159. /package/{dist/templates → templates}/phaser/tsconfig.json +0 -0
  160. /package/{dist/templates → templates}/react/.eslintrc +0 -0
  161. /package/{dist/templates → templates}/react/.gitattributes +0 -0
  162. /package/{dist/templates → templates}/react/.vscode/extensions.json +0 -0
  163. /package/{dist/templates → templates}/react/.vscode/settings.json +0 -0
  164. /package/{dist/templates → templates}/react/package.json +0 -0
  165. /package/{dist/templates → templates}/react/packages/client/.env +0 -0
  166. /package/{dist/templates → templates}/react/packages/client/.eslintrc +0 -0
  167. /package/{dist/templates → templates}/react/packages/contracts/.env +0 -0
  168. /package/{dist/templates → templates}/react/packages/contracts/.prettierrc +0 -0
  169. /package/{dist/templates → templates}/react/packages/contracts/.solhint.json +0 -0
  170. /package/{dist/templates → templates}/react/packages/contracts/foundry.toml +0 -0
  171. /package/{dist/templates → templates}/react/packages/contracts/remappings.txt +0 -0
  172. /package/{dist/templates/threejs → templates/react}/packages/contracts/src/codegen/index.sol +0 -0
  173. /package/{dist/templates/threejs → templates/react}/packages/contracts/src/codegen/world/IWorld.sol +0 -0
  174. /package/{dist/templates → templates}/react/packages/contracts/tsconfig.json +0 -0
  175. /package/{dist/templates → templates}/react/packages/contracts/worlds.json.d.ts +0 -0
  176. /package/{dist/templates → templates}/react/pnpm-workspace.yaml +0 -0
  177. /package/{dist/templates → templates}/react/tsconfig.json +0 -0
  178. /package/{dist/templates → templates}/react-ecs/.eslintrc +0 -0
  179. /package/{dist/templates → templates}/react-ecs/.gitattributes +0 -0
  180. /package/{dist/templates → templates}/react-ecs/.vscode/extensions.json +0 -0
  181. /package/{dist/templates → templates}/react-ecs/.vscode/settings.json +0 -0
  182. /package/{dist/templates → templates}/react-ecs/mprocs.yaml +0 -0
  183. /package/{dist/templates → templates}/react-ecs/package.json +0 -0
  184. /package/{dist/templates → templates}/react-ecs/packages/client/.env +0 -0
  185. /package/{dist/templates → templates}/react-ecs/packages/client/.eslintrc +0 -0
  186. /package/{dist/templates → templates}/react-ecs/packages/client/index.html +0 -0
  187. /package/{dist/templates → templates}/react-ecs/packages/client/package.json +0 -0
  188. /package/{dist/templates → templates}/react-ecs/packages/client/src/App.tsx +0 -0
  189. /package/{dist/templates → templates}/react-ecs/packages/client/src/MUDContext.tsx +0 -0
  190. /package/{dist/templates → templates}/react-ecs/packages/client/src/index.tsx +0 -0
  191. /package/{dist/templates → templates}/react-ecs/packages/client/src/mud/createClientComponents.ts +0 -0
  192. /package/{dist/templates → templates}/react-ecs/packages/client/src/mud/createSystemCalls.ts +0 -0
  193. /package/{dist/templates → templates}/react-ecs/packages/client/src/mud/getNetworkConfig.ts +0 -0
  194. /package/{dist/templates → templates}/react-ecs/packages/client/src/mud/setup.ts +0 -0
  195. /package/{dist/templates → templates}/react-ecs/packages/client/src/mud/setupNetwork.ts +0 -0
  196. /package/{dist/templates → templates}/react-ecs/packages/client/src/mud/supportedChains.ts +0 -0
  197. /package/{dist/templates → templates}/react-ecs/packages/client/src/mud/world.ts +0 -0
  198. /package/{dist/templates → templates}/react-ecs/packages/client/tsconfig.json +0 -0
  199. /package/{dist/templates → templates}/react-ecs/packages/client/vite.config.ts +0 -0
  200. /package/{dist/templates → templates}/react-ecs/packages/contracts/.env +0 -0
  201. /package/{dist/templates → templates}/react-ecs/packages/contracts/.prettierrc +0 -0
  202. /package/{dist/templates → templates}/react-ecs/packages/contracts/.solhint.json +0 -0
  203. /package/{dist/templates → templates}/react-ecs/packages/contracts/foundry.toml +0 -0
  204. /package/{dist/templates → templates}/react-ecs/packages/contracts/mud.config.ts +0 -0
  205. /package/{dist/templates → templates}/react-ecs/packages/contracts/package.json +0 -0
  206. /package/{dist/templates → templates}/react-ecs/packages/contracts/remappings.txt +0 -0
  207. /package/{dist/templates → templates}/react-ecs/packages/contracts/script/PostDeploy.s.sol +0 -0
  208. /package/{dist/templates → templates}/react-ecs/packages/contracts/src/codegen/index.sol +0 -0
  209. /package/{dist/templates → templates}/react-ecs/packages/contracts/src/codegen/tables/Counter.sol +0 -0
  210. /package/{dist/templates → templates}/react-ecs/packages/contracts/src/codegen/world/IIncrementSystem.sol +0 -0
  211. /package/{dist/templates → templates}/react-ecs/packages/contracts/src/codegen/world/IWorld.sol +0 -0
  212. /package/{dist/templates → templates}/react-ecs/packages/contracts/src/systems/IncrementSystem.sol +0 -0
  213. /package/{dist/templates → templates}/react-ecs/packages/contracts/test/CounterTest.t.sol +0 -0
  214. /package/{dist/templates → templates}/react-ecs/packages/contracts/tsconfig.json +0 -0
  215. /package/{dist/templates → templates}/react-ecs/packages/contracts/worlds.json +0 -0
  216. /package/{dist/templates → templates}/react-ecs/packages/contracts/worlds.json.d.ts +0 -0
  217. /package/{dist/templates → templates}/react-ecs/pnpm-workspace.yaml +0 -0
  218. /package/{dist/templates → templates}/react-ecs/tsconfig.json +0 -0
  219. /package/{dist/templates → templates}/threejs/.eslintrc +0 -0
  220. /package/{dist/templates → templates}/threejs/.gitattributes +0 -0
  221. /package/{dist/templates → templates}/threejs/.vscode/extensions.json +0 -0
  222. /package/{dist/templates → templates}/threejs/.vscode/settings.json +0 -0
  223. /package/{dist/templates/react → templates/threejs}/mprocs.yaml +0 -0
  224. /package/{dist/templates → templates}/threejs/package.json +0 -0
  225. /package/{dist/templates → templates}/threejs/packages/client/.env +0 -0
  226. /package/{dist/templates → templates}/threejs/packages/client/.eslintrc +0 -0
  227. /package/{dist/templates/react → templates/threejs}/packages/client/index.html +0 -0
  228. /package/{dist/templates → templates}/threejs/packages/client/package.json +0 -0
  229. /package/{dist/templates → templates}/threejs/packages/client/src/App.tsx +0 -0
  230. /package/{dist/templates/react → templates/threejs}/packages/client/src/MUDContext.tsx +0 -0
  231. /package/{dist/templates → templates}/threejs/packages/client/src/index.tsx +0 -0
  232. /package/{dist/templates → templates}/threejs/packages/client/src/mud/createClientComponents.ts +0 -0
  233. /package/{dist/templates → templates}/threejs/packages/client/src/mud/createSystemCalls.ts +0 -0
  234. /package/{dist/templates → templates}/threejs/packages/client/src/mud/getNetworkConfig.ts +0 -0
  235. /package/{dist/templates → templates}/threejs/packages/client/src/mud/setup.ts +0 -0
  236. /package/{dist/templates → templates}/threejs/packages/client/src/mud/setupNetwork.ts +0 -0
  237. /package/{dist/templates/react → templates/threejs}/packages/client/src/mud/supportedChains.ts +0 -0
  238. /package/{dist/templates → templates}/threejs/packages/client/src/mud/world.ts +0 -0
  239. /package/{dist/templates → templates}/threejs/packages/client/src/useKeyboardMovement.ts +0 -0
  240. /package/{dist/templates/react → templates/threejs}/packages/client/tsconfig.json +0 -0
  241. /package/{dist/templates/react → templates/threejs}/packages/client/vite.config.ts +0 -0
  242. /package/{dist/templates → templates}/threejs/packages/contracts/.env +0 -0
  243. /package/{dist/templates → templates}/threejs/packages/contracts/.prettierrc +0 -0
  244. /package/{dist/templates → templates}/threejs/packages/contracts/.solhint.json +0 -0
  245. /package/{dist/templates → templates}/threejs/packages/contracts/foundry.toml +0 -0
  246. /package/{dist/templates → templates}/threejs/packages/contracts/mud.config.ts +0 -0
  247. /package/{dist/templates → templates}/threejs/packages/contracts/package.json +0 -0
  248. /package/{dist/templates → templates}/threejs/packages/contracts/remappings.txt +0 -0
  249. /package/{dist/templates → templates}/threejs/packages/contracts/src/codegen/tables/Position.sol +0 -0
  250. /package/{dist/templates → templates}/threejs/packages/contracts/src/codegen/world/IMoveSystem.sol +0 -0
  251. /package/{dist/templates → templates}/threejs/packages/contracts/src/systems/MoveSystem.sol +0 -0
  252. /package/{dist/templates → templates}/threejs/packages/contracts/test/WorldTest.t.sol +0 -0
  253. /package/{dist/templates → templates}/threejs/packages/contracts/tsconfig.json +0 -0
  254. /package/{dist/templates/react → templates/threejs}/packages/contracts/worlds.json +0 -0
  255. /package/{dist/templates → templates}/threejs/packages/contracts/worlds.json.d.ts +0 -0
  256. /package/{dist/templates → templates}/threejs/pnpm-workspace.yaml +0 -0
  257. /package/{dist/templates → templates}/threejs/tsconfig.json +0 -0
  258. /package/{dist/templates → templates}/vanilla/.eslintrc +0 -0
  259. /package/{dist/templates → templates}/vanilla/.gitattributes +0 -0
  260. /package/{dist/templates → templates}/vanilla/.vscode/extensions.json +0 -0
  261. /package/{dist/templates → templates}/vanilla/.vscode/settings.json +0 -0
  262. /package/{dist/templates/threejs → templates/vanilla}/mprocs.yaml +0 -0
  263. /package/{dist/templates → templates}/vanilla/package.json +0 -0
  264. /package/{dist/templates → templates}/vanilla/packages/client/.env +0 -0
  265. /package/{dist/templates → templates}/vanilla/packages/client/index.html +0 -0
  266. /package/{dist/templates → templates}/vanilla/packages/client/package.json +0 -0
  267. /package/{dist/templates → templates}/vanilla/packages/client/src/index.ts +0 -0
  268. /package/{dist/templates → templates}/vanilla/packages/client/src/mud/createClientComponents.ts +0 -0
  269. /package/{dist/templates → templates}/vanilla/packages/client/src/mud/createSystemCalls.ts +0 -0
  270. /package/{dist/templates → templates}/vanilla/packages/client/src/mud/getNetworkConfig.ts +0 -0
  271. /package/{dist/templates → templates}/vanilla/packages/client/src/mud/setup.ts +0 -0
  272. /package/{dist/templates → templates}/vanilla/packages/client/src/mud/setupNetwork.ts +0 -0
  273. /package/{dist/templates/threejs → templates/vanilla}/packages/client/src/mud/supportedChains.ts +0 -0
  274. /package/{dist/templates → templates}/vanilla/packages/client/src/mud/world.ts +0 -0
  275. /package/{dist/templates/threejs → templates/vanilla}/packages/client/tsconfig.json +0 -0
  276. /package/{dist/templates → templates}/vanilla/packages/client/vite.config.ts +0 -0
  277. /package/{dist/templates → templates}/vanilla/packages/contracts/.env +0 -0
  278. /package/{dist/templates → templates}/vanilla/packages/contracts/.prettierrc +0 -0
  279. /package/{dist/templates → templates}/vanilla/packages/contracts/.solhint.json +0 -0
  280. /package/{dist/templates → templates}/vanilla/packages/contracts/foundry.toml +0 -0
  281. /package/{dist/templates → templates}/vanilla/packages/contracts/mud.config.ts +0 -0
  282. /package/{dist/templates/react → templates/vanilla}/packages/contracts/package.json +0 -0
  283. /package/{dist/templates → templates}/vanilla/packages/contracts/remappings.txt +0 -0
  284. /package/{dist/templates → templates}/vanilla/packages/contracts/script/PostDeploy.s.sol +0 -0
  285. /package/{dist/templates → templates}/vanilla/packages/contracts/src/codegen/index.sol +0 -0
  286. /package/{dist/templates → templates}/vanilla/packages/contracts/src/codegen/tables/Counter.sol +0 -0
  287. /package/{dist/templates → templates}/vanilla/packages/contracts/src/codegen/world/IIncrementSystem.sol +0 -0
  288. /package/{dist/templates → templates}/vanilla/packages/contracts/src/codegen/world/IWorld.sol +0 -0
  289. /package/{dist/templates → templates}/vanilla/packages/contracts/src/systems/IncrementSystem.sol +0 -0
  290. /package/{dist/templates → templates}/vanilla/packages/contracts/test/CounterTest.t.sol +0 -0
  291. /package/{dist/templates → templates}/vanilla/packages/contracts/tsconfig.json +0 -0
  292. /package/{dist/templates/threejs → templates/vanilla}/packages/contracts/worlds.json +0 -0
  293. /package/{dist/templates → templates}/vanilla/packages/contracts/worlds.json.d.ts +0 -0
  294. /package/{dist/templates → templates}/vanilla/pnpm-workspace.yaml +0 -0
  295. /package/{dist/templates → templates}/vanilla/tsconfig.json +0 -0
package/README.md CHANGED
@@ -2,10 +2,8 @@
2
2
 
3
3
  Create a new MUD project
4
4
 
5
- > created by [create-create-app](https://github.com/uetchy/create-create-app).
6
-
7
5
  ## Usage
8
6
 
9
- ```bash
10
- npm create mud <name>
7
+ ```
8
+ pnpm create mud@latest
11
9
  ```
package/bin/cli.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ // workaround for https://github.com/pnpm/pnpm/issues/1801
4
+ import "../dist/cli.js";
package/dist/cli.d.ts CHANGED
@@ -1 +1,2 @@
1
- #!/usr/bin/env node
1
+
2
+ export { }
package/dist/cli.js CHANGED
@@ -1,3 +1,10 @@
1
- #!/usr/bin/env node
2
- "use strict";var l=Object.create;var a=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var d=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty;var h=(e,t,s,p)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of m(t))!u.call(e,r)&&r!==s&&a(e,r,{get:()=>t[r],enumerable:!(p=o(t,r))||p.enumerable});return e};var j=(e,t,s)=>(s=e!=null?l(d(e)):{},h(t||!e||!e.__esModule?a(s,"default",{value:e,enumerable:!0}):s,e));var i=require("create-create-app"),n=j(require("path"));var c={name:"create-mud",version:"2.2.16",description:"Create a new MUD project",license:"MIT",author:"Lattice <mud@lattice.xyz>",bin:"dist/cli.js",files:["dist"],scripts:{build:"pnpm run build:js","build:js":"tsup && tsx ./scripts/copy-templates.ts",clean:"pnpm run clean:js","clean:js":"shx rm -rf dist",dev:"tsup --watch",prepublishOnly:"npm run clean && npm run build",test:"pnpm run test:vanilla && pnpm run test:react && pnpm run test:react-ecs && pnpm run test:phaser && pnpm run test:threejs","test:ci":"pnpm run test","test:phaser":"dist/cli.js test-project --template phaser && shx rm -rf test-project","test:react":"dist/cli.js test-project --template react && shx rm -rf test-project","test:react-ecs":"dist/cli.js test-project --template react-ecs && shx rm -rf test-project","test:threejs":"dist/cli.js test-project --template threejs && shx rm -rf test-project","test:vanilla":"dist/cli.js test-project --template vanilla && shx rm -rf test-project"},dependencies:{"create-create-app":"git+https://github.com/holic/create-create-app#74376c59b48a04aabbe94d9cacfe9cb1cecccd63"},devDependencies:{execa:"^7.0.0"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"}};var b=n.default.resolve(__dirname,"..","dist","templates");(0,i.create)("create-mud",{templateRoot:b,defaultTemplate:"vanilla",defaultPackageManager:"pnpm",promptForDescription:!1,promptForAuthor:!1,promptForEmail:!1,promptForLicense:!1,promptForTemplate:!0,caveat:({answers:e,packageManager:t})=>`Done! Play in the MUD with \`cd ${e.name}\` and \`${t} run dev\``,extra:{"mud-version":{type:"input",describe:"The version of MUD packages to use, defaults to latest",default:c.version}}});
1
+ import r from"node:fs/promises";import t from"node:path";import{fileURLToPath as j}from"node:url";import h from"yargs-interactive";import y from"fast-glob";var c={name:"create-mud",version:"2.2.17-0812178a8a873aa728358040d1d494385f78566f",description:"Create a new MUD project",license:"MIT",author:"Lattice <mud@lattice.xyz>",type:"module",bin:"bin/cli.js",files:["bin","dist","templates"],scripts:{build:"pnpm run build:js","build:js":"tsup && pnpm run copy-templates",clean:"pnpm run clean:js","clean:js":"shx rm -rf dist","copy-templates":"tsx ./scripts/copy-templates.ts",dev:"tsup --watch",prepublishOnly:"npm run clean && npm run build",test:"pnpm run copy-templates && pnpm vitest --run && pnpm run test:vanilla && pnpm run test:react && pnpm run test:react-ecs && pnpm run test:phaser && pnpm run test:threejs","test:ci":"pnpm run test","test:phaser":"bin/cli.js --name test-project --template phaser && pnpm --dir test-project install && shx rm -rf test-project","test:react":"bin/cli.js --name test-project --template react && pnpm --dir test-project install && shx rm -rf test-project","test:react-ecs":"bin/cli.js --name test-project --template react-ecs && pnpm --dir test-project install && shx rm -rf test-project","test:threejs":"bin/cli.js --name test-project --template threejs && pnpm --dir test-project install && shx rm -rf test-project","test:vanilla":"bin/cli.js --name test-project --template vanilla && pnpm --dir test-project install && shx rm -rf test-project"},dependencies:{"fast-glob":"^3.3.3","yargs-interactive":"^3.0.1"},devDependencies:{"@types/yargs-interactive":"^2.1.6",execa:"^7.0.0"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"}};var o=["react","react-ecs","phaser","threejs","vanilla"];import f from"node:fs/promises";async function m(e){try{return await f.access(e),!0}catch{return!1}}var v=j(import.meta.url),b=t.dirname(v);async function w(){h().usage("$0 [args]").interactive({interactive:{default:!0},name:{describe:"Name your project",type:"input"},template:{describe:"Pick a template",type:"list",choices:o},"mud-version":{type:"input",describe:"The version of MUD packages to use, defaults to latest",default:c.version}}).then(async e=>{if(!e.name)throw new Error("No project name provided.");let s=t.join(process.cwd(),e.name);if(await m(s))throw new Error(`Target directory "${s}" already exists.`);let a=t.join(b,"..","templates",e.template),l=await y("**/*",{cwd:a,dot:!0});for(let p of l){let i=t.join(a,p),n=t.join(s,p);if(await r.mkdir(t.dirname(n),{recursive:!0}),/package\.json$/.test(i)){let u=await r.readFile(i,"utf-8");await r.writeFile(n,u.replaceAll(/{{mud-version}}/g,e.mudVersion),"utf-8")}else await r.copyFile(i,n)}console.log(`
2
+ New project created! Run it with:
3
+
4
+ cd ${e.name}
5
+ pnpm install
6
+ pnpm dev
7
+
8
+ Have fun! For more info, check the docs at https://mud.dev/
9
+ `)})}w();
3
10
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../package.json"],"sourcesContent":["#!/usr/bin/env node\nimport { create } from \"create-create-app\";\nimport path from \"node:path\";\nimport packageJson from \"../package.json\";\n\nconst templateRoot = path.resolve(__dirname, \"..\", \"dist\", \"templates\");\n\n// See https://github.com/uetchy/create-create-app/blob/master/README.md for other options.\ncreate(\"create-mud\", {\n templateRoot,\n defaultTemplate: \"vanilla\",\n // templates use pnpm workspaces, so default to that for now\n // not sure if it's worth trying to support multiple kinds of package managers for monorepos, given the tooling is so different\n defaultPackageManager: \"pnpm\",\n promptForDescription: false,\n promptForAuthor: false,\n promptForEmail: false,\n promptForLicense: false,\n promptForTemplate: true,\n caveat: ({ answers, packageManager }) =>\n `Done! Play in the MUD with \\`cd ${answers.name}\\` and \\`${packageManager} run dev\\``,\n extra: {\n \"mud-version\": {\n type: \"input\",\n describe: \"The version of MUD packages to use, defaults to latest\",\n default: packageJson.version,\n },\n },\n});\n","{\n \"name\": \"create-mud\",\n \"version\": \"2.2.16\",\n \"description\": \"Create a new MUD project\",\n \"license\": \"MIT\",\n \"author\": \"Lattice <mud@lattice.xyz>\",\n \"bin\": \"dist/cli.js\",\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"pnpm run build:js\",\n \"build:js\": \"tsup && tsx ./scripts/copy-templates.ts\",\n \"clean\": \"pnpm run clean:js\",\n \"clean:js\": \"shx rm -rf dist\",\n \"dev\": \"tsup --watch\",\n \"prepublishOnly\": \"npm run clean && npm run build\",\n \"test\": \"pnpm run test:vanilla && pnpm run test:react && pnpm run test:react-ecs && pnpm run test:phaser && pnpm run test:threejs\",\n \"test:ci\": \"pnpm run test\",\n \"test:phaser\": \"dist/cli.js test-project --template phaser && shx rm -rf test-project\",\n \"test:react\": \"dist/cli.js test-project --template react && shx rm -rf test-project\",\n \"test:react-ecs\": \"dist/cli.js test-project --template react-ecs && shx rm -rf test-project\",\n \"test:threejs\": \"dist/cli.js test-project --template threejs && shx rm -rf test-project\",\n \"test:vanilla\": \"dist/cli.js test-project --template vanilla && shx rm -rf test-project\"\n },\n \"dependencies\": {\n \"create-create-app\": \"git+https://github.com/holic/create-create-app#74376c59b48a04aabbe94d9cacfe9cb1cecccd63\"\n },\n \"devDependencies\": {\n \"execa\": \"^7.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n}\n"],"mappings":";wdACA,IAAAA,EAAuB,6BACvBC,EAAiB,mBCFjB,IAAAC,EAAA,CACE,KAAQ,aACR,QAAW,SACX,YAAe,2BACf,QAAW,MACX,OAAU,4BACV,IAAO,cACP,MAAS,CACP,MACF,EACA,QAAW,CACT,MAAS,oBACT,WAAY,0CACZ,MAAS,oBACT,WAAY,kBACZ,IAAO,eACP,eAAkB,iCAClB,KAAQ,2HACR,UAAW,gBACX,cAAe,wEACf,aAAc,uEACd,iBAAkB,2EAClB,eAAgB,yEAChB,eAAgB,wEAClB,EACA,aAAgB,CACd,oBAAqB,yFACvB,EACA,gBAAmB,CACjB,MAAS,QACX,EACA,cAAiB,CACf,OAAU,SACV,SAAY,4BACd,CACF,ED9BA,IAAMC,EAAe,EAAAC,QAAK,QAAQ,UAAW,KAAM,OAAQ,WAAW,KAGtE,UAAO,aAAc,CACnB,aAAAD,EACA,gBAAiB,UAGjB,sBAAuB,OACvB,qBAAsB,GACtB,gBAAiB,GACjB,eAAgB,GAChB,iBAAkB,GAClB,kBAAmB,GACnB,OAAQ,CAAC,CAAE,QAAAE,EAAS,eAAAC,CAAe,IACjC,mCAAmCD,EAAQ,IAAI,YAAYC,CAAc,aAC3E,MAAO,CACL,cAAe,CACb,KAAM,QACN,SAAU,yDACV,QAASC,EAAY,OACvB,CACF,CACF,CAAC","names":["import_create_create_app","import_node_path","package_default","templateRoot","path","answers","packageManager","package_default"]}
1
+ {"version":3,"sources":["../src/bin/cli.ts","../package.json","../src/common.ts","../src/exists.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport yargsInteractive from \"yargs-interactive\";\nimport glob from \"fast-glob\";\nimport packageJson from \"../../package.json\";\nimport { templates } from \"../common\";\nimport { exists } from \"../exists\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nasync function run() {\n yargsInteractive()\n .usage(\"$0 [args]\")\n .interactive({\n interactive: { default: true },\n name: {\n describe: \"Name your project\",\n type: \"input\",\n },\n template: {\n describe: \"Pick a template\",\n type: \"list\",\n choices: templates,\n },\n \"mud-version\": {\n type: \"input\",\n describe: \"The version of MUD packages to use, defaults to latest\",\n default: packageJson.version,\n },\n })\n .then(async (args) => {\n if (!args.name) throw new Error(\"No project name provided.\");\n\n const destDir = path.join(process.cwd(), args.name);\n if (await exists(destDir)) {\n throw new Error(`Target directory \"${destDir}\" already exists.`);\n }\n\n const sourceDir = path.join(__dirname, \"..\", \"templates\", args.template);\n const files = await glob(\"**/*\", { cwd: sourceDir, dot: true });\n\n for (const filename of files) {\n const sourceFile = path.join(sourceDir, filename);\n const destFile = path.join(destDir, filename);\n\n await fs.mkdir(path.dirname(destFile), { recursive: true });\n\n if (/package\\.json$/.test(sourceFile)) {\n const source = await fs.readFile(sourceFile, \"utf-8\");\n await fs.writeFile(destFile, source.replaceAll(/{{mud-version}}/g, args.mudVersion), \"utf-8\");\n } else {\n await fs.copyFile(sourceFile, destFile);\n }\n }\n\n console.log(`\nNew project created! Run it with:\n\n cd ${args.name}\n pnpm install\n pnpm dev\n\nHave fun! For more info, check the docs at https://mud.dev/\n`);\n });\n}\n\nrun();\n","{\n \"name\": \"create-mud\",\n \"version\": \"2.2.17-0812178a8a873aa728358040d1d494385f78566f\",\n \"description\": \"Create a new MUD project\",\n \"license\": \"MIT\",\n \"author\": \"Lattice <mud@lattice.xyz>\",\n \"type\": \"module\",\n \"bin\": \"bin/cli.js\",\n \"files\": [\n \"bin\",\n \"dist\",\n \"templates\"\n ],\n \"scripts\": {\n \"build\": \"pnpm run build:js\",\n \"build:js\": \"tsup && pnpm run copy-templates\",\n \"clean\": \"pnpm run clean:js\",\n \"clean:js\": \"shx rm -rf dist\",\n \"copy-templates\": \"tsx ./scripts/copy-templates.ts\",\n \"dev\": \"tsup --watch\",\n \"prepublishOnly\": \"npm run clean && npm run build\",\n \"test\": \"pnpm run copy-templates && pnpm vitest --run && pnpm run test:vanilla && pnpm run test:react && pnpm run test:react-ecs && pnpm run test:phaser && pnpm run test:threejs\",\n \"test:ci\": \"pnpm run test\",\n \"test:phaser\": \"bin/cli.js --name test-project --template phaser && pnpm --dir test-project install && shx rm -rf test-project\",\n \"test:react\": \"bin/cli.js --name test-project --template react && pnpm --dir test-project install && shx rm -rf test-project\",\n \"test:react-ecs\": \"bin/cli.js --name test-project --template react-ecs && pnpm --dir test-project install && shx rm -rf test-project\",\n \"test:threejs\": \"bin/cli.js --name test-project --template threejs && pnpm --dir test-project install && shx rm -rf test-project\",\n \"test:vanilla\": \"bin/cli.js --name test-project --template vanilla && pnpm --dir test-project install && shx rm -rf test-project\"\n },\n \"dependencies\": {\n \"fast-glob\": \"^3.3.3\",\n \"yargs-interactive\": \"^3.0.1\"\n },\n \"devDependencies\": {\n \"@types/yargs-interactive\": \"^2.1.6\",\n \"execa\": \"^7.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org\"\n }\n}\n","// We define these here to keep them in the order we want to present in the CLI.\n// Tests will ensure this list stays up to date.\nexport const templates = [\"react\", \"react-ecs\", \"phaser\", \"threejs\", \"vanilla\"];\n","import fs from \"node:fs/promises\";\n\nexport async function exists(path: string) {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"AAAA,OAAOA,MAAQ,mBACf,OAAOC,MAAU,YACjB,OAAS,iBAAAC,MAAqB,WAC9B,OAAOC,MAAsB,oBAC7B,OAAOC,MAAU,YCJjB,IAAAC,EAAA,CACE,KAAQ,aACR,QAAW,kDACX,YAAe,2BACf,QAAW,MACX,OAAU,4BACV,KAAQ,SACR,IAAO,aACP,MAAS,CACP,MACA,OACA,WACF,EACA,QAAW,CACT,MAAS,oBACT,WAAY,kCACZ,MAAS,oBACT,WAAY,kBACZ,iBAAkB,kCAClB,IAAO,eACP,eAAkB,iCAClB,KAAQ,2KACR,UAAW,gBACX,cAAe,iHACf,aAAc,gHACd,iBAAkB,oHAClB,eAAgB,kHAChB,eAAgB,iHAClB,EACA,aAAgB,CACd,YAAa,SACb,oBAAqB,QACvB,EACA,gBAAmB,CACjB,2BAA4B,SAC5B,MAAS,QACX,EACA,cAAiB,CACf,OAAU,SACV,SAAY,4BACd,CACF,ECvCO,IAAMC,EAAY,CAAC,QAAS,YAAa,SAAU,UAAW,SAAS,ECF9E,OAAOC,MAAQ,mBAEf,eAAsBC,EAAOC,EAAc,CACzC,GAAI,CACF,aAAMF,EAAG,OAAOE,CAAI,EACb,EACT,MAAQ,CACN,MAAO,EACT,CACF,CHAA,IAAMC,EAAaC,EAAc,YAAY,GAAG,EAC1CC,EAAYC,EAAK,QAAQH,CAAU,EAEzC,eAAeI,GAAM,CACnBC,EAAiB,EACd,MAAM,WAAW,EACjB,YAAY,CACX,YAAa,CAAE,QAAS,EAAK,EAC7B,KAAM,CACJ,SAAU,oBACV,KAAM,OACR,EACA,SAAU,CACR,SAAU,kBACV,KAAM,OACN,QAASC,CACX,EACA,cAAe,CACb,KAAM,QACN,SAAU,yDACV,QAASC,EAAY,OACvB,CACF,CAAC,EACA,KAAK,MAAOC,GAAS,CACpB,GAAI,CAACA,EAAK,KAAM,MAAM,IAAI,MAAM,2BAA2B,EAE3D,IAAMC,EAAUN,EAAK,KAAK,QAAQ,IAAI,EAAGK,EAAK,IAAI,EAClD,GAAI,MAAME,EAAOD,CAAO,EACtB,MAAM,IAAI,MAAM,qBAAqBA,CAAO,mBAAmB,EAGjE,IAAME,EAAYR,EAAK,KAAKD,EAAW,KAAM,YAAaM,EAAK,QAAQ,EACjEI,EAAQ,MAAMC,EAAK,OAAQ,CAAE,IAAKF,EAAW,IAAK,EAAK,CAAC,EAE9D,QAAWG,KAAYF,EAAO,CAC5B,IAAMG,EAAaZ,EAAK,KAAKQ,EAAWG,CAAQ,EAC1CE,EAAWb,EAAK,KAAKM,EAASK,CAAQ,EAI5C,GAFA,MAAMG,EAAG,MAAMd,EAAK,QAAQa,CAAQ,EAAG,CAAE,UAAW,EAAK,CAAC,EAEtD,iBAAiB,KAAKD,CAAU,EAAG,CACrC,IAAMG,EAAS,MAAMD,EAAG,SAASF,EAAY,OAAO,EACpD,MAAME,EAAG,UAAUD,EAAUE,EAAO,WAAW,mBAAoBV,EAAK,UAAU,EAAG,OAAO,CAC9F,MACE,MAAMS,EAAG,SAASF,EAAYC,CAAQ,CAE1C,CAEA,QAAQ,IAAI;AAAA;AAAA;AAAA,OAGXR,EAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,CAKf,CACG,CAAC,CACL,CAEAJ,EAAI","names":["fs","path","fileURLToPath","yargsInteractive","glob","package_default","templates","fs","exists","path","__filename","fileURLToPath","__dirname","path","run","yargsInteractive","templates","package_default","args","destDir","exists","sourceDir","files","glob","filename","sourceFile","destFile","fs","source"]}
package/package.json CHANGED
@@ -1,17 +1,22 @@
1
1
  {
2
2
  "name": "create-mud",
3
- "version": "2.2.16",
3
+ "version": "2.2.17-0812178a8a873aa728358040d1d494385f78566f",
4
4
  "description": "Create a new MUD project",
5
5
  "license": "MIT",
6
6
  "author": "Lattice <mud@lattice.xyz>",
7
- "bin": "dist/cli.js",
7
+ "type": "module",
8
+ "bin": "bin/cli.js",
8
9
  "files": [
9
- "dist"
10
+ "bin",
11
+ "dist",
12
+ "templates"
10
13
  ],
11
14
  "dependencies": {
12
- "create-create-app": "git+https://github.com/holic/create-create-app#74376c59b48a04aabbe94d9cacfe9cb1cecccd63"
15
+ "fast-glob": "^3.3.3",
16
+ "yargs-interactive": "^3.0.1"
13
17
  },
14
18
  "devDependencies": {
19
+ "@types/yargs-interactive": "^2.1.6",
15
20
  "execa": "^7.0.0"
16
21
  },
17
22
  "publishConfig": {
@@ -20,16 +25,17 @@
20
25
  },
21
26
  "scripts": {
22
27
  "build": "pnpm run build:js",
23
- "build:js": "tsup && tsx ./scripts/copy-templates.ts",
28
+ "build:js": "tsup && pnpm run copy-templates",
24
29
  "clean": "pnpm run clean:js",
25
30
  "clean:js": "shx rm -rf dist",
31
+ "copy-templates": "tsx ./scripts/copy-templates.ts",
26
32
  "dev": "tsup --watch",
27
- "test": "pnpm run test:vanilla && pnpm run test:react && pnpm run test:react-ecs && pnpm run test:phaser && pnpm run test:threejs",
33
+ "test": "pnpm run copy-templates && pnpm vitest --run && pnpm run test:vanilla && pnpm run test:react && pnpm run test:react-ecs && pnpm run test:phaser && pnpm run test:threejs",
28
34
  "test:ci": "pnpm run test",
29
- "test:phaser": "dist/cli.js test-project --template phaser && shx rm -rf test-project",
30
- "test:react": "dist/cli.js test-project --template react && shx rm -rf test-project",
31
- "test:react-ecs": "dist/cli.js test-project --template react-ecs && shx rm -rf test-project",
32
- "test:threejs": "dist/cli.js test-project --template threejs && shx rm -rf test-project",
33
- "test:vanilla": "dist/cli.js test-project --template vanilla && shx rm -rf test-project"
35
+ "test:phaser": "bin/cli.js --name test-project --template phaser && pnpm --dir test-project install && shx rm -rf test-project",
36
+ "test:react": "bin/cli.js --name test-project --template react && pnpm --dir test-project install && shx rm -rf test-project",
37
+ "test:react-ecs": "bin/cli.js --name test-project --template react-ecs && pnpm --dir test-project install && shx rm -rf test-project",
38
+ "test:threejs": "bin/cli.js --name test-project --template threejs && pnpm --dir test-project install && shx rm -rf test-project",
39
+ "test:vanilla": "bin/cli.js --name test-project --template vanilla && pnpm --dir test-project install && shx rm -rf test-project"
34
40
  }
35
41
  }
@@ -0,0 +1,21 @@
1
+ scrollback: 10000
2
+ procs:
3
+ client:
4
+ cwd: packages/client
5
+ shell: pnpm run dev
6
+ contracts:
7
+ cwd: packages/contracts
8
+ shell: pnpm mud dev-contracts --rpc http://127.0.0.1:8545
9
+ deploy-prereqs:
10
+ cwd: packages/contracts
11
+ shell: pnpm deploy-local-prereqs
12
+ env:
13
+ DEBUG: "mud:*"
14
+ # Anvil default account (0x70997970C51812dc3A010C7d01b50e0d17dc79C8)
15
+ PRIVATE_KEY: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d"
16
+ anvil:
17
+ cwd: packages/contracts
18
+ shell: anvil --block-time 2
19
+ explorer:
20
+ cwd: packages/contracts
21
+ shell: pnpm explorer
@@ -1,9 +1,9 @@
1
- <!DOCTYPE html>
1
+ <!doctype html>
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>a minimal MUD client</title>
6
+ <title>a MUD app</title>
7
7
  </head>
8
8
  <body>
9
9
  <div id="react-root"></div>
@@ -6,31 +6,39 @@
6
6
  "type": "module",
7
7
  "scripts": {
8
8
  "build": "vite build",
9
- "dev": "wait-port localhost:8545 && vite",
9
+ "dev": "vite",
10
10
  "preview": "vite preview",
11
11
  "test": "tsc --noEmit"
12
12
  },
13
13
  "dependencies": {
14
14
  "@latticexyz/common": "{{mud-version}}",
15
- "@latticexyz/dev-tools": "{{mud-version}}",
15
+ "@latticexyz/entrykit": "{{mud-version}}",
16
+ "@latticexyz/explorer": "{{mud-version}}",
16
17
  "@latticexyz/react": "{{mud-version}}",
17
18
  "@latticexyz/schema-type": "{{mud-version}}",
19
+ "@latticexyz/stash": "{{mud-version}}",
18
20
  "@latticexyz/store-sync": "{{mud-version}}",
19
21
  "@latticexyz/utils": "{{mud-version}}",
20
22
  "@latticexyz/world": "{{mud-version}}",
23
+ "@tanstack/react-query": "^5.63.0",
21
24
  "contracts": "workspace:*",
22
- "react": "^18.2.0",
23
- "react-dom": "^18.2.0",
24
- "rxjs": "7.5.5",
25
- "viem": "2.21.19"
25
+ "react": "18.2.0",
26
+ "react-dom": "18.2.0",
27
+ "react-error-boundary": "5.0.0",
28
+ "tailwind-merge": "^2.6.0",
29
+ "viem": "2.21.19",
30
+ "wagmi": "2.12.11"
26
31
  },
27
32
  "devDependencies": {
28
33
  "@types/react": "18.2.22",
29
34
  "@types/react-dom": "18.2.7",
30
- "@vitejs/plugin-react": "^3.1.0",
35
+ "@vitejs/plugin-react": "^4.3.4",
36
+ "autoprefixer": "^10.4.20",
31
37
  "eslint-plugin-react": "7.31.11",
32
38
  "eslint-plugin-react-hooks": "4.6.0",
33
- "vite": "^4.2.1",
34
- "wait-port": "^1.0.4"
39
+ "postcss": "^8.4.49",
40
+ "tailwindcss": "^3.4.17",
41
+ "vite": "^6.0.7",
42
+ "vite-plugin-mud": "{{mud-version}}"
35
43
  }
36
44
  }
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ };
@@ -0,0 +1,46 @@
1
+ import { stash } from "./mud/stash";
2
+ import { useRecords } from "@latticexyz/stash/react";
3
+ import { AccountButton } from "@latticexyz/entrykit/internal";
4
+ import { Direction } from "./common";
5
+ import mudConfig from "contracts/mud.config";
6
+ import { useMemo } from "react";
7
+ import { GameMap } from "./game/GameMap";
8
+ import { useWorldContract } from "./mud/useWorldContract";
9
+ import { Synced } from "./mud/Synced";
10
+ import { useSync } from "@latticexyz/store-sync/react";
11
+
12
+ export function App() {
13
+ const players = useRecords({ stash, table: mudConfig.tables.app__Position });
14
+
15
+ const sync = useSync();
16
+ const worldContract = useWorldContract();
17
+ const onMove = useMemo(
18
+ () =>
19
+ sync.data && worldContract
20
+ ? async (direction: Direction) => {
21
+ const tx = await worldContract.write.app__move([mudConfig.enums.Direction.indexOf(direction)]);
22
+ await sync.data.waitForTransaction(tx);
23
+ }
24
+ : undefined,
25
+ [sync.data, worldContract],
26
+ );
27
+
28
+ return (
29
+ <>
30
+ <div className="fixed inset-0 grid place-items-center p-4">
31
+ <Synced
32
+ fallback={({ message, percentage }) => (
33
+ <div className="tabular-nums">
34
+ {message} ({percentage.toFixed(1)}%)…
35
+ </div>
36
+ )}
37
+ >
38
+ <GameMap players={players} onMove={onMove} />
39
+ </Synced>
40
+ </div>
41
+ <div className="fixed top-2 right-2">
42
+ <AccountButton />
43
+ </div>
44
+ </>
45
+ );
46
+ }
@@ -0,0 +1,35 @@
1
+ import { WagmiProvider } from "wagmi";
2
+ import { QueryClientProvider, QueryClient } from "@tanstack/react-query";
3
+ import { ReactNode } from "react";
4
+ import { createSyncAdapter } from "@latticexyz/store-sync/internal";
5
+ import { SyncProvider } from "@latticexyz/store-sync/react";
6
+ import { stash } from "./mud/stash";
7
+ import { defineConfig, EntryKitProvider } from "@latticexyz/entrykit/internal";
8
+ import { wagmiConfig } from "./wagmiConfig";
9
+ import { chainId, getWorldAddress, startBlock } from "./common";
10
+
11
+ const queryClient = new QueryClient();
12
+
13
+ export type Props = {
14
+ children: ReactNode;
15
+ };
16
+
17
+ export function Providers({ children }: Props) {
18
+ const worldAddress = getWorldAddress();
19
+ return (
20
+ <WagmiProvider config={wagmiConfig}>
21
+ <QueryClientProvider client={queryClient}>
22
+ <EntryKitProvider config={defineConfig({ chainId, worldAddress })}>
23
+ <SyncProvider
24
+ chainId={chainId}
25
+ address={worldAddress}
26
+ startBlock={startBlock}
27
+ adapter={createSyncAdapter({ stash })}
28
+ >
29
+ {children}
30
+ </SyncProvider>
31
+ </EntryKitProvider>
32
+ </QueryClientProvider>
33
+ </WagmiProvider>
34
+ );
35
+ }
@@ -0,0 +1,26 @@
1
+ import mudConfig from "contracts/mud.config";
2
+ import { chains } from "./wagmiConfig";
3
+ import { Chain } from "viem";
4
+
5
+ export const chainId = import.meta.env.CHAIN_ID;
6
+ export const worldAddress = import.meta.env.WORLD_ADDRESS;
7
+ export const startBlock = import.meta.env.START_BLOCK;
8
+
9
+ export const url = new URL(window.location.href);
10
+
11
+ export type Direction = (typeof mudConfig.enums.Direction)[number];
12
+
13
+ export function getWorldAddress() {
14
+ if (!worldAddress) {
15
+ throw new Error("No world address configured. Is the world still deploying?");
16
+ }
17
+ return worldAddress;
18
+ }
19
+
20
+ export function getChain(): Chain {
21
+ const chain = chains.find((c) => c.id === chainId);
22
+ if (!chain) {
23
+ throw new Error(`No chain configured for chain ID ${chainId}.`);
24
+ }
25
+ return chain;
26
+ }
@@ -0,0 +1,102 @@
1
+ import { serialize, useAccount } from "wagmi";
2
+ import { useKeyboardMovement } from "./useKeyboardMovement";
3
+ import { Address, Hex, hexToBigInt, keccak256 } from "viem";
4
+ import { ArrowDownIcon } from "../ui/icons/ArrowDownIcon";
5
+ import { twMerge } from "tailwind-merge";
6
+ import { Direction } from "../common";
7
+ import mudConfig from "contracts/mud.config";
8
+ import { AsyncButton } from "../ui/AsyncButton";
9
+ import { useAccountModal } from "@latticexyz/entrykit/internal";
10
+
11
+ export type Props = {
12
+ readonly players?: readonly {
13
+ readonly player: Address;
14
+ readonly x: number;
15
+ readonly y: number;
16
+ }[];
17
+
18
+ readonly onMove?: (direction: Direction) => Promise<void>;
19
+ };
20
+
21
+ const size = 40;
22
+ const scale = 100 / size;
23
+
24
+ function getColorAngle(seed: Hex) {
25
+ return Number(hexToBigInt(keccak256(seed)) % 360n);
26
+ }
27
+
28
+ const rotateClassName = {
29
+ North: "rotate-0",
30
+ East: "rotate-90",
31
+ South: "rotate-180",
32
+ West: "-rotate-90",
33
+ } as const satisfies Record<Direction, `${"" | "-"}rotate-${number}`>;
34
+
35
+ export function GameMap({ players = [], onMove }: Props) {
36
+ const { openAccountModal } = useAccountModal();
37
+ const { address: userAddress } = useAccount();
38
+ const currentPlayer = players.find((player) => player.player.toLowerCase() === userAddress?.toLowerCase());
39
+ useKeyboardMovement(onMove);
40
+ return (
41
+ <div className="aspect-square w-full max-w-[40rem]">
42
+ <div className="relative w-full h-full border-8 border-black/10">
43
+ {onMove
44
+ ? mudConfig.enums.Direction.map((direction) => (
45
+ <button
46
+ key={direction}
47
+ title={`Move ${direction.toLowerCase()}`}
48
+ className={twMerge(
49
+ "outline-0 absolute inset-0 cursor-pointer grid p-4",
50
+ rotateClassName[direction],
51
+ "transition bg-gradient-to-t from-transparent via-transparent to-blue-50 text-blue-400 opacity-0 hover:opacity-40 active:opacity-100",
52
+ )}
53
+ style={{ clipPath: "polygon(0% 0%, 100% 0%, 50% 50%)" }}
54
+ onClick={() => onMove(direction)}
55
+ >
56
+ <ArrowDownIcon className="rotate-180 text-4xl self-start justify-self-center" />
57
+ </button>
58
+ ))
59
+ : null}
60
+
61
+ {players.map((player) => (
62
+ <div
63
+ key={player.player}
64
+ className="absolute bg-current"
65
+ style={{
66
+ color: `hwb(${getColorAngle(player.player)} 40% 20%)`,
67
+ width: `${scale}%`,
68
+ height: `${scale}%`,
69
+ left: `${((((player.x + size / 2) % size) + size) % size) * scale}%`,
70
+ top: `${((size - ((player.y + size / 2) % size)) % size) * scale}%`,
71
+ }}
72
+ title={serialize(player, null, 2)}
73
+ >
74
+ {player === currentPlayer ? <div className="w-full h-full bg-current animate-ping opacity-50" /> : null}
75
+ </div>
76
+ ))}
77
+
78
+ {!currentPlayer ? (
79
+ onMove ? (
80
+ <div className="absolute inset-0 grid place-items-center">
81
+ <AsyncButton
82
+ className="group outline-0 p-4 border-4 border-green-400 transition ring-green-300 hover:ring-4 active:scale-95 rounded-lg text-lg font-medium aria-busy:pointer-events-none aria-busy:animate-pulse"
83
+ onClick={() => onMove("North")}
84
+ >
85
+ Spawn<span className="hidden group-aria-busy:inline">ing…</span>
86
+ </AsyncButton>
87
+ </div>
88
+ ) : (
89
+ <div className="absolute inset-0 grid place-items-center">
90
+ <button
91
+ className="group outline-0 p-4 border-4 border-green-400 transition ring-green-300 hover:ring-4 active:scale-95 rounded-lg text-lg font-medium aria-busy:pointer-events-none aria-busy:animate-pulse"
92
+ onClick={openAccountModal}
93
+ >
94
+ Sign in to play
95
+ </button>
96
+ </div>
97
+ )
98
+ ) : null}
99
+ </div>
100
+ </div>
101
+ );
102
+ }
@@ -0,0 +1,26 @@
1
+ import { useEffect } from "react";
2
+ import { Direction } from "../common";
3
+
4
+ const keys = new Map<KeyboardEvent["key"], Direction>([
5
+ ["ArrowUp", "North"],
6
+ ["ArrowRight", "East"],
7
+ ["ArrowDown", "South"],
8
+ ["ArrowLeft", "West"],
9
+ ]);
10
+
11
+ export const useKeyboardMovement = (move: undefined | ((direction: Direction) => void)) => {
12
+ useEffect(() => {
13
+ if (!move) return;
14
+
15
+ const listener = (event: KeyboardEvent) => {
16
+ const direction = keys.get(event.key);
17
+ if (direction == null) return;
18
+
19
+ event.preventDefault();
20
+ move(direction);
21
+ };
22
+
23
+ window.addEventListener("keydown", listener);
24
+ return () => window.removeEventListener("keydown", listener);
25
+ }, [move]);
26
+ };
@@ -0,0 +1,19 @@
1
+ import "tailwindcss/tailwind.css";
2
+ import { StrictMode } from "react";
3
+ import { createRoot } from "react-dom/client";
4
+ import { Providers } from "./Providers";
5
+ import { App } from "./App";
6
+ import { Explorer } from "./mud/Explorer";
7
+ import { ErrorBoundary } from "react-error-boundary";
8
+ import { ErrorFallback } from "./ui/ErrorFallback";
9
+
10
+ createRoot(document.getElementById("react-root")!).render(
11
+ <StrictMode>
12
+ <ErrorBoundary FallbackComponent={ErrorFallback}>
13
+ <Providers>
14
+ <App />
15
+ <Explorer />
16
+ </Providers>
17
+ </ErrorBoundary>
18
+ </StrictMode>,
19
+ );
@@ -0,0 +1,32 @@
1
+ import { useState } from "react";
2
+ import { getChain, getWorldAddress } from "../common";
3
+ import { MUDIcon } from "../ui/icons/MUDIcon";
4
+
5
+ export function Explorer() {
6
+ const [open, setOpen] = useState(false);
7
+
8
+ const chain = getChain();
9
+ const worldAddress = getWorldAddress();
10
+
11
+ const explorerUrl = chain.blockExplorers?.worldsExplorer?.url;
12
+ if (!explorerUrl) return null;
13
+
14
+ return (
15
+ <div className="fixed bottom-0 inset-x-0 flex flex-col opacity-80 transition hover:opacity-100">
16
+ <button
17
+ type="button"
18
+ onClick={() => setOpen(!open)}
19
+ className="outline-none flex justify-end gap-2 p-2 font-medium leading-none text-black"
20
+ >
21
+ {open ? (
22
+ <>Close</>
23
+ ) : (
24
+ <>
25
+ Explore <MUDIcon className="text-orange-500" />
26
+ </>
27
+ )}
28
+ </button>
29
+ {open ? <iframe src={`${explorerUrl}/${worldAddress}`} className="bg-black h-[50vh]" /> : null}
30
+ </div>
31
+ );
32
+ }
@@ -0,0 +1,14 @@
1
+ import { ReactNode } from "react";
2
+ import { useSyncStatus } from "./useSyncStatus";
3
+ import { TableRecord } from "@latticexyz/stash/internal";
4
+ import { SyncProgress } from "@latticexyz/store-sync/internal";
5
+
6
+ export type Props = {
7
+ children: ReactNode;
8
+ fallback?: (props: TableRecord<typeof SyncProgress>) => ReactNode;
9
+ };
10
+
11
+ export function Synced({ children, fallback }: Props) {
12
+ const status = useSyncStatus();
13
+ return status.isLive ? children : fallback?.(status);
14
+ }
@@ -0,0 +1,4 @@
1
+ import { createStash } from "@latticexyz/stash/internal";
2
+ import config from "contracts/mud.config";
3
+
4
+ export const stash = createStash(config);
@@ -0,0 +1,21 @@
1
+ import { stash } from "./stash";
2
+ import { initialProgress, SyncProgress } from "@latticexyz/store-sync/internal";
3
+ import { SyncStep } from "@latticexyz/store-sync";
4
+ import { useMemo } from "react";
5
+ import { useRecord } from "@latticexyz/stash/react";
6
+
7
+ export function useSyncStatus() {
8
+ const progress = useRecord({
9
+ stash,
10
+ table: SyncProgress,
11
+ key: {},
12
+ defaultValue: initialProgress,
13
+ });
14
+ return useMemo(
15
+ () => ({
16
+ ...progress,
17
+ isLive: progress.step === SyncStep.LIVE,
18
+ }),
19
+ [progress],
20
+ );
21
+ }
@@ -0,0 +1,44 @@
1
+ import { useClient } from "wagmi";
2
+ import { chainId, getWorldAddress } from "../common";
3
+ import { Account, Chain, Client, GetContractReturnType, Transport, getContract } from "viem";
4
+ import { useQuery } from "@tanstack/react-query";
5
+ import { useSessionClient } from "@latticexyz/entrykit/internal";
6
+ import { observer } from "@latticexyz/explorer/observer";
7
+ import worldAbi from "contracts/out/IWorld.sol/IWorld.abi.json";
8
+
9
+ export function useWorldContract():
10
+ | GetContractReturnType<
11
+ typeof worldAbi,
12
+ {
13
+ public: Client<Transport, Chain>;
14
+ wallet: Client<Transport, Chain, Account>;
15
+ }
16
+ >
17
+ | undefined {
18
+ const client = useClient({ chainId });
19
+ const { data: sessionClient } = useSessionClient();
20
+
21
+ const { data: worldContract } = useQuery({
22
+ queryKey: ["worldContract", client?.uid, sessionClient?.uid],
23
+ queryFn: () => {
24
+ if (!client || !sessionClient) {
25
+ throw new Error("Not connected.");
26
+ }
27
+
28
+ return getContract({
29
+ abi: worldAbi,
30
+ address: getWorldAddress(),
31
+ client: {
32
+ public: client,
33
+ wallet: sessionClient.extend(observer()),
34
+ },
35
+ });
36
+ },
37
+ staleTime: Infinity,
38
+ refetchOnMount: false,
39
+ refetchOnReconnect: false,
40
+ refetchOnWindowFocus: false,
41
+ });
42
+
43
+ return worldContract;
44
+ }