cubing 0.63.7 → 0.64.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 (100) hide show
  1. package/dist/bin/chunks/{chunk-6YZ4AUWL.js → chunk-DQNBCFR3.js} +2 -2
  2. package/dist/bin/chunks/{chunk-6YZ4AUWL.js.map → chunk-DQNBCFR3.js.map} +1 -1
  3. package/dist/bin/order.js +1 -1
  4. package/dist/bin/order.js.map +1 -1
  5. package/dist/bin/puzzle-geometry-bin.js +1 -1
  6. package/dist/bin/puzzle-geometry-bin.js.map +1 -1
  7. package/dist/bin/scramble.js +1 -1
  8. package/dist/bin/scramble.js.map +1 -1
  9. package/dist/bin/svg.js +1 -1
  10. package/dist/bin/svg.js.map +1 -1
  11. package/dist/lib/cubing/alg/index.d.ts +1 -1
  12. package/dist/lib/cubing/alg/index.js +1 -1
  13. package/dist/lib/cubing/bluetooth/index.d.ts +17 -17
  14. package/dist/lib/cubing/bluetooth/index.js +96 -96
  15. package/dist/lib/cubing/bluetooth/index.js.map +2 -2
  16. package/dist/lib/cubing/chunks/{big-puzzle-orientation-ADWIOX6S.js → big-puzzle-orientation-G75BXW2W.js} +2 -2
  17. package/dist/lib/cubing/chunks/big-puzzle-orientation-G75BXW2W.js.map +7 -0
  18. package/dist/lib/cubing/chunks/{chunk-A7FK4XKU.js → chunk-5LBACZOM.js} +173 -144
  19. package/dist/lib/cubing/chunks/chunk-5LBACZOM.js.map +7 -0
  20. package/dist/lib/cubing/chunks/{chunk-5KMTA6PX.js → chunk-7MYDNYZ3.js} +3 -3
  21. package/dist/lib/cubing/chunks/chunk-7MYDNYZ3.js.map +7 -0
  22. package/dist/lib/cubing/chunks/{chunk-7LXHWXCO.js → chunk-ALR6ZQFC.js} +2 -2
  23. package/dist/lib/cubing/chunks/chunk-ALR6ZQFC.js.map +7 -0
  24. package/dist/lib/cubing/chunks/{chunk-H5KMIDAF.js → chunk-DTYBGCI3.js} +5 -5
  25. package/dist/lib/cubing/chunks/chunk-DTYBGCI3.js.map +7 -0
  26. package/dist/lib/cubing/chunks/{chunk-YR72E7KZ.js → chunk-GO2SL6SC.js} +38 -38
  27. package/dist/lib/cubing/chunks/chunk-GO2SL6SC.js.map +7 -0
  28. package/dist/lib/cubing/chunks/{chunk-FUAADKXE.js → chunk-KHUP3BPA.js} +35 -34
  29. package/dist/lib/cubing/chunks/chunk-KHUP3BPA.js.map +7 -0
  30. package/dist/lib/cubing/chunks/{chunk-MQSQDKWH.js → chunk-O2QJENHE.js} +3 -3
  31. package/dist/lib/cubing/chunks/chunk-O2QJENHE.js.map +7 -0
  32. package/dist/lib/cubing/chunks/{chunk-5ONX3JVC.js → chunk-THRYJMRP.js} +8 -8
  33. package/dist/lib/cubing/chunks/chunk-THRYJMRP.js.map +7 -0
  34. package/dist/lib/cubing/chunks/{chunk-UEUJSZTX.js → chunk-UWJ575HH.js} +58 -46
  35. package/dist/lib/cubing/chunks/chunk-UWJ575HH.js.map +7 -0
  36. package/dist/lib/cubing/chunks/{chunk-N5FJ5YIA.js → chunk-YFNXHRNE.js} +37 -31
  37. package/dist/lib/cubing/chunks/chunk-YFNXHRNE.js.map +7 -0
  38. package/dist/lib/cubing/chunks/{inside-JAJOK2MI.js → inside-A7LIP56H.js} +14 -14
  39. package/dist/lib/cubing/chunks/inside-A7LIP56H.js.map +7 -0
  40. package/dist/lib/cubing/chunks/{puzzles-dynamic-side-events-IMYJ533P.js → puzzles-dynamic-side-events-653A7JCM.js} +1 -1
  41. package/dist/lib/cubing/chunks/puzzles-dynamic-side-events-653A7JCM.js.map +7 -0
  42. package/dist/lib/cubing/chunks/{puzzles-dynamic-unofficial-P3TW433I.js → puzzles-dynamic-unofficial-2CY6GVZ4.js} +1 -1
  43. package/dist/lib/cubing/chunks/{puzzles-dynamic-unofficial-P3TW433I.js.map → puzzles-dynamic-unofficial-2CY6GVZ4.js.map} +1 -1
  44. package/dist/lib/cubing/chunks/{search-dynamic-sgs-side-events-WORUZVF5.js → search-dynamic-sgs-side-events-YSB3MWLK.js} +6 -6
  45. package/dist/lib/cubing/chunks/search-dynamic-sgs-side-events-YSB3MWLK.js.map +7 -0
  46. package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-5JQKPNG2.js → search-dynamic-sgs-unofficial-OLK64DE6.js} +6 -6
  47. package/dist/lib/cubing/chunks/{search-dynamic-sgs-unofficial-5JQKPNG2.js.map → search-dynamic-sgs-unofficial-OLK64DE6.js.map} +1 -1
  48. package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-BGV4AJVT.js → search-dynamic-solve-4x4x4-WWFUMIDG.js} +7 -7
  49. package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-I5ID5LXD.js → search-dynamic-solve-fto-ZZKLTONP.js} +2 -2
  50. package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-Y2D3C74Y.js → search-dynamic-solve-kilominx-PUF4PRHS.js} +2 -2
  51. package/dist/lib/cubing/chunks/search-worker-entry.js +1 -1
  52. package/dist/lib/cubing/chunks/search-worker-entry.js.map +2 -2
  53. package/dist/lib/cubing/chunks/{twips-ZNMKGC5U.js → twips-LHO3IYJC.js} +2 -2
  54. package/dist/lib/cubing/chunks/{twisty-dynamic-3d-4BEQ76PB.js → twisty-dynamic-3d-A2G22YLA.js} +6 -6
  55. package/dist/lib/cubing/chunks/twisty-dynamic-3d-A2G22YLA.js.map +7 -0
  56. package/dist/lib/cubing/{index-B2leUGbW.d.ts → index-C2x6Sc62.d.ts} +52 -47
  57. package/dist/lib/cubing/{index-BLw2OxXo.d.ts → index-Doa1gNE4.d.ts} +1 -1
  58. package/dist/lib/cubing/kpuzzle/index.d.ts +1 -1
  59. package/dist/lib/cubing/kpuzzle/index.js +2 -2
  60. package/dist/lib/cubing/notation/index.d.ts +17 -15
  61. package/dist/lib/cubing/notation/index.js +4 -4
  62. package/dist/lib/cubing/{outside-V6_PW1ZK.d.ts → outside-nf-4k7Tp.d.ts} +1 -1
  63. package/dist/lib/cubing/protocol/index.d.ts +1 -1
  64. package/dist/lib/cubing/protocol/index.js +4 -4
  65. package/dist/lib/cubing/puzzle-geometry/index.d.ts +1 -1
  66. package/dist/lib/cubing/puzzle-geometry/index.js +284 -184
  67. package/dist/lib/cubing/puzzle-geometry/index.js.map +2 -2
  68. package/dist/lib/cubing/puzzles/index.d.ts +1 -1
  69. package/dist/lib/cubing/puzzles/index.js +4 -4
  70. package/dist/lib/cubing/scramble/index.d.ts +1 -1
  71. package/dist/lib/cubing/scramble/index.js +6 -6
  72. package/dist/lib/cubing/search/index.d.ts +1 -1
  73. package/dist/lib/cubing/search/index.js +6 -6
  74. package/dist/lib/cubing/search/index.js.map +1 -1
  75. package/dist/lib/cubing/stream/index.d.ts +1 -1
  76. package/dist/lib/cubing/stream/index.js +1 -1
  77. package/dist/lib/cubing/stream/index.js.map +1 -1
  78. package/dist/lib/cubing/twisty/index.d.ts +1 -1
  79. package/dist/lib/cubing/twisty/index.js +190 -180
  80. package/dist/lib/cubing/twisty/index.js.map +2 -2
  81. package/package.json +2 -2
  82. package/dist/lib/cubing/chunks/big-puzzle-orientation-ADWIOX6S.js.map +0 -7
  83. package/dist/lib/cubing/chunks/chunk-5KMTA6PX.js.map +0 -7
  84. package/dist/lib/cubing/chunks/chunk-5ONX3JVC.js.map +0 -7
  85. package/dist/lib/cubing/chunks/chunk-7LXHWXCO.js.map +0 -7
  86. package/dist/lib/cubing/chunks/chunk-A7FK4XKU.js.map +0 -7
  87. package/dist/lib/cubing/chunks/chunk-FUAADKXE.js.map +0 -7
  88. package/dist/lib/cubing/chunks/chunk-H5KMIDAF.js.map +0 -7
  89. package/dist/lib/cubing/chunks/chunk-MQSQDKWH.js.map +0 -7
  90. package/dist/lib/cubing/chunks/chunk-N5FJ5YIA.js.map +0 -7
  91. package/dist/lib/cubing/chunks/chunk-UEUJSZTX.js.map +0 -7
  92. package/dist/lib/cubing/chunks/chunk-YR72E7KZ.js.map +0 -7
  93. package/dist/lib/cubing/chunks/inside-JAJOK2MI.js.map +0 -7
  94. package/dist/lib/cubing/chunks/puzzles-dynamic-side-events-IMYJ533P.js.map +0 -7
  95. package/dist/lib/cubing/chunks/search-dynamic-sgs-side-events-WORUZVF5.js.map +0 -7
  96. package/dist/lib/cubing/chunks/twisty-dynamic-3d-4BEQ76PB.js.map +0 -7
  97. /package/dist/lib/cubing/chunks/{search-dynamic-solve-4x4x4-BGV4AJVT.js.map → search-dynamic-solve-4x4x4-WWFUMIDG.js.map} +0 -0
  98. /package/dist/lib/cubing/chunks/{search-dynamic-solve-fto-I5ID5LXD.js.map → search-dynamic-solve-fto-ZZKLTONP.js.map} +0 -0
  99. /package/dist/lib/cubing/chunks/{search-dynamic-solve-kilominx-Y2D3C74Y.js.map → search-dynamic-solve-kilominx-PUF4PRHS.js.map} +0 -0
  100. /package/dist/lib/cubing/chunks/{twips-ZNMKGC5U.js.map → twips-LHO3IYJC.js.map} +0 -0
