@fieldia/core 0.30.0 → 0.31.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 (563) hide show
  1. package/README.md +362 -1
  2. package/package.json +1 -1
  3. package/schema/page.schema.json +758 -1
  4. package/src/index.d.mts +13 -2
  5. package/src/index.d.ts +13 -2
  6. package/src/index.js +45 -2
  7. package/src/index.js.map +1 -1
  8. package/src/index.mjs +18 -2
  9. package/src/index.mjs.map +1 -1
  10. package/src/lib/format/actions.d.mts +16 -16
  11. package/src/lib/format/actions.d.ts +16 -16
  12. package/src/lib/format/actions.js +3 -0
  13. package/src/lib/format/actions.js.map +1 -1
  14. package/src/lib/format/actions.mjs +3 -0
  15. package/src/lib/format/actions.mjs.map +1 -1
  16. package/src/lib/format/address-search.js +3 -0
  17. package/src/lib/format/address-search.js.map +1 -1
  18. package/src/lib/format/address-search.mjs +3 -0
  19. package/src/lib/format/address-search.mjs.map +1 -1
  20. package/src/lib/format/duplicates.js +3 -0
  21. package/src/lib/format/duplicates.js.map +1 -1
  22. package/src/lib/format/duplicates.mjs +3 -0
  23. package/src/lib/format/duplicates.mjs.map +1 -1
  24. package/src/lib/format/endings.js +3 -0
  25. package/src/lib/format/endings.js.map +1 -1
  26. package/src/lib/format/endings.mjs +3 -0
  27. package/src/lib/format/endings.mjs.map +1 -1
  28. package/src/lib/format/field.d.mts +669 -0
  29. package/src/lib/format/field.d.ts +669 -0
  30. package/src/lib/format/field.js +42 -4
  31. package/src/lib/format/field.js.map +1 -1
  32. package/src/lib/format/field.mjs +42 -4
  33. package/src/lib/format/field.mjs.map +1 -1
  34. package/src/lib/format/flow-checks.d.mts +14 -0
  35. package/src/lib/format/flow-checks.d.ts +14 -0
  36. package/src/lib/format/flow-checks.js +61 -0
  37. package/src/lib/format/flow-checks.js.map +1 -0
  38. package/src/lib/format/flow-checks.mjs +58 -0
  39. package/src/lib/format/flow-checks.mjs.map +1 -0
  40. package/src/lib/format/flow.d.mts +43 -0
  41. package/src/lib/format/flow.d.ts +43 -0
  42. package/src/lib/format/flow.js +22 -0
  43. package/src/lib/format/flow.js.map +1 -0
  44. package/src/lib/format/flow.mjs +19 -0
  45. package/src/lib/format/flow.mjs.map +1 -0
  46. package/src/lib/format/from-schema.d.mts +70 -0
  47. package/src/lib/format/from-schema.d.ts +70 -0
  48. package/src/lib/format/from-schema.js +599 -0
  49. package/src/lib/format/from-schema.js.map +1 -0
  50. package/src/lib/format/from-schema.mjs +591 -0
  51. package/src/lib/format/from-schema.mjs.map +1 -0
  52. package/src/lib/format/jitless.d.mts +1 -0
  53. package/src/lib/format/jitless.d.ts +1 -0
  54. package/src/lib/format/jitless.js +27 -0
  55. package/src/lib/format/jitless.js.map +1 -0
  56. package/src/lib/format/jitless.mjs +24 -0
  57. package/src/lib/format/jitless.mjs.map +1 -0
  58. package/src/lib/format/json-schema.js +3 -0
  59. package/src/lib/format/json-schema.js.map +1 -1
  60. package/src/lib/format/json-schema.mjs +3 -0
  61. package/src/lib/format/json-schema.mjs.map +1 -1
  62. package/src/lib/format/json.js +3 -0
  63. package/src/lib/format/json.js.map +1 -1
  64. package/src/lib/format/json.mjs +3 -0
  65. package/src/lib/format/json.mjs.map +1 -1
  66. package/src/lib/format/languages-checks.d.mts +2 -1
  67. package/src/lib/format/languages-checks.d.ts +2 -1
  68. package/src/lib/format/languages-checks.js +8 -2
  69. package/src/lib/format/languages-checks.js.map +1 -1
  70. package/src/lib/format/languages-checks.mjs +8 -2
  71. package/src/lib/format/languages-checks.mjs.map +1 -1
  72. package/src/lib/format/later-checks.d.mts +3 -1
  73. package/src/lib/format/later-checks.d.ts +3 -1
  74. package/src/lib/format/later-checks.js +3 -1
  75. package/src/lib/format/later-checks.js.map +1 -1
  76. package/src/lib/format/later-checks.mjs +3 -1
  77. package/src/lib/format/later-checks.mjs.map +1 -1
  78. package/src/lib/format/layout.d.mts +13192 -7550
  79. package/src/lib/format/layout.d.ts +13192 -7550
  80. package/src/lib/format/layout.js +61 -3
  81. package/src/lib/format/layout.js.map +1 -1
  82. package/src/lib/format/layout.mjs +59 -1
  83. package/src/lib/format/layout.mjs.map +1 -1
  84. package/src/lib/format/layout.types.d.mts +3 -1
  85. package/src/lib/format/layout.types.d.ts +3 -1
  86. package/src/lib/format/limits.js +3 -0
  87. package/src/lib/format/limits.js.map +1 -1
  88. package/src/lib/format/limits.mjs +3 -0
  89. package/src/lib/format/limits.mjs.map +1 -1
  90. package/src/lib/format/list-checks.d.mts +1 -1
  91. package/src/lib/format/list-checks.d.ts +1 -1
  92. package/src/lib/format/list-checks.js +67 -22
  93. package/src/lib/format/list-checks.js.map +1 -1
  94. package/src/lib/format/list-checks.mjs +67 -22
  95. package/src/lib/format/list-checks.mjs.map +1 -1
  96. package/src/lib/format/list-rows-checks.d.mts +11 -0
  97. package/src/lib/format/list-rows-checks.d.ts +11 -0
  98. package/src/lib/format/list-rows-checks.js +62 -0
  99. package/src/lib/format/list-rows-checks.js.map +1 -0
  100. package/src/lib/format/list-rows-checks.mjs +59 -0
  101. package/src/lib/format/list-rows-checks.mjs.map +1 -0
  102. package/src/lib/format/media-options.d.mts +84 -0
  103. package/src/lib/format/media-options.d.ts +84 -0
  104. package/src/lib/format/media-options.js +86 -0
  105. package/src/lib/format/media-options.js.map +1 -0
  106. package/src/lib/format/media-options.mjs +80 -0
  107. package/src/lib/format/media-options.mjs.map +1 -0
  108. package/src/lib/format/outbox-checks.d.mts +11 -0
  109. package/src/lib/format/outbox-checks.d.ts +11 -0
  110. package/src/lib/format/outbox-checks.js +12 -0
  111. package/src/lib/format/outbox-checks.js.map +1 -0
  112. package/src/lib/format/outbox-checks.mjs +9 -0
  113. package/src/lib/format/outbox-checks.mjs.map +1 -0
  114. package/src/lib/format/page.d.mts +3057 -966
  115. package/src/lib/format/page.d.ts +3057 -966
  116. package/src/lib/format/page.js +15 -0
  117. package/src/lib/format/page.js.map +1 -1
  118. package/src/lib/format/page.mjs +15 -0
  119. package/src/lib/format/page.mjs.map +1 -1
  120. package/src/lib/format/part-checks.d.mts +3 -0
  121. package/src/lib/format/part-checks.d.ts +3 -0
  122. package/src/lib/format/payment-checks.d.mts +13 -0
  123. package/src/lib/format/payment-checks.d.ts +13 -0
  124. package/src/lib/format/payment-checks.js +30 -0
  125. package/src/lib/format/payment-checks.js.map +1 -0
  126. package/src/lib/format/payment-checks.mjs +27 -0
  127. package/src/lib/format/payment-checks.mjs.map +1 -0
  128. package/src/lib/format/payment.d.mts +37 -0
  129. package/src/lib/format/payment.d.ts +37 -0
  130. package/src/lib/format/payment.js +15 -0
  131. package/src/lib/format/payment.js.map +1 -0
  132. package/src/lib/format/payment.mjs +12 -0
  133. package/src/lib/format/payment.mjs.map +1 -0
  134. package/src/lib/format/phone.js +3 -0
  135. package/src/lib/format/phone.js.map +1 -1
  136. package/src/lib/format/phone.mjs +3 -0
  137. package/src/lib/format/phone.mjs.map +1 -1
  138. package/src/lib/format/picker-options.d.mts +12 -0
  139. package/src/lib/format/picker-options.d.ts +12 -0
  140. package/src/lib/format/picker-options.js +21 -3
  141. package/src/lib/format/picker-options.js.map +1 -1
  142. package/src/lib/format/picker-options.mjs +20 -2
  143. package/src/lib/format/picker-options.mjs.map +1 -1
  144. package/src/lib/format/prefill-checks.d.mts +13 -0
  145. package/src/lib/format/prefill-checks.d.ts +13 -0
  146. package/src/lib/format/prefill-checks.js +35 -0
  147. package/src/lib/format/prefill-checks.js.map +1 -0
  148. package/src/lib/format/prefill-checks.mjs +32 -0
  149. package/src/lib/format/prefill-checks.mjs.map +1 -0
  150. package/src/lib/format/prefill.d.mts +33 -0
  151. package/src/lib/format/prefill.d.ts +33 -0
  152. package/src/lib/format/prefill.js +20 -0
  153. package/src/lib/format/prefill.js.map +1 -0
  154. package/src/lib/format/prefill.mjs +17 -0
  155. package/src/lib/format/prefill.mjs.map +1 -0
  156. package/src/lib/format/quiz.d.mts +58 -0
  157. package/src/lib/format/quiz.d.ts +58 -0
  158. package/src/lib/format/quiz.js +24 -0
  159. package/src/lib/format/quiz.js.map +1 -0
  160. package/src/lib/format/quiz.mjs +21 -0
  161. package/src/lib/format/quiz.mjs.map +1 -0
  162. package/src/lib/format/records.js +3 -0
  163. package/src/lib/format/records.js.map +1 -1
  164. package/src/lib/format/records.mjs +3 -0
  165. package/src/lib/format/records.mjs.map +1 -1
  166. package/src/lib/format/references.d.mts +1 -1
  167. package/src/lib/format/references.d.ts +1 -1
  168. package/src/lib/format/references.js +56 -7
  169. package/src/lib/format/references.js.map +1 -1
  170. package/src/lib/format/references.mjs +57 -8
  171. package/src/lib/format/references.mjs.map +1 -1
  172. package/src/lib/format/schedule-checks.d.mts +8 -0
  173. package/src/lib/format/schedule-checks.d.ts +8 -0
  174. package/src/lib/format/schedule-checks.js +16 -0
  175. package/src/lib/format/schedule-checks.js.map +1 -0
  176. package/src/lib/format/schedule-checks.mjs +13 -0
  177. package/src/lib/format/schedule-checks.mjs.map +1 -0
  178. package/src/lib/format/signature-checks.d.mts +8 -0
  179. package/src/lib/format/signature-checks.d.ts +8 -0
  180. package/src/lib/format/signature-checks.js +21 -0
  181. package/src/lib/format/signature-checks.js.map +1 -1
  182. package/src/lib/format/signature-checks.mjs +20 -0
  183. package/src/lib/format/signature-checks.mjs.map +1 -1
  184. package/src/lib/format/signature-options.js +3 -0
  185. package/src/lib/format/signature-options.js.map +1 -1
  186. package/src/lib/format/signature-options.mjs +3 -0
  187. package/src/lib/format/signature-options.mjs.map +1 -1
  188. package/src/lib/format/slots-options.js +3 -0
  189. package/src/lib/format/slots-options.js.map +1 -1
  190. package/src/lib/format/slots-options.mjs +3 -0
  191. package/src/lib/format/slots-options.mjs.map +1 -1
  192. package/src/lib/format/templates-checks.d.mts +6 -0
  193. package/src/lib/format/templates-checks.d.ts +6 -0
  194. package/src/lib/format/templates-checks.js +16 -0
  195. package/src/lib/format/templates-checks.js.map +1 -0
  196. package/src/lib/format/templates-checks.mjs +13 -0
  197. package/src/lib/format/templates-checks.mjs.map +1 -0
  198. package/src/lib/format/translate.d.mts +2 -0
  199. package/src/lib/format/translate.d.ts +2 -0
  200. package/src/lib/format/translate.js +6 -2
  201. package/src/lib/format/translate.js.map +1 -1
  202. package/src/lib/format/translate.mjs +4 -2
  203. package/src/lib/format/translate.mjs.map +1 -1
  204. package/src/lib/format/typed-options.d.mts +43 -0
  205. package/src/lib/format/typed-options.d.ts +43 -0
  206. package/src/lib/format/typed-options.js +50 -0
  207. package/src/lib/format/typed-options.js.map +1 -0
  208. package/src/lib/format/typed-options.mjs +46 -0
  209. package/src/lib/format/typed-options.mjs.map +1 -0
  210. package/src/lib/format/upgrade.d.mts +5 -1
  211. package/src/lib/format/upgrade.d.ts +5 -1
  212. package/src/lib/format/upgrade.js +5 -1
  213. package/src/lib/format/upgrade.js.map +1 -1
  214. package/src/lib/format/upgrade.mjs +5 -1
  215. package/src/lib/format/upgrade.mjs.map +1 -1
  216. package/src/lib/format/validate.js +3 -0
  217. package/src/lib/format/validate.js.map +1 -1
  218. package/src/lib/format/validate.mjs +3 -0
  219. package/src/lib/format/validate.mjs.map +1 -1
  220. package/src/lib/format/verify-checks.d.mts +10 -0
  221. package/src/lib/format/verify-checks.d.ts +10 -0
  222. package/src/lib/format/verify-checks.js +44 -0
  223. package/src/lib/format/verify-checks.js.map +1 -0
  224. package/src/lib/format/verify-checks.mjs +41 -0
  225. package/src/lib/format/verify-checks.mjs.map +1 -0
  226. package/src/lib/format/version.d.mts +2 -2
  227. package/src/lib/format/version.d.ts +2 -2
  228. package/src/lib/format/version.js +2 -2
  229. package/src/lib/format/version.js.map +1 -1
  230. package/src/lib/format/version.mjs +2 -2
  231. package/src/lib/format/version.mjs.map +1 -1
  232. package/src/lib/format/week.d.mts +18 -0
  233. package/src/lib/format/week.d.ts +18 -0
  234. package/src/lib/format/week.js +58 -0
  235. package/src/lib/format/week.js.map +1 -0
  236. package/src/lib/format/week.mjs +55 -0
  237. package/src/lib/format/week.mjs.map +1 -0
  238. package/src/lib/record/approvals-part.d.mts +1 -1
  239. package/src/lib/record/approvals-part.d.ts +1 -1
  240. package/src/lib/record/approvals-part.js +2 -2
  241. package/src/lib/record/approvals-part.js.map +1 -1
  242. package/src/lib/record/approvals-part.mjs +1 -1
  243. package/src/lib/record/approvals-part.mjs.map +1 -1
  244. package/src/lib/record/data-source.d.mts +337 -3
  245. package/src/lib/record/data-source.d.ts +337 -3
  246. package/src/lib/record/data-source.js.map +1 -1
  247. package/src/lib/record/data-source.mjs.map +1 -1
  248. package/src/lib/record/day-words.d.mts +22 -1
  249. package/src/lib/record/day-words.d.ts +22 -1
  250. package/src/lib/record/day-words.js +29 -2
  251. package/src/lib/record/day-words.js.map +1 -1
  252. package/src/lib/record/day-words.mjs +24 -2
  253. package/src/lib/record/day-words.mjs.map +1 -1
  254. package/src/lib/record/files-part.d.mts +1 -0
  255. package/src/lib/record/files-part.d.ts +1 -0
  256. package/src/lib/record/files-part.js +7 -1
  257. package/src/lib/record/files-part.js.map +1 -1
  258. package/src/lib/record/files-part.mjs +5 -1
  259. package/src/lib/record/files-part.mjs.map +1 -1
  260. package/src/lib/record/form-approvals.d.mts +12 -17
  261. package/src/lib/record/form-approvals.d.ts +12 -17
  262. package/src/lib/record/form-approvals.js +15 -9
  263. package/src/lib/record/form-approvals.js.map +1 -1
  264. package/src/lib/record/form-approvals.mjs +14 -8
  265. package/src/lib/record/form-approvals.mjs.map +1 -1
  266. package/src/lib/record/form-limits.d.mts +4 -28
  267. package/src/lib/record/form-limits.d.ts +4 -28
  268. package/src/lib/record/form-limits.js +8 -5
  269. package/src/lib/record/form-limits.js.map +1 -1
  270. package/src/lib/record/form-limits.mjs +8 -5
  271. package/src/lib/record/form-limits.mjs.map +1 -1
  272. package/src/lib/record/form.d.mts +125 -7
  273. package/src/lib/record/form.d.ts +125 -7
  274. package/src/lib/record/form.js +277 -77
  275. package/src/lib/record/form.js.map +1 -1
  276. package/src/lib/record/form.mjs +278 -78
  277. package/src/lib/record/form.mjs.map +1 -1
  278. package/src/lib/record/history-steps.d.mts +38 -0
  279. package/src/lib/record/history-steps.d.ts +38 -0
  280. package/src/lib/record/history-steps.js +63 -0
  281. package/src/lib/record/history-steps.js.map +1 -0
  282. package/src/lib/record/history-steps.mjs +58 -0
  283. package/src/lib/record/history-steps.mjs.map +1 -0
  284. package/src/lib/record/history.d.mts +16 -0
  285. package/src/lib/record/history.d.ts +16 -0
  286. package/src/lib/record/history.js +3 -0
  287. package/src/lib/record/history.js.map +1 -0
  288. package/src/lib/record/history.mjs +2 -0
  289. package/src/lib/record/history.mjs.map +1 -0
  290. package/src/lib/record/input-rules.d.mts +2 -0
  291. package/src/lib/record/input-rules.d.ts +2 -0
  292. package/src/lib/record/input-rules.js +4 -1
  293. package/src/lib/record/input-rules.js.map +1 -1
  294. package/src/lib/record/input-rules.mjs +2 -0
  295. package/src/lib/record/input-rules.mjs.map +1 -1
  296. package/src/lib/record/joins.d.mts +143 -0
  297. package/src/lib/record/joins.d.ts +143 -0
  298. package/src/lib/record/joins.js +28 -0
  299. package/src/lib/record/joins.js.map +1 -0
  300. package/src/lib/record/joins.mjs +24 -0
  301. package/src/lib/record/joins.mjs.map +1 -0
  302. package/src/lib/record/limits.js +7 -4
  303. package/src/lib/record/limits.js.map +1 -1
  304. package/src/lib/record/limits.mjs +8 -5
  305. package/src/lib/record/limits.mjs.map +1 -1
  306. package/src/lib/record/link-values.d.mts +31 -0
  307. package/src/lib/record/link-values.d.ts +31 -0
  308. package/src/lib/record/link-values.js +132 -0
  309. package/src/lib/record/link-values.js.map +1 -0
  310. package/src/lib/record/link-values.mjs +125 -0
  311. package/src/lib/record/link-values.mjs.map +1 -0
  312. package/src/lib/record/live-later.d.mts +15 -0
  313. package/src/lib/record/live-later.d.ts +15 -0
  314. package/src/lib/record/live-later.js +10 -0
  315. package/src/lib/record/live-later.js.map +1 -0
  316. package/src/lib/record/live-later.mjs +7 -0
  317. package/src/lib/record/live-later.mjs.map +1 -0
  318. package/src/lib/record/live-part.d.mts +6 -0
  319. package/src/lib/record/live-part.d.ts +6 -0
  320. package/src/lib/record/live-part.js +12 -0
  321. package/src/lib/record/live-part.js.map +1 -0
  322. package/src/lib/record/live-part.mjs +7 -0
  323. package/src/lib/record/live-part.mjs.map +1 -0
  324. package/src/lib/record/live.d.mts +8 -0
  325. package/src/lib/record/live.d.ts +8 -0
  326. package/src/lib/record/live.js +133 -0
  327. package/src/lib/record/live.js.map +1 -0
  328. package/src/lib/record/live.mjs +129 -0
  329. package/src/lib/record/live.mjs.map +1 -0
  330. package/src/lib/record/locales/all.d.mts +5 -5
  331. package/src/lib/record/locales/all.d.ts +5 -5
  332. package/src/lib/record/locales/all.js +3 -3
  333. package/src/lib/record/locales/all.js.map +1 -1
  334. package/src/lib/record/locales/all.mjs +3 -3
  335. package/src/lib/record/locales/all.mjs.map +1 -1
  336. package/src/lib/record/locales/ar.js +11 -1
  337. package/src/lib/record/locales/ar.js.map +1 -1
  338. package/src/lib/record/locales/ar.mjs +11 -1
  339. package/src/lib/record/locales/ar.mjs.map +1 -1
  340. package/src/lib/record/locales/de.js +11 -1
  341. package/src/lib/record/locales/de.js.map +1 -1
  342. package/src/lib/record/locales/de.mjs +11 -1
  343. package/src/lib/record/locales/de.mjs.map +1 -1
  344. package/src/lib/record/locales/es.d.mts +8 -0
  345. package/src/lib/record/locales/es.d.ts +8 -0
  346. package/src/lib/record/locales/es.js +111 -0
  347. package/src/lib/record/locales/es.js.map +1 -0
  348. package/src/lib/record/locales/es.mjs +108 -0
  349. package/src/lib/record/locales/es.mjs.map +1 -0
  350. package/src/lib/record/locales/fa.d.mts +5 -0
  351. package/src/lib/record/locales/fa.d.ts +5 -0
  352. package/src/lib/record/locales/fa.js +117 -0
  353. package/src/lib/record/locales/fa.js.map +1 -0
  354. package/src/lib/record/locales/fa.mjs +114 -0
  355. package/src/lib/record/locales/fa.mjs.map +1 -0
  356. package/src/lib/record/locales/fr.js +11 -1
  357. package/src/lib/record/locales/fr.js.map +1 -1
  358. package/src/lib/record/locales/fr.mjs +11 -1
  359. package/src/lib/record/locales/fr.mjs.map +1 -1
  360. package/src/lib/record/locales/later.d.mts +8 -0
  361. package/src/lib/record/locales/later.d.ts +8 -0
  362. package/src/lib/record/locales/later.js +16 -0
  363. package/src/lib/record/locales/later.js.map +1 -0
  364. package/src/lib/record/locales/later.mjs +13 -0
  365. package/src/lib/record/locales/later.mjs.map +1 -0
  366. package/src/lib/record/locales/tr.d.mts +6 -0
  367. package/src/lib/record/locales/tr.d.ts +6 -0
  368. package/src/lib/record/locales/tr.js +118 -0
  369. package/src/lib/record/locales/tr.js.map +1 -0
  370. package/src/lib/record/locales/tr.mjs +115 -0
  371. package/src/lib/record/locales/tr.mjs.map +1 -0
  372. package/src/lib/record/locales/ur.d.mts +9 -0
  373. package/src/lib/record/locales/ur.d.ts +9 -0
  374. package/src/lib/record/locales/ur.js +118 -0
  375. package/src/lib/record/locales/ur.js.map +1 -0
  376. package/src/lib/record/locales/ur.mjs +115 -0
  377. package/src/lib/record/locales/ur.mjs.map +1 -0
  378. package/src/lib/record/memory-approvals.d.mts +7 -4
  379. package/src/lib/record/memory-approvals.d.ts +7 -4
  380. package/src/lib/record/memory-approvals.js +54 -7
  381. package/src/lib/record/memory-approvals.js.map +1 -1
  382. package/src/lib/record/memory-approvals.mjs +54 -7
  383. package/src/lib/record/memory-approvals.mjs.map +1 -1
  384. package/src/lib/record/memory-assist.d.mts +7 -2
  385. package/src/lib/record/memory-assist.d.ts +7 -2
  386. package/src/lib/record/memory-assist.js +47 -12
  387. package/src/lib/record/memory-assist.js.map +1 -1
  388. package/src/lib/record/memory-assist.mjs +46 -12
  389. package/src/lib/record/memory-assist.mjs.map +1 -1
  390. package/src/lib/record/memory-codes.d.mts +37 -0
  391. package/src/lib/record/memory-codes.d.ts +37 -0
  392. package/src/lib/record/memory-codes.js +50 -0
  393. package/src/lib/record/memory-codes.js.map +1 -0
  394. package/src/lib/record/memory-codes.mjs +47 -0
  395. package/src/lib/record/memory-codes.mjs.map +1 -0
  396. package/src/lib/record/memory-data-source.d.mts +60 -4
  397. package/src/lib/record/memory-data-source.d.ts +60 -4
  398. package/src/lib/record/memory-data-source.js +69 -1
  399. package/src/lib/record/memory-data-source.js.map +1 -1
  400. package/src/lib/record/memory-data-source.mjs +69 -1
  401. package/src/lib/record/memory-data-source.mjs.map +1 -1
  402. package/src/lib/record/memory-kept.d.mts +3 -1
  403. package/src/lib/record/memory-kept.d.ts +3 -1
  404. package/src/lib/record/memory-kept.js +7 -2
  405. package/src/lib/record/memory-kept.js.map +1 -1
  406. package/src/lib/record/memory-kept.mjs +7 -2
  407. package/src/lib/record/memory-kept.mjs.map +1 -1
  408. package/src/lib/record/memory-later.d.mts +3 -1
  409. package/src/lib/record/memory-later.d.ts +3 -1
  410. package/src/lib/record/memory-later.js +9 -5
  411. package/src/lib/record/memory-later.js.map +1 -1
  412. package/src/lib/record/memory-later.mjs +8 -4
  413. package/src/lib/record/memory-later.mjs.map +1 -1
  414. package/src/lib/record/memory-live.d.mts +8 -0
  415. package/src/lib/record/memory-live.d.ts +8 -0
  416. package/src/lib/record/memory-live.js +70 -0
  417. package/src/lib/record/memory-live.js.map +1 -0
  418. package/src/lib/record/memory-live.mjs +67 -0
  419. package/src/lib/record/memory-live.mjs.map +1 -0
  420. package/src/lib/record/memory-views.d.mts +11 -0
  421. package/src/lib/record/memory-views.d.ts +11 -0
  422. package/src/lib/record/memory-views.js +60 -0
  423. package/src/lib/record/memory-views.js.map +1 -0
  424. package/src/lib/record/memory-views.mjs +57 -0
  425. package/src/lib/record/memory-views.mjs.map +1 -0
  426. package/src/lib/record/messages.d.mts +24 -3
  427. package/src/lib/record/messages.d.ts +24 -3
  428. package/src/lib/record/messages.js +18 -3
  429. package/src/lib/record/messages.js.map +1 -1
  430. package/src/lib/record/messages.mjs +18 -3
  431. package/src/lib/record/messages.mjs.map +1 -1
  432. package/src/lib/record/order.d.mts +21 -0
  433. package/src/lib/record/order.d.ts +21 -0
  434. package/src/lib/record/order.js +129 -0
  435. package/src/lib/record/order.js.map +1 -0
  436. package/src/lib/record/order.mjs +122 -0
  437. package/src/lib/record/order.mjs.map +1 -0
  438. package/src/lib/record/outbox-form.d.mts +79 -0
  439. package/src/lib/record/outbox-form.d.ts +79 -0
  440. package/src/lib/record/outbox-form.js +291 -0
  441. package/src/lib/record/outbox-form.js.map +1 -0
  442. package/src/lib/record/outbox-form.mjs +286 -0
  443. package/src/lib/record/outbox-form.mjs.map +1 -0
  444. package/src/lib/record/outbox-part.d.mts +6 -0
  445. package/src/lib/record/outbox-part.d.ts +6 -0
  446. package/src/lib/record/outbox-part.js +13 -0
  447. package/src/lib/record/outbox-part.js.map +1 -0
  448. package/src/lib/record/outbox-part.mjs +7 -0
  449. package/src/lib/record/outbox-part.mjs.map +1 -0
  450. package/src/lib/record/pay-part.d.mts +6 -0
  451. package/src/lib/record/pay-part.d.ts +6 -0
  452. package/src/lib/record/pay-part.js +11 -0
  453. package/src/lib/record/pay-part.js.map +1 -0
  454. package/src/lib/record/pay-part.mjs +7 -0
  455. package/src/lib/record/pay-part.mjs.map +1 -0
  456. package/src/lib/record/payment-form.d.mts +25 -0
  457. package/src/lib/record/payment-form.d.ts +25 -0
  458. package/src/lib/record/payment-form.js +98 -0
  459. package/src/lib/record/payment-form.js.map +1 -0
  460. package/src/lib/record/payment-form.mjs +95 -0
  461. package/src/lib/record/payment-form.mjs.map +1 -0
  462. package/src/lib/record/prefill-part.d.mts +7 -0
  463. package/src/lib/record/prefill-part.d.ts +7 -0
  464. package/src/lib/record/prefill-part.js +15 -0
  465. package/src/lib/record/prefill-part.js.map +1 -0
  466. package/src/lib/record/prefill-part.mjs +8 -0
  467. package/src/lib/record/prefill-part.mjs.map +1 -0
  468. package/src/lib/record/press-undo.d.mts +42 -0
  469. package/src/lib/record/press-undo.d.ts +42 -0
  470. package/src/lib/record/press-undo.js +115 -0
  471. package/src/lib/record/press-undo.js.map +1 -0
  472. package/src/lib/record/press-undo.mjs +110 -0
  473. package/src/lib/record/press-undo.mjs.map +1 -0
  474. package/src/lib/record/quiz.d.mts +36 -0
  475. package/src/lib/record/quiz.d.ts +36 -0
  476. package/src/lib/record/quiz.js +90 -0
  477. package/src/lib/record/quiz.js.map +1 -0
  478. package/src/lib/record/quiz.mjs +87 -0
  479. package/src/lib/record/quiz.mjs.map +1 -0
  480. package/src/lib/record/record-words.js +1 -1
  481. package/src/lib/record/record-words.js.map +1 -1
  482. package/src/lib/record/record-words.mjs +1 -1
  483. package/src/lib/record/record-words.mjs.map +1 -1
  484. package/src/lib/record/run.d.mts +71 -8
  485. package/src/lib/record/run.d.ts +71 -8
  486. package/src/lib/record/run.js +40 -13
  487. package/src/lib/record/run.js.map +1 -1
  488. package/src/lib/record/run.mjs +38 -12
  489. package/src/lib/record/run.mjs.map +1 -1
  490. package/src/lib/record/survey-kit.d.mts +37 -0
  491. package/src/lib/record/survey-kit.d.ts +37 -0
  492. package/src/lib/record/survey-kit.js +99 -0
  493. package/src/lib/record/survey-kit.js.map +1 -0
  494. package/src/lib/record/survey-kit.mjs +96 -0
  495. package/src/lib/record/survey-kit.mjs.map +1 -0
  496. package/src/lib/record/survey.d.mts +16 -0
  497. package/src/lib/record/survey.d.ts +16 -0
  498. package/src/lib/record/survey.js +17 -0
  499. package/src/lib/record/survey.js.map +1 -0
  500. package/src/lib/record/survey.mjs +13 -0
  501. package/src/lib/record/survey.mjs.map +1 -0
  502. package/src/lib/record/surveyflow-part.d.mts +9 -0
  503. package/src/lib/record/surveyflow-part.d.ts +9 -0
  504. package/src/lib/record/surveyflow-part.js +20 -0
  505. package/src/lib/record/surveyflow-part.js.map +1 -0
  506. package/src/lib/record/surveyflow-part.mjs +10 -0
  507. package/src/lib/record/surveyflow-part.mjs.map +1 -0
  508. package/src/lib/record/timing.d.mts +76 -0
  509. package/src/lib/record/timing.d.ts +76 -0
  510. package/src/lib/record/timing.js +112 -0
  511. package/src/lib/record/timing.js.map +1 -0
  512. package/src/lib/record/timing.mjs +104 -0
  513. package/src/lib/record/timing.mjs.map +1 -0
  514. package/src/lib/record/undo-later.d.mts +9 -0
  515. package/src/lib/record/undo-later.d.ts +9 -0
  516. package/src/lib/record/undo-later.js +10 -0
  517. package/src/lib/record/undo-later.js.map +1 -0
  518. package/src/lib/record/undo-later.mjs +7 -0
  519. package/src/lib/record/undo-later.mjs.map +1 -0
  520. package/src/lib/record/undo-part.d.mts +8 -0
  521. package/src/lib/record/undo-part.d.ts +8 -0
  522. package/src/lib/record/undo-part.js +17 -0
  523. package/src/lib/record/undo-part.js.map +1 -0
  524. package/src/lib/record/undo-part.mjs +9 -0
  525. package/src/lib/record/undo-part.mjs.map +1 -0
  526. package/src/lib/record/upload-to-later.d.mts +10 -0
  527. package/src/lib/record/upload-to-later.d.ts +10 -0
  528. package/src/lib/record/upload-to-later.js +15 -0
  529. package/src/lib/record/upload-to-later.js.map +1 -0
  530. package/src/lib/record/upload-to-later.mjs +12 -0
  531. package/src/lib/record/upload-to-later.mjs.map +1 -0
  532. package/src/lib/record/uploads.d.mts +5 -0
  533. package/src/lib/record/uploads.d.ts +5 -0
  534. package/src/lib/record/uploads.js.map +1 -1
  535. package/src/lib/record/uploads.mjs.map +1 -1
  536. package/src/lib/record/values.d.mts +6 -0
  537. package/src/lib/record/values.d.ts +6 -0
  538. package/src/lib/record/values.js.map +1 -1
  539. package/src/lib/record/values.mjs.map +1 -1
  540. package/src/lib/record/verify-form.d.mts +24 -0
  541. package/src/lib/record/verify-form.d.ts +24 -0
  542. package/src/lib/record/verify-form.js +65 -0
  543. package/src/lib/record/verify-form.js.map +1 -0
  544. package/src/lib/record/verify-form.mjs +62 -0
  545. package/src/lib/record/verify-form.mjs.map +1 -0
  546. package/src/lib/record/verify-part.d.mts +6 -0
  547. package/src/lib/record/verify-part.d.ts +6 -0
  548. package/src/lib/record/verify-part.js +11 -0
  549. package/src/lib/record/verify-part.js.map +1 -0
  550. package/src/lib/record/verify-part.mjs +7 -0
  551. package/src/lib/record/verify-part.mjs.map +1 -0
  552. package/src/lib/record/words-chunks.d.mts +37 -0
  553. package/src/lib/record/words-chunks.d.ts +37 -0
  554. package/src/lib/record/words-chunks.js +94 -0
  555. package/src/lib/record/words-chunks.js.map +1 -0
  556. package/src/lib/record/words-chunks.mjs +86 -0
  557. package/src/lib/record/words-chunks.mjs.map +1 -0
  558. package/src/runtime.d.mts +28 -6
  559. package/src/runtime.d.ts +28 -6
  560. package/src/runtime.js +35 -6
  561. package/src/runtime.js.map +1 -1
  562. package/src/runtime.mjs +15 -3
  563. package/src/runtime.mjs.map +1 -1
