@witchcraft/spellcraft 0.0.1

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 (367) hide show
  1. package/README.md +579 -0
  2. package/dist/core/EmulatedEvent.d.ts +10 -0
  3. package/dist/core/EmulatedEvent.js +19 -0
  4. package/dist/core/Emulator.d.ts +74 -0
  5. package/dist/core/Emulator.js +153 -0
  6. package/dist/core/ShortcutManagerManager.d.ts +103 -0
  7. package/dist/core/ShortcutManagerManager.js +267 -0
  8. package/dist/core/addCommand.d.ts +7 -0
  9. package/dist/core/addCommand.js +7 -0
  10. package/dist/core/addKey.d.ts +7 -0
  11. package/dist/core/addKey.js +7 -0
  12. package/dist/core/addShortcut.d.ts +7 -0
  13. package/dist/core/addShortcut.js +7 -0
  14. package/dist/core/attach.d.ts +10 -0
  15. package/dist/core/attach.js +13 -0
  16. package/dist/core/createCommand.d.ts +4 -0
  17. package/dist/core/createCommand.js +11 -0
  18. package/dist/core/createCommands.d.ts +11 -0
  19. package/dist/core/createCommands.js +20 -0
  20. package/dist/core/createCondition.d.ts +7 -0
  21. package/dist/core/createCondition.js +11 -0
  22. package/dist/core/createContext.d.ts +2 -0
  23. package/dist/core/createContext.js +8 -0
  24. package/dist/core/createKey.d.ts +10 -0
  25. package/dist/core/createKey.js +35 -0
  26. package/dist/core/createKeys.d.ts +5 -0
  27. package/dist/core/createKeys.js +36 -0
  28. package/dist/core/createManager.d.ts +81 -0
  29. package/dist/core/createManager.js +83 -0
  30. package/dist/core/createManagerEventListeners.d.ts +4 -0
  31. package/dist/core/createManagerEventListeners.js +130 -0
  32. package/dist/core/createManagerOptions.d.ts +8 -0
  33. package/dist/core/createManagerOptions.js +17 -0
  34. package/dist/core/createShortcut.d.ts +8 -0
  35. package/dist/core/createShortcut.js +24 -0
  36. package/dist/core/createShortcuts.d.ts +13 -0
  37. package/dist/core/createShortcuts.js +20 -0
  38. package/dist/core/detach.d.ts +10 -0
  39. package/dist/core/detach.js +6 -0
  40. package/dist/core/index.d.ts +32 -0
  41. package/dist/core/index.js +32 -0
  42. package/dist/core/removeCommand.d.ts +7 -0
  43. package/dist/core/removeCommand.js +7 -0
  44. package/dist/core/removeKey.d.ts +7 -0
  45. package/dist/core/removeKey.js +7 -0
  46. package/dist/core/removeShortcut.d.ts +7 -0
  47. package/dist/core/removeShortcut.js +7 -0
  48. package/dist/core/setCommandProp.d.ts +17 -0
  49. package/dist/core/setCommandProp.js +96 -0
  50. package/dist/core/setCommandsProp.d.ts +15 -0
  51. package/dist/core/setCommandsProp.js +94 -0
  52. package/dist/core/setKeyProp.d.ts +16 -0
  53. package/dist/core/setKeyProp.js +47 -0
  54. package/dist/core/setKeysProp.d.ts +10 -0
  55. package/dist/core/setKeysProp.js +166 -0
  56. package/dist/core/setManagerProp.d.ts +34 -0
  57. package/dist/core/setManagerProp.js +54 -0
  58. package/dist/core/setShortcutProp.d.ts +9 -0
  59. package/dist/core/setShortcutProp.js +50 -0
  60. package/dist/core/setShortcutsProp.d.ts +12 -0
  61. package/dist/core/setShortcutsProp.js +93 -0
  62. package/dist/defaults/KeysSorter.d.ts +35 -0
  63. package/dist/defaults/KeysSorter.js +20 -0
  64. package/dist/defaults/Stringifier.d.ts +66 -0
  65. package/dist/defaults/Stringifier.js +119 -0
  66. package/dist/defaults/defaultConditionEquals.d.ts +19 -0
  67. package/dist/defaults/defaultConditionEquals.js +5 -0
  68. package/dist/defaults/defaultManagerCallback.d.ts +7 -0
  69. package/dist/defaults/defaultManagerCallback.js +5 -0
  70. package/dist/helpers/KnownError.d.ts +8 -0
  71. package/dist/helpers/KnownError.js +3 -0
  72. package/dist/helpers/calculateAndSetPositionAndWidth.d.ts +13 -0
  73. package/dist/helpers/calculateAndSetPositionAndWidth.js +18 -0
  74. package/dist/helpers/calculateLayoutSize.d.ts +9 -0
  75. package/dist/helpers/calculateLayoutSize.js +13 -0
  76. package/dist/helpers/doesShortcutConflict.d.ts +18 -0
  77. package/dist/helpers/doesShortcutConflict.js +42 -0
  78. package/dist/helpers/equalsCommand.d.ts +7 -0
  79. package/dist/helpers/equalsCommand.js +4 -0
  80. package/dist/helpers/equalsContext.d.ts +7 -0
  81. package/dist/helpers/equalsContext.js +19 -0
  82. package/dist/helpers/equalsShortcut.d.ts +9 -0
  83. package/dist/helpers/equalsShortcut.js +7 -0
  84. package/dist/helpers/forceClear.d.ts +12 -0
  85. package/dist/helpers/forceClear.js +16 -0
  86. package/dist/helpers/forceUpdateNativeKeysState.d.ts +5 -0
  87. package/dist/helpers/forceUpdateNativeKeysState.js +4 -0
  88. package/dist/helpers/generateKeyShortcutMap.d.ts +23 -0
  89. package/dist/helpers/generateKeyShortcutMap.js +64 -0
  90. package/dist/helpers/getKeyFromEventCode.d.ts +15 -0
  91. package/dist/helpers/getKeyFromEventCode.js +36 -0
  92. package/dist/helpers/getKeyFromIdOrVariant.d.ts +4 -0
  93. package/dist/helpers/getKeyFromIdOrVariant.js +26 -0
  94. package/dist/helpers/getKeyboardLayoutMap.d.ts +5 -0
  95. package/dist/helpers/getKeyboardLayoutMap.js +7 -0
  96. package/dist/helpers/getLabel.d.ts +9 -0
  97. package/dist/helpers/getLabel.js +6 -0
  98. package/dist/helpers/getTriggerableShortcut.d.ts +6 -0
  99. package/dist/helpers/getTriggerableShortcut.js +25 -0
  100. package/dist/helpers/index.d.ts +28 -0
  101. package/dist/helpers/index.js +28 -0
  102. package/dist/helpers/isValidManager.d.ts +3 -0
  103. package/dist/helpers/isValidManager.js +20 -0
  104. package/dist/helpers/isValidShortcut.d.ts +3 -0
  105. package/dist/helpers/isValidShortcut.js +10 -0
  106. package/dist/helpers/labelWithEvent.d.ts +13 -0
  107. package/dist/helpers/labelWithEvent.js +20 -0
  108. package/dist/helpers/labelWithKeyboardMap.d.ts +15 -0
  109. package/dist/helpers/labelWithKeyboardMap.js +17 -0
  110. package/dist/helpers/managerToStorableClone.d.ts +12 -0
  111. package/dist/helpers/managerToStorableClone.js +13 -0
  112. package/dist/helpers/onKeyboardLayoutChange.d.ts +10 -0
  113. package/dist/helpers/onKeyboardLayoutChange.js +7 -0
  114. package/dist/helpers/safeSetManagerChain.d.ts +20 -0
  115. package/dist/helpers/safeSetManagerChain.js +37 -0
  116. package/dist/helpers/shortcutCanExecuteIn.d.ts +4 -0
  117. package/dist/helpers/shortcutCanExecuteIn.js +9 -0
  118. package/dist/helpers/shortcutIsTriggerableBy.d.ts +2 -0
  119. package/dist/helpers/shortcutIsTriggerableBy.js +5 -0
  120. package/dist/helpers/shortcutSwapChords.d.ts +75 -0
  121. package/dist/helpers/shortcutSwapChords.js +118 -0
  122. package/dist/helpers/virtualPress.d.ts +13 -0
  123. package/dist/helpers/virtualPress.js +15 -0
  124. package/dist/helpers/virtualRelease.d.ts +5 -0
  125. package/dist/helpers/virtualRelease.js +15 -0
  126. package/dist/helpers/virtualToggle.d.ts +7 -0
  127. package/dist/helpers/virtualToggle.js +16 -0
  128. package/dist/internal/addToChain.d.ts +3 -0
  129. package/dist/internal/addToChain.js +27 -0
  130. package/dist/internal/areValidKeys.d.ts +7 -0
  131. package/dist/internal/areValidKeys.js +28 -0
  132. package/dist/internal/areValidVariants.d.ts +4 -0
  133. package/dist/internal/areValidVariants.js +45 -0
  134. package/dist/internal/checkTrigger.d.ts +2 -0
  135. package/dist/internal/checkTrigger.js +47 -0
  136. package/dist/internal/checkUntrigger.d.ts +2 -0
  137. package/dist/internal/checkUntrigger.js +18 -0
  138. package/dist/internal/cloneLastChord.d.ts +4 -0
  139. package/dist/internal/cloneLastChord.js +5 -0
  140. package/dist/internal/containsPossibleToggleChords.d.ts +13 -0
  141. package/dist/internal/containsPossibleToggleChords.js +65 -0
  142. package/dist/internal/errorTextAdd.d.ts +1 -0
  143. package/dist/internal/errorTextAdd.js +11 -0
  144. package/dist/internal/errorTextInUse.d.ts +1 -0
  145. package/dist/internal/errorTextInUse.js +8 -0
  146. package/dist/internal/errorTextRemove.d.ts +1 -0
  147. package/dist/internal/errorTextRemove.js +8 -0
  148. package/dist/internal/getModifierState.d.ts +2 -0
  149. package/dist/internal/getModifierState.js +7 -0
  150. package/dist/internal/getPressedKeys.d.ts +7 -0
  151. package/dist/internal/getPressedKeys.js +18 -0
  152. package/dist/internal/getPressedModifierKeys.d.ts +2 -0
  153. package/dist/internal/getPressedModifierKeys.js +10 -0
  154. package/dist/internal/getPressedNonModifierKeys.d.ts +7 -0
  155. package/dist/internal/getPressedNonModifierKeys.js +11 -0
  156. package/dist/internal/inChain.d.ts +5 -0
  157. package/dist/internal/inChain.js +14 -0
  158. package/dist/internal/isValidChain.d.ts +10 -0
  159. package/dist/internal/isValidChain.js +22 -0
  160. package/dist/internal/isValidChord.d.ts +11 -0
  161. package/dist/internal/isValidChord.js +59 -0
  162. package/dist/internal/isValidCommand.d.ts +12 -0
  163. package/dist/internal/isValidCommand.js +20 -0
  164. package/dist/internal/keyOrder.d.ts +6 -0
  165. package/dist/internal/keyOrder.js +14 -0
  166. package/dist/internal/removeFromChain.d.ts +3 -0
  167. package/dist/internal/removeFromChain.js +32 -0
  168. package/dist/internal/safeSetEmulatedToggleState.d.ts +4 -0
  169. package/dist/internal/safeSetEmulatedToggleState.js +13 -0
  170. package/dist/internal/setKeysState.d.ts +8 -0
  171. package/dist/internal/setKeysState.js +42 -0
  172. package/dist/internal/updateNativeKeysState.d.ts +14 -0
  173. package/dist/internal/updateNativeKeysState.js +58 -0
  174. package/dist/layouts/createLayout.d.ts +25 -0
  175. package/dist/layouts/createLayout.js +221 -0
  176. package/dist/module.d.mts +13 -0
  177. package/dist/module.json +9 -0
  178. package/dist/module.mjs +40 -0
  179. package/dist/runtime/composables/useLabeledByKeyboardLayoutMap.d.ts +9 -0
  180. package/dist/runtime/composables/useLabeledByKeyboardLayoutMap.js +19 -0
  181. package/dist/runtime/composables/usePointerCoords.d.ts +32 -0
  182. package/dist/runtime/composables/usePointerCoords.js +17 -0
  183. package/dist/runtime/composables/useShortcutManagerContextCount.d.ts +14 -0
  184. package/dist/runtime/composables/useShortcutManagerContextCount.js +61 -0
  185. package/dist/runtime/composables/useShortcutManagerKeysLayout.d.ts +18 -0
  186. package/dist/runtime/composables/useShortcutManagerKeysLayout.js +22 -0
  187. package/dist/runtime/composables/useShortcutManagerVirtualPress.d.ts +6 -0
  188. package/dist/runtime/composables/useShortcutManagerVirtualPress.js +24 -0
  189. package/dist/runtime/types.d.ts +10 -0
  190. package/dist/runtime/types.js +1 -0
  191. package/dist/runtime/utils/shortcutToId.d.ts +5 -0
  192. package/dist/runtime/utils/shortcutToId.js +6 -0
  193. package/dist/types/commands.d.ts +113 -0
  194. package/dist/types/commands.js +0 -0
  195. package/dist/types/condition.d.ts +29 -0
  196. package/dist/types/condition.js +0 -0
  197. package/dist/types/context.d.ts +18 -0
  198. package/dist/types/context.js +0 -0
  199. package/dist/types/enums.d.ts +186 -0
  200. package/dist/types/enums.js +70 -0
  201. package/dist/types/general.d.ts +92 -0
  202. package/dist/types/general.js +0 -0
  203. package/dist/types/index.d.ts +8 -0
  204. package/dist/types/index.js +8 -0
  205. package/dist/types/keys.d.ts +332 -0
  206. package/dist/types/keys.js +0 -0
  207. package/dist/types/manager.d.ts +249 -0
  208. package/dist/types/manager.js +0 -0
  209. package/dist/types/plugins.d.ts +1 -0
  210. package/dist/types/plugins.js +0 -0
  211. package/dist/types/shortcuts.d.ts +144 -0
  212. package/dist/types/shortcuts.js +0 -0
  213. package/dist/types/utils.d.ts +1 -0
  214. package/dist/types/utils.js +0 -0
  215. package/dist/types.d.mts +3 -0
  216. package/dist/utils/chainContainsSubset.d.ts +27 -0
  217. package/dist/utils/chainContainsSubset.js +45 -0
  218. package/dist/utils/cloneChain.d.ts +2 -0
  219. package/dist/utils/cloneChain.js +11 -0
  220. package/dist/utils/cloneKey.d.ts +3 -0
  221. package/dist/utils/cloneKey.js +26 -0
  222. package/dist/utils/containsKey.d.ts +7 -0
  223. package/dist/utils/containsKey.js +4 -0
  224. package/dist/utils/dedupeKeys.d.ts +9 -0
  225. package/dist/utils/dedupeKeys.js +9 -0
  226. package/dist/utils/equalsKey.d.ts +12 -0
  227. package/dist/utils/equalsKey.js +13 -0
  228. package/dist/utils/equalsKeys.d.ts +24 -0
  229. package/dist/utils/equalsKeys.js +15 -0
  230. package/dist/utils/index.d.ts +14 -0
  231. package/dist/utils/index.js +14 -0
  232. package/dist/utils/isAnyKey.d.ts +5 -0
  233. package/dist/utils/isAnyKey.js +5 -0
  234. package/dist/utils/isMouseKey.d.ts +5 -0
  235. package/dist/utils/isMouseKey.js +20 -0
  236. package/dist/utils/isNormalKey.d.ts +5 -0
  237. package/dist/utils/isNormalKey.js +5 -0
  238. package/dist/utils/isTriggerKey.d.ts +5 -0
  239. package/dist/utils/isTriggerKey.js +3 -0
  240. package/dist/utils/isWheelKey.d.ts +5 -0
  241. package/dist/utils/isWheelKey.js +11 -0
  242. package/dist/utils/mapKeys.d.ts +8 -0
  243. package/dist/utils/mapKeys.js +5 -0
  244. package/dist/utils/removeKeys.d.ts +7 -0
  245. package/dist/utils/removeKeys.js +4 -0
  246. package/package.json +156 -0
  247. package/src/core/EmulatedEvent.ts +29 -0
  248. package/src/core/Emulator.ts +185 -0
  249. package/src/core/ShortcutManagerManager.ts +380 -0
  250. package/src/core/addCommand.ts +24 -0
  251. package/src/core/addKey.ts +25 -0
  252. package/src/core/addShortcut.ts +24 -0
  253. package/src/core/attach.ts +27 -0
  254. package/src/core/createCommand.ts +24 -0
  255. package/src/core/createCommands.ts +45 -0
  256. package/src/core/createCondition.ts +21 -0
  257. package/src/core/createContext.ts +14 -0
  258. package/src/core/createKey.ts +59 -0
  259. package/src/core/createKeys.ts +68 -0
  260. package/src/core/createManager.ts +209 -0
  261. package/src/core/createManagerEventListeners.ts +139 -0
  262. package/src/core/createManagerOptions.ts +29 -0
  263. package/src/core/createShortcut.ts +49 -0
  264. package/src/core/createShortcuts.ts +51 -0
  265. package/src/core/detach.ts +21 -0
  266. package/src/core/index.ts +35 -0
  267. package/src/core/removeCommand.ts +25 -0
  268. package/src/core/removeKey.ts +25 -0
  269. package/src/core/removeShortcut.ts +24 -0
  270. package/src/core/setCommandProp.ts +140 -0
  271. package/src/core/setCommandsProp.ts +128 -0
  272. package/src/core/setKeyProp.ts +80 -0
  273. package/src/core/setKeysProp.ts +205 -0
  274. package/src/core/setManagerProp.ts +111 -0
  275. package/src/core/setShortcutProp.ts +89 -0
  276. package/src/core/setShortcutsProp.ts +124 -0
  277. package/src/defaults/KeysSorter.ts +55 -0
  278. package/src/defaults/Stringifier.ts +234 -0
  279. package/src/defaults/defaultConditionEquals.ts +29 -0
  280. package/src/defaults/defaultManagerCallback.ts +14 -0
  281. package/src/helpers/KnownError.ts +13 -0
  282. package/src/helpers/calculateAndSetPositionAndWidth.ts +30 -0
  283. package/src/helpers/calculateLayoutSize.ts +22 -0
  284. package/src/helpers/doesShortcutConflict.ts +72 -0
  285. package/src/helpers/equalsCommand.ts +18 -0
  286. package/src/helpers/equalsContext.ts +29 -0
  287. package/src/helpers/equalsShortcut.ts +34 -0
  288. package/src/helpers/forceClear.ts +31 -0
  289. package/src/helpers/forceUpdateNativeKeysState.ts +9 -0
  290. package/src/helpers/generateKeyShortcutMap.ts +113 -0
  291. package/src/helpers/getKeyFromEventCode.ts +67 -0
  292. package/src/helpers/getKeyFromIdOrVariant.ts +33 -0
  293. package/src/helpers/getKeyboardLayoutMap.ts +13 -0
  294. package/src/helpers/getLabel.ts +15 -0
  295. package/src/helpers/getTriggerableShortcut.ts +37 -0
  296. package/src/helpers/index.ts +30 -0
  297. package/src/helpers/isValidManager.ts +29 -0
  298. package/src/helpers/isValidShortcut.ts +20 -0
  299. package/src/helpers/labelWithEvent.ts +41 -0
  300. package/src/helpers/labelWithKeyboardMap.ts +37 -0
  301. package/src/helpers/managerToStorableClone.ts +26 -0
  302. package/src/helpers/onKeyboardLayoutChange.ts +17 -0
  303. package/src/helpers/safeSetManagerChain.ts +66 -0
  304. package/src/helpers/shortcutCanExecuteIn.ts +24 -0
  305. package/src/helpers/shortcutIsTriggerableBy.ts +15 -0
  306. package/src/helpers/shortcutSwapChords.ts +240 -0
  307. package/src/helpers/virtualPress.ts +34 -0
  308. package/src/helpers/virtualRelease.ts +25 -0
  309. package/src/helpers/virtualToggle.ts +28 -0
  310. package/src/internal/addToChain.ts +40 -0
  311. package/src/internal/areValidKeys.ts +40 -0
  312. package/src/internal/areValidVariants.ts +59 -0
  313. package/src/internal/checkTrigger.ts +55 -0
  314. package/src/internal/checkUntrigger.ts +26 -0
  315. package/src/internal/cloneLastChord.ts +10 -0
  316. package/src/internal/containsPossibleToggleChords.ts +91 -0
  317. package/src/internal/errorTextAdd.ts +18 -0
  318. package/src/internal/errorTextInUse.ts +10 -0
  319. package/src/internal/errorTextRemove.ts +10 -0
  320. package/src/internal/getModifierState.ts +15 -0
  321. package/src/internal/getPressedKeys.ts +26 -0
  322. package/src/internal/getPressedModifierKeys.ts +14 -0
  323. package/src/internal/getPressedNonModifierKeys.ts +19 -0
  324. package/src/internal/inChain.ts +25 -0
  325. package/src/internal/isValidChain.ts +42 -0
  326. package/src/internal/isValidChord.ts +87 -0
  327. package/src/internal/isValidCommand.ts +35 -0
  328. package/src/internal/keyOrder.ts +24 -0
  329. package/src/internal/removeFromChain.ts +46 -0
  330. package/src/internal/safeSetEmulatedToggleState.ts +23 -0
  331. package/src/internal/setKeysState.ts +71 -0
  332. package/src/internal/updateNativeKeysState.ts +84 -0
  333. package/src/layouts/createLayout.ts +328 -0
  334. package/src/module.ts +62 -0
  335. package/src/runtime/composables/useLabeledByKeyboardLayoutMap.ts +28 -0
  336. package/src/runtime/composables/usePointerCoords.ts +40 -0
  337. package/src/runtime/composables/useShortcutManagerContextCount.ts +81 -0
  338. package/src/runtime/composables/useShortcutManagerKeysLayout.ts +42 -0
  339. package/src/runtime/composables/useShortcutManagerVirtualPress.ts +30 -0
  340. package/src/runtime/types.ts +10 -0
  341. package/src/runtime/utils/shortcutToId.ts +14 -0
  342. package/src/types/commands.ts +148 -0
  343. package/src/types/condition.ts +35 -0
  344. package/src/types/context.ts +19 -0
  345. package/src/types/enums.ts +236 -0
  346. package/src/types/general.ts +117 -0
  347. package/src/types/index.ts +10 -0
  348. package/src/types/keys.ts +385 -0
  349. package/src/types/manager.ts +374 -0
  350. package/src/types/plugins.ts +32 -0
  351. package/src/types/shortcuts.ts +204 -0
  352. package/src/types/utils.ts +40 -0
  353. package/src/utils/chainContainsSubset.ts +97 -0
  354. package/src/utils/cloneChain.ts +13 -0
  355. package/src/utils/cloneKey.ts +33 -0
  356. package/src/utils/containsKey.ts +17 -0
  357. package/src/utils/dedupeKeys.ts +23 -0
  358. package/src/utils/equalsKey.ts +32 -0
  359. package/src/utils/equalsKeys.ts +50 -0
  360. package/src/utils/index.ts +16 -0
  361. package/src/utils/isAnyKey.ts +12 -0
  362. package/src/utils/isMouseKey.ts +27 -0
  363. package/src/utils/isNormalKey.ts +15 -0
  364. package/src/utils/isTriggerKey.ts +7 -0
  365. package/src/utils/isWheelKey.ts +18 -0
  366. package/src/utils/mapKeys.ts +21 -0
  367. package/src/utils/removeKeys.ts +16 -0
