@cubingcenter/scrambler 0.1.0

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 (359) hide show
  1. package/README.md +169 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +10 -0
  5. package/dist/cli/run.d.ts +9 -0
  6. package/dist/cli/run.d.ts.map +1 -0
  7. package/dist/cli/run.js +139 -0
  8. package/dist/core/api.d.ts +19 -0
  9. package/dist/core/api.d.ts.map +1 -0
  10. package/dist/core/api.js +94 -0
  11. package/dist/core/errors.d.ts +21 -0
  12. package/dist/core/errors.d.ts.map +1 -0
  13. package/dist/core/errors.js +34 -0
  14. package/dist/core/index.d.ts +5 -0
  15. package/dist/core/index.d.ts.map +1 -0
  16. package/dist/core/index.js +3 -0
  17. package/dist/core/registry.d.ts +10 -0
  18. package/dist/core/registry.d.ts.map +1 -0
  19. package/dist/core/registry.js +35 -0
  20. package/dist/core/types.d.ts +34 -0
  21. package/dist/core/types.d.ts.map +1 -0
  22. package/dist/core/types.js +1 -0
  23. package/dist/index.d.ts +4 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +3 -0
  26. package/dist/puzzles/clock/index.d.ts +2 -0
  27. package/dist/puzzles/clock/index.d.ts.map +1 -0
  28. package/dist/puzzles/clock/index.js +1 -0
  29. package/dist/puzzles/clock/scrambler.d.ts +4 -0
  30. package/dist/puzzles/clock/scrambler.d.ts.map +1 -0
  31. package/dist/puzzles/clock/scrambler.js +50 -0
  32. package/dist/puzzles/cube2/facelets.d.ts +5 -0
  33. package/dist/puzzles/cube2/facelets.d.ts.map +1 -0
  34. package/dist/puzzles/cube2/facelets.js +53 -0
  35. package/dist/puzzles/cube2/index.d.ts +10 -0
  36. package/dist/puzzles/cube2/index.d.ts.map +1 -0
  37. package/dist/puzzles/cube2/index.js +8 -0
  38. package/dist/puzzles/cube2/moves.d.ts +9 -0
  39. package/dist/puzzles/cube2/moves.d.ts.map +1 -0
  40. package/dist/puzzles/cube2/moves.js +79 -0
  41. package/dist/puzzles/cube2/random-state.d.ts +3 -0
  42. package/dist/puzzles/cube2/random-state.d.ts.map +1 -0
  43. package/dist/puzzles/cube2/random-state.js +51 -0
  44. package/dist/puzzles/cube2/scrambler.d.ts +6 -0
  45. package/dist/puzzles/cube2/scrambler.d.ts.map +1 -0
  46. package/dist/puzzles/cube2/scrambler.js +54 -0
  47. package/dist/puzzles/cube2/solver/browser-loader.d.ts +12 -0
  48. package/dist/puzzles/cube2/solver/browser-loader.d.ts.map +1 -0
  49. package/dist/puzzles/cube2/solver/browser-loader.js +80 -0
  50. package/dist/puzzles/cube2/solver/generated/distances.bin +1 -0
  51. package/dist/puzzles/cube2/solver/generated/manifest.json +21 -0
  52. package/dist/puzzles/cube2/solver/generated/orientation-distances.bin +0 -0
  53. package/dist/puzzles/cube2/solver/generated/orientation-table.bin +0 -0
  54. package/dist/puzzles/cube2/solver/generated/permutation-distances.bin +0 -0
  55. package/dist/puzzles/cube2/solver/generated/permutation-table.bin +0 -0
  56. package/dist/puzzles/cube2/solver/generated-assets.d.ts +6 -0
  57. package/dist/puzzles/cube2/solver/generated-assets.d.ts.map +1 -0
  58. package/dist/puzzles/cube2/solver/generated-assets.js +25 -0
  59. package/dist/puzzles/cube2/solver/index.d.ts +3 -0
  60. package/dist/puzzles/cube2/solver/index.d.ts.map +1 -0
  61. package/dist/puzzles/cube2/solver/index.js +1 -0
  62. package/dist/puzzles/cube2/solver/node-loader.d.ts +6 -0
  63. package/dist/puzzles/cube2/solver/node-loader.d.ts.map +1 -0
  64. package/dist/puzzles/cube2/solver/node-loader.js +83 -0
  65. package/dist/puzzles/cube2/solver/search.d.ts +8 -0
  66. package/dist/puzzles/cube2/solver/search.d.ts.map +1 -0
  67. package/dist/puzzles/cube2/solver/search.js +50 -0
  68. package/dist/puzzles/cube2/solver/table-metadata.d.ts +16 -0
  69. package/dist/puzzles/cube2/solver/table-metadata.d.ts.map +1 -0
  70. package/dist/puzzles/cube2/solver/table-metadata.js +15 -0
  71. package/dist/puzzles/cube2/solver/tables.d.ts +14 -0
  72. package/dist/puzzles/cube2/solver/tables.d.ts.map +1 -0
  73. package/dist/puzzles/cube2/solver/tables.js +82 -0
  74. package/dist/puzzles/cube2/state.d.ts +6 -0
  75. package/dist/puzzles/cube2/state.d.ts.map +1 -0
  76. package/dist/puzzles/cube2/state.js +30 -0
  77. package/dist/puzzles/cube2/types.d.ts +23 -0
  78. package/dist/puzzles/cube2/types.d.ts.map +1 -0
  79. package/dist/puzzles/cube2/types.js +21 -0
  80. package/dist/puzzles/cube2/validation.d.ts +6 -0
  81. package/dist/puzzles/cube2/validation.d.ts.map +1 -0
  82. package/dist/puzzles/cube2/validation.js +72 -0
  83. package/dist/puzzles/cube3/facelets.d.ts +5 -0
  84. package/dist/puzzles/cube3/facelets.d.ts.map +1 -0
  85. package/dist/puzzles/cube3/facelets.js +89 -0
  86. package/dist/puzzles/cube3/index.d.ts +10 -0
  87. package/dist/puzzles/cube3/index.d.ts.map +1 -0
  88. package/dist/puzzles/cube3/index.js +8 -0
  89. package/dist/puzzles/cube3/moves.d.ts +9 -0
  90. package/dist/puzzles/cube3/moves.d.ts.map +1 -0
  91. package/dist/puzzles/cube3/moves.js +210 -0
  92. package/dist/puzzles/cube3/random-state.d.ts +3 -0
  93. package/dist/puzzles/cube3/random-state.d.ts.map +1 -0
  94. package/dist/puzzles/cube3/random-state.js +59 -0
  95. package/dist/puzzles/cube3/scrambler.d.ts +6 -0
  96. package/dist/puzzles/cube3/scrambler.d.ts.map +1 -0
  97. package/dist/puzzles/cube3/scrambler.js +59 -0
  98. package/dist/puzzles/cube3/solver/browser-loader.d.ts +5 -0
  99. package/dist/puzzles/cube3/solver/browser-loader.d.ts.map +1 -0
  100. package/dist/puzzles/cube3/solver/browser-loader.js +134 -0
  101. package/dist/puzzles/cube3/solver/browser-worker-pool.d.ts +31 -0
  102. package/dist/puzzles/cube3/solver/browser-worker-pool.d.ts.map +1 -0
  103. package/dist/puzzles/cube3/solver/browser-worker-pool.js +118 -0
  104. package/dist/puzzles/cube3/solver/browser-worker.d.ts +2 -0
  105. package/dist/puzzles/cube3/solver/browser-worker.d.ts.map +1 -0
  106. package/dist/puzzles/cube3/solver/browser-worker.js +71 -0
  107. package/dist/puzzles/cube3/solver/coordinates.d.ts +34 -0
  108. package/dist/puzzles/cube3/solver/coordinates.d.ts.map +1 -0
  109. package/dist/puzzles/cube3/solver/coordinates.js +266 -0
  110. package/dist/puzzles/cube3/solver/generated/manifest.json +404 -0
  111. package/dist/puzzles/cube3/solver/generated/move-cornerOrientation.bin +0 -0
  112. package/dist/puzzles/cube3/solver/generated/move-cornerPermutation.bin +0 -0
  113. package/dist/puzzles/cube3/solver/generated/move-edgeOrientation.bin +0 -0
  114. package/dist/puzzles/cube3/solver/generated/move-slicePermutation.bin +0 -0
  115. package/dist/puzzles/cube3/solver/generated/move-udEdgePermutation.bin +0 -0
  116. package/dist/puzzles/cube3/solver/generated/move-udSlice.bin +0 -0
  117. package/dist/puzzles/cube3/solver/generated/pruning-cornerOrientation.bin +1 -0
  118. package/dist/puzzles/cube3/solver/generated/pruning-cornerOrientationEdgeOrientation.bin +1 -0
  119. package/dist/puzzles/cube3/solver/generated/pruning-cornerPermutation.bin +1 -0
  120. package/dist/puzzles/cube3/solver/generated/pruning-cornerPermutationSlicePermutation.bin +1 -0
  121. package/dist/puzzles/cube3/solver/generated/pruning-edgeOrientation.bin +1 -0
  122. package/dist/puzzles/cube3/solver/generated/pruning-slicePermutation.bin +1 -0
  123. package/dist/puzzles/cube3/solver/generated/pruning-udEdgePermutation.bin +1 -0
  124. package/dist/puzzles/cube3/solver/generated/pruning-udEdgePermutationSlicePermutation.bin +1 -0
  125. package/dist/puzzles/cube3/solver/generated/pruning-udSlice.bin +0 -0
  126. package/dist/puzzles/cube3/solver/generated-assets.d.ts +5 -0
  127. package/dist/puzzles/cube3/solver/generated-assets.d.ts.map +1 -0
  128. package/dist/puzzles/cube3/solver/generated-assets.js +60 -0
  129. package/dist/puzzles/cube3/solver/index.d.ts +10 -0
  130. package/dist/puzzles/cube3/solver/index.d.ts.map +1 -0
  131. package/dist/puzzles/cube3/solver/index.js +5 -0
  132. package/dist/puzzles/cube3/solver/node-loader.d.ts +3 -0
  133. package/dist/puzzles/cube3/solver/node-loader.d.ts.map +1 -0
  134. package/dist/puzzles/cube3/solver/node-loader.js +120 -0
  135. package/dist/puzzles/cube3/solver/phase1.d.ts +28 -0
  136. package/dist/puzzles/cube3/solver/phase1.d.ts.map +1 -0
  137. package/dist/puzzles/cube3/solver/phase1.js +150 -0
  138. package/dist/puzzles/cube3/solver/phase2.d.ts +44 -0
  139. package/dist/puzzles/cube3/solver/phase2.d.ts.map +1 -0
  140. package/dist/puzzles/cube3/solver/phase2.js +270 -0
  141. package/dist/puzzles/cube3/solver/search-utils.d.ts +9 -0
  142. package/dist/puzzles/cube3/solver/search-utils.d.ts.map +1 -0
  143. package/dist/puzzles/cube3/solver/search-utils.js +41 -0
  144. package/dist/puzzles/cube3/solver/table-metadata.d.ts +97 -0
  145. package/dist/puzzles/cube3/solver/table-metadata.d.ts.map +1 -0
  146. package/dist/puzzles/cube3/solver/table-metadata.js +21 -0
  147. package/dist/puzzles/cube3/solver/tables.d.ts +72 -0
  148. package/dist/puzzles/cube3/solver/tables.d.ts.map +1 -0
  149. package/dist/puzzles/cube3/solver/tables.js +202 -0
  150. package/dist/puzzles/cube3/solver/worker-pool.d.ts +18 -0
  151. package/dist/puzzles/cube3/solver/worker-pool.d.ts.map +1 -0
  152. package/dist/puzzles/cube3/solver/worker-pool.js +116 -0
  153. package/dist/puzzles/cube3/solver/worker.d.ts +2 -0
  154. package/dist/puzzles/cube3/solver/worker.d.ts.map +1 -0
  155. package/dist/puzzles/cube3/solver/worker.js +73 -0
  156. package/dist/puzzles/cube3/state.d.ts +6 -0
  157. package/dist/puzzles/cube3/state.d.ts.map +1 -0
  158. package/dist/puzzles/cube3/state.js +40 -0
  159. package/dist/puzzles/cube3/subset-state.d.ts +4 -0
  160. package/dist/puzzles/cube3/subset-state.d.ts.map +1 -0
  161. package/dist/puzzles/cube3/subset-state.js +163 -0
  162. package/dist/puzzles/cube3/types.d.ts +29 -0
  163. package/dist/puzzles/cube3/types.d.ts.map +1 -0
  164. package/dist/puzzles/cube3/types.js +22 -0
  165. package/dist/puzzles/cube3/validation.d.ts +6 -0
  166. package/dist/puzzles/cube3/validation.d.ts.map +1 -0
  167. package/dist/puzzles/cube3/validation.js +83 -0
  168. package/dist/puzzles/cube4/facelets.d.ts +5 -0
  169. package/dist/puzzles/cube4/facelets.d.ts.map +1 -0
  170. package/dist/puzzles/cube4/facelets.js +135 -0
  171. package/dist/puzzles/cube4/index.d.ts +7 -0
  172. package/dist/puzzles/cube4/index.d.ts.map +1 -0
  173. package/dist/puzzles/cube4/index.js +8 -0
  174. package/dist/puzzles/cube4/moves.d.ts +37 -0
  175. package/dist/puzzles/cube4/moves.d.ts.map +1 -0
  176. package/dist/puzzles/cube4/moves.js +243 -0
  177. package/dist/puzzles/cube4/scrambler.d.ts +4 -0
  178. package/dist/puzzles/cube4/scrambler.d.ts.map +1 -0
  179. package/dist/puzzles/cube4/scrambler.js +98 -0
  180. package/dist/puzzles/cube4/state.d.ts +16 -0
  181. package/dist/puzzles/cube4/state.d.ts.map +1 -0
  182. package/dist/puzzles/cube4/state.js +84 -0
  183. package/dist/puzzles/cube4/types.d.ts +76 -0
  184. package/dist/puzzles/cube4/types.d.ts.map +1 -0
  185. package/dist/puzzles/cube4/types.js +62 -0
  186. package/dist/puzzles/cube5x5/index.d.ts +4 -0
  187. package/dist/puzzles/cube5x5/index.d.ts.map +1 -0
  188. package/dist/puzzles/cube5x5/index.js +2 -0
  189. package/dist/puzzles/cube5x5/scrambler.d.ts +4 -0
  190. package/dist/puzzles/cube5x5/scrambler.d.ts.map +1 -0
  191. package/dist/puzzles/cube5x5/scrambler.js +93 -0
  192. package/dist/puzzles/cube5x5/types.d.ts +4 -0
  193. package/dist/puzzles/cube5x5/types.d.ts.map +1 -0
  194. package/dist/puzzles/cube5x5/types.js +4 -0
  195. package/dist/puzzles/cube6x6/index.d.ts +4 -0
  196. package/dist/puzzles/cube6x6/index.d.ts.map +1 -0
  197. package/dist/puzzles/cube6x6/index.js +2 -0
  198. package/dist/puzzles/cube6x6/scrambler.d.ts +4 -0
  199. package/dist/puzzles/cube6x6/scrambler.d.ts.map +1 -0
  200. package/dist/puzzles/cube6x6/scrambler.js +105 -0
  201. package/dist/puzzles/cube6x6/types.d.ts +4 -0
  202. package/dist/puzzles/cube6x6/types.d.ts.map +1 -0
  203. package/dist/puzzles/cube6x6/types.js +8 -0
  204. package/dist/puzzles/cube7x7/index.d.ts +4 -0
  205. package/dist/puzzles/cube7x7/index.d.ts.map +1 -0
  206. package/dist/puzzles/cube7x7/index.js +2 -0
  207. package/dist/puzzles/cube7x7/scrambler.d.ts +4 -0
  208. package/dist/puzzles/cube7x7/scrambler.d.ts.map +1 -0
  209. package/dist/puzzles/cube7x7/scrambler.js +93 -0
  210. package/dist/puzzles/cube7x7/types.d.ts +4 -0
  211. package/dist/puzzles/cube7x7/types.d.ts.map +1 -0
  212. package/dist/puzzles/cube7x7/types.js +8 -0
  213. package/dist/puzzles/index.d.ts +10 -0
  214. package/dist/puzzles/index.d.ts.map +1 -0
  215. package/dist/puzzles/index.js +28 -0
  216. package/dist/puzzles/megaminx/index.d.ts +4 -0
  217. package/dist/puzzles/megaminx/index.d.ts.map +1 -0
  218. package/dist/puzzles/megaminx/index.js +2 -0
  219. package/dist/puzzles/megaminx/scrambler.d.ts +4 -0
  220. package/dist/puzzles/megaminx/scrambler.d.ts.map +1 -0
  221. package/dist/puzzles/megaminx/scrambler.js +56 -0
  222. package/dist/puzzles/megaminx/types.d.ts +6 -0
  223. package/dist/puzzles/megaminx/types.d.ts.map +1 -0
  224. package/dist/puzzles/megaminx/types.js +4 -0
  225. package/dist/puzzles/pyraminx/index.d.ts +9 -0
  226. package/dist/puzzles/pyraminx/index.d.ts.map +1 -0
  227. package/dist/puzzles/pyraminx/index.js +7 -0
  228. package/dist/puzzles/pyraminx/moves.d.ts +9 -0
  229. package/dist/puzzles/pyraminx/moves.d.ts.map +1 -0
  230. package/dist/puzzles/pyraminx/moves.js +117 -0
  231. package/dist/puzzles/pyraminx/random-state.d.ts +3 -0
  232. package/dist/puzzles/pyraminx/random-state.d.ts.map +1 -0
  233. package/dist/puzzles/pyraminx/random-state.js +53 -0
  234. package/dist/puzzles/pyraminx/scrambler.d.ts +6 -0
  235. package/dist/puzzles/pyraminx/scrambler.d.ts.map +1 -0
  236. package/dist/puzzles/pyraminx/scrambler.js +56 -0
  237. package/dist/puzzles/pyraminx/solver.d.ts +10 -0
  238. package/dist/puzzles/pyraminx/solver.d.ts.map +1 -0
  239. package/dist/puzzles/pyraminx/solver.js +160 -0
  240. package/dist/puzzles/pyraminx/state.d.ts +6 -0
  241. package/dist/puzzles/pyraminx/state.d.ts.map +1 -0
  242. package/dist/puzzles/pyraminx/state.js +32 -0
  243. package/dist/puzzles/pyraminx/types.d.ts +17 -0
  244. package/dist/puzzles/pyraminx/types.d.ts.map +1 -0
  245. package/dist/puzzles/pyraminx/types.js +7 -0
  246. package/dist/puzzles/pyraminx/validation.d.ts +8 -0
  247. package/dist/puzzles/pyraminx/validation.d.ts.map +1 -0
  248. package/dist/puzzles/pyraminx/validation.js +79 -0
  249. package/dist/random/index.d.ts +3 -0
  250. package/dist/random/index.d.ts.map +1 -0
  251. package/dist/random/index.js +1 -0
  252. package/dist/random/prng.d.ts +7 -0
  253. package/dist/random/prng.d.ts.map +1 -0
  254. package/dist/random/prng.js +60 -0
  255. package/dist-cjs/cli/index.js +12 -0
  256. package/dist-cjs/cli/run.js +142 -0
  257. package/dist-cjs/core/api.js +102 -0
  258. package/dist-cjs/core/errors.js +42 -0
  259. package/dist-cjs/core/index.js +19 -0
  260. package/dist-cjs/core/registry.js +39 -0
  261. package/dist-cjs/core/types.js +2 -0
  262. package/dist-cjs/index.js +19 -0
  263. package/dist-cjs/package.json +3 -0
  264. package/dist-cjs/puzzles/clock/index.js +6 -0
  265. package/dist-cjs/puzzles/clock/scrambler.js +54 -0
  266. package/dist-cjs/puzzles/cube2/facelets.js +58 -0
  267. package/dist-cjs/puzzles/cube2/index.js +67 -0
  268. package/dist-cjs/puzzles/cube2/moves.js +88 -0
  269. package/dist-cjs/puzzles/cube2/random-state.js +54 -0
  270. package/dist-cjs/puzzles/cube2/scrambler.js +58 -0
  271. package/dist-cjs/puzzles/cube2/solver/browser-loader.js +85 -0
  272. package/dist-cjs/puzzles/cube2/solver/generated/distances.bin +1 -0
  273. package/dist-cjs/puzzles/cube2/solver/generated/manifest.json +21 -0
  274. package/dist-cjs/puzzles/cube2/solver/generated/orientation-distances.bin +0 -0
  275. package/dist-cjs/puzzles/cube2/solver/generated/orientation-table.bin +0 -0
  276. package/dist-cjs/puzzles/cube2/solver/generated/permutation-distances.bin +0 -0
  277. package/dist-cjs/puzzles/cube2/solver/generated/permutation-table.bin +0 -0
  278. package/dist-cjs/puzzles/cube2/solver/generated-assets.js +61 -0
  279. package/dist-cjs/puzzles/cube2/solver/index.js +5 -0
  280. package/dist-cjs/puzzles/cube2/solver/node-loader.js +89 -0
  281. package/dist-cjs/puzzles/cube2/solver/search.js +53 -0
  282. package/dist-cjs/puzzles/cube2/solver/table-metadata.js +18 -0
  283. package/dist-cjs/puzzles/cube2/solver/tables.js +91 -0
  284. package/dist-cjs/puzzles/cube2/state.js +36 -0
  285. package/dist-cjs/puzzles/cube2/types.js +24 -0
  286. package/dist-cjs/puzzles/cube2/validation.js +78 -0
  287. package/dist-cjs/puzzles/cube3/facelets.js +94 -0
  288. package/dist-cjs/puzzles/cube3/index.js +68 -0
  289. package/dist-cjs/puzzles/cube3/moves.js +219 -0
  290. package/dist-cjs/puzzles/cube3/random-state.js +62 -0
  291. package/dist-cjs/puzzles/cube3/scrambler.js +63 -0
  292. package/dist-cjs/puzzles/cube3/solver/browser-loader.js +139 -0
  293. package/dist-cjs/puzzles/cube3/solver/coordinates.js +285 -0
  294. package/dist-cjs/puzzles/cube3/solver/generated/manifest.json +404 -0
  295. package/dist-cjs/puzzles/cube3/solver/generated/move-cornerOrientation.bin +0 -0
  296. package/dist-cjs/puzzles/cube3/solver/generated/move-cornerPermutation.bin +0 -0
  297. package/dist-cjs/puzzles/cube3/solver/generated/move-edgeOrientation.bin +0 -0
  298. package/dist-cjs/puzzles/cube3/solver/generated/move-slicePermutation.bin +0 -0
  299. package/dist-cjs/puzzles/cube3/solver/generated/move-udEdgePermutation.bin +0 -0
  300. package/dist-cjs/puzzles/cube3/solver/generated/move-udSlice.bin +0 -0
  301. package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerOrientation.bin +1 -0
  302. package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerOrientationEdgeOrientation.bin +1 -0
  303. package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerPermutation.bin +1 -0
  304. package/dist-cjs/puzzles/cube3/solver/generated/pruning-cornerPermutationSlicePermutation.bin +1 -0
  305. package/dist-cjs/puzzles/cube3/solver/generated/pruning-edgeOrientation.bin +1 -0
  306. package/dist-cjs/puzzles/cube3/solver/generated/pruning-slicePermutation.bin +1 -0
  307. package/dist-cjs/puzzles/cube3/solver/generated/pruning-udEdgePermutation.bin +1 -0
  308. package/dist-cjs/puzzles/cube3/solver/generated/pruning-udEdgePermutationSlicePermutation.bin +1 -0
  309. package/dist-cjs/puzzles/cube3/solver/generated/pruning-udSlice.bin +0 -0
  310. package/dist-cjs/puzzles/cube3/solver/generated-assets.js +98 -0
  311. package/dist-cjs/puzzles/cube3/solver/index.js +49 -0
  312. package/dist-cjs/puzzles/cube3/solver/node-loader.js +126 -0
  313. package/dist-cjs/puzzles/cube3/solver/phase1.js +158 -0
  314. package/dist-cjs/puzzles/cube3/solver/phase2.js +279 -0
  315. package/dist-cjs/puzzles/cube3/solver/search-utils.js +49 -0
  316. package/dist-cjs/puzzles/cube3/solver/table-metadata.js +24 -0
  317. package/dist-cjs/puzzles/cube3/solver/tables.js +216 -0
  318. package/dist-cjs/puzzles/cube3/state.js +46 -0
  319. package/dist-cjs/puzzles/cube3/subset-state.js +166 -0
  320. package/dist-cjs/puzzles/cube3/types.js +25 -0
  321. package/dist-cjs/puzzles/cube3/validation.js +89 -0
  322. package/dist-cjs/puzzles/cube4/facelets.js +140 -0
  323. package/dist-cjs/puzzles/cube4/index.js +45 -0
  324. package/dist-cjs/puzzles/cube4/moves.js +251 -0
  325. package/dist-cjs/puzzles/cube4/scrambler.js +135 -0
  326. package/dist-cjs/puzzles/cube4/state.js +92 -0
  327. package/dist-cjs/puzzles/cube4/types.js +65 -0
  328. package/dist-cjs/puzzles/cube5x5/index.js +9 -0
  329. package/dist-cjs/puzzles/cube5x5/scrambler.js +97 -0
  330. package/dist-cjs/puzzles/cube5x5/types.js +7 -0
  331. package/dist-cjs/puzzles/cube6x6/index.js +9 -0
  332. package/dist-cjs/puzzles/cube6x6/scrambler.js +109 -0
  333. package/dist-cjs/puzzles/cube6x6/types.js +11 -0
  334. package/dist-cjs/puzzles/cube7x7/index.js +9 -0
  335. package/dist-cjs/puzzles/cube7x7/scrambler.js +97 -0
  336. package/dist-cjs/puzzles/cube7x7/types.js +11 -0
  337. package/dist-cjs/puzzles/index.js +64 -0
  338. package/dist-cjs/puzzles/megaminx/index.js +11 -0
  339. package/dist-cjs/puzzles/megaminx/scrambler.js +60 -0
  340. package/dist-cjs/puzzles/megaminx/types.js +7 -0
  341. package/dist-cjs/puzzles/pyraminx/index.js +30 -0
  342. package/dist-cjs/puzzles/pyraminx/moves.js +126 -0
  343. package/dist-cjs/puzzles/pyraminx/random-state.js +56 -0
  344. package/dist-cjs/puzzles/pyraminx/scrambler.js +60 -0
  345. package/dist-cjs/puzzles/pyraminx/solver.js +170 -0
  346. package/dist-cjs/puzzles/pyraminx/state.js +38 -0
  347. package/dist-cjs/puzzles/pyraminx/types.js +10 -0
  348. package/dist-cjs/puzzles/pyraminx/validation.js +84 -0
  349. package/dist-cjs/random/index.js +5 -0
  350. package/dist-cjs/random/prng.js +63 -0
  351. package/docs/cubingcenter-integration.md +69 -0
  352. package/docs/development.md +44 -0
  353. package/docs/facelets.md +64 -0
  354. package/docs/getting-started.md +73 -0
  355. package/examples/cli-json.md +30 -0
  356. package/examples/commonjs.cjs +11 -0
  357. package/examples/esm.mjs +9 -0
  358. package/examples/timer-preview.mjs +29 -0
  359. package/package.json +53 -0
