cubing 0.55.2 → 0.57.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 (98) hide show
  1. package/dist/bin/chunks/{chunk-DFQMTDRG.js → chunk-J53ID3VX.js} +2 -2
  2. package/dist/bin/chunks/chunk-J53ID3VX.js.map +7 -0
  3. package/dist/bin/order.js +1 -1
  4. package/dist/bin/order.js.map +2 -2
  5. package/dist/bin/puzzle-geometry-bin.js +1 -1
  6. package/dist/bin/puzzle-geometry-bin.js.map +2 -2
  7. package/dist/bin/scramble.js +2 -1
  8. package/dist/bin/scramble.js.map +2 -2
  9. package/dist/lib/cubing/{PuzzleLoader-DGpDr4U9.d.ts → PuzzleLoader-Dd4G1VlU.d.ts} +358 -314
  10. package/dist/lib/cubing/alg/index.d.ts +9 -9
  11. package/dist/lib/cubing/alg/index.js +1 -1
  12. package/dist/lib/cubing/bluetooth/index.d.ts +11 -12
  13. package/dist/lib/cubing/bluetooth/index.js +72 -57
  14. package/dist/lib/cubing/bluetooth/index.js.map +3 -3
  15. package/dist/lib/cubing/{bluetooth-puzzle-C097rA5h.d.ts → bluetooth-puzzle-FIXncgc8.d.ts} +1 -1
  16. package/dist/lib/cubing/chunks/big-puzzle-orientation-IZASZS5A.js +70 -0
  17. package/dist/lib/cubing/chunks/big-puzzle-orientation-IZASZS5A.js.map +7 -0
  18. package/dist/lib/cubing/chunks/{chunk-TQF5J7MH.js → chunk-3YVVF3KK.js} +79 -79
  19. package/dist/lib/cubing/chunks/chunk-3YVVF3KK.js.map +7 -0
  20. package/dist/lib/cubing/chunks/{chunk-ZOU73IV5.js → chunk-CGV5LY7H.js} +2 -2
  21. package/dist/lib/cubing/chunks/chunk-CGV5LY7H.js.map +7 -0
  22. package/dist/lib/cubing/chunks/{chunk-Y5U55NHQ.js → chunk-DWN2US56.js} +11 -11
  23. package/dist/lib/cubing/chunks/chunk-DWN2US56.js.map +7 -0
  24. package/dist/lib/cubing/chunks/{chunk-PJH5IVDC.js → chunk-EVYENG3X.js} +40 -42
  25. package/dist/lib/cubing/chunks/chunk-EVYENG3X.js.map +7 -0
  26. package/dist/lib/cubing/chunks/{chunk-BQNTAVTA.js → chunk-GKM2CK6T.js} +2 -2
  27. package/dist/lib/cubing/chunks/{chunk-MFK4M6PV.js → chunk-J6NSY47E.js} +120 -18
  28. package/dist/lib/cubing/chunks/chunk-J6NSY47E.js.map +7 -0
  29. package/dist/lib/cubing/chunks/{chunk-2QDTMC3W.js → chunk-KAXXPFNE.js} +4 -4
  30. package/dist/lib/cubing/chunks/{chunk-2QDTMC3W.js.map → chunk-KAXXPFNE.js.map} +2 -2
  31. package/dist/lib/cubing/chunks/{chunk-SGPKF5IH.js → chunk-MITU5GJ5.js} +55 -51
  32. package/dist/lib/cubing/chunks/{chunk-SGPKF5IH.js.map → chunk-MITU5GJ5.js.map} +3 -3
  33. package/dist/lib/cubing/chunks/{chunk-WELOEBCE.js → chunk-SNKS5WOA.js} +166 -150
  34. package/dist/lib/cubing/chunks/chunk-SNKS5WOA.js.map +7 -0
  35. package/dist/lib/cubing/chunks/{chunk-2SBMIHZV.js → chunk-SWKNZGJF.js} +100 -108
  36. package/dist/lib/cubing/chunks/chunk-SWKNZGJF.js.map +7 -0
  37. package/dist/lib/cubing/chunks/{chunk-G3WJVG4K.js → chunk-XKTLEY2R.js} +2 -2
  38. package/dist/lib/cubing/chunks/chunk-XKTLEY2R.js.map +7 -0
  39. package/dist/lib/cubing/chunks/{inside-DZMTYTHV.js → inside-AF5A42Y6.js} +18 -18
  40. package/dist/lib/cubing/chunks/{inside-DZMTYTHV.js.map → inside-AF5A42Y6.js.map} +2 -2
  41. package/dist/lib/cubing/chunks/{puzzles-dynamic-side-events-QIADTLKJ.js → puzzles-dynamic-side-events-BOGUHF4Q.js} +1681 -1800
  42. package/dist/lib/cubing/chunks/puzzles-dynamic-side-events-BOGUHF4Q.js.map +7 -0
  43. package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-EGIM6IYZ.js → search-dynamic-sgs-side-events-PVOJWVJF.js} +7 -7
  44. package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-EGIM6IYZ.js.map → search-dynamic-sgs-side-events-PVOJWVJF.js.map} +2 -2
  45. package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-R2TXOWXD.js → search-dynamic-sgs-unofficial-HRR5D2US.js} +648 -648
  46. package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-HRR5D2US.js.map +7 -0
  47. package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-6XXEHLWN.js → search-dynamic-solve-4x4x4-3CROPIQD.js} +7 -7
  48. package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-5YRST2XM.js → search-dynamic-solve-fto-NKAFVO65.js} +2 -2
  49. package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-W64XQPBF.js → search-dynamic-solve-kilominx-EDGE5SP4.js} +2 -2
  50. package/dist/lib/cubing/chunks/search-worker-entry.js +1 -1
  51. package/dist/lib/cubing/chunks/{twisty-dynamic-3d-H7YMZQPB.js → twisty-dynamic-3d-EIIPCTEF.js} +106 -93
  52. package/dist/lib/cubing/chunks/twisty-dynamic-3d-EIIPCTEF.js.map +7 -0
  53. package/dist/lib/cubing/chunks/{twsearch-ZJ4WTIBT.js → twsearch-TGLVN7TI.js} +4 -4
  54. package/dist/lib/cubing/chunks/twsearch-TGLVN7TI.js.map +7 -0
  55. package/dist/lib/cubing/chunks/twsearch_wasm_bg-NHUYB5UW-HHHVHFI5.js +10 -0
  56. package/dist/lib/cubing/chunks/twsearch_wasm_bg-NHUYB5UW-HHHVHFI5.js.map +7 -0
  57. package/dist/lib/cubing/{index-3pTbhXFM.d.ts → index-Drw5ySJm.d.ts} +2 -2
  58. package/dist/lib/cubing/kpuzzle/index.d.ts +2 -2
  59. package/dist/lib/cubing/kpuzzle/index.js +2 -2
  60. package/dist/lib/cubing/notation/index.d.ts +4 -4
  61. package/dist/lib/cubing/notation/index.js +4 -4
  62. package/dist/lib/cubing/protocol/index.d.ts +2 -2
  63. package/dist/lib/cubing/protocol/index.js +4 -4
  64. package/dist/lib/cubing/puzzle-geometry/index.d.ts +3 -3
  65. package/dist/lib/cubing/puzzle-geometry/index.js +616 -483
  66. package/dist/lib/cubing/puzzle-geometry/index.js.map +3 -3
  67. package/dist/lib/cubing/puzzles/index.d.ts +2 -2
  68. package/dist/lib/cubing/puzzles/index.js +4 -4
  69. package/dist/lib/cubing/scramble/index.d.ts +3 -3
  70. package/dist/lib/cubing/scramble/index.js +6 -6
  71. package/dist/lib/cubing/search/index.d.ts +3 -3
  72. package/dist/lib/cubing/search/index.js +6 -6
  73. package/dist/lib/cubing/stream/index.d.ts +23 -23
  74. package/dist/lib/cubing/stream/index.js +41 -41
  75. package/dist/lib/cubing/stream/index.js.map +3 -3
  76. package/dist/lib/cubing/twisty/index.d.ts +9 -9
  77. package/dist/lib/cubing/twisty/index.js +3675 -3630
  78. package/dist/lib/cubing/twisty/index.js.map +4 -4
  79. package/package.json +16 -10
  80. package/dist/bin/chunks/chunk-DFQMTDRG.js.map +0 -7
  81. package/dist/lib/cubing/chunks/chunk-2SBMIHZV.js.map +0 -7
  82. package/dist/lib/cubing/chunks/chunk-G3WJVG4K.js.map +0 -7
  83. package/dist/lib/cubing/chunks/chunk-MFK4M6PV.js.map +0 -7
  84. package/dist/lib/cubing/chunks/chunk-PJH5IVDC.js.map +0 -7
  85. package/dist/lib/cubing/chunks/chunk-TQF5J7MH.js.map +0 -7
  86. package/dist/lib/cubing/chunks/chunk-WELOEBCE.js.map +0 -7
  87. package/dist/lib/cubing/chunks/chunk-Y5U55NHQ.js.map +0 -7
  88. package/dist/lib/cubing/chunks/chunk-ZOU73IV5.js.map +0 -7
  89. package/dist/lib/cubing/chunks/puzzles-dynamic-side-events-QIADTLKJ.js.map +0 -7
  90. package/dist/lib/cubing/chunks/search-dynamic-sgs-unofficial-R2TXOWXD.js.map +0 -7
  91. package/dist/lib/cubing/chunks/twisty-dynamic-3d-H7YMZQPB.js.map +0 -7
  92. package/dist/lib/cubing/chunks/twsearch-ZJ4WTIBT.js.map +0 -7
  93. package/dist/lib/cubing/chunks/twsearch_wasm_bg-FWKR4AQ6-XETKNJAN.js +0 -10
  94. package/dist/lib/cubing/chunks/twsearch_wasm_bg-FWKR4AQ6-XETKNJAN.js.map +0 -7
  95. /package/dist/lib/cubing/chunks/{chunk-BQNTAVTA.js.map → chunk-GKM2CK6T.js.map} +0 -0
  96. /package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-6XXEHLWN.js.map → search-dynamic-solve-4x4x4-3CROPIQD.js.map} +0 -0
  97. /package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-5YRST2XM.js.map → search-dynamic-solve-fto-NKAFVO65.js.map} +0 -0
  98. /package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-W64XQPBF.js.map → search-dynamic-solve-kilominx-EDGE5SP4.js.map} +0 -0
