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

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 (108) hide show
  1. package/README.md +2 -2
  2. package/lib/cjs/src/api/DeviceController.js.map +1 -1
  3. package/lib/cjs/src/internal/adapters/DefaultButtonController.js +2 -0
  4. package/lib/cjs/src/internal/adapters/DefaultButtonController.js.map +7 -0
  5. package/lib/cjs/src/internal/adapters/DefaultButtonController.test.js +2 -0
  6. package/lib/cjs/src/internal/adapters/DefaultButtonController.test.js.map +7 -0
  7. package/lib/cjs/src/internal/adapters/DefaultTouchController.js +2 -0
  8. package/lib/cjs/src/internal/adapters/DefaultTouchController.js.map +7 -0
  9. package/lib/cjs/src/internal/adapters/DefaultTouchController.test.js +2 -0
  10. package/lib/cjs/src/internal/adapters/DefaultTouchController.test.js.map +7 -0
  11. package/lib/cjs/src/internal/core/{IButtonController.js → ButtonController.js} +1 -1
  12. package/lib/cjs/src/internal/core/ButtonController.js.map +7 -0
  13. package/lib/cjs/src/internal/core/{ITouchController.js → TouchController.js} +1 -1
  14. package/lib/cjs/src/internal/core/TouchController.js.map +7 -0
  15. package/lib/cjs/src/internal/core/types.js.map +1 -1
  16. package/lib/cjs/src/internal/di.js +1 -1
  17. package/lib/cjs/src/internal/di.js.map +3 -3
  18. package/lib/cjs/src/internal/di.test.js +1 -1
  19. package/lib/cjs/src/internal/di.test.js.map +3 -3
  20. package/lib/cjs/src/internal/use-cases/buttonUseCases.js +1 -1
  21. package/lib/cjs/src/internal/use-cases/buttonUseCases.js.map +3 -3
  22. package/lib/cjs/src/internal/use-cases/buttonUseCases.test.js.map +1 -1
  23. package/lib/cjs/src/internal/use-cases/touchUseCases.js.map +2 -2
  24. package/lib/cjs/src/internal/use-cases/touchUseCases.test.js.map +1 -1
  25. package/lib/cjs/src/internal/utils/axisClamp.js +1 -1
  26. package/lib/cjs/src/internal/utils/axisClamp.js.map +3 -3
  27. package/lib/cjs/src/internal/utils/axisClamp.test.js +1 -1
  28. package/lib/cjs/src/internal/utils/axisClamp.test.js.map +3 -3
  29. package/lib/esm/src/api/DeviceController.js.map +1 -1
  30. package/lib/esm/src/internal/adapters/DefaultButtonController.js +2 -0
  31. package/lib/esm/src/internal/adapters/DefaultButtonController.js.map +7 -0
  32. package/lib/esm/src/internal/adapters/DefaultButtonController.test.js +2 -0
  33. package/lib/esm/src/internal/adapters/DefaultButtonController.test.js.map +7 -0
  34. package/lib/esm/src/internal/adapters/{AxiosTouchController.js → DefaultTouchController.js} +2 -2
  35. package/lib/esm/src/internal/adapters/DefaultTouchController.js.map +7 -0
  36. package/lib/esm/src/internal/adapters/DefaultTouchController.test.js +2 -0
  37. package/lib/esm/src/internal/adapters/DefaultTouchController.test.js.map +7 -0
  38. package/lib/esm/src/internal/core/ButtonController.js +1 -0
  39. package/lib/esm/src/internal/core/TouchController.js +1 -0
  40. package/lib/esm/src/internal/core/types.js.map +1 -1
  41. package/lib/esm/src/internal/di.js +1 -1
  42. package/lib/esm/src/internal/di.js.map +3 -3
  43. package/lib/esm/src/internal/di.test.js +1 -1
  44. package/lib/esm/src/internal/di.test.js.map +3 -3
  45. package/lib/esm/src/internal/use-cases/buttonUseCases.js +1 -1
  46. package/lib/esm/src/internal/use-cases/buttonUseCases.js.map +2 -2
  47. package/lib/esm/src/internal/use-cases/buttonUseCases.test.js.map +1 -1
  48. package/lib/esm/src/internal/use-cases/touchUseCases.js.map +2 -2
  49. package/lib/esm/src/internal/use-cases/touchUseCases.test.js.map +1 -1
  50. package/lib/esm/src/internal/utils/axisClamp.js +1 -1
  51. package/lib/esm/src/internal/utils/axisClamp.js.map +3 -3
  52. package/lib/esm/src/internal/utils/axisClamp.test.js +1 -1
  53. package/lib/esm/src/internal/utils/axisClamp.test.js.map +3 -3
  54. package/lib/types/src/api/DeviceController.d.ts +2 -2
  55. package/lib/types/src/api/DeviceController.d.ts.map +1 -1
  56. package/lib/types/src/internal/adapters/{AxiosButtonController.d.ts → DefaultButtonController.d.ts} +3 -3
  57. package/lib/types/src/internal/adapters/DefaultButtonController.d.ts.map +1 -0
  58. package/lib/types/src/internal/adapters/DefaultButtonController.test.d.ts +2 -0
  59. package/lib/types/src/internal/adapters/DefaultButtonController.test.d.ts.map +1 -0
  60. package/lib/types/src/internal/adapters/{AxiosTouchController.d.ts → DefaultTouchController.d.ts} +3 -3
  61. package/lib/types/src/internal/adapters/DefaultTouchController.d.ts.map +1 -0
  62. package/lib/types/src/internal/adapters/DefaultTouchController.test.d.ts +2 -0
  63. package/lib/types/src/internal/adapters/DefaultTouchController.test.d.ts.map +1 -0
  64. package/lib/types/src/internal/core/{IButtonController.d.ts → ButtonController.d.ts} +2 -2
  65. package/lib/types/src/internal/core/ButtonController.d.ts.map +1 -0
  66. package/lib/types/src/internal/core/{ITouchController.d.ts → TouchController.d.ts} +2 -2
  67. package/lib/types/src/internal/core/TouchController.d.ts.map +1 -0
  68. package/lib/types/src/internal/core/types.d.ts +1 -1
  69. package/lib/types/src/internal/core/types.d.ts.map +1 -1
  70. package/lib/types/src/internal/di.d.ts +4 -4
  71. package/lib/types/src/internal/di.d.ts.map +1 -1
  72. package/lib/types/src/internal/use-cases/buttonUseCases.d.ts +3 -3
  73. package/lib/types/src/internal/use-cases/buttonUseCases.d.ts.map +1 -1
  74. package/lib/types/src/internal/use-cases/touchUseCases.d.ts +3 -3
  75. package/lib/types/src/internal/use-cases/touchUseCases.d.ts.map +1 -1
  76. package/lib/types/src/internal/utils/axisClamp.d.ts +1 -2
  77. package/lib/types/src/internal/utils/axisClamp.d.ts.map +1 -1
  78. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  79. package/package.json +3 -3
  80. package/lib/cjs/src/internal/adapters/AxiosButtonController.js +0 -2
  81. package/lib/cjs/src/internal/adapters/AxiosButtonController.js.map +0 -7
  82. package/lib/cjs/src/internal/adapters/AxiosButtonController.test.js +0 -2
  83. package/lib/cjs/src/internal/adapters/AxiosButtonController.test.js.map +0 -7
  84. package/lib/cjs/src/internal/adapters/AxiosTouchController.js +0 -2
  85. package/lib/cjs/src/internal/adapters/AxiosTouchController.js.map +0 -7
  86. package/lib/cjs/src/internal/adapters/AxiosTouchController.test.js +0 -2
  87. package/lib/cjs/src/internal/adapters/AxiosTouchController.test.js.map +0 -7
  88. package/lib/cjs/src/internal/core/IButtonController.js.map +0 -7
  89. package/lib/cjs/src/internal/core/ITouchController.js.map +0 -7
  90. package/lib/esm/src/internal/adapters/AxiosButtonController.js +0 -2
  91. package/lib/esm/src/internal/adapters/AxiosButtonController.js.map +0 -7
  92. package/lib/esm/src/internal/adapters/AxiosButtonController.test.js +0 -2
  93. package/lib/esm/src/internal/adapters/AxiosButtonController.test.js.map +0 -7
  94. package/lib/esm/src/internal/adapters/AxiosTouchController.js.map +0 -7
  95. package/lib/esm/src/internal/adapters/AxiosTouchController.test.js +0 -2
  96. package/lib/esm/src/internal/adapters/AxiosTouchController.test.js.map +0 -7
  97. package/lib/esm/src/internal/core/IButtonController.js +0 -1
  98. package/lib/esm/src/internal/core/ITouchController.js +0 -1
  99. package/lib/types/src/internal/adapters/AxiosButtonController.d.ts.map +0 -1
  100. package/lib/types/src/internal/adapters/AxiosButtonController.test.d.ts +0 -2
  101. package/lib/types/src/internal/adapters/AxiosButtonController.test.d.ts.map +0 -1
  102. package/lib/types/src/internal/adapters/AxiosTouchController.d.ts.map +0 -1
  103. package/lib/types/src/internal/adapters/AxiosTouchController.test.d.ts +0 -2
  104. package/lib/types/src/internal/adapters/AxiosTouchController.test.d.ts.map +0 -1
  105. package/lib/types/src/internal/core/IButtonController.d.ts.map +0 -1
  106. package/lib/types/src/internal/core/ITouchController.d.ts.map +0 -1
  107. /package/lib/esm/src/internal/core/{IButtonController.js.map → ButtonController.js.map} +0 -0
  108. /package/lib/esm/src/internal/core/{ITouchController.js.map → TouchController.js.map} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/speculos-device-controller",
