undercity 1.0.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 (382) hide show
  1. package/AGENTS.md +26 -0
  2. package/README.md +58 -0
  3. package/actions/AGENTS.md +41 -0
  4. package/actions/_shared/container.js +16 -0
  5. package/actions/auth/ask-login/action.json +15 -0
  6. package/actions/auth/ask-signup/action.json +14 -0
  7. package/actions/display/clear/action.json +18 -0
  8. package/actions/display/clear/action.test.js +32 -0
  9. package/actions/display/markdown/action.json +12 -0
  10. package/actions/display/markdown/action.test.js +32 -0
  11. package/actions/display/rawHtml/action.json +24 -0
  12. package/actions/display/rawHtml/action.test.js +32 -0
  13. package/actions/display/safeHtml/action.json +24 -0
  14. package/actions/display/safeHtml/action.test.js +32 -0
  15. package/actions/display/text/action.js +9 -0
  16. package/actions/display/text/action.json +12 -0
  17. package/actions/display/text/action.test.js +40 -0
  18. package/actions/display/value/action.json +24 -0
  19. package/actions/display/value/action.test.js +32 -0
  20. package/actions/dom/addClass/action.json +23 -0
  21. package/actions/dom/addClass/action.test.js +32 -0
  22. package/actions/dom/focus/action.json +17 -0
  23. package/actions/dom/focus/action.test.js +32 -0
  24. package/actions/dom/hide/action.json +18 -0
  25. package/actions/dom/hide/action.test.js +32 -0
  26. package/actions/dom/removeClass/action.json +22 -0
  27. package/actions/dom/removeClass/action.test.js +32 -0
  28. package/actions/dom/scroll/action.json +29 -0
  29. package/actions/dom/scroll/action.test.js +32 -0
  30. package/actions/dom/setAttr/action.json +29 -0
  31. package/actions/dom/setAttr/action.test.js +32 -0
  32. package/actions/dom/setHtml/action.json +22 -0
  33. package/actions/dom/setHtml/action.test.js +32 -0
  34. package/actions/dom/setStyle/action.json +29 -0
  35. package/actions/dom/setStyle/action.test.js +32 -0
  36. package/actions/dom/setText/action.json +24 -0
  37. package/actions/dom/setText/action.test.js +32 -0
  38. package/actions/dom/show/action.json +18 -0
  39. package/actions/dom/show/action.test.js +32 -0
  40. package/actions/dom/toggle/action.json +17 -0
  41. package/actions/dom/toggle/action.test.js +32 -0
  42. package/actions/dom/toggleClass/action.json +22 -0
  43. package/actions/dom/toggleClass/action.test.js +32 -0
  44. package/actions/event/emit/action.json +24 -0
  45. package/actions/event/emit/action.test.js +32 -0
  46. package/actions/event/on/action.json +23 -0
  47. package/actions/event/on/action.test.js +32 -0
  48. package/actions/event/waitFor/action.json +28 -0
  49. package/actions/event/waitFor/action.test.js +32 -0
  50. package/actions/forms/bindField/action.js +27 -0
  51. package/actions/forms/bindField/action.json +24 -0
  52. package/actions/forms/bindField/action.test.js +20 -0
  53. package/actions/forms/check/action.json +22 -0
  54. package/actions/forms/check/action.test.js +32 -0
  55. package/actions/forms/clearErrors/action.json +11 -0
  56. package/actions/forms/clearErrors/action.test.js +35 -0
  57. package/actions/forms/clearField/action.json +17 -0
  58. package/actions/forms/clearField/action.test.js +32 -0
  59. package/actions/forms/getField/action.json +24 -0
  60. package/actions/forms/getField/action.test.js +32 -0
  61. package/actions/forms/getRange/action.json +22 -0
  62. package/actions/forms/getRange/action.test.js +32 -0
  63. package/actions/forms/getSelect/action.json +22 -0
  64. package/actions/forms/getSelect/action.test.js +32 -0
  65. package/actions/forms/index.js +140 -0
  66. package/actions/forms/serialize/action.json +24 -0
  67. package/actions/forms/serialize/action.test.js +32 -0
  68. package/actions/forms/setCheck/action.json +23 -0
  69. package/actions/forms/setCheck/action.test.js +32 -0
  70. package/actions/forms/setError/action.json +22 -0
  71. package/actions/forms/setError/action.test.js +32 -0
  72. package/actions/forms/setField/action.js +14 -0
  73. package/actions/forms/setField/action.json +24 -0
  74. package/actions/forms/setField/action.test.js +32 -0
  75. package/actions/forms/submit/action.json +18 -0
  76. package/actions/forms/submit/action.test.js +32 -0
  77. package/actions/forms/validate/action.json +24 -0
  78. package/actions/forms/validate/action.test.js +32 -0
  79. package/actions/http/delete/action.json +22 -0
  80. package/actions/http/delete/action.test.js +32 -0
  81. package/actions/http/get/action.json +24 -0
  82. package/actions/http/get/action.test.js +32 -0
  83. package/actions/http/post/action.json +30 -0
  84. package/actions/http/post/action.test.js +32 -0
  85. package/actions/http/put/action.json +27 -0
  86. package/actions/http/put/action.test.js +32 -0
  87. package/actions/http/upload/action.json +35 -0
  88. package/actions/http/upload/action.test.js +32 -0
  89. package/actions/index.js +306 -0
  90. package/actions/index.json +5 -0
  91. package/actions/input/askChoice/action.json +29 -0
  92. package/actions/input/askChoice/action.test.js +32 -0
  93. package/actions/input/askConfirm/action.json +24 -0
  94. package/actions/input/askConfirm/action.test.js +32 -0
  95. package/actions/input/askDate/action.json +24 -0
  96. package/actions/input/askDate/action.test.js +32 -0
  97. package/actions/input/askEmail/action.json +24 -0
  98. package/actions/input/askEmail/action.test.js +32 -0
  99. package/actions/input/askNumber/action.json +35 -0
  100. package/actions/input/askNumber/action.test.js +32 -0
  101. package/actions/input/askPassword/action.json +24 -0
  102. package/actions/input/askPassword/action.test.js +32 -0
  103. package/actions/input/askText/action.json +36 -0
  104. package/actions/input/askText/action.test.js +32 -0
  105. package/actions/logic/delay/action.json +18 -0
  106. package/actions/logic/delay/action.test.js +32 -0
  107. package/actions/logic/if/action.json +28 -0
  108. package/actions/logic/if/action.test.js +32 -0
  109. package/actions/logic/log/action.json +18 -0
  110. package/actions/logic/log/action.test.js +32 -0
  111. package/actions/logic/random/action.json +36 -0
  112. package/actions/logic/random/action.test.js +32 -0
  113. package/actions/logic/transform/action.json +24 -0
  114. package/actions/logic/transform/action.test.js +32 -0
  115. package/actions/media/askAudioUpload/action.json +30 -0
  116. package/actions/media/askAudioUpload/action.test.js +32 -0
  117. package/actions/media/askFileUpload/action.json +36 -0
  118. package/actions/media/askFileUpload/action.test.js +32 -0
  119. package/actions/media/askImageUpload/action.json +37 -0
  120. package/actions/media/askImageUpload/action.test.js +32 -0
  121. package/actions/media/askVideoUpload/action.js +74 -0
  122. package/actions/media/askVideoUpload/action.json +44 -0
  123. package/actions/media/askVideoUpload/action.test.js +51 -0
  124. package/actions/media/captureWebcam/action.json +24 -0
  125. package/actions/media/captureWebcam/action.test.js +32 -0
  126. package/actions/nav/back/action.json +11 -0
  127. package/actions/nav/back/action.test.js +35 -0
  128. package/actions/nav/goto/action.json +18 -0
  129. package/actions/nav/goto/action.test.js +32 -0
  130. package/actions/nav/redirect/action.json +28 -0
  131. package/actions/nav/redirect/action.test.js +32 -0
  132. package/actions/nav/reload/action.json +11 -0
  133. package/actions/nav/reload/action.test.js +35 -0
  134. package/actions/nav/reset/action.json +11 -0
  135. package/actions/nav/reset/action.test.js +35 -0
  136. package/actions/render/alert/action.js +12 -0
  137. package/actions/render/alert/action.json +36 -0
  138. package/actions/render/alert/action.test.js +32 -0
  139. package/actions/render/button/action.js +15 -0
  140. package/actions/render/button/action.json +44 -0
  141. package/actions/render/button/action.test.js +37 -0
  142. package/actions/render/clear/action.js +7 -0
  143. package/actions/render/clear/action.json +11 -0
  144. package/actions/render/clear/action.test.js +35 -0
  145. package/actions/render/divider/action.js +8 -0
  146. package/actions/render/divider/action.json +11 -0
  147. package/actions/render/divider/action.test.js +35 -0
  148. package/actions/render/field/action.js +17 -0
  149. package/actions/render/field/action.json +59 -0
  150. package/actions/render/field/action.test.js +57 -0
  151. package/actions/render/link/action.js +20 -0
  152. package/actions/render/link/action.json +30 -0
  153. package/actions/render/link/action.test.js +32 -0
  154. package/actions/render/markdown/action.json +18 -0
  155. package/actions/render/markdown/action.test.js +32 -0
  156. package/actions/render/paragraph/action.js +9 -0
  157. package/actions/render/paragraph/action.json +32 -0
  158. package/actions/render/paragraph/action.test.js +32 -0
  159. package/actions/render/section/action.js +10 -0
  160. package/actions/render/section/action.json +18 -0
  161. package/actions/render/section/action.test.js +32 -0
  162. package/actions/render/subtitle/action.js +9 -0
  163. package/actions/render/subtitle/action.json +18 -0
  164. package/actions/render/subtitle/action.test.js +32 -0
  165. package/actions/render/title/action.js +9 -0
  166. package/actions/render/title/action.json +30 -0
  167. package/actions/render/title/action.test.js +44 -0
  168. package/actions/session/clear/action.json +11 -0
  169. package/actions/session/clear/action.test.js +35 -0
  170. package/actions/session/load/action.json +22 -0
  171. package/actions/session/load/action.test.js +32 -0
  172. package/actions/session/local/action.json +22 -0
  173. package/actions/session/local/action.test.js +32 -0
  174. package/actions/session/save/action.json +22 -0
  175. package/actions/session/save/action.test.js +32 -0
  176. package/actions/ui/accordion/action.json +23 -0
  177. package/actions/ui/accordion/action.test.js +32 -0
  178. package/actions/ui/badge/action.json +22 -0
  179. package/actions/ui/badge/action.test.js +32 -0
  180. package/actions/ui/collapse/action.json +23 -0
  181. package/actions/ui/collapse/action.test.js +32 -0
  182. package/actions/ui/hideModal/action.json +17 -0
  183. package/actions/ui/hideModal/action.test.js +32 -0
  184. package/actions/ui/loading/action.json +18 -0
  185. package/actions/ui/loading/action.test.js +32 -0
  186. package/actions/ui/modal/action.json +18 -0
  187. package/actions/ui/modal/action.test.js +32 -0
  188. package/actions/ui/progress/action.json +24 -0
  189. package/actions/ui/progress/action.test.js +32 -0
  190. package/actions/ui/toast/action.json +29 -0
  191. package/actions/ui/toast/action.test.js +32 -0
  192. package/actions/ui/tooltip/action.json +17 -0
  193. package/actions/ui/tooltip/action.test.js +32 -0
  194. package/actions/user/carry/action.json +25 -0
  195. package/actions/user/carry/action.test.js +32 -0
  196. package/actions/user/check/action.json +24 -0
  197. package/actions/user/check/action.test.js +32 -0
  198. package/actions/user/clear/action.json +11 -0
  199. package/actions/user/clear/action.test.js +35 -0
  200. package/actions/user/delete/action.json +17 -0
  201. package/actions/user/delete/action.test.js +32 -0
  202. package/actions/user/dump/action.json +11 -0
  203. package/actions/user/dump/action.test.js +35 -0
  204. package/actions/user/get/action.json +24 -0
  205. package/actions/user/get/action.test.js +32 -0
  206. package/actions/user/merge/action.json +18 -0
  207. package/actions/user/merge/action.test.js +32 -0
  208. package/actions/user/set/action.json +24 -0
  209. package/actions/user/set/action.test.js +32 -0
  210. package/generator/base/css/bootstrap.min.css +6 -0
  211. package/generator/base/icons/app-indicator.svg +4 -0
  212. package/generator/base/icons/backpack.svg +4 -0
  213. package/generator/base/icons/broadcast.svg +3 -0
  214. package/generator/base/icons/bullseye.svg +6 -0
  215. package/generator/base/icons/chat-dots.svg +4 -0
  216. package/generator/base/icons/check-circle.svg +4 -0
  217. package/generator/base/icons/clipboard-check.svg +5 -0
  218. package/generator/base/icons/clipboard.svg +4 -0
  219. package/generator/base/icons/copy.svg +3 -0
  220. package/generator/base/icons/cursor.svg +3 -0
  221. package/generator/base/icons/diamond.svg +3 -0
  222. package/generator/base/icons/exclamation-triangle.svg +4 -0
  223. package/generator/base/icons/film.svg +3 -0
  224. package/generator/base/icons/floppy.svg +4 -0
  225. package/generator/base/icons/gear-wide-connected.svg +3 -0
  226. package/generator/base/icons/gear.svg +4 -0
  227. package/generator/base/icons/globe.svg +3 -0
  228. package/generator/base/icons/image.svg +4 -0
  229. package/generator/base/icons/layout-text-window.svg +4 -0
  230. package/generator/base/icons/lightning-charge.svg +3 -0
  231. package/generator/base/icons/magic.svg +3 -0
  232. package/generator/base/icons/pencil-square.svg +4 -0
  233. package/generator/base/icons/record-circle.svg +4 -0
  234. package/generator/base/icons/robot.svg +4 -0
  235. package/generator/base/icons/shield-check.svg +4 -0
  236. package/generator/base/icons/shield-lock.svg +4 -0
  237. package/generator/base/icons/signpost.svg +3 -0
  238. package/generator/base/icons/stars.svg +3 -0
  239. package/generator/base/icons/type.svg +3 -0
  240. package/generator/base/js/bootstrap.bundle.min.js +7 -0
  241. package/package.json +14 -0
  242. package/packages/undercity-http-server/index.js +249 -0
  243. package/packages/undercity-http-server/package.json +10 -0
  244. package/packages/undercity-parser/index.js +323 -0
  245. package/packages/undercity-parser/lexer.js +128 -0
  246. package/packages/undercity-parser/package.json +11 -0
  247. package/plugins/forms.js +397 -0
  248. package/plugins/index.js +83 -0
  249. package/plugins/multipage.js +165 -0
  250. package/plugins/wizard.js +239 -0
  251. package/projects/asd/project.json +1031 -0
  252. package/projects/test-1/project.json +335 -0
  253. package/projects/test-a/project.json +456 -0
  254. package/public/icons/arrows-angle-expand.svg +3 -0
  255. package/public/icons/arrows-fullscreen.svg +3 -0
  256. package/public/icons/bezier2.svg +3 -0
  257. package/public/icons/bootstrap/app-indicator.svg +4 -0
  258. package/public/icons/bootstrap/arrow-clockwise.svg +4 -0
  259. package/public/icons/bootstrap/arrow-counterclockwise.svg +4 -0
  260. package/public/icons/bootstrap/arrow-left.svg +3 -0
  261. package/public/icons/bootstrap/arrows-angle-expand.svg +3 -0
  262. package/public/icons/bootstrap/arrows-fullscreen.svg +3 -0
  263. package/public/icons/bootstrap/backpack.svg +4 -0
  264. package/public/icons/bootstrap/bezier2.svg +3 -0
  265. package/public/icons/bootstrap/bookmark-check.svg +4 -0
  266. package/public/icons/bootstrap/bookmark-plus.svg +4 -0
  267. package/public/icons/bootstrap/box-arrow-right.svg +4 -0
  268. package/public/icons/bootstrap/box-arrow-up.svg +4 -0
  269. package/public/icons/bootstrap/broadcast.svg +3 -0
  270. package/public/icons/bootstrap/bullseye.svg +6 -0
  271. package/public/icons/bootstrap/chat-dots.svg +4 -0
  272. package/public/icons/bootstrap/check-circle.svg +4 -0
  273. package/public/icons/bootstrap/check2.svg +3 -0
  274. package/public/icons/bootstrap/clipboard-check.svg +5 -0
  275. package/public/icons/bootstrap/clipboard.svg +4 -0
  276. package/public/icons/bootstrap/clock-history.svg +5 -0
  277. package/public/icons/bootstrap/command.svg +3 -0
  278. package/public/icons/bootstrap/copy.svg +3 -0
  279. package/public/icons/bootstrap/cursor.svg +3 -0
  280. package/public/icons/bootstrap/diagram-3.svg +3 -0
  281. package/public/icons/bootstrap/diamond.svg +3 -0
  282. package/public/icons/bootstrap/exclamation-triangle.svg +4 -0
  283. package/public/icons/bootstrap/eye.svg +4 -0
  284. package/public/icons/bootstrap/file-earmark-plus.svg +4 -0
  285. package/public/icons/bootstrap/film.svg +3 -0
  286. package/public/icons/bootstrap/floppy.svg +4 -0
  287. package/public/icons/bootstrap/folder2-open.svg +3 -0
  288. package/public/icons/bootstrap/gear-wide-connected.svg +3 -0
  289. package/public/icons/bootstrap/gear.svg +4 -0
  290. package/public/icons/bootstrap/globe.svg +3 -0
  291. package/public/icons/bootstrap/grid-3x3-gap.svg +3 -0
  292. package/public/icons/bootstrap/house-door.svg +3 -0
  293. package/public/icons/bootstrap/image.svg +4 -0
  294. package/public/icons/bootstrap/layout-text-window.svg +4 -0
  295. package/public/icons/bootstrap/lightning-charge.svg +3 -0
  296. package/public/icons/bootstrap/magic.svg +3 -0
  297. package/public/icons/bootstrap/pencil-square.svg +4 -0
  298. package/public/icons/bootstrap/pencil.svg +3 -0
  299. package/public/icons/bootstrap/play.svg +3 -0
  300. package/public/icons/bootstrap/plus-circle.svg +4 -0
  301. package/public/icons/bootstrap/plus-lg.svg +3 -0
  302. package/public/icons/bootstrap/record-circle.svg +4 -0
  303. package/public/icons/bootstrap/robot.svg +4 -0
  304. package/public/icons/bootstrap/save.svg +3 -0
  305. package/public/icons/bootstrap/scissors.svg +3 -0
  306. package/public/icons/bootstrap/shield-check.svg +4 -0
  307. package/public/icons/bootstrap/shield-lock.svg +4 -0
  308. package/public/icons/bootstrap/signpost.svg +3 -0
  309. package/public/icons/bootstrap/stars.svg +3 -0
  310. package/public/icons/bootstrap/stop-circle.svg +4 -0
  311. package/public/icons/bootstrap/terminal.svg +4 -0
  312. package/public/icons/bootstrap/trash3.svg +3 -0
  313. package/public/icons/bootstrap/type.svg +3 -0
  314. package/public/icons/bootstrap/x-circle.svg +4 -0
  315. package/public/icons/bootstrap/x-lg.svg +3 -0
  316. package/public/icons/bootstrap/zoom-in.svg +5 -0
  317. package/public/icons/bootstrap/zoom-out.svg +5 -0
  318. package/public/icons/bullseye.svg +6 -0
  319. package/public/icons/check2.svg +3 -0
  320. package/public/icons/cursor.svg +3 -0
  321. package/public/icons/diamond.svg +3 -0
  322. package/public/icons/eye.svg +4 -0
  323. package/public/icons/file-earmark-plus.svg +4 -0
  324. package/public/icons/floppy.svg +4 -0
  325. package/public/icons/gear.svg +4 -0
  326. package/public/icons/lightning-charge.svg +3 -0
  327. package/public/icons/pencil.svg +3 -0
  328. package/public/icons/play.svg +3 -0
  329. package/public/icons/plus-circle.svg +4 -0
  330. package/public/icons/record-circle.svg +4 -0
  331. package/public/icons/robot.svg +4 -0
  332. package/public/icons/save.svg +3 -0
  333. package/public/icons/stop-circle.svg +4 -0
  334. package/public/icons/terminal.svg +4 -0
  335. package/public/icons/trash3.svg +3 -0
  336. package/public/icons/x-circle.svg +4 -0
  337. package/public/icons/zoom-in.svg +5 -0
  338. package/public/icons/zoom-out.svg +5 -0
  339. package/public/index.html +424 -0
  340. package/public/testbench.html +899 -0
  341. package/scripts/extract-actions.js +128 -0
  342. package/server.js +11 -0
  343. package/src/emitter.js +48 -0
  344. package/src/generator/css.js +135 -0
  345. package/src/generator/index.js +122 -0
  346. package/src/generator/md-renderer-src.js +77 -0
  347. package/src/generator/page.js +300 -0
  348. package/src/generator/runtime.js +1632 -0
  349. package/src/generator/templates.js +508 -0
  350. package/src/ide/action-library.js +856 -0
  351. package/src/ide/af-icons.js +127 -0
  352. package/src/ide/app.js +1375 -0
  353. package/src/ide/command-line/commands.js +242 -0
  354. package/src/ide/command-line/index.js +329 -0
  355. package/src/ide/command-line/parser.js +21 -0
  356. package/src/ide/css/ide.css +1501 -0
  357. package/src/ide/graph.js +282 -0
  358. package/src/ide/history.js +46 -0
  359. package/src/ide/map-builder.js +583 -0
  360. package/src/ide/project-api.js +39 -0
  361. package/src/ide/savant-chat.js +513 -0
  362. package/src/ide/savant.js +1287 -0
  363. package/src/ide/thing-library.js +89 -0
  364. package/src/ide/undercity-map.js +978 -0
  365. package/src/lib/icons.js +72 -0
  366. package/src/lib/scope.js +88 -0
  367. package/src/lib/signal.js +155 -0
  368. package/src/lib/state-machine.js +113 -0
  369. package/src/server/index.js +96 -0
  370. package/src/server/routes/actions.js +144 -0
  371. package/src/server/routes/ai.js +176 -0
  372. package/src/server/routes/generate.js +54 -0
  373. package/src/server/routes/projects.js +106 -0
  374. package/src/server/routes/reset.js +30 -0
  375. package/src/server/routes/submit.js +30 -0
  376. package/src/server/routes/templates.js +139 -0
  377. package/src/server/routes/things.js +33 -0
  378. package/templates/auth-flow.json +335 -0
  379. package/templates/blank.json +39 -0
  380. package/things/auth-server/thing.json +17 -0
  381. package/things/persona-live/thing.json +20 -0
  382. package/things/workflow/thing.json +15 -0