@@ -4,7 +4,7 @@
4
4
  import { exit } from "node:process";
5
5
  try {
6
6
  await import("cmd-ts-too");
7
- } catch (e) {
7
+ } catch {
8
8
  console.error(
9
9
  `Could not import \`cmd-ts-too\`. This is not automatically installed as a regular dependency of \`cubing\`.
10
10
 
@@ -23,4 +23,4 @@ If you are using \`npx\` within a repo, run:
23
23
  );
24
24
  exit(1);
25
25
  }
26
- //# sourceMappingURL=chunk-DFQMTDRG.js.map
26
+ //# sourceMappingURL=chunk-J53ID3VX.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bin/guards/cmd-ts-too-guard.ts"],
4
+ "sourcesContent": ["import { exit } from \"node:process\";\n\ntry {\n await import(\"cmd-ts-too\");\n} catch {\n // Note that this doesn't fail when installed using `bun install --global`, as `bun` automatically loads deps.\n console.error(\n `Could not import \\`cmd-ts-too\\`. This is not automatically installed as a regular dependency of \\`cubing\\`.\n\nIf you are installing globally, consider using \\`bun\\`: https://bun.sh/\n\n bun install --global cubing\n\nIf you are installing using \\`npx\\` globally, run:\n\n npm install --global cubing cmd-ts-too\n\nIf you are using \\`npx\\` within a repo, run:\n\n npm install cubing cmd-ts-too\n`,\n );\n exit(1);\n}\n"],
5
+ "mappings": ";;;AAAA,SAAS,YAAY;AAErB,IAAI;AACF,QAAM,OAAO,YAAY;AAC3B,QAAQ;AAEN,UAAQ;AAAA,IACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcF;AACA,OAAK,CAAC;AACR;",
6
+ "names": []
7
+ }
package/dist/bin/order.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import "./chunks/chunk-DFQMTDRG.js";
2
+ import "./chunks/chunk-J53ID3VX.js";
3
3
 
4
4
  // src/bin/order.ts
5
5
  import { Alg } from "cubing/alg";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/bin/order.ts"],
4
- "sourcesContent": ["// To run this file directly:\n// bun run src/bin/order.ts -- 3x3x3 \"R U R' U R U2' R'\"\n\nimport { Alg } from \"cubing/alg\";\nimport { KPuzzle } from \"cubing/kpuzzle\";\nimport { getPuzzleGeometryByName } from \"cubing/puzzle-geometry\";\nimport { puzzles } from \"cubing/puzzles\";\n\nimport type { Type } from \"cmd-ts-too\";\nimport \"./guards/cmd-ts-too-guard\";\n\nconst {\n binary,\n string: cmdString,\n command,\n positional,\n run,\n} = await import(\"cmd-ts-too\");\n\n// TODO: dedup with `screenshot` implementation.\nconst ReadAlg: Type<string, Alg> = {\n async from(str) {\n return Alg.fromString(str);\n },\n};\n\nconst app = command({\n name: \"order\",\n description: \"Example: order 3x3x3 \\\"R U R' U R U2' R'\\\"\",\n args: {\n puzzleGeometryID: positional({\n type: cmdString,\n displayName: \"Puzzle geometry ID\",\n }),\n alg: positional({\n type: ReadAlg,\n displayName: \"Alg\",\n }),\n },\n handler: async ({ puzzleGeometryID, alg }) => {\n /*\n * Turn a name into a geometry.\n */\n\n const puzzleLoader = puzzles[puzzleGeometryID];\n const kpuzzle = await (async () => {\n if (puzzleLoader) {\n return await puzzles[puzzleGeometryID].kpuzzle();\n } else {\n const pg = getPuzzleGeometryByName(puzzleGeometryID, {\n allMoves: true,\n });\n return new KPuzzle(pg.getKPuzzleDefinition(true));\n }\n })();\n const order = kpuzzle.algToTransformation(alg).repetitionOrder();\n console.log(order);\n },\n});\n\nawait run(binary(app), process.argv);\n"],
5
- "mappings": ";;;;AAGA,SAAS,WAAW;AACpB,SAAS,eAAe;AACxB,SAAS,+BAA+B;AACxC,SAAS,eAAe;AAKxB,IAAM;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AACF,IAAI,MAAM,OAAO,YAAY;AAG7B,IAAM,UAA6B;AAAA,EACjC,MAAM,KAAK,KAAK;AACd,WAAO,IAAI,WAAW,GAAG;AAAA,EAC3B;AACF;AAEA,IAAM,MAAM,QAAQ;AAAA,EAClB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,kBAAkB,WAAW;AAAA,MAC3B,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,IACD,KAAK,WAAW;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EACA,SAAS,OAAO,EAAE,kBAAkB,IAAI,MAAM;AAK5C,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,UAAU,OAAO,YAAY;AACjC,UAAI,cAAc;AAChB,eAAO,MAAM,QAAQ,gBAAgB,EAAE,QAAQ;AAAA,MACjD,OAAO;AACL,cAAM,KAAK,wBAAwB,kBAAkB;AAAA,UACnD,UAAU;AAAA,QACZ,CAAC;AACD,eAAO,IAAI,QAAQ,GAAG,qBAAqB,IAAI,CAAC;AAAA,MAClD;AAAA,IACF,GAAG;AACH,UAAM,QAAQ,QAAQ,oBAAoB,GAAG,EAAE,gBAAgB;AAC/D,YAAQ,IAAI,KAAK;AAAA,EACnB;AACF,CAAC;AAED,MAAM,IAAI,OAAO,GAAG,GAAG,QAAQ,IAAI;",
4
+ "sourcesContent": ["// To run this file directly:\n// bun run src/bin/order.ts -- 3x3x3 \"R U R' U R U2' R'\"\n\nimport type { Type } from \"cmd-ts-too\";\nimport { Alg } from \"cubing/alg\";\nimport { KPuzzle } from \"cubing/kpuzzle\";\nimport { getPuzzleGeometryByName } from \"cubing/puzzle-geometry\";\nimport { puzzles } from \"cubing/puzzles\";\nimport \"./guards/cmd-ts-too-guard\";\n\nconst {\n binary,\n string: cmdString,\n command,\n positional,\n run,\n} = await import(\"cmd-ts-too\");\n\n// TODO: dedup with `screenshot` implementation.\nconst ReadAlg: Type<string, Alg> = {\n async from(str) {\n return Alg.fromString(str);\n },\n};\n\nconst app = command({\n name: \"order\",\n description: \"Example: order 3x3x3 \\\"R U R' U R U2' R'\\\"\",\n args: {\n puzzleGeometryID: positional({\n type: cmdString,\n displayName: \"Puzzle geometry ID\",\n }),\n alg: positional({\n type: ReadAlg,\n displayName: \"Alg\",\n }),\n },\n handler: async ({ puzzleGeometryID, alg }) => {\n /*\n * Turn a name into a geometry.\n */\n\n const puzzleLoader = puzzles[puzzleGeometryID];\n const kpuzzle = await (async () => {\n if (puzzleLoader) {\n return await puzzles[puzzleGeometryID].kpuzzle();\n } else {\n const pg = getPuzzleGeometryByName(puzzleGeometryID, {\n allMoves: true,\n });\n return new KPuzzle(pg.getKPuzzleDefinition(true));\n }\n })();\n const order = kpuzzle.algToTransformation(alg).repetitionOrder();\n console.log(order);\n },\n});\n\nawait run(binary(app), process.argv);\n"],
5
+ "mappings": ";;;;AAIA,SAAS,WAAW;AACpB,SAAS,eAAe;AACxB,SAAS,+BAA+B;AACxC,SAAS,eAAe;AAGxB,IAAM;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AACF,IAAI,MAAM,OAAO,YAAY;AAG7B,IAAM,UAA6B;AAAA,EACjC,MAAM,KAAK,KAAK;AACd,WAAO,IAAI,WAAW,GAAG;AAAA,EAC3B;AACF;AAEA,IAAM,MAAM,QAAQ;AAAA,EAClB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM;AAAA,IACJ,kBAAkB,WAAW;AAAA,MAC3B,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,IACD,KAAK,WAAW;AAAA,MACd,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EACA,SAAS,OAAO,EAAE,kBAAkB,IAAI,MAAM;AAK5C,UAAM,eAAe,QAAQ,gBAAgB;AAC7C,UAAM,UAAU,OAAO,YAAY;AACjC,UAAI,cAAc;AAChB,eAAO,MAAM,QAAQ,gBAAgB,EAAE,QAAQ;AAAA,MACjD,OAAO;AACL,cAAM,KAAK,wBAAwB,kBAAkB;AAAA,UACnD,UAAU;AAAA,QACZ,CAAC;AACD,eAAO,IAAI,QAAQ,GAAG,qBAAqB,IAAI,CAAC;AAAA,MAClD;AAAA,IACF,GAAG;AACH,UAAM,QAAQ,QAAQ,oBAAoB,GAAG,EAAE,gBAAgB;AAC/D,YAAQ,IAAI,KAAK;AAAA,EACnB;AACF,CAAC;AAED,MAAM,IAAI,OAAO,GAAG,GAAG,QAAQ,IAAI;",
6
6
  "names": []
7
7
  }