@@ -4,10 +4,10 @@
4
4
  var packageVersion = (
5
5
  // biome-ignore lint/suspicious/noTsIgnore: This comment is stil present in the compiled file, where an error is *not* expected.
6
6
  /** @ts-ignore Populated by `esbuild` at compile time. */
7
- "0.63.7"
7
+ "0.64.0"
8
8
  );
9
9
 
10
10
  export {
11
11
  packageVersion
12
12
  };
13
- //# sourceMappingURL=chunk-6YZ4AUWL.js.map
13
+ //# sourceMappingURL=chunk-DQNBCFR3.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/metadata/packageVersion.ts"],
4
- "sourcesContent": ["export const packageVersion: string =\n // biome-ignore lint/suspicious/noTsIgnore: This comment is stil present in the compiled file, where an error is *not* expected.\n /** @ts-ignore Populated by `esbuild` at compile time. */\n globalThis.PACKAGE_VERSION ??\n // We don't want to pull in the dynamic code into the import graph, so we use\n // dynamic import here. This entire fallback expression should get compiled\n // out by `esbuild`.\n (await import(\"./packageVersionDynamic\")).version;\n"],
4
+ "sourcesContent": ["export const packageVersion: string =\n // biome-ignore lint/suspicious/noTsIgnore: This comment is stil present in the compiled file, where an error is *not* expected.\n /** @ts-ignore Populated by `esbuild` at compile time. */\n globalThis.PACKAGE_VERSION ??\n // We don't want to pull in the dynamic code into the import graph, so we use\n // dynamic import here. This entire fallback expression should get compiled\n // out by `esbuild`.\n (await import(\"./packageVersionDynamic.ts\")).version;\n"],
5
5
  "mappings": ";;;AAAO,IAAM;AAAA;AAAA;AAAA,EAGX;AAAA;",
6
6
  "names": []
7
7
  }
package/dist/bin/order.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env -S node --
2
2
  import {
3
3
  packageVersion
4
- } from "./chunks/chunk-6YZ4AUWL.js";
4
+ } from "./chunks/chunk-DQNBCFR3.js";
5
5
 
6
6
  // src/bin/order.ts
7
7
  import { basename } from "node:path";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/bin/order.ts"],
4
- "sourcesContent": ["/**\n\nTo run this file directly:\n\n```shell\nbun run -- ./src/bin/order.ts 3x3x3 \"R U R' U R U2' R'\"\n```\n\nTo add an `order` binary to your path and test completions:\n\n```shell\n# fish (from repo root)\nset PATH (pwd)/src/test/bin-path $PATH\norder --completions fish | source\n```\n\n```shell\n# zsh (from repo root)\nautoload -Uz compinit\ncompinit\nexport PATH=$(pwd)/src/test/bin-path:$PATH\nsource <(order --completions zsh)\n```\n\n*/\n\nimport { basename } from \"node:path\";\nimport { argv } from \"node:process\";\nimport { argument, map, message, object, string } from \"@optique/core\";\nimport { run } from \"@optique/run\";\nimport { Alg } from \"cubing/alg\";\nimport { KPuzzle } from \"cubing/kpuzzle\";\nimport { getPuzzleGeometryByName } from \"cubing/puzzle-geometry\";\nimport { puzzles } from \"cubing/puzzles\";\nimport { packageVersion } from \"../metadata/packageVersion\";\n\nconst args = run(\n object({\n puzzleGeometryID: argument(string({ metavar: \"PUZZLE\" }), {\n description: message`Puzzle geometry ID`,\n }),\n alg: map(\n argument(string({ metavar: \"ALG\" }), {\n description: message`Alg`,\n }),\n Alg.fromString,\n ),\n }),\n {\n programName: basename(argv[1]),\n description: message`Example: order 3x3x3 \"R U R' U R U2' R'\"`,\n help: \"option\",\n completion: {\n option: {\n names: [\"--completions\"],\n hidden: false,\n },\n },\n version: {\n option: {\n hidden: false,\n },\n value: packageVersion,\n },\n },\n);\n\nconst { puzzleGeometryID, alg } = args;\n\n/*\n * Turn a name into a geometry.\n */\nconst puzzleLoader = puzzles[puzzleGeometryID];\nconst 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\nconst order = kpuzzle.algToTransformation(alg).repetitionOrder();\nconsole.log(order);\n"],
4
+ "sourcesContent": ["/**\n\nTo run this file directly:\n\n```shell\nbun run -- ./src/bin/order.ts 3x3x3 \"R U R' U R U2' R'\"\n```\n\nTo add an `order` binary to your path and test completions:\n\n```shell\n# fish (from repo root)\nset PATH (pwd)/src/test/bin-path $PATH\norder --completions fish | source\n```\n\n```shell\n# zsh (from repo root)\nautoload -Uz compinit\ncompinit\nexport PATH=$(pwd)/src/test/bin-path:$PATH\nsource <(order --completions zsh)\n```\n\n*/\n\nimport { basename } from \"node:path\";\nimport { argv } from \"node:process\";\nimport { argument, map, message, object, string } from \"@optique/core\";\nimport { run } from \"@optique/run\";\nimport { Alg } from \"cubing/alg\";\nimport { KPuzzle } from \"cubing/kpuzzle\";\nimport { getPuzzleGeometryByName } from \"cubing/puzzle-geometry\";\nimport { puzzles } from \"cubing/puzzles\";\nimport { packageVersion } from \"../metadata/packageVersion.ts\";\n\nconst args = run(\n object({\n puzzleGeometryID: argument(string({ metavar: \"PUZZLE\" }), {\n description: message`Puzzle geometry ID`,\n }),\n alg: map(\n argument(string({ metavar: \"ALG\" }), {\n description: message`Alg`,\n }),\n Alg.fromString,\n ),\n }),\n {\n programName: basename(argv[1]),\n description: message`Example: order 3x3x3 \"R U R' U R U2' R'\"`,\n help: \"option\",\n completion: {\n option: {\n names: [\"--completions\"],\n hidden: false,\n },\n },\n version: {\n option: {\n hidden: false,\n },\n value: packageVersion,\n },\n },\n);\n\nconst { puzzleGeometryID, alg } = args;\n\n/*\n * Turn a name into a geometry.\n */\nconst puzzleLoader = puzzles[puzzleGeometryID];\nconst 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\nconst order = kpuzzle.algToTransformation(alg).repetitionOrder();\nconsole.log(order);\n"],
5
5
  "mappings": ";;;;;;AA0BA,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,UAAU,KAAK,SAAS,QAAQ,cAAc;AACvD,SAAS,WAAW;AACpB,SAAS,WAAW;AACpB,SAAS,eAAe;AACxB,SAAS,+BAA+B;AACxC,SAAS,eAAe;AAGxB,IAAM,OAAO;AAAA,EACX,OAAO;AAAA,IACL,kBAAkB,SAAS,OAAO,EAAE,SAAS,SAAS,CAAC,GAAG;AAAA,MACxD,aAAa;AAAA,IACf,CAAC;AAAA,IACD,KAAK;AAAA,MACH,SAAS,OAAO,EAAE,SAAS,MAAM,CAAC,GAAG;AAAA,QACnC,aAAa;AAAA,MACf,CAAC;AAAA,MACD,IAAI;AAAA,IACN;AAAA,EACF,CAAC;AAAA,EACD;AAAA,IACE,aAAa,SAAS,KAAK,CAAC,CAAC;AAAA,IAC7B,aAAa;AAAA,IACb,MAAM;AAAA,IACN,YAAY;AAAA,MACV,QAAQ;AAAA,QACN,OAAO,CAAC,eAAe;AAAA,QACvB,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,QAAQ;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,EAAE,kBAAkB,IAAI,IAAI;AAKlC,IAAM,eAAe,QAAQ,gBAAgB;AAC7C,IAAM,UAAU,OAAO,YAAY;AACjC,MAAI,cAAc;AAChB,WAAO,MAAM,QAAQ,gBAAgB,EAAE,QAAQ;AAAA,EACjD,OAAO;AACL,UAAM,KAAK,wBAAwB,kBAAkB;AAAA,MACnD,UAAU;AAAA,IACZ,CAAC;AACD,WAAO,IAAI,QAAQ,GAAG,qBAAqB,IAAI,CAAC;AAAA,EAClD;AACF,GAAG;AAEH,IAAM,QAAQ,QAAQ,oBAAoB,GAAG,EAAE,gBAAgB;AAC/D,QAAQ,IAAI,KAAK;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env -S node --