@@ -0,0 +1,23 @@
1
+ {
2
+ "id": "form.setCheck",
3
+ "category": "forms",
4
+ "categoryLabel": "Forms",
5
+ "icon": "clipboard-check",
6
+ "color": "var(--sol-yellow)",
7
+ "label": "Set Checkbox",
8
+ "desc": "Check or uncheck a checkbox by name.",
9
+ "version": "1.0.0",
10
+ "params": [
11
+ {
12
+ "name": "name",
13
+ "label": "Field name",
14
+ "type": "text"
15
+ },
16
+ {
17
+ "name": "checked",
18
+ "label": "Checked",
19
+ "type": "boolean",
20
+ "default": true
21
+ }
22
+ ]
23
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * action.test.js — Unit tests for form.setCheck
3
+ * Set Checkbox: Check or uncheck a checkbox by name.
4
+ *
5
+ * Each test receives (RT, sandbox) where:
6
+ * RT — the generated runtime module (Inventory, Navigator, Actions, ...)
7
+ * sandbox — a <div> containing #pw-content, #pw-form, #pw-loading
8
+ */
9
+
10
+ export const tests = [
11
+
12
+ {
13
+ name: 'form.setCheck — is exported from runtime',
14
+ run(RT) {
15
+ const ns = RT.Form ?? RT.form;
16
+ if (!ns) throw new Error('Namespace Form/form not found in runtime');
17
+ if (typeof ns.setCheck !== 'function') throw new Error('form.setCheck is not a function');
18
+ },
19
+ },
20
+
21
+ {
22
+ name: 'form.setCheck — can be called with default params',
23
+ async run(RT, sandbox) {
24
+ try {
25
+ await RT.Form.setCheck?.("", true);
26
+ } catch (e) {
27
+ if (e instanceof TypeError) throw e;
28
+ }
29
+ },
30
+ },
31
+
32
+ ];
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "form.setError",
3
+ "category": "forms",
4
+ "categoryLabel": "Forms",
5
+ "icon": "clipboard-check",
6
+ "color": "var(--sol-yellow)",
7
+ "label": "Set Field Error",
8
+ "desc": "Show an error message under a field using [data-error=\"name\"].",
9
+ "version": "1.0.0",
10
+ "params": [
11
+ {
12
+ "name": "name",
13
+ "label": "Field name",
14
+ "type": "text"
15
+ },
16
+ {
17
+ "name": "msg",
18
+ "label": "Message",
19
+ "type": "text"
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * action.test.js — Unit tests for form.setError
3
+ * Set Field Error: Show an error message under a field using [data-error="name"].
4
+ *
5
+ * Each test receives (RT, sandbox) where:
6
+ * RT — the generated runtime module (Inventory, Navigator, Actions, ...)
7
+ * sandbox — a <div> containing #pw-content, #pw-form, #pw-loading
8
+ */
9
+
10
+ export const tests = [
11
+
12
+ {
13
+ name: 'form.setError — is exported from runtime',
14
+ run(RT) {
15
+ const ns = RT.Form ?? RT.form;
16
+ if (!ns) throw new Error('Namespace Form/form not found in runtime');
17
+ if (typeof ns.setError !== 'function') throw new Error('form.setError is not a function');
18
+ },
19
+ },
20
+
21
+ {
22
+ name: 'form.setError — can be called with default params',
23
+ async run(RT, sandbox) {
24
+ try {
25
+ await RT.Form.setError?.("", "");
26
+ } catch (e) {
27
+ if (e instanceof TypeError) throw e;
28
+ }
29
+ },
30
+ },
31
+
32
+ ];
@@ -0,0 +1,14 @@
1
+ /**
2
+ * form.setField — runtime implementation
3
+ *
4
+ * Sets a form input's value. When called via a step with an inventory-key param,
5
+ * runPayload resolves { $$inv: "key" } → Inventory.get("key") before passing here.
6
+ * So this function always receives the resolved value.
7
+ *
8
+ * In runtime.js, this lives inside the Actions object:
9
+ *
10
+ * setField(name, val) {
11
+ * const el = document.querySelector(`[name="${name}"]`);
12
+ * if (el) el.value = val ?? '';
13
+ * },
14
+ */
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "form.setField",
3
+ "category": "forms",
4
+ "categoryLabel": "Forms",
5
+ "icon": "clipboard-check",
6
+ "color": "var(--sol-yellow)",
7
+ "label": "Set Field Value",
8
+ "desc": "Set a form field's value from an inventory key once when this step runs. Use Configure mode for JS expressions.",
9
+ "version": "2.0.0",
10
+ "params": [
11
+ {
12
+ "name": "name",
13
+ "label": "Field name",
14
+ "type": "text",
15
+ "placeholder": "email"
16
+ },
17
+ {
18
+ "name": "value",
19
+ "label": "Inventory key",
20
+ "type": "inventory-key",
21
+ "placeholder": "userEmail"
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * action.test.js — Unit tests for form.setField
3
+ * Set Field Value: Programmatically set a form field value.
4
+ *
5
+ * Each test receives (RT, sandbox) where:
6
+ * RT — the generated runtime module (Inventory, Navigator, Actions, ...)
7
+ * sandbox — a <div> containing #pw-content, #pw-form, #pw-loading
8
+ */
9
+
10
+ export const tests = [
11
+
12
+ {
13
+ name: 'form.setField — is exported from runtime',
14
+ run(RT) {
15
+ const ns = RT.Form ?? RT.form;
16
+ if (!ns) throw new Error('Namespace Form/form not found in runtime');
17
+ if (typeof ns.setField !== 'function') throw new Error('form.setField is not a function');
18
+ },
19
+ },
20
+
21
+ {
22
+ name: 'form.setField — can be called with default params',
23
+ async run(RT, sandbox) {
24
+ try {
25
+ await RT.Form.setField?.("", "");
26
+ } catch (e) {
27
+ if (e instanceof TypeError) throw e;
28
+ }
29
+ },
30
+ },
31
+
32
+ ];
@@ -0,0 +1,18 @@
1
+ {
2
+ "id": "form.submit",
3
+ "category": "forms",
4
+ "categoryLabel": "Forms",
5
+ "icon": "clipboard-check",
6
+ "color": "var(--sol-yellow)",
7
+ "label": "Submit Form",
8
+ "desc": "Programmatically submit a form element.",
9
+ "version": "1.0.0",
10
+ "params": [
11
+ {
12
+ "name": "selector",
13
+ "label": "Form",
14
+ "type": "text",
15
+ "placeholder": "#my-form"
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * action.test.js — Unit tests for form.submit
3
+ * Submit Form: Programmatically submit a form element.
4
+ *
5
+ * Each test receives (RT, sandbox) where:
6
+ * RT — the generated runtime module (Inventory, Navigator, Actions, ...)
7
+ * sandbox — a <div> containing #pw-content, #pw-form, #pw-loading
8
+ */
9
+
10
+ export const tests = [
11
+
12
+ {
13
+ name: 'form.submit — is exported from runtime',
14
+ run(RT) {
15
+ const ns = RT.Form ?? RT.form;
16
+ if (!ns) throw new Error('Namespace Form/form not found in runtime');
17
+ if (typeof ns.submit !== 'function') throw new Error('form.submit is not a function');
18
+ },
19
+ },
20
+
21
+ {
22
+ name: 'form.submit — can be called with default params',
23
+ async run(RT, sandbox) {
24
+ try {
25
+ await RT.Form.submit?.("#my-form");
26
+ } catch (e) {
27
+ if (e instanceof TypeError) throw e;
28
+ }
29
+ },
30
+ },
31
+
32
+ ];
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "form.validate",
3
+ "category": "forms",
4
+ "categoryLabel": "Forms",
5
+ "icon": "clipboard-check",
6
+ "color": "var(--sol-yellow)",
7
+ "label": "Validate Form",
8
+ "desc": "Run HTML5 constraint validation and show Bootstrap invalid-feedback.",
9
+ "version": "1.0.0",
10
+ "params": [
11
+ {
12
+ "name": "selector",
13
+ "label": "Form selector",
14
+ "type": "text",
15
+ "placeholder": "#my-form"
16
+ },
17
+ {
18
+ "name": "into",
19
+ "label": "Result var",
20
+ "type": "text",
21
+ "placeholder": "isValid"
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * action.test.js — Unit tests for form.validate
3
+ * Validate Form: Run HTML5 constraint validation and show Bootstrap invalid-feedback.
4
+ *
5
+ * Each test receives (RT, sandbox) where:
6
+ * RT — the generated runtime module (Inventory, Navigator, Actions, ...)
7
+ * sandbox — a <div> containing #pw-content, #pw-form, #pw-loading
8
+ */
9
+
10
+ export const tests = [
11
+
12
+ {
13
+ name: 'form.validate — is exported from runtime',
14
+ run(RT) {
15
+ const ns = RT.Form ?? RT.form;
16
+ if (!ns) throw new Error('Namespace Form/form not found in runtime');
17
+ if (typeof ns.validate !== 'function') throw new Error('form.validate is not a function');
18
+ },
19
+ },
20
+
21
+ {
22
+ name: 'form.validate — can be called with default params',
23
+ async run(RT, sandbox) {
24
+ try {
25
+ await RT.Form.validate?.("#my-form");
26
+ } catch (e) {
27
+ if (e instanceof TypeError) throw e;
28
+ }
29
+ },
30
+ },
31
+
32
+ ];
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "http.delete",
3
+ "category": "http",
4
+ "categoryLabel": "HTTP",
5
+ "icon": "globe",
6
+ "color": "var(--sol-violet)",
7
+ "label": "HTTP DELETE",
8
+ "desc": "Send a DELETE request.",
9
+ "version": "1.0.0",
10
+ "params": [
11
+ {
12
+ "name": "url",
13
+ "label": "URL",
14
+ "type": "code"
15
+ },
16
+ {
17
+ "name": "into",
18
+ "label": "Store in",
19
+ "type": "text"
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * action.test.js — Unit tests for http.delete
3
+ * HTTP DELETE: Send a DELETE request.
4
+ *
5
+ * Each test receives (RT, sandbox) where:
6
+ * RT — the generated runtime module (Inventory, Navigator, Actions, ...)
7
+ * sandbox — a <div> containing #pw-content, #pw-form, #pw-loading
8
+ */
9
+
10
+ export const tests = [
11
+
12
+ {
13
+ name: 'http.delete — is exported from runtime',
14
+ run(RT) {
15
+ const ns = RT.Http ?? RT.http;
16
+ if (!ns) throw new Error('Namespace Http/http not found in runtime');
17
+ if (typeof ns.delete !== 'function') throw new Error('http.delete is not a function');
18
+ },
19
+ },
20
+
21
+ {
22
+ name: 'http.delete — can be called with default params',
23
+ async run(RT, sandbox) {
24
+ try {
25
+ await RT.Http.delete?.("");
26
+ } catch (e) {
27
+ if (e instanceof TypeError) throw e;
28
+ }
29
+ },
30
+ },
31
+
32
+ ];
@@ -0,0 +1,24 @@
1
+ {
2
+ "id": "http.get",
3
+ "category": "http",
4
+ "categoryLabel": "HTTP",
5
+ "icon": "globe",
6
+ "color": "var(--sol-violet)",
7
+ "label": "HTTP GET",
8
+ "desc": "Fetch JSON from a URL. Stores response in inventory.",
9
+ "version": "1.0.0",
10
+ "params": [
11
+ {
12
+ "name": "url",
13
+ "label": "URL",
14
+ "type": "code",
15
+ "placeholder": "\"/api/user\""
16
+ },
17
+ {
18
+ "name": "into",
19
+ "label": "Store in",
20
+ "type": "text",
21
+ "placeholder": "result"
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * action.test.js — Unit tests for http.get
3
+ * HTTP GET: Fetch JSON from a URL. Stores response in inventory.
4
+ *
5
+ * Each test receives (RT, sandbox) where:
6
+ * RT — the generated runtime module (Inventory, Navigator, Actions, ...)
7
+ * sandbox — a <div> containing #pw-content, #pw-form, #pw-loading
8
+ */
9
+
10
+ export const tests = [
11
+
12
+ {
13
+ name: 'http.get — is exported from runtime',
14
+ run(RT) {
15
+ const ns = RT.Http ?? RT.http;
16
+ if (!ns) throw new Error('Namespace Http/http not found in runtime');
17
+ if (typeof ns.get !== 'function') throw new Error('http.get is not a function');
18
+ },
19
+ },
20
+
21
+ {
22
+ name: 'http.get — can be called with default params',
23
+ async run(RT, sandbox) {
24
+ try {
25
+ await RT.Http.get?.("\"/api/user\"");
26
+ } catch (e) {
27
+ if (e instanceof TypeError) throw e;
28
+ }
29
+ },
30
+ },
31
+
32
+ ];
@@ -0,0 +1,30 @@
1
+ {
2
+ "id": "http.post",
3
+ "category": "http",
4
+ "categoryLabel": "HTTP",
5
+ "icon": "globe",
6
+ "color": "var(--sol-violet)",
7
+ "label": "HTTP POST",
8
+ "desc": "POST JSON body to a URL.",
9
+ "version": "1.0.0",
10
+ "params": [
11
+ {
12
+ "name": "url",
13
+ "label": "URL",
14
+ "type": "code",
15
+ "placeholder": "\"/api/login\""
16
+ },
17
+ {
18
+ "name": "body",
19
+ "label": "Body",
20
+ "type": "code",
21
+ "placeholder": "{ email, password }"
22
+ },
23
+ {
24
+ "name": "into",
25
+ "label": "Store in",
26
+ "type": "text",
27
+ "placeholder": "result"
28
+ }
29
+ ]
30
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * action.test.js — Unit tests for http.post
3
+ * HTTP POST: POST JSON body to a URL.
4
+ *
5
+ * Each test receives (RT, sandbox) where:
6
+ * RT — the generated runtime module (Inventory, Navigator, Actions, ...)
7
+ * sandbox — a <div> containing #pw-content, #pw-form, #pw-loading
8
+ */
9
+
10
+ export const tests = [
11
+
12
+ {
13
+ name: 'http.post — is exported from runtime',
14
+ run(RT) {
15
+ const ns = RT.Http ?? RT.http;
16
+ if (!ns) throw new Error('Namespace Http/http not found in runtime');
17
+ if (typeof ns.post !== 'function') throw new Error('http.post is not a function');
18
+ },
19
+ },
20
+
21
+ {
22
+ name: 'http.post — can be called with default params',
23
+ async run(RT, sandbox) {
24
+ try {
25
+ await RT.Http.post?.("\"/api/login\"", "{ email, password }");
26
+ } catch (e) {
27
+ if (e instanceof TypeError) throw e;
28
+ }
29
+ },
30
+ },
31
+
32
+ ];
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "http.put",
3
+ "category": "http",
4
+ "categoryLabel": "HTTP",
5
+ "icon": "globe",
6
+ "color": "var(--sol-violet)",
7
+ "label": "HTTP PUT",
8
+ "desc": "PUT JSON body to a URL.",
9
+ "version": "1.0.0",
10
+ "params": [
11
+ {
12
+ "name": "url",
13
+ "label": "URL",
14
+ "type": "code"
15
+ },
16
+ {
17
+ "name": "body",
18
+ "label": "Body",
19
+ "type": "code"
20
+ },
21
+ {
22
+ "name": "into",
23
+ "label": "Store in",
24
+ "type": "text"
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * action.test.js — Unit tests for http.put
3
+ * HTTP PUT: PUT JSON body to a URL.
4
+ *
5
+ * Each test receives (RT, sandbox) where:
6
+ * RT — the generated runtime module (Inventory, Navigator, Actions, ...)
7
+ * sandbox — a <div> containing #pw-content, #pw-form, #pw-loading
8
+ */
9
+
10
+ export const tests = [
11
+
12
+ {
13
+ name: 'http.put — is exported from runtime',
14
+ run(RT) {
15
+ const ns = RT.Http ?? RT.http;
16
+ if (!ns) throw new Error('Namespace Http/http not found in runtime');
17
+ if (typeof ns.put !== 'function') throw new Error('http.put is not a function');
18
+ },
19
+ },
20
+
21
+ {
22
+ name: 'http.put — can be called with default params',
23
+ async run(RT, sandbox) {
24
+ try {
25
+ await RT.Http.put?.("", "");
26
+ } catch (e) {
27
+ if (e instanceof TypeError) throw e;
28
+ }
29
+ },
30
+ },
31
+
32
+ ];
@@ -0,0 +1,35 @@
1
+ {
2
+ "id": "http.upload",
3
+ "category": "http",
4
+ "categoryLabel": "HTTP",
5
+ "icon": "globe",
6
+ "color": "var(--sol-violet)",
7
+ "label": "Upload File (multipart)",
8
+ "desc": "POST a file from inventory as multipart/form-data.",
9
+ "version": "1.0.0",
10
+ "params": [
11
+ {
12
+ "name": "url",
13
+ "label": "URL",
14
+ "type": "code"
15
+ },
16
+ {
17
+ "name": "fileVar",
18
+ "label": "File var",
19
+ "type": "text",
20
+ "placeholder": "uploadedVideo"
21
+ },
22
+ {
23
+ "name": "fieldName",
24
+ "label": "Field name",
25
+ "type": "text",
26
+ "placeholder": "file"
27
+ },
28
+ {
29
+ "name": "into",
30
+ "label": "Store in",
31
+ "type": "text",
32
+ "placeholder": "uploadResult"
33
+ }
34
+ ]
35
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * action.test.js — Unit tests for http.upload
3
+ * Upload File (multipart): POST a file from inventory as multipart/form-data.
4
+ *
5
+ * Each test receives (RT, sandbox) where:
6
+ * RT — the generated runtime module (Inventory, Navigator, Actions, ...)
7
+ * sandbox — a <div> containing #pw-content, #pw-form, #pw-loading
8
+ */
9
+
10
+ export const tests = [
11
+
12
+ {
13
+ name: 'http.upload — is exported from runtime',
14
+ run(RT) {
15
+ const ns = RT.Http ?? RT.http;
16
+ if (!ns) throw new Error('Namespace Http/http not found in runtime');
17
+ if (typeof ns.upload !== 'function') throw new Error('http.upload is not a function');
18
+ },
19
+ },
20
+
21
+ {
22
+ name: 'http.upload — can be called with default params',
23
+ async run(RT, sandbox) {
24
+ try {
25
+ await RT.Http.upload?.("", "uploadedVideo", "file");
26
+ } catch (e) {
27
+ if (e instanceof TypeError) throw e;
28
+ }
29
+ },
30
+ },
31
+
32
+ ];