@@ -0,0 +1,110 @@
1
+ import { fillMessage } from './messages.mjs';
2
+ import { DONE } from './run.mjs';
3
+ import { sameValue, structuredCopy } from './values.mjs';
4
+ const wordsOf = (error) => (error instanceof Error ? error.message : String(error));
5
+ /** The steps a press does that Fieldia cannot take back by itself: a copy, a delete, a form put back or closed, a page opened, an address, a post. */
6
+ const BEYOND = /"do":"(duplicate|delete|reset|close|open|openUrl|post)"/;
7
+ /**
8
+ * What a press did, read as it ends against the values it began with (`PressTaken.at`): each field it changed — a
9
+ * value worked out aside, which follows — and whether it saved them (the record holds no change left to save).
10
+ */
11
+ export function pressDone(taken, now, fields, saved) {
12
+ const wrote = new Map();
13
+ for (const name of new Set([...Object.keys(taken.at), ...Object.keys(now)])) {
14
+ if (fields[name]?.compute || sameValue(taken.at[name], now[name]))
15
+ continue;
16
+ wrote.set(name, { before: (taken.at[name] ?? null), after: structuredCopy(now[name] ?? null) });
17
+ }
18
+ return { app: taken.app, ...(taken.archived !== undefined ? { archived: taken.archived } : {}), wrote, ...(wrote.size && saved ? { saved } : {}) };
19
+ }
20
+ /**
21
+ * Take back what a press did (`PressTaken`), as its toast's Undo asks: the app's own undos, latest first, each
22
+ * answered as a call is; the record it archived brought back, or the reverse; then the values its steps and the
23
+ * app's answers wrote put back — each only while it holds what they left, a change made since by anyone else staying
24
+ * — and saved again where the press saved. On the record the press was on: another shown since, nothing is done.
25
+ */
26
+ export async function takeBack(kit, taken, scope) {
27
+ const { form, answered, recordStep, replaced, tell } = kit;
28
+ scope.generation ??= form.generation();
29
+ const ended = (stopped) => stopped ? { done: false, reason: stopped.reason, ...(stopped.message !== undefined ? { message: stopped.message } : {}), ...(stopped.error !== undefined ? { error: stopped.error } : {}) } : DONE;
30
+ try {
31
+ // The app's own, whatever record is shown now: what it answers is laid only on the one the press ended on.
32
+ for (const undo of [...taken.app].reverse()) {
33
+ let answer;
34
+ try {
35
+ answer = await undo();
36
+ }
37
+ catch (error) {
38
+ return ended({ reason: 'app', message: wordsOf(error), error });
39
+ }
40
+ if (!answer)
41
+ continue;
42
+ if (replaced(scope)) {
43
+ if (answer.say !== undefined)
44
+ tell(null, typeof answer.say === 'string' ? answer.say : answer.say.message, (typeof answer.say === 'object' && answer.say.tone) || 'info');
45
+ continue;
46
+ }
47
+ const stopped = await answered(answer, scope);
48
+ if (stopped)
49
+ return ended(stopped);
50
+ }
51
+ if (taken.archived === undefined && !taken.wrote.size)
52
+ return DONE;
53
+ if (replaced(scope))
54
+ return ended(form.gone());
55
+ if (taken.archived !== undefined) {
56
+ const stopped = await recordStep(taken.archived ? 'unarchive' : 'archive', scope);
57
+ if (stopped)
58
+ return ended(stopped);
59
+ }
60
+ if (!taken.wrote.size)
61
+ return DONE;
62
+ const back = {};
63
+ for (const [name, { before, after }] of taken.wrote)
64
+ if (sameValue(form.values()[name], after))
65
+ back[name] = before;
66
+ if (Object.keys(back).length)
67
+ form.write(back, scope.chain);
68
+ return ended(taken.saved ? await form.save(scope.chain) : null);
69
+ }
70
+ catch (error) {
71
+ return ended({ reason: 'cannot', message: wordsOf(error), error });
72
+ }
73
+ }
74
+ /**
75
+ * A press that offers Undo has ended: the words it held are said — the last, once it ran whole, with Undo, where what
76
+ * it did can be taken back (its button's steps for it; else Fieldia's own taking back, where nothing it did is beyond
77
+ * it — a copy, a delete, a page opened, a post, the app's call answered with no undo; else the app's own undos) — or,
78
+ * with nothing said, "Done: {label}". Undo runs on the record the press ended on: another shown since, only the app's
79
+ * own undos run.
80
+ */
81
+ export function offerUndo(inner, context) {
82
+ const { kit, source, scope, taken, result, offers } = context;
83
+ const { messages } = inner;
84
+ const host = kit.form.host;
85
+ const done = pressDone(taken, kit.form.values(), inner.fields, !kit.form.changed());
86
+ const beyond = taken.beyond ?? BEYOND.exec(JSON.stringify([source.steps ?? [], 'builtin' in source ? { do: source.builtin } : {}]))?.[1];
87
+ const did = taken.app.length > 0 || taken.archived !== undefined || done.wrote.size > 0;
88
+ const can = result.done && (Array.isArray(offers) || (offers === true ? did && beyond === undefined : taken.app.length > 0));
89
+ const said = [...taken.said];
90
+ const builtin = 'builtin' in source ? source.builtin : undefined;
91
+ const plain = builtin === 'archive' ? messages.pressArchived : builtin === 'unarchive' ? messages.pressUnarchived : fillMessage(messages, messages.pressDone, { label: source.label ?? '' });
92
+ const last = can ? (said.pop() ?? { message: plain, tone: 'success' }) : null;
93
+ for (const words of said)
94
+ host?.say(words.message, words.tone);
95
+ if (!last)
96
+ return;
97
+ const on = kit.form.generation();
98
+ const id = `${scope.id}.undo`;
99
+ host?.say(last.message, last.tone, {
100
+ undo: () => inner.track((async () => {
101
+ const again = { id, chain: [], typed: 'first', generation: on, ...(scope.recordIds ? { recordIds: [...scope.recordIds] } : {}) };
102
+ const steps = Array.isArray(offers) ? offers : [];
103
+ // Its steps, on the record the press ended on; else what it did, taken back.
104
+ const ended = Array.isArray(offers) ? (on === kit.form.generation() ? await kit.runSteps(offers, again) : { done: false, ...inner.replaced() }) : await takeBack(kit, offers === true ? done : { app: taken.app, wrote: new Map() }, again);
105
+ inner.emit('run', { id, steps, result: ended });
106
+ return ended;
107
+ })()),
108
+ });
109
+ }
110
+ //# sourceMappingURL=press-undo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"press-undo.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/press-undo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { Page } from '../format/page.mjs';
2
+ import type { Value, Values } from './values.mjs';
3
+ /**
4
+ * A quiz's results (`quiz` on a page): each question asked marked — right or wrong where it has right answers, its
5
+ * points of its most — and the score of them all. The form works them out as the answers are sent (`state.sent.quiz`),
6
+ * unless the app's source answered the send with its own (`SubmitResult.quiz`): a test that keeps its right answers out
7
+ * of the page marks them on its server.
8
+ */
9
+ export interface QuizResults {
10
+ /** The points earned, of the most the questions asked could earn. */
11
+ score: number;
12
+ max: number;
13
+ /** Each question asked that earns points or has right answers, in the order it was asked. */
14
+ questions: QuizMark[];
15
+ }
16
+ /** One question's mark. */
17
+ export interface QuizMark {
18
+ field: string;
19
+ /** Its points, of its most. */
20
+ points: number;
21
+ max: number;
22
+ /** Right or wrong where the question has right answers; null for one of points alone (its options' `score`). */
23
+ right: boolean | null;
24
+ /** Whether it was answered at all. */
25
+ answered: boolean;
26
+ /** The right answer, as a value of the field (a list of them for several), where the page shows it: for one answered wrongly or not at all. */
27
+ rightAnswer?: Value;
28
+ /** The question's own words for its answer: its feedback when right, or when wrong. */
29
+ feedback?: string;
30
+ }
31
+ /**
32
+ * A quiz's results for the answers sent, in the order the questions were asked (`asked`, the fields whose answers were
33
+ * sent: a question not shown, its step skipped, is none). Null where no question asked earns points or has right
34
+ * answers.
35
+ */
36
+ export declare function quizResults(page: Page, values: Values, asked?: readonly string[]): QuizResults | null;
@@ -0,0 +1,36 @@
1
+ import type { Page } from '../format/page';
2
+ import type { Value, Values } from './values';
3
+ /**
4
+ * A quiz's results (`quiz` on a page): each question asked marked — right or wrong where it has right answers, its
5
+ * points of its most — and the score of them all. The form works them out as the answers are sent (`state.sent.quiz`),
6
+ * unless the app's source answered the send with its own (`SubmitResult.quiz`): a test that keeps its right answers out
7
+ * of the page marks them on its server.
8
+ */
9
+ export interface QuizResults {
10
+ /** The points earned, of the most the questions asked could earn. */
11
+ score: number;
12
+ max: number;
13
+ /** Each question asked that earns points or has right answers, in the order it was asked. */
14
+ questions: QuizMark[];
15
+ }
16
+ /** One question's mark. */
17
+ export interface QuizMark {
18
+ field: string;
19
+ /** Its points, of its most. */
20
+ points: number;
21
+ max: number;
22
+ /** Right or wrong where the question has right answers; null for one of points alone (its options' `score`). */
23
+ right: boolean | null;
24
+ /** Whether it was answered at all. */
25
+ answered: boolean;
26
+ /** The right answer, as a value of the field (a list of them for several), where the page shows it: for one answered wrongly or not at all. */
27
+ rightAnswer?: Value;
28
+ /** The question's own words for its answer: its feedback when right, or when wrong. */
29
+ feedback?: string;
30
+ }
31
+ /**
32
+ * A quiz's results for the answers sent, in the order the questions were asked (`asked`, the fields whose answers were
33
+ * sent: a question not shown, its step skipped, is none). Null where no question asked earns points or has right
34
+ * answers.
35
+ */
36
+ export declare function quizResults(page: Page, values: Values, asked?: readonly string[]): QuizResults | null;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.quizResults = quizResults;
4
+ /** Sums of tenths and the like without a computer's crumbs: 0.1 + 0.2 is 0.3. */
5
+ const tidy = (n) => Math.round(n * 1e9) / 1e9;
6
+ const empty = (value) => value === null || value === undefined || value === '' || (Array.isArray(value) && value.length === 0);
7
+ /** A word as a person may write it: its case and the spaces round and inside it aside. */
8
+ const plain = (value) => String(value).trim().replace(/\s+/g, ' ').toLocaleLowerCase();
9
+ /** What a question's quiz says, by its kind: its right answers and points, or null for a question that is none. */
10
+ function quizOf(def) {
11
+ if (!def)
12
+ return null;
13
+ if (def.type === 'selection') {
14
+ const marked = def.options.some((option) => option.correct === true || option.score !== undefined);
15
+ return marked ? { options: def.options, answers: null, several: def.multiple === true } : null;
16
+ }
17
+ if ((def.type === 'char' || def.type === 'integer' || def.type === 'float') && def.quiz?.answers?.length)
18
+ return { options: null, answers: def.quiz.answers, several: false };
19
+ return null;
20
+ }
21
+ /** Whether a typed answer is one the question takes: a number by its value, words whatever their case and spaces. */
22
+ function takes(answers, value, numeric) {
23
+ if (empty(value))
24
+ return false;
25
+ if (numeric)
26
+ return answers.some((answer) => Number(answer) === Number(value));
27
+ return answers.some((answer) => plain(answer) === plain(value));
28
+ }
29
+ /**
30
+ * A quiz's results for the answers sent, in the order the questions were asked (`asked`, the fields whose answers were
31
+ * sent: a question not shown, its step skipped, is none). Null where no question asked earns points or has right
32
+ * answers.
33
+ */
34
+ function quizResults(page, values, asked = Object.keys(values)) {
35
+ const each = page.quiz?.points ?? 1;
36
+ const showRight = page.quiz?.rightAnswers !== false;
37
+ const questions = [];
38
+ for (const field of asked) {
39
+ const def = page.fields[field];
40
+ const quiz = quizOf(def);
41
+ if (!quiz || !def)
42
+ continue;
43
+ const answer = values[field];
44
+ const answered = !empty(answer);
45
+ const worth = def.quiz?.points ?? each;
46
+ let points = 0;
47
+ let max = 0;
48
+ let right = null;
49
+ let rightAnswer;
50
+ if (quiz.options) {
51
+ const chosen = quiz.several ? (Array.isArray(answer) ? answer : []) : answered ? [answer] : [];
52
+ const scored = quiz.options.some((option) => option.score !== undefined);
53
+ const correct = quiz.options.filter((option) => option.correct === true);
54
+ if (correct.length) {
55
+ // Several: right when exactly the right ones are chosen; one: right when the one chosen is a right one.
56
+ right = quiz.several ? chosen.length === correct.length && correct.every((option) => chosen.includes(option.value)) : chosen.length === 1 && correct.some((option) => option.value === chosen[0]);
57
+ rightAnswer = quiz.several ? correct.map((option) => option.value) : correct[0].value;
58
+ }
59
+ if (scored) {
60
+ // Points by the options chosen, as `scoreOf` counts them: the best of one, every one worth something of several.
61
+ points = chosen.reduce((sum, value) => sum + (quiz.options?.find((option) => option.value === value)?.score ?? 0), 0);
62
+ max = quiz.several ? quiz.options.reduce((sum, option) => sum + Math.max(0, option.score ?? 0), 0) : quiz.options.reduce((most, option) => Math.max(most, option.score ?? 0), 0);
63
+ }
64
+ else {
65
+ points = right ? worth : 0;
66
+ max = worth;
67
+ }
68
+ }
69
+ else if (quiz.answers) {
70
+ right = takes(quiz.answers, answer, def.type !== 'char');
71
+ points = right ? worth : 0;
72
+ max = worth;
73
+ rightAnswer = quiz.answers[0];
74
+ }
75
+ const feedback = right === null ? undefined : def.quiz?.feedback?.[right ? 'right' : 'wrong'];
76
+ questions.push({
77
+ field,
78
+ points: tidy(points),
79
+ max: tidy(max),
80
+ right,
81
+ answered,
82
+ ...(right === false && showRight && rightAnswer !== undefined ? { rightAnswer } : {}),
83
+ ...(feedback ? { feedback } : {}),
84
+ });
85
+ }
86
+ if (!questions.length)
87
+ return null;
88
+ return { score: tidy(questions.reduce((sum, mark) => sum + mark.points, 0)), max: tidy(questions.reduce((sum, mark) => sum + mark.max, 0)), questions };
89
+ }
90
+ //# sourceMappingURL=quiz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/quiz.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /** Sums of tenths and the like without a computer's crumbs: 0.1 + 0.2 is 0.3. */
2
+ const tidy = (n) => Math.round(n * 1e9) / 1e9;
3
+ const empty = (value) => value === null || value === undefined || value === '' || (Array.isArray(value) && value.length === 0);
4
+ /** A word as a person may write it: its case and the spaces round and inside it aside. */
5
+ const plain = (value) => String(value).trim().replace(/\s+/g, ' ').toLocaleLowerCase();
6
+ /** What a question's quiz says, by its kind: its right answers and points, or null for a question that is none. */
7
+ function quizOf(def) {
8
+ if (!def)
9
+ return null;
10
+ if (def.type === 'selection') {
11
+ const marked = def.options.some((option) => option.correct === true || option.score !== undefined);
12
+ return marked ? { options: def.options, answers: null, several: def.multiple === true } : null;
13
+ }
14
+ if ((def.type === 'char' || def.type === 'integer' || def.type === 'float') && def.quiz?.answers?.length)
15
+ return { options: null, answers: def.quiz.answers, several: false };
16
+ return null;
17
+ }
18
+ /** Whether a typed answer is one the question takes: a number by its value, words whatever their case and spaces. */
19
+ function takes(answers, value, numeric) {
20
+ if (empty(value))
21
+ return false;
22
+ if (numeric)
23
+ return answers.some((answer) => Number(answer) === Number(value));
24
+ return answers.some((answer) => plain(answer) === plain(value));
25
+ }
26
+ /**
27
+ * A quiz's results for the answers sent, in the order the questions were asked (`asked`, the fields whose answers were
28
+ * sent: a question not shown, its step skipped, is none). Null where no question asked earns points or has right
29
+ * answers.
30
+ */
31
+ export function quizResults(page, values, asked = Object.keys(values)) {
32
+ const each = page.quiz?.points ?? 1;
33
+ const showRight = page.quiz?.rightAnswers !== false;
34
+ const questions = [];
35
+ for (const field of asked) {
36
+ const def = page.fields[field];
37
+ const quiz = quizOf(def);
38
+ if (!quiz || !def)
39
+ continue;
40
+ const answer = values[field];
41
+ const answered = !empty(answer);
42
+ const worth = def.quiz?.points ?? each;
43
+ let points = 0;
44
+ let max = 0;
45
+ let right = null;
46
+ let rightAnswer;
47
+ if (quiz.options) {
48
+ const chosen = quiz.several ? (Array.isArray(answer) ? answer : []) : answered ? [answer] : [];
49
+ const scored = quiz.options.some((option) => option.score !== undefined);
50
+ const correct = quiz.options.filter((option) => option.correct === true);
51
+ if (correct.length) {
52
+ // Several: right when exactly the right ones are chosen; one: right when the one chosen is a right one.
53
+ right = quiz.several ? chosen.length === correct.length && correct.every((option) => chosen.includes(option.value)) : chosen.length === 1 && correct.some((option) => option.value === chosen[0]);
54
+ rightAnswer = quiz.several ? correct.map((option) => option.value) : correct[0].value;
55
+ }
56
+ if (scored) {
57
+ // Points by the options chosen, as `scoreOf` counts them: the best of one, every one worth something of several.
58
+ points = chosen.reduce((sum, value) => sum + (quiz.options?.find((option) => option.value === value)?.score ?? 0), 0);
59
+ max = quiz.several ? quiz.options.reduce((sum, option) => sum + Math.max(0, option.score ?? 0), 0) : quiz.options.reduce((most, option) => Math.max(most, option.score ?? 0), 0);
60
+ }
61
+ else {
62
+ points = right ? worth : 0;
63
+ max = worth;
64
+ }
65
+ }
66
+ else if (quiz.answers) {
67
+ right = takes(quiz.answers, answer, def.type !== 'char');
68
+ points = right ? worth : 0;
69
+ max = worth;
70
+ rightAnswer = quiz.answers[0];
71
+ }
72
+ const feedback = right === null ? undefined : def.quiz?.feedback?.[right ? 'right' : 'wrong'];
73
+ questions.push({
74
+ field,
75
+ points: tidy(points),
76
+ max: tidy(max),
77
+ right,
78
+ answered,
79
+ ...(right === false && showRight && rightAnswer !== undefined ? { rightAnswer } : {}),
80
+ ...(feedback ? { feedback } : {}),
81
+ });
82
+ }
83
+ if (!questions.length)
84
+ return null;
85
+ return { score: tidy(questions.reduce((sum, mark) => sum + mark.points, 0)), max: tidy(questions.reduce((sum, mark) => sum + mark.max, 0)), questions };
86
+ }
87
+ //# sourceMappingURL=quiz.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quiz.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/quiz.ts"],"names":[],"mappings":"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"}
@@ -37,7 +37,7 @@ function isQuestion(label) {
37
37
  return /([?؟?⸮]|…|\.\.\.)\s*$/u.test(label);
38
38
  }