@@ -0,0 +1,118 @@
1
+ import { crop } from "@alanscodelog/utils/crop";
2
+ import { Err, Ok } from "@alanscodelog/utils/Result";
3
+ import { KnownError } from "./KnownError.js";
4
+ import { setShortcutProp } from "../core/setShortcutProp.js";
5
+ import { defaultStringifier } from "../defaults/Stringifier.js";
6
+ import { SHORTCUT_ERROR } from "../types/index.js";
7
+ import { equalsKeys } from "../utils/equalsKeys.js";
8
+ function setForceUnequalOnAll(shortcuts, val, save = false) {
9
+ const was = save ? [] : void 0;
10
+ for (let i = 0; i < shortcuts.length; i++) {
11
+ const shortcut = shortcuts[i];
12
+ if (save) was.push(shortcut.forceUnequal);
13
+ setShortcutProp(shortcut, "forceUnequal", typeof val === "boolean" ? val : val[i], {});
14
+ }
15
+ return was;
16
+ }
17
+ function canSwapChords(shortcuts, manager, chainA, chainB, filter) {
18
+ let can = Ok(true);
19
+ const shortcutsClone = { ...shortcuts, entries: [...shortcuts.entries.map((_) => ({ ..._ }))] };
20
+ const managerClone = { ...manager, shortcuts: shortcutsClone };
21
+ const { shortcutsA, shortcutsB } = getToSwap(shortcutsClone, manager, chainA, chainB, filter);
22
+ const wasA = setForceUnequalOnAll(shortcutsA, true, true);
23
+ for (const shortcutB of shortcutsB) {
24
+ const newChain = [...chainA, ...shortcutB.chain.slice(chainA.length, shortcutB.chain.length)];
25
+ const res = setShortcutProp(shortcutB, "chain", newChain, managerClone);
26
+ if (res.isError) {
27
+ can = res;
28
+ break;
29
+ }
30
+ }
31
+ setForceUnequalOnAll(shortcutsA, wasA);
32
+ if (can.isOk) {
33
+ const wasB = setForceUnequalOnAll(shortcutsB, true, true);
34
+ for (const shortcutA of shortcutsA) {
35
+ const newChain = [...chainB, ...shortcutA.chain.slice(chainB.length, shortcutA.chain.length)];
36
+ const res = setShortcutProp(shortcutA, "chain", newChain, managerClone);
37
+ if (res.isError) {
38
+ can = res;
39
+ break;
40
+ }
41
+ }
42
+ setForceUnequalOnAll(shortcutsB, wasB);
43
+ }
44
+ return can;
45
+ }
46
+ function assertChordsNotEmpty(chord, keys, { stringifier: s = defaultStringifier } = {}) {
47
+ let found;
48
+ if (chord.length === 0 || chord.find((ks) => ks.length === 0)) {
49
+ found = chord;
50
+ }
51
+ if (found) {
52
+ return Err(new KnownError(
53
+ SHORTCUT_ERROR.INVALID_SWAP_CHORDS,
54
+ `Cannot swap with empty chord, but ${s.stringify(chord, { keys })} contains an empty chord.`,
55
+ { chord }
56
+ ));
57
+ }
58
+ return Ok(true);
59
+ }
60
+ function assertCorrectSwapParameters(keys, chordsA, chordsB, {
61
+ stringifier: s = defaultStringifier
62
+ } = {}) {
63
+ const canA = assertChordsNotEmpty(chordsA, keys, { stringifier: s });
64
+ if (canA.isError) {
65
+ return canA;
66
+ }
67
+ const canB = assertChordsNotEmpty(chordsB, keys, { stringifier: s });
68
+ if (canB.isError) {
69
+ return canB;
70
+ }
71
+ if (equalsKeys(chordsA, chordsB, keys, chordsB.length) || equalsKeys(chordsB, chordsA, keys, chordsA.length)) {
72
+ return Err(new KnownError(SHORTCUT_ERROR.INVALID_SWAP_CHORDS, crop`
73
+ The chords to swap cannot share starting chords.
74
+ Chords:
75
+ ${s.stringify(chordsA, { keys })}
76
+ ${s.stringify(chordsB, { keys })}
77
+ `, { chordsA, chordsB }));
78
+ }
79
+ return Ok(true);
80
+ }
81
+ function getToSwap(shortcuts, manager, chainA, chainB, filter) {
82
+ let shortcutsA = shortcuts.entries.filter((shortcut) => equalsKeys(shortcut.chain, chainA, manager.keys, chainA.length));
83
+ let shortcutsB = shortcuts.entries.filter((shortcut) => equalsKeys(shortcut.chain, chainB, manager.keys, chainB.length));
84
+ if (filter) {
85
+ shortcutsA = shortcutsA.filter(filter);
86
+ shortcutsB = shortcutsB.filter(filter);
87
+ }
88
+ return { shortcutsA, shortcutsB };
89
+ }
90
+ export function shortcutSwapChords(shortcuts, chainA, chainB, manager, {
91
+ check = true
92
+ } = {}, filter) {
93
+ const res = assertCorrectSwapParameters(manager.keys, chainA, chainB);
94
+ if (res.isError) {
95
+ return res;
96
+ }
97
+ if (check) {
98
+ const res2 = canSwapChords(shortcuts, manager, chainA, chainB, filter);
99
+ if (res2.isError) {
100
+ return res2;
101
+ }
102
+ }
103
+ if (check === "only") {
104
+ return Ok(true);
105
+ }
106
+ const { shortcutsA, shortcutsB } = getToSwap(shortcuts, manager, chainA, chainB, filter);
107
+ const wasA = setForceUnequalOnAll(shortcutsA, true, true);
108
+ for (const shortcutB of shortcutsB) {
109
+ setShortcutProp(shortcutB, "chain", [...chainA, ...shortcutB.chain.slice(chainA.length, shortcutB.chain.length)], manager, { check: false });
110
+ }
111
+ setForceUnequalOnAll(shortcutsA, wasA);
112
+ const wasB = setForceUnequalOnAll(shortcutsA, true, true);
113
+ for (const shortcutA of shortcutsA) {
114
+ setShortcutProp(shortcutA, "chain", [...chainB, ...shortcutA.chain.slice(chainB.length, shortcutA.chain.length)], manager, { check: false });
115
+ }
116
+ setForceUnequalOnAll(shortcutsA, wasB, true);
117
+ return Ok(true);
118
+ }
@@ -0,0 +1,13 @@
1
+ import type { Manager } from "../types/index.js";
2
+ /**
3
+ * The manager is not designed to react to setting a key's pressed state directly only to events to then set the key state.
4
+ *
5
+ * So this method is provided to allow a "virtual" press (i.e. by some method that is not a real key press such as directly clicking on a visual representation of the key), without having to use the Emulator.
6
+ *
7
+ * It takes care of changing the key press state, and adding the key to the chain.
8
+ *
9
+ * Note that it is more simplistic and less "precise" than the emulator. It will ignore the type of toggles (native toggles will be treated as emulated). If using {@link Manager.options.updateStateOnAllEvents}, you will probably want to temporarily disable it or the state of the key press might get immediately reset.
10
+ *
11
+ * There is also {@link virtualRelease} and {@link virtualToggle}.
12
+ */
13
+ export declare function virtualPress(manager: Manager, keyIdOrVariant: string): void;
@@ -0,0 +1,15 @@
1
+ import { getKeyFromIdOrVariant } from "./getKeyFromIdOrVariant.js";
2
+ import { addToChain } from "../internal/addToChain.js";
3
+ import { setKeysState } from "../internal/setKeysState.js";
4
+ export function virtualPress(manager, keyIdOrVariant) {
5
+ const res = getKeyFromIdOrVariant(keyIdOrVariant, manager.keys);
6
+ if (res.isError) {
7
+ manager.options.cb(manager, res.error);
8
+ return;
9
+ }
10
+ const key = res.value[0];
11
+ const keys = [key.id];
12
+ manager.listener?.({ isKeydown: true, keys, manager });
13
+ setKeysState(keys, manager, true, { ignoreToggleType: true });
14
+ addToChain(manager, keys, void 0);
15
+ }
@@ -0,0 +1,5 @@
1
+ import type { Manager } from "../types/index.js";
2
+ /**
3
+ * See {@link virtualPress}
4
+ */
5
+ export declare function virtualRelease(manager: Manager, keyIdOrVariant: string): void;
@@ -0,0 +1,15 @@
1
+ import { getKeyFromIdOrVariant } from "./getKeyFromIdOrVariant.js";
2
+ import { removeFromChain } from "../internal/removeFromChain.js";
3
+ import { setKeysState } from "../internal/setKeysState.js";
4
+ export function virtualRelease(manager, keyIdOrVariant) {
5
+ const res = getKeyFromIdOrVariant(keyIdOrVariant, manager.keys);
6
+ if (res.isError) {
7
+ manager.options.cb(manager, res.error);
8
+ return;
9
+ }
10
+ const key = res.value[0];
11
+ const keys = [key.id];
12
+ manager.listener?.({ isKeydown: false, keys, manager });
13
+ setKeysState(keys, manager, false);
14
+ removeFromChain(manager, keys, void 0);
15
+ }
@@ -0,0 +1,7 @@
1
+ import type { Manager } from "../types/index.js";
2
+ /**
3
+ * Calls {@link virtualRelease} if the key is pressed.
4
+ *
5
+ * Calls {@link virtualPress} if the key is released.
6
+ */
7
+ export declare function virtualToggle(manager: Manager, keyIdOrVariant: string): void;
@@ -0,0 +1,16 @@
1
+ import { getKeyFromIdOrVariant } from "./getKeyFromIdOrVariant.js";
2
+ import { virtualPress } from "./virtualPress.js";
3
+ import { virtualRelease } from "./virtualRelease.js";
4
+ export function virtualToggle(manager, keyIdOrVariant) {
5
+ const res = getKeyFromIdOrVariant(keyIdOrVariant, manager.keys);
6
+ if (res.isError) {
7
+ manager.options.cb(manager, res.error);
8
+ return;
9
+ }
10
+ const key = res.value[0];
11
+ if (key.pressed) {
12
+ virtualRelease(manager, keyIdOrVariant);
13
+ } else {
14
+ virtualPress(manager, keyIdOrVariant);
15
+ }
16
+ }
@@ -0,0 +1,3 @@
1
+ import { type Result } from "@alanscodelog/utils/Result";
2
+ import type { AnyInputEvent, Manager, ManagerSetEntries, MultipleErrors } from "../types/index.js";
3
+ export declare function addToChain(manager: Manager, keysList: string[], e?: AnyInputEvent): Result<true, MultipleErrors<ManagerSetEntries["state.chain"]["error"]>>;
@@ -0,0 +1,27 @@
1
+ import { Ok } from "@alanscodelog/utils/Result";
2
+ import { checkTrigger } from "./checkTrigger.js";
3
+ import { setManagerProp } from "../core/setManagerProp.js";
4
+ import { cloneChain } from "../utils/cloneChain.js";
5
+ export function addToChain(manager, keysList, e) {
6
+ const sorter = manager.options.sorter;
7
+ if (manager.state.isAwaitingKeyup) return Ok(true);
8
+ if (keysList.length === 0) return Ok(true);
9
+ if (manager.state.nextIsChord) {
10
+ setManagerProp(manager, "state.chain", cloneChain([...manager.state.chain, []])).unwrap();
11
+ setManagerProp(manager, "state.nextIsChord", false);
12
+ }
13
+ const length = manager.state.chain.length - 1;
14
+ const lastChord = [...manager.state.chain[length] ?? []];
15
+ for (const id of keysList) {
16
+ if (!lastChord.includes(id)) {
17
+ lastChord.push(id);
18
+ const res = setManagerProp(manager, "state.chain", cloneChain([
19
+ ...manager.state.chain.slice(0, length),
20
+ sorter.sort(lastChord, manager.keys)
21
+ ]));
22
+ if (res.isError) return res;
23
+ checkTrigger(manager, e);
24
+ }
25
+ }
26
+ return Ok(true);
27
+ }
@@ -0,0 +1,7 @@
1
+ import { type Result } from "@alanscodelog/utils/Result";
2
+ import type { Manager, MultipleErrors, PickManager, Shortcut } from "../types/index.js";
3
+ import { SHORTCUT_ERROR } from "../types/index.js";
4
+ /**
5
+ * @internal
6
+ */
7
+ export declare function areValidKeys(chain: string[][] | Shortcut, manager: Pick<Manager, "keys"> & PickManager<"options", "stringifier">): Result<true, MultipleErrors<typeof SHORTCUT_ERROR.UNKNOWN_KEY>>;
@@ -0,0 +1,28 @@
1
+ import { crop } from "@alanscodelog/utils/crop";
2
+ import { Err, Ok } from "@alanscodelog/utils/Result";
3
+ import { getKeyFromIdOrVariant } from "../helpers/getKeyFromIdOrVariant.js";
4
+ import { KnownError } from "../helpers/KnownError.js";
5
+ import { SHORTCUT_ERROR } from "../types/index.js";
6
+ export function areValidKeys(chain, manager) {
7
+ const s = manager.options.stringifier;
8
+ const keys = manager.keys;
9
+ const shortcut = "type" in chain ? chain : void 0;
10
+ chain = "type" in chain ? chain.chain : chain;
11
+ const unknownKeys = [];
12
+ for (const key of chain.flat()) {
13
+ const res = getKeyFromIdOrVariant(key, keys);
14
+ if (res.isError) {
15
+ unknownKeys.push(key);
16
+ }
17
+ }
18
+ if (unknownKeys.length > 0) {
19
+ const stringified = s.stringifyList("keys", unknownKeys, { keys });
20
+ return Err(new KnownError(SHORTCUT_ERROR.UNKNOWN_KEY, crop`
21
+ ${s.stringify(shortcut ?? chain, manager)} contains unknown keys: ${stringified}
22
+ `, {
23
+ shortcut: shortcut ?? { chain },
24
+ keys: unknownKeys
25
+ }));
26
+ }
27
+ return Ok(true);
28
+ }
@@ -0,0 +1,4 @@
1
+ import { type Result } from "@alanscodelog/utils/Result";
2
+ import { KnownError } from "../helpers/KnownError.js";
3
+ import { type Key, type KeysSetEntries, SHORTCUT_ERROR } from "../types/index.js";
4
+ export declare function areValidVariants(key: Key, manager: KeysSetEntries["entries@add"]["manager"]): Result<true, KnownError<typeof SHORTCUT_ERROR.INVALID_VARIANT_PAIR>>;
@@ -0,0 +1,45 @@
1
+ import { crop } from "@alanscodelog/utils/crop";
2
+ import { Err, Ok } from "@alanscodelog/utils/Result";
3
+ import { getKeyFromIdOrVariant } from "../helpers/getKeyFromIdOrVariant.js";
4
+ import { KnownError } from "../helpers/KnownError.js";
5
+ import { SHORTCUT_ERROR } from "../types/index.js";
6
+ export function areValidVariants(key, manager) {
7
+ const keys = manager.keys;
8
+ const s = manager.options.stringifier;
9
+ const existingVariants = keys.variants?.[key.id]?.map((id) => keys.entries[id]) ?? [];
10
+ const keysVariants = key.variants ? key.variants.flatMap((id) => {
11
+ const res = getKeyFromIdOrVariant(id, keys);
12
+ if (res.isOk) return res.value;
13
+ return [];
14
+ }) : [];
15
+ const variants = [...existingVariants, ...keysVariants];
16
+ for (const k of variants) {
17
+ if (!!key.isToggle !== !!k.isToggle) {
18
+ const stringKey = s.stringify(key, manager);
19
+ const stringOtherKey = s.stringify(k, manager);
20
+ return Err(new KnownError(SHORTCUT_ERROR.INVALID_VARIANT_PAIR, crop`
21
+ Key ${stringKey} specifies a variant or matches an existing key's variant (${stringOtherKey}), but their functionality is not the same.
22
+
23
+ Key ${stringKey} "isToggle" is "${key.isToggle}" while key ${stringOtherKey} "isToggle" is "${k.isToggle}".
24
+ `, {
25
+ variants,
26
+ key,
27
+ otherKey: k
28
+ }));
29
+ }
30
+ if (!!key.isModifier !== !!k.isModifier) {
31
+ const stringKey = s.stringify(key, manager);
32
+ const stringOtherKey = s.stringify(k, manager);
33
+ return Err(new KnownError(SHORTCUT_ERROR.INVALID_VARIANT_PAIR, crop`
34
+ Key ${stringKey} specifies a variant or matches an existing key's variant (${stringOtherKey}), but their functionality is not the same.
35
+
36
+ Key ${stringKey} "isModifier" is "${key.isModifier}" while key ${stringOtherKey} "isModifier" is "${k.isModifier}".
37
+ `, {
38
+ variants,
39
+ key,
40
+ otherKey: k
41
+ }));
42
+ }
43
+ }
44
+ return Ok(true);
45
+ }
@@ -0,0 +1,2 @@
1
+ import { type AnyInputEvent, type Manager } from "../types/index.js";
2
+ export declare function checkTrigger(manager: Manager, e?: AnyInputEvent): void;
@@ -0,0 +1,47 @@
1
+ import { checkUntrigger } from "./checkUntrigger.js";
2
+ import { cloneLastChord } from "./cloneLastChord.js";
3
+ import { inChain } from "./inChain.js";
4
+ import { setManagerProp } from "../core/setManagerProp.js";
5
+ import { getTriggerableShortcut } from "../helpers/getTriggerableShortcut.js";
6
+ import { KnownError } from "../helpers/KnownError.js";
7
+ import { SHORTCUT_ERROR } from "../types/index.js";
8
+ import { isTriggerKey } from "../utils/isTriggerKey.js";
9
+ export function checkTrigger(manager, e) {
10
+ checkUntrigger(manager, e);
11
+ const hadUntrigger = manager.state.untrigger;
12
+ const cb = manager.options.cb;
13
+ if (!manager.options.enableShortcuts) return;
14
+ const res = getTriggerableShortcut(manager);
15
+ if (res.isError) {
16
+ cb(manager, res.error, e);
17
+ } else if (res.value && res.value !== hadUntrigger) {
18
+ setManagerProp(manager, "state.untrigger", res.value);
19
+ setManagerProp(manager, "state.nextIsChord", false);
20
+ const command = manager.commands.entries[res.value.command];
21
+ command?.execute?.({
22
+ isKeydown: true,
23
+ command,
24
+ shortcut: res.value,
25
+ event: e,
26
+ manager,
27
+ context: manager.context
28
+ });
29
+ }
30
+ const triggerKey = cloneLastChord(manager.state.chain)?.find((id) => isTriggerKey(manager.keys.entries[id]));
31
+ const nonTriggerKey = cloneLastChord(manager.state.chain)?.find((id) => !isTriggerKey(manager.keys.entries[id]));
32
+ if (triggerKey) {
33
+ if (inChain(manager) || manager.state.isRecording) {
34
+ setManagerProp(manager, "state.nextIsChord", true);
35
+ if (nonTriggerKey) {
36
+ setManagerProp(manager, "state.isAwaitingKeyup", true);
37
+ }
38
+ } else if (!manager.state.isRecording && !inChain(manager) && (res.isOk && !res.value) && manager.state.chain.length > 1) {
39
+ const error = new KnownError(
40
+ SHORTCUT_ERROR.NO_MATCHING_SHORTCUT,
41
+ "A chord containing a non-modifier key was pressed while in a chord chain, but no shortcut found to trigger.",
42
+ { chain: manager.state.chain }
43
+ );
44
+ cb(manager, error, e);
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,2 @@
1
+ import type { AnyInputEvent, Manager } from "../types/index.js";
2
+ export declare function checkUntrigger(manager: Manager, e?: AnyInputEvent): void;
@@ -0,0 +1,18 @@
1
+ import { setManagerProp } from "../core/setManagerProp.js";
2
+ export function checkUntrigger(manager, e) {
3
+ if (manager.state.untrigger) {
4
+ const untrigger = manager.state.untrigger;
5
+ setManagerProp(manager, "state.untrigger", false);
6
+ setManagerProp(manager, "state.nextIsChord", false);
7
+ if (!manager.options.enableShortcuts) return;
8
+ const command = manager.commands.entries[untrigger.command];
9
+ command.execute?.({
10
+ isKeydown: false,
11
+ command,
12
+ shortcut: untrigger,
13
+ event: e,
14
+ manager,
15
+ context: manager.context
16
+ });
17
+ }
18
+ }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * A copy of the last chord in the chain if it exists.
3
+ */
4
+ export declare function cloneLastChord(chain: string[][]): string[] | undefined;
@@ -0,0 +1,5 @@
1
+ import { last } from "@alanscodelog/utils/last";
2
+ export function cloneLastChord(chain) {
3
+ const lastC = last(chain);
4
+ return lastC ? [...lastC] : void 0;
5
+ }
@@ -0,0 +1,13 @@
1
+ import { type Result } from "@alanscodelog/utils/Result";
2
+ import { KnownError } from "../helpers/KnownError.js";
3
+ import { type Manager, type PickManager, SHORTCUT_ERROR } from "../types/index.js";
4
+ /**
5
+ * If you have toggle keys in chords, their are "chains" of the same toggle key that would be physically impossible. For example: `toggle(on) toggle(on)`.
6
+ *
7
+ * This guards against that.
8
+ *
9
+ * This does NOT guard against duplicates and errors in the same chord, for that see {@link isValidChord}.
10
+ *
11
+ * @internal
12
+ */
13
+ export declare function containsPossibleToggleChords(chain: string[][], manager: Pick<Manager, "keys"> & PickManager<"options", "stringifier">): Result<true, KnownError<typeof SHORTCUT_ERROR.IMPOSSIBLE_TOGGLE_SEQUENCE>>;
@@ -0,0 +1,65 @@
1
+ import { crop } from "@alanscodelog/utils/crop";
2
+ import { Err, Ok } from "@alanscodelog/utils/Result";
3
+ import { getKeyFromIdOrVariant } from "../helpers/getKeyFromIdOrVariant.js";
4
+ import { KnownError } from "../helpers/KnownError.js";
5
+ import { SHORTCUT_ERROR } from "../types/index.js";
6
+ export function containsPossibleToggleChords(chain, manager) {
7
+ const keys = manager.keys;
8
+ const s = manager.options.stringifier;
9
+ const prevToggles = [];
10
+ let num = 0;
11
+ let impossible;
12
+ for (const chord of chain) {
13
+ const toggleIds = chord.filter((keyId) => getKeyFromIdOrVariant(keyId, keys).unwrap()[0].isToggle);
14
+ let found = false;
15
+ for (let k = 0; k < toggleIds.length; k++) {
16
+ const currId = toggleIds[k];
17
+ const prevWithSameRootsIds = prevToggles.map(([prevId, j]) => {
18
+ const prev = getKeyFromIdOrVariant(prevId, keys).unwrap()[0];
19
+ const curr = getKeyFromIdOrVariant(currId, keys).unwrap()[0];
20
+ return prev.id === curr.id || prev.variants?.includes(curr.id) || curr.variants?.includes(prev.id) ? [prevId, j] : void 0;
21
+ }).filter((key) => key !== void 0);
22
+ prevWithSameRootsIds.push([currId, num + k]);
23
+ let canBeOn = true;
24
+ let canBeOff = true;
25
+ for (const [keyId, j] of prevWithSameRootsIds) {
26
+ const key = keys.entries[keyId] ?? keys.toggles[keyId];
27
+ if (key.id === keyId) {
28
+ const couldOn = canBeOn;
29
+ const couldOff = canBeOff;
30
+ canBeOn = couldOff;
31
+ canBeOff = couldOn;
32
+ continue;
33
+ }
34
+ const isOff = key.toggleOffId === keyId;
35
+ const isOn = key.toggleOnId === keyId;
36
+ if (isOn && !canBeOn || isOff && !canBeOff) {
37
+ impossible = { keyId, pos: j };
38
+ break;
39
+ }
40
+ canBeOn = isOff;
41
+ canBeOff = isOn;
42
+ }
43
+ if (impossible) {
44
+ found = true;
45
+ break;
46
+ }
47
+ const currKey = getKeyFromIdOrVariant(currId, keys).unwrap()[0];
48
+ if (currKey.isToggle) {
49
+ prevToggles.push([currId, num + k]);
50
+ }
51
+ num += chord.length;
52
+ }
53
+ if (found) break;
54
+ }
55
+ if (impossible) {
56
+ const prettyShortcut = s.stringify(chain, manager);
57
+ const { pos, keyId: key } = impossible;
58
+ const e = Err(new KnownError(SHORTCUT_ERROR.IMPOSSIBLE_TOGGLE_SEQUENCE, crop`
59
+ Chain "${prettyShortcut}" is impossible.
60
+ This chain has a toggle key state "${s.stringify(key, manager)}" at key #${pos + 1} that would be impossible to trigger.
61
+ `, { chain, key: keys.entries[key] ?? keys.toggles[key], i: pos }));
62
+ return e;
63
+ }
64
+ return Ok(true);
65
+ }
@@ -0,0 +1 @@
1
+ export declare function errorTextAdd(type: "Key" | "Shortcut" | "Command", existingIdentifier: string, existingEntry: string, newEntry: string): string;
@@ -0,0 +1,11 @@
1
+ import { crop } from "@alanscodelog/utils/crop";
2
+ import { indent } from "@alanscodelog/utils/indent";
3
+ export function errorTextAdd(type, existingIdentifier, existingEntry, newEntry) {
4
+ return crop`
5
+ ${type} ${existingIdentifier} is already registered.
6
+ Existing ${type}:
7
+ ${indent(existingEntry.toString(), 3)}
8
+ New ${type}:
9
+ ${indent(newEntry.toString(), 3)}
10
+ `;
11
+ }
@@ -0,0 +1 @@
1
+ export declare function errorTextInUse(type: "command" | "key", identifier: string, list: string): string;
@@ -0,0 +1,8 @@
1
+ import { crop } from "@alanscodelog/utils/crop";
2
+ import { indent } from "@alanscodelog/utils/indent";
3
+ export function errorTextInUse(type, identifier, list) {
4
+ return crop`
5
+ Cannot remove ${type} ${identifier}, it is in use by the following shortcuts:
6
+ ${indent(list, 2)}
7
+ `;
8
+ }
@@ -0,0 +1 @@
1
+ export declare function errorTextRemove(type: string, identifier: string, entries: string): string;
@@ -0,0 +1,8 @@
1
+ import { crop } from "@alanscodelog/utils/crop";
2
+ import { indent } from "@alanscodelog/utils/indent";
3
+ export function errorTextRemove(type, identifier, entries) {
4
+ return crop`
5
+ ${type} ${identifier} does not exist in entries:
6
+ ${indent(entries, 3)}
7
+ `;
8
+ }
@@ -0,0 +1,2 @@
1
+ import type { AnyInputEvent, Key, PickManager } from "../types/index.js";
2
+ export declare function getModifierState(key: Key, e: AnyInputEvent, manager: PickManager<"options", "updateStateOnAllEvents">): boolean | null;
@@ -0,0 +1,7 @@
1
+ export function getModifierState(key, e, manager) {
2
+ if (!manager.options.updateStateOnAllEvents || !key.updateStateOnAllEvents) return null;
3
+ for (const code of [key.id, ...key.variants ?? []]) {
4
+ if ("getModifierState" in e && e.getModifierState(code)) return true;
5
+ }
6
+ return false;
7
+ }
@@ -0,0 +1,7 @@
1
+ import type { Manager } from "../types/index.js";
2
+ /**
3
+ * A list of currently pressed keys for convenience.
4
+ *
5
+ * It's just a wrapper around querying the key set for pressed keys.
6
+ */
7
+ export declare function getPressedKeys(manager: Pick<Manager, "keys">): string[];
@@ -0,0 +1,18 @@
1
+ export function getPressedKeys(manager) {
2
+ const res = [];
3
+ for (const keyId of Object.keys(manager.keys.entries)) {
4
+ const key = manager.keys.entries[keyId];
5
+ if (key.pressed) {
6
+ res.push(key.id);
7
+ }
8
+ if (key.isToggle) {
9
+ if (key.toggleOnPressed) {
10
+ res.push(key.toggleOnId);
11
+ }
12
+ if (key.toggleOffPressed) {
13
+ res.push(key.toggleOffId);
14
+ }
15
+ }
16
+ }
17
+ return res;
18
+ }
@@ -0,0 +1,2 @@
1
+ import type { Manager } from "../types/index.js";
2
+ export declare function getPressedModifierKeys(manager: Pick<Manager, "keys">): string[];
@@ -0,0 +1,10 @@
1
+ export function getPressedModifierKeys(manager) {
2
+ const res = [];
3
+ for (const keyId of Object.keys(manager.keys.entries)) {
4
+ const key = manager.keys.entries[keyId];
5
+ if (key.pressed && key.isModifier) {
6
+ res.push(key.id);
7
+ }
8
+ }
9
+ return res;
10
+ }
@@ -0,0 +1,7 @@
1
+ import type { Manager } from "../types/index.js";
2
+ /**
3
+ * A list of currently pressed non-modifier keys. They can't be toggle state keys (i.e. `on`/`off`) either.
4
+ *
5
+ * This determines whether when we await keyup and when a new chord should be added.
6
+ */
7
+ export declare function getPressedNonModifierKeys(manager: Pick<Manager, "keys">): string[];
@@ -0,0 +1,11 @@
1
+ import { isTriggerKey } from "../utils/isTriggerKey.js";
2
+ export function getPressedNonModifierKeys(manager) {
3
+ const res = [];
4
+ for (const keyId of Object.keys(manager.keys.entries)) {
5
+ const key = manager.keys.entries[keyId];
6
+ if (key.pressed && isTriggerKey(manager.keys.entries[keyId])) {
7
+ res.push(key.id);
8
+ }
9
+ }
10
+ return res;
11
+ }
@@ -0,0 +1,5 @@
1
+ import type { Manager } from "../types/index.js";
2
+ /**
3
+ * Returns true if there are shortcuts that could be executed given the state of the manager's chain. That is, except if {@link Manager.isAwaitingKeyup} is true, in which case it returns false.
4
+ */
5
+ export declare function inChain(manager: Manager): boolean;
@@ -0,0 +1,14 @@
1
+ import { shortcutCanExecuteIn } from "../helpers/shortcutCanExecuteIn.js";
2
+ import { equalsKeys } from "../utils/equalsKeys.js";
3
+ export function inChain(manager) {
4
+ if (manager.state.isAwaitingKeyup) return false;
5
+ const shortcuts = manager.shortcuts.entries.filter((shortcut) => shortcutCanExecuteIn(shortcut, manager, { allowEmptyCommand: true }) && manager.state.chain.length < shortcut.chain.length && equalsKeys(
6
+ shortcut.chain,
7
+ manager.state.chain,
8
+ manager.keys,
9
+ manager.state.chain.length,
10
+ { allowVariants: true }
11
+ ));
12
+ if (!shortcuts) return false;
13
+ return shortcuts.length > 0;
14
+ }
@@ -0,0 +1,10 @@
1
+ import { type Result } from "@alanscodelog/utils/Result";
2
+ import type { ChainError, Manager, MultipleErrors, PickManager } from "../types/index.js";
3
+ /**
4
+ * Guards against invalid chains (for various reasons). See the {@link ChainError}.
5
+ *
6
+ * Checks {@link areValidKeys}, {@link isValidChord} and {@link containsPossibleToggleChords}
7
+ *
8
+ * @internal
9
+ */
10
+ export declare function isValidChain(chain: string[][], manager: Pick<Manager, "keys"> & PickManager<"options", "stringifier" | "sorter">): Result<true, MultipleErrors<ChainError>>;