package/README.md ADDED
@@ -0,0 +1,169 @@
1
+ # CubingCenter Scrambler
2
+
3
+ Reusable scramble generation toolkit for CubingCenter projects.
4
+
5
+ The package currently ships random-state scramblers for `222` (2x2x2), `333` (3x3x3), and a first native reduced-state `444` (4x4x4) path. It does not depend on cstimer, cubing.js, or another external scramble engine at runtime.
6
+
7
+ ## Status
8
+
9
+ - Package: `@cubingcenter/scrambler`
10
+ - Runtime: Node.js
11
+ - Language: TypeScript
12
+ - Package manager: pnpm
13
+ - Registered events: `222`, `333`, `444`
14
+ - Main technical modules: `cube2`, `cube3`, `cube4`
15
+ - 2x2 quality: random-state target + optimal IDA* corner solver + verified scramble inversion
16
+ - 3x3 quality: random-state target + two-phase solver + verified scramble inversion
17
+ - 4x4 quality: reduced 4x4 random-state target + existing 3x3 two-phase finish; full center/wing random-state reduction is isolated under `cube4.reduction`
18
+
19
+ This library is intended for practice, training, and internal CubingCenter use. Do not present it as an official WCA competition scrambler; sanctioned competitions must use the official program required by the delegate/organization.
20
+
21
+ ## Install Locally
22
+
23
+ From this repository:
24
+
25
+ ```sh
26
+ pnpm install
27
+ pnpm build
28
+ pnpm package:check
29
+ ```
30
+
31
+ From another local project, consume it through your workspace setup or a local path/tarball workflow. See [Getting Started](docs/getting-started.md) for practical options.
32
+
33
+ ## API Usage
34
+
35
+ ```ts
36
+ import {
37
+ generateScramble,
38
+ generateScrambles,
39
+ getEventInfo,
40
+ getSupportedEvents
41
+ } from "@cubingcenter/scrambler";
42
+
43
+ const events = getSupportedEvents();
44
+ const info222 = getEventInfo("222");
45
+ const info333 = getEventInfo("333");
46
+ const info444 = getEventInfo("444");
47
+ const scramble2 = generateScramble("222", { seed: "demo" });
48
+ const scramble3 = generateScramble("333", { seed: "demo" });
49
+ const scramble4 = await generateScramble("444");
50
+ const batch = generateScrambles("333", 5, { seed: "session-1" });
51
+
52
+ console.log(events);
53
+ console.log(scramble2.scramble);
54
+ console.log(scramble3.scramble);
55
+ console.log(scramble4.scramble);
56
+ console.log(batch.map((item) => item.scramble));
57
+ ```
58
+
59
+ `generateScramble("222")` returns a legal random-state 2x2 scramble. Its metadata includes the target cubie state, timer-ready facelets, a 24-character facelet string, and solver diagnostics.
60
+
61
+ `generateScramble("333")` returns a legal random-state 3x3 scramble. Its metadata includes the target cubie state, timer-ready facelets, a 54-character facelet string, and solver diagnostics.
62
+
63
+ ## 2x2 Technical Module
64
+
65
+ ```ts
66
+ import { cube2 } from "@cubingcenter/scrambler";
67
+
68
+ const solved = cube2.createSolvedCube2State();
69
+ const moved = cube2.applyCube2Algorithm(solved, ["R", "U", "R'"]);
70
+ const state = cube2.generateRandomCube2State({ seed: "demo" });
71
+ const facelets = cube2.toCube2Facelets(state);
72
+ const faceletString = cube2.formatCube2Facelets(facelets);
73
+ const validation = cube2.validateCube2State(state);
74
+ ```
75
+
76
+ `generateRandomCube2State` returns a legal cube state, not a scramble sequence.
77
+
78
+ `toCube2Facelets` returns six faces with four stickers each in row-major order. The face order is `U R F D L B`. `formatCube2Facelets` produces a stable 24-character string for logs, tests, or timer previews.
79
+
80
+ The `cube2.solver` namespace is exported for advanced tooling and validation. Normal consumers should prefer `generateScramble("222")`.
81
+
82
+ ## 3x3 Technical Module
83
+
84
+ ```ts
85
+ import { cube3 } from "@cubingcenter/scrambler";
86
+
87
+ const solved = cube3.createSolvedCube3State();
88
+ const moved = cube3.applyCube3Algorithm(solved, ["R", "U", "R'"]);
89
+ const state = cube3.generateRandomCube3State({ seed: "demo" });
90
+ const facelets = cube3.toCube3Facelets(state);
91
+ const faceletString = cube3.formatCube3Facelets(facelets);
92
+ const validation = cube3.validateCube3State(state);
93
+ ```
94
+
95
+ `generateRandomCube3State` returns a legal cube state, not a scramble sequence. It does not filter by visual appearance: blocks, repeated colors on a face, or recognizable patterns can still be valid if the cubie state is legal and non-trivial.
96
+
97
+ `toCube3Facelets` returns six faces with nine stickers each in row-major order. The face order is `U R F D L B`. `formatCube3Facelets` produces a stable 54-character string for logs, tests, or timer previews.
98
+
99
+ The `cube3.solver` namespace is exported for advanced tooling and validation. Normal consumers should prefer `generateScramble("333")`.
100
+
101
+ ## 4x4 Technical Module
102
+
103
+ ```ts
104
+ import { cube4 } from "@cubingcenter/scrambler";
105
+
106
+ const solved = cube4.createSolvedCube4State();
107
+ const moved = cube4.applyCube4Algorithm(solved, ["R", "Uw", "Rw'"]);
108
+ const state = cube4.generateRandomCube4State({ seed: 42 });
109
+ const reduced = cube4.areCentersReduced(state);
110
+ const paired = cube4.areWingsPaired(state);
111
+ ```
112
+
113
+ `Cube4State` uses `Uint8Array` for all piece arrays: 8 corners (cp/co), 24 wings (wp), and 24 centers.
114
+
115
+ Supported moves: `U D R L F B` (outer) and `Uw Dw Rw Lw Fw Bw` (wide), each with `'` and `2` suffixes.
116
+
117
+ The public `generateScramble("444")` path currently returns a reduced 4x4 random-state scramble: centers are solved, wings are paired, and the projected 3x3 state is random and solved with the existing two-phase solver. The full arbitrary center/wing random-state pipeline is being developed under `cube4.reduction`.
118
+
119
+ The `cube4.reduction` namespace is exported for advanced tooling. Normal consumers should prefer `generateScramble("444")`.
120
+
121
+ ## CLI
122
+
123
+ ```sh
124
+ cubingcenter-scrambler --help
125
+ cubingcenter-scrambler list
126
+ cubingcenter-scrambler 222 --count 5
127
+ cubingcenter-scrambler 222 --seed demo
128
+ cubingcenter-scrambler 222 --seed demo --json
129
+ cubingcenter-scrambler 333 --count 5
130
+ cubingcenter-scrambler 333 --seed demo
131
+ cubingcenter-scrambler 333 --seed demo --json
132
+ cubingcenter-scrambler 444 --count 3
133
+ ```
134
+
135
+ `list` prints registered events. `--json` prints structured output with `scramble`, `moves`, `facelets`, and `faceletString`.
136
+
137
+ When `--count` is used with `--seed`, each scramble derives a stable seed in the form `seed:index`. For example, `--seed demo --count 2` uses `demo:0` and `demo:1`.
138
+
139
+ ## Guides
140
+
141
+ - [Getting Started](docs/getting-started.md)
142
+ - [CubingCenter Integration](docs/cubingcenter-integration.md)
143
+ - [Facelets](docs/facelets.md)
144
+ - [Development](docs/development.md)
145
+
146
+ ## Examples
147
+
148
+ - [ESM import](examples/esm.mjs)
149
+ - [CommonJS require](examples/commonjs.cjs)
150
+ - [Timer preview mapping](examples/timer-preview.mjs)
151
+ - [CLI JSON shape](examples/cli-json.md)
152
+
153
+ ## Development
154
+
155
+ ```sh
156
+ pnpm install
157
+ pnpm lint
158
+ pnpm test
159
+ pnpm build
160
+ pnpm package:check
161
+ pnpm verify
162
+ ```
163
+
164
+ Solver tables are versioned as generated binary assets. If cube coordinates, moves, or pruning logic change, regenerate and check them:
165
+
166
+ ```sh
167
+ pnpm cube3:tables
168
+ pnpm cube3:tables:check
169
+ ```
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "./run.js";
3
+ async function main() {
4
+ const result = await runCli(process.argv.slice(2), {
5
+ stdout: (text) => process.stdout.write(text),
6
+ stderr: (text) => process.stderr.write(text)
7
+ });
8
+ process.exitCode = result.exitCode;
9
+ }
10
+ main();
@@ -0,0 +1,9 @@
1
+ export interface CliIO {
2
+ stdout: (text: string) => void;
3
+ stderr: (text: string) => void;
4
+ }
5
+ export interface CliResult {
6
+ exitCode: number;
7
+ }
8
+ export declare function runCli(argv: string[], io: CliIO): Promise<CliResult>;
9
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/cli/run.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAUD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAS1E"}
@@ -0,0 +1,139 @@
1
+ import { generateScrambles, getSupportedEvents, ScramblerError } from "../index.js";
2
+ export async function runCli(argv, io) {
3
+ try {
4
+ await run(parseArgs(argv), io);
5
+ return { exitCode: 0 };
6
+ }
7
+ catch (error) {
8
+ const message = error instanceof Error ? error.message : String(error);
9
+ io.stderr(`${message}\n`);
10
+ return { exitCode: error instanceof ScramblerError ? 2 : 1 };
11
+ }
12
+ }
13
+ async function run(cliArgs, io) {
14
+ if (cliArgs.help || !cliArgs.command) {
15
+ printHelp(io);
16
+ return;
17
+ }
18
+ if (cliArgs.command === "list") {
19
+ printEvents(io);
20
+ return;
21
+ }
22
+ const scrambles = await generateScrambles(cliArgs.command, cliArgs.count, {
23
+ ...(cliArgs.seed === undefined ? {} : { seed: cliArgs.seed })
24
+ });
25
+ if (cliArgs.json) {
26
+ printJson(scrambles, io);
27
+ return;
28
+ }
29
+ for (const result of scrambles) {
30
+ io.stdout(`${result.scramble}\n`);
31
+ }
32
+ }
33
+ function printJson(scrambles, io) {
34
+ const serialized = scrambles.map(serializeScramble);
35
+ const output = serialized.length === 1 ? serialized[0] : serialized;
36
+ io.stdout(`${JSON.stringify(output, null, 2)}\n`);
37
+ }
38
+ function serializeScramble(result) {
39
+ const metadata = result.metadata ?? {};
40
+ const serialized = {
41
+ eventId: result.eventId,
42
+ scramble: result.scramble,
43
+ moves: result.moves,
44
+ quality: result.quality,
45
+ generator: result.generator
46
+ };
47
+ if (result.seed !== undefined) {
48
+ serialized.seed = result.seed;
49
+ }
50
+ if ("facelets" in metadata) {
51
+ serialized.facelets = metadata.facelets;
52
+ }
53
+ if ("faceletString" in metadata) {
54
+ serialized.faceletString = metadata.faceletString;
55
+ }
56
+ return serialized;
57
+ }
58
+ function printEvents(io) {
59
+ const events = getSupportedEvents();
60
+ if (events.length === 0) {
61
+ io.stdout("No scramble events are registered yet.\n");
62
+ return;
63
+ }
64
+ for (const event of events) {
65
+ io.stdout(`${event.eventId}\t${event.name}\t${event.quality}\n`);
66
+ }
67
+ }
68
+ function printHelp(io) {
69
+ io.stdout(`Usage:
70
+ cubingcenter-scrambler --help
71
+ cubingcenter-scrambler list
72
+ cubingcenter-scrambler <eventId> [--count N] [--seed value] [--json]
73
+
74
+ Options:
75
+ --count, -c Number of scrambles to generate. Defaults to 1.
76
+ --seed, -s Seed value for reproducible generation when supported.
77
+ --json Print structured JSON with metadata when available.
78
+ --help, -h Show this help message.
79
+ `);
80
+ }
81
+ function parseArgs(argv) {
82
+ const parsed = {
83
+ count: 1,
84
+ help: false,
85
+ json: false
86
+ };
87
+ for (let index = 0; index < argv.length; index += 1) {
88
+ const value = argv[index];
89
+ if (value === undefined) {
90
+ continue;
91
+ }
92
+ if (value === "--help" || value === "-h") {
93
+ parsed.help = true;
94
+ continue;
95
+ }
96
+ if (value === "--json") {
97
+ parsed.json = true;
98
+ continue;
99
+ }
100
+ if (value === "--count" || value === "-c") {
101
+ parsed.count = parsePositiveInteger(readValue(argv, index, value));
102
+ index += 1;
103
+ continue;
104
+ }
105
+ if (value === "--seed" || value === "-s") {
106
+ parsed.seed = readValue(argv, index, value);
107
+ index += 1;
108
+ continue;
109
+ }
110
+ if (value.startsWith("--count=")) {
111
+ parsed.count = parsePositiveInteger(value.slice("--count=".length));
112
+ continue;
113
+ }
114
+ if (value.startsWith("--seed=")) {
115
+ parsed.seed = value.slice("--seed=".length);
116
+ continue;
117
+ }
118
+ if (!parsed.command) {
119
+ parsed.command = value;
120
+ continue;
121
+ }
122
+ throw new Error(`Unexpected argument: ${value}`);
123
+ }
124
+ return parsed;
125
+ }
126
+ function readValue(argv, index, flag) {
127
+ const value = argv[index + 1];
128
+ if (!value || value.startsWith("-")) {
129
+ throw new Error(`Missing value for ${flag}`);
130
+ }
131
+ return value;
132
+ }
133
+ function parsePositiveInteger(value) {
134
+ const count = Number(value);
135
+ if (!Number.isInteger(count) || count < 1) {
136
+ throw new Error(`Count must be a positive integer. Received: ${value}`);
137
+ }
138
+ return count;
139
+ }
@@ -0,0 +1,19 @@
1
+ import type { EventId, EventInfo, ScrambleGenerator, ScrambleOptions, ScrambleResult, ScramblerRegistry } from "./types.js";
2
+ /**
3
+ * Pre-load solver tables in browser environments.
4
+ * In Node.js this is a no-op (tables are read lazily from the filesystem).
5
+ *
6
+ * @param baseUrl - Base URL where the `puzzles/cube3/solver/generated/`
7
+ * assets are served. If omitted, defaults to the current document base URL
8
+ * or `"."`. In a Next.js app you typically copy the `.bin` files to
9
+ * `public/scrambler-tables/` and pass `"/scrambler-tables"`.
10
+ * @param eventId - Optional event ID to selectively load tables. If omitted,
11
+ * loads all standard tables.
12
+ */
13
+ export declare function initializeScrambler(baseUrl?: string, eventId?: EventId | string): Promise<void>;
14
+ export declare function registerScrambleGenerator(generator: ScrambleGenerator, registry?: ScramblerRegistry): void;
15
+ export declare function getSupportedEvents(registry?: ScramblerRegistry): EventInfo[];
16
+ export declare function getEventInfo(eventId: EventId, registry?: ScramblerRegistry): EventInfo;
17
+ export declare function generateScramble(eventId: EventId, options?: ScrambleOptions, registry?: ScramblerRegistry): Promise<ScrambleResult>;
18
+ export declare function generateScrambles(eventId: EventId, count: number, options?: ScrambleOptions, registry?: ScramblerRegistry): Promise<ScrambleResult[]>;
19
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/core/api.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBrG;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,GAAE,iBAAmC,GAC5C,IAAI,CAEN;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,iBAAmC,GAAG,SAAS,EAAE,CAE7F;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,QAAQ,GAAE,iBAAmC,GAC5C,SAAS,CAQX;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,eAAoB,EAC7B,QAAQ,GAAE,iBAAmC,GAC5C,OAAO,CAAC,cAAc,CAAC,CAiBzB;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,eAAoB,EAC7B,QAAQ,GAAE,iBAAmC,GAC5C,OAAO,CAAC,cAAc,EAAE,CAAC,CAU3B"}
@@ -0,0 +1,94 @@
1
+ import { GeneratorFailedError, InvalidCountError, UnsupportedEventError } from "./errors.js";
2
+ import { defaultRegistry } from "./registry.js";
3
+ import { loadBrowserTables as loadCube2BrowserTables } from "../puzzles/cube2/solver/browser-loader.js";
4
+ import { loadBrowserTables as loadCube3BrowserTables } from "../puzzles/cube3/solver/browser-loader.js";
5
+ /**
6
+ * Pre-load solver tables in browser environments.
7
+ * In Node.js this is a no-op (tables are read lazily from the filesystem).
8
+ *
9
+ * @param baseUrl - Base URL where the `puzzles/cube3/solver/generated/`
10
+ * assets are served. If omitted, defaults to the current document base URL
11
+ * or `"."`. In a Next.js app you typically copy the `.bin` files to
12
+ * `public/scrambler-tables/` and pass `"/scrambler-tables"`.
13
+ * @param eventId - Optional event ID to selectively load tables. If omitted,
14
+ * loads all standard tables.
15
+ */
16
+ export async function initializeScrambler(baseUrl, eventId) {
17
+ if (typeof self === "undefined") {
18
+ // Node.js — tables are loaded on-demand from the filesystem
19
+ return;
20
+ }
21
+ if (eventId === "222" || eventId === "222so") {
22
+ await loadCube2BrowserTables(baseUrl);
23
+ }
24
+ else if (eventId === "333") {
25
+ await loadCube3BrowserTables(baseUrl);
26
+ }
27
+ else if (!eventId) {
28
+ await Promise.all([
29
+ loadCube2BrowserTables(baseUrl),
30
+ loadCube3BrowserTables(baseUrl)
31
+ ]);
32
+ }
33
+ }
34
+ export function registerScrambleGenerator(generator, registry = defaultRegistry) {
35
+ registry.register(generator);
36
+ }
37
+ export function getSupportedEvents(registry = defaultRegistry) {
38
+ return registry.list();
39
+ }
40
+ export function getEventInfo(eventId, registry = defaultRegistry) {
41
+ const generator = registry.get(eventId);
42
+ if (!generator) {
43
+ throw new UnsupportedEventError(eventId);
44
+ }
45
+ return { ...generator.info };
46
+ }
47
+ export async function generateScramble(eventId, options = {}, registry = defaultRegistry) {
48
+ const generator = registry.get(eventId);
49
+ if (!generator) {
50
+ throw new UnsupportedEventError(eventId);
51
+ }
52
+ try {
53
+ const result = await generator.generate(options);
54
+ return normalizeResult(eventId, result, options);
55
+ }
56
+ catch (error) {
57
+ if (error instanceof Error && error.name.endsWith("Error")) {
58
+ throw error;
59
+ }
60
+ throw new GeneratorFailedError(eventId, error);
61
+ }
62
+ }
63
+ export async function generateScrambles(eventId, count, options = {}, registry = defaultRegistry) {
64
+ if (!Number.isInteger(count) || count < 1) {
65
+ throw new InvalidCountError(count);
66
+ }
67
+ return Promise.all(Array.from({ length: count }, (_, index) => (generateScramble(eventId, deriveBatchScrambleOptions(options, index, count), registry))));
68
+ }
69
+ function deriveBatchScrambleOptions(options, index, count) {
70
+ if (count === 1 || options.seed === undefined) {
71
+ return options;
72
+ }
73
+ return {
74
+ ...options,
75
+ seed: `${options.seed}:${index}`
76
+ };
77
+ }
78
+ function normalizeResult(requestedEventId, result, options) {
79
+ const moves = result.moves.length > 0 ? result.moves : splitMoves(result.scramble);
80
+ const seed = result.seed ?? options.seed;
81
+ const normalized = {
82
+ ...result,
83
+ eventId: result.eventId || requestedEventId,
84
+ moves
85
+ };
86
+ if (seed !== undefined) {
87
+ normalized.seed = seed;
88
+ }
89
+ return normalized;
90
+ }
91
+ function splitMoves(scramble) {
92
+ const trimmed = scramble.trim();
93
+ return trimmed.length === 0 ? [] : trimmed.split(/\s+/);
94
+ }
@@ -0,0 +1,21 @@
1
+ import type { EventId } from "./types.js";
2
+ export declare class ScramblerError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ export declare class UnsupportedEventError extends ScramblerError {
6
+ readonly eventId: EventId;
7
+ constructor(eventId: EventId);
8
+ }
9
+ export declare class InvalidCountError extends ScramblerError {
10
+ readonly count: number;
11
+ constructor(count: number);
12
+ }
13
+ export declare class InvalidOptionsError extends ScramblerError {
14
+ constructor(message: string);
15
+ }
16
+ export declare class GeneratorFailedError extends ScramblerError {
17
+ readonly eventId: EventId;
18
+ readonly cause: unknown;
19
+ constructor(eventId: EventId, cause: unknown);
20
+ }
21
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,qBAAsB,SAAQ,cAAc;IACvD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,OAAO,EAAE,OAAO;CAI7B;AAED,qBAAa,iBAAkB,SAAQ,cAAc;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,KAAK,EAAE,MAAM;CAI1B;AAED,qBAAa,mBAAoB,SAAQ,cAAc;gBACzC,OAAO,EAAE,MAAM;CAG5B;AAED,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;gBAEZ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;CAK7C"}
@@ -0,0 +1,34 @@
1
+ export class ScramblerError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = new.target.name;
5
+ }
6
+ }
7
+ export class UnsupportedEventError extends ScramblerError {
8
+ eventId;
9
+ constructor(eventId) {
10
+ super(`Unsupported scramble event: ${eventId}`);
11
+ this.eventId = eventId;
12
+ }
13
+ }
14
+ export class InvalidCountError extends ScramblerError {
15
+ count;
16
+ constructor(count) {
17
+ super(`Scramble count must be a positive integer. Received: ${count}`);
18
+ this.count = count;
19
+ }
20
+ }
21
+ export class InvalidOptionsError extends ScramblerError {
22
+ constructor(message) {
23
+ super(message);
24
+ }
25
+ }
26
+ export class GeneratorFailedError extends ScramblerError {
27
+ eventId;
28
+ cause;
29
+ constructor(eventId, cause) {
30
+ super(`Scramble generator failed for event: ${eventId}`);
31
+ this.eventId = eventId;
32
+ this.cause = cause;
33
+ }
34
+ }
@@ -0,0 +1,5 @@
1
+ export { GeneratorFailedError, InvalidCountError, InvalidOptionsError, ScramblerError, UnsupportedEventError } from "./errors.js";
2
+ export { DefaultScramblerRegistry, defaultRegistry } from "./registry.js";
3
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler, registerScrambleGenerator } from "./api.js";
4
+ export type { EventId, EventInfo, ScrambleGenerator, ScrambleOptions, ScrambleQuality, ScrambleResult, ScramblerRegistry } from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,eAAe,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EAC1B,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { GeneratorFailedError, InvalidCountError, InvalidOptionsError, ScramblerError, UnsupportedEventError } from "./errors.js";
2
+ export { DefaultScramblerRegistry, defaultRegistry } from "./registry.js";
3
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler, registerScrambleGenerator } from "./api.js";
@@ -0,0 +1,10 @@
1
+ import type { EventId, EventInfo, ScrambleGenerator, ScramblerRegistry } from "./types.js";
2
+ export declare class DefaultScramblerRegistry implements ScramblerRegistry {
3
+ private readonly generators;
4
+ register(generator: ScrambleGenerator): void;
5
+ get(eventId: EventId): ScrambleGenerator | undefined;
6
+ has(eventId: EventId): boolean;
7
+ list(): EventInfo[];
8
+ }
9
+ export declare const defaultRegistry: DefaultScramblerRegistry;
10
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG3F,qBAAa,wBAAyB,YAAW,iBAAiB;IAChE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IAEpE,QAAQ,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAK5C,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS;IAIpD,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAI9B,IAAI,IAAI,SAAS,EAAE;CAKpB;AAED,eAAO,MAAM,eAAe,0BAAiC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { InvalidOptionsError } from "./errors.js";
2
+ export class DefaultScramblerRegistry {
3
+ generators = new Map();
4
+ register(generator) {
5
+ validateGenerator(generator);
6
+ this.generators.set(generator.info.eventId, generator);
7
+ }
8
+ get(eventId) {
9
+ return this.generators.get(eventId);
10
+ }
11
+ has(eventId) {
12
+ return this.generators.has(eventId);
13
+ }
14
+ list() {
15
+ return Array.from(this.generators.values())
16
+ .map((generator) => ({ ...generator.info }))
17
+ .sort((left, right) => left.eventId.localeCompare(right.eventId));
18
+ }
19
+ }
20
+ export const defaultRegistry = new DefaultScramblerRegistry();
21
+ function validateGenerator(generator) {
22
+ const { info } = generator;
23
+ if (!info.eventId.trim()) {
24
+ throw new InvalidOptionsError("Scramble generator eventId cannot be empty.");
25
+ }
26
+ if (!info.name.trim()) {
27
+ throw new InvalidOptionsError(`Scramble generator ${info.eventId} must have a name.`);
28
+ }
29
+ if (!info.puzzle.trim()) {
30
+ throw new InvalidOptionsError(`Scramble generator ${info.eventId} must have a puzzle name.`);
31
+ }
32
+ if (!info.generator.trim()) {
33
+ throw new InvalidOptionsError(`Scramble generator ${info.eventId} must have a generator id.`);
34
+ }
35
+ }
@@ -0,0 +1,34 @@
1
+ export type EventId = string;
2
+ export type ScrambleQuality = "random-state" | "random-move" | "training" | "placeholder";
3
+ export interface ScrambleOptions {
4
+ seed?: string | number;
5
+ metadata?: Record<string, unknown>;
6
+ }
7
+ export interface ScrambleResult {
8
+ eventId: EventId;
9
+ scramble: string;
10
+ moves: string[];
11
+ quality: ScrambleQuality;
12
+ generator: string;
13
+ seed?: string | number;
14
+ metadata?: Record<string, unknown>;
15
+ }
16
+ export interface EventInfo {
17
+ eventId: EventId;
18
+ name: string;
19
+ puzzle: string;
20
+ quality: ScrambleQuality;
21
+ generator: string;
22
+ description?: string;
23
+ }
24
+ export interface ScrambleGenerator {
25
+ info: EventInfo;
26
+ generate(options?: ScrambleOptions): ScrambleResult | Promise<ScrambleResult>;
27
+ }
28
+ export interface ScramblerRegistry {
29
+ register(generator: ScrambleGenerator): void;
30
+ get(eventId: EventId): ScrambleGenerator | undefined;
31
+ list(): EventInfo[];
32
+ has(eventId: EventId): boolean;
33
+ }
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,aAAa,GACb,UAAU,GACV,aAAa,CAAC;AAElB,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAAC;IACrD,IAAI,IAAI,SAAS,EAAE,CAAC;IACpB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;CAChC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export * from "./core/index.js";
2
+ export * from "./puzzles/index.js";
3
+ export * from "./random/index.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./core/index.js";
2
+ export * from "./puzzles/index.js";
3
+ export * from "./random/index.js";
@@ -0,0 +1,2 @@
1
+ export { clockScrambleGenerator, generateClockScramble } from "./scrambler.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/clock/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ export { clockScrambleGenerator, generateClockScramble } from "./scrambler.js";
@@ -0,0 +1,4 @@
1
+ import type { ScrambleGenerator, ScrambleOptions, ScrambleResult } from "../../core/index.js";
2
+ export declare const clockScrambleGenerator: ScrambleGenerator;
3
+ export declare function generateClockScramble(options?: ScrambleOptions): Promise<ScrambleResult>;
4
+ //# sourceMappingURL=scrambler.d.ts.map