39
39
  /** Each language's quotation marks round a question its sentence names: “…” where it has none of its own here. */
40
- const QUOTES = { de: ['„', '“'], fr: ['« ', ' »'], ar: ['«', '»'] };
40
+ const QUOTES = { de: ['„', '“'], fr: ['« ', ' »'], ar: ['«', '»'], fa: ['«', '»'] };
41
41
  /**
42
42
  * A label as a sentence names it: a question (`isQuestion`) between the language's quotation marks — "Please answer
43
43
  * “How was your visit?”", "“How many days?” must be at most 5" — and a name as written.
@@ -1 +1 @@
1
- {"version":3,"file":"record-words.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/record-words.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"record-words.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/record-words.ts"],"names":[],"mappings":"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"}
@@ -31,7 +31,7 @@ export function isQuestion(label) {
31
31
  return /([?؟?⸮]|…|\.\.\.)\s*$/u.test(label);
32
32
  }
33
33
  /** Each language's quotation marks round a question its sentence names: “…” where it has none of its own here. */
34
- const QUOTES = { de: ['„', '“'], fr: ['« ', ' »'], ar: ['«', '»'] };
34
+ const QUOTES = { de: ['„', '“'], fr: ['« ', ' »'], ar: ['«', '»'], fa: ['«', '»'] };
35
35
  /**
36
36
  * A label as a sentence names it: a question (`isQuestion`) between the language's quotation marks — "Please answer
37
37
  * “How was your visit?”", "“How many days?” must be at most 5" — and a name as written.
@@ -1 +1 @@
1
- {"version":3,"file":"record-words.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/record-words.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"record-words.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/record-words.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import type { Field } from '../format/field.mjs';
3
3
  import type { JsonValue } from '../format/json.mjs';
4
4
  import type { MenuItem, Tone } from '../format/layout.mjs';
5
5
  import { type ExpressionEnv } from '../expression/expression.mjs';
6
- import type { ResolvedFilter } from './data-source.mjs';
6
+ import type { PaidPayment, PaymentDue, PayRequest, ResolvedFilter } from './data-source.mjs';
7
7
  import type { Facet } from './search.mjs';
8
8
  import { type RecordId, type Value, type Values } from './values.mjs';
9
9
  /**
@@ -89,6 +89,46 @@ export interface ActionResult {
89
89
  * own, each pressed as theirs are. Read only by that menu; any other call's is left alone.
90
90
  */