@@ -2,8 +2,8 @@
2
2
 
3
3
  // src/bin/puzzle-geometry-bin.ts
4
4
  import {
5
- PuzzleGeometry,
6
5
  getPG3DNamedPuzzles,
6
+ PuzzleGeometry,
7
7
  parsePuzzleDescription
8
8
  } from "cubing/puzzle-geometry";
9
9
  function asstructured(v) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/bin/puzzle-geometry-bin.ts"],
4
- "sourcesContent": ["// To run this file directly:\n// bun run src/bin/puzzle-geometry-bin.ts -- <program args>\n\nimport {\n PuzzleGeometry,\n getPG3DNamedPuzzles,\n parsePuzzleDescription,\n type ExperimentalPuzzleBaseShape,\n type ExperimentalPuzzleCutType,\n type ExperimentalPuzzleGeometryOptions,\n} from \"cubing/puzzle-geometry\";\nimport type { PuzzleDescriptionString } from \"cubing/puzzle-geometry/PGPuzzles\";\nimport type {\n PuzzleCutDescription,\n PuzzleDescription,\n} from \"cubing/puzzle-geometry/PuzzleGeometry\";\n\nexport function asstructured(v: any): any {\n if (typeof v === \"string\") {\n return JSON.parse(v);\n }\n return v;\n}\nexport function asboolean(v: any): boolean {\n if (typeof v === \"string\") {\n return v !== \"false\";\n } else {\n return !!v;\n }\n}\nexport function parsePGOptionList(\n optionlist?: any[],\n): ExperimentalPuzzleGeometryOptions {\n const options: ExperimentalPuzzleGeometryOptions = {};\n if (optionlist !== undefined) {\n if (optionlist.length % 2 !== 0) {\n throw new Error(\"Odd length in option list?\");\n }\n for (let i = 0; i < optionlist.length; i += 2) {\n if (optionlist[i] === \"verbose\") {\n options.verbosity = (options.verbosity ?? 0) + 1;\n } else if (optionlist[i] === \"quiet\") {\n options.verbosity = 0;\n } else if (optionlist[i] === \"allmoves\") {\n options.allMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"outerblockmoves\") {\n options.outerBlockMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"vertexmoves\") {\n options.vertexMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"rotations\") {\n options.addRotations = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"cornersets\") {\n options.includeCornerOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"centersets\") {\n options.includeCenterOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"edgesets\") {\n options.includeEdgeOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"omit\") {\n options.excludeOrbits = optionlist[i + 1];\n } else if (optionlist[i] === \"graycorners\") {\n options.grayCorners = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"graycenters\") {\n options.grayCenters = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"grayedges\") {\n options.grayEdges = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"movelist\") {\n options.moveList = asstructured(optionlist[i + 1]);\n } else if (optionlist[i] === \"killorientation\") {\n options.fixedOrientation = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"optimize\") {\n options.optimizeOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"scramble\") {\n options.scrambleAmount = optionlist[i + 1];\n } else if (optionlist[i] === \"fix\") {\n options.fixedPieceType = optionlist[i + 1];\n } else if (optionlist[i] === \"orientcenters\") {\n options.orientCenters = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"puzzleorientation\") {\n options.puzzleOrientation = asstructured(optionlist[i + 1]);\n } else if (optionlist[i] === \"puzzleorientations\") {\n options.puzzleOrientations = asstructured(optionlist[i + 1]);\n } else {\n throw new Error(\n `Bad option while processing option list ${optionlist[i]}`,\n );\n }\n }\n }\n return options;\n}\n\nlet dosvg = false;\nlet doss = false;\nlet doksolve = false;\nlet dogap = false;\nlet domathematica = false;\nlet docanon = false;\nlet do3d = false;\nif (globalThis.process && process.argv && process.argv.length <= 2) {\n console.log(\n `Usage: puzzle-geometry [options] [puzzle]\n\nOptions:\n--ksolve: write ksolve (tws) file\n--svg: write SVG (default is flat; --3d makes it 3D)\n--gap: write gap\n--mathematica: write mathematica\n--ss: execute Schrier-Sims calculation\n--3d: use 3D format for SVG file\n--canon: write canonical string analysis\n--rotations: include full-puzzle rotations as moves\n--allmoves: includes all moves (i.e., slice moves for 3x3x3)\n--outerblockmoves: use outer block moves rather than slice moves\n--vertexmoves: for tetrahedral puzzles, prefer vertex moves to face moves\n--nocorners: ignore all corners\n--noedges: ignore all edges\n--nocenters: ignore all centers\n--noorientation: ignore orientations\n--orientcenters: give centers an orientation\n--puzzleorientation: for 3D formats, give puzzle orientation\n--moves movenames: restrict moves to this list (e.g, U2,F,r)\n--optimize: optimize tws/ksolve/gap output\n--scramble: scramble solved position\n--fixcorner: choose moves to keep one corner fixed\n--fixedge: choose moves to keep one edge fixed\n--fixcenter: choose moves to keep one center fixed\n--verbose (-v): make verbose\n\nThe puzzle can be given as a geometric description or by name.\nThe geometric description starts with c (cube), t (tetrahedron),\nd (dodecahedron), i (icosahedron), or o (octahedron), then a\nspace, then a series of cuts. Each cut begins with f (for a\ncut parallel to faces), v (for a cut perpendicular to a ray\nfrom the center through a corner), or e (for a cut perpendicular\nto a ray from the center through an edge) followed by a decimal\nnumber giving a distance, where 1 is the distance between the\ncenter of the puzzle and the center of a face.\n\nThe puzzle names recognized are 2x2x2 through 13x13x13, 20x20x20,\nmaster skewb, professor skewb, compy cube, helicopter, dino,\nlittle chop, pyramorphix, mastermorphix, pyraminx, Jing pyraminx,\nmaster paramorphix, megaminx, gigaminx, pentultimate, starminx,\nstarminx 2, pyraminx crystal, chopasaurus, big chop, skewb diamond,\nFTO, Christopher's jewel, octastar, Trajber's octahedron, radio chop,\nicosamate, Regular Astrominx, Regular Astrominx + Big Chop,\nRedicosahedron, Redicosahedron with centers,Icosaminx, and Eitan's star.\n\nExamples:\n puzzlegeometry --ss 2x2x2\n puzzlegeometry --ss --fixcorner 2x2x2\n puzzlegeometry --ss --moves U,F2,r 4x4x4\n puzzlegeometry --ksolve --optimize --moves U,F,R megaminx\n puzzlegeometry --gap --noedges megaminx\n`,\n );\n}\nif (globalThis.process && process.argv && process.argv.length >= 3) {\n let desc: PuzzleDescriptionString | undefined;\n const puzzleList = getPG3DNamedPuzzles();\n let argp = 2;\n const optionlist = [];\n let showargs = true;\n let pascalcomment = false;\n while (argp < process.argv.length && process.argv[argp][0] === \"-\") {\n const option = process.argv[argp++];\n if (option === \"--verbose\" || option === \"-v\") {\n optionlist.push(\"verbose\", true);\n } else if (option === \"--quiet\" || option === \"-q\") {\n optionlist.push(\"quiet\", true);\n showargs = false;\n } else if (option === \"--ksolve\") {\n doksolve = true;\n } else if (option === \"--svg\") {\n showargs = false;\n optionlist.push(\"quiet\", true);\n dosvg = true;\n } else if (option === \"--gap\") {\n dogap = true;\n } else if (option === \"--mathematica\") {\n domathematica = true;\n pascalcomment = true;\n } else if (option === \"--ss\") {\n doss = true;\n } else if (option === \"--3d\") {\n do3d = true;\n } else if (option === \"--canon\") {\n docanon = true;\n } else if (option === \"--rotations\") {\n optionlist.push(\"rotations\", true);\n } else if (option === \"--allmoves\") {\n optionlist.push(\"allmoves\", true);\n } else if (option === \"--outerblockmoves\") {\n optionlist.push(\"outerblockmoves\", true);\n } else if (option === \"--vertexmoves\") {\n optionlist.push(\"vertexmoves\", true);\n } else if (option === \"--nocorners\") {\n optionlist.push(\"cornersets\", false);\n } else if (option === \"--noedges\") {\n optionlist.push(\"edgesets\", false);\n } else if (option === \"--noorientation\") {\n optionlist.push(\"killorientation\", true);\n } else if (option === \"--nocenters\") {\n optionlist.push(\"centersets\", false);\n } else if (option === \"--omit\") {\n optionlist.push(\"omit\", process.argv[argp].split(\",\"));\n argp++;\n } else if (option === \"--moves\") {\n optionlist.push(\"movelist\", process.argv[argp].split(\",\"));\n argp++;\n } else if (option === \"--optimize\") {\n optionlist.push(\"optimize\", true);\n } else if (option === \"--scramble\") {\n optionlist.push(\"scramble\", 100);\n } else if (option === \"--fixcorner\") {\n optionlist.push(\"fix\", \"v\");\n } else if (option === \"--fixedge\") {\n optionlist.push(\"fix\", \"e\");\n } else if (option === \"--fixcenter\") {\n optionlist.push(\"fix\", \"f\");\n } else if (option === \"--orientcenters\") {\n optionlist.push(\"orientcenters\", true);\n } else if (option === \"--puzzleorientation\") {\n optionlist.push(\"puzzleorientation\", process.argv[argp]);\n argp++;\n } else {\n throw new Error(`Bad option: ${option}`);\n }\n }\n for (const [name, curDesc] of Object.entries(puzzleList)) {\n if (name === process.argv[argp]) {\n desc = curDesc;\n break;\n }\n }\n let puzzleDescription: PuzzleDescription;\n if (showargs) {\n if (pascalcomment) {\n console.log(`(* ${process.argv.join(\" \")} *)`);\n } else {\n console.log(`# ${process.argv.join(\" \")}`);\n }\n }\n if (desc !== undefined) {\n const parsed = parsePuzzleDescription(desc);\n if (parsed === null) {\n throw new Error(\"Could not parse puzzle description!\");\n }\n puzzleDescription = parsed;\n argp++;\n } else {\n const cuts: PuzzleCutDescription[] = [];\n const cutarg = argp++;\n while (argp + 1 < process.argv.length && process.argv[argp].length === 1) {\n // TODO: validate cut type\n cuts.push({\n cutType: process.argv[argp] as ExperimentalPuzzleCutType,\n distance: parseFloat(process.argv[argp + 1]),\n });\n argp += 2;\n }\n // TODO: validate shape\n puzzleDescription = {\n shape: process.argv[cutarg] as ExperimentalPuzzleBaseShape,\n cuts,\n };\n }\n const options = parsePGOptionList(optionlist);\n const pg = new PuzzleGeometry(puzzleDescription, options);\n pg.allstickers();\n pg.genperms();\n if (argp < process.argv.length) {\n throw new Error(\"Unprocessed content at end of command line\");\n }\n if (dogap) {\n console.log(pg.writegap());\n } else if (domathematica) {\n console.log(pg.writemathematica());\n } else if (doksolve) {\n console.log(pg.writeksolve()); // TODO: Update arguments\n } else if (dosvg) {\n console.log(pg.generatesvg(undefined, undefined, undefined, do3d));\n } else if (do3d) {\n console.log(JSON.stringify(pg.get3d()));\n } else if (doss) {\n pg.writeSchreierSims(console.log);\n } else if (docanon) {\n pg.showcanon((_) => console.log(_));\n }\n}\n"],
5
- "mappings": ";;;AAGA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAOA,SAAS,aAAa,GAAa;AACxC,MAAI,OAAO,MAAM,UAAU;AACzB,WAAO,KAAK,MAAM,CAAC;AAAA,EACrB;AACA,SAAO;AACT;AACO,SAAS,UAAU,GAAiB;AACzC,MAAI,OAAO,MAAM,UAAU;AACzB,WAAO,MAAM;AAAA,EACf,OAAO;AACL,WAAO,CAAC,CAAC;AAAA,EACX;AACF;AACO,SAAS,kBACd,YACmC;AACnC,QAAM,UAA6C,CAAC;AACpD,MAAI,eAAe,QAAW;AAC5B,QAAI,WAAW,SAAS,MAAM,GAAG;AAC/B,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AACA,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,GAAG;AAC7C,UAAI,WAAW,CAAC,MAAM,WAAW;AAC/B,gBAAQ,aAAa,QAAQ,aAAa,KAAK;AAAA,MACjD,WAAW,WAAW,CAAC,MAAM,SAAS;AACpC,gBAAQ,YAAY;AAAA,MACtB,WAAW,WAAW,CAAC,MAAM,YAAY;AACvC,gBAAQ,WAAW,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MAChD,WAAW,WAAW,CAAC,MAAM,mBAAmB;AAC9C,gBAAQ,kBAAkB,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MACvD,WAAW,WAAW,CAAC,MAAM,eAAe;AAC1C,gBAAQ,cAAc,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MACnD,WAAW,WAAW,CAAC,MAAM,aAAa;AACxC,gBAAQ,eAAe,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MACpD,WAAW,WAAW,CAAC,MAAM,cAAc;AACzC,gBAAQ,sBAAsB,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MAC3D,WAAW,WAAW,CAAC,MAAM,cAAc;AACzC,gBAAQ,sBAAsB,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MAC3D,WAAW,WAAW,CAAC,MAAM,YAAY;AACvC,gBAAQ,oBAAoB,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MACzD,WAAW,WAAW,CAAC,MAAM,QAAQ;AACnC,gBAAQ,gBAAgB,WAAW,IAAI,CAAC;AAAA,MAC1C,WAAW,WAAW,CAAC,MAAM,eAAe;AAC1C,gBAAQ,cAAc,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MACnD,WAAW,WAAW,CAAC,MAAM,eAAe;AAC1C,gBAAQ,cAAc,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MACnD,WAAW,WAAW,CAAC,MAAM,aAAa;AACxC,gBAAQ,YAAY,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MACjD,WAAW,WAAW,CAAC,MAAM,YAAY;AACvC,gBAAQ,WAAW,aAAa,WAAW,IAAI,CAAC,CAAC;AAAA,MACnD,WAAW,WAAW,CAAC,MAAM,mBAAmB;AAC9C,gBAAQ,mBAAmB,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MACxD,WAAW,WAAW,CAAC,MAAM,YAAY;AACvC,gBAAQ,iBAAiB,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MACtD,WAAW,WAAW,CAAC,MAAM,YAAY;AACvC,gBAAQ,iBAAiB,WAAW,IAAI,CAAC;AAAA,MAC3C,WAAW,WAAW,CAAC,MAAM,OAAO;AAClC,gBAAQ,iBAAiB,WAAW,IAAI,CAAC;AAAA,MAC3C,WAAW,WAAW,CAAC,MAAM,iBAAiB;AAC5C,gBAAQ,gBAAgB,UAAU,WAAW,IAAI,CAAC,CAAC;AAAA,MACrD,WAAW,WAAW,CAAC,MAAM,qBAAqB;AAChD,gBAAQ,oBAAoB,aAAa,WAAW,IAAI,CAAC,CAAC;AAAA,MAC5D,WAAW,WAAW,CAAC,MAAM,sBAAsB;AACjD,gBAAQ,qBAAqB,aAAa,WAAW,IAAI,CAAC,CAAC;AAAA,MAC7D,OAAO;AACL,cAAM,IAAI;AAAA,UACR,2CAA2C,WAAW,CAAC,CAAC;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAI,QAAQ;AACZ,IAAI,OAAO;AACX,IAAI,WAAW;AACf,IAAI,QAAQ;AACZ,IAAI,gBAAgB;AACpB,IAAI,UAAU;AACd,IAAI,OAAO;AACX,IAAI,WAAW,WAAW,QAAQ,QAAQ,QAAQ,KAAK,UAAU,GAAG;AAClE,UAAQ;AAAA,IACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsDF;AACF;AACA,IAAI,WAAW,WAAW,QAAQ,QAAQ,QAAQ,KAAK,UAAU,GAAG;AAClE,MAAI;AACJ,QAAM,aAAa,oBAAoB;AACvC,MAAI,OAAO;AACX,QAAM,aAAa,CAAC;AACpB,MAAI,WAAW;AACf,MAAI,gBAAgB;AACpB,SAAO,OAAO,QAAQ,KAAK,UAAU,QAAQ,KAAK,IAAI,EAAE,CAAC,MAAM,KAAK;AAClE,UAAM,SAAS,QAAQ,KAAK,MAAM;AAClC,QAAI,WAAW,eAAe,WAAW,MAAM;AAC7C,iBAAW,KAAK,WAAW,IAAI;AAAA,IACjC,WAAW,WAAW,aAAa,WAAW,MAAM;AAClD,iBAAW,KAAK,SAAS,IAAI;AAC7B,iBAAW;AAAA,IACb,WAAW,WAAW,YAAY;AAChC,iBAAW;AAAA,IACb,WAAW,WAAW,SAAS;AAC7B,iBAAW;AACX,iBAAW,KAAK,SAAS,IAAI;AAC7B,cAAQ;AAAA,IACV,WAAW,WAAW,SAAS;AAC7B,cAAQ;AAAA,IACV,WAAW,WAAW,iBAAiB;AACrC,sBAAgB;AAChB,sBAAgB;AAAA,IAClB,WAAW,WAAW,QAAQ;AAC5B,aAAO;AAAA,IACT,WAAW,WAAW,QAAQ;AAC5B,aAAO;AAAA,IACT,WAAW,WAAW,WAAW;AAC/B,gBAAU;AAAA,IACZ,WAAW,WAAW,eAAe;AACnC,iBAAW,KAAK,aAAa,IAAI;AAAA,IACnC,WAAW,WAAW,cAAc;AAClC,iBAAW,KAAK,YAAY,IAAI;AAAA,IAClC,WAAW,WAAW,qBAAqB;AACzC,iBAAW,KAAK,mBAAmB,IAAI;AAAA,IACzC,WAAW,WAAW,iBAAiB;AACrC,iBAAW,KAAK,eAAe,IAAI;AAAA,IACrC,WAAW,WAAW,eAAe;AACnC,iBAAW,KAAK,cAAc,KAAK;AAAA,IACrC,WAAW,WAAW,aAAa;AACjC,iBAAW,KAAK,YAAY,KAAK;AAAA,IACnC,WAAW,WAAW,mBAAmB;AACvC,iBAAW,KAAK,mBAAmB,IAAI;AAAA,IACzC,WAAW,WAAW,eAAe;AACnC,iBAAW,KAAK,cAAc,KAAK;AAAA,IACrC,WAAW,WAAW,UAAU;AAC9B,iBAAW,KAAK,QAAQ,QAAQ,KAAK,IAAI,EAAE,MAAM,GAAG,CAAC;AACrD;AAAA,IACF,WAAW,WAAW,WAAW;AAC/B,iBAAW,KAAK,YAAY,QAAQ,KAAK,IAAI,EAAE,MAAM,GAAG,CAAC;AACzD;AAAA,IACF,WAAW,WAAW,cAAc;AAClC,iBAAW,KAAK,YAAY,IAAI;AAAA,IAClC,WAAW,WAAW,cAAc;AAClC,iBAAW,KAAK,YAAY,GAAG;AAAA,IACjC,WAAW,WAAW,eAAe;AACnC,iBAAW,KAAK,OAAO,GAAG;AAAA,IAC5B,WAAW,WAAW,aAAa;AACjC,iBAAW,KAAK,OAAO,GAAG;AAAA,IAC5B,WAAW,WAAW,eAAe;AACnC,iBAAW,KAAK,OAAO,GAAG;AAAA,IAC5B,WAAW,WAAW,mBAAmB;AACvC,iBAAW,KAAK,iBAAiB,IAAI;AAAA,IACvC,WAAW,WAAW,uBAAuB;AAC3C,iBAAW,KAAK,qBAAqB,QAAQ,KAAK,IAAI,CAAC;AACvD;AAAA,IACF,OAAO;AACL,YAAM,IAAI,MAAM,eAAe,MAAM,EAAE;AAAA,IACzC;AAAA,EACF;AACA,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,UAAU,GAAG;AACxD,QAAI,SAAS,QAAQ,KAAK,IAAI,GAAG;AAC/B,aAAO;AACP;AAAA,IACF;AAAA,EACF;AACA,MAAI;AACJ,MAAI,UAAU;AACZ,QAAI,eAAe;AACjB,cAAQ,IAAI,MAAM,QAAQ,KAAK,KAAK,GAAG,CAAC,KAAK;AAAA,IAC/C,OAAO;AACL,cAAQ,IAAI,KAAK,QAAQ,KAAK,KAAK,GAAG,CAAC,EAAE;AAAA,IAC3C;AAAA,EACF;AACA,MAAI,SAAS,QAAW;AACtB,UAAM,SAAS,uBAAuB,IAAI;AAC1C,QAAI,WAAW,MAAM;AACnB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AACA,wBAAoB;AACpB;AAAA,EACF,OAAO;AACL,UAAM,OAA+B,CAAC;AACtC,UAAM,SAAS;AACf,WAAO,OAAO,IAAI,QAAQ,KAAK,UAAU,QAAQ,KAAK,IAAI,EAAE,WAAW,GAAG;AAExE,WAAK,KAAK;AAAA,QACR,SAAS,QAAQ,KAAK,IAAI;AAAA,QAC1B,UAAU,WAAW,QAAQ,KAAK,OAAO,CAAC,CAAC;AAAA,MAC7C,CAAC;AACD,cAAQ;AAAA,IACV;AAEA,wBAAoB;AAAA,MAClB,OAAO,QAAQ,KAAK,MAAM;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,kBAAkB,UAAU;AAC5C,QAAM,KAAK,IAAI,eAAe,mBAAmB,OAAO;AACxD,KAAG,YAAY;AACf,KAAG,SAAS;AACZ,MAAI,OAAO,QAAQ,KAAK,QAAQ;AAC9B,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,MAAI,OAAO;AACT,YAAQ,IAAI,GAAG,SAAS,CAAC;AAAA,EAC3B,WAAW,eAAe;AACxB,YAAQ,IAAI,GAAG,iBAAiB,CAAC;AAAA,EACnC,WAAW,UAAU;AACnB,YAAQ,IAAI,GAAG,YAAY,CAAC;AAAA,EAC9B,WAAW,OAAO;AAChB,YAAQ,IAAI,GAAG,YAAY,QAAW,QAAW,QAAW,IAAI,CAAC;AAAA,EACnE,WAAW,MAAM;AACf,YAAQ,IAAI,KAAK,UAAU,GAAG,MAAM,CAAC,CAAC;AAAA,EACxC,WAAW,MAAM;AACf,OAAG,kBAAkB,QAAQ,GAAG;AAAA,EAClC,WAAW,SAAS;AAClB,OAAG,UAAU,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AAAA,EACpC;AACF;",
4
+ "sourcesContent": ["// To run this file directly:\n// bun run src/bin/puzzle-geometry-bin.ts -- <program args>\n\nimport {\n type ExperimentalPuzzleBaseShape,\n type ExperimentalPuzzleCutType,\n type ExperimentalPuzzleGeometryOptions,\n getPG3DNamedPuzzles,\n PuzzleGeometry,\n parsePuzzleDescription,\n} from \"cubing/puzzle-geometry\";\nimport type { PuzzleDescriptionString } from \"cubing/puzzle-geometry/PGPuzzles\";\nimport type {\n PuzzleCutDescription,\n PuzzleDescription,\n} from \"cubing/puzzle-geometry/PuzzleGeometry\";\n\nexport function asstructured(v: any): any {\n if (typeof v === \"string\") {\n return JSON.parse(v);\n }\n return v;\n}\nexport function asboolean(v: any): boolean {\n if (typeof v === \"string\") {\n return v !== \"false\";\n } else {\n return !!v;\n }\n}\nexport function parsePGOptionList(\n optionlist?: any[],\n): ExperimentalPuzzleGeometryOptions {\n const options: ExperimentalPuzzleGeometryOptions = {};\n if (optionlist !== undefined) {\n if (optionlist.length % 2 !== 0) {\n throw new Error(\"Odd length in option list?\");\n }\n for (let i = 0; i < optionlist.length; i += 2) {\n if (optionlist[i] === \"verbose\") {\n options.verbosity = (options.verbosity ?? 0) + 1;\n } else if (optionlist[i] === \"quiet\") {\n options.verbosity = 0;\n } else if (optionlist[i] === \"allmoves\") {\n options.allMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"outerblockmoves\") {\n options.outerBlockMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"vertexmoves\") {\n options.vertexMoves = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"rotations\") {\n options.addRotations = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"cornersets\") {\n options.includeCornerOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"centersets\") {\n options.includeCenterOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"edgesets\") {\n options.includeEdgeOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"omit\") {\n options.excludeOrbits = optionlist[i + 1];\n } else if (optionlist[i] === \"graycorners\") {\n options.grayCorners = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"graycenters\") {\n options.grayCenters = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"grayedges\") {\n options.grayEdges = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"movelist\") {\n options.moveList = asstructured(optionlist[i + 1]);\n } else if (optionlist[i] === \"killorientation\") {\n options.fixedOrientation = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"optimize\") {\n options.optimizeOrbits = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"scramble\") {\n options.scrambleAmount = optionlist[i + 1];\n } else if (optionlist[i] === \"fix\") {\n options.fixedPieceType = optionlist[i + 1];\n } else if (optionlist[i] === \"orientcenters\") {\n options.orientCenters = asboolean(optionlist[i + 1]);\n } else if (optionlist[i] === \"puzzleorientation\") {\n options.puzzleOrientation = asstructured(optionlist[i + 1]);\n } else if (optionlist[i] === \"puzzleorientations\") {\n options.puzzleOrientations = asstructured(optionlist[i + 1]);\n } else {\n throw new Error(\n `Bad option while processing option list ${optionlist[i]}`,\n );\n }\n }\n }\n return options;\n}\n\nlet dosvg = false;\nlet doss = false;\nlet doksolve = false;\nlet dogap = false;\nlet domathematica = false;\nlet docanon = false;\nlet do3d = false;\nif (globalThis.process && process.argv && process.argv.length <= 2) {\n console.log(\n `Usage: puzzle-geometry [options] [puzzle]\n\nOptions:\n--ksolve: write ksolve (tws) file\n--svg: write SVG (default is flat; --3d makes it 3D)\n--gap: write gap\n--mathematica: write mathematica\n--ss: execute Schrier-Sims calculation\n--3d: use 3D format for SVG file\n--canon: write canonical string analysis\n--rotations: include full-puzzle rotations as moves\n--allmoves: includes all moves (i.e., slice moves for 3x3x3)\n--outerblockmoves: use outer block moves rather than slice moves\n--vertexmoves: for tetrahedral puzzles, prefer vertex moves to face moves\n--nocorners: ignore all corners\n--noedges: ignore all edges\n--nocenters: ignore all centers\n--noorientation: ignore orientations\n--orientcenters: give centers an orientation\n--puzzleorientation: for 3D formats, give puzzle orientation\n--moves movenames: restrict moves to this list (e.g, U2,F,r)\n--optimize: optimize tws/ksolve/gap output\n--scramble: scramble solved position\n--fixcorner: choose moves to keep one corner fixed\n--fixedge: choose moves to keep one edge fixed\n--fixcenter: choose moves to keep one center fixed\n--verbose (-v): make verbose\n\nThe puzzle can be given as a geometric description or by name.\nThe geometric description starts with c (cube), t (tetrahedron),\nd (dodecahedron), i (icosahedron), or o (octahedron), then a\nspace, then a series of cuts. Each cut begins with f (for a\ncut parallel to faces), v (for a cut perpendicular to a ray\nfrom the center through a corner), or e (for a cut perpendicular\nto a ray from the center through an edge) followed by a decimal\nnumber giving a distance, where 1 is the distance between the\ncenter of the puzzle and the center of a face.\n\nThe puzzle names recognized are 2x2x2 through 13x13x13, 20x20x20,\nmaster skewb, professor skewb, compy cube, helicopter, dino,\nlittle chop, pyramorphix, mastermorphix, pyraminx, Jing pyraminx,\nmaster paramorphix, megaminx, gigaminx, pentultimate, starminx,\nstarminx 2, pyraminx crystal, chopasaurus, big chop, skewb diamond,\nFTO, Christopher's jewel, octastar, Trajber's octahedron, radio chop,\nicosamate, Regular Astrominx, Regular Astrominx + Big Chop,\nRedicosahedron, Redicosahedron with centers,Icosaminx, and Eitan's star.\n\nExamples:\n puzzlegeometry --ss 2x2x2\n puzzlegeometry --ss --fixcorner 2x2x2\n puzzlegeometry --ss --moves U,F2,r 4x4x4\n puzzlegeometry --ksolve --optimize --moves U,F,R megaminx\n puzzlegeometry --gap --noedges megaminx\n`,\n );\n}\nif (globalThis.process && process.argv && process.argv.length >= 3) {\n let desc: PuzzleDescriptionString | undefined;\n const puzzleList = getPG3DNamedPuzzles();\n let argp = 2;\n const optionlist = [];\n let showargs = true;\n let pascalcomment = false;\n while (argp < process.argv.length && process.argv[argp][0] === \"-\") {\n const option = process.argv[argp++];\n if (option === \"--verbose\" || option === \"-v\") {\n optionlist.push(\"verbose\", true);\n } else if (option === \"--quiet\" || option === \"-q\") {\n optionlist.push(\"quiet\", true);\n showargs = false;\n } else if (option === \"--ksolve\") {\n doksolve = true;\n } else if (option === \"--svg\") {\n showargs = false;\n optionlist.push(\"quiet\", true);\n dosvg = true;\n } else if (option === \"--gap\") {\n dogap = true;\n } else if (option === \"--mathematica\") {\n domathematica = true;\n pascalcomment = true;\n } else if (option === \"--ss\") {\n doss = true;\n } else if (option === \"--3d\") {\n do3d = true;\n } else if (option === \"--canon\") {\n docanon = true;\n } else if (option === \"--rotations\") {\n optionlist.push(\"rotations\", true);\n } else if (option === \"--allmoves\") {\n optionlist.push(\"allmoves\", true);\n } else if (option === \"--outerblockmoves\") {\n optionlist.push(\"outerblockmoves\", true);\n } else if (option === \"--vertexmoves\") {\n optionlist.push(\"vertexmoves\", true);\n } else if (option === \"--nocorners\") {\n optionlist.push(\"cornersets\", false);\n } else if (option === \"--noedges\") {\n optionlist.push(\"edgesets\", false);\n } else if (option === \"--noorientation\") {\n optionlist.push(\"killorientation\", true);\n } else if (option === \"--nocenters\") {\n optionlist.push(\"centersets\", false);\n } else if (option === \"--omit\") {\n optionlist.push(\"omit\", process.argv[argp].split(\",\"));\n argp++;\n } else if (option === \"--moves\") {\n optionlist.push(\"movelist\", process.argv[argp].split(\",\"));\n argp++;\n } else if (option === \"--optimize\") {\n optionlist.push(\"optimize\", true);\n } else if (option === \"--scramble\") {\n optionlist.push(\"scramble\", 100);\n } else if (option === \"--fixcorner\") {\n optionlist.push(\"fix\", \"v\");\n } else if (option === \"--fixedge\") {\n optionlist.push(\"fix\", \"e\");\n } else if (option === \"--fixcenter\") {\n optionlist.push(\"fix\", \"f\");\n } else if (option === \"--orientcenters\") {\n optionlist.push(\"orientcenters\", true);\n } else if (option === \"--puzzleorientation\") {\n optionlist.push(\"puzzleorientation\", process.argv[argp]);\n argp++;\n } else {\n throw new Error(`Bad option: ${option}`);\n }\n }\n for (const [name, curDesc] of Object.entries(puzzleList)) {\n if (name === process.argv[argp]) {\n desc = curDesc;\n break;\n }\n }\n let puzzleDescription: PuzzleDescription;\n if (showargs) {\n if (pascalcomment) {\n console.log(`(* ${process.argv.join(\" \")} *)`);\n } else {\n console.log(`# ${process.argv.join(\" \")}`);\n }\n }\n if (desc !== undefined) {\n const parsed = parsePuzzleDescription(desc);\n if (parsed === null) {\n throw new Error(\"Could not parse puzzle description!\");\n }\n puzzleDescription = parsed;\n argp++;\n } else {\n const cuts: PuzzleCutDescription[] = [];\n const cutarg = argp++;\n while (argp + 1 < process.argv.length && process.argv[argp].length === 1) {\n // TODO: validate cut type\n cuts.push({\n cutType: process.argv[argp] as ExperimentalPuzzleCutType,\n distance: parseFloat(process.argv[argp + 1]),\n });\n argp += 2;\n }\n // TODO: validate shape\n puzzleDescription = {\n shape: process.argv[cutarg] as ExperimentalPuzzleBaseShape,\n cuts,\n };\n }\n const options = parsePGOptionList(optionlist);\n const pg = new PuzzleGeometry(puzzleDescription, options);\n pg.allstickers();\n pg.genperms();\n if (argp < process.argv.length) {\n throw new Error(\"Unprocessed content at end of command line\");\n }\n if (dogap) {\n console.log(pg.writegap());\n } else if (domathematica) {\n console.log(pg.writemathematica());\n } else if (doksolve) {\n console.log(pg.writeksolve()); // TODO: Update arguments\n } else if (dosvg) {\n console.log(pg.generatesvg(undefined, undefined, undefined, do3d));\n } else if (do3d) {\n console.log(JSON.stringify(pg.get3d()));\n } else if (doss) {\n pg.writeSchreierSims(console.log);\n } else if (docanon) {\n pg.showcanon((_) => console.log(_));\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import "./chunks/chunk-DFQMTDRG.js";
2
+ import "./chunks/chunk-J53ID3VX.js";
3
3
 
4
4
  // src/bin/scramble.ts
5
5
  import { eventInfo } from "cubing/puzzles";
@@ -153,6 +153,7 @@ ${scrambleText(scramble)}
153
153
  }
