@fluentui-react-native/desktop-driver 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/.cache/tsconfig.tsbuildinfo +1 -0
  2. package/AGENTS.md +68 -0
  3. package/CHANGELOG.md +16 -0
  4. package/PLAN.md +1394 -0
  5. package/README.md +223 -0
  6. package/SPEC.md +105 -0
  7. package/config/cli.cjs +8 -0
  8. package/jest.config.cjs +9 -0
  9. package/lib/agent/DesktopAgent.d.ts +56 -0
  10. package/lib/agent/DesktopAgent.d.ts.map +1 -0
  11. package/lib/agent/DesktopAgent.js +118 -0
  12. package/lib/agent/DesktopAgent.js.map +1 -0
  13. package/lib/agent/DesktopAgent.test.d.ts +2 -0
  14. package/lib/agent/DesktopAgent.test.d.ts.map +1 -0
  15. package/lib/agent/DesktopAgent.test.js +97 -0
  16. package/lib/agent/DesktopAgent.test.js.map +1 -0
  17. package/lib/agent/agent.contract.cjs +66 -0
  18. package/lib/agent/agent.contract.cjs.map +1 -0
  19. package/lib/agent/agent.contract.d.cts +2 -0
  20. package/lib/agent/agent.contract.d.cts.map +1 -0
  21. package/lib/agent/index.d.ts +3 -0
  22. package/lib/agent/index.d.ts.map +1 -0
  23. package/lib/agent/index.js +2 -0
  24. package/lib/agent/index.js.map +1 -0
  25. package/lib/artifacts/ArtifactManager.d.ts +13 -0
  26. package/lib/artifacts/ArtifactManager.d.ts.map +1 -0
  27. package/lib/artifacts/ArtifactManager.js +88 -0
  28. package/lib/artifacts/ArtifactManager.js.map +1 -0
  29. package/lib/artifacts/ArtifactManager.test.d.ts +2 -0
  30. package/lib/artifacts/ArtifactManager.test.d.ts.map +1 -0
  31. package/lib/artifacts/ArtifactManager.test.js +19 -0
  32. package/lib/artifacts/ArtifactManager.test.js.map +1 -0
  33. package/lib/artifacts/index.d.ts +2 -0
  34. package/lib/artifacts/index.d.ts.map +1 -0
  35. package/lib/artifacts/index.js +2 -0
  36. package/lib/artifacts/index.js.map +1 -0
  37. package/lib/authoring/index.d.ts +4 -0
  38. package/lib/authoring/index.d.ts.map +1 -0
  39. package/lib/authoring/index.js +2 -0
  40. package/lib/authoring/index.js.map +1 -0
  41. package/lib/authoring/results.d.ts +43 -0
  42. package/lib/authoring/results.d.ts.map +1 -0
  43. package/lib/authoring/results.js +2 -0
  44. package/lib/authoring/results.js.map +1 -0
  45. package/lib/authoring/storyTests.d.ts +81 -0
  46. package/lib/authoring/storyTests.d.ts.map +1 -0
  47. package/lib/authoring/storyTests.js +272 -0
  48. package/lib/authoring/storyTests.js.map +1 -0
  49. package/lib/authoring/storyTests.test.d.ts +2 -0
  50. package/lib/authoring/storyTests.test.d.ts.map +1 -0
  51. package/lib/authoring/storyTests.test.js +46 -0
  52. package/lib/authoring/storyTests.test.js.map +1 -0
  53. package/lib/cli/DesktopDriverCli.test.d.ts +2 -0
  54. package/lib/cli/DesktopDriverCli.test.d.ts.map +1 -0
  55. package/lib/cli/DesktopDriverCli.test.js +141 -0
  56. package/lib/cli/DesktopDriverCli.test.js.map +1 -0
  57. package/lib/cli/createDesktopDriverCommand.d.ts +8 -0
  58. package/lib/cli/createDesktopDriverCommand.d.ts.map +1 -0
  59. package/lib/cli/createDesktopDriverCommand.js +242 -0
  60. package/lib/cli/createDesktopDriverCommand.js.map +1 -0
  61. package/lib/cli/index.d.ts +3 -0
  62. package/lib/cli/index.d.ts.map +1 -0
  63. package/lib/cli/index.js +2 -0
  64. package/lib/cli/index.js.map +1 -0
  65. package/lib/client/DesktopDriverClient.d.ts +60 -0
  66. package/lib/client/DesktopDriverClient.d.ts.map +1 -0
  67. package/lib/client/DesktopDriverClient.js +155 -0
  68. package/lib/client/DesktopDriverClient.js.map +1 -0
  69. package/lib/client/index.d.ts +3 -0
  70. package/lib/client/index.d.ts.map +1 -0
  71. package/lib/client/index.js +2 -0
  72. package/lib/client/index.js.map +1 -0
  73. package/lib/host/types.d.ts +153 -0
  74. package/lib/host/types.d.ts.map +1 -0
  75. package/lib/host/types.js +2 -0
  76. package/lib/host/types.js.map +1 -0
  77. package/lib/hosts/fake/FakeDesktopHost.d.ts +72 -0
  78. package/lib/hosts/fake/FakeDesktopHost.d.ts.map +1 -0
  79. package/lib/hosts/fake/FakeDesktopHost.js +452 -0
  80. package/lib/hosts/fake/FakeDesktopHost.js.map +1 -0
  81. package/lib/index.d.ts +23 -0
  82. package/lib/index.d.ts.map +1 -0
  83. package/lib/index.js +11 -0
  84. package/lib/index.js.map +1 -0
  85. package/lib/protocol/actions.d.ts +11 -0
  86. package/lib/protocol/actions.d.ts.map +1 -0
  87. package/lib/protocol/actions.js +137 -0
  88. package/lib/protocol/actions.js.map +1 -0
  89. package/lib/protocol/capabilities.d.ts +11 -0
  90. package/lib/protocol/capabilities.d.ts.map +1 -0
  91. package/lib/protocol/capabilities.js +103 -0
  92. package/lib/protocol/capabilities.js.map +1 -0
  93. package/lib/protocol/constants.d.ts +2 -0
  94. package/lib/protocol/constants.d.ts.map +1 -0
  95. package/lib/protocol/constants.js +2 -0
  96. package/lib/protocol/constants.js.map +1 -0
  97. package/lib/protocol/errors.d.ts +37 -0
  98. package/lib/protocol/errors.d.ts.map +1 -0
  99. package/lib/protocol/errors.js +66 -0
  100. package/lib/protocol/errors.js.map +1 -0
  101. package/lib/protocol/timeouts.d.ts +2 -0
  102. package/lib/protocol/timeouts.d.ts.map +1 -0
  103. package/lib/protocol/timeouts.js +23 -0
  104. package/lib/protocol/timeouts.js.map +1 -0
  105. package/lib/protocol/types.d.ts +46 -0
  106. package/lib/protocol/types.d.ts.map +1 -0
  107. package/lib/protocol/types.js +2 -0
  108. package/lib/protocol/types.js.map +1 -0
  109. package/lib/runner/StoryTestRunner.d.ts +38 -0
  110. package/lib/runner/StoryTestRunner.d.ts.map +1 -0
  111. package/lib/runner/StoryTestRunner.js +497 -0
  112. package/lib/runner/StoryTestRunner.js.map +1 -0
  113. package/lib/runner/StoryTestRunner.test.d.ts +2 -0
  114. package/lib/runner/StoryTestRunner.test.d.ts.map +1 -0
  115. package/lib/runner/StoryTestRunner.test.js +349 -0
  116. package/lib/runner/StoryTestRunner.test.js.map +1 -0
  117. package/lib/runner/index.d.ts +3 -0
  118. package/lib/runner/index.d.ts.map +1 -0
  119. package/lib/runner/index.js +2 -0
  120. package/lib/runner/index.js.map +1 -0
  121. package/lib/server/SessionManager.d.ts +52 -0
  122. package/lib/server/SessionManager.d.ts.map +1 -0
  123. package/lib/server/SessionManager.js +208 -0
  124. package/lib/server/SessionManager.js.map +1 -0
  125. package/lib/server/TargetRegistry.d.ts +9 -0
  126. package/lib/server/TargetRegistry.d.ts.map +1 -0
  127. package/lib/server/TargetRegistry.js +24 -0
  128. package/lib/server/TargetRegistry.js.map +1 -0
  129. package/lib/server/createDesktopDriverServer.d.ts +19 -0
  130. package/lib/server/createDesktopDriverServer.d.ts.map +1 -0
  131. package/lib/server/createDesktopDriverServer.js +609 -0
  132. package/lib/server/createDesktopDriverServer.js.map +1 -0
  133. package/lib/server/desktopDriver.test.d.ts +2 -0
  134. package/lib/server/desktopDriver.test.d.ts.map +1 -0
  135. package/lib/server/desktopDriver.test.js +389 -0
  136. package/lib/server/desktopDriver.test.js.map +1 -0
  137. package/lib/server/index.d.ts +6 -0
  138. package/lib/server/index.d.ts.map +1 -0
  139. package/lib/server/index.js +4 -0
  140. package/lib/server/index.js.map +1 -0
  141. package/lib/server/webdriverio.contract.cjs +35 -0
  142. package/lib/server/webdriverio.contract.cjs.map +1 -0
  143. package/lib/server/webdriverio.contract.d.cts +2 -0
  144. package/lib/server/webdriverio.contract.d.cts.map +1 -0
  145. package/lib/server/webdriverio.test.d.ts +2 -0
  146. package/lib/server/webdriverio.test.d.ts.map +1 -0
  147. package/lib/server/webdriverio.test.js +40 -0
  148. package/lib/server/webdriverio.test.js.map +1 -0
  149. package/lib/storybook.d.ts +36 -0
  150. package/lib/storybook.d.ts.map +1 -0
  151. package/lib/storybook.js +2 -0
  152. package/lib/storybook.js.map +1 -0
  153. package/lib/testing/FakeStoryOrchestrator.d.ts +21 -0
  154. package/lib/testing/FakeStoryOrchestrator.d.ts.map +1 -0
  155. package/lib/testing/FakeStoryOrchestrator.js +44 -0
  156. package/lib/testing/FakeStoryOrchestrator.js.map +1 -0
  157. package/lib/testing/fakeStoryElements.d.ts +4 -0
  158. package/lib/testing/fakeStoryElements.d.ts.map +1 -0
  159. package/lib/testing/fakeStoryElements.js +143 -0
  160. package/lib/testing/fakeStoryElements.js.map +1 -0
  161. package/lib/testing/fakeStoryElements.test.d.ts +2 -0
  162. package/lib/testing/fakeStoryElements.test.d.ts.map +1 -0
  163. package/lib/testing/fakeStoryElements.test.js +38 -0
  164. package/lib/testing/fakeStoryElements.test.js.map +1 -0
  165. package/lib/testing/index.d.ts +7 -0
  166. package/lib/testing/index.d.ts.map +1 -0
  167. package/lib/testing/index.js +5 -0
  168. package/lib/testing/index.js.map +1 -0
  169. package/lib/testing/protocolHarness.d.ts +17 -0
  170. package/lib/testing/protocolHarness.d.ts.map +1 -0
  171. package/lib/testing/protocolHarness.js +46 -0
  172. package/lib/testing/protocolHarness.js.map +1 -0
  173. package/lib/wdio/DesktopWebdriver.d.ts +47 -0
  174. package/lib/wdio/DesktopWebdriver.d.ts.map +1 -0
  175. package/lib/wdio/DesktopWebdriver.js +76 -0
  176. package/lib/wdio/DesktopWebdriver.js.map +1 -0
  177. package/lib/wdio/DesktopWebdriver.test.d.ts +2 -0
  178. package/lib/wdio/DesktopWebdriver.test.d.ts.map +1 -0
  179. package/lib/wdio/DesktopWebdriver.test.js +74 -0
  180. package/lib/wdio/DesktopWebdriver.test.js.map +1 -0
  181. package/lib/wdio/index.d.ts +3 -0
  182. package/lib/wdio/index.d.ts.map +1 -0
  183. package/lib/wdio/index.js +2 -0
  184. package/lib/wdio/index.js.map +1 -0
  185. package/lib/wdio/wdioRunner.contract.cjs +64 -0
  186. package/lib/wdio/wdioRunner.contract.cjs.map +1 -0
  187. package/lib/wdio/wdioRunner.contract.d.cts +2 -0
  188. package/lib/wdio/wdioRunner.contract.d.cts.map +1 -0
  189. package/package.json +96 -0
  190. package/src/agent/DesktopAgent.test.ts +102 -0
  191. package/src/agent/DesktopAgent.ts +170 -0
  192. package/src/agent/agent.contract.cjs +32 -0
  193. package/src/agent/index.ts +8 -0
  194. package/src/artifacts/ArtifactManager.test.ts +20 -0
  195. package/src/artifacts/ArtifactManager.ts +105 -0
  196. package/src/artifacts/index.ts +1 -0
  197. package/src/authoring/index.ts +26 -0
  198. package/src/authoring/results.ts +47 -0
  199. package/src/authoring/storyTests.test.ts +58 -0
  200. package/src/authoring/storyTests.ts +345 -0
  201. package/src/cli/DesktopDriverCli.test.ts +150 -0
  202. package/src/cli/createDesktopDriverCommand.ts +290 -0
  203. package/src/cli/index.ts +2 -0
  204. package/src/client/DesktopDriverClient.ts +218 -0
  205. package/src/client/index.ts +2 -0
  206. package/src/host/types.ts +158 -0
  207. package/src/hosts/fake/FakeDesktopHost.ts +558 -0
  208. package/src/index.ts +101 -0
  209. package/src/protocol/actions.ts +163 -0
  210. package/src/protocol/capabilities.ts +129 -0
  211. package/src/protocol/constants.ts +1 -0
  212. package/src/protocol/errors.ts +76 -0
  213. package/src/protocol/timeouts.ts +26 -0
  214. package/src/protocol/types.ts +55 -0
  215. package/src/runner/StoryTestRunner.test.ts +362 -0
  216. package/src/runner/StoryTestRunner.ts +624 -0
  217. package/src/runner/index.ts +9 -0
  218. package/src/server/SessionManager.ts +302 -0
  219. package/src/server/TargetRegistry.ts +29 -0
  220. package/src/server/createDesktopDriverServer.ts +775 -0
  221. package/src/server/desktopDriver.test.ts +421 -0
  222. package/src/server/index.ts +5 -0
  223. package/src/server/webdriverio.contract.cjs +38 -0
  224. package/src/server/webdriverio.test.ts +41 -0
  225. package/src/storybook.ts +40 -0
  226. package/src/testing/FakeStoryOrchestrator.ts +55 -0
  227. package/src/testing/fakeStoryElements.test.ts +40 -0
  228. package/src/testing/fakeStoryElements.ts +167 -0
  229. package/src/testing/index.ts +6 -0
  230. package/src/testing/protocolHarness.ts +66 -0
  231. package/src/wdio/DesktopWebdriver.test.ts +76 -0
  232. package/src/wdio/DesktopWebdriver.ts +130 -0
  233. package/src/wdio/index.ts +2 -0
  234. package/src/wdio/wdioRunner.contract.cjs +30 -0
  235. package/tsconfig.json +15 -0