91
91
  menu?: MenuItem[];
92
+ /**
93
+ * How to take back what the app just did, for a one-tap press (a follow-up marked done, a message sent with a few
94
+ * seconds to call it back): its words are said with Undo, and Undo calls this — the app reopens the follow-up,
95
+ * cancels the send — answering as a call is answered (values, words, a reload…). Offered for a few seconds.
96
+ */
97
+ undo?: AppUndo;
98
+ }
99
+ /** The app's own way to take back what it did for a press (`ActionResult.undo`): answered as a call is. */
100
+ export type AppUndo = () => void | ActionResult | Promise<void | ActionResult>;
101
+ /** The runner's own ways a press's Undo takes it back with (press-undo.ts, the undo part). */
102
+ export interface UndoKit {
103
+ form: RunForm;
104
+ answered(answer: ActionResult, scope: RunScope): Promise<Stopped | null>;
105
+ recordStep(name: 'archive' | 'unarchive' | 'duplicate' | 'delete', scope: RunScope): Promise<Stopped | null>;
106
+ replaced(scope: RunScope): boolean;
107
+ tell(scope: RunScope | null, message: string, tone: Tone): void;
108
+ runSteps(steps: readonly ActionStep[], scope: RunScope, inner?: boolean): Promise<RunResult>;
109
+ }
110
+ /** Undo, offered with the words a press said (`ActionHost.say`'s third): pressed, it takes back what the press did. */
111
+ export interface SayUndo {
112
+ undo(): Promise<RunResult>;
113
+ }
114
+ /**
115
+ * What a press that offers Undo keeps as it runs (a button's or a menu item's `undo`, or the app answering with one):
116
+ * the words it says, held to be said as it ends — the last with Undo — and what Fieldia needs to take it back. What it
117
+ * wrote is read by the undo part as it ends (press-undo.ts), against the values it began with.
118
+ */
119
+ export interface PressTaken {
120
+ said: {
121
+ message: string;
122
+ tone: Tone;
123
+ }[];
124
+ /** The app's own undos, from its answers, in the order given. */
125
+ app: AppUndo[];
126
+ /** The form's values as the press began. */
127
+ at: Values;
128
+ /** It archived the record (true) or brought it back (false). */
129
+ archived?: boolean;
130
+ /** The app's call answered with no undo: Fieldia cannot take that back by itself. */
131
+ beyond?: string;
92
132
  }