2
2
  import {
3
3
  packageVersion
4
- } from "./chunks/chunk-6YZ4AUWL.js";
4
+ } from "./chunks/chunk-DQNBCFR3.js";
5
5
 
6
6
  // src/bin/puzzle-geometry-bin.ts
7
7
  import { basename } from "node:path";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/bin/puzzle-geometry-bin.ts"],
4
- "sourcesContent": ["/**\n\nTo run this file directly:\n\n```shell\nbun run -- ./src/bin/puzzle-geometry-bin.ts <program args>\n```\n\nTo add a `puzzle-geometry` binary to your path and test completions:\n\n```shell\n# fish (from repo root)\nset PATH (pwd)/src/test/bin-path $PATH\npuzzle-geometry --completions fish | source\n```\n\n```shell\n# zsh (from repo root)\nautoload -Uz compinit\ncompinit\nexport PATH=$(pwd)/src/test/bin-path:$PATH\nsource <(puzzle-geometry --completions zsh)\n```\n\n*/\n\nimport { basename } from \"node:path\";\nimport { argv } from \"node:process\";\nimport {\n argument,\n constant,\n flag,\n integer,\n type Message,\n map,\n merge,\n message,\n multiple,\n type OptionName,\n object,\n option,\n optional,\n or,\n string,\n} from \"@optique/core\";\nimport { run } from \"@optique/run\";\nimport { Move } from \"cubing/alg\";\nimport {\n type ExperimentalPuzzleGeometryOptions,\n getPG3DNamedPuzzles,\n PuzzleGeometry,\n parsePuzzleDescription,\n} from \"cubing/puzzle-geometry\";\nimport { PrintableShellCommand } from \"printable-shell-command\";\nimport { packageVersion } from \"../metadata/packageVersion\";\n\nconst puzzleList = getPG3DNamedPuzzles();\n\n// TODO: make this a `ValueParser`?\nfunction antiBool(optionName: OptionName, description: Message) {\n return optional(\n map(\n flag(optionName, {\n description,\n }),\n (v) => !v,\n ),\n );\n}\n\n// Include using `...subcommandDefaults` at the *beginning* of a subcommand `object({ \u2026 })`.\nconst subcommandDefaults = {\n commentStyle: constant(\"hash\"),\n forceQuiet: constant(undefined),\n} as const;\n\nconst args = run(\n merge(\n object({\n verbosity: optional(\n or(\n map(multiple(flag(\"--verbose\", \"-v\")), (v) => v.length),\n map(flag(\"--quiet\", \"-q\"), () => 0),\n ),\n ),\n }),\n or(\n object({\n ...subcommandDefaults,\n subcommand: constant(\"KSolve\"),\n subcommandFlag: flag(\"--ksolve\", {\n description: message`Print KSolve (\\`.tws\\`).`,\n }),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"SVG\"),\n subcommandFlag: flag(\"--svg\", {\n description: message`Print SVG. Forces \\`--quiet\\`.`,\n }),\n commentStyle: constant(\"none\"),\n svg3D: optional(\n option(\"--3d\", {\n description: message`Use 3D format for SVG file.`,\n }),\n ),\n verbosity: constant(0),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"GAP\"),\n subcommandFlag: flag(\"--gap\", {\n description: message`Print GAP output.`,\n }),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"Mathematica\"),\n subcommandFlag: flag(\"--mathematica\", {\n description: message`Print Mathematica output.`,\n }),\n commentStyle: constant(\"Pascal\"),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"Schreier-Sims\"),\n subcommandFlag: flag(\"--ss\", {\n description: message`Perform Schrier-Sims calculation.`,\n }),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"Canonical string analysis\"),\n subcommandFlag: flag(\"--canon\", {\n description: message`Print canonical string analysis.`,\n }),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"3D\"),\n subcommandFlag: flag(\"--3d\", {\n description: message`Print 3D information.`,\n }),\n }),\n ),\n object({\n // This doesn't apply to SVG, but we place it here so that it doesn't print once for each non-SVG subcommand in the help string.\n optimizeOrbits: option(\"--optimize\", {\n description: message`Optimize output (when possible).`,\n }),\n addRotations: option(\"--rotations\", {\n description: message`Include full-puzzle rotations as moves.`,\n }),\n allMoves: option(\"--allmoves\", {\n description: message`Includes all moves (i.e., slice moves for 3x3x3).`,\n }),\n outerBlockMoves: option(\"--outerblockmoves\", {\n description: message`Use outer block moves rather than slice moves.`,\n }),\n vertexMoves: option(\"--vertexmoves\", {\n description: message`For tetrahedral puzzles, prefer vertex moves to face moves.`,\n }),\n includeCornerOrbits: antiBool(\n \"--nocorners\",\n message`Ignore all corners.`,\n ),\n excludeOrbits: optional(\n map(\n option(\"--omit\", string({ metavar: \"COMMA_SEPARATED_ORBITS\" }), {\n description: message`Omit orbits.`,\n }),\n (s) => s.split(\",\"),\n ),\n ),\n includeEdgeOrbits: antiBool(\"--noedges\", message`Ignore all edges.`),\n includeCenterOrbits: antiBool(\n \"--nocenters\",\n message`Ignore all centers.`,\n ),\n grayCorners: option(\"--graycorners\", {\n description: message`Gray corners.`,\n }),\n grayEdges: option(\"--grayedges\", { description: message`Gray edges.` }),\n grayCenters: option(\"--graycenters\", {\n description: message`Gray centers.`,\n }),\n fixedOrientation: option(\"--noorientation\", {\n description: message`Ignore orientations.`,\n }),\n orientCenters: option(\"--orientcenters\", {\n description: message`Give centers an orientation.`,\n }),\n }),\n optional(\n or(\n object({\n puzzleOrientation: optional(\n map(\n option(\n \"--puzzleorientation\",\n string({ metavar: \"JSON_STRING\" }),\n {\n description: message`For 3D formats, give puzzle orientation.`,\n },\n ),\n (s) => JSON.parse(s),\n ),\n ),\n puzzleOrientations: constant(undefined),\n }),\n object({\n puzzleOrientation: constant(undefined),\n puzzleOrientations: optional(\n map(\n option(\n \"--puzzleorientations\",\n string({ metavar: \"JSON_STRING\" }),\n {\n description: message`For 3D formats, give puzzle orientations.`,\n },\n ),\n (s) => JSON.parse(s),\n ),\n ),\n }),\n ),\n ),\n object({\n fixedPieceType: optional(\n or(\n map(\n flag(\"--fixcorner\", {\n description: message`Auto-select a subset of moves to keep a corner fixed in place.`,\n }),\n () => \"v\" as const,\n ),\n map(\n flag(\"--fixedge\", {\n description: message`Auto-select a subset of moves to keep an edge fixed in place.`,\n }),\n () => \"e\" as const,\n ),\n map(\n flag(\"--fixcenter\", {\n description: message`Auto-select a subset of moves to keep a center fixed in place.`,\n }),\n () => \"f\" as const,\n ),\n ),\n ),\n // TODO: this doesn't make sense for all subcommands?\n scrambleAmount: optional(\n option(\"--scramble\", integer({ min: 0 }), {\n description: message`Scramble solved position.`,\n }),\n ),\n moveList: optional(\n map(\n option(\"--moves\", string({ metavar: \"COMMA_SEPARATED_MOVES\" }), {\n description: message`Restrict moves to this list. Example: \\\"U2,F,r\\\").`,\n }),\n (s) => s.split(\",\").map((m) => Move.fromString(m)),\n ),\n ),\n puzzle: map(\n argument(string({ metavar: \"PUZZLE\" }), {\n description: message`The puzzle can be given as a geometric description or by name.\nThe geometric description starts with one of:\n\n- \\`c\\` (cube),\\n\n- \\`t\\` (tetrahedron),\\n\n- \\`d\\` (dodecahedron),\\n\n- \\`i\\` (icosahedron),\\n\n- \\`o\\` (octahedron),\\n\n\nthen a space, then a series of cuts. Each cut begins with one of:\n\n- \\`f\\` (for a cut parallel to faces),\\n\n- \\`v\\` (for a cut perpendicular to a ray from the center through a corner),\\n\n- \\`e\\` (for a cut perpendicular to a ray from the center through an edge),\\n\n\nfollowed by a decimal number giving a distance, where 1 is the distance\nbetween the center of the puzzle and the center of a face.\n\nExample description: \\`c f 0 v 0.577350269189626 e 0\\`. Corresponds to: https://alpha.twizzle.net/explore/?puzzle=2x2x2+%2B+dino+%2B+little+chop\n\nThe recognized puzzle names are: ${Object.keys(puzzleList)\n .map((p) => JSON.stringify(p))\n .join(\", \")}`,\n }),\n (s) => {\n const parsed = parsePuzzleDescription(puzzleList[s] ?? s);\n if (parsed === null) {\n throw new Error(\"Could not parse puzzle description!\");\n }\n return parsed;\n },\n ),\n }),\n ),\n {\n programName: basename(argv[1]),\n description: message`\nExamples:\n\n puzzle-geometry --ss 2x2x2\\n\n puzzle-geometry --ss --fixcorner 2x2x2\\n\n puzzle-geometry --ss --moves U,F2,r 4x4x4\\n\n puzzle-geometry --ksolve --optimize --moves U,F,R megaminx\\n\n puzzle-geometry --gap --noedges megaminx\n`,\n help: \"option\",\n completion: {\n option: {\n names: [\"--completions\"],\n hidden: false,\n },\n },\n version: {\n option: {\n hidden: false,\n },\n value: packageVersion,\n },\n },\n);\n\nif (args.verbosity !== 0) {\n const cmd = () => {\n const [command, ...args] = argv;\n return new PrintableShellCommand(command, args).getPrintableCommand({\n argumentLineWrapping: \"inline\",\n });\n };\n\n switch (args.commentStyle) {\n case \"hash\": {\n console.log(`# ${cmd()}`);\n break;\n }\n case \"none\": {\n break;\n }\n case \"Pascal\": {\n console.log(`(* ${cmd()} *)`);\n break;\n }\n default:\n throw new Error(\"Invalid comment style.\") as never;\n }\n}\n\nfunction buildPuzzleGeometry(): PuzzleGeometry {\n const {\n verbosity,\n optimizeOrbits,\n addRotations,\n allMoves,\n outerBlockMoves,\n vertexMoves,\n includeCornerOrbits,\n includeCenterOrbits,\n includeEdgeOrbits,\n excludeOrbits,\n grayCorners,\n grayEdges,\n grayCenters,\n fixedOrientation,\n orientCenters,\n puzzleOrientation,\n puzzleOrientations,\n fixedPieceType,\n scrambleAmount,\n moveList,\n } = args;\n const options: ExperimentalPuzzleGeometryOptions = {\n verbosity,\n optimizeOrbits,\n addRotations,\n allMoves,\n outerBlockMoves,\n vertexMoves,\n includeCornerOrbits,\n includeCenterOrbits,\n includeEdgeOrbits,\n excludeOrbits,\n grayCorners,\n grayEdges,\n grayCenters,\n fixedOrientation,\n orientCenters,\n puzzleOrientation,\n puzzleOrientations,\n fixedPieceType,\n scrambleAmount,\n moveList,\n };\n\n const puzzleGeometry = new PuzzleGeometry(args.puzzle, options);\n // TODO: why are these calls needed?\n puzzleGeometry.allstickers();\n puzzleGeometry.genperms();\n return puzzleGeometry;\n}\n\nswitch (args.subcommand) {\n case \"KSolve\": {\n console.log(buildPuzzleGeometry().writeksolve());\n break;\n }\n case \"SVG\": {\n console.log(\n buildPuzzleGeometry().generatesvg(\n undefined,\n undefined,\n undefined,\n args.svg3D,\n ),\n );\n break;\n }\n case \"GAP\": {\n console.log(buildPuzzleGeometry().writegap());\n break;\n }\n case \"Mathematica\": {\n console.log(buildPuzzleGeometry().writemathematica());\n break;\n }\n case \"Schreier-Sims\": {\n buildPuzzleGeometry().writeSchreierSims(console.log);\n break;\n }\n case \"Canonical string analysis\": {\n buildPuzzleGeometry().showcanon(console.log);\n break;\n }\n case \"3D\": {\n console.log(JSON.stringify(buildPuzzleGeometry().get3d(), null, \" \"));\n break;\n }\n default:\n throw new Error(\"Invalid subcommand.\") as never;\n}\n"],
4
+ "sourcesContent": ["/**\n\nTo run this file directly:\n\n```shell\nbun run -- ./src/bin/puzzle-geometry-bin.ts <program args>\n```\n\nTo add a `puzzle-geometry` binary to your path and test completions:\n\n```shell\n# fish (from repo root)\nset PATH (pwd)/src/test/bin-path $PATH\npuzzle-geometry --completions fish | source\n```\n\n```shell\n# zsh (from repo root)\nautoload -Uz compinit\ncompinit\nexport PATH=$(pwd)/src/test/bin-path:$PATH\nsource <(puzzle-geometry --completions zsh)\n```\n\n*/\n\nimport { basename } from \"node:path\";\nimport { argv } from \"node:process\";\nimport {\n argument,\n constant,\n flag,\n integer,\n type Message,\n map,\n merge,\n message,\n multiple,\n type OptionName,\n object,\n option,\n optional,\n or,\n string,\n} from \"@optique/core\";\nimport { run } from \"@optique/run\";\nimport { Move } from \"cubing/alg\";\nimport {\n type ExperimentalPuzzleGeometryOptions,\n getPG3DNamedPuzzles,\n PuzzleGeometry,\n parsePuzzleDescription,\n} from \"cubing/puzzle-geometry\";\nimport { PrintableShellCommand } from \"printable-shell-command\";\nimport { packageVersion } from \"../metadata/packageVersion.ts\";\n\nconst puzzleList = getPG3DNamedPuzzles();\n\n// TODO: make this a `ValueParser`?\nfunction antiBool(optionName: OptionName, description: Message) {\n return optional(\n map(\n flag(optionName, {\n description,\n }),\n (v) => !v,\n ),\n );\n}\n\n// Include using `...subcommandDefaults` at the *beginning* of a subcommand `object({ \u2026 })`.\nconst subcommandDefaults = {\n commentStyle: constant(\"hash\"),\n forceQuiet: constant(undefined),\n} as const;\n\nconst args = run(\n merge(\n object({\n verbosity: optional(\n or(\n map(multiple(flag(\"--verbose\", \"-v\")), (v) => v.length),\n map(flag(\"--quiet\", \"-q\"), () => 0),\n ),\n ),\n }),\n or(\n object({\n ...subcommandDefaults,\n subcommand: constant(\"KSolve\"),\n subcommandFlag: flag(\"--ksolve\", {\n description: message`Print KSolve (\\`.tws\\`).`,\n }),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"SVG\"),\n subcommandFlag: flag(\"--svg\", {\n description: message`Print SVG. Forces \\`--quiet\\`.`,\n }),\n commentStyle: constant(\"none\"),\n svg3D: optional(\n option(\"--3d\", {\n description: message`Use 3D format for SVG file.`,\n }),\n ),\n verbosity: constant(0),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"GAP\"),\n subcommandFlag: flag(\"--gap\", {\n description: message`Print GAP output.`,\n }),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"Mathematica\"),\n subcommandFlag: flag(\"--mathematica\", {\n description: message`Print Mathematica output.`,\n }),\n commentStyle: constant(\"Pascal\"),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"Schreier-Sims\"),\n subcommandFlag: flag(\"--ss\", {\n description: message`Perform Schrier-Sims calculation.`,\n }),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"Canonical string analysis\"),\n subcommandFlag: flag(\"--canon\", {\n description: message`Print canonical string analysis.`,\n }),\n }),\n object({\n ...subcommandDefaults,\n subcommand: constant(\"3D\"),\n subcommandFlag: flag(\"--3d\", {\n description: message`Print 3D information.`,\n }),\n }),\n ),\n object({\n // This doesn't apply to SVG, but we place it here so that it doesn't print once for each non-SVG subcommand in the help string.\n optimizeOrbits: option(\"--optimize\", {\n description: message`Optimize output (when possible).`,\n }),\n addRotations: option(\"--rotations\", {\n description: message`Include full-puzzle rotations as moves.`,\n }),\n allMoves: option(\"--allmoves\", {\n description: message`Includes all moves (i.e., slice moves for 3x3x3).`,\n }),\n outerBlockMoves: option(\"--outerblockmoves\", {\n description: message`Use outer block moves rather than slice moves.`,\n }),\n vertexMoves: option(\"--vertexmoves\", {\n description: message`For tetrahedral puzzles, prefer vertex moves to face moves.`,\n }),\n includeCornerOrbits: antiBool(\n \"--nocorners\",\n message`Ignore all corners.`,\n ),\n excludeOrbits: optional(\n map(\n option(\"--omit\", string({ metavar: \"COMMA_SEPARATED_ORBITS\" }), {\n description: message`Omit orbits.`,\n }),\n (s) => s.split(\",\"),\n ),\n ),\n includeEdgeOrbits: antiBool(\"--noedges\", message`Ignore all edges.`),\n includeCenterOrbits: antiBool(\n \"--nocenters\",\n message`Ignore all centers.`,\n ),\n grayCorners: option(\"--graycorners\", {\n description: message`Gray corners.`,\n }),\n grayEdges: option(\"--grayedges\", { description: message`Gray edges.` }),\n grayCenters: option(\"--graycenters\", {\n description: message`Gray centers.`,\n }),\n fixedOrientation: option(\"--noorientation\", {\n description: message`Ignore orientations.`,\n }),\n orientCenters: option(\"--orientcenters\", {\n description: message`Give centers an orientation.`,\n }),\n }),\n optional(\n or(\n object({\n puzzleOrientation: optional(\n map(\n option(\n \"--puzzleorientation\",\n string({ metavar: \"JSON_STRING\" }),\n {\n description: message`For 3D formats, give puzzle orientation.`,\n },\n ),\n (s) => JSON.parse(s),\n ),\n ),\n puzzleOrientations: constant(undefined),\n }),\n object({\n puzzleOrientation: constant(undefined),\n puzzleOrientations: optional(\n map(\n option(\n \"--puzzleorientations\",\n string({ metavar: \"JSON_STRING\" }),\n {\n description: message`For 3D formats, give puzzle orientations.`,\n },\n ),\n (s) => JSON.parse(s),\n ),\n ),\n }),\n ),\n ),\n object({\n fixedPieceType: optional(\n or(\n map(\n flag(\"--fixcorner\", {\n description: message`Auto-select a subset of moves to keep a corner fixed in place.`,\n }),\n () => \"v\" as const,\n ),\n map(\n flag(\"--fixedge\", {\n description: message`Auto-select a subset of moves to keep an edge fixed in place.`,\n }),\n () => \"e\" as const,\n ),\n map(\n flag(\"--fixcenter\", {\n description: message`Auto-select a subset of moves to keep a center fixed in place.`,\n }),\n () => \"f\" as const,\n ),\n ),\n ),\n // TODO: this doesn't make sense for all subcommands?\n scrambleAmount: optional(\n option(\"--scramble\", integer({ min: 0 }), {\n description: message`Scramble solved position.`,\n }),\n ),\n moveList: optional(\n map(\n option(\"--moves\", string({ metavar: \"COMMA_SEPARATED_MOVES\" }), {\n description: message`Restrict moves to this list. Example: \\\"U2,F,r\\\").`,\n }),\n (s) => s.split(\",\").map((m) => Move.fromString(m)),\n ),\n ),\n puzzle: map(\n argument(string({ metavar: \"PUZZLE\" }), {\n description: message`The puzzle can be given as a geometric description or by name.\nThe geometric description starts with one of:\n\n- \\`c\\` (cube),\\n\n- \\`t\\` (tetrahedron),\\n\n- \\`d\\` (dodecahedron),\\n\n- \\`i\\` (icosahedron),\\n\n- \\`o\\` (octahedron),\\n\n\nthen a space, then a series of cuts. Each cut begins with one of:\n\n- \\`f\\` (for a cut parallel to faces),\\n\n- \\`v\\` (for a cut perpendicular to a ray from the center through a corner),\\n\n- \\`e\\` (for a cut perpendicular to a ray from the center through an edge),\\n\n\nfollowed by a decimal number giving a distance, where 1 is the distance\nbetween the center of the puzzle and the center of a face.\n\nExample description: \\`c f 0 v 0.577350269189626 e 0\\`. Corresponds to: https://alpha.twizzle.net/explore/?puzzle=2x2x2+%2B+dino+%2B+little+chop\n\nThe recognized puzzle names are: ${Object.keys(puzzleList)\n .map((p) => JSON.stringify(p))\n .join(\", \")}`,\n }),\n (s) => {\n const parsed = parsePuzzleDescription(puzzleList[s] ?? s);\n if (parsed === null) {\n throw new Error(\"Could not parse puzzle description!\");\n }\n return parsed;\n },\n ),\n }),\n ),\n {\n programName: basename(argv[1]),\n description: message`\nExamples:\n\n puzzle-geometry --ss 2x2x2\\n\n puzzle-geometry --ss --fixcorner 2x2x2\\n\n puzzle-geometry --ss --moves U,F2,r 4x4x4\\n\n puzzle-geometry --ksolve --optimize --moves U,F,R megaminx\\n\n puzzle-geometry --gap --noedges megaminx\n`,\n help: \"option\",\n completion: {\n option: {\n names: [\"--completions\"],\n hidden: false,\n },\n },\n version: {\n option: {\n hidden: false,\n },\n value: packageVersion,\n },\n },\n);\n\nif (args.verbosity !== 0) {\n const cmd = () => {\n const [command, ...args] = argv;\n return new PrintableShellCommand(command, args).getPrintableCommand({\n argumentLineWrapping: \"inline\",\n });\n };\n\n switch (args.commentStyle) {\n case \"hash\": {\n console.log(`# ${cmd()}`);\n break;\n }\n case \"none\": {\n break;\n }\n case \"Pascal\": {\n console.log(`(* ${cmd()} *)`);\n break;\n }\n default:\n throw new Error(\"Invalid comment style.\") as never;\n }\n}\n\nfunction buildPuzzleGeometry(): PuzzleGeometry {\n const {\n verbosity,\n optimizeOrbits,\n addRotations,\n allMoves,\n outerBlockMoves,\n vertexMoves,\n includeCornerOrbits,\n includeCenterOrbits,\n includeEdgeOrbits,\n excludeOrbits,\n grayCorners,\n grayEdges,\n grayCenters,\n fixedOrientation,\n orientCenters,\n puzzleOrientation,\n puzzleOrientations,\n fixedPieceType,\n scrambleAmount,\n moveList,\n } = args;\n const options: ExperimentalPuzzleGeometryOptions = {\n verbosity,\n optimizeOrbits,\n addRotations,\n allMoves,\n outerBlockMoves,\n vertexMoves,\n includeCornerOrbits,\n includeCenterOrbits,\n includeEdgeOrbits,\n excludeOrbits,\n grayCorners,\n grayEdges,\n grayCenters,\n fixedOrientation,\n orientCenters,\n puzzleOrientation,\n puzzleOrientations,\n fixedPieceType,\n scrambleAmount,\n moveList,\n };\n\n const puzzleGeometry = new PuzzleGeometry(args.puzzle, options);\n // TODO: why are these calls needed?\n puzzleGeometry.allstickers();\n puzzleGeometry.genperms();\n return puzzleGeometry;\n}\n\nswitch (args.subcommand) {\n case \"KSolve\": {\n console.log(buildPuzzleGeometry().writeksolve());\n break;\n }\n case \"SVG\": {\n console.log(\n buildPuzzleGeometry().generatesvg(\n undefined,\n undefined,\n undefined,\n args.svg3D,\n ),\n );\n break;\n }\n case \"GAP\": {\n console.log(buildPuzzleGeometry().writegap());\n break;\n }\n case \"Mathematica\": {\n console.log(buildPuzzleGeometry().writemathematica());\n break;\n }\n case \"Schreier-Sims\": {\n buildPuzzleGeometry().writeSchreierSims(console.log);\n break;\n }\n case \"Canonical string analysis\": {\n buildPuzzleGeometry().showcanon(console.log);\n break;\n }\n case \"3D\": {\n console.log(JSON.stringify(buildPuzzleGeometry().get3d(), null, \" \"));\n break;\n }\n default:\n throw new Error(\"Invalid subcommand.\") as never;\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["args"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env -S node --
2
2
  import {
3
3
  packageVersion
4
- } from "./chunks/chunk-6YZ4AUWL.js";
4
+ } from "./chunks/chunk-DQNBCFR3.js";
5
5
 
