@ledgerhq/speculos-device-controller 0.0.0-speculos-transport-and-device-controller-20251016095459 → 0.0.0-wrong-error-when-in-experimental-provider-20251021161219

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 (157) hide show
  1. package/README.md +43 -48
  2. package/lib/cjs/package.json +3 -6
  3. package/lib/cjs/src/api/DeviceController.js +1 -1
  4. package/lib/cjs/src/api/DeviceController.js.map +3 -3
  5. package/lib/cjs/src/api/DeviceController.test.js +2 -0
  6. package/lib/cjs/src/api/DeviceController.test.js.map +7 -0
  7. package/lib/cjs/src/index.js +1 -1
  8. package/lib/cjs/src/index.js.map +3 -3
  9. package/lib/cjs/src/internal/adapters/DefaultButtonController.js +2 -0
  10. package/lib/cjs/src/internal/adapters/DefaultButtonController.js.map +7 -0
  11. package/lib/cjs/src/internal/adapters/DefaultButtonController.test.js +2 -0
  12. package/lib/cjs/src/internal/adapters/DefaultButtonController.test.js.map +7 -0
  13. package/lib/cjs/src/internal/adapters/DefaultTouchController.js +2 -0
  14. package/lib/cjs/src/internal/adapters/DefaultTouchController.js.map +7 -0
  15. package/lib/cjs/src/internal/adapters/DefaultTouchController.test.js +2 -0
  16. package/lib/cjs/src/internal/adapters/DefaultTouchController.test.js.map +7 -0
  17. package/lib/cjs/src/internal/config/defaultScreens.js +1 -1
  18. package/lib/cjs/src/internal/config/defaultScreens.js.map +3 -3
  19. package/lib/cjs/src/internal/core/{IButtonController.js → ButtonController.js} +1 -1
  20. package/lib/cjs/src/internal/core/ButtonController.js.map +7 -0
  21. package/lib/cjs/src/internal/core/TouchController.js +2 -0
  22. package/lib/cjs/src/internal/core/TouchController.js.map +7 -0
  23. package/lib/cjs/src/internal/core/types.js +1 -1
  24. package/lib/cjs/src/internal/core/types.js.map +3 -3
  25. package/lib/cjs/src/internal/di.js +1 -1
  26. package/lib/cjs/src/internal/di.js.map +3 -3
  27. package/lib/cjs/src/internal/di.test.js +2 -0
  28. package/lib/cjs/src/internal/di.test.js.map +7 -0
  29. package/lib/cjs/src/internal/use-cases/buttonUseCases.js +2 -0
  30. package/lib/cjs/src/internal/use-cases/buttonUseCases.js.map +7 -0
  31. package/lib/cjs/src/internal/use-cases/buttonUseCases.test.js +2 -0
  32. package/lib/cjs/src/internal/use-cases/buttonUseCases.test.js.map +7 -0
  33. package/lib/cjs/src/internal/use-cases/touchUseCases.js +2 -0
  34. package/lib/cjs/src/internal/use-cases/touchUseCases.js.map +7 -0
  35. package/lib/cjs/src/internal/use-cases/touchUseCases.test.js +2 -0
  36. package/lib/cjs/src/internal/use-cases/touchUseCases.test.js.map +7 -0
  37. package/lib/cjs/src/internal/utils/axisClamp.js +1 -1
  38. package/lib/cjs/src/internal/utils/axisClamp.js.map +3 -3
  39. package/lib/cjs/src/internal/utils/axisClamp.test.js +2 -0
  40. package/lib/cjs/src/internal/utils/axisClamp.test.js.map +7 -0
  41. package/lib/esm/package.json +3 -6
  42. package/lib/esm/src/api/DeviceController.js +1 -1
  43. package/lib/esm/src/api/DeviceController.js.map +3 -3
  44. package/lib/esm/src/api/DeviceController.test.js +2 -0
  45. package/lib/esm/src/api/DeviceController.test.js.map +7 -0
  46. package/lib/esm/src/index.js +1 -1
  47. package/lib/esm/src/index.js.map +2 -2
  48. package/lib/esm/src/internal/adapters/DefaultButtonController.js +2 -0
  49. package/lib/esm/src/internal/adapters/DefaultButtonController.js.map +7 -0
  50. package/lib/esm/src/internal/adapters/DefaultButtonController.test.js +2 -0
  51. package/lib/esm/src/internal/adapters/DefaultButtonController.test.js.map +7 -0
  52. package/lib/esm/src/internal/adapters/DefaultTouchController.js +2 -0
  53. package/lib/esm/src/internal/adapters/DefaultTouchController.js.map +7 -0
  54. package/lib/esm/src/internal/adapters/DefaultTouchController.test.js +2 -0
  55. package/lib/esm/src/internal/adapters/DefaultTouchController.test.js.map +7 -0
  56. package/lib/esm/src/internal/config/defaultScreens.js +1 -1
  57. package/lib/esm/src/internal/config/defaultScreens.js.map +3 -3
  58. package/lib/esm/src/internal/core/ButtonController.js +1 -0
  59. package/lib/esm/src/internal/core/TouchController.js +1 -0
  60. package/lib/esm/src/internal/core/types.js +1 -0
  61. package/lib/esm/src/internal/core/types.js.map +4 -4
  62. package/lib/esm/src/internal/di.js +1 -1
  63. package/lib/esm/src/internal/di.js.map +3 -3
  64. package/lib/esm/src/internal/di.test.js +2 -0
  65. package/lib/esm/src/internal/di.test.js.map +7 -0
  66. package/lib/esm/src/internal/use-cases/buttonUseCases.js +2 -0
  67. package/lib/esm/src/internal/use-cases/buttonUseCases.js.map +7 -0
  68. package/lib/esm/src/internal/use-cases/buttonUseCases.test.js +2 -0
  69. package/lib/esm/src/internal/use-cases/buttonUseCases.test.js.map +7 -0
  70. package/lib/esm/src/internal/use-cases/touchUseCases.js +2 -0
  71. package/lib/esm/src/internal/use-cases/touchUseCases.js.map +7 -0
  72. package/lib/esm/src/internal/use-cases/touchUseCases.test.js +2 -0
  73. package/lib/esm/src/internal/use-cases/touchUseCases.test.js.map +7 -0
  74. package/lib/esm/src/internal/utils/axisClamp.js +1 -1
  75. package/lib/esm/src/internal/utils/axisClamp.js.map +3 -3
  76. package/lib/esm/src/internal/utils/axisClamp.test.js +2 -0
  77. package/lib/esm/src/internal/utils/axisClamp.test.js.map +7 -0
  78. package/lib/types/src/api/DeviceController.d.ts +13 -15
  79. package/lib/types/src/api/DeviceController.d.ts.map +1 -1
  80. package/lib/types/src/api/DeviceController.test.d.ts +2 -0
  81. package/lib/types/src/api/DeviceController.test.d.ts.map +1 -0
  82. package/lib/types/src/index.d.ts +0 -1
  83. package/lib/types/src/index.d.ts.map +1 -1
  84. package/lib/types/src/internal/adapters/DefaultButtonController.d.ts +9 -0
  85. package/lib/types/src/internal/adapters/DefaultButtonController.d.ts.map +1 -0
  86. package/lib/types/src/internal/adapters/DefaultButtonController.test.d.ts +2 -0
  87. package/lib/types/src/internal/adapters/DefaultButtonController.test.d.ts.map +1 -0
  88. package/lib/types/src/internal/adapters/DefaultTouchController.d.ts +15 -0
  89. package/lib/types/src/internal/adapters/DefaultTouchController.d.ts.map +1 -0
  90. package/lib/types/src/internal/adapters/DefaultTouchController.test.d.ts +2 -0
  91. package/lib/types/src/internal/adapters/DefaultTouchController.test.d.ts.map +1 -0
  92. package/lib/types/src/internal/config/defaultScreens.d.ts +4 -4
  93. package/lib/types/src/internal/config/defaultScreens.d.ts.map +1 -1
  94. package/lib/types/src/internal/core/{IButtonController.d.ts → ButtonController.d.ts} +2 -2
  95. package/lib/types/src/internal/core/ButtonController.d.ts.map +1 -0
  96. package/lib/types/src/internal/core/TouchController.d.ts +7 -0
  97. package/lib/types/src/internal/core/TouchController.d.ts.map +1 -0
  98. package/lib/types/src/internal/core/types.d.ts +8 -3
  99. package/lib/types/src/internal/core/types.d.ts.map +1 -1
  100. package/lib/types/src/internal/di.d.ts +7 -2
  101. package/lib/types/src/internal/di.d.ts.map +1 -1
  102. package/lib/types/src/internal/di.test.d.ts +2 -0
  103. package/lib/types/src/internal/di.test.d.ts.map +1 -0
  104. package/lib/types/src/internal/use-cases/buttonUseCases.d.ts +9 -0
  105. package/lib/types/src/internal/use-cases/buttonUseCases.d.ts.map +1 -0
  106. package/lib/types/src/internal/use-cases/buttonUseCases.test.d.ts +2 -0
  107. package/lib/types/src/internal/use-cases/buttonUseCases.test.d.ts.map +1 -0
  108. package/lib/types/src/internal/use-cases/touchUseCases.d.ts +5 -0
  109. package/lib/types/src/internal/use-cases/touchUseCases.d.ts.map +1 -0
  110. package/lib/types/src/internal/use-cases/touchUseCases.test.d.ts +2 -0
  111. package/lib/types/src/internal/use-cases/touchUseCases.test.d.ts.map +1 -0
  112. package/lib/types/src/internal/utils/axisClamp.d.ts +1 -2
  113. package/lib/types/src/internal/utils/axisClamp.d.ts.map +1 -1
  114. package/lib/types/src/internal/utils/axisClamp.test.d.ts +2 -0
  115. package/lib/types/src/internal/utils/axisClamp.test.d.ts.map +1 -0
  116. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  117. package/package.json +5 -8
  118. package/lib/cjs/src/internal/adapters/AxiosButtonController.js +0 -2
  119. package/lib/cjs/src/internal/adapters/AxiosButtonController.js.map +0 -7
  120. package/lib/cjs/src/internal/adapters/AxiosTouchController.js +0 -2
  121. package/lib/cjs/src/internal/adapters/AxiosTouchController.js.map +0 -7
  122. package/lib/cjs/src/internal/core/IButtonController.js.map +0 -7
  123. package/lib/cjs/src/internal/core/ITouchController.js +0 -2
  124. package/lib/cjs/src/internal/core/ITouchController.js.map +0 -7
  125. package/lib/cjs/src/internal/core/speculosDeviceControllerTypes.js +0 -2
  126. package/lib/cjs/src/internal/core/speculosDeviceControllerTypes.js.map +0 -7
  127. package/lib/cjs/src/internal/usecases/buttonUsecases.js +0 -2
  128. package/lib/cjs/src/internal/usecases/buttonUsecases.js.map +0 -7
  129. package/lib/cjs/src/internal/usecases/touchUsecases.js +0 -2
  130. package/lib/cjs/src/internal/usecases/touchUsecases.js.map +0 -7
  131. package/lib/esm/src/internal/adapters/AxiosButtonController.js +0 -2
  132. package/lib/esm/src/internal/adapters/AxiosButtonController.js.map +0 -7
  133. package/lib/esm/src/internal/adapters/AxiosTouchController.js +0 -2
  134. package/lib/esm/src/internal/adapters/AxiosTouchController.js.map +0 -7
  135. package/lib/esm/src/internal/core/IButtonController.js +0 -1
  136. package/lib/esm/src/internal/core/ITouchController.js +0 -1
  137. package/lib/esm/src/internal/core/speculosDeviceControllerTypes.js +0 -2
  138. package/lib/esm/src/internal/core/speculosDeviceControllerTypes.js.map +0 -7
  139. package/lib/esm/src/internal/usecases/buttonUsecases.js +0 -2
  140. package/lib/esm/src/internal/usecases/buttonUsecases.js.map +0 -7
  141. package/lib/esm/src/internal/usecases/touchUsecases.js +0 -2
  142. package/lib/esm/src/internal/usecases/touchUsecases.js.map +0 -7
  143. package/lib/types/src/internal/adapters/AxiosButtonController.d.ts +0 -10
  144. package/lib/types/src/internal/adapters/AxiosButtonController.d.ts.map +0 -1
  145. package/lib/types/src/internal/adapters/AxiosTouchController.d.ts +0 -14
  146. package/lib/types/src/internal/adapters/AxiosTouchController.d.ts.map +0 -1
  147. package/lib/types/src/internal/core/IButtonController.d.ts.map +0 -1
  148. package/lib/types/src/internal/core/ITouchController.d.ts +0 -7
  149. package/lib/types/src/internal/core/ITouchController.d.ts.map +0 -1
  150. package/lib/types/src/internal/core/speculosDeviceControllerTypes.d.ts +0 -7
  151. package/lib/types/src/internal/core/speculosDeviceControllerTypes.d.ts.map +0 -1
  152. package/lib/types/src/internal/usecases/buttonUsecases.d.ts +0 -9
  153. package/lib/types/src/internal/usecases/buttonUsecases.d.ts.map +0 -1
  154. package/lib/types/src/internal/usecases/touchUsecases.d.ts +0 -5
  155. package/lib/types/src/internal/usecases/touchUsecases.d.ts.map +0 -1
  156. /package/lib/esm/src/internal/core/{IButtonController.js.map → ButtonController.js.map} +0 -0
  157. /package/lib/esm/src/internal/core/{ITouchController.js.map → TouchController.js.map} +0 -0