93
133
  /**
94
134
  * A file the app hands back from an action: its name and kind, and where it is — its address on the app's server, its
@@ -163,7 +203,8 @@ export interface OpenResult {
163
203
  */
164
204
  export interface ActionHost {
165
205
  open(request: OpenRequest): Promise<OpenResult>;
166
- say(message: string, tone: Tone): void;
206
+ /** Words to say, in a tone; with `undo`, a one-tap press's: Undo beside them for a few seconds, pressed, takes it back. */
207
+ say(message: string, tone: Tone, undo?: SayUndo): void;
167
208
  /** A question, answered Yes (true) or No; `how` says what kind, for a host that asks some differently. */
168
209
  ask(message: string, how?: AskHow): Promise<boolean>;
169
210
  /** Close the dialog or panel this form was opened in. */
@@ -182,14 +223,24 @@ export interface ActionHost {
182
223
  * is given one that posts in that record's. False: nothing heard them.
183
224
  */
184
225
  post?(message: PostedMessage): boolean | void | Promise<boolean | void>;
226
+ /**
227
+ * The payment step a send waits on (a page's `payment`): show what is due, and settle once it is paid — through the
228
+ * data source's `pay`, in the person's press — or with null once the person goes back to the answers: nothing is sent.
229
+ * Left out, the form asks the source's `pay` itself.
230
+ */
231
+ pay?(due: PaymentDue, request: PayRequest): Promise<PaidPayment | null>;
185
232
  }
186
233
  /**
187
234
  * How a question is asked. `discard`: its Yes lets go of the person's work not
188
235
  * saved ("Discard your changes?"), so a host words Yes as Discard and puts the
189
- * focus on Cancel: Enter keeps the work.
236
+ * focus on Cancel: Enter keeps the work. `yes`: what answering Yes does, in
237
+ * words its Yes button says — a button's `confirm` is answered by the button's
238
+ * own words, Archive by Archive, "Paste 40 rows: change 7 and add 33?" by
239
+ * Paste 40 rows —, never a bare OK.
190
240
  */
191
241
  export interface AskHow {
192
242
  discard?: boolean;
243
+ yes?: string;
193
244
  }
194
245
  /**
195
246
  * Why a run stopped: a check found problems (`check`), a question was
@@ -218,10 +269,14 @@ export interface RunResult {
218
269
  /** What the app or the host threw, when that stopped it. */
219
270
  error?: unknown;
220
271
  }