6
6
  // src/bin/scramble.ts
7
7
  import { basename } from "node:path";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/bin/scramble.ts"],
4
- "sourcesContent": ["/**\n\nTo run this file directly:\n\n```shell\nbun run -- ./src/bin/scramble.ts 333\n```\n\nTo add a `scramble` binary to your path and test completions:\n\n```shell\n# fish (from repo root)\nset PATH (pwd)/src/test/bin-path $PATH\nscramble --completions fish | source\n```\n\n```shell\n# zsh (from repo root)\nautoload -Uz compinit\ncompinit\nexport PATH=$(pwd)/src/test/bin-path:$PATH\nsource <(scramble --completions zsh)\n```\n\n*/\n\nimport { basename } from \"node:path\";\nimport { argv } from \"node:process\";\nimport {\n argument,\n choice,\n integer,\n map,\n merge,\n message,\n object,\n option,\n withDefault,\n} from \"@optique/core\";\nimport { run } from \"@optique/run\";\nimport type { Alg } from \"cubing/alg\";\nimport { eventInfo, twizzleEvents } from \"cubing/puzzles\";\nimport { randomScrambleForEvent } from \"cubing/scramble\";\nimport { setSearchDebug } from \"cubing/search\";\nimport { packageVersion } from \"../metadata/packageVersion\";\n\nconst outputFormats = [\"auto\", \"text\", \"link\", \"json-text\"] as const;\nconst notationTypes = [\"auto\", \"LGN\"] as const;\nconst eventIDs = Object.entries(twizzleEvents)\n .filter(([_, eventInfo]) => !!eventInfo.scramblesImplemented)\n .map(([eventID, _]) => eventID);\n\nconst args = run(\n merge(\n object({\n amount: withDefault(\n option(\"--amount\", \"-n\", integer({ metavar: \"AMOUNT\", min: 1 }), {\n description: message`Amount of scrambles.`,\n }),\n 1,\n ),\n notation: withDefault(\n option(\"--notation\", choice(notationTypes, { metavar: \"NOTATION\" })),\n \"auto\",\n ),\n }),\n object({\n format: withDefault(\n option(\"--format\", \"-f\", choice(outputFormats, { metavar: \"FORMAT\" })),\n \"auto\",\n ),\n }),\n object({\n // TODO: consolidate this with `format`: https://github.com/dahlia/optique/issues/57\n text: map(\n option(\"--text\", \"-t\", {\n description: message`Convenient shorthand for \\`--format text\\`.`,\n }),\n () => \"text\",\n ),\n }),\n object({\n eventID: argument(choice(eventIDs, { metavar: \"EVENT_ID\" }), {\n description: message`WCA or unoffiical event ID.`,\n }),\n }),\n ),\n {\n programName: basename(argv[1]),\n description: message`Example: order 3x3x3 \"R U R' U R U2' R'\"`,\n help: \"option\",\n completion: {\n option: {\n names: [\"--completions\"],\n hidden: false,\n },\n },\n version: {\n option: {\n hidden: false,\n },\n value: packageVersion,\n },\n },\n);\n\nconst { amount, format: argsFormat, notation, text, eventID } = args;\nconst format = argsFormat ?? text ?? (!process.stdout.isTTY ? \"text\" : \"auto\");\n\nsetSearchDebug({ logPerf: false, showWorkerInstantiationWarnings: false });\n\nfunction 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\nfunction 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\nclass 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// Possibly: https://github.com/nodejs/node/issues/55468 Technically we could\n// just remove `await` from the called function, but this is semantically\n// unsound. This function encapsulates the unsoundness.\nfunction nodeForgetTopLevelAwaitWorkaround(\n _promise: Promise<void>,\n): Promise<void> {\n return Promise.resolve();\n}\n\nawait nodeForgetTopLevelAwaitWorkaround(\n (async () => {\n if (format !== \"json-text\" && amount === 1) {\n const scramble = await randomScrambleForEvent(eventID);\n\n switch (format) {\n case \"auto\": {\n console.log(`${scrambleText(scramble)}\n\n\uD83D\uDD17 ${scrambleLink(scramble)}`);\n break;\n }\n case \"text\": {\n console.log(scrambleText(scramble));\n break;\n }\n case \"link\": {\n console.log(scrambleLink(scramble));\n break;\n }\n // @ts-expect-error 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 default: {\n throw new Error(\"Invalid format!\") as never;\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 const scramble = await randomScrambleForEvent(eventID);\n switch (format) {\n case \"auto\": {\n console.log(`// Scramble #${i + 1}\n${scrambleText(scramble)}\n\n\uD83D\uDD17 ${scrambleLink(scramble)}\n`);\n break;\n }\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 default: {\n throw new Error(\"Invalid format!\") as never;\n }\n }\n }\n jsonListPrinter?.finish();\n }\n })(),\n);\n"],
4
+ "sourcesContent": ["/**\n\nTo run this file directly:\n\n```shell\nbun run -- ./src/bin/scramble.ts 333\n```\n\nTo add a `scramble` binary to your path and test completions:\n\n```shell\n# fish (from repo root)\nset PATH (pwd)/src/test/bin-path $PATH\nscramble --completions fish | source\n```\n\n```shell\n# zsh (from repo root)\nautoload -Uz compinit\ncompinit\nexport PATH=$(pwd)/src/test/bin-path:$PATH\nsource <(scramble --completions zsh)\n```\n\n*/\n\nimport { basename } from \"node:path\";\nimport { argv } from \"node:process\";\nimport {\n argument,\n choice,\n integer,\n map,\n merge,\n message,\n object,\n option,\n withDefault,\n} from \"@optique/core\";\nimport { run } from \"@optique/run\";\nimport type { Alg } from \"cubing/alg\";\nimport { eventInfo, twizzleEvents } from \"cubing/puzzles\";\nimport { randomScrambleForEvent } from \"cubing/scramble\";\nimport { setSearchDebug } from \"cubing/search\";\nimport { packageVersion } from \"../metadata/packageVersion.ts\";\n\nconst outputFormats = [\"auto\", \"text\", \"link\", \"json-text\"] as const;\nconst notationTypes = [\"auto\", \"LGN\"] as const;\nconst eventIDs = Object.entries(twizzleEvents)\n .filter(([_, eventInfo]) => !!eventInfo.scramblesImplemented)\n .map(([eventID, _]) => eventID);\n\nconst args = run(\n merge(\n object({\n amount: withDefault(\n option(\"--amount\", \"-n\", integer({ metavar: \"AMOUNT\", min: 1 }), {\n description: message`Amount of scrambles.`,\n }),\n 1,\n ),\n notation: withDefault(\n option(\"--notation\", choice(notationTypes, { metavar: \"NOTATION\" })),\n \"auto\",\n ),\n }),\n object({\n format: withDefault(\n option(\"--format\", \"-f\", choice(outputFormats, { metavar: \"FORMAT\" })),\n \"auto\",\n ),\n }),\n object({\n // TODO: consolidate this with `format`: https://github.com/dahlia/optique/issues/57\n text: map(\n option(\"--text\", \"-t\", {\n description: message`Convenient shorthand for \\`--format text\\`.`,\n }),\n () => \"text\",\n ),\n }),\n object({\n eventID: argument(choice(eventIDs, { metavar: \"EVENT_ID\" }), {\n description: message`WCA or unoffiical event ID.`,\n }),\n }),\n ),\n {\n programName: basename(argv[1]),\n description: message`Example: order 3x3x3 \"R U R' U R U2' R'\"`,\n help: \"option\",\n completion: {\n option: {\n names: [\"--completions\"],\n hidden: false,\n },\n },\n version: {\n option: {\n hidden: false,\n },\n value: packageVersion,\n },\n },\n);\n\nconst { amount, format: argsFormat, notation, text, eventID } = args;\nconst format = argsFormat ?? text ?? (!process.stdout.isTTY ? \"text\" : \"auto\");\n\nsetSearchDebug({ logPerf: false, showWorkerInstantiationWarnings: false });\n\nfunction 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\nfunction 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\nclass 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// Possibly: https://github.com/nodejs/node/issues/55468 Technically we could\n// just remove `await` from the called function, but this is semantically\n// unsound. This function encapsulates the unsoundness.\nfunction nodeForgetTopLevelAwaitWorkaround(\n _promise: Promise<void>,\n): Promise<void> {\n return Promise.resolve();\n}\n\nawait nodeForgetTopLevelAwaitWorkaround(\n (async () => {\n if (format !== \"json-text\" && amount === 1) {\n const scramble = await randomScrambleForEvent(eventID);\n\n switch (format) {\n case \"auto\": {\n console.log(`${scrambleText(scramble)}\n\n\uD83D\uDD17 ${scrambleLink(scramble)}`);\n break;\n }\n case \"text\": {\n console.log(scrambleText(scramble));\n break;\n }\n case \"link\": {\n console.log(scrambleLink(scramble));\n break;\n }\n // @ts-expect-error 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 default: {\n throw new Error(\"Invalid format!\") as never;\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 const scramble = await randomScrambleForEvent(eventID);\n switch (format) {\n case \"auto\": {\n console.log(`// Scramble #${i + 1}\n${scrambleText(scramble)}\n\n\uD83D\uDD17 ${scrambleLink(scramble)}\n`);\n break;\n }\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 default: {\n throw new Error(\"Invalid format!\") as never;\n }\n }\n }\n jsonListPrinter?.finish();\n }\n })(),\n);\n"],
5
5
  "mappings": "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",