package/README.md CHANGED
@@ -2,34 +2,36 @@
2
2
 
3
3
  A tiny TypeScript SDK for driving **Speculos** devices:
4
4
 
5
- - **Buttons**: `left`, `right`, `both`, and `pressSequence([...])`
6
- - **Touch**: **percentage-based** coordinates (e.g. `{ x: 20, y: 45 }` = 20%/45% of the screen)
7
- - **Flexible screens config**: use built-in `"flex"`/`"stax"` defaults or supply your own device keys
5
+ - **Buttons**: `press(...)`, `left`, `right`, `both`, and `pressSequence([...])`
6
+ - **Tap**: **percentage-based** `tapQuick(...)`, `tapLong(...)`
7
+ - **Flexible screens config**: use built-in `"flex"`/`"stax"` defaults or supply your own device screen size
8
8
 
9
9
  ---
10
10
 
11
11
  ## Quick start
12
12
 
13
- Out of the box, the API ships with default device screens ("flex" and "stax"). You can use them without passing any options.
13
+ Out of the box, the API ships with default device screens sizes ("flex" and "stax"). You can use them without passing any options.
14
14
 
15
15
  ```ts
16
- import { deviceControllerFactory } from "speculos-device-controller";
16
+ import { deviceControllerClientFactory } from "speculos-device-controller";
17
17
 
18
- const device = deviceControllerFactory("http://localhost:4000");
18
+ const deviceClient = deviceControllerClientFactory("http://localhost:4000");
19
19
 
20
20
  // Buttons
21
- await device.button.press("both");
22
- await device.button.left();
23
- await device.button.right();
24
- await device.button.both();
25
- await device.button.pressSequence(["left", "right", "both"], 150);
26
-
27
- // Touch: percentages (0..100)
28
- await device.touch.createTap("flex").tapQuick({ x: 20, y: 45 }); // 20% / 45% of the "flex" screen
29
-
30
- // Touch returns a factory function so you can easily instanciate devices dynamically
31
- const currentDevice = device.touch.createTap(currentDevice);
32
- await currentDevice.tapLong({ x: 20, y: 45 });
21
+ const deviceButtons = deviceClient.buttonFactory();
22
+
23
+ await deviceButtons.press("both");
24
+ await deviceButtons.left();
25
+ await deviceButtons.right();
26
+ await deviceButtons.both();
27
+ await deviceButtons.pressSequence(["left", "right", "both"], 150);
28
+
29
+ // Tap: percentages (0..100)
30
+ await deviceClient.tapFactory("flex").tapQuick({ x: 20, y: 45 }); // 20% / 45% of the "flex" screen
31
+
32
+ // You can easily instantiate tap devices dynamically
33
+ const currentDeviceTap = deviceClient.tapFactory(currentDevice);
34
+ await currentDeviceTap.tapLong({ x: 20, y: 45 });
33
35
  ```
34
36
 
35
37
  Under the hood, percentages are clamped to [0, 100] and converted to pixels using the screen spec for the selected device key.
@@ -37,7 +39,7 @@ Under the hood, percentages are clamped to [0, 100] and converted to pixels usin
37
39
  ### Override default sizes (keep "flex"/"stax" keys)
38
40
 
39
41
  ```ts
40
- const device = deviceControllerFactory("http://localhost:4000", {
42
+ const deviceClient = deviceControllerClientFactory("http://localhost:4000", {
41
43
  timeoutMs: 2000, // optional axios timeout
42
44
  clientHeader: "ldmk-transport-speculos", // optional header
43
45
  screens: {
@@ -51,38 +53,24 @@ const device = deviceControllerFactory("http://localhost:4000", {
51
53
  ### Provide custom screens
52
54
 
53
55
  ```ts
