@cubingcenter/scrambler 0.4.0 → 0.5.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 (174) hide show
  1. package/README.md +67 -3
  2. package/dist/core/api.d.ts.map +1 -1
  3. package/dist/core/api.js +18 -6
  4. package/dist/core/index.d.ts +1 -1
  5. package/dist/core/index.d.ts.map +1 -1
  6. package/dist/core/types.d.ts +7 -0
  7. package/dist/core/types.d.ts.map +1 -1
  8. package/dist/puzzles/clock/index.d.ts +1 -0
  9. package/dist/puzzles/clock/index.d.ts.map +1 -1
  10. package/dist/puzzles/clock/index.js +4 -0
  11. package/dist/puzzles/cube2/index.d.ts +1 -0
  12. package/dist/puzzles/cube2/index.d.ts.map +1 -1
  13. package/dist/puzzles/cube2/index.js +4 -0
  14. package/dist/puzzles/cube2/scrambler.d.ts.map +1 -1
  15. package/dist/puzzles/cube2/scrambler.js +4 -6
  16. package/dist/puzzles/cube2/solver/browser-loader.d.ts.map +1 -1
  17. package/dist/puzzles/cube2/solver/browser-loader.js +4 -12
  18. package/dist/puzzles/cube2/solver/index.d.ts +1 -1
  19. package/dist/puzzles/cube2/solver/index.d.ts.map +1 -1
  20. package/dist/puzzles/cube2/solver/index.js +1 -1
  21. package/dist/puzzles/cube2/solver/search.d.ts +2 -0
  22. package/dist/puzzles/cube2/solver/search.d.ts.map +1 -1
  23. package/dist/puzzles/cube2/solver/search.js +26 -0
  24. package/dist/puzzles/cube2/validation.d.ts.map +1 -1
  25. package/dist/puzzles/cube2/validation.js +15 -3
  26. package/dist/puzzles/cube3/index.d.ts +1 -0
  27. package/dist/puzzles/cube3/index.d.ts.map +1 -1
  28. package/dist/puzzles/cube3/index.js +4 -0
  29. package/dist/puzzles/cube3/solver/browser-loader.d.ts.map +1 -1
  30. package/dist/puzzles/cube3/solver/browser-loader.js +5 -29
  31. package/dist/puzzles/cube4/index.d.ts +1 -0
  32. package/dist/puzzles/cube4/index.d.ts.map +1 -1
  33. package/dist/puzzles/cube4/index.js +4 -0
  34. package/dist/puzzles/cube5x5/index.d.ts +1 -0
  35. package/dist/puzzles/cube5x5/index.d.ts.map +1 -1
  36. package/dist/puzzles/cube5x5/index.js +4 -0
  37. package/dist/puzzles/cube6x6/index.d.ts +1 -0
  38. package/dist/puzzles/cube6x6/index.d.ts.map +1 -1
  39. package/dist/puzzles/cube6x6/index.js +4 -0
  40. package/dist/puzzles/cube7x7/index.d.ts +1 -0
  41. package/dist/puzzles/cube7x7/index.d.ts.map +1 -1
  42. package/dist/puzzles/cube7x7/index.js +4 -0
  43. package/dist/puzzles/megaminx/index.d.ts +1 -0
  44. package/dist/puzzles/megaminx/index.d.ts.map +1 -1
  45. package/dist/puzzles/megaminx/index.js +4 -0
  46. package/dist/puzzles/pyraminx/index.d.ts +3 -1
  47. package/dist/puzzles/pyraminx/index.d.ts.map +1 -1
  48. package/dist/puzzles/pyraminx/index.js +6 -1
  49. package/dist/puzzles/pyraminx/scrambler.d.ts.map +1 -1
  50. package/dist/puzzles/pyraminx/scrambler.js +24 -20
  51. package/dist/puzzles/pyraminx/solver/browser-loader.d.ts +14 -0
  52. package/dist/puzzles/pyraminx/solver/browser-loader.d.ts.map +1 -0
  53. package/dist/puzzles/pyraminx/solver/browser-loader.js +63 -0
  54. package/dist/puzzles/pyraminx/solver/generated/centers-table.bin +0 -0
  55. package/dist/puzzles/pyraminx/solver/generated/manifest.json +26 -0
  56. package/dist/puzzles/pyraminx/solver/generated/orientation-table.bin +0 -0
  57. package/dist/puzzles/pyraminx/solver/generated/permutation-table.bin +0 -0
  58. package/dist/puzzles/pyraminx/solver/generated/policy.bin +0 -0
  59. package/dist/puzzles/pyraminx/solver/generated-assets.d.ts +7 -0
  60. package/dist/puzzles/pyraminx/solver/generated-assets.d.ts.map +1 -0
  61. package/dist/puzzles/pyraminx/solver/generated-assets.js +24 -0
  62. package/dist/puzzles/pyraminx/solver/index.d.ts +5 -0
  63. package/dist/puzzles/pyraminx/solver/index.d.ts.map +1 -0
  64. package/dist/puzzles/pyraminx/solver/index.js +4 -0
  65. package/dist/puzzles/pyraminx/solver/node-loader.d.ts +7 -0
  66. package/dist/puzzles/pyraminx/solver/node-loader.d.ts.map +1 -0
  67. package/dist/puzzles/pyraminx/solver/node-loader.js +73 -0
  68. package/dist/puzzles/pyraminx/solver/search.d.ts +10 -0
  69. package/dist/puzzles/pyraminx/solver/search.d.ts.map +1 -0
  70. package/dist/puzzles/pyraminx/solver/search.js +82 -0
  71. package/dist/puzzles/pyraminx/solver/table-metadata.d.ts +20 -0
  72. package/dist/puzzles/pyraminx/solver/table-metadata.d.ts.map +1 -0
  73. package/dist/puzzles/pyraminx/solver/table-metadata.js +19 -0
  74. package/dist/puzzles/pyraminx/solver/tables.d.ts +43 -0
  75. package/dist/puzzles/pyraminx/solver/tables.d.ts.map +1 -0
  76. package/dist/puzzles/pyraminx/solver/tables.js +300 -0
  77. package/dist/puzzles/shared/compressed-fetch.d.ts +12 -0
  78. package/dist/puzzles/shared/compressed-fetch.d.ts.map +1 -0
  79. package/dist/puzzles/shared/compressed-fetch.js +68 -0
  80. package/dist/puzzles/skewb/facelets.d.ts.map +1 -1
  81. package/dist/puzzles/skewb/facelets.js +46 -23
  82. package/dist/puzzles/skewb/index.d.ts +3 -1
  83. package/dist/puzzles/skewb/index.d.ts.map +1 -1
  84. package/dist/puzzles/skewb/index.js +6 -1
  85. package/dist/puzzles/skewb/random-state.d.ts +1 -1
  86. package/dist/puzzles/skewb/random-state.d.ts.map +1 -1
  87. package/dist/puzzles/skewb/random-state.js +25 -18
  88. package/dist/puzzles/skewb/scrambler.d.ts.map +1 -1
  89. package/dist/puzzles/skewb/scrambler.js +10 -13
  90. package/dist/puzzles/skewb/solver/browser-loader.d.ts +20 -0
  91. package/dist/puzzles/skewb/solver/browser-loader.d.ts.map +1 -0
  92. package/dist/puzzles/skewb/solver/browser-loader.js +86 -0
  93. package/dist/puzzles/skewb/solver/generated/centers-table.bin +0 -0
  94. package/dist/puzzles/skewb/solver/generated/helpers.bin +0 -0
  95. package/dist/puzzles/skewb/solver/generated/manifest.json +31 -0
  96. package/dist/puzzles/skewb/solver/generated/orientation-table.bin +0 -0
  97. package/dist/puzzles/skewb/solver/generated/permutation-table.bin +0 -0
  98. package/dist/puzzles/skewb/solver/generated/policy.bin +0 -0
  99. package/dist/puzzles/skewb/solver/generated-assets.d.ts +10 -0
  100. package/dist/puzzles/skewb/solver/generated-assets.d.ts.map +1 -0
  101. package/dist/puzzles/skewb/solver/generated-assets.js +24 -0
  102. package/dist/puzzles/skewb/solver/index.d.ts +5 -0
  103. package/dist/puzzles/skewb/solver/index.d.ts.map +1 -0
  104. package/dist/puzzles/skewb/solver/index.js +4 -0
  105. package/dist/puzzles/skewb/solver/node-loader.d.ts +10 -0
  106. package/dist/puzzles/skewb/solver/node-loader.d.ts.map +1 -0
  107. package/dist/puzzles/skewb/solver/node-loader.js +91 -0
  108. package/dist/puzzles/skewb/solver/search.d.ts +11 -0
  109. package/dist/puzzles/skewb/solver/search.d.ts.map +1 -0
  110. package/dist/puzzles/skewb/solver/search.js +80 -0
  111. package/dist/puzzles/skewb/solver/table-metadata.d.ts +27 -0
  112. package/dist/puzzles/skewb/solver/table-metadata.d.ts.map +1 -0
  113. package/dist/puzzles/skewb/solver/table-metadata.js +26 -0
  114. package/dist/puzzles/skewb/solver/tables.d.ts +68 -0
  115. package/dist/puzzles/skewb/solver/tables.d.ts.map +1 -0
  116. package/dist/puzzles/skewb/solver/tables.js +508 -0
  117. package/dist/random/prng.js +10 -1
  118. package/dist-cjs/core/api.js +51 -6
  119. package/dist-cjs/puzzles/clock/index.js +13 -4
  120. package/dist-cjs/puzzles/cube2/index.js +13 -4
  121. package/dist-cjs/puzzles/cube2/scrambler.js +2 -4
  122. package/dist-cjs/puzzles/cube2/solver/browser-loader.js +4 -12
  123. package/dist-cjs/puzzles/cube2/solver/index.js +3 -1
  124. package/dist-cjs/puzzles/cube2/solver/search.js +28 -0
  125. package/dist-cjs/puzzles/cube2/validation.js +14 -2
  126. package/dist-cjs/puzzles/cube3/index.js +13 -4
  127. package/dist-cjs/puzzles/cube3/solver/browser-loader.js +5 -29
  128. package/dist-cjs/puzzles/cube4/index.js +13 -4
  129. package/dist-cjs/puzzles/cube5x5/index.js +13 -4
  130. package/dist-cjs/puzzles/cube6x6/index.js +13 -4
  131. package/dist-cjs/puzzles/cube7x7/index.js +13 -4
  132. package/dist-cjs/puzzles/megaminx/index.js +13 -4
  133. package/dist-cjs/puzzles/pyraminx/index.js +50 -6
  134. package/dist-cjs/puzzles/pyraminx/scrambler.js +23 -19
  135. package/dist-cjs/puzzles/pyraminx/solver/browser-loader.js +68 -0
  136. package/dist-cjs/puzzles/pyraminx/solver/generated/centers-table.bin +0 -0
  137. package/dist-cjs/puzzles/pyraminx/solver/generated/manifest.json +26 -0
  138. package/dist-cjs/puzzles/pyraminx/solver/generated/orientation-table.bin +0 -0
  139. package/dist-cjs/puzzles/pyraminx/solver/generated/permutation-table.bin +0 -0
  140. package/dist-cjs/puzzles/pyraminx/solver/generated/policy.bin +0 -0
  141. package/dist-cjs/puzzles/pyraminx/solver/generated-assets.js +60 -0
  142. package/dist-cjs/puzzles/pyraminx/solver/index.js +23 -0
  143. package/dist-cjs/puzzles/pyraminx/solver/node-loader.js +79 -0
  144. package/dist-cjs/puzzles/pyraminx/solver/search.js +88 -0
  145. package/dist-cjs/puzzles/pyraminx/solver/table-metadata.js +22 -0
  146. package/dist-cjs/puzzles/pyraminx/solver/tables.js +327 -0
  147. package/dist-cjs/puzzles/shared/compressed-fetch.js +71 -0
  148. package/dist-cjs/puzzles/skewb/facelets.js +46 -23
  149. package/dist-cjs/puzzles/skewb/index.js +55 -8
  150. package/dist-cjs/puzzles/skewb/random-state.js +25 -18
  151. package/dist-cjs/puzzles/skewb/scrambler.js +9 -12
  152. package/dist-cjs/puzzles/skewb/solver/browser-loader.js +91 -0
  153. package/dist-cjs/puzzles/skewb/solver/generated/centers-table.bin +0 -0
  154. package/dist-cjs/puzzles/skewb/solver/generated/helpers.bin +0 -0
  155. package/dist-cjs/puzzles/skewb/solver/generated/manifest.json +31 -0
  156. package/dist-cjs/puzzles/skewb/solver/generated/orientation-table.bin +0 -0
  157. package/dist-cjs/puzzles/skewb/solver/generated/permutation-table.bin +0 -0
  158. package/dist-cjs/puzzles/skewb/solver/generated/policy.bin +0 -0
  159. package/dist-cjs/puzzles/skewb/solver/generated-assets.js +60 -0
  160. package/dist-cjs/puzzles/skewb/solver/index.js +23 -0
  161. package/dist-cjs/puzzles/skewb/solver/node-loader.js +97 -0
  162. package/dist-cjs/puzzles/skewb/solver/search.js +87 -0
  163. package/dist-cjs/puzzles/skewb/solver/table-metadata.js +29 -0
  164. package/dist-cjs/puzzles/skewb/solver/tables.js +539 -0
  165. package/dist-cjs/random/prng.js +10 -1
  166. package/package.json +20 -6
  167. package/dist/puzzles/pyraminx/solver.d.ts +0 -10
  168. package/dist/puzzles/pyraminx/solver.d.ts.map +0 -1
  169. package/dist/puzzles/pyraminx/solver.js +0 -160
  170. package/dist/puzzles/skewb/solver.d.ts +0 -11
  171. package/dist/puzzles/skewb/solver.d.ts.map +0 -1
  172. package/dist/puzzles/skewb/solver.js +0 -149
  173. package/dist-cjs/puzzles/pyraminx/solver.js +0 -170
  174. package/dist-cjs/puzzles/skewb/solver.js +0 -160