6
6
  "names": ["eventInfo", "eventID"]
7
7
  }
package/dist/bin/svg.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env -S node --
2
2
  import {
3
3
  packageVersion
4
- } from "./chunks/chunk-6YZ4AUWL.js";
4
+ } from "./chunks/chunk-DQNBCFR3.js";
5
5
 
6
6
  // src/bin/svg.ts
7
7
  import { basename } from "node:path";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/bin/svg.ts"],
4
- "sourcesContent": ["/**\n\nTo run this file directly:\n\n```shell\nbun run -- ./src/bin/svg.ts <program args>\n```\n\nTo add an `svg` binary to your path and test completions:\n\n```shell\n# fish (from repo root)\nset PATH (pwd)/src/test/bin-path $PATH\nsvg --completions fish | source\n```\n\n```shell\n# zsh (from repo root)\nautoload -Uz compinit\ncompinit\nexport PATH=$(pwd)/src/test/bin-path:$PATH\nsource <(svg --completions zsh)\n```\n\n*/\n\nimport { basename } from \"node:path\";\nimport { argv } from \"node:process\";\nimport { argument, choice, object, option, withDefault } from \"@optique/core\";\nimport { run } from \"@optique/run\";\nimport { puzzles } from \"cubing/puzzles\";\nimport { packageVersion } from \"../metadata/packageVersion\";\n\nconst args = run(\n object({\n puzzleID: argument(choice(Object.keys(puzzles), { metavar: \"PUZZLE_ID\" })),\n visualization: withDefault(\n option(\n \"--visualization\",\n choice([\"2D\", \"experimental-2D-LL\"], { metavar: \"PUZZLE_ID\" }),\n ),\n \"2D\",\n ),\n }),\n {\n programName: basename(argv[1]),\n help: \"option\",\n completion: {\n option: {\n names: [\"--completions\"],\n hidden: false,\n },\n },\n version: {\n option: {\n hidden: false,\n },\n value: packageVersion,\n },\n },\n);\n\nconst puzzleLoader = puzzles[args.puzzleID];\nif (!puzzleLoader) {\n throw new Error(`Invalid puzzle ID: ${args.puzzleID}`);\n}\n\nswitch (args.visualization) {\n case \"2D\": {\n console.log(await puzzleLoader.svg());\n break;\n }\n case \"experimental-2D-LL\": {\n console.log(await puzzleLoader.llSVG!());\n break;\n }\n default:\n throw undefined as never;\n}\n"],
4
+ "sourcesContent": ["/**\n\nTo run this file directly:\n\n```shell\nbun run -- ./src/bin/svg.ts <program args>\n```\n\nTo add an `svg` binary to your path and test completions:\n\n```shell\n# fish (from repo root)\nset PATH (pwd)/src/test/bin-path $PATH\nsvg --completions fish | source\n```\n\n```shell\n# zsh (from repo root)\nautoload -Uz compinit\ncompinit\nexport PATH=$(pwd)/src/test/bin-path:$PATH\nsource <(svg --completions zsh)\n```\n\n*/\n\nimport { basename } from \"node:path\";\nimport { argv } from \"node:process\";\nimport { argument, choice, object, option, withDefault } from \"@optique/core\";\nimport { run } from \"@optique/run\";\nimport { puzzles } from \"cubing/puzzles\";\nimport { packageVersion } from \"../metadata/packageVersion.ts\";\n\nconst args = run(\n object({\n puzzleID: argument(choice(Object.keys(puzzles), { metavar: \"PUZZLE_ID\" })),\n visualization: withDefault(\n option(\n \"--visualization\",\n choice([\"2D\", \"experimental-2D-LL\"], { metavar: \"PUZZLE_ID\" }),\n ),\n \"2D\",\n ),\n }),\n {\n programName: basename(argv[1]),\n help: \"option\",\n completion: {\n option: {\n names: [\"--completions\"],\n hidden: false,\n },\n },\n version: {\n option: {\n hidden: false,\n },\n value: packageVersion,\n },\n },\n);\n\nconst puzzleLoader = puzzles[args.puzzleID];\nif (!puzzleLoader) {\n throw new Error(`Invalid puzzle ID: ${args.puzzleID}`);\n}\n\nswitch (args.visualization) {\n case \"2D\": {\n console.log(await puzzleLoader.svg());\n break;\n }\n case \"experimental-2D-LL\": {\n console.log(await puzzleLoader.llSVG!());\n break;\n }\n default:\n throw undefined as never;\n}\n"],
5
5
  "mappings": ";;;;;;AA0BA,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,UAAU,QAAQ,QAAQ,QAAQ,mBAAmB;AAC9D,SAAS,WAAW;AACpB,SAAS,eAAe;AAGxB,IAAM,OAAO;AAAA,EACX,OAAO;AAAA,IACL,UAAU,SAAS,OAAO,OAAO,KAAK,OAAO,GAAG,EAAE,SAAS,YAAY,CAAC,CAAC;AAAA,IACzE,eAAe;AAAA,MACb;AAAA,QACE;AAAA,QACA,OAAO,CAAC,MAAM,oBAAoB,GAAG,EAAE,SAAS,YAAY,CAAC;AAAA,MAC/D;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EACD;AAAA,IACE,aAAa,SAAS,KAAK,CAAC,CAAC;AAAA,IAC7B,MAAM;AAAA,IACN,YAAY;AAAA,MACV,QAAQ;AAAA,QACN,OAAO,CAAC,eAAe;AAAA,QACvB,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,QAAQ;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAM,eAAe,QAAQ,KAAK,QAAQ;AAC1C,IAAI,CAAC,cAAc;AACjB,QAAM,IAAI,MAAM,sBAAsB,KAAK,QAAQ,EAAE;AACvD;AAEA,QAAQ,KAAK,eAAe;AAAA,EAC1B,KAAK,MAAM;AACT,YAAQ,IAAI,MAAM,aAAa,IAAI,CAAC;AACpC;AAAA,EACF;AAAA,EACA,KAAK,sBAAsB;AACzB,YAAQ,IAAI,MAAM,aAAa,MAAO,CAAC;AACvC;AAAA,EACF;AAAA,EACA;AACE,UAAM;AACV;",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- import { At as Move, Ct as AlgLeaf, Dt as Grouping, Et as LineComment, Ft as ExperimentalNotationType, It as ExperimentalSerializationOptions, Mt as QuantumMove, Nt as Conjugate, Ot as GroupingModifications, Pt as Commutator, St as AlgBranch, Tt as Newline, _t as experimentalAppendMove, a as functionFromTraversal, bt as SimplifyOptions, f as Parsed, ft as experimentalIs, gt as Alg, ht as AlgBuilder, i as TraversalUp, jt as MoveModifications, kt as Pause, mt as setAlgDebug, n as experimentalAlgCubingNetLink, o as keyToMove, pt as Example, r as TraversalDownUp, t as AlgCubingNetOptions, vt as AppendCancelOptions, wt as AlgNode, xt as Unit, yt as PuzzleSpecificSimplifyOptions } from "../index-B2leUGbW.js";