221
- /** What a run is for: the id calls carry, the records chosen in a list. */
272
+ /**
273
+ * What a run is for: the id calls carry, the records chosen in a list, and the words of what set it off (a menu item's
274
+ * label), which an `ask` step's Yes says: answered Yes, the run goes on doing it.
275
+ */
222
276
  export interface RunContext {
223
277
  id?: string;
224
278
  recordIds?: RecordId[];
279
+ yes?: string;
225
280
  }
226
281
  /** A step stopped: why, and which (a step of an `open`'s `then`, the deepest). */
227
282
  export interface Stopped {
@@ -256,6 +311,8 @@ export interface RunScope {
256
311
  * reads a box under the person's keys.
257
312
  */
258
313
  typed?: 'first' | 'read';
314
+ /** The words of what set the run off — a button's label, a menu item's — which its `ask` steps' Yes says. */
315
+ yes?: string;
259
316
  /**
260
317
  * What the run's own steps wrote since its last save, by field: what it held
261
318
  * before the first of them, whether that was the person's own change, and
@@ -266,6 +323,8 @@ export interface RunScope {
266
323
  mine: boolean;
267
324
  after: Value;
268
325
  }>;
326
+ /** A press that offers Undo: what it said and did, to be taken back (`PressTaken`). */
327
+ taken?: PressTaken;
269
328
  }
270
329
  /** What a run reaches its form by: the form gives these. */
271
330
  export interface RunForm {
@@ -297,7 +356,8 @@ export interface RunForm {
297
356
  * stops — text left in a box that does not read, said under its box as a check says it.
298
357
  */
299
358
  typedFirst(): Promise<Stopped | null>;
300
- save(chain: readonly string[]): Promise<Stopped | null>;
359
+ /** `yes`: the words of what set it off, which its `beforeSave` questions' Yes says. */
360
+ save(chain: readonly string[], yes?: string): Promise<Stopped | null>;
301
361
  /** The number of the record shown now: each record shown — opened, loaded again, a new one — has its own. */
302
362
  generation(): number;
303
363
  /** Why a run stops whose record was replaced while it went on. */
@@ -317,7 +377,7 @@ export interface RunForm {
317
377
  /** Run `show` of the host while `chain` is the run's, so a tab it shows knows who showed it. */
318
378
  showing(chain: readonly string[], show: () => void): void;
319
379
  host?: ActionHost;
320
- confirm?: (message: string) => boolean | Promise<boolean>;
380
+ confirm?: (message: string, how?: AskHow) => boolean | Promise<boolean>;
321
381
  onAction?: OnAction;
322
382
  /** The app answered a call. */
323
383
  answered(request: ActionRequest, result: ActionResult | undefined): void;
@@ -362,10 +422,13 @@ export interface RunForm {
362
422
  barred?(right: 'edit' | 'archive' | 'duplicate' | 'delete'): string | null;
363
423
  }
364
424
  export declare const DONE: RunResult;
425
+ /** What a press that offers Undo starts keeping (`RunScope.taken`), from the values it begins with. */
426
+ export declare const takenNow: (at?: Values) => PressTaken;
365
427
  /** Steps run against one form. Expressions are read once and kept. */
366
428
  export declare function createRunner(form: RunForm): {
367
429
  runSteps: (steps: readonly ActionStep[], scope: RunScope, inner?: boolean) => Promise<RunResult>;
368
- ask: (message: string) => Promise<boolean>;
430
+ ask: (message: string, yes?: string) => Promise<boolean>;
431
+ kit: UndoKit;
369
432
  };
370
433
  /**
371
434
  * One run of each moment at a time. A moment set off by a step of its own
@@ -375,4 +438,4 @@ export declare function createRunner(form: RunForm): {
375
438
  * meanwhile; the others (beforeSave, afterSave) do not run — a save made
376
439
  * meanwhile goes ahead without them, so nothing waits on itself.
377
440
  */
378
- export declare function createMoments(run: (key: string, steps: readonly ActionStep[], chain: readonly string[], on?: number) => Promise<RunResult>, now?: () => number): (key: string, steps: readonly ActionStep[] | undefined, chain: readonly string[], again: boolean) => Promise<RunResult>;
441
+ export declare function createMoments(run: (key: string, steps: readonly ActionStep[], chain: readonly string[], on?: number, yes?: string) => Promise<RunResult>, now?: () => number): (key: string, steps: readonly ActionStep[] | undefined, chain: readonly string[], again: boolean, yes?: string) => Promise<RunResult>;