@ethlete/cli 3.0.0-next.26 → 3.0.0-next.27

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 (557) hide show
  1. package/CHANGELOG.md +328 -0
  2. package/build-info.json +1 -0
  3. package/design/define-call.ts +72 -30
  4. package/design/define-part.ts +37 -4
  5. package/design/icon-sheet.ts +1 -1
  6. package/design/interaction-rows.ts +13 -6
  7. package/design/mark-part.ts +51 -1
  8. package/design/token-sheet.ts +1 -1
  9. package/design/web/frame-fit.ts +7 -0
  10. package/design/web/frame-surfaces.ts +294 -0
  11. package/design/web/frame.ts +41 -15
  12. package/design/web/surface-interactive.css +42 -0
  13. package/design/with-action.ts +29 -0
  14. package/package.json +3 -1
  15. package/src/index.js +9 -1
  16. package/src/index.js.map +1 -1
  17. package/src/lib/design/asset-shot.js +2 -2
  18. package/src/lib/design/asset-shot.js.map +1 -1
  19. package/src/lib/design/build-watch.d.ts +26 -0
  20. package/src/lib/design/build-watch.js +138 -0
  21. package/src/lib/design/build-watch.js.map +1 -0
  22. package/src/lib/design/check.js +142 -16
  23. package/src/lib/design/check.js.map +1 -1
  24. package/src/lib/design/commit-hunks.d.ts +22 -0
  25. package/src/lib/design/commit-hunks.js +173 -0
  26. package/src/lib/design/commit-hunks.js.map +1 -0
  27. package/src/lib/design/design-command.d.ts +2 -0
  28. package/src/lib/design/design-command.js +160 -11
  29. package/src/lib/design/design-command.js.map +1 -1
  30. package/src/lib/design/force-interactions.d.ts +1 -1
  31. package/src/lib/design/force-interactions.js +4 -2
  32. package/src/lib/design/force-interactions.js.map +1 -1
  33. package/src/lib/design/inbox-command.js +9 -5
  34. package/src/lib/design/inbox-command.js.map +1 -1
  35. package/src/lib/design/mcp-command.d.ts +5 -1
  36. package/src/lib/design/mcp-command.js +29 -11
  37. package/src/lib/design/mcp-command.js.map +1 -1
  38. package/src/lib/design/merge-compare.d.ts +10 -2
  39. package/src/lib/design/merge-compare.js +63 -11
  40. package/src/lib/design/merge-compare.js.map +1 -1
  41. package/src/lib/design/motion-command.js +1 -1
  42. package/src/lib/design/motion-command.js.map +1 -1
  43. package/src/lib/design/motion-shot.js +3 -2
  44. package/src/lib/design/motion-shot.js.map +1 -1
  45. package/src/lib/design/new-call.js +19 -10
  46. package/src/lib/design/new-call.js.map +1 -1
  47. package/src/lib/design/part-marks.d.ts +3 -2
  48. package/src/lib/design/part-marks.js +13 -5
  49. package/src/lib/design/part-marks.js.map +1 -1
  50. package/src/lib/design/paths.d.ts +28 -0
  51. package/src/lib/design/paths.js.map +1 -1
  52. package/src/lib/design/product-command.d.ts +1 -1
  53. package/src/lib/design/product-command.js +12 -14
  54. package/src/lib/design/product-command.js.map +1 -1
  55. package/src/lib/design/ready-shots.d.ts +29 -3
  56. package/src/lib/design/ready-shots.js +105 -5
  57. package/src/lib/design/ready-shots.js.map +1 -1
  58. package/src/lib/design/render-packages.d.ts +4 -17
  59. package/src/lib/design/render-packages.js +20 -63
  60. package/src/lib/design/render-packages.js.map +1 -1
  61. package/src/lib/design/render-worker.js +1 -3
  62. package/src/lib/design/render-worker.js.map +1 -1
  63. package/src/lib/design/render.d.ts +2 -0
  64. package/src/lib/design/render.js +32 -7
  65. package/src/lib/design/render.js.map +1 -1
  66. package/src/lib/design/serve.d.ts +21 -1
  67. package/src/lib/design/serve.js +133 -19
  68. package/src/lib/design/serve.js.map +1 -1
  69. package/src/lib/design/server-identity.d.ts +36 -0
  70. package/src/lib/design/server-identity.js +68 -0
  71. package/src/lib/design/server-identity.js.map +1 -0
  72. package/src/lib/design/settle-frames.d.ts +4 -0
  73. package/src/lib/design/settle-frames.js +22 -0
  74. package/src/lib/design/settle-frames.js.map +1 -0
  75. package/src/lib/design/shot-command.d.ts +25 -4
  76. package/src/lib/design/shot-command.js +132 -46
  77. package/src/lib/design/shot-command.js.map +1 -1
  78. package/src/lib/design/shot.d.ts +50 -0
  79. package/src/lib/design/shot.js +143 -17
  80. package/src/lib/design/shot.js.map +1 -1
  81. package/src/lib/design/sketch-command.d.ts +6 -1
  82. package/src/lib/design/sketch-command.js +358 -126
  83. package/src/lib/design/sketch-command.js.map +1 -1
  84. package/src/lib/design/stale-cli-dist.d.ts +11 -0
  85. package/src/lib/design/stale-cli-dist.js +56 -0
  86. package/src/lib/design/stale-cli-dist.js.map +1 -0
  87. package/src/lib/design/stamp.d.ts +18 -1
  88. package/src/lib/design/stamp.js +53 -7
  89. package/src/lib/design/stamp.js.map +1 -1
  90. package/src/lib/design/started-by-studio.d.ts +1 -0
  91. package/src/lib/design/started-by-studio.js +6 -0
  92. package/src/lib/design/started-by-studio.js.map +1 -0
  93. package/src/lib/design/studio-api.d.ts +27 -8
  94. package/src/lib/design/studio-api.js +263 -58
  95. package/src/lib/design/studio-api.js.map +1 -1
  96. package/src/lib/design/system/accept-command.d.ts +39 -5
  97. package/src/lib/design/system/accept-command.js +109 -25
  98. package/src/lib/design/system/accept-command.js.map +1 -1
  99. package/src/lib/design/system/accepted-pictures.d.ts +83 -0
  100. package/src/lib/design/system/accepted-pictures.js +324 -0
  101. package/src/lib/design/system/accepted-pictures.js.map +1 -0
  102. package/src/lib/design/system/action-lost.d.ts +59 -0
  103. package/src/lib/design/system/action-lost.js +120 -0
  104. package/src/lib/design/system/action-lost.js.map +1 -0
  105. package/src/lib/design/system/action-press.d.ts +23 -0
  106. package/src/lib/design/system/action-press.js +76 -0
  107. package/src/lib/design/system/action-press.js.map +1 -0
  108. package/src/lib/design/system/action-undeclared.d.ts +34 -0
  109. package/src/lib/design/system/action-undeclared.js +81 -0
  110. package/src/lib/design/system/action-undeclared.js.map +1 -0
  111. package/src/lib/design/system/actions-command.d.ts +101 -0
  112. package/src/lib/design/system/actions-command.js +695 -0
  113. package/src/lib/design/system/actions-command.js.map +1 -0
  114. package/src/lib/design/system/actions.d.ts +158 -0
  115. package/src/lib/design/system/actions.js +295 -0
  116. package/src/lib/design/system/actions.js.map +1 -0
  117. package/src/lib/design/system/app-files.d.ts +10 -0
  118. package/src/lib/design/system/app-files.js +159 -0
  119. package/src/lib/design/system/app-files.js.map +1 -0
  120. package/src/lib/design/system/bespoke-controls.d.ts +30 -0
  121. package/src/lib/design/system/bespoke-controls.js +147 -0
  122. package/src/lib/design/system/bespoke-controls.js.map +1 -0
  123. package/src/lib/design/system/build-ready-contract.d.ts +27 -0
  124. package/src/lib/design/system/build-ready-contract.js +12 -0
  125. package/src/lib/design/system/build-ready-contract.js.map +1 -0
  126. package/src/lib/design/system/check-rules.d.ts +1 -0
  127. package/src/lib/design/system/check-rules.js +82 -0
  128. package/src/lib/design/system/check-rules.js.map +1 -0
  129. package/src/lib/design/system/check-system.d.ts +61 -6
  130. package/src/lib/design/system/check-system.js +479 -68
  131. package/src/lib/design/system/check-system.js.map +1 -1
  132. package/src/lib/design/system/comments/comment.d.ts +4 -1
  133. package/src/lib/design/system/comments/comment.js +13 -4
  134. package/src/lib/design/system/comments/comment.js.map +1 -1
  135. package/src/lib/design/system/comments/inbox.js +2 -2
  136. package/src/lib/design/system/comments/inbox.js.map +1 -1
  137. package/src/lib/design/system/compare-command.d.ts +119 -0
  138. package/src/lib/design/system/compare-command.js +558 -0
  139. package/src/lib/design/system/compare-command.js.map +1 -0
  140. package/src/lib/design/system/complete-command.js +1 -1
  141. package/src/lib/design/system/complete-command.js.map +1 -1
  142. package/src/lib/design/system/complete.d.ts +32 -1
  143. package/src/lib/design/system/complete.js +144 -48
  144. package/src/lib/design/system/complete.js.map +1 -1
  145. package/src/lib/design/system/component-outputs.d.ts +20 -0
  146. package/src/lib/design/system/component-outputs.js +86 -0
  147. package/src/lib/design/system/component-outputs.js.map +1 -0
  148. package/src/lib/design/system/contrast-check.d.ts +1 -1
  149. package/src/lib/design/system/contrast-check.js +14 -3
  150. package/src/lib/design/system/contrast-check.js.map +1 -1
  151. package/src/lib/design/system/demo-backdrop.d.ts +11 -0
  152. package/src/lib/design/system/demo-backdrop.js +41 -0
  153. package/src/lib/design/system/demo-backdrop.js.map +1 -0
  154. package/src/lib/design/system/design-hash.d.ts +31 -0
  155. package/src/lib/design/system/design-hash.js +73 -0
  156. package/src/lib/design/system/design-hash.js.map +1 -0
  157. package/src/lib/design/system/disabled-interaction.d.ts +8 -0
  158. package/src/lib/design/system/disabled-interaction.js +37 -0
  159. package/src/lib/design/system/disabled-interaction.js.map +1 -0
  160. package/src/lib/design/system/dom-command.d.ts +36 -0
  161. package/src/lib/design/system/dom-command.js +175 -0
  162. package/src/lib/design/system/dom-command.js.map +1 -0
  163. package/src/lib/design/system/drawn-open-points.d.ts +25 -3
  164. package/src/lib/design/system/drawn-open-points.js +65 -14
  165. package/src/lib/design/system/drawn-open-points.js.map +1 -1
  166. package/src/lib/design/system/dropped-props.d.ts +25 -0
  167. package/src/lib/design/system/dropped-props.js +159 -0
  168. package/src/lib/design/system/dropped-props.js.map +1 -0
  169. package/src/lib/design/system/embedded-actions.d.ts +21 -0
  170. package/src/lib/design/system/embedded-actions.js +37 -0
  171. package/src/lib/design/system/embedded-actions.js.map +1 -0
  172. package/src/lib/design/system/exceptions.js +2 -1
  173. package/src/lib/design/system/exceptions.js.map +1 -1
  174. package/src/lib/design/system/flows/flow.js +2 -1
  175. package/src/lib/design/system/flows/flow.js.map +1 -1
  176. package/src/lib/design/system/frozen-animations.d.ts +13 -0
  177. package/src/lib/design/system/frozen-animations.js +51 -0
  178. package/src/lib/design/system/frozen-animations.js.map +1 -0
  179. package/src/lib/design/system/go-batch.d.ts +24 -0
  180. package/src/lib/design/system/go-batch.js +110 -0
  181. package/src/lib/design/system/go-batch.js.map +1 -0
  182. package/src/lib/design/system/go-command.d.ts +4 -0
  183. package/src/lib/design/system/go-command.js +64 -0
  184. package/src/lib/design/system/go-command.js.map +1 -0
  185. package/src/lib/design/system/go-guard.d.ts +26 -0
  186. package/src/lib/design/system/go-guard.js +70 -0
  187. package/src/lib/design/system/go-guard.js.map +1 -0
  188. package/src/lib/design/system/go-step.d.ts +13 -0
  189. package/src/lib/design/system/go-step.js +84 -0
  190. package/src/lib/design/system/go-step.js.map +1 -0
  191. package/src/lib/design/system/handoff.js +2 -1
  192. package/src/lib/design/system/handoff.js.map +1 -1
  193. package/src/lib/design/system/harness-build-cache.d.ts +35 -0
  194. package/src/lib/design/system/harness-build-cache.js +175 -0
  195. package/src/lib/design/system/harness-build-cache.js.map +1 -0
  196. package/src/lib/design/system/harness-command.d.ts +7 -0
  197. package/src/lib/design/system/harness-command.js +51 -0
  198. package/src/lib/design/system/harness-command.js.map +1 -0
  199. package/src/lib/design/system/harness-config.d.ts +9 -0
  200. package/src/lib/design/system/harness-config.js +65 -0
  201. package/src/lib/design/system/harness-config.js.map +1 -0
  202. package/src/lib/design/system/harness-map.d.ts +44 -0
  203. package/src/lib/design/system/harness-map.js +126 -0
  204. package/src/lib/design/system/harness-map.js.map +1 -0
  205. package/src/lib/design/system/harness-samples.d.ts +20 -0
  206. package/src/lib/design/system/harness-samples.js +92 -0
  207. package/src/lib/design/system/harness-samples.js.map +1 -0
  208. package/src/lib/design/system/harness-server.d.ts +40 -0
  209. package/src/lib/design/system/harness-server.js +296 -0
  210. package/src/lib/design/system/harness-server.js.map +1 -0
  211. package/src/lib/design/system/imports.js +14 -1
  212. package/src/lib/design/system/imports.js.map +1 -1
  213. package/src/lib/design/system/in-order-at-once.d.ts +6 -0
  214. package/src/lib/design/system/in-order-at-once.js +28 -0
  215. package/src/lib/design/system/in-order-at-once.js.map +1 -0
  216. package/src/lib/design/system/inventory-approval.js +2 -1
  217. package/src/lib/design/system/inventory-approval.js.map +1 -1
  218. package/src/lib/design/system/inventory.d.ts +13 -4
  219. package/src/lib/design/system/inventory.js +36 -7
  220. package/src/lib/design/system/inventory.js.map +1 -1
  221. package/src/lib/design/system/list-system.d.ts +4 -0
  222. package/src/lib/design/system/list-system.js +12 -3
  223. package/src/lib/design/system/list-system.js.map +1 -1
  224. package/src/lib/design/system/live-actions.d.ts +121 -0
  225. package/src/lib/design/system/live-actions.js +665 -0
  226. package/src/lib/design/system/live-actions.js.map +1 -0
  227. package/src/lib/design/system/live-compare.d.ts +136 -0
  228. package/src/lib/design/system/live-compare.js +441 -0
  229. package/src/lib/design/system/live-compare.js.map +1 -0
  230. package/src/lib/design/system/live-uncovered.d.ts +40 -0
  231. package/src/lib/design/system/live-uncovered.js +123 -0
  232. package/src/lib/design/system/live-uncovered.js.map +1 -0
  233. package/src/lib/design/system/nested-scroll.d.ts +7 -0
  234. package/src/lib/design/system/nested-scroll.js +25 -0
  235. package/src/lib/design/system/nested-scroll.js.map +1 -0
  236. package/src/lib/design/system/notes/note.js +2 -1
  237. package/src/lib/design/system/notes/note.js.map +1 -1
  238. package/src/lib/design/system/occluded.d.ts +13 -0
  239. package/src/lib/design/system/occluded.js +111 -0
  240. package/src/lib/design/system/occluded.js.map +1 -0
  241. package/src/lib/design/system/open-points.d.ts +24 -6
  242. package/src/lib/design/system/open-points.js +59 -30
  243. package/src/lib/design/system/open-points.js.map +1 -1
  244. package/src/lib/design/system/part-build-ready.d.ts +39 -0
  245. package/src/lib/design/system/part-build-ready.js +107 -0
  246. package/src/lib/design/system/part-build-ready.js.map +1 -0
  247. package/src/lib/design/system/part-command.js +2 -9
  248. package/src/lib/design/system/part-command.js.map +1 -1
  249. package/src/lib/design/system/part-compare.d.ts +123 -0
  250. package/src/lib/design/system/part-compare.js +396 -0
  251. package/src/lib/design/system/part-compare.js.map +1 -0
  252. package/src/lib/design/system/part-go.d.ts +70 -0
  253. package/src/lib/design/system/part-go.js +94 -0
  254. package/src/lib/design/system/part-go.js.map +1 -0
  255. package/src/lib/design/system/part-ready.d.ts +44 -6
  256. package/src/lib/design/system/part-ready.js +88 -17
  257. package/src/lib/design/system/part-ready.js.map +1 -1
  258. package/src/lib/design/system/part-task.d.ts +147 -0
  259. package/src/lib/design/system/part-task.js +285 -0
  260. package/src/lib/design/system/part-task.js.map +1 -0
  261. package/src/lib/design/system/pointer-focus.d.ts +81 -0
  262. package/src/lib/design/system/pointer-focus.js +152 -0
  263. package/src/lib/design/system/pointer-focus.js.map +1 -0
  264. package/src/lib/design/system/prettier.d.ts +10 -0
  265. package/src/lib/design/system/prettier.js +36 -0
  266. package/src/lib/design/system/prettier.js.map +1 -0
  267. package/src/lib/design/system/reach.d.ts +12 -0
  268. package/src/lib/design/system/reach.js +186 -0
  269. package/src/lib/design/system/reach.js.map +1 -0
  270. package/src/lib/design/system/reachable-controls.d.ts +6 -0
  271. package/src/lib/design/system/reachable-controls.js +19 -0
  272. package/src/lib/design/system/reachable-controls.js.map +1 -0
  273. package/src/lib/design/system/reachable-files.d.ts +14 -0
  274. package/src/lib/design/system/reachable-files.js +101 -0
  275. package/src/lib/design/system/reachable-files.js.map +1 -0
  276. package/src/lib/design/system/reached-state.d.ts +23 -0
  277. package/src/lib/design/system/reached-state.js +53 -0
  278. package/src/lib/design/system/reached-state.js.map +1 -0
  279. package/src/lib/design/system/read-open-points.d.ts +9 -3
  280. package/src/lib/design/system/read-open-points.js +38 -9
  281. package/src/lib/design/system/read-open-points.js.map +1 -1
  282. package/src/lib/design/system/ready-command.d.ts +6 -2
  283. package/src/lib/design/system/ready-command.js +32 -15
  284. package/src/lib/design/system/ready-command.js.map +1 -1
  285. package/src/lib/design/system/render-check.d.ts +50 -0
  286. package/src/lib/design/system/render-check.js +341 -88
  287. package/src/lib/design/system/render-check.js.map +1 -1
  288. package/src/lib/design/system/resolve-product.js +5 -0
  289. package/src/lib/design/system/resolve-product.js.map +1 -1
  290. package/src/lib/design/system/rules/app-spec.d.ts +30 -0
  291. package/src/lib/design/system/rules/app-spec.js +87 -0
  292. package/src/lib/design/system/rules/app-spec.js.map +1 -0
  293. package/src/lib/design/system/rules/canonical-class.d.ts +2 -0
  294. package/src/lib/design/system/rules/canonical-class.js +36 -110
  295. package/src/lib/design/system/rules/canonical-class.js.map +1 -1
  296. package/src/lib/design/system/rules/capability-place.d.ts +44 -0
  297. package/src/lib/design/system/rules/capability-place.js +116 -0
  298. package/src/lib/design/system/rules/capability-place.js.map +1 -0
  299. package/src/lib/design/system/rules/denied-class.d.ts +9 -0
  300. package/src/lib/design/system/rules/denied-class.js +121 -0
  301. package/src/lib/design/system/rules/denied-class.js.map +1 -0
  302. package/src/lib/design/system/rules/exemptions.d.ts +18 -0
  303. package/src/lib/design/system/rules/exemptions.js +18 -0
  304. package/src/lib/design/system/rules/exemptions.js.map +1 -0
  305. package/src/lib/design/system/rules/flow.js +1 -1
  306. package/src/lib/design/system/rules/flow.js.map +1 -1
  307. package/src/lib/design/system/rules/glued-interpolation.d.ts +8 -0
  308. package/src/lib/design/system/rules/glued-interpolation.js +61 -0
  309. package/src/lib/design/system/rules/glued-interpolation.js.map +1 -0
  310. package/src/lib/design/system/rules/hard-coded-colour.js +2 -1
  311. package/src/lib/design/system/rules/hard-coded-colour.js.map +1 -1
  312. package/src/lib/design/system/rules/implemented-components.d.ts +22 -0
  313. package/src/lib/design/system/rules/implemented-components.js +45 -0
  314. package/src/lib/design/system/rules/implemented-components.js.map +1 -0
  315. package/src/lib/design/system/rules/implements.d.ts +2 -1
  316. package/src/lib/design/system/rules/implements.js +26 -21
  317. package/src/lib/design/system/rules/implements.js.map +1 -1
  318. package/src/lib/design/system/rules/inline-svg.js +4 -1
  319. package/src/lib/design/system/rules/inline-svg.js.map +1 -1
  320. package/src/lib/design/system/rules/inline-ui-in-page-open.d.ts +13 -0
  321. package/src/lib/design/system/rules/inline-ui-in-page-open.js +5 -0
  322. package/src/lib/design/system/rules/inline-ui-in-page-open.js.map +1 -0
  323. package/src/lib/design/system/rules/inline-ui-in-page.d.ts +18 -0
  324. package/src/lib/design/system/rules/inline-ui-in-page.js +123 -0
  325. package/src/lib/design/system/rules/inline-ui-in-page.js.map +1 -0
  326. package/src/lib/design/system/rules/inline-ui.d.ts +16 -0
  327. package/src/lib/design/system/rules/inline-ui.js +100 -0
  328. package/src/lib/design/system/rules/inline-ui.js.map +1 -0
  329. package/src/lib/design/system/rules/motion.d.ts +1 -1
  330. package/src/lib/design/system/rules/motion.js +25 -17
  331. package/src/lib/design/system/rules/motion.js.map +1 -1
  332. package/src/lib/design/system/rules/native-title.d.ts +7 -0
  333. package/src/lib/design/system/rules/native-title.js +64 -0
  334. package/src/lib/design/system/rules/native-title.js.map +1 -0
  335. package/src/lib/design/system/rules/orphan-endpoint-known.d.ts +12 -0
  336. package/src/lib/design/system/rules/orphan-endpoint-known.js +20 -0
  337. package/src/lib/design/system/rules/orphan-endpoint-known.js.map +1 -0
  338. package/src/lib/design/system/rules/orphan-endpoint.d.ts +23 -0
  339. package/src/lib/design/system/rules/orphan-endpoint.js +166 -0
  340. package/src/lib/design/system/rules/orphan-endpoint.js.map +1 -0
  341. package/src/lib/design/system/rules/part-rewrite.d.ts +13 -0
  342. package/src/lib/design/system/rules/part-rewrite.js +125 -0
  343. package/src/lib/design/system/rules/part-rewrite.js.map +1 -0
  344. package/src/lib/design/system/rules/sample-default-known.d.ts +5 -0
  345. package/src/lib/design/system/rules/sample-default-known.js +17 -0
  346. package/src/lib/design/system/rules/sample-default-known.js.map +1 -0
  347. package/src/lib/design/system/rules/sample-default.d.ts +22 -0
  348. package/src/lib/design/system/rules/sample-default.js +92 -0
  349. package/src/lib/design/system/rules/sample-default.js.map +1 -0
  350. package/src/lib/design/system/rules/stale-replace.js +4 -0
  351. package/src/lib/design/system/rules/stale-replace.js.map +1 -1
  352. package/src/lib/design/system/rules/state-in-component.d.ts +16 -0
  353. package/src/lib/design/system/rules/state-in-component.js +101 -0
  354. package/src/lib/design/system/rules/state-in-component.js.map +1 -0
  355. package/src/lib/design/system/rules/tailwind-classes.d.ts +51 -0
  356. package/src/lib/design/system/rules/tailwind-classes.js +232 -0
  357. package/src/lib/design/system/rules/tailwind-classes.js.map +1 -0
  358. package/src/lib/design/system/rules/top-level-await.d.ts +9 -0
  359. package/src/lib/design/system/rules/top-level-await.js +62 -0
  360. package/src/lib/design/system/rules/top-level-await.js.map +1 -0
  361. package/src/lib/design/system/rules/unbound-input-known.d.ts +5 -0
  362. package/src/lib/design/system/rules/unbound-input-known.js +47 -0
  363. package/src/lib/design/system/rules/unbound-input-known.js.map +1 -0
  364. package/src/lib/design/system/rules/unbound-input.d.ts +22 -0
  365. package/src/lib/design/system/rules/unbound-input.js +61 -0
  366. package/src/lib/design/system/rules/unbound-input.js.map +1 -0
  367. package/src/lib/design/system/rules/uncovered-region.d.ts +13 -0
  368. package/src/lib/design/system/rules/uncovered-region.js +36 -0
  369. package/src/lib/design/system/rules/uncovered-region.js.map +1 -0
  370. package/src/lib/design/system/rules/undefined-class.d.ts +9 -0
  371. package/src/lib/design/system/rules/undefined-class.js +32 -0
  372. package/src/lib/design/system/rules/undefined-class.js.map +1 -0
  373. package/src/lib/design/system/rules/undefined-token.d.ts +1 -1
  374. package/src/lib/design/system/rules/undefined-token.js +7 -61
  375. package/src/lib/design/system/rules/undefined-token.js.map +1 -1
  376. package/src/lib/design/system/rules/utility-css.d.ts +2 -1
  377. package/src/lib/design/system/rules/utility-css.js +29 -14
  378. package/src/lib/design/system/rules/utility-css.js.map +1 -1
  379. package/src/lib/design/system/rules/view-coverage.d.ts +8 -0
  380. package/src/lib/design/system/rules/view-coverage.js +51 -0
  381. package/src/lib/design/system/rules/view-coverage.js.map +1 -0
  382. package/src/lib/design/system/rules/visible-change.d.ts +20 -0
  383. package/src/lib/design/system/rules/visible-change.js +48 -0
  384. package/src/lib/design/system/rules/visible-change.js.map +1 -0
  385. package/src/lib/design/system/sdk-errors.d.ts +14 -0
  386. package/src/lib/design/system/sdk-errors.js +38 -0
  387. package/src/lib/design/system/sdk-errors.js.map +1 -0
  388. package/src/lib/design/system/see-through.d.ts +12 -0
  389. package/src/lib/design/system/see-through.js +112 -0
  390. package/src/lib/design/system/see-through.js.map +1 -0
  391. package/src/lib/design/system/settled-panes.d.ts +18 -0
  392. package/src/lib/design/system/settled-panes.js +70 -0
  393. package/src/lib/design/system/settled-panes.js.map +1 -0
  394. package/src/lib/design/system/sketch/after-merge.d.ts +11 -0
  395. package/src/lib/design/system/sketch/after-merge.js +51 -0
  396. package/src/lib/design/system/sketch/after-merge.js.map +1 -0
  397. package/src/lib/design/system/sketch/aktuell-placeholders.d.ts +30 -0
  398. package/src/lib/design/system/sketch/aktuell-placeholders.js +87 -0
  399. package/src/lib/design/system/sketch/aktuell-placeholders.js.map +1 -0
  400. package/src/lib/design/system/sketch/baseline.d.ts +19 -1
  401. package/src/lib/design/system/sketch/baseline.js +29 -7
  402. package/src/lib/design/system/sketch/baseline.js.map +1 -1
  403. package/src/lib/design/system/sketch/check-sketches.d.ts +10 -0
  404. package/src/lib/design/system/sketch/check-sketches.js +50 -4
  405. package/src/lib/design/system/sketch/check-sketches.js.map +1 -1
  406. package/src/lib/design/system/sketch/cli-args.d.ts +12 -2
  407. package/src/lib/design/system/sketch/cli-args.js +18 -3
  408. package/src/lib/design/system/sketch/cli-args.js.map +1 -1
  409. package/src/lib/design/system/sketch/edit-sketch.d.ts +21 -0
  410. package/src/lib/design/system/sketch/edit-sketch.js +117 -0
  411. package/src/lib/design/system/sketch/edit-sketch.js.map +1 -0
  412. package/src/lib/design/system/sketch/frame-budget.d.ts +24 -0
  413. package/src/lib/design/system/sketch/frame-budget.js +23 -0
  414. package/src/lib/design/system/sketch/frame-budget.js.map +1 -0
  415. package/src/lib/design/system/sketch/identical-renders.d.ts +31 -0
  416. package/src/lib/design/system/sketch/identical-renders.js +137 -0
  417. package/src/lib/design/system/sketch/identical-renders.js.map +1 -0
  418. package/src/lib/design/system/sketch/merge-shared.d.ts +2 -0
  419. package/src/lib/design/system/sketch/merge-shared.js +7 -10
  420. package/src/lib/design/system/sketch/merge-shared.js.map +1 -1
  421. package/src/lib/design/system/sketch/merge-step.d.ts +35 -0
  422. package/src/lib/design/system/sketch/merge-step.js +98 -0
  423. package/src/lib/design/system/sketch/merge-step.js.map +1 -0
  424. package/src/lib/design/system/sketch/merge.d.ts +10 -3
  425. package/src/lib/design/system/sketch/merge.js +103 -30
  426. package/src/lib/design/system/sketch/merge.js.map +1 -1
  427. package/src/lib/design/system/sketch/merged-layout.d.ts +17 -0
  428. package/src/lib/design/system/sketch/merged-layout.js +57 -0
  429. package/src/lib/design/system/sketch/merged-layout.js.map +1 -0
  430. package/src/lib/design/system/sketch/merged-parts.d.ts +40 -10
  431. package/src/lib/design/system/sketch/merged-parts.js +112 -49
  432. package/src/lib/design/system/sketch/merged-parts.js.map +1 -1
  433. package/src/lib/design/system/sketch/no-visible-change.d.ts +10 -0
  434. package/src/lib/design/system/sketch/no-visible-change.js +16 -6
  435. package/src/lib/design/system/sketch/no-visible-change.js.map +1 -1
  436. package/src/lib/design/system/sketch/part-definition.d.ts +21 -1
  437. package/src/lib/design/system/sketch/part-definition.js +79 -17
  438. package/src/lib/design/system/sketch/part-definition.js.map +1 -1
  439. package/src/lib/design/system/sketch/rebase-port.d.ts +24 -0
  440. package/src/lib/design/system/sketch/rebase-port.js +170 -0
  441. package/src/lib/design/system/sketch/rebase-port.js.map +1 -0
  442. package/src/lib/design/system/sketch/sample-mark-drift.d.ts +33 -0
  443. package/src/lib/design/system/sketch/sample-mark-drift.js +88 -0
  444. package/src/lib/design/system/sketch/sample-mark-drift.js.map +1 -0
  445. package/src/lib/design/system/sketch/sketch-check-worker.d.ts +1 -0
  446. package/src/lib/design/system/sketch/sketch-check-worker.js +27 -0
  447. package/src/lib/design/system/sketch/sketch-check-worker.js.map +1 -0
  448. package/src/lib/design/system/sketch/sketch-checker.d.ts +27 -0
  449. package/src/lib/design/system/sketch/sketch-checker.js +99 -0
  450. package/src/lib/design/system/sketch/sketch-checker.js.map +1 -0
  451. package/src/lib/design/system/sketch/sketch.d.ts +63 -2
  452. package/src/lib/design/system/sketch/sketch.js +185 -30
  453. package/src/lib/design/system/sketch/sketch.js.map +1 -1
  454. package/src/lib/design/system/sketch/stale-base.d.ts +22 -0
  455. package/src/lib/design/system/sketch/stale-base.js +56 -0
  456. package/src/lib/design/system/sketch/stale-base.js.map +1 -0
  457. package/src/lib/design/system/sketch/unchanged-states.d.ts +32 -0
  458. package/src/lib/design/system/sketch/unchanged-states.js +52 -13
  459. package/src/lib/design/system/sketch/unchanged-states.js.map +1 -1
  460. package/src/lib/design/system/sketch/unused-closure.js +16 -4
  461. package/src/lib/design/system/sketch/unused-closure.js.map +1 -1
  462. package/src/lib/design/system/sketch/viewed-shots.d.ts +24 -0
  463. package/src/lib/design/system/sketch/viewed-shots.js +61 -0
  464. package/src/lib/design/system/sketch/viewed-shots.js.map +1 -0
  465. package/src/lib/design/system/slow-checks.d.ts +40 -0
  466. package/src/lib/design/system/slow-checks.js +197 -0
  467. package/src/lib/design/system/slow-checks.js.map +1 -0
  468. package/src/lib/design/system/slow-run.d.ts +57 -0
  469. package/src/lib/design/system/slow-run.js +253 -0
  470. package/src/lib/design/system/slow-run.js.map +1 -0
  471. package/src/lib/design/system/stale-design-mocks.d.ts +20 -0
  472. package/src/lib/design/system/stale-design-mocks.js +59 -0
  473. package/src/lib/design/system/stale-design-mocks.js.map +1 -0
  474. package/src/lib/design/system/stale-dist.d.ts +25 -0
  475. package/src/lib/design/system/stale-dist.js +91 -0
  476. package/src/lib/design/system/stale-dist.js.map +1 -0
  477. package/src/lib/design/system/stale-parts.d.ts +30 -0
  478. package/src/lib/design/system/stale-parts.js +106 -0
  479. package/src/lib/design/system/stale-parts.js.map +1 -0
  480. package/src/lib/design/system/surface-nesting.d.ts +11 -0
  481. package/src/lib/design/system/surface-nesting.js +86 -0
  482. package/src/lib/design/system/surface-nesting.js.map +1 -0
  483. package/src/lib/design/system/system-command.js +8 -6
  484. package/src/lib/design/system/system-command.js.map +1 -1
  485. package/src/lib/design/system/system-modules.d.ts +16 -1
  486. package/src/lib/design/system/system-modules.js +18 -2
  487. package/src/lib/design/system/system-modules.js.map +1 -1
  488. package/src/lib/design/system/task-command.d.ts +51 -0
  489. package/src/lib/design/system/task-command.js +233 -0
  490. package/src/lib/design/system/task-command.js.map +1 -0
  491. package/src/lib/design/system/theming-text.d.ts +2 -0
  492. package/src/lib/design/system/theming-text.js +6 -0
  493. package/src/lib/design/system/theming-text.js.map +1 -0
  494. package/src/lib/design/system/tom-confirm.d.ts +40 -0
  495. package/src/lib/design/system/tom-confirm.js +55 -0
  496. package/src/lib/design/system/tom-confirm.js.map +1 -0
  497. package/src/lib/design/system/touched-parts.d.ts +16 -0
  498. package/src/lib/design/system/touched-parts.js +122 -0
  499. package/src/lib/design/system/touched-parts.js.map +1 -0
  500. package/src/lib/design/system/ts-source.d.ts +2 -0
  501. package/src/lib/design/system/ts-source.js +15 -1
  502. package/src/lib/design/system/ts-source.js.map +1 -1
  503. package/src/lib/design/system/unchanged-rows.d.ts +15 -0
  504. package/src/lib/design/system/unchanged-rows.js +134 -0
  505. package/src/lib/design/system/unchanged-rows.js.map +1 -0
  506. package/src/lib/design/system/uncommitted-decisions.d.ts +6 -0
  507. package/src/lib/design/system/uncommitted-decisions.js +38 -0
  508. package/src/lib/design/system/uncommitted-decisions.js.map +1 -0
  509. package/src/lib/design/system/uncovered-regions.d.ts +61 -0
  510. package/src/lib/design/system/uncovered-regions.js +171 -0
  511. package/src/lib/design/system/uncovered-regions.js.map +1 -0
  512. package/src/lib/design/system/unused-base-parts.d.ts +7 -0
  513. package/src/lib/design/system/unused-base-parts.js +76 -0
  514. package/src/lib/design/system/unused-base-parts.js.map +1 -0
  515. package/src/lib/design/system/visible-change-command.d.ts +48 -0
  516. package/src/lib/design/system/visible-change-command.js +308 -0
  517. package/src/lib/design/system/visible-change-command.js.map +1 -0
  518. package/src/lib/design/system/visible-change-parts.d.ts +28 -0
  519. package/src/lib/design/system/visible-change-parts.js +96 -0
  520. package/src/lib/design/system/visible-change-parts.js.map +1 -0
  521. package/src/lib/design/system/visible-change.d.ts +82 -0
  522. package/src/lib/design/system/visible-change.js +149 -0
  523. package/src/lib/design/system/visible-change.js.map +1 -0
  524. package/src/lib/design/thumb.d.ts +19 -2
  525. package/src/lib/design/thumb.js +50 -15
  526. package/src/lib/design/thumb.js.map +1 -1
  527. package/src/lib/design/typecheck.d.ts +1 -1
  528. package/src/lib/design/typecheck.js +3 -3
  529. package/src/lib/design/typecheck.js.map +1 -1
  530. package/src/lib/design/unstable-cells.d.ts +23 -0
  531. package/src/lib/design/unstable-cells.js +40 -0
  532. package/src/lib/design/unstable-cells.js.map +1 -0
  533. package/src/lib/design/variant-diff.js +1 -1
  534. package/src/lib/design/variant-diff.js.map +1 -1
  535. package/src/lib/design/wait.d.ts +15 -0
  536. package/src/lib/design/wait.js +30 -0
  537. package/src/lib/design/wait.js.map +1 -0
  538. package/src/lib/json-file.d.ts +11 -0
  539. package/src/lib/json-file.js +21 -0
  540. package/src/lib/json-file.js.map +1 -0
  541. package/src/lib/source-hash.d.ts +7 -0
  542. package/src/lib/source-hash.js +62 -0
  543. package/src/lib/source-hash.js.map +1 -0
  544. package/src/lib/update/agent-setup.js +2 -1
  545. package/src/lib/update/agent-setup.js.map +1 -1
  546. package/src/lib/update/migration-manifest.d.ts +12 -0
  547. package/src/lib/update/migration-manifest.js +13 -0
  548. package/src/lib/update/migration-manifest.js.map +1 -1
  549. package/src/lib/update/migration-record.js +2 -1
  550. package/src/lib/update/migration-record.js.map +1 -1
  551. package/src/lib/update/pending.js +2 -1
  552. package/src/lib/update/pending.js.map +1 -1
  553. package/src/lib/update/run-migrations.d.ts +3 -2
  554. package/src/lib/update/run-migrations.js +38 -5
  555. package/src/lib/update/run-migrations.js.map +1 -1
  556. package/src/lib/update/tasks.js +2 -1
  557. package/src/lib/update/tasks.js.map +1 -1