1
+ import { At as Move, Ct as AlgLeaf, Dt as Grouping, Et as LineComment, Ft as ExperimentalNotationType, It as ExperimentalSerializationOptions, Mt as QuantumMove, Nt as Conjugate, Ot as GroupingModifications, Pt as Commutator, St as AlgBranch, Tt as Newline, _t as experimentalAppendMove, a as functionFromTraversal, bt as SimplifyOptions, f as Parsed, ft as experimentalIs, gt as Alg, ht as AlgBuilder, i as TraversalUp, jt as MoveModifications, kt as Pause, mt as setAlgDebug, n as experimentalAlgCubingNetLink, o as keyToMove, pt as Example, r as TraversalDownUp, t as AlgCubingNetOptions, vt as AppendCancelOptions, wt as AlgNode, xt as Unit, yt as PuzzleSpecificSimplifyOptions } from "../index-C2x6Sc62.js";
2
2
  export { Alg, AlgBranch, AlgBuilder, AlgCubingNetOptions, AlgLeaf, AlgNode, AppendCancelOptions, Commutator, Conjugate, Example, ExperimentalNotationType, Parsed as ExperimentalParsed, ExperimentalSerializationOptions, Grouping, GroupingModifications, LineComment, Move, MoveModifications, Newline, Pause, PuzzleSpecificSimplifyOptions, QuantumMove, SimplifyOptions, TraversalDownUp, TraversalUp, Unit, experimentalAlgCubingNetLink, experimentalAppendMove, experimentalIs, functionFromTraversal, keyToMove, setAlgDebug };