54
- const device = deviceControllerFactory("http://localhost:4000", {
56
+ const deviceClient = deviceControllerClientFactory("http://localhost:4000", {
55
57
  screens: {
56
58
  custom: { width: 128, height: 64 },
57
59
  },
58
60
  });
59
61
 
60
- await device.touch.createTap("custom").tapQuick({ x: 50, y: 50 }); // ok
61
- // await device.touch.createTap("unknown").tapQuick({ x: 10, y: 10 }); // throws: Unknown device key "unknown"
62
+ await deviceClient.tapFactory("custom").tapQuick({ x: 50, y: 50 }); // ok
63
+ // await deviceClient.tapFactory("unknown").tapQuick({ x: 10, y: 10 }); // throws: Unknown device key "unknown"
62
64
  ```
63
65
 
64
66
  ## API
65
67
 
66
- ### Factory
67
-
68
- ```ts
69
- deviceControllerFactory(
70
- baseURL: string,
71
- opts?: {
72
- timeoutMs?: number; // axios timeout (ms)
73
- clientHeader?: string; // "X-Ledger-Client-Version" header
74
- screens?: Record<string, { width: number; height: number }>;
75
- }
76
- ): DeviceAPI
77
- ```
78
-
79
- ### DeviceAPI
80
-
81
68
  ```ts
82
- type ButtonKey = "Ll" | "Rr" | "LRlr" | "left" | "right" | "both";
83
- type PercentPoint = { x: number; y: number }; // interpreted as 0..100, clamped
69
+ type ButtonKey = "left" | "right" | "both";
70
+ type Percent = Range<101>; // 0 to 100
71
+ type PercentCoordinates = { x: Percent; y: Percent };
84
72
 
85
- type ButtonAPI = {
73
+ type ButtonFactory = () => {
86
74
  press(key: ButtonKey): Promise<void>;
87
75
  left(): Promise<void>;
88
76
  right(): Promise<void>;
@@ -90,15 +78,22 @@ type ButtonAPI = {
90
78
  pressSequence(keys: ButtonKey[], delayMs?: number): Promise<void>;
91
79
  };
92
80
 
93
- type TouchAPI = {
94
- createTap: (deviceKey: string) => {
95
- tapQuick: (point: PercentPoint) => Promise<void>;
96
- tapLong: (point: PercentPoint) => Promise<void>;
97
- };
81
+ type TapFactory = (deviceKey: string) => {
82
+ tapQuick: (point: PercentCoordinates) => Promise<void>;
83
+ tapLong: (point: PercentCoordinates) => Promise<void>;
98
84
  };
99
85
 
100
- type DeviceAPI = {
101
- button: ButtonAPI;
102
- touch: TouchAPI;
86
+ type DeviceControllerClient = {
87
+ buttonFactory: ButtonFactory;
88
+ tapFactory: TapFactory;
103
89
  };
90
+
91
+ type DeviceControllerClientFactory = (
92
+ baseURL: string,
93
+ opts?: {
94
+ timeoutMs?: number; // axios timeout (ms)
95
+ clientHeader?: string; // "X-Ledger-Client-Version" header
96
+ screens?: DeviceScreens<string>;
97
+ },
98
+ ) => DeviceControllerClient;
104
99
  ```
@@ -35,11 +35,9 @@
35
35
  "test:coverage": "vitest run --coverage --passWithNoTests"
36
36
  },
37
37
  "dependencies": {
38
+ "@ledgerhq/device-management-kit": "workspace:*",
38
39
  "@sentry/minimal": "catalog:",
39
- "axios": "catalog:",
40
- "inversify": "catalog:",
41
- "purify-ts": "catalog:",
42
- "reflect-metadata": "catalog:"
40
+ "axios": "catalog:"
43
41
  },
44
42
  "devDependencies": {
45
43
  "@ledgerhq/eslint-config-dsdk": "workspace:*",
@@ -50,7 +48,6 @@
50
48
  "ts-node": "catalog:"
51
49
  },
52
50
  "peerDependencies": {
53
- "@ledgerhq/device-management-kit": "workspace:*",
54
- "rxjs": "catalog:"
51
+ "@ledgerhq/device-management-kit": "workspace:*"
55
52
  }
56
53
  }
@@ -1,2 +1,2 @@
1
- "use strict";var l=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var h=(t,e)=>{for(var r in e)l(t,r,{get:e[r],enumerable:!0})},d=(t,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of C(e))!g.call(t,o)&&o!==r&&l(t,o,{get:()=>e[o],enumerable:!(i=y(e,o))||i.enumerable});return t};var B=t=>d(l({},"__esModule",{value:!0}),t);var f={};h(f,{deviceControllerFactory:()=>I});module.exports=B(f);var a=require("../internal/config/defaultScreens"),s=require("../internal/usecases/buttonUsecases"),c=require("../internal/usecases/touchUsecases"),u=require("../../src/internal/core/speculosDeviceControllerTypes"),P=require("../../src/internal/di");function I(t,e={}){const r={screens:e.screens??a.DEFAULT_SCREENS,timeoutMs:e.timeoutMs,clientHeader:e.clientHeader},i=(0,P.buildContainer)(t,r),o=i.get(u.speculosDeviceControllerTypes.ButtonController),p=(0,s.pressButtons)(o),m=i.get(u.speculosDeviceControllerTypes.TouchController);return{button:{press:n=>o.press(n),left:()=>p.left(),right:()=>p.right(),both:()=>p.both(),pressSequence:(n,v)=>(0,s.pressSequence)(o,n,v)},touch:{createTap:n=>({tapQuick:(0,c.tapQuick)(m,n),tapLong:(0,c.tapLong)(m,n)})}}}0&&(module.exports={deviceControllerFactory});
1
+ "use strict";var l=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var d=(t,e)=>{for(var r in e)l(t,r,{get:e[r],enumerable:!0})},D=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of C(e))!v.call(t,o)&&o!==r&&l(t,o,{get:()=>e[o],enumerable:!(n=m(e,o))||n.enumerable});return t};var F=t=>D(l({},"__esModule",{value:!0}),t);var g={};d(g,{deviceControllerClientFactory:()=>f});module.exports=F(g);var a=require("../internal/config/defaultScreens"),u=require("../../src/internal/di"),s=require("../../src/internal/use-cases/buttonUseCases"),c=require("../../src/internal/use-cases/touchUseCases");const f=(t,e={})=>{const r={screens:e.screens??a.DEFAULT_SCREENS,timeoutMs:e.timeoutMs,clientHeader:e.clientHeader},{buttons:n,touch:o}=(0,u.createDefaultControllers)(t,r),p=(0,s.pressButtons)(n);return{buttonFactory:()=>({press:i=>n.press(i),left:()=>p.left(),right:()=>p.right(),both:()=>p.both(),pressSequence:(i,y)=>(0,s.pressSequence)(n,i,y)}),tapFactory:i=>({tapQuick:(0,c.tapQuick)(o,i),tapLong:(0,c.tapLong)(o,i)})}};0&&(module.exports={deviceControllerClientFactory});
2
2
  //# sourceMappingURL=DeviceController.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/DeviceController.ts"],
4
- "sourcesContent": ["import { DEFAULT_SCREENS } from \"@internal/config/defaultScreens\";\nimport type { IButtonController } from \"@internal/core/IButtonController\";\nimport type { ITouchController } from \"@internal/core/ITouchController\";\nimport type {\n ButtonKey,\n DeviceControllerOptions,\n DeviceScreens,\n PercentPoint,\n} from \"@internal/core/types\";\nimport { pressButtons, pressSequence } from \"@internal/usecases/buttonUsecases\";\nimport { tapLong, tapQuick } from \"@internal/usecases/touchUsecases\";\nimport { speculosDeviceControllerTypes } from \"@root/src/internal/core/speculosDeviceControllerTypes\";\nimport { buildContainer } from \"@root/src/internal/di\";\n\nexport type ButtonAPI = IButtonController & {\n left(): Promise<void>;\n right(): Promise<void>;\n both(): Promise<void>;\n pressSequence(keys: ButtonKey[], delayMs?: number): Promise<void>;\n};\n\nexport type TouchAPI = {\n createTap: (deviceKey: string) => {\n tapQuick: (point: PercentPoint) => Promise<void>;\n tapLong: (point: PercentPoint) => Promise<void>;\n };\n};\n\nexport type DeviceAPI = {\n button: ButtonAPI;\n touch: TouchAPI;\n};\n\ntype BaseOpts = {\n timeoutMs?: number;\n clientHeader?: string;\n screens?: DeviceScreens<string>;\n};\n\nexport function deviceControllerFactory(\n baseURL: string,\n opts: BaseOpts = {},\n): DeviceAPI {\n const resolved: DeviceControllerOptions<string> = {\n screens: opts.screens ?? DEFAULT_SCREENS,\n timeoutMs: opts.timeoutMs,\n clientHeader: opts.clientHeader,\n };\n\n const container = buildContainer<string>(baseURL, resolved);\n\n const buttons = container.get<IButtonController>(\n speculosDeviceControllerTypes.ButtonController,\n );\n const press = pressButtons(buttons);\n const touch = container.get<ITouchController<string>>(\n speculosDeviceControllerTypes.TouchController,\n );\n\n return {\n button: {\n press: (k) => buttons.press(k),\n left: () => press.left(),\n right: () => press.right(),\n both: () => press.both(),\n pressSequence: (keys, delayMs) => pressSequence(buttons, keys, delayMs),\n },\n touch: {\n createTap: (key) => ({\n tapQuick: tapQuick(touch, key),\n tapLong: tapLong(touch, key),\n }),\n },\n };\n}\n\nexport type { ButtonKey, DeviceControllerOptions, DeviceScreens, PercentPoint };\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,2CAShCC,EAA4C,6CAC5CC,EAAkC,4CAClCC,EAA8C,iEAC9CC,EAA+B,iCA2BxB,SAASN,EACdO,EACAC,EAAiB,CAAC,EACP,CACX,MAAMC,EAA4C,CAChD,QAASD,EAAK,SAAW,kBACzB,UAAWA,EAAK,UAChB,aAAcA,EAAK,YACrB,EAEME,KAAY,kBAAuBH,EAASE,CAAQ,EAEpDE,EAAUD,EAAU,IACxB,gCAA8B,gBAChC,EACME,KAAQ,gBAAaD,CAAO,EAC5BE,EAAQH,EAAU,IACtB,gCAA8B,eAChC,EAEA,MAAO,CACL,OAAQ,CACN,MAAQI,GAAMH,EAAQ,MAAMG,CAAC,EAC7B,KAAM,IAAMF,EAAM,KAAK,EACvB,MAAO,IAAMA,EAAM,MAAM,EACzB,KAAM,IAAMA,EAAM,KAAK,EACvB,cAAe,CAACG,EAAMC,OAAY,iBAAcL,EAASI,EAAMC,CAAO,CACxE,EACA,MAAO,CACL,UAAYC,IAAS,CACnB,YAAU,YAASJ,EAAOI,CAAG,EAC7B,WAAS,WAAQJ,EAAOI,CAAG,CAC7B,EACF,CACF,CACF",
6
- "names": ["DeviceController_exports", "__export", "deviceControllerFactory", "__toCommonJS", "import_defaultScreens", "import_buttonUsecases", "import_touchUsecases", "import_speculosDeviceControllerTypes", "import_di", "baseURL", "opts", "resolved", "container", "buttons", "press", "touch", "k", "keys", "delayMs", "key"]
4
+ "sourcesContent": ["import { DEFAULT_SCREENS } from \"@internal/config/defaultScreens\";\nimport type { ButtonController } from \"@internal/core/ButtonController\";\nimport type {\n ButtonKey,\n DeviceControllerOptions,\n DeviceScreens,\n PercentCoordinates,\n} from \"@internal/core/types\";\nimport { createDefaultControllers } from \"@root/src/internal/di\";\nimport {\n pressButtons,\n pressSequence,\n} from \"@root/src/internal/use-cases/buttonUseCases\";\nimport { tapLong, tapQuick } from \"@root/src/internal/use-cases/touchUseCases\";\n\nexport type ButtonFactory = () => ButtonController & {\n left(): Promise<void>;\n right(): Promise<void>;\n both(): Promise<void>;\n pressSequence(keys: ButtonKey[], delayMs?: number): Promise<void>;\n};\n\nexport type TapFactory = (deviceKey: string) => {\n tapQuick: (point: PercentCoordinates) => Promise<void>;\n tapLong: (point: PercentCoordinates) => Promise<void>;\n};\n\nexport type DeviceControllerClientFactory = (\n baseURL: string,\n opts?: {\n timeoutMs?: number;\n clientHeader?: string;\n screens?: DeviceScreens<string>;\n },\n) => DeviceControllerClient;\n\nexport type DeviceControllerClient = {\n buttonFactory: ButtonFactory;\n tapFactory: TapFactory;\n};\n\nexport const deviceControllerClientFactory: DeviceControllerClientFactory = (\n baseURL,\n opts = {},\n) => {\n const resolved: DeviceControllerOptions = {\n screens: opts.screens ?? DEFAULT_SCREENS,\n timeoutMs: opts.timeoutMs,\n clientHeader: opts.clientHeader,\n };\n\n const { buttons, touch } = createDefaultControllers(baseURL, resolved);\n const press = pressButtons(buttons);\n\n return {\n buttonFactory: () => ({\n press: (key) => buttons.press(key),\n left: () => press.left(),\n right: () => press.right(),\n both: () => press.both(),\n pressSequence: (keys, delayMs) => pressSequence(buttons, keys, delayMs),\n }),\n tapFactory: (key) => ({\n tapQuick: tapQuick(touch, key),\n tapLong: tapLong(touch, key),\n }),\n };\n};\n\nexport type {\n ButtonKey,\n DeviceControllerOptions,\n DeviceScreens,\n PercentCoordinates,\n};\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,2CAQhCC,EAAyC,iCACzCC,EAGO,uDACPC,EAAkC,sDA4B3B,MAAML,EAA+D,CAC1EM,EACAC,EAAO,CAAC,IACL,CACH,MAAMC,EAAoC,CACxC,QAASD,EAAK,SAAW,kBACzB,UAAWA,EAAK,UAChB,aAAcA,EAAK,YACrB,EAEM,CAAE,QAAAE,EAAS,MAAAC,CAAM,KAAI,4BAAyBJ,EAASE,CAAQ,EAC/DG,KAAQ,gBAAaF,CAAO,EAElC,MAAO,CACL,cAAe,KAAO,CACpB,MAAQG,GAAQH,EAAQ,MAAMG,CAAG,EACjC,KAAM,IAAMD,EAAM,KAAK,EACvB,MAAO,IAAMA,EAAM,MAAM,EACzB,KAAM,IAAMA,EAAM,KAAK,EACvB,cAAe,CAACE,EAAMC,OAAY,iBAAcL,EAASI,EAAMC,CAAO,CACxE,GACA,WAAaF,IAAS,CACpB,YAAU,YAASF,EAAOE,CAAG,EAC7B,WAAS,WAAQF,EAAOE,CAAG,CAC7B,EACF,CACF",
6
+ "names": ["DeviceController_exports", "__export", "deviceControllerClientFactory", "__toCommonJS", "import_defaultScreens", "import_di", "import_buttonUseCases", "import_touchUseCases", "baseURL", "opts", "resolved", "buttons", "touch", "press", "key", "keys", "delayMs"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var o=require("./DeviceController");describe("deviceControllerClientFactory",()=>{it("returns a DeviceControllerdeviceClient with the expected shape",()=>{const e=(0,o.deviceControllerClientFactory)("http://localhost:0");expect(e).toBeDefined(),expect(e).toHaveProperty("buttonFactory"),expect(e).toHaveProperty("tapFactory");const t=e.buttonFactory();expect(typeof t.press).toBe("function"),expect(typeof t.left).toBe("function"),expect(typeof t.right).toBe("function"),expect(typeof t.both).toBe("function"),expect(typeof t.pressSequence).toBe("function");const c=e.tapFactory("flex");expect(typeof c.tapQuick).toBe("function"),expect(typeof c.tapLong).toBe("function")}),it("does not throw when created with custom options",()=>{const t=(0,o.deviceControllerClientFactory)("http://127.0.0.1:0",{clientHeader:"test-suite",timeoutMs:200,screens:{custom:{width:128,height:64},stax:{width:400,height:672}}});expect(t).toBeTruthy()}),it("creates independent instances (no accidental shared state)",()=>{const e=(0,o.deviceControllerClientFactory)("http://localhost:0"),t=(0,o.deviceControllerClientFactory)("http://localhost:0");expect(e).not.toBe(t),expect(e.buttonFactory().press).not.toBe(t.buttonFactory().press),expect(e.tapFactory("flex").tapQuick).not.toBe(t.tapFactory("flex").tapQuick)})});
2
+ //# sourceMappingURL=DeviceController.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/api/DeviceController.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\nimport type { DeviceScreens } from \"@internal/core/types\";\n\nimport { deviceControllerClientFactory } from \"./DeviceController\";\n\ndescribe(\"deviceControllerClientFactory\", () => {\n it(\"returns a DeviceControllerdeviceClient with the expected shape\", () => {\n const deviceClient = deviceControllerClientFactory(\"http://localhost:0\");\n\n expect(deviceClient).toBeDefined();\n expect(deviceClient).toHaveProperty(\"buttonFactory\");\n expect(deviceClient).toHaveProperty(\"tapFactory\");\n\n const deviceButtons = deviceClient.buttonFactory();\n\n // button surfaces\n expect(typeof deviceButtons.press).toBe(\"function\");\n expect(typeof deviceButtons.left).toBe(\"function\");\n expect(typeof deviceButtons.right).toBe(\"function\");\n expect(typeof deviceButtons.both).toBe(\"function\");\n expect(typeof deviceButtons.pressSequence).toBe(\"function\");\n\n const deviceTaps = deviceClient.tapFactory(\"flex\");\n\n // tap surfaces\n expect(typeof deviceTaps.tapQuick).toBe(\"function\");\n expect(typeof deviceTaps.tapLong).toBe(\"function\");\n });\n\n it(\"does not throw when created with custom options\", () => {\n const screens: DeviceScreens<string> = {\n custom: { width: 128, height: 64 },\n stax: { width: 400, height: 672 },\n };\n const deviceClient = deviceControllerClientFactory(\"http://127.0.0.1:0\", {\n clientHeader: \"test-suite\",\n timeoutMs: 200,\n screens,\n });\n expect(deviceClient).toBeTruthy();\n });\n\n it(\"creates independent instances (no accidental shared state)\", () => {\n const a = deviceControllerClientFactory(\"http://localhost:0\");\n const b = deviceControllerClientFactory(\"http://localhost:0\");\n\n expect(a).not.toBe(b);\n expect(a.buttonFactory().press).not.toBe(b.buttonFactory().press);\n expect(a.tapFactory(\"flex\").tapQuick).not.toBe(\n b.tapFactory(\"flex\").tapQuick,\n );\n });\n});\n"],
5
+ "mappings": "aAIA,IAAAA,EAA8C,8BAE9C,SAAS,gCAAiC,IAAM,CAC9C,GAAG,iEAAkE,IAAM,CACzE,MAAMC,KAAe,iCAA8B,oBAAoB,EAEvE,OAAOA,CAAY,EAAE,YAAY,EACjC,OAAOA,CAAY,EAAE,eAAe,eAAe,EACnD,OAAOA,CAAY,EAAE,eAAe,YAAY,EAEhD,MAAMC,EAAgBD,EAAa,cAAc,EAGjD,OAAO,OAAOC,EAAc,KAAK,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAc,IAAI,EAAE,KAAK,UAAU,EACjD,OAAO,OAAOA,EAAc,KAAK,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAc,IAAI,EAAE,KAAK,UAAU,EACjD,OAAO,OAAOA,EAAc,aAAa,EAAE,KAAK,UAAU,EAE1D,MAAMC,EAAaF,EAAa,WAAW,MAAM,EAGjD,OAAO,OAAOE,EAAW,QAAQ,EAAE,KAAK,UAAU,EAClD,OAAO,OAAOA,EAAW,OAAO,EAAE,KAAK,UAAU,CACnD,CAAC,EAED,GAAG,kDAAmD,IAAM,CAK1D,MAAMF,KAAe,iCAA8B,qBAAsB,CACvE,aAAc,aACd,UAAW,IACX,QAPqC,CACrC,OAAQ,CAAE,MAAO,IAAK,OAAQ,EAAG,EACjC,KAAM,CAAE,MAAO,IAAK,OAAQ,GAAI,CAClC,CAKA,CAAC,EACD,OAAOA,CAAY,EAAE,WAAW,CAClC,CAAC,EAED,GAAG,6DAA8D,IAAM,CACrE,MAAMG,KAAI,iCAA8B,oBAAoB,EACtDC,KAAI,iCAA8B,oBAAoB,EAE5D,OAAOD,CAAC,EAAE,IAAI,KAAKC,CAAC,EACpB,OAAOD,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,KAAKC,EAAE,cAAc,EAAE,KAAK,EAChE,OAAOD,EAAE,WAAW,MAAM,EAAE,QAAQ,EAAE,IAAI,KACxCC,EAAE,WAAW,MAAM,EAAE,QACvB,CACF,CAAC,CACH,CAAC",
6
+ "names": ["import_DeviceController", "deviceClient", "deviceButtons", "deviceTaps", "a", "b"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var x=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var f=(r,o,t,i)=>{if(o&&typeof o=="object"||typeof o=="function")for(let m of b(o))!c.call(r,m)&&m!==t&&x(r,m,{get:()=>o[m],enumerable:!(i=a(o,m))||i.enumerable});return r},e=(r,o,t)=>(f(r,o,"default"),t&&f(t,o,"default"));var d=r=>f(x({},"__esModule",{value:!0}),r);var p={};module.exports=d(p);var h=require("reflect-metadata");e(p,require("./api/DeviceController"),module.exports);0&&(module.exports={...require("./api/DeviceController")});
1
+ "use strict";var a=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var p=(r,o,f,x)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of c(o))!d.call(r,e)&&e!==f&&a(r,e,{get:()=>o[e],enumerable:!(x=b(o,e))||x.enumerable});return r},t=(r,o,f)=>(p(r,o,"default"),f&&p(f,o,"default"));var g=r=>p(a({},"__esModule",{value:!0}),r);var m={};module.exports=g(m);t(m,require("./api/DeviceController"),module.exports);0&&(module.exports={...require("./api/DeviceController")});
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/index.ts"],
4
- "sourcesContent": ["import \"reflect-metadata\";\n\nexport * from \"./api/DeviceController\";\n"],
5
- "mappings": "iaAAA,IAAAA,EAAA,kBAAAC,EAAAD,GAAA,IAAAE,EAAO,4BAEPC,EAAAH,EAAc,kCAFd",
6
- "names": ["src_exports", "__toCommonJS", "import_reflect_metadata", "__reExport"]
4
+ "sourcesContent": ["export * from \"./api/DeviceController\";\n"],
5
+ "mappings": "iaAAA,IAAAA,EAAA,kBAAAC,EAAAD,GAAAE,EAAAF,EAAc,kCAAd",
6
+ "names": ["src_exports", "__toCommonJS", "__reExport"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var p=(o,t)=>{for(var e in t)r(o,e,{get:t[e],enumerable:!0})},u=(o,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of a(t))!c.call(o,n)&&n!==e&&r(o,n,{get:()=>t[n],enumerable:!(i=l(t,n))||i.enumerable});return o};var m=o=>u(r({},"__esModule",{value:!0}),o);var B={};p(B,{DefaultButtonController:()=>y});module.exports=m(B);var s=require("../core/types");class y{constructor(t){this.client=t}async press(t){await this.client.post(`/button/${t}`,{action:s.SpeculosActions.PRESS_AND_RELEASE})}}0&&(module.exports={DefaultButtonController});
2
+ //# sourceMappingURL=DefaultButtonController.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/adapters/DefaultButtonController.ts"],
4
+ "sourcesContent": ["import type { AxiosInstance } from \"axios\";\n\nimport type { ButtonController } from \"@internal/core/ButtonController\";\nimport { type ButtonKey, SpeculosActions } from \"@internal/core/types\";\n\nexport class DefaultButtonController implements ButtonController {\n constructor(private readonly client: AxiosInstance) {}\n\n async press(key: ButtonKey): Promise<void> {\n await this.client.post(`/button/${key}`, {\n action: SpeculosActions.PRESS_AND_RELEASE,\n });\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAGA,IAAAI,EAAgD,gCAEzC,MAAMF,CAAoD,CAC/D,YAA6BG,EAAuB,CAAvB,YAAAA,CAAwB,CAErD,MAAM,MAAMC,EAA+B,CACzC,MAAM,KAAK,OAAO,KAAK,WAAWA,CAAG,GAAI,CACvC,OAAQ,kBAAgB,iBAC1B,CAAC,CACH,CACF",
6
+ "names": ["DefaultButtonController_exports", "__export", "DefaultButtonController", "__toCommonJS", "import_types", "client", "key"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var n=require("./DefaultButtonController");describe("DefaultButtonController",()=>{let e,s,o;beforeEach(()=>{e=vi.fn().mockResolvedValue({status:200,data:{}}),s={post:e},o=new n.DefaultButtonController(s)});const a=["left","right","both"];it.each(a)("press(%s) posts expected payload",async t=>{await o.press(t),expect(e).toHaveBeenCalledTimes(1),expect(e).toHaveBeenCalledWith(`/button/${t}`,{action:"press-and-release"})}),it("propagates HTTP errors",async()=>{const t=new Error("oups");e.mockRejectedValueOnce(t),await expect(o.press("left")).rejects.toBe(t)})});
2
+ //# sourceMappingURL=DefaultButtonController.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/adapters/DefaultButtonController.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport type { AxiosInstance } from \"axios\";\n\nimport type { ButtonKey } from \"@internal/core/types\";\n\nimport { DefaultButtonController } from \"./DefaultButtonController\";\n\ndescribe(\"DefaultButtonController\", () => {\n let postMock: ReturnType<typeof vi.fn>;\n let axiosFake: AxiosInstance;\n let controller: DefaultButtonController;\n\n beforeEach(() => {\n postMock = vi.fn().mockResolvedValue({ status: 200, data: {} });\n axiosFake = { post: postMock } as unknown as AxiosInstance;\n controller = new DefaultButtonController(axiosFake);\n });\n\n const keys: ButtonKey[] = [\"left\", \"right\", \"both\"];\n\n it.each<ButtonKey>(keys)(\n \"press(%s) posts expected payload\",\n async (key: ButtonKey) => {\n await controller.press(key);\n\n expect(postMock).toHaveBeenCalledTimes(1);\n expect(postMock).toHaveBeenCalledWith(`/button/${key}`, {\n action: \"press-and-release\",\n });\n },\n );\n\n it(\"propagates HTTP errors\", async () => {\n const error = new Error(\"oups\");\n postMock.mockRejectedValueOnce(error);\n\n await expect(controller.press(\"left\" as ButtonKey)).rejects.toBe(error);\n });\n});\n"],
5
+ "mappings": "aAOA,IAAAA,EAAwC,qCAExC,SAAS,0BAA2B,IAAM,CACxC,IAAIC,EACAC,EACAC,EAEJ,WAAW,IAAM,CACfF,EAAW,GAAG,GAAG,EAAE,kBAAkB,CAAE,OAAQ,IAAK,KAAM,CAAC,CAAE,CAAC,EAC9DC,EAAY,CAAE,KAAMD,CAAS,EAC7BE,EAAa,IAAI,0BAAwBD,CAAS,CACpD,CAAC,EAED,MAAME,EAAoB,CAAC,OAAQ,QAAS,MAAM,EAElD,GAAG,KAAgBA,CAAI,EACrB,mCACA,MAAOC,GAAmB,CACxB,MAAMF,EAAW,MAAME,CAAG,EAE1B,OAAOJ,CAAQ,EAAE,sBAAsB,CAAC,EACxC,OAAOA,CAAQ,EAAE,qBAAqB,WAAWI,CAAG,GAAI,CACtD,OAAQ,mBACV,CAAC,CACH,CACF,EAEA,GAAG,yBAA0B,SAAY,CACvC,MAAMC,EAAQ,IAAI,MAAM,MAAM,EAC9BL,EAAS,sBAAsBK,CAAK,EAEpC,MAAM,OAAOH,EAAW,MAAM,MAAmB,CAAC,EAAE,QAAQ,KAAKG,CAAK,CACxE,CAAC,CACH,CAAC",
6
+ "names": ["import_DefaultButtonController", "postMock", "axiosFake", "controller", "keys", "key", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var p=(s,t)=>{for(var e in t)r(s,e,{get:t[e],enumerable:!0})},h=(s,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of c(t))!l.call(s,n)&&n!==e&&r(s,n,{get:()=>t[n],enumerable:!(o=a(t,n))||o.enumerable});return s};var m=s=>h(r({},"__esModule",{value:!0}),s);var u={};p(u,{DefaultTouchController:()=>d});module.exports=m(u);var i=require("../core/types");class d{constructor(t,e){this.client=t;this.axes=e}assertPercentPoint({x:t,y:e}){const o=n=>Number.isFinite(n)&&n>=0&&n<=100;if(!o(t)||!o(e))throw new Error(`[Touch] percent values must be within 0\u2013100. Received x=${t}, y=${e}`)}toAbs(t,e){const o=this.axes[t];if(!o){const n=Object.keys(this.axes);throw new Error(`[Touch] Unknown device key "${String(t)}". Known keys: ${n.join(", ")||"<none>"}`)}return this.assertPercentPoint(e),o.xy(e.x,e.y)}async tapAndRelease(t,e){const o=this.toAbs(t,e);await this.client.post("/finger",{action:i.SpeculosActions.PRESS_AND_RELEASE,...o})}async tap(t,e){const o=this.toAbs(t,e);await this.client.post("/finger",{action:i.SpeculosActions.PRESS,...o})}async release(t,e){const o=this.toAbs(t,e);await this.client.post("/finger",{action:i.SpeculosActions.RELEASE,...o})}}0&&(module.exports={DefaultTouchController});
2
+ //# sourceMappingURL=DefaultTouchController.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/adapters/DefaultTouchController.ts"],
4
+ "sourcesContent": ["import type { AxiosInstance } from \"axios\";\n\nimport { type PercentCoordinates, SpeculosActions } from \"@internal/core/types\";\nimport type { AxisMap } from \"@internal/utils/axisClamp\";\nimport type { TouchController } from \"@root/src/internal/core/TouchController\";\n\nexport class DefaultTouchController<K extends string>\n implements TouchController<K>\n{\n constructor(\n private readonly client: AxiosInstance,\n private readonly axes: AxisMap<K>,\n ) {}\n\n private assertPercentPoint({ x, y }: PercentCoordinates): void {\n const inRange = (v: number) => Number.isFinite(v) && v >= 0 && v <= 100;\n if (!inRange(x) || !inRange(y)) {\n throw new Error(\n `[Touch] percent values must be within 0\u2013100. Received x=${x}, y=${y}`,\n );\n }\n }\n\n private toAbs(deviceKey: K, p: PercentCoordinates) {\n const axis = this.axes[deviceKey];\n if (!axis) {\n const known = Object.keys(this.axes as Record<string, unknown>);\n throw new Error(\n `[Touch] Unknown device key \"${String(deviceKey)}\". Known keys: ${known.join(\", \") || \"<none>\"}`,\n );\n }\n this.assertPercentPoint(p);\n return axis.xy(p.x, p.y);\n }\n\n async tapAndRelease(deviceKey: K, point: PercentCoordinates): Promise<void> {\n const abs = this.toAbs(deviceKey, point);\n await this.client.post(`/finger`, {\n action: SpeculosActions.PRESS_AND_RELEASE,\n ...abs,\n });\n }\n\n async tap(deviceKey: K, point: PercentCoordinates): Promise<void> {\n const abs = this.toAbs(deviceKey, point);\n await this.client.post(`/finger`, {\n action: SpeculosActions.PRESS,\n ...abs,\n });\n }\n\n async release(deviceKey: K, point: PercentCoordinates): Promise<void> {\n const abs = this.toAbs(deviceKey, point);\n await this.client.post(`/finger`, {\n action: SpeculosActions.RELEASE,\n ...abs,\n });\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAEA,IAAAI,EAAyD,gCAIlD,MAAMF,CAEb,CACE,YACmBG,EACAC,EACjB,CAFiB,YAAAD,EACA,UAAAC,CAChB,CAEK,mBAAmB,CAAE,EAAAC,EAAG,EAAAC,CAAE,EAA6B,CAC7D,MAAMC,EAAWC,GAAc,OAAO,SAASA,CAAC,GAAKA,GAAK,GAAKA,GAAK,IACpE,GAAI,CAACD,EAAQF,CAAC,GAAK,CAACE,EAAQD,CAAC,EAC3B,MAAM,IAAI,MACR,gEAA2DD,CAAC,OAAOC,CAAC,EACtE,CAEJ,CAEQ,MAAMG,EAAcC,EAAuB,CACjD,MAAMC,EAAO,KAAK,KAAKF,CAAS,EAChC,GAAI,CAACE,EAAM,CACT,MAAMC,EAAQ,OAAO,KAAK,KAAK,IAA+B,EAC9D,MAAM,IAAI,MACR,+BAA+B,OAAOH,CAAS,CAAC,kBAAkBG,EAAM,KAAK,IAAI,GAAK,QAAQ,EAChG,CACF,CACA,YAAK,mBAAmBF,CAAC,EAClBC,EAAK,GAAGD,EAAE,EAAGA,EAAE,CAAC,CACzB,CAEA,MAAM,cAAcD,EAAcI,EAA0C,CAC1E,MAAMC,EAAM,KAAK,MAAML,EAAWI,CAAK,EACvC,MAAM,KAAK,OAAO,KAAK,UAAW,CAChC,OAAQ,kBAAgB,kBACxB,GAAGC,CACL,CAAC,CACH,CAEA,MAAM,IAAIL,EAAcI,EAA0C,CAChE,MAAMC,EAAM,KAAK,MAAML,EAAWI,CAAK,EACvC,MAAM,KAAK,OAAO,KAAK,UAAW,CAChC,OAAQ,kBAAgB,MACxB,GAAGC,CACL,CAAC,CACH,CAEA,MAAM,QAAQL,EAAcI,EAA0C,CACpE,MAAMC,EAAM,KAAK,MAAML,EAAWI,CAAK,EACvC,MAAM,KAAK,OAAO,KAAK,UAAW,CAChC,OAAQ,kBAAgB,QACxB,GAAGC,CACL,CAAC,CACH,CACF",
6
+ "names": ["DefaultTouchController_exports", "__export", "DefaultTouchController", "__toCommonJS", "import_types", "client", "axes", "x", "y", "inRange", "v", "deviceKey", "p", "axis", "known", "point", "abs"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var l=require("./DefaultTouchController");describe("DefaultTouchController",()=>{let e,s;const o={xy:vi.fn((n,i)=>({x:Math.round(n*10),y:Math.round(i*20)}))},r={xy:vi.fn((n,i)=>({x:Math.round(100+n),y:Math.round(200+i)}))};let c,a;beforeEach(()=>{e=vi.fn().mockResolvedValue({status:200,data:{}}),s={post:e},o.xy.mockClear(),r.xy.mockClear(),c={devA:o,devB:r},a=new l.DefaultTouchController(s,c)});const t={x:12,y:45};it("tapAndRelease: converts percent to absolute via axes and POSTs expected body",async()=>{await a.tapAndRelease("devA",t),expect(o.xy).toHaveBeenCalledTimes(1),expect(o.xy).toHaveBeenCalledWith(t.x,t.y);const n=o.xy.mock.results[0].value;expect(e).toHaveBeenCalledTimes(1),expect(e).toHaveBeenCalledWith("/finger",{action:"press-and-release",...n})}),it("tap: converts via axes and POSTs action 'press'",async()=>{await a.tap("devB",t),expect(r.xy).toHaveBeenCalledWith(t.x,t.y);const n=r.xy.mock.results[0]?.value;expect(e).toHaveBeenCalledWith("/finger",{action:"press",...n})}),it("release: converts via axes and POSTs action 'release'",async()=>{await a.release("devA",t);const n=o.xy.mock.results[0].value;expect(e).toHaveBeenCalledWith("/finger",{action:"release",...n})}),it("throws an error when device key is unknown",async()=>{await expect(a.tap("unknownDevice",t)).rejects.toThrow(/\[Touch] Unknown device key "unknownDevice".*Known keys: devA, devB/),expect(e).not.toHaveBeenCalled()}),it("propagates HTTP errors from axios client",async()=>{const n=new Error("backend down");e.mockRejectedValueOnce(n),await expect(a.tapAndRelease("devA",t)).rejects.toBe(n)})});describe("percent validation",()=>{let e,s,o;const r={xy:vi.fn((a,t)=>({x:a,y:t}))},c={devA:r};beforeEach(()=>{s=vi.fn().mockResolvedValue({status:200,data:{}}),o={post:s},r.xy.mockClear(),e=new l.DefaultTouchController(o,c)}),it("accepts boundary values 0 and 100",async()=>{await e.tapAndRelease("devA",{x:0,y:100}),await e.tap("devA",{x:100,y:0}),await e.release("devA",{x:50,y:99}),expect(s).toHaveBeenCalledTimes(3)}),it("rejects values outside [0, 100], non-finite, negative and non-integer",async()=>{const a=[{x:140,y:50},{x:-1,y:50},{x:50,y:120},{x:50,y:-.01}];for(const t of a)await expect(e.tapAndRelease("devA",t)).rejects.toThrow();expect(s).not.toHaveBeenCalled()}),it("rejects NaN or non-finite values",async()=>{const a=[{x:Number.NaN,y:50},{x:50,y:Number.NaN},{x:Number.POSITIVE_INFINITY,y:10},{x:10,y:Number.NEGATIVE_INFINITY}];for(const t of a)await expect(e.tap("devA",t)).rejects.toThrow(/percent/i);expect(s).not.toHaveBeenCalled()})});
2
+ //# sourceMappingURL=DefaultTouchController.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/adapters/DefaultTouchController.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport type { AxiosInstance } from \"axios\";\n\nimport type { PercentCoordinates } from \"../core/types\";\nimport { DefaultTouchController } from \"./DefaultTouchController\";\n\ndescribe(\"DefaultTouchController\", () => {\n let postMock: ReturnType<typeof vi.fn>;\n let axiosFake: AxiosInstance;\n\n const axisA = {\n xy: vi.fn((xPct: number, yPct: number) => ({\n x: Math.round(xPct * 10),\n y: Math.round(yPct * 20),\n })),\n };\n const axisB = {\n xy: vi.fn((xPct: number, yPct: number) => ({\n x: Math.round(100 + xPct),\n y: Math.round(200 + yPct),\n })),\n };\n let axesFake: Record<\n string,\n { xy: (x: number, y: number) => { x: number; y: number } }\n >;\n\n let controller: DefaultTouchController<string>;\n\n beforeEach(() => {\n postMock = vi.fn().mockResolvedValue({ status: 200, data: {} });\n axiosFake = { post: postMock } as unknown as AxiosInstance;\n\n axisA.xy.mockClear();\n axisB.xy.mockClear();\n\n axesFake = { devA: axisA, devB: axisB };\n controller = new DefaultTouchController(axiosFake, axesFake as any);\n });\n\n const point: PercentCoordinates = { x: 12, y: 45 };\n\n it(\"tapAndRelease: converts percent to absolute via axes and POSTs expected body\", async () => {\n await controller.tapAndRelease(\"devA\", point);\n\n expect(axisA.xy).toHaveBeenCalledTimes(1);\n expect(axisA.xy).toHaveBeenCalledWith(point.x, point.y);\n\n const expectedAbs = (axisA.xy.mock.results as any)[0].value;\n expect(postMock).toHaveBeenCalledTimes(1);\n expect(postMock).toHaveBeenCalledWith(\"/finger\", {\n action: \"press-and-release\",\n ...expectedAbs,\n });\n });\n\n it(\"tap: converts via axes and POSTs action 'press'\", async () => {\n await controller.tap(\"devB\", point);\n\n expect(axisB.xy).toHaveBeenCalledWith(point.x, point.y);\n const expectedAbs = axisB.xy.mock.results[0]?.value;\n\n expect(postMock).toHaveBeenCalledWith(\"/finger\", {\n action: \"press\",\n ...expectedAbs,\n });\n });\n\n it(\"release: converts via axes and POSTs action 'release'\", async () => {\n await controller.release(\"devA\", point);\n\n const expectedAbs = axisA.xy.mock.results[0]!.value;\n expect(postMock).toHaveBeenCalledWith(\"/finger\", {\n action: \"release\",\n ...expectedAbs,\n });\n });\n\n it(\"throws an error when device key is unknown\", async () => {\n await expect(controller.tap(\"unknownDevice\" as any, point)).rejects.toThrow(\n /\\[Touch] Unknown device key \"unknownDevice\".*Known keys: devA, devB/,\n );\n expect(postMock).not.toHaveBeenCalled();\n });\n\n it(\"propagates HTTP errors from axios client\", async () => {\n const boom = new Error(\"backend down\");\n postMock.mockRejectedValueOnce(boom);\n\n await expect(controller.tapAndRelease(\"devA\", point)).rejects.toBe(boom);\n });\n});\n\ndescribe(\"percent validation\", () => {\n let controller: DefaultTouchController<string>;\n let postMock: ReturnType<typeof vi.fn>;\n let axiosFake: AxiosInstance;\n\n const axis = {\n xy: vi.fn((xPct: number, yPct: number) => ({ x: xPct, y: yPct })),\n };\n const axesFake = { devA: axis };\n\n beforeEach(() => {\n postMock = vi.fn().mockResolvedValue({ status: 200, data: {} });\n axiosFake = { post: postMock } as unknown as AxiosInstance;\n axis.xy.mockClear();\n controller = new DefaultTouchController(axiosFake, axesFake as any);\n });\n\n it(\"accepts boundary values 0 and 100\", async () => {\n await controller.tapAndRelease(\"devA\", { x: 0, y: 100 });\n await controller.tap(\"devA\", { x: 100, y: 0 });\n await controller.release(\"devA\", { x: 50, y: 99 });\n\n // should have sent 3 HTTP calls if all accepted\n expect(postMock).toHaveBeenCalledTimes(3);\n });\n\n it(\"rejects values outside [0, 100], non-finite, negative and non-integer\", async () => {\n const badPoints = [\n { x: 140, y: 50 },\n { x: -1, y: 50 },\n { x: 50, y: 120 },\n { x: 50, y: -0.01 },\n ];\n\n for (const p of badPoints) {\n await expect(\n controller.tapAndRelease(\"devA\", p as any),\n ).rejects.toThrow();\n }\n\n // no HTTP calls should be made for invalid input\n expect(postMock).not.toHaveBeenCalled();\n });\n\n it(\"rejects NaN or non-finite values\", async () => {\n const badPoints = [\n { x: Number.NaN, y: 50 },\n { x: 50, y: Number.NaN },\n { x: Number.POSITIVE_INFINITY, y: 10 },\n { x: 10, y: Number.NEGATIVE_INFINITY },\n ];\n\n for (const p of badPoints) {\n await expect(controller.tap(\"devA\", p as any)).rejects.toThrow(\n /percent/i,\n );\n }\n expect(postMock).not.toHaveBeenCalled();\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_DefaultTouchController", "postMock", "axiosFake", "axisA", "xPct", "yPct", "axisB", "axesFake", "controller", "point", "expectedAbs", "boom", "axis", "badPoints", "p"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var o=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var x=(e,t)=>{for(var i in t)o(e,i,{get:t[i],enumerable:!0})},y=(e,t,i,E)=>{if(t&&typeof t=="object"||typeof t=="function")for(let h of f(t))!p.call(e,h)&&h!==i&&o(e,h,{get:()=>t[h],enumerable:!(E=s(t,h))||E.enumerable});return e};var D=e=>y(o({},"__esModule",{value:!0}),e);var a={};x(a,{DEFAULT_SCREENS:()=>S});module.exports=D(a);const S={flex:{width:240,height:240},stax:{width:340,height:340}};0&&(module.exports={DEFAULT_SCREENS});
1
+ "use strict";var E=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var c=(t,e)=>{for(var i in e)E(t,i,{get:e[i],enumerable:!0})},d=(t,e,i,p)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of D(e))!S.call(t,o)&&o!==i&&E(t,o,{get:()=>e[o],enumerable:!(p=r(e,o))||p.enumerable});return t};var f=t=>d(E({},"__esModule",{value:!0}),t);var y={};c(y,{DEFAULT_SCREENS:()=>s});module.exports=f(y);var h=require("@ledgerhq/device-management-kit");const s={[h.DeviceModelId.FLEX]:{width:480,height:600},[h.DeviceModelId.STAX]:{width:400,height:672}};0&&(module.exports={DEFAULT_SCREENS});
2
2
  //# sourceMappingURL=defaultScreens.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/config/defaultScreens.ts"],
4
- "sourcesContent": ["export const DEFAULT_SCREENS = {\n flex: { width: 240, height: 240 },\n stax: { width: 340, height: 340 },\n} as const;\n\nexport type DefaultDeviceKey = keyof typeof DEFAULT_SCREENS & string;\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAkB,CAC7B,KAAM,CAAE,MAAO,IAAK,OAAQ,GAAI,EAChC,KAAM,CAAE,MAAO,IAAK,OAAQ,GAAI,CAClC",
6
- "names": ["defaultScreens_exports", "__export", "DEFAULT_SCREENS", "__toCommonJS"]
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\n\nexport const DEFAULT_SCREENS = {\n [DeviceModelId.FLEX]: { width: 480, height: 600 },\n [DeviceModelId.STAX]: { width: 400, height: 672 },\n} as const;\n\nexport type DefaultDeviceKey = keyof typeof DEFAULT_SCREENS & string;\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,2CAEvB,MAAMF,EAAkB,CAC7B,CAAC,gBAAc,IAAI,EAAG,CAAE,MAAO,IAAK,OAAQ,GAAI,EAChD,CAAC,gBAAc,IAAI,EAAG,CAAE,MAAO,IAAK,OAAQ,GAAI,CAClD",
6
+ "names": ["defaultScreens_exports", "__export", "DEFAULT_SCREENS", "__toCommonJS", "import_device_management_kit"]
7
7
  }
@@ -1,2 +1,2 @@
1
1
  "use strict";var n=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var m=(e,t,p,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of i(t))!s.call(e,o)&&o!==p&&n(e,o,{get:()=>t[o],enumerable:!(r=y(t,o))||r.enumerable});return e};var u=e=>m(n({},"__esModule",{value:!0}),e);var B={};module.exports=u(B);
2
- //# sourceMappingURL=IButtonController.js.map
2
+ //# sourceMappingURL=ButtonController.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/core/ButtonController.ts"],
4
+ "sourcesContent": ["import type { ButtonKey } from \"./types\";\n\nexport interface ButtonController {\n press(key: ButtonKey): Promise<void>;\n}\n"],
5
+ "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
+ "names": ["ButtonController_exports", "__toCommonJS"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var c=(o,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of d(e))!a.call(o,t)&&t!==n&&r(o,t,{get:()=>e[t],enumerable:!(i=s(e,t))||i.enumerable});return o};var p=o=>c(r({},"__esModule",{value:!0}),o);var K={};module.exports=p(K);
2
+ //# sourceMappingURL=TouchController.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/core/TouchController.ts"],
4
+ "sourcesContent": ["import type { PercentCoordinates } from \"./types\";\n\nexport interface TouchController<K extends string = string> {\n tapAndRelease: (deviceKey: K, point: PercentCoordinates) => Promise<void>;\n tap: (deviceKey: K, point: PercentCoordinates) => Promise<void>;\n release: (deviceKey: K, point: PercentCoordinates) => Promise<void>;\n}\n"],
5
+ "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
+ "names": ["TouchController_exports", "__toCommonJS"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var c=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var i=Object.prototype.hasOwnProperty;var x=(t,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of s(e))!i.call(t,n)&&n!==o&&c(t,n,{get:()=>e[n],enumerable:!(r=p(e,n))||r.enumerable});return t};var g=t=>x(c({},"__esModule",{value:!0}),t);var y={};module.exports=g(y);
1
+ "use strict";var p=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var g=(t,e)=>{for(var c in e)p(t,c,{get:e[c],enumerable:!0})},i=(t,e,c,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of o(e))!d.call(t,n)&&n!==c&&p(t,n,{get:()=>e[n],enumerable:!(r=x(e,n))||r.enumerable});return t};var y=t=>i(p({},"__esModule",{value:!0}),t);var a={};g(a,{SpeculosActions:()=>s});module.exports=y(a);var s=(r=>(r.PRESS="press",r.RELEASE="release",r.PRESS_AND_RELEASE="press-and-release",r))(s||{});0&&(module.exports={SpeculosActions});
2
2
  //# sourceMappingURL=types.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/core/types.ts"],
4
- "sourcesContent": ["export type ButtonKey = \"Ll\" | \"Rr\" | \"LRlr\" | \"left\" | \"right\" | \"both\";\n\nexport type ScreenSpec = Readonly<{ width: number; height: number }>;\n\nexport type DeviceScreens<K extends string = string> = Readonly<\n Record<K, ScreenSpec>\n>;\n\nexport type Range<\n N extends number,\n Acc extends number[] = [],\n> = Acc[\"length\"] extends N ? Acc[number] : Range<N, [...Acc, Acc[\"length\"]]>;\nexport type Percent = Range<101>;\n\nexport type PercentPoint = { x: Percent; y: Percent };\n\nexport type DeviceControllerOptions<K extends string = string> = {\n timeoutMs?: number;\n clientHeader?: string;\n screens: DeviceScreens<K>;\n};\n"],
5
- "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
- "names": ["types_exports", "__toCommonJS"]
4
+ "sourcesContent": ["export type ButtonKey = \"left\" | \"right\" | \"both\";\n\nexport type ScreenSpec = Readonly<{ width: number; height: number }>;\n\nexport type DeviceScreens<K extends string = string> = Readonly<\n Record<K, ScreenSpec>\n>;\n\nexport type Range<\n N extends number,\n Acc extends number[] = [],\n> = Acc[\"length\"] extends N ? Acc[number] : Range<N, [...Acc, Acc[\"length\"]]>;\nexport type Percent = Range<101>;\n\nexport type PercentCoordinates = { x: Percent; y: Percent };\n\nexport type DeviceControllerOptions<K extends string = string> = {\n screens: DeviceScreens<K>;\n timeoutMs?: number;\n clientHeader?: string;\n};\n\nexport enum SpeculosActions {\n PRESS = \"press\",\n RELEASE = \"release\",\n PRESS_AND_RELEASE = \"press-and-release\",\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GAsBO,IAAKE,OACVA,EAAA,MAAQ,QACRA,EAAA,QAAU,UACVA,EAAA,kBAAoB,oBAHVA,OAAA",
6
+ "names": ["types_exports", "__export", "SpeculosActions", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var C=Object.create;var l=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var A=(o,t)=>{for(var e in t)l(o,e,{get:t[e],enumerable:!0})},s=(o,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of d(t))!y.call(o,r)&&r!==e&&l(o,r,{get:()=>t[r],enumerable:!(i=f(t,r))||i.enumerable});return o};var I=(o,t,e)=>(e=o!=null?C(x(o)):{},s(t||!o||!o.__esModule?l(e,"default",{value:o,enumerable:!0}):e,o)),h=o=>s(l({},"__esModule",{value:!0}),o);var b={};A(b,{buildContainer:()=>T});module.exports=h(b);var a=I(require("axios")),c=require("inversify"),p=require("./adapters/AxiosButtonController"),m=require("./adapters/AxiosTouchController"),u=require("./utils/axisClamp"),n=require("../../src/internal/core/speculosDeviceControllerTypes");function T(o,t){const e=new c.Container({defaultScope:"Singleton"}),i=a.default.create({baseURL:o.replace(/\/+$/,""),timeout:t.timeoutMs??1500,headers:{"X-Ledger-Client-Version":t.clientHeader??"ldmk-transport-speculos"},transitional:{clarifyTimeoutError:!0}});return e.bind(n.speculosDeviceControllerTypes.HttpClient).toConstantValue(i),e.bind(n.speculosDeviceControllerTypes.Axes).toConstantValue((0,u.createAxes)(t.screens)),e.bind(n.speculosDeviceControllerTypes.ButtonController).to(p.AxiosButtonController),e.bind(n.speculosDeviceControllerTypes.TouchController).to(m.AxiosTouchController),e}0&&(module.exports={buildContainer});
1
+ "use strict";var m=Object.create;var l=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var h=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var y=(o,t)=>{for(var r in t)l(o,r,{get:t[r],enumerable:!0})},i=(o,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of f(t))!x.call(o,e)&&e!==r&&l(o,e,{get:()=>t[e],enumerable:!(n=C(t,e))||n.enumerable});return o};var T=(o,t,r)=>(r=o!=null?m(h(o)):{},i(t||!o||!o.__esModule?l(r,"default",{value:o,enumerable:!0}):r,o)),A=o=>i(l({},"__esModule",{value:!0}),o);var D={};y(D,{createDefaultControllers:()=>B});module.exports=A(D);var s=T(require("axios")),c=require("./adapters/DefaultButtonController"),a=require("./adapters/DefaultTouchController"),u=require("./utils/axisClamp");function B(o,t){const r=s.default.create({baseURL:o,timeout:t.timeoutMs??1500,headers:{"X-Ledger-Client-Version":t.clientHeader??"ldmk-transport-speculos"},transitional:{clarifyTimeoutError:!0}}),n=(0,u.createAxes)(t.screens),e=new c.DefaultButtonController(r),p=new a.DefaultTouchController(r,n);return{buttons:e,touch:p}}0&&(module.exports={createDefaultControllers});
2
2
  //# sourceMappingURL=di.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/internal/di.ts"],
4
- "sourcesContent": ["import axios, { type AxiosInstance } from \"axios\";\nimport { Container } from \"inversify\";\n\nimport { AxiosButtonController } from \"@internal/adapters/AxiosButtonController\";\nimport { AxiosTouchController } from \"@internal/adapters/AxiosTouchController\";\nimport type { IButtonController } from \"@internal/core/IButtonController\";\nimport type { ITouchController } from \"@internal/core/ITouchController\";\nimport type { DeviceControllerOptions } from \"@internal/core/types\";\nimport { type AxisMap, createAxes } from \"@internal/utils/axisClamp\";\nimport { speculosDeviceControllerTypes } from \"@root/src/internal/core/speculosDeviceControllerTypes\";\n\nexport function buildContainer<K extends string>(\n baseURL: string,\n opts: DeviceControllerOptions<K>,\n) {\n const container = new Container({ defaultScope: \"Singleton\" });\n\n const http = axios.create({\n baseURL: baseURL.replace(/\\/+$/, \"\"),\n timeout: opts.timeoutMs ?? 1500,\n headers: {\n \"X-Ledger-Client-Version\": opts.clientHeader ?? \"ldmk-transport-speculos\",\n },\n transitional: { clarifyTimeoutError: true },\n });\n\n container\n .bind<AxiosInstance>(speculosDeviceControllerTypes.HttpClient)\n .toConstantValue(http);\n container\n .bind<AxisMap<K>>(speculosDeviceControllerTypes.Axes)\n .toConstantValue(createAxes(opts.screens));\n\n container\n .bind<IButtonController>(speculosDeviceControllerTypes.ButtonController)\n .to(AxiosButtonController);\n container\n .bind<ITouchController<K>>(speculosDeviceControllerTypes.TouchController)\n .to(AxiosTouchController);\n\n return container;\n}\n"],
5
- "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA0C,oBAC1CC,EAA0B,qBAE1BC,EAAsC,oDACtCC,EAAqC,mDAIrCC,EAAyC,qCACzCC,EAA8C,iEAEvC,SAASP,EACdQ,EACAC,EACA,CACA,MAAMC,EAAY,IAAI,YAAU,CAAE,aAAc,WAAY,CAAC,EAEvDC,EAAO,EAAAC,QAAM,OAAO,CACxB,QAASJ,EAAQ,QAAQ,OAAQ,EAAE,EACnC,QAASC,EAAK,WAAa,KAC3B,QAAS,CACP,0BAA2BA,EAAK,cAAgB,yBAClD,EACA,aAAc,CAAE,oBAAqB,EAAK,CAC5C,CAAC,EAED,OAAAC,EACG,KAAoB,gCAA8B,UAAU,EAC5D,gBAAgBC,CAAI,EACvBD,EACG,KAAiB,gCAA8B,IAAI,EACnD,mBAAgB,cAAWD,EAAK,OAAO,CAAC,EAE3CC,EACG,KAAwB,gCAA8B,gBAAgB,EACtE,GAAG,uBAAqB,EAC3BA,EACG,KAA0B,gCAA8B,eAAe,EACvE,GAAG,sBAAoB,EAEnBA,CACT",
6
- "names": ["di_exports", "__export", "buildContainer", "__toCommonJS", "import_axios", "import_inversify", "import_AxiosButtonController", "import_AxiosTouchController", "import_axisClamp", "import_speculosDeviceControllerTypes", "baseURL", "opts", "container", "http", "axios"]
4
+ "sourcesContent": ["import axios, { type AxiosInstance } from \"axios\";\n\nimport { DefaultButtonController } from \"@internal/adapters/DefaultButtonController\";\nimport { DefaultTouchController } from \"@internal/adapters/DefaultTouchController\";\nimport type { ButtonController } from \"@internal/core/ButtonController\";\nimport type { DeviceControllerOptions } from \"@internal/core/types\";\nimport { type AxisMap, createAxes } from \"@internal/utils/axisClamp\";\nimport type { TouchController } from \"@root/src/internal/core/TouchController\";\n\nexport type ControllersContainer = {\n buttons: ButtonController;\n touch: TouchController;\n};\n\nexport function createDefaultControllers(\n baseURL: string,\n opts: DeviceControllerOptions,\n): ControllersContainer {\n const http: AxiosInstance = axios.create({\n baseURL: baseURL,\n timeout: opts.timeoutMs ?? 1500,\n headers: {\n \"X-Ledger-Client-Version\": opts.clientHeader ?? \"ldmk-transport-speculos\",\n },\n transitional: { clarifyTimeoutError: true },\n });\n\n const axes: AxisMap = createAxes(opts.screens);\n\n const buttons: ButtonController = new DefaultButtonController(http);\n const touch: TouchController = new DefaultTouchController(http, axes);\n\n return { buttons, touch };\n}\n"],
5
+ "mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA0C,oBAE1CC,EAAwC,sDACxCC,EAAuC,qDAGvCC,EAAyC,qCAQlC,SAASL,EACdM,EACAC,EACsB,CACtB,MAAMC,EAAsB,EAAAC,QAAM,OAAO,CACvC,QAASH,EACT,QAASC,EAAK,WAAa,KAC3B,QAAS,CACP,0BAA2BA,EAAK,cAAgB,yBAClD,EACA,aAAc,CAAE,oBAAqB,EAAK,CAC5C,CAAC,EAEKG,KAAgB,cAAWH,EAAK,OAAO,EAEvCI,EAA4B,IAAI,0BAAwBH,CAAI,EAC5DI,EAAyB,IAAI,yBAAuBJ,EAAME,CAAI,EAEpE,MAAO,CAAE,QAAAC,EAAS,MAAAC,CAAM,CAC1B",
6
+ "names": ["di_exports", "__export", "createDefaultControllers", "__toCommonJS", "import_axios", "import_DefaultButtonController", "import_DefaultTouchController", "import_axisClamp", "baseURL", "opts", "http", "axios", "axes", "buttons", "touch"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var m=Object.create;var i=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var d=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var x=(o,t,n,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let c of h(t))!y.call(o,c)&&c!==n&&i(o,c,{get:()=>t[c],enumerable:!(l=f(t,c))||l.enumerable});return o};var B=(o,t,n)=>(n=o!=null?m(d(o)):{},x(t||!o||!o.__esModule?i(n,"default",{value:o,enumerable:!0}):n,o));var r=B(require("axios")),e=require("vitest"),p=require("./adapters/DefaultButtonController"),u=require("./adapters/DefaultTouchController"),s=require("./di");const a={flex:{width:128,height:64},stax:{width:400,height:672}};(0,e.afterEach)(()=>{e.vi.restoreAllMocks()});(0,e.describe)("createDefaultControllers - axios configuration",()=>{(0,e.it)("configures axios with normalised baseURL, custom timeout and header",()=>{const o=e.vi.spyOn(r.default,"create").mockImplementation(n=>({post:e.vi.fn(),defaults:{...n}}));(0,s.createDefaultControllers)("http://example.com/api",{screens:a,timeoutMs:2345,clientHeader:"test-client"}),(0,e.expect)(o).toHaveBeenCalledTimes(1);const t=o.mock.calls[0][0];(0,e.expect)(t.baseURL).toBe("http://example.com/api"),(0,e.expect)(t.timeout).toBe(2345),(0,e.expect)(t.headers?.["X-Ledger-Client-Version"]).toBe("test-client"),(0,e.expect)(t.transitional?.clarifyTimeoutError).toBe(!0)}),(0,e.it)("applies default timeout and client header when not provided",()=>{const o=e.vi.spyOn(r.default,"create").mockImplementation(n=>({post:e.vi.fn(),defaults:{...n}}));(0,s.createDefaultControllers)("http://localhost:1234",{screens:a});const t=o.mock.calls[0][0];(0,e.expect)(t.baseURL).toBe("http://localhost:1234"),(0,e.expect)(t.timeout).toBe(1500),(0,e.expect)(t.headers?.["X-Ledger-Client-Version"]).toBe("ldmk-transport-speculos")})});(0,e.describe)("createDefaultControllers - wiring",()=>{(0,e.it)("returns axios implementations wired by the factory",()=>{const o={post:e.vi.fn()};e.vi.spyOn(r.default,"create").mockReturnValue(o);const{buttons:t,touch:n}=(0,s.createDefaultControllers)("http://x",{screens:a});(0,e.expect)(t).toBeInstanceOf(p.DefaultButtonController),(0,e.expect)(n).toBeInstanceOf(u.DefaultTouchController),(0,e.expect)(typeof t.press).toBe("function")}),(0,e.it)("creates fresh instances per invocation",()=>{e.vi.spyOn(r.default,"create").mockReturnValueOnce({post:e.vi.fn()}).mockReturnValueOnce({post:e.vi.fn()});const o=(0,s.createDefaultControllers)("http://x",{screens:a}),t=(0,s.createDefaultControllers)("http://x",{screens:a});(0,e.expect)(o.buttons).not.toBe(t.buttons),(0,e.expect)(o.touch).not.toBe(t.touch)}),(0,e.it)("button.press posts the correct payload",async()=>{const o=e.vi.fn().mockResolvedValue(void 0);e.vi.spyOn(r.default,"create").mockReturnValue({post:o});const{buttons:t}=(0,s.createDefaultControllers)("http://x",{screens:a});await t.press("left"),(0,e.expect)(o).toHaveBeenCalledWith("/button/left",{action:"press-and-release"})}),(0,e.it)("touch.tapAndRelease maps percent to absolute coords",async()=>{const o=e.vi.fn().mockResolvedValue(void 0);e.vi.spyOn(r.default,"create").mockReturnValue({post:o});const{touch:t}=(0,s.createDefaultControllers)("http://x",{screens:a});await t.tapAndRelease("flex",{x:50,y:50}),(0,e.expect)(o).toHaveBeenCalledWith("/finger",{action:"press-and-release",x:64,y:32})})});
2
+ //# sourceMappingURL=di.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/internal/di.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n\nimport axios from \"axios\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\n\nimport { DefaultButtonController } from \"@internal/adapters/DefaultButtonController\";\nimport { DefaultTouchController } from \"@internal/adapters/DefaultTouchController\";\n\nimport { createDefaultControllers } from \"./di\";\n\nconst SCREENS = {\n flex: { width: 128, height: 64 },\n stax: { width: 400, height: 672 },\n} as const;\n\nafterEach(() => {\n vi.restoreAllMocks();\n});\n\ndescribe(\"createDefaultControllers - axios configuration\", () => {\n it(\"configures axios with normalised baseURL, custom timeout and header\", () => {\n const createSpy = vi\n .spyOn(axios, \"create\")\n .mockImplementation((cfg: any) => {\n return { post: vi.fn(), defaults: { ...cfg } } as any;\n });\n\n createDefaultControllers(\"http://example.com/api\", {\n screens: SCREENS,\n timeoutMs: 2345,\n clientHeader: \"test-client\",\n });\n\n expect(createSpy).toHaveBeenCalledTimes(1);\n const cfg = createSpy.mock.calls[0]![0] as any;\n expect(cfg.baseURL).toBe(\"http://example.com/api\");\n expect(cfg.timeout).toBe(2345);\n expect(cfg.headers?.[\"X-Ledger-Client-Version\"]).toBe(\"test-client\");\n expect(cfg.transitional?.clarifyTimeoutError).toBe(true);\n });\n\n it(\"applies default timeout and client header when not provided\", () => {\n const createSpy = vi\n .spyOn(axios, \"create\")\n .mockImplementation((cfg: any) => {\n return { post: vi.fn(), defaults: { ...cfg } } as any;\n });\n\n createDefaultControllers(\"http://localhost:1234\", { screens: SCREENS });\n\n const cfg = createSpy.mock.calls[0]![0] as any;\n expect(cfg.baseURL).toBe(\"http://localhost:1234\");\n expect(cfg.timeout).toBe(1500);\n expect(cfg.headers?.[\"X-Ledger-Client-Version\"]).toBe(\n \"ldmk-transport-speculos\",\n );\n });\n});\n\ndescribe(\"createDefaultControllers - wiring\", () => {\n it(\"returns axios implementations wired by the factory\", () => {\n const http = { post: vi.fn() } as any;\n vi.spyOn(axios, \"create\").mockReturnValue(http);\n\n const { buttons, touch } = createDefaultControllers(\"http://x\", {\n screens: SCREENS,\n });\n\n expect(buttons).toBeInstanceOf(DefaultButtonController);\n expect(touch).toBeInstanceOf(DefaultTouchController);\n expect(typeof (buttons as any).press).toBe(\"function\");\n });\n\n it(\"creates fresh instances per invocation\", () => {\n vi.spyOn(axios, \"create\")\n .mockReturnValueOnce({ post: vi.fn() } as any)\n .mockReturnValueOnce({ post: vi.fn() } as any);\n\n const a = createDefaultControllers(\"http://x\", { screens: SCREENS });\n const b = createDefaultControllers(\"http://x\", { screens: SCREENS });\n\n expect(a.buttons).not.toBe(b.buttons);\n expect(a.touch).not.toBe(b.touch);\n });\n\n it(\"button.press posts the correct payload\", async () => {\n const post = vi.fn().mockResolvedValue(undefined);\n vi.spyOn(axios, \"create\").mockReturnValue({ post } as any);\n\n const { buttons } = createDefaultControllers(\"http://x\", {\n screens: SCREENS,\n });\n\n await buttons.press(\"left\");\n expect(post).toHaveBeenCalledWith(\"/button/left\", {\n action: \"press-and-release\",\n });\n });\n\n it(\"touch.tapAndRelease maps percent to absolute coords\", async () => {\n const post = vi.fn().mockResolvedValue(undefined);\n vi.spyOn(axios, \"create\").mockReturnValue({ post } as any);\n\n const { touch } = createDefaultControllers(\"http://x\", {\n screens: SCREENS,\n });\n\n // 50% of 128x64 \u2192 (64, 32)\n await touch.tapAndRelease(\"flex\", { x: 50 as any, y: 50 as any });\n\n expect(post).toHaveBeenCalledWith(\"/finger\", {\n action: \"press-and-release\",\n x: 64,\n y: 32,\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_axios", "import_vitest", "import_DefaultButtonController", "import_DefaultTouchController", "import_di", "SCREENS", "createSpy", "axios", "cfg", "http", "buttons", "touch", "a", "b", "post"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var i=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var l=(t,o)=>{for(var e in o)i(t,e,{get:o[e],enumerable:!0})},c=(t,o,e,n)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of a(o))!p.call(t,r)&&r!==e&&i(t,r,{get:()=>o[r],enumerable:!(n=s(o,r))||n.enumerable});return t};var f=t=>c(i({},"__esModule",{value:!0}),t);var y={};l(y,{pressButtons:()=>u,pressSequence:()=>m});module.exports=f(y);async function m(t,o,e=200){for(const n of o)await t.press(n),e>0&&await new Promise(r=>setTimeout(r,e))}function u(t){return{left:async()=>await t.press("left"),right:async()=>await t.press("right"),both:async()=>await t.press("both")}}0&&(module.exports={pressButtons,pressSequence});
2
+ //# sourceMappingURL=buttonUseCases.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/use-cases/buttonUseCases.ts"],
4
+ "sourcesContent": ["import type { ButtonController } from \"@internal/core/ButtonController\";\nimport type { ButtonKey } from \"@internal/core/types\";\n\nconst DEFAULT_DELAY_MS = 200;\n\nexport async function pressSequence(\n buttons: ButtonController,\n keys: ButtonKey[],\n delayMs = DEFAULT_DELAY_MS,\n): Promise<void> {\n for (const k of keys) {\n await buttons.press(k);\n if (delayMs > 0) {\n await new Promise((r) => setTimeout(r, delayMs));\n }\n }\n}\n\nexport function pressButtons(buttons: ButtonController): {\n left: () => Promise<void>;\n right: () => Promise<void>;\n both: () => Promise<void>;\n} {\n return {\n left: async () => await buttons.press(\"left\"),\n right: async () => await buttons.press(\"right\"),\n both: async () => await buttons.press(\"both\"),\n };\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,EAAA,kBAAAC,IAAA,eAAAC,EAAAJ,GAKA,eAAsBK,EACpBC,EACAC,EACAC,EAAU,IACK,CACf,UAAWC,KAAKF,EACd,MAAMD,EAAQ,MAAMG,CAAC,EACjBD,EAAU,GACZ,MAAM,IAAI,QAAS,GAAM,WAAW,EAAGA,CAAO,CAAC,CAGrD,CAEO,SAASE,EAAaJ,EAI3B,CACA,MAAO,CACL,KAAM,SAAY,MAAMA,EAAQ,MAAM,MAAM,EAC5C,MAAO,SAAY,MAAMA,EAAQ,MAAM,OAAO,EAC9C,KAAM,SAAY,MAAMA,EAAQ,MAAM,MAAM,CAC9C,CACF",
6
+ "names": ["buttonUseCases_exports", "__export", "pressButtons", "pressSequence", "__toCommonJS", "pressSequence", "buttons", "keys", "delayMs", "k", "pressButtons"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var s=require("./buttonUseCases");const i=()=>Promise.resolve();describe("buttonUsecases",()=>{let e;beforeEach(()=>{e={press:vi.fn(()=>Promise.resolve())}}),afterEach(()=>{vi.useRealTimers(),vi.restoreAllMocks()}),describe("pressButtons",()=>{it("returns functions that call controller.press with the correct keys",async()=>{const t=(0,s.pressButtons)(e);await t.left(),await t.right(),await t.both(),expect(e.press).toHaveBeenCalledTimes(3),expect(e.press).toHaveBeenNthCalledWith(1,"left"),expect(e.press).toHaveBeenNthCalledWith(2,"right"),expect(e.press).toHaveBeenNthCalledWith(3,"both")})}),describe("pressSequence",()=>{it("presses keys in order and waits the default 200ms after each key (including last)",async()=>{vi.useFakeTimers();const t=vi.spyOn(globalThis,"setTimeout"),a=(0,s.pressSequence)(e,["left","right","both"]);expect(e.press).toHaveBeenCalledTimes(1),expect(e.press).toHaveBeenNthCalledWith(1,"left"),await i(),expect(t).toHaveBeenCalledTimes(1),expect(t).toHaveBeenLastCalledWith(expect.any(Function),200),await vi.advanceTimersByTimeAsync(200),await i(),expect(e.press).toHaveBeenCalledTimes(2),expect(e.press).toHaveBeenNthCalledWith(2,"right"),await vi.advanceTimersByTimeAsync(200),await i(),expect(e.press).toHaveBeenCalledTimes(3),expect(e.press).toHaveBeenNthCalledWith(3,"both"),await vi.advanceTimersByTimeAsync(200),await expect(a).resolves.toBeUndefined()}),it("uses the provided custom delay",async()=>{vi.useFakeTimers();const t=vi.spyOn(globalThis,"setTimeout"),a=(0,s.pressSequence)(e,["left","right"],75);await i(),expect(t).toHaveBeenCalledTimes(1),expect(t).toHaveBeenLastCalledWith(expect.any(Function),75),await vi.advanceTimersByTimeAsync(75),await i(),expect(t).toHaveBeenCalledTimes(2),expect(t).toHaveBeenLastCalledWith(expect.any(Function),75),await vi.advanceTimersByTimeAsync(75),await expect(a).resolves.toBeUndefined()}),it("rejects if a press fails and stops processing subsequent keys",async()=>{vi.useFakeTimers();const t=new Error("oups");e.press.mockResolvedValueOnce(void 0).mockRejectedValueOnce(t);const a=(0,s.pressSequence)(e,["left","right","both"],50),n=expect(a).rejects.toThrow("oups");await Promise.resolve(),await vi.advanceTimersByTimeAsync(50),await Promise.resolve(),await n,expect(e.press).toHaveBeenCalledTimes(2),expect(e.press).toHaveBeenNthCalledWith(1,"left"),expect(e.press).toHaveBeenNthCalledWith(2,"right")})})});
2
+ //# sourceMappingURL=buttonUseCases.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/use-cases/buttonUseCases.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { pressButtons, pressSequence } from \"./buttonUseCases\";\n\ntype ButtonKey = \"left\" | \"right\" | \"both\";\ntype ButtonController = { press: (k: ButtonKey) => Promise<void> };\n\nconst tick = () => Promise.resolve();\n\ndescribe(\"buttonUsecases\", () => {\n let controller: ButtonController & { press: ReturnType<typeof vi.fn> };\n\n beforeEach(() => {\n controller = {\n press: vi.fn(() => Promise.resolve()),\n };\n });\n\n afterEach(() => {\n vi.useRealTimers();\n vi.restoreAllMocks();\n });\n\n describe(\"pressButtons\", () => {\n it(\"returns functions that call controller.press with the correct keys\", async () => {\n const api = pressButtons(controller);\n\n await api.left();\n await api.right();\n await api.both();\n\n expect(controller.press).toHaveBeenCalledTimes(3);\n expect(controller.press).toHaveBeenNthCalledWith(1, \"left\");\n expect(controller.press).toHaveBeenNthCalledWith(2, \"right\");\n expect(controller.press).toHaveBeenNthCalledWith(3, \"both\");\n });\n });\n\n describe(\"pressSequence\", () => {\n it(\"presses keys in order and waits the default 200ms after each key (including last)\", async () => {\n vi.useFakeTimers();\n const timeoutSpy = vi.spyOn(globalThis, \"setTimeout\");\n const keys: ButtonKey[] = [\"left\", \"right\", \"both\"];\n\n const promise = pressSequence(controller, keys); // delay = 200\n\n // first press happens immediately (sync call of controller.press)\n expect(controller.press).toHaveBeenCalledTimes(1);\n expect(controller.press).toHaveBeenNthCalledWith(1, \"left\");\n\n // timeout is scheduled after the awaited press resolves\n await tick();\n expect(timeoutSpy).toHaveBeenCalledTimes(1);\n expect(timeoutSpy).toHaveBeenLastCalledWith(expect.any(Function), 200);\n\n // first delay elapse -> second press\n await vi.advanceTimersByTimeAsync(200);\n await tick();\n expect(controller.press).toHaveBeenCalledTimes(2);\n expect(controller.press).toHaveBeenNthCalledWith(2, \"right\");\n\n // next delay -> third press\n await vi.advanceTimersByTimeAsync(200);\n await tick();\n expect(controller.press).toHaveBeenCalledTimes(3);\n expect(controller.press).toHaveBeenNthCalledWith(3, \"both\");\n\n // final post-press delay\n await vi.advanceTimersByTimeAsync(200);\n await expect(promise).resolves.toBeUndefined();\n });\n\n it(\"uses the provided custom delay\", async () => {\n vi.useFakeTimers();\n const timeoutSpy = vi.spyOn(globalThis, \"setTimeout\");\n const keys: ButtonKey[] = [\"left\", \"right\"];\n\n const promise = pressSequence(controller, keys, 75);\n\n await tick();\n expect(timeoutSpy).toHaveBeenCalledTimes(1);\n expect(timeoutSpy).toHaveBeenLastCalledWith(expect.any(Function), 75);\n\n await vi.advanceTimersByTimeAsync(75);\n await tick();\n expect(timeoutSpy).toHaveBeenCalledTimes(2);\n expect(timeoutSpy).toHaveBeenLastCalledWith(expect.any(Function), 75);\n\n await vi.advanceTimersByTimeAsync(75);\n await expect(promise).resolves.toBeUndefined();\n });\n\n it(\"rejects if a press fails and stops processing subsequent keys\", async () => {\n vi.useFakeTimers();\n\n const err = new Error(\"oups\");\n controller.press\n .mockResolvedValueOnce(undefined) // first ok\n .mockRejectedValueOnce(err); // second fails\n\n const keys: ButtonKey[] = [\"left\", \"right\", \"both\"];\n\n const p = pressSequence(controller, keys, 50);\n\n const assertion = expect(p).rejects.toThrow(\"oups\");\n\n await Promise.resolve(); // let first setTimeout schedule\n await vi.advanceTimersByTimeAsync(50);\n await Promise.resolve();\n\n await assertion;\n\n expect(controller.press).toHaveBeenCalledTimes(2);\n expect(controller.press).toHaveBeenNthCalledWith(1, \"left\");\n expect(controller.press).toHaveBeenNthCalledWith(2, \"right\");\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_buttonUseCases", "tick", "controller", "api", "timeoutSpy", "promise", "err", "p", "assertion"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var p=(e,t)=>{for(var o in t)a(e,o,{get:t[o],enumerable:!0})},l=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of i(t))!c.call(e,r)&&r!==o&&a(e,r,{get:()=>t[r],enumerable:!(n=s(t,r))||n.enumerable});return e};var m=e=>l(a({},"__esModule",{value:!0}),e);var u={};p(u,{tapLong:()=>T,tapQuick:()=>d});module.exports=m(u);const C=5e3,T=(e,t)=>async(o,n=C)=>{await e.tap(t,o),await new Promise(r=>setTimeout(r,n)),await e.release(t,o)},d=(e,t)=>async o=>await e.tapAndRelease(t,o);0&&(module.exports={tapLong,tapQuick});
2
+ //# sourceMappingURL=touchUseCases.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/use-cases/touchUseCases.ts"],
4
+ "sourcesContent": ["import type { PercentCoordinates } from \"@internal/core/types\";\nimport { type TouchController } from \"@root/src/internal/core/TouchController\";\n\nconst TAP_LONG_TIME_MS = 5000;\n\nexport const tapLong =\n <K extends string>(touch: TouchController<K>, deviceKey: K) =>\n async (point: PercentCoordinates, delayMs: number = TAP_LONG_TIME_MS) => {\n await touch.tap(deviceKey, point);\n await new Promise((r) => setTimeout(r, delayMs));\n await touch.release(deviceKey, point);\n };\n\nexport const tapQuick =\n <K extends string>(touch: TouchController<K>, deviceKey: K) =>\n async (point: PercentCoordinates) =>\n await touch.tapAndRelease(deviceKey, point);\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,aAAAC,IAAA,eAAAC,EAAAJ,GAGA,MAAMK,EAAmB,IAEZH,EACX,CAAmBI,EAA2BC,IAC9C,MAAOC,EAA2BC,EAAkBJ,IAAqB,CACvE,MAAMC,EAAM,IAAIC,EAAWC,CAAK,EAChC,MAAM,IAAI,QAAS,GAAM,WAAW,EAAGC,CAAO,CAAC,EAC/C,MAAMH,EAAM,QAAQC,EAAWC,CAAK,CACtC,EAEWL,EACX,CAAmBG,EAA2BC,IAC9C,MAAOC,GACL,MAAMF,EAAM,cAAcC,EAAWC,CAAK",
6
+ "names": ["touchUseCases_exports", "__export", "tapLong", "tapQuick", "__toCommonJS", "TAP_LONG_TIME_MS", "touch", "deviceKey", "point", "delayMs"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var n=require("./touchUseCases");describe("touchUsecases",()=>{const a="devA",t={x:50,y:30};let e;beforeEach(()=>{e={tap:vi.fn().mockResolvedValue(void 0),release:vi.fn().mockResolvedValue(void 0),tapAndRelease:vi.fn().mockResolvedValue(void 0)},vi.restoreAllMocks(),vi.useRealTimers()}),it("tapQuick calls tapAndRelease with the same deviceKey and point",async()=>{await(0,n.tapQuick)(e,a)(t),expect(e.tapAndRelease).toHaveBeenCalledTimes(1),expect(e.tapAndRelease).toHaveBeenCalledWith(a,t),expect(e.tap).not.toHaveBeenCalled(),expect(e.release).not.toHaveBeenCalled()}),it("tapLong taps, waits default timeout, then releases",async()=>{vi.useFakeTimers();const o=vi.spyOn(globalThis,"setTimeout"),l=(0,n.tapLong)(e,a)(t);await Promise.resolve(),expect(e.tap).toHaveBeenCalledTimes(1),expect(e.tap).toHaveBeenCalledWith(a,t),expect(o).toHaveBeenCalledTimes(1),expect(o).toHaveBeenLastCalledWith(expect.any(Function),5e3),expect(e.release).not.toHaveBeenCalled(),await vi.advanceTimersByTimeAsync(5e3),await l,expect(e.release).toHaveBeenCalledTimes(1),expect(e.release).toHaveBeenCalledWith(a,t)}),it("tapLong uses the provided delayMs value",async()=>{vi.useFakeTimers();const o=vi.spyOn(globalThis,"setTimeout"),s=1234,i=(0,n.tapLong)(e,a)(t,s);await Promise.resolve(),expect(e.tap).toHaveBeenCalledTimes(1),expect(e.tap).toHaveBeenCalledWith(a,t),expect(o).toHaveBeenCalledTimes(1),expect(o).toHaveBeenLastCalledWith(expect.any(Function),s),expect(e.release).not.toHaveBeenCalled(),await vi.advanceTimersByTimeAsync(s),await i,expect(e.release).toHaveBeenCalledTimes(1),expect(e.release).toHaveBeenCalledWith(a,t)}),it("tapLong propagates error if tap() rejects (no release)",async()=>{vi.useFakeTimers();const o=new Error("tap failed");e.tap.mockRejectedValueOnce(o);const l=(0,n.tapLong)(e,a)(t);await expect(l).rejects.toThrow("tap failed"),expect(e.release).not.toHaveBeenCalled()}),it("tapLong propagates error if release() rejects",async()=>{vi.useFakeTimers();const o=new Error("release failed");e.release.mockRejectedValueOnce(o);const s=(0,n.tapLong)(e,a)(t),l=expect(s).rejects.toThrow("release failed");await Promise.resolve(),await vi.advanceTimersByTimeAsync(5e3),await l,expect(e.tap).toHaveBeenCalledTimes(1),expect(e.release).toHaveBeenCalledTimes(1)})});
2
+ //# sourceMappingURL=touchUseCases.test.js.map