@@ -0,0 +1,695 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.designActions = exports.PART_HARNESS_ONLY = exports.partActionFailuresOf = exports.hostLineOf = exports.actionLineOf = exports.checkActions = exports.runActionInput = exports.ACTIONS_USAGE = void 0;
13
+ const fs_1 = require("fs");
14
+ const os_1 = require("os");
15
+ const path_1 = require("path");
16
+ const browser_1 = require("../browser");
17
+ const serve_1 = require("../serve");
18
+ const shot_1 = require("../shot");
19
+ const thumb_1 = require("../thumb");
20
+ const actions_1 = require("./actions");
21
+ const action_press_1 = require("./action-press");
22
+ const compare_command_1 = require("./compare-command");
23
+ const component_outputs_1 = require("./component-outputs");
24
+ const live_actions_1 = require("./live-actions");
25
+ const pointer_focus_1 = require("./pointer-focus");
26
+ const reached_state_1 = require("./reached-state");
27
+ const live_compare_1 = require("./live-compare");
28
+ const harness_map_1 = require("./harness-map");
29
+ const in_order_at_once_1 = require("./in-order-at-once");
30
+ const harness_server_1 = require("./harness-server");
31
+ const part_compare_1 = require("./part-compare");
32
+ const resolve_product_1 = require("./resolve-product");
33
+ const cli_args_1 = require("./sketch/cli-args");
34
+ const part_definition_1 = require("./sketch/part-definition");
35
+ const sketch_1 = require("./sketch/sketch");
36
+ const system_modules_1 = require("./system-modules");
37
+ exports.ACTIONS_USAGE = 'actions <layer>/<name> --product <name> [--url <app dev server url>] [--state <name>] | actions [<layer>/<name>] --product <name> --live [--url <app build url>]';
38
+ const ROOM_PX = 1024;
39
+ const ACTION_BATCH_STATES = 4;
40
+ const messageOf = (error) => (error instanceof Error ? error.message : String(error));
41
+ const scanOf = (page, roots) => __awaiter(void 0, void 0, void 0, function* () { return (yield page.evaluate((0, actions_1.actionScanScriptOf)(roots))); });
42
+ const probeOf = (probe) => `[data-et-action-probe="${probe}"]`;
43
+ /**
44
+ * Waits until the harness host shows and holds the mounted part: a page-layout host fills the viewport before the
45
+ * lazily loaded part renders into it.
46
+ */
47
+ const harnessMountedOf = (page, timeout) => __awaiter(void 0, void 0, void 0, function* () {
48
+ yield page.locator(part_compare_1.HARNESS_HOST_SELECTOR).first().waitFor({ state: 'visible', timeout });
49
+ yield page.locator(`${part_compare_1.HARNESS_HOST_SELECTOR} > *`).first().waitFor({ state: 'attached', timeout });
50
+ });
51
+ const expandedScanOf = (page, roots) => __awaiter(void 0, void 0, void 0, function* () {
52
+ return (yield page.evaluate(`${(0, actions_1.actionScanScriptOf)(roots)}.map((found) => ({ key: found.key, expanded: document.querySelector('[data-et-action-probe="' + found.probe + '"]')?.getAttribute('aria-expanded') ?? null }))`));
53
+ });
54
+ const shotOf = (options) => __awaiter(void 0, void 0, void 0, function* () {
55
+ const { page, size, room, timeout } = options;
56
+ const host = page.locator(part_compare_1.HARNESS_HOST_SELECTOR).first();
57
+ if (size && (yield page.locator(part_compare_1.OVERLAY_PANES).count()) === 0) {
58
+ const origin = yield host.evaluate((element) => {
59
+ const { x, y } = element.getBoundingClientRect();
60
+ return { x: Math.round(x + scrollX), y: Math.round(y + scrollY) };
61
+ });
62
+ yield page.evaluate((0, shot_1.checkerScriptOf)(origin));
63
+ return yield host.screenshot({ type: 'png', animations: 'disabled', timeout });
64
+ }
65
+ yield host.scrollIntoViewIfNeeded({ timeout });
66
+ const clip = (0, shot_1.pixelBoxOf)((yield page.evaluate((0, part_compare_1.hostBoxScriptOf)({ up: room }))));
67
+ yield page.evaluate((0, shot_1.checkerScriptOf)(clip));
68
+ return yield page.screenshot({ type: 'png', fullPage: true, animations: 'disabled', clip, timeout });
69
+ });
70
+ /**
71
+ * Loads the harness page of `start`, clicks its opener, then presses `input` on the element `pick` names and returns
72
+ * the outputs it fired, whether its keydown default was prevented, and the host shot when `shoot` asks for one. The
73
+ * outputs include those of the components under the `listen` selectors; `expanded` adds each element's
74
+ * `aria-expanded` after the press. The wait for outputs ends as soon as `output` fired or the page settled.
75
+ */
76
+ const runActionInput = (options) => __awaiter(void 0, void 0, void 0, function* () {
77
+ var _a;
78
+ const { browser, url, start, pick, input, size, shoot, timeout, listen = [], expanded = false } = options;
79
+ const room = !!shoot && !size && shoot.room;
80
+ const viewport = (0, shot_1.viewportOf)(size);
81
+ const context = yield browser.newContext({
82
+ viewport: room ? { width: viewport.width + ROOM_PX, height: viewport.height + ROOM_PX } : viewport,
83
+ deviceScaleFactor: 1,
84
+ });
85
+ try {
86
+ yield context.addInitScript(action_press_1.INIT_SCRIPT);
87
+ const page = yield context.newPage();
88
+ yield page.goto(url, { timeout });
89
+ yield harnessMountedOf(page, timeout);
90
+ yield (0, thumb_1.awaitFonts)(page);
91
+ if (room)
92
+ yield page.evaluate(`document.documentElement.style.padding = '${ROOM_PX}px 0 0 ${ROOM_PX}px'`);
93
+ yield page.mouse.move(-1, -1);
94
+ const roots = [part_compare_1.HARNESS_HOST_SELECTOR, action_press_1.OVERLAY_ROOTS];
95
+ if (start.opener !== null) {
96
+ const opener = (yield scanOf(page, [part_compare_1.HARNESS_HOST_SELECTOR])).find((element) => element.key === start.opener);
97
+ if (!opener)
98
+ throw new Error(`the app has no ${start.opener} to open state ${start.state} with`);
99
+ yield page.locator(probeOf(opener.probe)).click({ timeout });
100
+ yield page.mouse.move(-1, -1);
101
+ yield (0, action_press_1.settle)(page, timeout);
102
+ }
103
+ const element = (yield scanOf(page, roots)).find((found) => found.key === pick.key && found.occurrence === pick.occurrence);
104
+ if (!element)
105
+ throw new Error('the element is gone after a fresh load');
106
+ yield page.evaluate('window.__etPrevented = []; (window.__etDesignEmits ?? []).length = 0;');
107
+ const listened = listen.length > 0 ? (yield page.evaluate((0, actions_1.listenEmbeddedScriptOf)(listen))) : 0;
108
+ const target = page.locator(probeOf(element.probe));
109
+ yield (0, action_press_1.watchMutations)(page);
110
+ if (input === 'click') {
111
+ yield target.click({ timeout });
112
+ yield page.mouse.move(-1, -1);
113
+ }
114
+ else {
115
+ yield page.keyboard.press('Shift');
116
+ yield target.focus({ timeout });
117
+ yield page.keyboard.press(input);
118
+ }
119
+ yield (0, action_press_1.awaitOutput)(page, (_a = options.output) !== null && _a !== void 0 ? _a : null);
120
+ yield (0, action_press_1.settle)(page, timeout);
121
+ if (shoot && input !== 'click' && !options.focused) {
122
+ yield (0, action_press_1.dropKeyboardFocus)(page);
123
+ yield (0, action_press_1.settle)(page, timeout);
124
+ }
125
+ const emitted = (yield page.evaluate('(window.__etDesignEmits ?? []).map((emit) => emit.output)'));
126
+ const embedded = listened > 0 ? (yield page.evaluate('window.__etEmbeddedEmits')) : [];
127
+ const prevented = (yield page.evaluate('window.__etPrevented')).length > 0;
128
+ const after = expanded ? yield expandedScanOf(page, roots) : null;
129
+ const app = shoot ? yield shotOf({ page, size, room, timeout }) : null;
130
+ return Object.assign({ emitted: [...emitted, ...embedded], prevented, app }, (after && { after }));
131
+ }
132
+ finally {
133
+ yield context.close();
134
+ }
135
+ });
136
+ exports.runActionInput = runActionInput;
137
+ /** Presses each interactive element of each start state of a part on the app's harness page and checks its declared action. */
138
+ const checkActions = (options) => __awaiter(void 0, void 0, void 0, function* () {
139
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
140
+ const { target, config, product, part, url, only, onLine } = options;
141
+ const frame = (0, compare_command_1.compareFrameOf)({ presets: product.presets, part, preset: null });
142
+ if (typeof frame === 'string')
143
+ return frame;
144
+ if (!(yield (0, browser_1.chromiumOf)(target)))
145
+ return 'actions needs playwright or playwright-core in the checkout';
146
+ const server = yield (0, serve_1.createDesignServer)({ target, config, listen: true, port: 0 });
147
+ let browser;
148
+ const closeBrowser = () => __awaiter(void 0, void 0, void 0, function* () {
149
+ const open = browser;
150
+ browser = undefined;
151
+ yield (open === null || open === void 0 ? void 0 : open.shooter.close());
152
+ yield (open === null || open === void 0 ? void 0 : open.queue.close());
153
+ });
154
+ try {
155
+ yield server.listen();
156
+ const { port } = (_a = server.httpServer) === null || _a === void 0 ? void 0 : _a.address();
157
+ const system = (0, system_modules_1.createSystemModules)({ target, config });
158
+ const freshBrowser = () => __awaiter(void 0, void 0, void 0, function* () {
159
+ yield closeBrowser();
160
+ const queue = (0, thumb_1.createDrawQueue)({ target });
161
+ browser = { queue, shooter: (0, shot_1.createPartShooter)({ target, base: `http://localhost:${port}`, system, queue }) };
162
+ return browser;
163
+ });
164
+ const file = (_c = (_b = product.parts.find((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === part)) === null || _b === void 0 ? void 0 : _b.file) !== null && _c !== void 0 ? _c : '';
165
+ const module = (yield server.ssrLoadModule((0, system_modules_1.productModuleIdOf)({ file, product: product.name })));
166
+ const loaded = (_d = module.default) === null || _d === void 0 ? void 0 : _d.states;
167
+ const states = loaded && typeof loaded === 'object' && !Array.isArray(loaded) ? loaded : {};
168
+ const names = Object.keys(states);
169
+ const appOutputs = (() => {
170
+ var _a;
171
+ const found = product.parts.find((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === part);
172
+ const link = found ? (0, part_definition_1.partLinkOf)(found.source) : null;
173
+ const component = (link === null || link === void 0 ? void 0 : link.kind) === 'component' ? link.path : (link === null || link === void 0 ? void 0 : link.kind) === 'route' ? ((_a = link.component) !== null && _a !== void 0 ? _a : null) : null;
174
+ const source = component === null ? null : (0, path_1.resolve)(target, component);
175
+ return source && (0, fs_1.existsSync)(source) ? (0, component_outputs_1.componentOutputsOf)((0, fs_1.readFileSync)(source, 'utf8')) : null;
176
+ })();
177
+ if (only !== null && !(only in states))
178
+ return `${part} has no state "${only}" - its states: ${names.join(', ')}`;
179
+ let embedders;
180
+ const embeddersOfPart = () => (embedders !== null && embedders !== void 0 ? embedders : (embedders = Promise.all(product.parts.map((candidate) => __awaiter(void 0, void 0, void 0, function* () {
181
+ const id = (0, system_modules_1.productModuleIdOf)({ file: candidate.file, product: product.name });
182
+ const controls = yield server.ssrLoadModule(id).then((loaded) => { var _a; return (_a = loaded.default) === null || _a === void 0 ? void 0 : _a.controls; }, () => undefined);
183
+ return [(0, resolve_product_1.partKeyOf)(candidate), controls];
184
+ }))).then((entries) => (0, actions_1.embeddersOf)({ part, controls: Object.fromEntries(entries) }))));
185
+ let { queue, shooter } = yield freshBrowser();
186
+ const designs = new Map();
187
+ const draw = (state, opened = null) => {
188
+ var _a;
189
+ const key = opened === null ? state : `${state}\n${JSON.stringify(opened)}`;
190
+ const drawn = (_a = designs.get(key)) !== null && _a !== void 0 ? _a : shooter.pictureOf(Object.assign(Object.assign({ product: product.name, part,
191
+ state, preset: frame.preset, width: null, sketch: null, interaction: null, bare: true, emptySlots: true, checker: true }, (opened && { compose: { [part]: opened } })), { params: new URLSearchParams() }));
192
+ designs.set(key, drawn);
193
+ drawn.catch(() => designs.get(key) === drawn && designs.delete(key));
194
+ return drawn;
195
+ };
196
+ for (const state of names)
197
+ yield draw(state);
198
+ const markups = new Map(yield Promise.all([...designs].map((_a) => __awaiter(void 0, [_a], void 0, function* ([state, design]) { var _b; return [state, (_b = (yield design).markup) !== null && _b !== void 0 ? _b : '']; }))));
199
+ const opens = (0, part_compare_1.pointerOpensOf)({
200
+ states,
201
+ controls: (_e = module.default) === null || _e === void 0 ? void 0 : _e.controls,
202
+ drawn: Object.fromEntries([...markups].map(([state, markup]) => [state, (0, part_compare_1.drawnSurfacesOf)(markup)])),
203
+ });
204
+ const designScan = (state) => __awaiter(void 0, void 0, void 0, function* () {
205
+ return queue.run((browser) => __awaiter(void 0, void 0, void 0, function* () {
206
+ var _a;
207
+ const context = yield browser.newContext({ viewport: (0, shot_1.viewportOf)(frame.size) });
208
+ try {
209
+ const page = yield context.newPage();
210
+ yield page.setContent((_a = markups.get(state)) !== null && _a !== void 0 ? _a : '');
211
+ const found = yield scanOf(page, ['body']);
212
+ const owners = (yield page.evaluate((0, actions_1.embeddedOwnersScriptOf)(part)));
213
+ const within = (yield page.evaluate((0, actions_1.enclosingControlsScriptOf)()));
214
+ return found.map((element) => {
215
+ var _a, _b;
216
+ return (Object.assign(Object.assign({}, element), { owners: (_a = owners[String(element.probe)]) !== null && _a !== void 0 ? _a : [], within: (_b = within[String(element.probe)]) !== null && _b !== void 0 ? _b : [] }));
217
+ });
218
+ }
219
+ finally {
220
+ yield context.close();
221
+ }
222
+ }));
223
+ });
224
+ const embedded = new Map();
225
+ const embeddedOf = (key) => {
226
+ var _a;
227
+ const cached = (_a = embedded.get(key)) !== null && _a !== void 0 ? _a : (() => __awaiter(void 0, void 0, void 0, function* () {
228
+ var _a, _b;
229
+ const found = product.parts.find((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === key);
230
+ const loaded = found
231
+ ? (_a = (yield server.ssrLoadModule((0, system_modules_1.productModuleIdOf)({ file: found.file, product: product.name }))).default) === null || _a === void 0 ? void 0 : _a.states
232
+ : undefined;
233
+ const link = found ? (0, part_definition_1.partLinkOf)(found.source) : null;
234
+ const component = (link === null || link === void 0 ? void 0 : link.kind) === 'component' ? link.path : (link === null || link === void 0 ? void 0 : link.kind) === 'route' ? ((_b = link.component) !== null && _b !== void 0 ? _b : null) : null;
235
+ const file = component === null ? null : (0, path_1.resolve)(target, component);
236
+ return {
237
+ part: key,
238
+ states: loaded && typeof loaded === 'object' && !Array.isArray(loaded) ? Object.keys(loaded) : [],
239
+ selector: file && (0, fs_1.existsSync)(file) ? (0, actions_1.componentSelectorOf)((0, fs_1.readFileSync)(file, 'utf8')) : null,
240
+ };
241
+ }))();
242
+ embedded.set(key, cached);
243
+ return cached;
244
+ };
245
+ const expectedCache = new Map();
246
+ const expectedOf = (owner, state) => {
247
+ var _a;
248
+ const key = `${owner}\n${state}`;
249
+ const cached = (_a = expectedCache.get(key)) !== null && _a !== void 0 ? _a : (() => __awaiter(void 0, void 0, void 0, function* () {
250
+ const ownerFrame = (0, compare_command_1.compareFrameOf)({ presets: product.presets, part: owner, preset: null });
251
+ const size = typeof ownerFrame === 'string' ? null : ownerFrame.size;
252
+ const picture = yield shooter.pictureOf({
253
+ product: product.name,
254
+ part: owner,
255
+ state,
256
+ preset: typeof ownerFrame === 'string' ? null : ownerFrame.preset,
257
+ width: null,
258
+ sketch: null,
259
+ interaction: null,
260
+ bare: true,
261
+ emptySlots: true,
262
+ params: new URLSearchParams(),
263
+ });
264
+ return queue.run((browser) => __awaiter(void 0, void 0, void 0, function* () {
265
+ var _a;
266
+ const context = yield browser.newContext({ viewport: (0, shot_1.viewportOf)(size) });
267
+ try {
268
+ const page = yield context.newPage();
269
+ yield page.setContent((_a = picture.markup) !== null && _a !== void 0 ? _a : '');
270
+ return Object.fromEntries((yield expandedScanOf(page, ['body'])).flatMap(({ key, expanded }) => expanded === null ? [] : [[key, expanded]]));
271
+ }
272
+ finally {
273
+ yield context.close();
274
+ }
275
+ }));
276
+ }))();
277
+ expectedCache.set(key, cached);
278
+ return cached;
279
+ };
280
+ const lines = [];
281
+ const skippedHosts = [];
282
+ const pushLine = (line) => {
283
+ lines.push(line);
284
+ onLine === null || onLine === void 0 ? void 0 : onLine(line);
285
+ };
286
+ let dir = null;
287
+ const checked = only === null ? names : [only];
288
+ for (const [index, state] of checked.entries()) {
289
+ if (index % ACTION_BATCH_STATES === 0) {
290
+ designs.clear();
291
+ ({ queue, shooter } = yield freshBrowser());
292
+ }
293
+ const markup = (_f = markups.get(state)) !== null && _f !== void 0 ? _f : '';
294
+ if ((0, part_compare_1.forcedElementsOf)(markup).length > 0)
295
+ continue;
296
+ const open = opens[state];
297
+ if (typeof open === 'string') {
298
+ pushLine({ state, element: '-', input: null, failure: open });
299
+ continue;
300
+ }
301
+ const design = yield designScan(state);
302
+ const opener = open ? ((_h = (_g = design.find((element) => element.control === open.control)) === null || _g === void 0 ? void 0 : _g.key) !== null && _h !== void 0 ? _h : null) : null;
303
+ if (open && opener === null) {
304
+ pushLine({ state, element: '-', input: null, failure: `no ${open.control} trigger to open it with` });
305
+ continue;
306
+ }
307
+ const start = { state, props: open ? ((_j = open.props) !== null && _j !== void 0 ? _j : states[open.from]) : states[state], opener };
308
+ const startUrl = (0, part_compare_1.harnessUrlOf)({ url, part, state, props: start.props, layout: frame.layout });
309
+ const app = yield queue.run((browser) => __awaiter(void 0, void 0, void 0, function* () {
310
+ const context = yield browser.newContext({ viewport: (0, shot_1.viewportOf)(frame.size) });
311
+ try {
312
+ const page = yield context.newPage();
313
+ yield page.goto(startUrl, { timeout: thumb_1.DRAW_TIMEOUT_MS });
314
+ yield harnessMountedOf(page, thumb_1.DRAW_TIMEOUT_MS);
315
+ if (opener !== null) {
316
+ const trigger = (yield scanOf(page, [part_compare_1.HARNESS_HOST_SELECTOR])).find((element) => element.key === opener);
317
+ if (trigger)
318
+ yield page.locator(probeOf(trigger.probe)).click();
319
+ yield (0, action_press_1.settle)(page, thumb_1.DRAW_TIMEOUT_MS);
320
+ }
321
+ return yield scanOf(page, [part_compare_1.HARNESS_HOST_SELECTOR, action_press_1.OVERLAY_ROOTS]);
322
+ }
323
+ finally {
324
+ yield context.close();
325
+ }
326
+ }));
327
+ const hosts = (_l = (_k = product.config.harness) === null || _k === void 0 ? void 0 : _k.hosts) !== null && _l !== void 0 ? _l : [];
328
+ const scope = (0, actions_1.ownScopeOf)({ design, app, hosts });
329
+ skippedHosts.push(...scope.skipped.filter((host) => !skippedHosts.includes(host)));
330
+ const { paired, missing } = (0, actions_1.pairElementsOf)({ design: scope.design, app: scope.app });
331
+ for (const element of missing)
332
+ pushLine({
333
+ state,
334
+ element: (0, actions_1.elementNameOf)(element),
335
+ input: null,
336
+ failure: `the design declares ${element.action} but the app draws no such element`,
337
+ });
338
+ const checkedElements = yield (0, in_order_at_once_1.inOrderAtOnce)({
339
+ items: paired,
340
+ limit: thumb_1.DRAWS_AT_ONCE,
341
+ run: (_a) => __awaiter(void 0, [_a], void 0, function* ({ app: element, design: drawn }) {
342
+ var _b, _c, _d, _e, _f, _g, _h, _j;
343
+ const out = [];
344
+ const finish = () => {
345
+ for (const line of out)
346
+ onLine === null || onLine === void 0 ? void 0 : onLine(line);
347
+ return out;
348
+ };
349
+ const name = (0, actions_1.elementNameOf)(element);
350
+ try {
351
+ const probes = yield queue.run((browser) => (0, pointer_focus_1.probePointerFocus)({
352
+ open: () => __awaiter(void 0, void 0, void 0, function* () {
353
+ const context = yield browser.newContext({ viewport: (0, shot_1.viewportOf)(frame.size) });
354
+ const page = yield context.newPage();
355
+ const close = () => context.close();
356
+ try {
357
+ yield page.goto(startUrl, { timeout: thumb_1.DRAW_TIMEOUT_MS });
358
+ yield harnessMountedOf(page, thumb_1.DRAW_TIMEOUT_MS);
359
+ yield page.mouse.move(-1, -1);
360
+ if (opener !== null) {
361
+ const trigger = (yield scanOf(page, [part_compare_1.HARNESS_HOST_SELECTOR])).find((found) => found.key === opener);
362
+ if (trigger)
363
+ yield page.locator(probeOf(trigger.probe)).click();
364
+ yield (0, action_press_1.settle)(page, thumb_1.DRAW_TIMEOUT_MS);
365
+ yield page.mouse.move(-1, -1);
366
+ }
367
+ const found = (yield scanOf(page, [part_compare_1.HARNESS_HOST_SELECTOR, action_press_1.OVERLAY_ROOTS])).find((candidate) => candidate.key === element.key && candidate.occurrence === element.occurrence);
368
+ if (!found)
369
+ throw new Error('the element is gone after a fresh load');
370
+ return { page, locator: page.locator(probeOf(found.probe)), close };
371
+ }
372
+ catch (error) {
373
+ yield close();
374
+ throw error;
375
+ }
376
+ }),
377
+ settle: (page) => (0, action_press_1.settle)(page, thumb_1.DRAW_TIMEOUT_MS),
378
+ }));
379
+ if (probes) {
380
+ const { failure, warning } = (0, pointer_focus_1.pointerFocusVerdictOf)(Object.assign(Object.assign({}, probes), { activatable: !!(drawn === null || drawn === void 0 ? void 0 : drawn.action) }));
381
+ out.push({ state, element: `${name} pointer focus`, input: null, failure, warning });
382
+ }
383
+ }
384
+ catch (error) {
385
+ out.push({
386
+ state,
387
+ element: `${name} pointer focus`,
388
+ input: null,
389
+ failure: (_b = messageOf(error).split('\n')[0]) !== null && _b !== void 0 ? _b : '',
390
+ });
391
+ }
392
+ const owners = drawn ? yield Promise.all(drawn.owners.map(embeddedOf)) : [];
393
+ const value = (_d = (_c = drawn === null || drawn === void 0 ? void 0 : drawn.action) === null || _c === void 0 ? void 0 : _c.trim()) !== null && _d !== void 0 ? _d : '';
394
+ const settled = [];
395
+ for (const candidate of owners)
396
+ if (candidate.states.includes(value) &&
397
+ (0, actions_1.drawsStateAlreadyOf)({
398
+ expected: yield expectedOf(candidate.part, value),
399
+ current: yield expectedOf(part, state),
400
+ }))
401
+ settled.push(candidate.part);
402
+ const { action, owner } = drawn
403
+ ? (0, actions_1.resolveActionOf)({ value: drawn.action, owners, page: { part, states: names }, settled })
404
+ : { action: null, owner: part };
405
+ const embeddedState = owners.find((candidate) => candidate.part === owner);
406
+ const listen = owners.flatMap((candidate) => (candidate.selector === null ? [] : [candidate.selector]));
407
+ if (drawn === null || action === null || typeof action === 'string') {
408
+ if (typeof action !== 'string' && (yield embeddersOfPart()).length > 0)
409
+ return finish();
410
+ if (drawn !== null &&
411
+ action === null &&
412
+ (0, actions_1.exemptFromDeclaringOf)({ owners: drawn.owners, within: drawn.within, controls: (_e = module.default) === null || _e === void 0 ? void 0 : _e.controls }))
413
+ return finish();
414
+ out.push({
415
+ state,
416
+ element: name,
417
+ input: null,
418
+ failure: typeof action === 'string'
419
+ ? action
420
+ : drawn === null
421
+ ? 'the design draws no such element, so it declares no action'
422
+ : 'the design declares no data-et-action',
423
+ });
424
+ return finish();
425
+ }
426
+ for (const input of (0, actions_1.actionInputsOf)(element.key)) {
427
+ const goal = action.kind === 'state'
428
+ ? (0, actions_1.targetStateOf)({ state: action.state, input, states: (_f = embeddedState === null || embeddedState === void 0 ? void 0 : embeddedState.states) !== null && _f !== void 0 ? _f : names })
429
+ : '';
430
+ const opened = goal === '' ? null : (0, actions_1.openedFromOf)({ goal, start: state, states, open: opens[goal] });
431
+ const goalPicture = goal === '' || embeddedState ? null : yield draw(opened ? state : goal, opened);
432
+ try {
433
+ const run = yield queue.run((browser) => {
434
+ var _a, _b;
435
+ return (0, exports.runActionInput)({
436
+ browser,
437
+ url: startUrl,
438
+ start,
439
+ pick: element,
440
+ input,
441
+ size: frame.size,
442
+ shoot: goalPicture
443
+ ? {
444
+ room: ((_b = (_a = goalPicture.marks.find((mark) => mark.parts.includes(part))) === null || _a === void 0 ? void 0 : _a.y) !== null && _b !== void 0 ? _b : 0) > 0,
445
+ }
446
+ : null,
447
+ timeout: thumb_1.DRAW_TIMEOUT_MS,
448
+ listen: action.kind === 'emit' ? listen : [],
449
+ output: action.kind === 'emit' ? action.output : null,
450
+ expanded: !!embeddedState && action.kind === 'state',
451
+ focused: goal.endsWith('-focus-visible'),
452
+ });
453
+ });
454
+ const result = goalPicture && run.app ? (0, part_compare_1.comparePngs)({ design: goalPicture.png, app: run.app }) : null;
455
+ const outcome = {
456
+ emitted: run.emitted,
457
+ prevented: run.prevented,
458
+ compare: embeddedState && action.kind === 'state'
459
+ ? (0, live_actions_1.liveStateCompareOf)({
460
+ state: `${owner} ${goal}`,
461
+ expected: yield expectedOf(owner, goal),
462
+ after: (_g = run.after) !== null && _g !== void 0 ? _g : [],
463
+ })
464
+ : result
465
+ ? { ok: result.kind === 'ok', detail: (0, part_compare_1.compareLineOf)(goal, result).slice(goal.length + 1) }
466
+ : null,
467
+ };
468
+ const app = run.app;
469
+ if (action.kind === 'state' && result && result.kind !== 'ok' && goalPicture && app)
470
+ outcome.reached = yield (0, reached_state_1.reachedStateOf)({
471
+ goal,
472
+ states: names,
473
+ compare: (candidate) => __awaiter(void 0, void 0, void 0, function* () {
474
+ if (candidate === goal)
475
+ return result;
476
+ const reopened = (0, actions_1.openedFromOf)({ goal: candidate, start: state, states, open: opens[candidate] });
477
+ const picture = yield draw(reopened ? state : candidate, reopened);
478
+ return (0, part_compare_1.comparePngs)({ design: picture.png, app });
479
+ }),
480
+ });
481
+ if (embeddedState && action.kind === 'state' && outcome.compare && !outcome.compare.ok)
482
+ outcome.reached = yield (0, reached_state_1.reachedExpandedStateOf)({
483
+ goal,
484
+ states: embeddedState.states,
485
+ expectedOf: (candidate) => expectedOf(owner, candidate),
486
+ after: (_h = run.after) !== null && _h !== void 0 ? _h : [],
487
+ });
488
+ const failure = (0, actions_1.actionFailureOf)({
489
+ action,
490
+ target: goal,
491
+ input,
492
+ outcome,
493
+ modelChanges: action.kind === 'emit' && owner === part
494
+ ? (0, component_outputs_1.modelChangesForOf)({ output: action.output, app: appOutputs, states })
495
+ : [],
496
+ });
497
+ if (failure !== null && result && result.kind !== 'ok' && goalPicture && run.app) {
498
+ dir !== null && dir !== void 0 ? dir : (dir = (0, fs_1.mkdtempSync)((0, path_1.join)((0, os_1.tmpdir)(), 'et-design-actions-')));
499
+ const stem = `${state}--${name}--${input}`.replace(/[^\w.-]/g, '-');
500
+ (0, fs_1.writeFileSync)((0, path_1.join)(dir, `${stem}.design.png`), goalPicture.png);
501
+ (0, fs_1.writeFileSync)((0, path_1.join)(dir, `${stem}.app.png`), run.app);
502
+ (0, fs_1.writeFileSync)((0, path_1.join)(dir, `${stem}.diff.png`), result.diff);
503
+ }
504
+ out.push({ state, element: name, input, failure });
505
+ }
506
+ catch (error) {
507
+ out.push({ state, element: name, input, failure: (_j = messageOf(error).split('\n')[0]) !== null && _j !== void 0 ? _j : '' });
508
+ }
509
+ }
510
+ return finish();
511
+ }),
512
+ });
513
+ lines.push(...checkedElements.flat());
514
+ }
515
+ return { lines, pictures: dir, embedders: embedders ? yield embedders : [], hosts: skippedHosts };
516
+ }
517
+ catch (error) {
518
+ return messageOf(error);
519
+ }
520
+ finally {
521
+ yield closeBrowser();
522
+ yield server.close();
523
+ }
524
+ });
525
+ exports.checkActions = checkActions;
526
+ /** The line `design actions` prints for one checked element and input. */
527
+ const actionLineOf = ({ state, element, input, failure, warning }) => `${state} ${element}${input === null ? '' : ` ${input}`} ${failure === null ? `ok${warning ? ` (warning: ${warning})` : ''}` : `FAILED ${failure}`}`;
528
+ exports.actionLineOf = actionLineOf;
529
+ /** The line the action check prints once per run for a declared host component it skipped in a state. */
530
+ const hostLineOf = (host) => `host ${host}: skipped - the app's own chrome around the part, which the design does not draw`;
531
+ exports.hostLineOf = hostLineOf;
532
+ /** The failed lines `design actions` prints for a part, or why the check could not run. */
533
+ const partActionFailuresOf = (options) => __awaiter(void 0, void 0, void 0, function* () {
534
+ var _a, _b, _c;
535
+ const { target, config, product, part } = options;
536
+ const stale = (0, harness_map_1.harnessStaleOf)({ target, product });
537
+ if (stale !== null)
538
+ return { unavailable: stale };
539
+ const checked = yield (0, harness_server_1.withHarnessUrl)({
540
+ target,
541
+ product,
542
+ url: options.url,
543
+ start: options.start,
544
+ run: (url) => { var _a; return ((_a = options.check) !== null && _a !== void 0 ? _a : exports.checkActions)({ target, config, product, part, url, only: null }); },
545
+ });
546
+ if (typeof checked === 'string')
547
+ return { unavailable: checked };
548
+ for (const host of (_a = checked.hosts) !== null && _a !== void 0 ? _a : [])
549
+ (_b = options.onNote) === null || _b === void 0 ? void 0 : _b.call(options, (0, exports.hostLineOf)(host));
550
+ const failures = checked.lines.filter((line) => line.failure !== null).map(exports.actionLineOf);
551
+ if (!options.url || typeof (0, live_compare_1.liveSpecOf)({ target, product }) === 'string')
552
+ return failures;
553
+ const live = yield ((_c = options.checkLive) !== null && _c !== void 0 ? _c : live_actions_1.checkLiveActions)({ target, config, product, url: options.url, part });
554
+ if (typeof live === 'string')
555
+ return { unavailable: `the live action check: ${live}` };
556
+ return [...failures, ...live.lines.filter((line) => line.failure !== null).map((line) => `live ${(0, live_actions_1.liveLineOf)(line)}`)];
557
+ });
558
+ exports.partActionFailuresOf = partActionFailuresOf;
559
+ /** The note a ready refusal adds when the action check ran on the part harness only. */
560
+ exports.PART_HARNESS_ONLY = 'checked on the part harness only - pass --url <studio build> to check the live pages too';
561
+ /**
562
+ * `et design actions <layer>/<name> …` clicks and presses Enter and Space on each interactive element of a part in the
563
+ * app's harness page and fails unless each reaches the state or fires the output its design's `data-et-action` declares.
564
+ */
565
+ const designActions = (options) => __awaiter(void 0, void 0, void 0, function* () {
566
+ var _a, _b;
567
+ const { target, invocation } = options;
568
+ const args = (0, cli_args_1.argsOf)(options.argv, { values: ['--product', '--url', '--state'], switches: ['--live'] });
569
+ const live = typeof args !== 'string' && args.flags.has('--live');
570
+ if (typeof args === 'string' || args.positional.length > 1 || (!live && args.positional.length !== 1)) {
571
+ if (typeof args === 'string')
572
+ console.error(args);
573
+ console.error(`usage: ${invocation} ${exports.ACTIONS_USAGE}`);
574
+ return 2;
575
+ }
576
+ const config = (0, cli_args_1.configOf)(target);
577
+ if (live)
578
+ return designLiveActions(Object.assign(Object.assign({}, options), { args, config }));
579
+ const parsed = (0, sketch_1.parseTarget)(args.positional[0]);
580
+ if (typeof config === 'string' || typeof parsed === 'string') {
581
+ console.error(typeof config === 'string' ? config : parsed);
582
+ return 1;
583
+ }
584
+ const product = (0, cli_args_1.oneProductOf)({ target, config, asked: args.values['--product'] });
585
+ if (typeof product === 'string') {
586
+ console.error(product);
587
+ return 1;
588
+ }
589
+ const part = (0, resolve_product_1.partKeyOf)(parsed);
590
+ const refusal = product.parts.some((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === part)
591
+ ? (0, harness_map_1.harnessStaleOf)({ target, product })
592
+ : `${product.name} has no part ${part}`;
593
+ if (refusal !== null) {
594
+ console.error(refusal);
595
+ return 1;
596
+ }
597
+ const printed = new Set();
598
+ const checked = yield (0, harness_server_1.withHarnessUrl)({
599
+ target,
600
+ product,
601
+ url: args.values['--url'],
602
+ start: options.start,
603
+ run: (url) => {
604
+ var _a, _b;
605
+ return ((_a = options.check) !== null && _a !== void 0 ? _a : exports.checkActions)({
606
+ target,
607
+ config,
608
+ product,
609
+ part: part,
610
+ url,
611
+ only: (_b = args.values['--state']) !== null && _b !== void 0 ? _b : null,
612
+ onLine: (line) => {
613
+ printed.add(line);
614
+ console.log((0, exports.actionLineOf)(line));
615
+ },
616
+ });
617
+ },
618
+ });
619
+ if (typeof checked === 'string') {
620
+ console.error(checked);
621
+ return 1;
622
+ }
623
+ for (const line of checked.lines)
624
+ if (!printed.has(line))
625
+ console.log((0, exports.actionLineOf)(line));
626
+ for (const host of (_a = checked.hosts) !== null && _a !== void 0 ? _a : [])
627
+ console.log((0, exports.hostLineOf)(host));
628
+ if (checked.pictures !== null)
629
+ console.log(`pictures: ${checked.pictures}`);
630
+ const failed = checked.lines.filter((line) => line.failure !== null).length;
631
+ if (checked.lines.length === 0) {
632
+ console.log(((_b = checked.embedders) === null || _b === void 0 ? void 0 : _b.length)
633
+ ? `${part}: exempt - ${checked.embedders.join(', ')} declare(s) the actions of its elements`
634
+ : `${part} has no interactive element`);
635
+ return 0;
636
+ }
637
+ console.log(failed === 0
638
+ ? `${part}: every declared action works`
639
+ : `${part}: ${failed} of ${checked.lines.length} action check(s) failed`);
640
+ return failed === 0 ? 0 : 1;
641
+ });
642
+ exports.designActions = designActions;
643
+ const designLiveActions = (options) => __awaiter(void 0, void 0, void 0, function* () {
644
+ const { target, args, config } = options;
645
+ const parsed = args.positional[0] === undefined ? null : (0, sketch_1.parseTarget)(args.positional[0]);
646
+ if (typeof config === 'string' || typeof parsed === 'string') {
647
+ console.error(typeof config === 'string' ? config : parsed);
648
+ return 1;
649
+ }
650
+ const product = (0, cli_args_1.oneProductOf)({ target, config, asked: args.values['--product'] });
651
+ if (typeof product === 'string') {
652
+ console.error(product);
653
+ return 1;
654
+ }
655
+ const part = parsed === null ? null : (0, resolve_product_1.partKeyOf)(parsed);
656
+ if (part !== null && !product.parts.some((candidate) => (0, resolve_product_1.partKeyOf)(candidate) === part)) {
657
+ console.error(`${product.name} has no part ${part}`);
658
+ return 1;
659
+ }
660
+ const printed = new Set();
661
+ const checked = yield (0, harness_server_1.withHarnessUrl)({
662
+ target,
663
+ product,
664
+ url: args.values['--url'],
665
+ start: options.start,
666
+ run: (url) => {
667
+ var _a;
668
+ return ((_a = options.checkLive) !== null && _a !== void 0 ? _a : live_actions_1.checkLiveActions)({
669
+ target,
670
+ config,
671
+ product,
672
+ url,
673
+ part,
674
+ onLine: (line) => {
675
+ printed.add(line);
676
+ console.log((0, live_actions_1.liveLineOf)(line));
677
+ },
678
+ });
679
+ },
680
+ });
681
+ if (typeof checked === 'string') {
682
+ console.error(checked);
683
+ return 1;
684
+ }
685
+ for (const line of checked.lines)
686
+ if (!printed.has(line))
687
+ console.log((0, live_actions_1.liveLineOf)(line));
688
+ const failed = checked.lines.filter((line) => line.failure !== null).length;
689
+ const scope = part !== null && part !== void 0 ? part : 'the live pages';
690
+ console.log(failed === 0
691
+ ? `${scope}: every shell control reaches its declared action and behaves the same on every page`
692
+ : `${scope}: ${failed} of ${checked.lines.length} live action check(s) failed`);
693
+ return failed === 0 ? 0 : 1;
694
+ });
695
+ //# sourceMappingURL=actions-command.js.map