@@ -18,7 +18,7 @@ import {
18
18
  functionFromTraversal,
19
19
  keyToMove,
20
20
  setAlgDebug
21
- } from "../chunks/chunk-N5FJ5YIA.js";
21
+ } from "../chunks/chunk-YFNXHRNE.js";
22
22
  export {
23
23
  Alg,
24
24
  AlgBuilder,
@@ -1,7 +1,7 @@
1
1
  /// <reference types="web-bluetooth" />
2
2
 
3
- import { At as Move, D as PuzzleID, I as MillisecondTimestamp, R as KPattern, c as PuzzleLoader, gt as Alg, s as KeyMapping } from "../index-B2leUGbW.js";
4
- import { a as OrientationEvent, i as AlgLeafEvent } from "../index-BLw2OxXo.js";
3
+ import { At as Move, D as PuzzleID, I as MillisecondTimestamp, R as KPattern, c as PuzzleLoader, gt as Alg, s as KeyMapping } from "../index-C2x6Sc62.js";
4
+ import { a as OrientationEvent, i as AlgLeafEvent } from "../index-Doa1gNE4.js";
5
5
 
6
6
  //#region src/cubing/bluetooth/debug.d.ts
7
7
  declare function enableDebugLogging(enable: boolean): void;
@@ -31,9 +31,9 @@ declare abstract class BluetoothPuzzle extends EventTarget {
31
31
  //#region src/cubing/bluetooth/keyboard.d.ts
32
32
  /** @category Keyboard Puzzles */
33
33
  declare class KeyboardPuzzle extends BluetoothPuzzle {
34
- private target;
35
34
  private keyMappingAndPatternPromise;
36
35
  listener: EventListener;
36
+ private target;
37
37
  constructor(target: Element, puzzle?: PuzzleID | PuzzleLoader);
38
38
  name(): string | undefined;
39
39
  setPuzzleInternal(puzzle: PuzzleID | PuzzleLoader): Promise<[KeyMapping | undefined, KPattern]>;
@@ -57,12 +57,6 @@ declare function connectSmartPuzzle(options?: BluetoothConnectOptions): Promise<
57
57
  //#region src/cubing/bluetooth/smart-puzzle/gan.d.ts
58
58
  /** @category Smart Puzzles */
59
59
  declare class GanCube extends BluetoothPuzzle {
60
- private kpuzzle;
61
- private service;
62
- private server;
63
- private physicalStateCharacteristic;
64
- private lastMoveCounter;
65
- private aesKey;
66
60
  static connect(server: BluetoothRemoteGATTServer): Promise<GanCube>;
67
61
  INTERVAL_MS: number;
68
62
  private intervalHandle;
@@ -70,6 +64,12 @@ declare class GanCube extends BluetoothPuzzle {
70
64
  private cachedFaceletStatus1Characteristic;
71
65
  private cachedFaceletStatus2Characteristic;
72
66
  private cachedActualAngleAndBatteryCharacteristic;
67
+ private kpuzzle;
68
+ private service;
69
+ private server;
70
+ private physicalStateCharacteristic;
71
+ private lastMoveCounter;
72
+ private aesKey;
73
73
  private constructor();
74
74
  name(): string | undefined;
75
75
  disconnect(): void;
@@ -90,10 +90,10 @@ declare class GanCube extends BluetoothPuzzle {
90
90
  //#region src/cubing/bluetooth/smart-puzzle/giiker.d.ts
91
91
  /** @category Smart Puzzles */
92
92
  declare class GiiKERCube extends BluetoothPuzzle {
93
+ static connect(server: BluetoothRemoteGATTServer): Promise<GiiKERCube>;
93
94
  private server;
94
95
  private cubeCharacteristic;
95
96
  private originalValue?;
96
- static connect(server: BluetoothRemoteGATTServer): Promise<GiiKERCube>;
97
97
  private constructor();
98
98
  name(): string | undefined;
99
99
  disconnect(): void;
@@ -107,8 +107,6 @@ declare class GiiKERCube extends BluetoothPuzzle {
107
107
  //#region src/cubing/bluetooth/smart-puzzle/gocube.d.ts
108
108
  /** @category Smart Puzzles */
109
109
  declare class GoCube extends BluetoothPuzzle {
110
- private server;
111
- goCubeStateCharacteristic: BluetoothRemoteGATTCharacteristic;
112
110
  static connect(server: BluetoothRemoteGATTServer): Promise<GoCube>;
113
111
  private recorded;
114
112
  private homeQuatInverse;
@@ -116,6 +114,8 @@ declare class GoCube extends BluetoothPuzzle {
116
114
  private currentQuat;
117
115
  private lastTarget;
118
116
  private alg;
117
+ private server;
118
+ goCubeStateCharacteristic: BluetoothRemoteGATTCharacteristic;
119
119
  private constructor();
120
120
  disconnect(): void;
121
121
  reset(): void;
@@ -134,12 +134,12 @@ interface GanRobotOptions {
134
134
  }
135
135
  /** @category Robots */
136
136
  declare class GanRobot extends EventTarget {
137
- private server;
138
- private statusCharacteristic;
139
- private moveCharacteristic;
140
137
  experimentalDebugOnSend: ((alg: Alg) => void) | null;
141
138
  experimentalDebugLog: typeof console.log;
142
139
  experimentalOptions: GanRobotOptions;
140
+ private server;
141
+ private statusCharacteristic;
142
+ private moveCharacteristic;
143
143
  constructor(_service: BluetoothRemoteGATTService, server: BluetoothRemoteGATTServer, device: BluetoothDevice, statusCharacteristic: BluetoothRemoteGATTCharacteristic, moveCharacteristic: BluetoothRemoteGATTCharacteristic);
144
144
  static connect(server: BluetoothRemoteGATTServer, device: BluetoothDevice): Promise<GanRobot>;
145
145
  name(): string | undefined;
@@ -164,10 +164,10 @@ declare function connectSmartRobot(options?: BluetoothConnectOptions): Promise<B
164
164
  //#region src/cubing/bluetooth/smart-timer/GanTimer.d.ts
165
165
  /** @category Timers */
166
166
  declare class GanTimer extends EventTarget {
167
- private server;
168
- private timeCharacteristic;
169
167
  private polling;
170
168
  private previousDetail;
169
+ private server;
170
+ private timeCharacteristic;
171
171
  constructor(_service: BluetoothRemoteGATTService, server: BluetoothRemoteGATTServer, device: BluetoothDevice, timeCharacteristic: BluetoothRemoteGATTCharacteristic);
172
172
  static connect(server: BluetoothRemoteGATTServer, device: BluetoothDevice): Promise<GanTimer>;
173
173
  disconnect(): void;