3
- "version": "0.0.0-speculos-transport-and-device-controller-20251021081257",
3
+ "version": "0.0.0-wrong-error-when-in-experimental-provider-20251021162636",
4
4
  "license": "Apache-2.0",
5
5
  "private": false,
6
6
  "exports": {
@@ -21,7 +21,7 @@
21
21
  "dependencies": {
22
22
  "@sentry/minimal": "6.19.7",
23
23
  "axios": "1.8.2",
24
- "@ledgerhq/device-management-kit": "0.9.1"
24
+ "@ledgerhq/device-management-kit": "0.0.0-wrong-error-when-in-experimental-provider-20251021162636"
25
25
  },
26
26
  "devDependencies": {
27
27
  "ts-node": "10.9.2",
@@ -32,7 +32,7 @@
32
32
  "@ledgerhq/vitest-config-dmk": "0.0.0"
33
33
  },
34
34
  "peerDependencies": {
35
- "@ledgerhq/device-management-kit": "0.9.1"
35
+ "@ledgerhq/device-management-kit": "0.0.0-wrong-error-when-in-experimental-provider-20251021162636"
36
36
  },
37
37
  "scripts": {
38
38
  "prebuild": "rimraf lib",
@@ -1,2 +0,0 @@
1
- "use strict";var r=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var a=(o,t)=>{for(var e in t)r(o,e,{get:t[e],enumerable:!0})},m=(o,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of c(t))!p.call(o,n)&&n!==e&&r(o,n,{get:()=>t[n],enumerable:!(i=l(t,n))||i.enumerable});return o};var u=o=>m(r({},"__esModule",{value:!0}),o);var A={};a(A,{AxiosButtonController:()=>y});module.exports=u(A);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={AxiosButtonController});
2
- //# sourceMappingURL=AxiosButtonController.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/adapters/AxiosButtonController.ts"],
4
- "sourcesContent": ["import type { AxiosInstance } from \"axios\";\n\nimport type { IButtonController } from \"@internal/core/IButtonController\";\nimport { type ButtonKey, SpeculosActions } from \"@internal/core/types\";\n\nexport class AxiosButtonController implements IButtonController {\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,2BAAAE,IAAA,eAAAC,EAAAH,GAGA,IAAAI,EAAgD,gCAEzC,MAAMF,CAAmD,CAC9D,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": ["AxiosButtonController_exports", "__export", "AxiosButtonController", "__toCommonJS", "import_types", "client", "key"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var n=require("./AxiosButtonController");describe("AxiosButtonController",()=>{let e,s,o;beforeEach(()=>{e=vi.fn().mockResolvedValue({status:200,data:{}}),s={post:e},o=new n.AxiosButtonController(s)});const r=["left","right","both"];it.each(r)("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=AxiosButtonController.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/adapters/AxiosButtonController.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 { AxiosButtonController } from \"./AxiosButtonController\";\n\ndescribe(\"AxiosButtonController\", () => {\n let postMock: ReturnType<typeof vi.fn>;\n let axiosFake: AxiosInstance;\n let controller: AxiosButtonController;\n\n beforeEach(() => {\n postMock = vi.fn().mockResolvedValue({ status: 200, data: {} });\n axiosFake = { post: postMock } as unknown as AxiosInstance;\n controller = new AxiosButtonController(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,EAAsC,mCAEtC,SAAS,wBAAyB,IAAM,CACtC,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,wBAAsBD,CAAS,CAClD,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_AxiosButtonController", "postMock", "axiosFake", "controller", "keys", "key", "error"]
7
- }
@@ -1,2 +0,0 @@
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,{AxiosTouchController:()=>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={AxiosTouchController});
2
- //# sourceMappingURL=AxiosTouchController.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/adapters/AxiosTouchController.ts"],
4
- "sourcesContent": ["import type { AxiosInstance } from \"axios\";\n\nimport type { ITouchController } from \"@internal/core/ITouchController\";\nimport { type PercentCoordinates, SpeculosActions } from \"@internal/core/types\";\nimport type { AxisMap } from \"@internal/utils/axisClamp\";\n\nexport class AxiosTouchController<K extends string>\n implements ITouchController<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,0BAAAE,IAAA,eAAAC,EAAAH,GAGA,IAAAI,EAAyD,gCAGlD,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": ["AxiosTouchController_exports", "__export", "AxiosTouchController", "__toCommonJS", "import_types", "client", "axes", "x", "y", "inRange", "v", "deviceKey", "p", "axis", "known", "point", "abs"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";var l=require("./AxiosTouchController");describe("AxiosTouchController",()=>{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.AxiosTouchController(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.AxiosTouchController(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=AxiosTouchController.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/adapters/AxiosTouchController.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 { AxiosTouchController } from \"./AxiosTouchController\";\n\ndescribe(\"AxiosTouchController\", () => {\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: AxiosTouchController<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 AxiosTouchController(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: AxiosTouchController<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 AxiosTouchController(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_AxiosTouchController", "postMock", "axiosFake", "axisA", "xPct", "yPct", "axisB", "axesFake", "controller", "point", "expectedAbs", "boom", "axis", "badPoints", "p"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/core/IButtonController.ts"],
4
- "sourcesContent": ["import type { ButtonKey } from \"./types\";\n\nexport interface IButtonController {\n press(key: ButtonKey): Promise<void>;\n}\n"],
5
- "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
- "names": ["IButtonController_exports", "__toCommonJS"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/core/ITouchController.ts"],
4
- "sourcesContent": ["import type { PercentCoordinates } from \"./types\";\n\nexport interface ITouchController<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": ["ITouchController_exports", "__toCommonJS"]
7
- }
@@ -1,2 +0,0 @@
1
- import{SpeculosActions as o}from"../core/types";class r{constructor(t){this.client=t}async press(t){await this.client.post(`/button/${t}`,{action:o.PRESS_AND_RELEASE})}}export{r as AxiosButtonController};
2
- //# sourceMappingURL=AxiosButtonController.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/adapters/AxiosButtonController.ts"],
4
- "sourcesContent": ["import type { AxiosInstance } from \"axios\";\n\nimport type { IButtonController } from \"@internal/core/IButtonController\";\nimport { type ButtonKey, SpeculosActions } from \"@internal/core/types\";\n\nexport class AxiosButtonController implements IButtonController {\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": "AAGA,OAAyB,mBAAAA,MAAuB,uBAEzC,MAAMC,CAAmD,CAC9D,YAA6BC,EAAuB,CAAvB,YAAAA,CAAwB,CAErD,MAAM,MAAMC,EAA+B,CACzC,MAAM,KAAK,OAAO,KAAK,WAAWA,CAAG,GAAI,CACvC,OAAQH,EAAgB,iBAC1B,CAAC,CACH,CACF",
6
- "names": ["SpeculosActions", "AxiosButtonController", "client", "key"]
7
- }
@@ -1,2 +0,0 @@
1
- import{AxiosButtonController as r}from"./AxiosButtonController";describe("AxiosButtonController",()=>{let e,s,o;beforeEach(()=>{e=vi.fn().mockResolvedValue({status:200,data:{}}),s={post:e},o=new r(s)});const n=["left","right","both"];it.each(n)("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=AxiosButtonController.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/adapters/AxiosButtonController.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 { AxiosButtonController } from \"./AxiosButtonController\";\n\ndescribe(\"AxiosButtonController\", () => {\n let postMock: ReturnType<typeof vi.fn>;\n let axiosFake: AxiosInstance;\n let controller: AxiosButtonController;\n\n beforeEach(() => {\n postMock = vi.fn().mockResolvedValue({ status: 200, data: {} });\n axiosFake = { post: postMock } as unknown as AxiosInstance;\n controller = new AxiosButtonController(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,OAAS,yBAAAA,MAA6B,0BAEtC,SAAS,wBAAyB,IAAM,CACtC,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,IAAIH,EAAsBE,CAAS,CAClD,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": ["AxiosButtonController", "postMock", "axiosFake", "controller", "keys", "key", "error"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/adapters/AxiosTouchController.ts"],
4
- "sourcesContent": ["import type { AxiosInstance } from \"axios\";\n\nimport type { ITouchController } from \"@internal/core/ITouchController\";\nimport { type PercentCoordinates, SpeculosActions } from \"@internal/core/types\";\nimport type { AxisMap } from \"@internal/utils/axisClamp\";\n\nexport class AxiosTouchController<K extends string>\n implements ITouchController<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": "AAGA,OAAkC,mBAAAA,MAAuB,uBAGlD,MAAMC,CAEb,CACE,YACmBC,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,OAAQZ,EAAgB,kBACxB,GAAGa,CACL,CAAC,CACH,CAEA,MAAM,IAAIL,EAAcI,EAA0C,CAChE,MAAMC,EAAM,KAAK,MAAML,EAAWI,CAAK,EACvC,MAAM,KAAK,OAAO,KAAK,UAAW,CAChC,OAAQZ,EAAgB,MACxB,GAAGa,CACL,CAAC,CACH,CAEA,MAAM,QAAQL,EAAcI,EAA0C,CACpE,MAAMC,EAAM,KAAK,MAAML,EAAWI,CAAK,EACvC,MAAM,KAAK,OAAO,KAAK,UAAW,CAChC,OAAQZ,EAAgB,QACxB,GAAGa,CACL,CAAC,CACH,CACF",
6
- "names": ["SpeculosActions", "AxiosTouchController", "client", "axes", "x", "y", "inRange", "v", "deviceKey", "p", "axis", "known", "point", "abs"]
7
- }
@@ -1,2 +0,0 @@
1
- import{AxiosTouchController as l}from"./AxiosTouchController";describe("AxiosTouchController",()=>{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(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(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=AxiosTouchController.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/internal/adapters/AxiosTouchController.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 { AxiosTouchController } from \"./AxiosTouchController\";\n\ndescribe(\"AxiosTouchController\", () => {\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: AxiosTouchController<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 AxiosTouchController(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: AxiosTouchController<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 AxiosTouchController(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": ["AxiosTouchController", "postMock", "axiosFake", "axisA", "xPct", "yPct", "axisB", "axesFake", "controller", "point", "expectedAbs", "boom", "axis", "badPoints", "p"]
7
- }
@@ -1 +0,0 @@
1
- //# sourceMappingURL=IButtonController.js.map
@@ -1 +0,0 @@
1
- //# sourceMappingURL=ITouchController.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AxiosButtonController.d.ts","sourceRoot":"","sources":["../../../../../src/internal/adapters/AxiosButtonController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,sBAAsB,CAAC;AAEvE,qBAAa,qBAAsB,YAAW,iBAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAE5C,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAK3C"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=AxiosButtonController.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AxiosButtonController.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/adapters/AxiosButtonController.test.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AxiosTouchController.d.ts","sourceRoot":"","sources":["../../../../../src/internal/adapters/AxiosTouchController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,KAAK,kBAAkB,EAAmB,MAAM,sBAAsB,CAAC;AAChF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEzD,qBAAa,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAChD,YAAW,gBAAgB,CAAC,CAAC,CAAC;IAG5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAGnC,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,KAAK;IAYP,aAAa,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE,GAAG,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3D,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAOtE"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=AxiosTouchController.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AxiosTouchController.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/adapters/AxiosTouchController.test.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"IButtonController.d.ts","sourceRoot":"","sources":["../../../../../src/internal/core/IButtonController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ITouchController.d.ts","sourceRoot":"","sources":["../../../../../src/internal/core/ITouchController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACzD,aAAa,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE"}