@@ -0,0 +1,272 @@
1
+ import { createInputState, parseActionSequences } from '../protocol/actions.js';
2
+ export const desktopStoryPlatforms = ['macos', 'windows', 'win32'];
3
+ export const desktopStoryCapabilities = [
4
+ 'accessibility-click',
5
+ 'element-screenshot',
6
+ 'focus',
7
+ 'keyboard',
8
+ 'physical-click',
9
+ 'screenshot',
10
+ 'wheel',
11
+ ];
12
+ export const desktopBy = {
13
+ accessibleName: (accessibleName) => ({ accessibleName }),
14
+ role: (role, name) => ({ role, ...(name ? { name } : {}) }),
15
+ testId: (testId) => ({ testId }),
16
+ text: (text) => ({ text }),
17
+ };
18
+ export function defineDesktopStoryTests(plan) {
19
+ return validateDesktopStoryTests(plan);
20
+ }
21
+ export function validateDesktopStoryTests(value, source = 'desktopDriver') {
22
+ const plan = requireObject(value, source);
23
+ requireExactKeys(plan, ['portable', 'tests', 'version'], source);
24
+ if (plan.version !== 1) {
25
+ throw new TypeError(`${source}.version must be 1.`);
26
+ }
27
+ if (plan.portable !== undefined && typeof plan.portable !== 'boolean') {
28
+ throw new TypeError(`${source}.portable must be a boolean when provided.`);
29
+ }
30
+ if (!Array.isArray(plan.tests)) {
31
+ throw new TypeError(`${source}.tests must be an array.`);
32
+ }
33
+ const ids = new Set();
34
+ for (const [index, value] of plan.tests.entries()) {
35
+ validateTest(value, `${source}.tests[${index}]`, ids);
36
+ }
37
+ assertJsonValue(value, source);
38
+ return value;
39
+ }
40
+ function validateTest(value, source, ids) {
41
+ const test = requireObject(value, source);
42
+ requireExactKeys(test, ['id', 'platforms', 'requires', 'steps', 'title'], source);
43
+ if (typeof test.id !== 'string' || !test.id) {
44
+ throw new TypeError(`${source}.id must be a non-empty string.`);
45
+ }
46
+ if (ids.has(test.id)) {
47
+ throw new TypeError(`${source} contains duplicate test id "${test.id}".`);
48
+ }
49
+ ids.add(test.id);
50
+ if (test.title !== undefined && (typeof test.title !== 'string' || !test.title)) {
51
+ throw new TypeError(`${source}.title must be a non-empty string when provided.`);
52
+ }
53
+ validateEnumArray(test.platforms, desktopStoryPlatforms, `${source}.platforms`);
54
+ validateEnumArray(test.requires, desktopStoryCapabilities, `${source}.requires`);
55
+ if (!Array.isArray(test.steps) || test.steps.length === 0) {
56
+ throw new TypeError(`${source}.steps must be a non-empty array.`);
57
+ }
58
+ for (const [index, step] of test.steps.entries()) {
59
+ validateStep(step, `${source}.steps[${index}]`);
60
+ }
61
+ }
62
+ function validateStep(value, source) {
63
+ const step = requireObject(value, source);
64
+ if ('expect' in step) {
65
+ requireExactKeys(step, ['expect'], source);
66
+ validateExpectation(step.expect, `${source}.expect`);
67
+ return;
68
+ }
69
+ if (typeof step.action !== 'string') {
70
+ throw new TypeError(`${source}.action must be a supported action string.`);
71
+ }
72
+ switch (step.action) {
73
+ case 'actions':
74
+ requireExactKeys(step, ['action', 'sequences'], source);
75
+ if (!Array.isArray(step.sequences) || step.sequences.length === 0) {
76
+ throw new TypeError(`${source}.sequences must be a non-empty array.`);
77
+ }
78
+ try {
79
+ parseActionSequences(step.sequences, createInputState());
80
+ }
81
+ catch (error) {
82
+ throw new TypeError(`${source}.sequences are invalid: ${error.message}`, { cause: error });
83
+ }
84
+ return;
85
+ case 'clear':
86
+ case 'click':
87
+ case 'doubleClick':
88
+ requireExactKeys(step, ['action', 'target'], source);
89
+ validateSelector(step.target, `${source}.target`);
90
+ return;
91
+ case 'keys':
92
+ requireExactKeys(step, ['action', 'value'], source);
93
+ if (!Array.isArray(step.value) || !step.value.every((key) => typeof key === 'string' && key.length > 0)) {
94
+ throw new TypeError(`${source}.value must be a non-empty string array.`);
95
+ }
96
+ return;
97
+ case 'note':
98
+ requireExactKeys(step, ['action', 'message'], source);
99
+ requireNonEmptyString(step.message, `${source}.message`);
100
+ return;
101
+ case 'screenshot':
102
+ requireExactKeys(step, ['action', 'name', 'target'], source);
103
+ requireNonEmptyString(step.name, `${source}.name`);
104
+ if (step.target !== undefined) {
105
+ validateSelector(step.target, `${source}.target`);
106
+ }
107
+ return;
108
+ case 'scroll':
109
+ requireExactKeys(step, ['action', 'deltaX', 'deltaY', 'target'], source);
110
+ requireFiniteNumber(step.deltaY, `${source}.deltaY`);
111
+ if (step.deltaX !== undefined) {
112
+ requireFiniteNumber(step.deltaX, `${source}.deltaX`);
113
+ }
114
+ if (step.target !== undefined) {
115
+ validateSelector(step.target, `${source}.target`);
116
+ }
117
+ return;
118
+ case 'setArgs':
119
+ requireExactKeys(step, ['action', 'args'], source);
120
+ requireObject(step.args, `${source}.args`);
121
+ return;
122
+ case 'source':
123
+ requireExactKeys(step, ['action', 'name'], source);
124
+ requireNonEmptyString(step.name, `${source}.name`);
125
+ return;
126
+ case 'type':
127
+ requireExactKeys(step, ['action', 'target', 'text'], source);
128
+ validateSelector(step.target, `${source}.target`);
129
+ if (typeof step.text !== 'string') {
130
+ throw new TypeError(`${source}.text must be a string.`);
131
+ }
132
+ return;
133
+ case 'wait':
134
+ requireExactKeys(step, ['action', 'target', 'timeoutMs', 'until'], source);
135
+ if (step.target !== undefined) {
136
+ validateSelector(step.target, `${source}.target`);
137
+ }
138
+ if (step.until !== undefined) {
139
+ validateExpectation(step.until, `${source}.until`);
140
+ }
141
+ if (step.target === undefined && step.until === undefined) {
142
+ throw new TypeError(`${source} requires "target" or "until".`);
143
+ }
144
+ if (step.timeoutMs !== undefined && (!Number.isInteger(step.timeoutMs) || step.timeoutMs < 0)) {
145
+ throw new TypeError(`${source}.timeoutMs must be a non-negative integer.`);
146
+ }
147
+ return;
148
+ default:
149
+ throw new TypeError(`${source}.action "${step.action}" is not supported.`);
150
+ }
151
+ }
152
+ function validateExpectation(value, source) {
153
+ const expectation = requireObject(value, source);
154
+ requireExactKeys(expectation, ['state', 'target', 'value'], source);
155
+ if (typeof expectation.state !== 'string' ||
156
+ ![
157
+ 'accessibleName',
158
+ 'checked',
159
+ 'count',
160
+ 'displayed',
161
+ 'enabled',
162
+ 'expanded',
163
+ 'exists',
164
+ 'focused',
165
+ 'role',
166
+ 'selected',
167
+ 'text',
168
+ 'value',
169
+ ].includes(expectation.state)) {
170
+ throw new TypeError(`${source}.state is not supported.`);
171
+ }
172
+ validateSelector(expectation.target, `${source}.target`);
173
+ if (expectation.value !== undefined && !['boolean', 'number', 'string'].includes(typeof expectation.value)) {
174
+ throw new TypeError(`${source}.value must be a boolean, number, or string.`);
175
+ }
176
+ if (typeof expectation.value === 'number' && !Number.isFinite(expectation.value)) {
177
+ throw new TypeError(`${source}.value must be finite.`);
178
+ }
179
+ if (expectation.state === 'count' && typeof expectation.value !== 'number') {
180
+ throw new TypeError(`${source}.value must be a number for a count assertion.`);
181
+ }
182
+ if ((expectation.state === 'accessibleName' ||
183
+ expectation.state === 'role' ||
184
+ expectation.state === 'text' ||
185
+ expectation.state === 'value') &&
186
+ typeof expectation.value !== 'string') {
187
+ throw new TypeError(`${source}.value must be a string for a ${expectation.state} assertion.`);
188
+ }
189
+ if ((expectation.state === 'checked' ||
190
+ expectation.state === 'displayed' ||
191
+ expectation.state === 'enabled' ||
192
+ expectation.state === 'expanded' ||
193
+ expectation.state === 'exists' ||
194
+ expectation.state === 'focused' ||
195
+ expectation.state === 'selected') &&
196
+ expectation.value !== undefined &&
197
+ typeof expectation.value !== 'boolean' &&
198
+ !(expectation.state === 'checked' && expectation.value === 'mixed')) {
199
+ throw new TypeError(`${source}.value must be a boolean for a ${expectation.state} assertion.`);
200
+ }
201
+ }
202
+ function validateSelector(value, source) {
203
+ const selector = requireObject(value, source);
204
+ const selectorKeys = ['accessibleName', 'role', 'testId', 'text'].filter((key) => selector[key] !== undefined);
205
+ if (selectorKeys.length !== 1) {
206
+ throw new TypeError(`${source} must define exactly one selector strategy.`);
207
+ }
208
+ const strategy = selectorKeys[0];
209
+ requireNonEmptyString(selector[strategy], `${source}.${strategy}`);
210
+ if (strategy === 'role') {
211
+ requireExactKeys(selector, ['name', 'role'], source);
212
+ if (selector.name !== undefined) {
213
+ requireNonEmptyString(selector.name, `${source}.name`);
214
+ }
215
+ }
216
+ else {
217
+ requireExactKeys(selector, [strategy], source);
218
+ }
219
+ }
220
+ function validateEnumArray(value, allowed, source) {
221
+ if (value === undefined) {
222
+ return;
223
+ }
224
+ if (!Array.isArray(value) || !value.every((item) => typeof item === 'string' && allowed.includes(item))) {
225
+ throw new TypeError(`${source} contains an unsupported value.`);
226
+ }
227
+ }
228
+ function requireExactKeys(value, allowed, source) {
229
+ const unknown = Object.keys(value).filter((key) => !allowed.includes(key));
230
+ if (unknown.length > 0) {
231
+ throw new TypeError(`${source} contains unknown field "${unknown[0]}".`);
232
+ }
233
+ }
234
+ function requireNonEmptyString(value, source) {
235
+ if (typeof value !== 'string' || !value) {
236
+ throw new TypeError(`${source} must be a non-empty string.`);
237
+ }
238
+ }
239
+ function requireFiniteNumber(value, source) {
240
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
241
+ throw new TypeError(`${source} must be a finite number.`);
242
+ }
243
+ }
244
+ function requireObject(value, source) {
245
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
246
+ throw new TypeError(`${source} must be an object.`);
247
+ }
248
+ return value;
249
+ }
250
+ function assertJsonValue(value, source) {
251
+ if (typeof value === 'number') {
252
+ if (!Number.isFinite(value)) {
253
+ throw new TypeError(`${source} must contain only finite numbers.`);
254
+ }
255
+ return;
256
+ }
257
+ if (value === null || typeof value === 'boolean' || typeof value === 'string') {
258
+ return;
259
+ }
260
+ if (Array.isArray(value)) {
261
+ value.forEach((item, index) => assertJsonValue(item, `${source}[${index}]`));
262
+ return;
263
+ }
264
+ if (typeof value === 'object') {
265
+ for (const [key, item] of Object.entries(value)) {
266
+ assertJsonValue(item, `${source}.${key}`);
267
+ }
268
+ return;
269
+ }
270
+ throw new TypeError(`${source} must contain only JSON-serializable values.`);
271
+ }
272
+ //# sourceMappingURL=storyTests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyTests.js","sourceRoot":"","sources":["../../src/authoring/storyTests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=storyTests.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyTests.test.d.ts","sourceRoot":"","sources":["../../src/authoring/storyTests.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { validateDesktopStoryTests } from './storyTests.js';
2
+ describe('validateDesktopStoryTests', () => {
3
+ test('accepts a serializable versioned plan', () => {
4
+ const plan = {
5
+ version: 1,
6
+ tests: [{ id: 'click', steps: [{ action: 'click', target: { testId: 'button' } }] }],
7
+ };
8
+ expect(validateDesktopStoryTests(plan)).toBe(plan);
9
+ });
10
+ test('rejects duplicate ids and executable values', () => {
11
+ expect(() => validateDesktopStoryTests({
12
+ version: 1,
13
+ tests: [
14
+ { id: 'duplicate', steps: [{ action: 'note', message: 'first' }] },
15
+ { id: 'duplicate', steps: [{ action: 'note', message: 'second' }] },
16
+ ],
17
+ })).toThrow('duplicate test id');
18
+ expect(() => validateDesktopStoryTests({
19
+ version: 1,
20
+ tests: [{ id: 'function', steps: [{ action: 'setArgs', args: { run: () => undefined } }] }],
21
+ })).toThrow('JSON-serializable');
22
+ });
23
+ test('rejects non-finite numbers before digest serialization', () => {
24
+ expect(() => validateDesktopStoryTests({
25
+ version: 1,
26
+ tests: [
27
+ {
28
+ id: 'non-finite',
29
+ steps: [{ action: 'setArgs', args: { invalid: Number.POSITIVE_INFINITY } }],
30
+ },
31
+ ],
32
+ })).toThrow('finite numbers');
33
+ });
34
+ test('rejects malformed authored W3C action sequences', () => {
35
+ expect(() => validateDesktopStoryTests({
36
+ version: 1,
37
+ tests: [
38
+ {
39
+ id: 'invalid-actions',
40
+ steps: [{ action: 'actions', sequences: [{ id: 'bad', type: 'key', actions: [{ type: 'pointerDown' }] }] }],
41
+ },
42
+ ],
43
+ })).toThrow('sequences are invalid');
44
+ });
45
+ });
46
+ //# sourceMappingURL=storyTests.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storyTests.test.js","sourceRoot":"","sources":["../../src/authoring/storyTests.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG;YACX,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;SAC5E,CAAC;QAEX,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,OAAO,EAAE,CAAC;YACV,KAAK,EAAE;gBACL,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE;gBAClE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;aACpE;SACF,CAAC,CACH,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC;SAC5F,CAAC,CACH,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,OAAO,EAAE,CAAC;YACV,KAAK,EAAE;gBACL;oBACE,EAAE,EAAE,YAAY;oBAChB,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,iBAAiB,EAAE,EAAE,CAAC;iBAC5E;aACF;SACF,CAAC,CACH,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,GAAG,EAAE,CACV,yBAAyB,CAAC;YACxB,OAAO,EAAE,CAAC;YACV,KAAK,EAAE;gBACL;oBACE,EAAE,EAAE,iBAAiB;oBACrB,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;iBAC5G;aACF;SACF,CAAC,CACH,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=DesktopDriverCli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesktopDriverCli.test.d.ts","sourceRoot":"","sources":["../../src/cli/DesktopDriverCli.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,141 @@
1
+ import { spawn } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import { createServer } from 'node:net';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ jest.setTimeout(30_000);
7
+ describe('desktop-driver CLI', () => {
8
+ test('serves, lists, runs, and describes a fake authored plan as JSON', async () => {
9
+ const port = await getAvailablePort();
10
+ const temporaryDirectory = fs.mkdtempSync(path.join(os.tmpdir(), 'desktop-driver-cli-'));
11
+ const artifactsRoot = path.join(temporaryDirectory, 'artifacts');
12
+ const manifestPath = path.join(temporaryDirectory, 'manifest.json');
13
+ const manifest = {
14
+ endpoint: 'windows',
15
+ entries: [
16
+ {
17
+ id: 'components-button--default',
18
+ name: 'Default',
19
+ packageName: '@fluentui-react-native/components',
20
+ sourcePath: 'src/components/button/button.stories.tsx',
21
+ tags: ['e2e', 'story'],
22
+ tests: {
23
+ version: 1,
24
+ tests: [
25
+ {
26
+ id: 'cli-plan',
27
+ steps: [{ expect: { state: 'enabled', target: { testId: 'button-primary' }, value: true } }],
28
+ },
29
+ ],
30
+ },
31
+ title: 'Components/Button',
32
+ },
33
+ ],
34
+ platformManifestDigest: 'platform-digest',
35
+ portablePlanDigest: 'portable-digest',
36
+ schemaVersion: 1,
37
+ };
38
+ fs.writeFileSync(manifestPath, JSON.stringify(manifest));
39
+ const server = spawnCli(['serve', '--port', String(port), '--target', 'cli-target', '--manifest', manifestPath]);
40
+ try {
41
+ await waitForResponse(loopbackUrl(port, '/status'));
42
+ const url = loopbackUrl(port, '');
43
+ const stories = await runCli(['stories', 'list', '--url', url, '--target', 'cli-target']);
44
+ expect(stories).toMatchObject({ entries: [{ id: 'components-button--default' }] });
45
+ const result = await runCli([
46
+ 'stories',
47
+ 'run',
48
+ '--url',
49
+ url,
50
+ '--target',
51
+ 'cli-target',
52
+ '--artifacts',
53
+ artifactsRoot,
54
+ '--test',
55
+ 'cli-plan',
56
+ ]);
57
+ expect(result).toMatchObject({ status: 'passed', tests: [{ testId: 'cli-plan' }] });
58
+ const tree = await runCli([
59
+ 'agent',
60
+ 'describe',
61
+ '--url',
62
+ url,
63
+ '--target',
64
+ 'cli-target',
65
+ '--artifacts',
66
+ artifactsRoot,
67
+ '--scope',
68
+ 'story',
69
+ ]);
70
+ expect(tree).toMatchObject([{ testId: 'story-root' }]);
71
+ }
72
+ finally {
73
+ server.kill();
74
+ await waitForExit(server);
75
+ fs.rmSync(temporaryDirectory, { force: true, recursive: true });
76
+ }
77
+ });
78
+ });
79
+ function spawnCli(args) {
80
+ return spawn(process.execPath, [path.resolve(__dirname, '../../config/cli.cjs'), ...args], {
81
+ stdio: ['ignore', 'pipe', 'pipe'],
82
+ });
83
+ }
84
+ function runCli(args) {
85
+ return new Promise((resolve, reject) => {
86
+ const child = spawnCli(args);
87
+ const stdout = [];
88
+ const stderr = [];
89
+ child.stdout.on('data', (chunk) => stdout.push(chunk));
90
+ child.stderr.on('data', (chunk) => stderr.push(chunk));
91
+ child.once('error', reject);
92
+ child.once('exit', (code) => {
93
+ if (code !== 0) {
94
+ reject(new Error(Buffer.concat(stderr).toString('utf8') || `Desktop Driver CLI exited with code ${code}.`));
95
+ return;
96
+ }
97
+ resolve(JSON.parse(Buffer.concat(stdout).toString('utf8')));
98
+ });
99
+ });
100
+ }
101
+ function getAvailablePort() {
102
+ return new Promise((resolve, reject) => {
103
+ const server = createServer();
104
+ server.once('error', reject);
105
+ server.listen(0, '127.0.0.1', () => {
106
+ const address = server.address();
107
+ if (!address || typeof address === 'string') {
108
+ reject(new Error('Could not allocate a loopback port.'));
109
+ return;
110
+ }
111
+ server.close((error) => (error ? reject(error) : resolve(address.port)));
112
+ });
113
+ });
114
+ }
115
+ async function waitForResponse(url) {
116
+ const deadline = Date.now() + 20_000;
117
+ do {
118
+ try {
119
+ const response = await fetch(url);
120
+ if (response.ok) {
121
+ return;
122
+ }
123
+ }
124
+ catch {
125
+ // Retry until the bounded startup deadline.
126
+ }
127
+ await new Promise((resolve) => setTimeout(resolve, 100));
128
+ } while (Date.now() < deadline);
129
+ throw new Error(`Timed out waiting for ${url}.`);
130
+ }
131
+ function waitForExit(child) {
132
+ if (child.exitCode !== null || child.signalCode !== null) {
133
+ return Promise.resolve();
134
+ }
135
+ return new Promise((resolve) => child.once('exit', () => resolve()));
136
+ }
137
+ function loopbackUrl(port, pathname) {
138
+ // eslint-disable-next-line @microsoft/sdl/no-insecure-url -- test-only loopback service
139
+ return `http://127.0.0.1:${port}${pathname}`;
140
+ }
141
+ //# sourceMappingURL=DesktopDriverCli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesktopDriverCli.test.js","sourceRoot":"","sources":["../../src/cli/DesktopDriverCli.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAExB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACtC,MAAM,kBAAkB,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACzF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;QACjE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAyB;YACrC,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE;gBACP;oBACE,EAAE,EAAE,4BAA4B;oBAChC,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,mCAAmC;oBAChD,UAAU,EAAE,0CAA0C;oBACtD,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;oBACtB,KAAK,EAAE;wBACL,OAAO,EAAE,CAAC;wBACV,KAAK,EAAE;4BACL;gCACE,EAAE,EAAE,UAAU;gCACd,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;6BAC7F;yBACF;qBACF;oBACD,KAAK,EAAE,mBAAmB;iBAC3B;aACF;YACD,sBAAsB,EAAE,iBAAiB;YACzC,kBAAkB,EAAE,iBAAiB;YACrC,aAAa,EAAE,CAAC;SACjB,CAAC;QACF,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;QACjH,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;YAC1F,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,4BAA4B,EAAE,CAAC,EAAE,CAAC,CAAC;YAEnF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;gBAC1B,SAAS;gBACT,KAAK;gBACL,OAAO;gBACP,GAAG;gBACH,UAAU;gBACV,YAAY;gBACZ,aAAa;gBACb,aAAa;gBACb,QAAQ;gBACR,UAAU;aACX,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAEpF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC;gBACxB,OAAO;gBACP,UAAU;gBACV,OAAO;gBACP,GAAG;gBACH,UAAU;gBACV,YAAY;gBACZ,aAAa;gBACb,aAAa;gBACb,SAAS;gBACT,OAAO;aACR,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;YAC1B,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,IAAuB;IACvC,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,sBAAsB,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE;QACzF,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,MAAM,CAAC,IAAuB;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/D,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,uCAAuC,IAAI,GAAG,CAAC,CAAC,CAAC;gBAC5G,OAAO;YACT,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA4B,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBACzD,OAAO;YACT,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;IACrC,GAAG,CAAC;QACF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;QAC9C,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE;IAChC,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,WAAW,CAAC,KAA+B;IAClD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACzD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,QAAgB;IACjD,wFAAwF;IACxF,OAAO,oBAAoB,IAAI,GAAG,QAAQ,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ export type CreateDesktopDriverCommandOptions = {
3
+ stderr?: Pick<NodeJS.WriteStream, 'write'>;
4
+ stdout?: Pick<NodeJS.WriteStream, 'write'>;
5
+ };
6
+ export declare function createDesktopDriverCommand(options?: CreateDesktopDriverCommandOptions): Command;
7
+ export declare function runDesktopDriverCli(argv?: readonly string[]): Promise<void>;
8
+ //# sourceMappingURL=createDesktopDriverCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createDesktopDriverCommand.d.ts","sourceRoot":"","sources":["../../src/cli/createDesktopDriverCommand.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AA2B5C,MAAM,MAAM,iCAAiC,GAAG;IAC9C,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;CAC5C,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,OAAO,GAAE,iCAAsC,GAAG,OAAO,CAkKnG;AAED,wBAAsB,mBAAmB,CAAC,IAAI,GAAE,SAAS,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/F"}