package/README.md CHANGED
@@ -10,10 +10,12 @@ The package currently ships random-state scramblers for `222` (2x2x2), `333` (3x
10
10
  - Runtime: Node.js
11
11
  - Language: TypeScript
12
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
13
+ - Registered events: `222`, `333`, `444`, `555`, `666`, `777`, `pymx`, `skwb`, `clck`, `mgmx`
14
+ - Main technical modules: `cube2`, `cube3`, `cube4`, `pyraminx`, `skewb`, `clock`, `megaminx`, `cube5x5`, `cube6x6`, `cube7x7`
15
+ - 2x2 quality: random-state target + optimal table-guided solver + verified scramble inversion
16
16
  - 3x3 quality: random-state target + two-phase solver + verified scramble inversion
17
+ - Pyraminx quality: random-state target + optimal policy-table solver (all 933,120 core states verified)
18
+ - Skewb quality: random-state target + optimal policy-table solver (all 3,149,280 states; exact uniform sampling)
17
19
  - 4x4 quality: reduced 4x4 random-state target + existing 3x3 two-phase finish; full center/wing random-state reduction is isolated under `cube4.reduction`
18
20
 
19
21
  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.
@@ -60,6 +62,28 @@ console.log(batch.map((item) => item.scramble));
60
62
 
61
63
  `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
64
 
65
+ `generateScramble("pymx")` returns a legal random-state Pyraminx scramble. Its metadata includes the target state, facelets, solution moves and depth. Pyraminx/2x2/3x3 accept `{ skipValidation: true }` to skip the per-call verification for maximum throughput (the scramble correctness is covered by exhaustive tests).
66
+
67
+ ## Scoped imports (web / smaller bundles)
68
+
69
+ Importing the root entry loads every puzzle. For web apps, import only the
70
+ puzzle you need — each subpath registers its own generator, so
71
+ `generateScramble` works right away:
72
+
73
+ ```ts
74
+ import { generateScramble, initializeScrambler } from "@cubingcenter/scrambler/puzzles/pyraminx";
75
+ // "222" | "333" | "444" | "555" | "666" | "777" | "pymx" | "skwb" | "clck" | "mgmx"
76
+ await initializeScrambler("/scrambler-tables", "pymx");
77
+ const result = await generateScramble("pymx", { seed: "demo" });
78
+ ```
79
+
80
+ In the browser, solver tables are fetched from the base URL you pass to
81
+ `initializeScrambler` and served from `puzzles/<puzzle>/solver/generated/`.
82
+ The demo repo ships precompressed `.br`/`.gz` variants of the tables (see
83
+ `pnpm tables:web:sync`); the loaders download those automatically when
84
+ `DecompressionStream` is available (Pyraminx ~470 KB → ~345 KB, cube3
85
+ ~6.6 MB → ~2.2 MB).
86
+
63
87
  ## 2x2 Technical Module
64
88
 
65
89
  ```ts
@@ -98,6 +122,46 @@ const validation = cube3.validateCube3State(state);
98
122
 
99
123
  The `cube3.solver` namespace is exported for advanced tooling and validation. Normal consumers should prefer `generateScramble("333")`.
100
124
 
125
+ ## Pyraminx Technical Module
126
+
127
+ ```ts
128
+ import { pyraminx } from "@cubingcenter/scrambler";
129
+
130
+ const solved = pyraminx.createSolvedPyraminxState();
131
+ const moved = pyraminx.applyPyraminxAlgorithm(solved, ["R", "U", "R'"]);
132
+ const state = pyraminx.generateRandomPyraminxState({ seed: "demo" });
133
+ const facelets = pyraminx.toPyraminxFacelets(state);
134
+ const faceletString = pyraminx.formatPyraminxFacelets(facelets);
135
+ const validation = pyraminx.validatePyraminxState(state);
136
+ const solution = await pyraminx.solvePyraminx(state); // optimal, policy-table based
137
+ ```
138
+
139
+ `generateRandomPyraminxState` returns a legal random state (centers, edges and tips), not a scramble sequence.
140
+
141
+ `toPyraminxFacelets` returns four triangular faces (`F L R D`) with nine stickers each. `formatPyraminxFacelets` produces a stable 36-character string.
142
+
143
+ The solver only covers the core (centers + edges); tips are appended by the scrambler. The `pyraminx.solver` namespace exposes the compact coordinates and the policy table; its optimality is verified exhaustively over all 933,120 core states (`pnpm verify:pyraminx:exhaustive`). Normal consumers should prefer `generateScramble("pymx")`.
144
+
145
+ ## Skewb Technical Module
146
+
147
+ ```ts
148
+ import { skewb } from "@cubingcenter/scrambler";
149
+
150
+ const solved = skewb.createSolvedSkewbState();
151
+ const moved = skewb.applySkewbAlgorithm(solved, ["R", "U", "R'"]);
152
+ const state = await skewb.generateRandomSkewbState({ seed: "demo" });
153
+ const facelets = skewb.toSkewbFacelets(state);
154
+ const faceletString = skewb.formatSkewbFacelets(facelets);
155
+ const validation = skewb.validateSkewbState(state);
156
+ const solution = await skewb.solveSkewb(state); // optimal, policy-table based
157
+ ```
158
+
159
+ `generateRandomSkewbState` returns a legal random state, not a scramble sequence. It samples the compact group rank uniformly, so every one of the 3,149,280 reachable states is exactly as likely as any other.
160
+
161
+ `toSkewbFacelets` returns six faces with five stickers each. `formatSkewbFacelets` produces a stable 30-character string.
162
+
163
+ Both `generateRandomSkewbState` and `solveSkewb` are async: they need the solver tables, which load lazily in Node and are prefetched in the browser via `initializeScrambler(baseUrl, "skwb")` (or `skewb.solveSkewbSync` after preloading). The `skewb.solver` namespace exposes the compact rank coordinates and the 3-bit policy table (all 3,149,280 states, God's number 11). Normal consumers should prefer `generateScramble("skwb")`.
164
+
101
165
  ## 4x4 Technical Module
102
166
 
103
167
  ```ts
@@ -1 +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"}
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;AAEpB;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BrG;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"}
package/dist/core/api.js CHANGED
@@ -1,7 +1,5 @@
1
1
  import { GeneratorFailedError, InvalidCountError, UnsupportedEventError } from "./errors.js";
2
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
3
  /**
6
4
  * Pre-load solver tables in browser environments.
7
5
  * In Node.js this is a no-op (tables are read lazily from the filesystem).
@@ -18,16 +16,30 @@ export async function initializeScrambler(baseUrl, eventId) {
18
16
  // Node.js — tables are loaded on-demand from the filesystem
19
17
  return;
20
18
  }
19
+ // Lazy imports keep per-puzzle subpath bundles from pulling in the
20
+ // loaders of every other puzzle.
21
21
  if (eventId === "222" || eventId === "222so") {
22
- await loadCube2BrowserTables(baseUrl);
22
+ const { loadBrowserTables } = await import("../puzzles/cube2/solver/browser-loader.js");
23
+ await loadBrowserTables(baseUrl);
23
24
  }
24
25
  else if (eventId === "333") {
25
- await loadCube3BrowserTables(baseUrl);
26
+ const { loadBrowserTables } = await import("../puzzles/cube3/solver/browser-loader.js");
27
+ await loadBrowserTables(baseUrl);
28
+ }
29
+ else if (eventId === "pymx") {
30
+ const { loadBrowserTables } = await import("../puzzles/pyraminx/solver/browser-loader.js");
31
+ await loadBrowserTables(baseUrl);
32
+ }
33
+ else if (eventId === "skwb") {
34
+ const { loadBrowserTables } = await import("../puzzles/skewb/solver/browser-loader.js");
35
+ await loadBrowserTables(baseUrl);
26
36
  }
27
37
  else if (!eventId) {
28
38
  await Promise.all([
29
- loadCube2BrowserTables(baseUrl),
30
- loadCube3BrowserTables(baseUrl)
39
+ import("../puzzles/cube2/solver/browser-loader.js").then((m) => m.loadBrowserTables(baseUrl)),
40
+ import("../puzzles/cube3/solver/browser-loader.js").then((m) => m.loadBrowserTables(baseUrl)),
41
+ import("../puzzles/pyraminx/solver/browser-loader.js").then((m) => m.loadBrowserTables(baseUrl)),
42
+ import("../puzzles/skewb/solver/browser-loader.js").then((m) => m.loadBrowserTables(baseUrl))
31
43
  ]);
32
44
  }
33
45
  }
@@ -1,5 +1,5 @@
1
1
  export { GeneratorFailedError, InvalidCountError, InvalidOptionsError, ScramblerError, UnsupportedEventError } from "./errors.js";
2
2
  export { DefaultScramblerRegistry, defaultRegistry } from "./registry.js";
3
3
  export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler, registerScrambleGenerator } from "./api.js";
4
- export type { EventId, EventInfo, ScrambleGenerator, ScrambleOptions, ScrambleQuality, ScrambleResult, ScramblerRegistry } from "./types.js";
4
+ export type { EventId, EventInfo, ScrambleGenerator, ScrambleOptions, ScrambleQuality, ScrambleResult, ScramblerRegistry, SupportedEventId } from "./types.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
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,EACjB,gBAAgB,EACjB,MAAM,YAAY,CAAC"}
@@ -1,8 +1,15 @@
1
1
  export type EventId = string;
2
+ export type SupportedEventId = "222" | "333" | "444" | "555" | "666" | "777" | "pymx" | "skwb" | "clck" | "mgmx";
2
3
  export type ScrambleQuality = "random-state" | "random-move" | "training" | "placeholder";
3
4
  export interface ScrambleOptions {
4
5
  seed?: string | number;
5
6
  metadata?: Record<string, unknown>;
7
+ /**
8
+ * Skips the internal "scramble reproduces the target state" verification.
9
+ * The scramblers are verified exhaustively by the test suite, so this is
10
+ * safe to enable for maximum throughput; it trades a safety net for speed.
11
+ */
12
+ skipValidation?: boolean;
6
13
  }
7
14
  export interface ScrambleResult {
8
15
  eventId: EventId;
@@ -1 +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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAG7B,MAAM,MAAM,gBAAgB,GACxB,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,MAAM,GACN,MAAM,GACN,MAAM,GACN,MAAM,CAAC;AAEX,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;IACnC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;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"}
@@ -1,2 +1,3 @@
1
1
  export { clockScrambleGenerator, generateClockScramble } from "./scrambler.js";
2
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/clock/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC"}
@@ -1 +1,5 @@
1
+ import { registerScrambleGenerator } from "../../core/index.js";
2
+ import { clockScrambleGenerator } from "./scrambler.js";
3
+ registerScrambleGenerator(clockScrambleGenerator);
1
4
  export { clockScrambleGenerator, generateClockScramble } from "./scrambler.js";
5
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
@@ -7,4 +7,5 @@ export { generateRandomCube2State } from "./random-state.js";
7
7
  export { cube2ScrambleGenerator, generateCube2Scramble } from "./scrambler.js";
8
8
  export { formatCube2Facelets, getCube2FaceOrder, toCube2Facelets } from "./facelets.js";
9
9
  export * as solver from "./solver/index.js";
10
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,UAAU,EACV,qBAAqB,EACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,UAAU,EACV,qBAAqB,EACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC"}
@@ -1,3 +1,6 @@
1
+ import { registerScrambleGenerator } from "../../core/index.js";
2
+ import { cube2ScrambleGenerator } from "./scrambler.js";
3
+ registerScrambleGenerator(cube2ScrambleGenerator);
1
4
  export { CUBE2_MOVES, CORNER_COUNT } from "./types.js";
2
5
  export { applyCube2Algorithm, applyCube2Move, formatCube2Algorithm, invertCube2Algorithm, invertCube2Move, parseCube2Algorithm, parseCube2Move } from "./moves.js";
3
6
  export { cloneCube2State, createSolvedCube2State, cube2StatesEqual, isSolvedCube2State } from "./state.js";
@@ -6,3 +9,4 @@ export { generateRandomCube2State } from "./random-state.js";
6
9
  export { cube2ScrambleGenerator, generateCube2Scramble } from "./scrambler.js";
7
10
  export { formatCube2Facelets, getCube2FaceOrder, toCube2Facelets } from "./facelets.js";
8
11
  export * as solver from "./solver/index.js";
12
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"scrambler.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/scrambler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAW9F,eAAO,MAAM,sBAAsB,EAAE,iBAYpC,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,eAAe,GAAG;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3D,OAAO,CAAC,cAAc,CAAC,CA0CzB"}
1
+ {"version":3,"file":"scrambler.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/scrambler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAS9F,eAAO,MAAM,sBAAsB,EAAE,iBAYpC,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,eAAe,GAAG;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3D,OAAO,CAAC,cAAc,CAAC,CAwCzB"}
@@ -1,8 +1,7 @@
1
- import { applyCube2Algorithm, formatCube2Algorithm, invertCube2Algorithm } from "./moves.js";
1
+ import { formatCube2Algorithm, invertCube2Algorithm } from "./moves.js";
2
2
  import { generateRandomCube2State } from "./random-state.js";
3
- import { createSolvedCube2State, cube2StatesEqual, isSolvedCube2State } from "./state.js";
4
3
  import { formatCube2Facelets, toCube2Facelets } from "./facelets.js";
5
- import { solveCube2State } from "./solver/index.js";
4
+ import { solveCube2State, verifyCube2Scramble, verifyCube2Solution } from "./solver/index.js";
6
5
  export const cube2ScrambleGenerator = {
7
6
  info: {
8
7
  eventId: "222",
@@ -21,11 +20,10 @@ export async function generateCube2Scramble(options = {}) {
21
20
  const solution = await solveCube2State(state);
22
21
  const scrambleMoves = invertCube2Algorithm(solution.moves);
23
22
  if (!options.skipValidation) {
24
- const scrambledState = applyCube2Algorithm(createSolvedCube2State(), scrambleMoves);
25
- if (!cube2StatesEqual(scrambledState, state)) {
23
+ if (!verifyCube2Scramble(state, scrambleMoves)) {
26
24
  throw new Error("Generated 2x2 scramble does not reproduce the target random state.");
27
25
  }
28
- if (!isSolvedCube2State(solution.state)) {
26
+ if (!verifyCube2Solution(state, solution.moves)) {
29
27
  throw new Error("Generated 2x2 solution does not solve the target random state.");
30
28
  }
31
29
  if (scrambleMoves.length < 2) {
@@ -1 +1 @@
1
- {"version":3,"file":"browser-loader.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/browser-loader.ts"],"names":[],"mappings":"AAQA,wBAAgB,sBAAsB;sBALlB,WAAW;sBACX,WAAW;eAClB,UAAU;cAKtB;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjE,gBAAgB,EAAE,WAAW,CAAC;IAC9B,gBAAgB,EAAE,WAAW,CAAC;IAC9B,SAAS,EAAE,UAAU,CAAC;CACvB,CAAC,CAqBD"}
1
+ {"version":3,"file":"browser-loader.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/browser-loader.ts"],"names":[],"mappings":"AAWA,wBAAgB,sBAAsB;sBALlB,WAAW;sBACX,WAAW;eAClB,UAAU;cAKtB;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjE,gBAAgB,EAAE,WAAW,CAAC;IAC9B,gBAAgB,EAAE,WAAW,CAAC;IAC9B,SAAS,EAAE,UAAU,CAAC;CACvB,CAAC,CAqBD"}
@@ -1,4 +1,6 @@
1
1
  import { CUBE2_SOLVER_TABLE_METADATA } from "./table-metadata.js";
2
+ import { fetchTableBuffer } from "../../shared/compressed-fetch.js";
3
+ const TABLES_DIR = "puzzles/cube2/solver/generated";
2
4
  let cachedBrowserTables;
3
5
  export function getCachedBrowserTables() {
4
6
  return cachedBrowserTables;
@@ -50,12 +52,7 @@ async function fetchManifest(baseUrl) {
50
52
  return manifest;
51
53
  }
52
54
  async function fetchUint16Table(baseUrl, entry, expectedEntries) {
53
- const url = `${baseUrl}/puzzles/cube2/solver/generated/${entry.file}`;
54
- const response = await fetch(url);
55
- if (!response.ok) {
56
- throw new Error(`Failed to load ${entry.file}: ${response.status} ${response.statusText}`);
57
- }
58
- const buffer = await response.arrayBuffer();
55
+ const buffer = await fetchTableBuffer(baseUrl, TABLES_DIR, entry.file, { compressed: entry.compressed !== false });
59
56
  if (buffer.byteLength !== expectedEntries * 2) {
60
57
  throw new Error(`Invalid byte size for ${entry.file}`);
61
58
  }
@@ -67,12 +64,7 @@ async function fetchUint16Table(baseUrl, entry, expectedEntries) {
67
64
  return values;
68
65
  }
69
66
  async function fetchUint8Table(baseUrl, entry, expectedEntries) {
70
- const url = `${baseUrl}/puzzles/cube2/solver/generated/${entry.file}`;
71
- const response = await fetch(url);
72
- if (!response.ok) {
73
- throw new Error(`Failed to load ${entry.file}: ${response.status} ${response.statusText}`);
74
- }
75
- const buffer = await response.arrayBuffer();
67
+ const buffer = await fetchTableBuffer(baseUrl, TABLES_DIR, entry.file, { compressed: entry.compressed !== false });
76
68
  if (buffer.byteLength !== expectedEntries) {
77
69
  throw new Error(`Invalid byte size for ${entry.file}`);
78
70
  }
@@ -1,3 +1,3 @@
1
- export { solveCube2State } from "./search.js";
1
+ export { solveCube2State, verifyCube2Scramble, verifyCube2Solution } from "./search.js";
2
2
  export type { Cube2Solution } from "./search.js";
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACxF,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -1 +1 @@
1
- export { solveCube2State } from "./search.js";
1
+ export { solveCube2State, verifyCube2Scramble, verifyCube2Solution } from "./search.js";
@@ -5,4 +5,6 @@ export interface Cube2Solution {
5
5
  state: Cube2State;
6
6
  }
7
7
  export declare function solveCube2State(state: Cube2State): Promise<Cube2Solution>;
8
+ export declare function verifyCube2Scramble(state: Cube2State, scrambleMoves: readonly Cube2Move[]): boolean;
9
+ export declare function verifyCube2Solution(state: Cube2State, solutionMoves: readonly Cube2Move[]): boolean;
8
10
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAczD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CA6D/E"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube2/solver/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAczD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CA6D/E;AAoBD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAUnG;AAGD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAOnG"}
@@ -48,3 +48,29 @@ export async function solveCube2State(state) {
48
48
  state: createSolvedCube2State()
49
49
  };
50
50
  }
51
+ const MOVE_INDEX = {};
52
+ for (let i = 0; i < BFS_MOVES.length; i++) {
53
+ MOVE_INDEX[BFS_MOVES[i]] = i;
54
+ }
55
+ function walkCube2Coordinates(permIndex, orientIndex, moves) {
56
+ const permTable = PERMUTATION_TABLE;
57
+ const orientTable = ORIENTATION_TABLE;
58
+ for (const move of moves) {
59
+ const m = MOVE_INDEX[move];
60
+ permIndex = permTable[permIndex * MOVE_COUNT + m];
61
+ orientIndex = orientTable[orientIndex * MOVE_COUNT + m];
62
+ }
63
+ return { permIndex, orientIndex };
64
+ }
65
+ // Applies moves over coordinate indexes (no full state clones) and checks
66
+ // they reproduce the target state.
67
+ export function verifyCube2Scramble(state, scrambleMoves) {
68
+ const { permIndex, orientIndex } = walkCube2Coordinates(encodePermutation([0, 1, 2, 3, 4, 5, 6, 7]), encodeOrientation([0, 0, 0, 0, 0, 0, 0, 0]), scrambleMoves);
69
+ return (permIndex === encodePermutation(state.corners.permutation) &&
70
+ orientIndex === encodeOrientation(state.corners.orientation));
71
+ }
72
+ // Checks that the solution leads the target state back to solved coordinates.
73
+ export function verifyCube2Solution(state, solutionMoves) {
74
+ const { permIndex, orientIndex } = walkCube2Coordinates(encodePermutation(state.corners.permutation), encodeOrientation(state.corners.orientation), solutionMoves);
75
+ return permIndex === 0 && orientIndex === 0;
76
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAIpE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,qBAAqB,CAkB3E;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAGxE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAIpE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAYvE"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube2/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAgBpE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,qBAAqB,CAkB3E;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAIxE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAIpE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAYvE"}
@@ -1,6 +1,17 @@
1
1
  import { CUBE2_MOVES, CORNER_COUNT } from "./types.js";
2
2
  import { applyCube2Move } from "./moves.js";
3
- import { createSolvedCube2State, cube2StatesEqual, isSolvedCube2State } from "./state.js";
3
+ import { createSolvedCube2State, isSolvedCube2State } from "./state.js";
4
+ import { encodeOrientation, encodePermutation } from "./solver/tables.js";
5
+ // Precomputed coordinate encodings of every single-move state, so the
6
+ // "one move from solved" check is a couple of O(n) encodings + 18 comparisons
7
+ // instead of 18 full state applications.
8
+ const ONE_MOVE_FROM_SOLVED_ENCODED = CUBE2_MOVES.map((move) => {
9
+ const state = applyCube2Move(createSolvedCube2State(), move);
10
+ return {
11
+ p: encodePermutation(state.corners.permutation),
12
+ o: encodeOrientation(state.corners.orientation)
13
+ };
14
+ });
4
15
  export function validateCube2State(state) {
5
16
  const errors = [
6
17
  ...validatePermutation("corner", state.corners.permutation, CORNER_COUNT),
@@ -18,8 +29,9 @@ export function validateCube2State(state) {
18
29
  };
19
30
  }
20
31
  export function isOneMoveFromSolvedCube2State(state) {
21
- const solved = createSolvedCube2State();
22
- return CUBE2_MOVES.some((move) => cube2StatesEqual(applyCube2Move(solved, move), state));
32
+ const p = encodePermutation(state.corners.permutation);
33
+ const o = encodeOrientation(state.corners.orientation);
34
+ return ONE_MOVE_FROM_SOLVED_ENCODED.some((entry) => entry.p === p && entry.o === o);
23
35
  }
24
36
  export function isAllowedRandomCube2State(state) {
25
37
  return validateCube2State(state).valid &&
@@ -7,4 +7,5 @@ export { cube3ScrambleGenerator, generateCube3Scramble } from "./scrambler.js";
7
7
  export { formatCube3Facelets, getCube3FaceOrder, toCube3Facelets } from "./facelets.js";
8
8
  export * as solver from "./solver/index.js";
9
9
  export type { Cube3Face, Cube3Facelets, Cube3Move, Cube3FaceMove, Cube3MoveSuffix, Cube3RandomStateOptions, Cube3Sticker, Cube3State, Cube3ValidationResult } from "./types.js";
10
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube3/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,YAAY,EACZ,UAAU,EACV,qBAAqB,EACtB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube3/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,WAAW,EACX,YAAY,EACZ,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,yBAAyB,EACzB,6BAA6B,EAC7B,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,YAAY,EACZ,UAAU,EACV,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC"}
@@ -1,3 +1,6 @@
1
+ import { registerScrambleGenerator } from "../../core/index.js";
2
+ import { cube3ScrambleGenerator } from "./scrambler.js";
3
+ registerScrambleGenerator(cube3ScrambleGenerator);
1
4
  export { CUBE3_MOVES, CORNER_COUNT, EDGE_COUNT } from "./types.js";
2
5
  export { applyCube3Algorithm, applyCube3Move, formatCube3Algorithm, invertCube3Algorithm, invertCube3Move, parseCube3Algorithm, parseCube3Move } from "./moves.js";
3
6
  export { cloneCube3State, createSolvedCube3State, cube3StatesEqual, isSolvedCube3State } from "./state.js";
@@ -6,3 +9,4 @@ export { generateRandomCube3State } from "./random-state.js";
6
9
  export { cube3ScrambleGenerator, generateCube3Scramble } from "./scrambler.js";
7
10
  export { formatCube3Facelets, getCube3FaceOrder, toCube3Facelets } from "./facelets.js";
8
11
  export * as solver from "./solver/index.js";
12
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"browser-loader.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube3/solver/browser-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAKV,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAqCrB,wBAAgB,sBAAsB,IAAI,iBAAiB,GAAG,SAAS,CAEtE;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0CpF"}
1
+ {"version":3,"file":"browser-loader.d.ts","sourceRoot":"","sources":["../../../../src/puzzles/cube3/solver/browser-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAKV,iBAAiB,EAClB,MAAM,aAAa,CAAC;AA0CrB,wBAAgB,sBAAsB,IAAI,iBAAiB,GAAG,SAAS,CAEtE;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,wBAAsB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0CpF"}
@@ -1,3 +1,6 @@
1
+ import { fetchTableBuffer } from "../../shared/compressed-fetch.js";
2
+ const TABLES_DIR = "puzzles/cube3/solver/generated";
3
+ const CACHE_NAME = "cubingcenter-scrambler-tables-v1";
1
4
  let browserTables;
2
5
  function resolveBaseUrl(provided) {
3
6
  if (provided) {
@@ -49,31 +52,6 @@ export async function loadBrowserTables(baseUrl) {
49
52
  };
50
53
  return browserTables;
51
54
  }
52
- const CACHE_NAME = "cubingcenter-scrambler-tables-v1";
53
- async function cachedFetch(url) {
54
- // Try Cache API first
55
- if (typeof caches !== "undefined") {
56
- try {
57
- const cache = await caches.open(CACHE_NAME);
58
- const cached = await cache.match(url);
59
- if (cached) {
60
- return cached.arrayBuffer();
61
- }
62
- const response = await fetch(url);
63
- if (response.ok) {
64
- // Clone before reading so we can store the clone
65
- await cache.put(url, response.clone());
66
- }
67
- return response.arrayBuffer();
68
- }
69
- catch {
70
- // Cache API failed (e.g. quota exceeded, private mode) — fall through
71
- }
72
- }
73
- // Fallback: plain fetch
74
- const response = await fetch(url);
75
- return response.arrayBuffer();
76
- }
77
55
  async function fetchManifest(baseUrl) {
78
56
  const url = `${baseUrl}/puzzles/cube3/solver/generated/manifest.json`;
79
57
  const response = await fetch(url);
@@ -87,8 +65,7 @@ async function fetchManifest(baseUrl) {
87
65
  return manifest;
88
66
  }
89
67
  async function fetchMoveTable(baseUrl, entry) {
90
- const url = `${baseUrl}/puzzles/cube3/solver/generated/${entry.file}`;
91
- const buffer = await cachedFetch(url);
68
+ const buffer = await fetchTableBuffer(baseUrl, TABLES_DIR, entry.file, { cacheName: CACHE_NAME, compressed: entry.compressed !== false });
92
69
  const expectedBytes = entry.range * entry.moves.length * 4;
93
70
  if (buffer.byteLength !== expectedBytes) {
94
71
  throw new Error(`Invalid byte size for ${entry.coordinate} move table.`);
@@ -108,8 +85,7 @@ async function fetchMoveTable(baseUrl, entry) {
108
85
  };
109
86
  }
110
87
  async function fetchPruningTable(baseUrl, entry) {
111
- const url = `${baseUrl}/puzzles/cube3/solver/generated/${entry.file}`;
112
- const buffer = await cachedFetch(url);
88
+ const buffer = await fetchTableBuffer(baseUrl, TABLES_DIR, entry.file, { cacheName: CACHE_NAME, compressed: entry.compressed !== false });
113
89
  const expectedBytes = Math.ceil(entry.range / 2);
114
90
  if (buffer.byteLength !== expectedBytes) {
115
91
  throw new Error(`Invalid byte size for ${entry.coordinate} pruning table.`);
@@ -4,4 +4,5 @@ export { createSolvedCube4State, cloneCube4State, cube4StatesEqual, isSolvedCube
4
4
  export { applyCube4Move, applyCube4Algorithm, invertCube4Move, invertCube4Algorithm, formatCube4Algorithm, parseCube4Algorithm, parseCube4Move, parseMove, FACE_MOVE_EFFECTS } from "./moves.js";
5
5
  export { cube4ScrambleGenerator, generateCube4Scramble } from "./scrambler.js";
6
6
  export { toCube4Facelets, formatCube4Facelets, getCube4FaceOrder } from "./facelets.js";
7
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube4/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAChB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube4/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAChB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,SAAS,EACT,aAAa,EACb,SAAS,EACT,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,SAAS,EACT,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC"}
@@ -1,8 +1,12 @@
1
1
  // ---------------------------------------------------------------------------
2
2
  // cube4 barrel exports
3
3
  // ---------------------------------------------------------------------------
4
+ import { registerScrambleGenerator } from "../../core/index.js";
5
+ import { cube4ScrambleGenerator } from "./scrambler.js";
6
+ registerScrambleGenerator(cube4ScrambleGenerator);
4
7
  export { CORNER_COUNT, WING_COUNT, CENTER_COUNT, FACE_COUNT, CENTERS_PER_FACE, U, R, F, D, L, B, CUBE4_FACE_MOVES, CUBE4_ALL_MOVES, CUBE4_OUTER_MOVES } from "./types.js";
5
8
  export { createSolvedCube4State, cloneCube4State, cube4StatesEqual, isSolvedCube4State, areCentersReduced, areWingsPaired } from "./state.js";
6
9
  export { applyCube4Move, applyCube4Algorithm, invertCube4Move, invertCube4Algorithm, formatCube4Algorithm, parseCube4Algorithm, parseCube4Move, parseMove, FACE_MOVE_EFFECTS } from "./moves.js";
7
10
  export { cube4ScrambleGenerator, generateCube4Scramble } from "./scrambler.js";
8
11
  export { toCube4Facelets, formatCube4Facelets, getCube4FaceOrder } from "./facelets.js";
12
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
@@ -1,4 +1,5 @@
1
1
  export type { Cube5Move } from "./types.js";
2
2
  export { CUBE5_ALL_MOVES, SCRAMBLE_LENGTH } from "./types.js";
3
3
  export { cube5ScrambleGenerator, generateCube5Scramble } from "./scrambler.js";
4
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube5x5/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube5x5/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC"}
@@ -1,2 +1,6 @@
1
+ import { registerScrambleGenerator } from "../../core/index.js";
2
+ import { cube5ScrambleGenerator } from "./scrambler.js";
3
+ registerScrambleGenerator(cube5ScrambleGenerator);
1
4
  export { CUBE5_ALL_MOVES, SCRAMBLE_LENGTH } from "./types.js";
2
5
  export { cube5ScrambleGenerator, generateCube5Scramble } from "./scrambler.js";
6
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
@@ -1,4 +1,5 @@
1
1
  export type { Cube6Move } from "./types.js";
2
2
  export { CUBE6_ALL_MOVES, SCRAMBLE_LENGTH } from "./types.js";
3
3
  export { cube6ScrambleGenerator, generateCube6Scramble } from "./scrambler.js";
4
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube6x6/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube6x6/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC"}
@@ -1,2 +1,6 @@
1
+ import { registerScrambleGenerator } from "../../core/index.js";
2
+ import { cube6ScrambleGenerator } from "./scrambler.js";
3
+ registerScrambleGenerator(cube6ScrambleGenerator);
1
4
  export { CUBE6_ALL_MOVES, SCRAMBLE_LENGTH } from "./types.js";
2
5
  export { cube6ScrambleGenerator, generateCube6Scramble } from "./scrambler.js";
6
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
@@ -1,4 +1,5 @@
1
1
  export type { Cube7Move } from "./types.js";
2
2
  export { CUBE7_ALL_MOVES, SCRAMBLE_LENGTH } from "./types.js";
3
3
  export { cube7ScrambleGenerator, generateCube7Scramble } from "./scrambler.js";
4
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube7x7/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/cube7x7/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE9D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC"}
@@ -1,2 +1,6 @@
1
+ import { registerScrambleGenerator } from "../../core/index.js";
2
+ import { cube7ScrambleGenerator } from "./scrambler.js";
3
+ registerScrambleGenerator(cube7ScrambleGenerator);
1
4
  export { CUBE7_ALL_MOVES, SCRAMBLE_LENGTH } from "./types.js";
2
5
  export { cube7ScrambleGenerator, generateCube7Scramble } from "./scrambler.js";
6
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
@@ -1,4 +1,5 @@
1
1
  export type { MegaminxMove } from "./types.js";
2
2
  export { MEGAMINX_R_MOVES, MEGAMINX_D_MOVES, SCRAMBLE_LINES, MOVES_PER_LINE } from "./types.js";
3
3
  export { megaminxScrambleGenerator, generateMegaminxScramble } from "./scrambler.js";
4
+ export { generateScramble, generateScrambles, getEventInfo, getSupportedEvents, initializeScrambler } from "../../core/index.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/megaminx/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/puzzles/megaminx/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC"}