154
154
  jsonListPrinter?.finish();
155
155
  }
156
+ (await import("node:process")).exit(0);
156
157
  }
157
158
  });
158
159
  await run(binary(app), process.argv);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/bin/scramble.ts"],
4
- "sourcesContent": ["// To run this file directly:\n// bun run src/bin/scramble.ts -- 333\n\n// TODO: completions for `bash`, `zsh`, and `fish`: https://github.com/loilo/completarr\n\n// Important! We import this instead of inlining, because `esbuild` preserves import order semantics but hoists imports above any code inlined here.\n\nimport type { Alg } from \"cubing/alg\";\nimport { eventInfo } from \"cubing/puzzles\";\nimport { randomScrambleForEvent } from \"cubing/scramble\";\nimport { setSearchDebug } from \"cubing/search\";\nimport \"./guards/cmd-ts-too-guard\";\n\nconst {\n binary,\n number: cmdNumber,\n string: cmdString,\n command,\n flag,\n oneOf,\n option,\n optional,\n positional,\n run,\n} = await import(\"cmd-ts-too\");\n\n// TODO: file an issue about printing these values.\nconst outputFormats = [\"text\", \"link\", \"json-text\"] as const;\nconst notationTypes = [\"auto\", \"LGN\"] as const;\n\nconst app = command({\n name: \"scramble\",\n args: {\n amount: option({\n description: \"Amount of scrambles\",\n type: cmdNumber,\n long: \"amount\",\n short: \"n\",\n defaultValue: () => 1,\n defaultValueIsSerializable: true,\n }),\n format: option({\n description: `Output format. One of: ${outputFormats.join(\", \")}`,\n type: optional(oneOf(outputFormats)),\n long: \"format\",\n short: \"f\",\n }),\n notation: option({\n description: `Notation type. One of: ${notationTypes.join(\", \")}`,\n type: optional(oneOf([\"auto\", \"LGN\"])),\n long: \"notation\",\n }),\n text: flag({\n description: \"Convenient shorthand for `--format text`.\",\n long: \"t\", // TODO: https://github.com/lgarron/cmd-ts-too/issues/6\n short: \"t\",\n }),\n eventID: positional({\n type: cmdString,\n displayName: \"WCA or unofficial event ID\",\n }),\n },\n handler: async ({ amount, format: argsFormat, notation, text, eventID }) => {\n const format =\n argsFormat ?? (text || !process.stdout.isTTY ? \"text\" : \"auto\");\n\n setSearchDebug({ logPerf: false, showWorkerInstantiationWarnings: false });\n\n function scrambleText(scramble: Alg): string {\n return scramble.toString({\n // TODO: any\n notation: notation as (typeof notationTypes)[number], // TODO: handle type conversion at arg parse time.\n });\n }\n\n function scrambleLink(scramble: Alg): string {\n const url = new URL(\"https://alpha.twizzle.net/edit/\");\n const puzzleID = eventInfo(eventID)?.puzzleID;\n puzzleID && url.searchParams.set(\"puzzle\", puzzleID);\n url.searchParams.set(\"alg\", scrambleText(scramble));\n return url.toString();\n }\n\n class JSONListPrinter<T> {\n #finished = false;\n #firstValuePrintedAlready = false;\n constructor() {\n process.stdout.write(\"[\\n \");\n }\n\n push(value: T) {\n if (this.#firstValuePrintedAlready) {\n process.stdout.write(\",\\n \");\n }\n this.#firstValuePrintedAlready = true;\n process.stdout.write(JSON.stringify(value));\n }\n\n finish() {\n if (this.#finished) {\n throw new Error(\"Tried to finish JSON list printing multiple times.\");\n }\n this.#finished = true;\n console.log(\"\\n]\");\n }\n }\n\n if (format !== \"json-text\" && amount === 1) {\n const scramble = await randomScrambleForEvent(eventID);\n\n switch (format) {\n case \"text\": {\n console.log(scrambleText(scramble));\n break;\n }\n case \"link\": {\n console.log(scrambleLink(scramble));\n break;\n }\n // @ts-ignore This is a code guard for future refactoring.\n case \"json-text\": {\n throw new Error(\n \"Encountered `json` format in code that is not expected to handle it.\",\n );\n }\n case \"auto\": {\n console.log(`${scrambleText(scramble)}\n\n\uD83D\uDD17 ${scrambleLink(scramble)}`);\n break;\n }\n default: {\n throw new Error(\"Unknown format!\");\n }\n }\n } else {\n const jsonListPrinter: JSONListPrinter<string> | undefined =\n format === \"json-text\" ? new JSONListPrinter() : undefined;\n for (let i = 0; i < amount; i++) {\n // @ts-ignore: Top-level await is okay because this is not part of the main library.\n const scramble = await randomScrambleForEvent(eventID);\n switch (format) {\n case \"text\": {\n console.log(`// Scramble #${i + 1}`);\n console.log(`${scrambleText(scramble)}\\n`);\n break;\n }\n case \"link\": {\n console.log(`// Scramble #${i + 1}`);\n console.log(`${scrambleLink(scramble)}\\n`);\n break;\n }\n case \"json-text\": {\n jsonListPrinter?.push(scramble.toString());\n break;\n }\n case \"auto\": {\n console.log(`// Scramble #${i + 1}\n${scrambleText(scramble)}\n\n\uD83D\uDD17 ${scrambleLink(scramble)}\n`);\n break;\n }\n default: {\n throw new Error(\"Unknown format!\");\n }\n }\n }\n jsonListPrinter?.finish();\n }\n },\n});\n\nawait run(binary(app), process.argv);\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// To run this file directly:\n// bun run src/bin/scramble.ts -- 333\n\n// TODO: completions for `bash`, `zsh`, and `fish`: https://github.com/loilo/completarr\n\n// Important! We import this instead of inlining, because `esbuild` preserves import order semantics but hoists imports above any code inlined here.\n\nimport type { Alg } from \"cubing/alg\";\nimport { eventInfo } from \"cubing/puzzles\";\nimport { randomScrambleForEvent } from \"cubing/scramble\";\nimport { setSearchDebug } from \"cubing/search\";\nimport \"./guards/cmd-ts-too-guard\";\n\nconst {\n binary,\n number: cmdNumber,\n string: cmdString,\n command,\n flag,\n oneOf,\n option,\n optional,\n positional,\n run,\n} = await import(\"cmd-ts-too\");\n\n// TODO: file an issue about printing these values.\nconst outputFormats = [\"text\", \"link\", \"json-text\"] as const;\nconst notationTypes = [\"auto\", \"LGN\"] as const;\n\nconst app = command({\n name: \"scramble\",\n args: {\n amount: option({\n description: \"Amount of scrambles\",\n type: cmdNumber,\n long: \"amount\",\n short: \"n\",\n defaultValue: () => 1,\n defaultValueIsSerializable: true,\n }),\n format: option({\n description: `Output format. One of: ${outputFormats.join(\", \")}`,\n type: optional(oneOf(outputFormats)),\n long: \"format\",\n short: \"f\",\n }),\n notation: option({\n description: `Notation type. One of: ${notationTypes.join(\", \")}`,\n type: optional(oneOf([\"auto\", \"LGN\"])),\n long: \"notation\",\n }),\n text: flag({\n description: \"Convenient shorthand for `--format text`.\",\n long: \"t\", // TODO: https://github.com/lgarron/cmd-ts-too/issues/6\n short: \"t\",\n }),\n eventID: positional({\n type: cmdString,\n displayName: \"WCA or unofficial event ID\",\n }),\n },\n handler: async ({ amount, format: argsFormat, notation, text, eventID }) => {\n const format =\n argsFormat ?? (text || !process.stdout.isTTY ? \"text\" : \"auto\");\n\n setSearchDebug({ logPerf: false, showWorkerInstantiationWarnings: false });\n\n function scrambleText(scramble: Alg): string {\n return scramble.toString({\n // TODO: any\n notation: notation as (typeof notationTypes)[number], // TODO: handle type conversion at arg parse time.\n });\n }\n\n function scrambleLink(scramble: Alg): string {\n const url = new URL(\"https://alpha.twizzle.net/edit/\");\n const puzzleID = eventInfo(eventID)?.puzzleID;\n puzzleID && url.searchParams.set(\"puzzle\", puzzleID);\n url.searchParams.set(\"alg\", scrambleText(scramble));\n return url.toString();\n }\n\n class JSONListPrinter<T> {\n #finished = false;\n #firstValuePrintedAlready = false;\n constructor() {\n process.stdout.write(\"[\\n \");\n }\n\n push(value: T) {\n if (this.#firstValuePrintedAlready) {\n process.stdout.write(\",\\n \");\n }\n this.#firstValuePrintedAlready = true;\n process.stdout.write(JSON.stringify(value));\n }\n\n finish() {\n if (this.#finished) {\n throw new Error(\"Tried to finish JSON list printing multiple times.\");\n }\n this.#finished = true;\n console.log(\"\\n]\");\n }\n }\n\n if (format !== \"json-text\" && amount === 1) {\n const scramble = await randomScrambleForEvent(eventID);\n\n switch (format) {\n case \"text\": {\n console.log(scrambleText(scramble));\n break;\n }\n case \"link\": {\n console.log(scrambleLink(scramble));\n break;\n }\n // @ts-ignore This is a code guard for future refactoring.\n case \"json-text\": {\n throw new Error(\n \"Encountered `json` format in code that is not expected to handle it.\",\n );\n }\n case \"auto\": {\n console.log(`${scrambleText(scramble)}\n\n\uD83D\uDD17 ${scrambleLink(scramble)}`);\n break;\n }\n default: {\n throw new Error(\"Unknown format!\");\n }\n }\n } else {\n const jsonListPrinter: JSONListPrinter<string> | undefined =\n format === \"json-text\" ? new JSONListPrinter() : undefined;\n for (let i = 0; i < amount; i++) {\n // @ts-ignore: Top-level await is okay because this is not part of the main library.\n const scramble = await randomScrambleForEvent(eventID);\n switch (format) {\n case \"text\": {\n console.log(`// Scramble #${i + 1}`);\n console.log(`${scrambleText(scramble)}\\n`);\n break;\n }\n case \"link\": {\n console.log(`// Scramble #${i + 1}`);\n console.log(`${scrambleLink(scramble)}\\n`);\n break;\n }\n case \"json-text\": {\n jsonListPrinter?.push(scramble.toString());\n break;\n }\n case \"auto\": {\n console.log(`// Scramble #${i + 1}\n${scrambleText(scramble)}\n\n\uD83D\uDD17 ${scrambleLink(scramble)}\n`);\n break;\n }\n default: {\n throw new Error(\"Unknown format!\");\n }\n }\n }\n jsonListPrinter?.finish();\n }\n\n // TODO(https://github.com/cubing/cubing.js/issues/358): this shouldn't be needed.\n (await import(\"node:process\")).exit(0);\n },\n});\n\nawait run(binary(app), process.argv);\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }