@fieldia/core 0.30.1 → 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 (551) 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 +331 -0
  245. package/src/lib/record/data-source.d.ts +331 -0
  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 +14 -8
  263. package/src/lib/record/form-approvals.js.map +1 -1
  264. package/src/lib/record/form-approvals.mjs +13 -7
  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 +115 -3
  273. package/src/lib/record/form.d.ts +115 -3
  274. package/src/lib/record/form.js +262 -65
  275. package/src/lib/record/form.js.map +1 -1
  276. package/src/lib/record/form.mjs +263 -66
  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 +8 -0
  337. package/src/lib/record/locales/ar.js.map +1 -1
  338. package/src/lib/record/locales/ar.mjs +8 -0
  339. package/src/lib/record/locales/ar.mjs.map +1 -1
  340. package/src/lib/record/locales/de.js +8 -0
  341. package/src/lib/record/locales/de.js.map +1 -1
  342. package/src/lib/record/locales/de.mjs +8 -0
  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 +8 -0
  357. package/src/lib/record/locales/fr.js.map +1 -1
  358. package/src/lib/record/locales/fr.mjs +8 -0
  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-codes.d.mts +37 -0
  379. package/src/lib/record/memory-codes.d.ts +37 -0
  380. package/src/lib/record/memory-codes.js +50 -0
  381. package/src/lib/record/memory-codes.js.map +1 -0
  382. package/src/lib/record/memory-codes.mjs +47 -0
  383. package/src/lib/record/memory-codes.mjs.map +1 -0
  384. package/src/lib/record/memory-data-source.d.mts +56 -2
  385. package/src/lib/record/memory-data-source.d.ts +56 -2
  386. package/src/lib/record/memory-data-source.js +67 -1
  387. package/src/lib/record/memory-data-source.js.map +1 -1
  388. package/src/lib/record/memory-data-source.mjs +67 -1
  389. package/src/lib/record/memory-data-source.mjs.map +1 -1
  390. package/src/lib/record/memory-kept.d.mts +3 -1
  391. package/src/lib/record/memory-kept.d.ts +3 -1
  392. package/src/lib/record/memory-kept.js +7 -2
  393. package/src/lib/record/memory-kept.js.map +1 -1
  394. package/src/lib/record/memory-kept.mjs +7 -2
  395. package/src/lib/record/memory-kept.mjs.map +1 -1
  396. package/src/lib/record/memory-later.d.mts +3 -1
  397. package/src/lib/record/memory-later.d.ts +3 -1
  398. package/src/lib/record/memory-later.js +9 -5
  399. package/src/lib/record/memory-later.js.map +1 -1
  400. package/src/lib/record/memory-later.mjs +8 -4
  401. package/src/lib/record/memory-later.mjs.map +1 -1
  402. package/src/lib/record/memory-live.d.mts +8 -0
  403. package/src/lib/record/memory-live.d.ts +8 -0
  404. package/src/lib/record/memory-live.js +70 -0
  405. package/src/lib/record/memory-live.js.map +1 -0
  406. package/src/lib/record/memory-live.mjs +67 -0
  407. package/src/lib/record/memory-live.mjs.map +1 -0
  408. package/src/lib/record/memory-views.d.mts +11 -0
  409. package/src/lib/record/memory-views.d.ts +11 -0
  410. package/src/lib/record/memory-views.js +60 -0
  411. package/src/lib/record/memory-views.js.map +1 -0
  412. package/src/lib/record/memory-views.mjs +57 -0
  413. package/src/lib/record/memory-views.mjs.map +1 -0
  414. package/src/lib/record/messages.d.mts +21 -3
  415. package/src/lib/record/messages.d.ts +21 -3
  416. package/src/lib/record/messages.js +15 -2
  417. package/src/lib/record/messages.js.map +1 -1
  418. package/src/lib/record/messages.mjs +15 -2
  419. package/src/lib/record/messages.mjs.map +1 -1
  420. package/src/lib/record/order.d.mts +21 -0
  421. package/src/lib/record/order.d.ts +21 -0
  422. package/src/lib/record/order.js +129 -0
  423. package/src/lib/record/order.js.map +1 -0
  424. package/src/lib/record/order.mjs +122 -0
  425. package/src/lib/record/order.mjs.map +1 -0
  426. package/src/lib/record/outbox-form.d.mts +79 -0
  427. package/src/lib/record/outbox-form.d.ts +79 -0
  428. package/src/lib/record/outbox-form.js +291 -0
  429. package/src/lib/record/outbox-form.js.map +1 -0
  430. package/src/lib/record/outbox-form.mjs +286 -0
  431. package/src/lib/record/outbox-form.mjs.map +1 -0
  432. package/src/lib/record/outbox-part.d.mts +6 -0
  433. package/src/lib/record/outbox-part.d.ts +6 -0
  434. package/src/lib/record/outbox-part.js +13 -0
  435. package/src/lib/record/outbox-part.js.map +1 -0
  436. package/src/lib/record/outbox-part.mjs +7 -0
  437. package/src/lib/record/outbox-part.mjs.map +1 -0
  438. package/src/lib/record/pay-part.d.mts +6 -0
  439. package/src/lib/record/pay-part.d.ts +6 -0
  440. package/src/lib/record/pay-part.js +11 -0
  441. package/src/lib/record/pay-part.js.map +1 -0
  442. package/src/lib/record/pay-part.mjs +7 -0
  443. package/src/lib/record/pay-part.mjs.map +1 -0
  444. package/src/lib/record/payment-form.d.mts +25 -0
  445. package/src/lib/record/payment-form.d.ts +25 -0
  446. package/src/lib/record/payment-form.js +98 -0
  447. package/src/lib/record/payment-form.js.map +1 -0
  448. package/src/lib/record/payment-form.mjs +95 -0
  449. package/src/lib/record/payment-form.mjs.map +1 -0
  450. package/src/lib/record/prefill-part.d.mts +7 -0
  451. package/src/lib/record/prefill-part.d.ts +7 -0
  452. package/src/lib/record/prefill-part.js +15 -0
  453. package/src/lib/record/prefill-part.js.map +1 -0
  454. package/src/lib/record/prefill-part.mjs +8 -0
  455. package/src/lib/record/prefill-part.mjs.map +1 -0
  456. package/src/lib/record/press-undo.d.mts +42 -0
  457. package/src/lib/record/press-undo.d.ts +42 -0
  458. package/src/lib/record/press-undo.js +115 -0
  459. package/src/lib/record/press-undo.js.map +1 -0
  460. package/src/lib/record/press-undo.mjs +110 -0
  461. package/src/lib/record/press-undo.mjs.map +1 -0
  462. package/src/lib/record/quiz.d.mts +36 -0
  463. package/src/lib/record/quiz.d.ts +36 -0
  464. package/src/lib/record/quiz.js +90 -0
  465. package/src/lib/record/quiz.js.map +1 -0
  466. package/src/lib/record/quiz.mjs +87 -0
  467. package/src/lib/record/quiz.mjs.map +1 -0
  468. package/src/lib/record/record-words.js +1 -1
  469. package/src/lib/record/record-words.js.map +1 -1
  470. package/src/lib/record/record-words.mjs +1 -1
  471. package/src/lib/record/record-words.mjs.map +1 -1
  472. package/src/lib/record/run.d.mts +54 -2
  473. package/src/lib/record/run.d.ts +54 -2
  474. package/src/lib/record/run.js +30 -6
  475. package/src/lib/record/run.js.map +1 -1
  476. package/src/lib/record/run.mjs +28 -5
  477. package/src/lib/record/run.mjs.map +1 -1
  478. package/src/lib/record/survey-kit.d.mts +37 -0
  479. package/src/lib/record/survey-kit.d.ts +37 -0
  480. package/src/lib/record/survey-kit.js +99 -0
  481. package/src/lib/record/survey-kit.js.map +1 -0
  482. package/src/lib/record/survey-kit.mjs +96 -0
  483. package/src/lib/record/survey-kit.mjs.map +1 -0
  484. package/src/lib/record/survey.d.mts +16 -0
  485. package/src/lib/record/survey.d.ts +16 -0
  486. package/src/lib/record/survey.js +17 -0
  487. package/src/lib/record/survey.js.map +1 -0
  488. package/src/lib/record/survey.mjs +13 -0
  489. package/src/lib/record/survey.mjs.map +1 -0
  490. package/src/lib/record/surveyflow-part.d.mts +9 -0
  491. package/src/lib/record/surveyflow-part.d.ts +9 -0
  492. package/src/lib/record/surveyflow-part.js +20 -0
  493. package/src/lib/record/surveyflow-part.js.map +1 -0
  494. package/src/lib/record/surveyflow-part.mjs +10 -0
  495. package/src/lib/record/surveyflow-part.mjs.map +1 -0
  496. package/src/lib/record/timing.d.mts +76 -0
  497. package/src/lib/record/timing.d.ts +76 -0
  498. package/src/lib/record/timing.js +112 -0
  499. package/src/lib/record/timing.js.map +1 -0
  500. package/src/lib/record/timing.mjs +104 -0
  501. package/src/lib/record/timing.mjs.map +1 -0
  502. package/src/lib/record/undo-later.d.mts +9 -0
  503. package/src/lib/record/undo-later.d.ts +9 -0
  504. package/src/lib/record/undo-later.js +10 -0
  505. package/src/lib/record/undo-later.js.map +1 -0
  506. package/src/lib/record/undo-later.mjs +7 -0
  507. package/src/lib/record/undo-later.mjs.map +1 -0
  508. package/src/lib/record/undo-part.d.mts +8 -0
  509. package/src/lib/record/undo-part.d.ts +8 -0
  510. package/src/lib/record/undo-part.js +17 -0
  511. package/src/lib/record/undo-part.js.map +1 -0
  512. package/src/lib/record/undo-part.mjs +9 -0
  513. package/src/lib/record/undo-part.mjs.map +1 -0
  514. package/src/lib/record/upload-to-later.d.mts +10 -0
  515. package/src/lib/record/upload-to-later.d.ts +10 -0
  516. package/src/lib/record/upload-to-later.js +15 -0
  517. package/src/lib/record/upload-to-later.js.map +1 -0
  518. package/src/lib/record/upload-to-later.mjs +12 -0
  519. package/src/lib/record/upload-to-later.mjs.map +1 -0
  520. package/src/lib/record/uploads.d.mts +5 -0
  521. package/src/lib/record/uploads.d.ts +5 -0
  522. package/src/lib/record/uploads.js.map +1 -1
  523. package/src/lib/record/uploads.mjs.map +1 -1
  524. package/src/lib/record/values.d.mts +6 -0
  525. package/src/lib/record/values.d.ts +6 -0
  526. package/src/lib/record/values.js.map +1 -1
  527. package/src/lib/record/values.mjs.map +1 -1
  528. package/src/lib/record/verify-form.d.mts +24 -0
  529. package/src/lib/record/verify-form.d.ts +24 -0
  530. package/src/lib/record/verify-form.js +65 -0
  531. package/src/lib/record/verify-form.js.map +1 -0
  532. package/src/lib/record/verify-form.mjs +62 -0
  533. package/src/lib/record/verify-form.mjs.map +1 -0
  534. package/src/lib/record/verify-part.d.mts +6 -0
  535. package/src/lib/record/verify-part.d.ts +6 -0
  536. package/src/lib/record/verify-part.js +11 -0
  537. package/src/lib/record/verify-part.js.map +1 -0
  538. package/src/lib/record/verify-part.mjs +7 -0
  539. package/src/lib/record/verify-part.mjs.map +1 -0
  540. package/src/lib/record/words-chunks.d.mts +37 -0
  541. package/src/lib/record/words-chunks.d.ts +37 -0
  542. package/src/lib/record/words-chunks.js +94 -0
  543. package/src/lib/record/words-chunks.js.map +1 -0
  544. package/src/lib/record/words-chunks.mjs +86 -0
  545. package/src/lib/record/words-chunks.mjs.map +1 -0
  546. package/src/runtime.d.mts +28 -6
  547. package/src/runtime.d.ts +28 -6
  548. package/src/runtime.js +35 -6
  549. package/src/runtime.js.map +1 -1
  550. package/src/runtime.mjs +15 -3
  551. package/src/runtime.mjs.map +1 -1
@@ -0,0 +1,599 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SchemaRefused = void 0;
4
+ exports.schemaChoices = schemaChoices;
5
+ exports.pageFromSchema = pageFromSchema;
6
+ exports.schemaNoteWords = schemaNoteWords;
7
+ exports.wordsOf = wordsOf;
8
+ const names_1 = require("./names");
9
+ const pattern_1 = require("./pattern");
10
+ const version_1 = require("./version");
11
+ /** A schema that gave no page: what `pageFromSchema` throws, its `code` saying why. */
12
+ class SchemaRefused extends Error {
13
+ code;
14
+ constructor(code, message) {
15
+ super(message);
16
+ this.code = code;
17
+ this.name = 'SchemaRefused';
18
+ }
19
+ }
20
+ exports.SchemaRefused = SchemaRefused;
21
+ /** What an OpenAPI document offers to start from, for a person to choose: its operations, then its components. */
22
+ function schemaChoices(input) {
23
+ const doc = asObject(input);
24
+ if (!doc || !isOpenApi(doc))
25
+ return [];
26
+ const choices = [];
27
+ for (const [path, item] of Object.entries(asObject(doc['paths']) ?? {})) {
28
+ for (const [method, operation] of Object.entries(asObject(item) ?? {})) {
29
+ if (!METHODS.has(method))
30
+ continue;
31
+ const op = asObject(operation) ?? {};
32
+ const summary = typeof op['summary'] === 'string' ? ` — ${op['summary']}` : '';
33
+ choices.push({ value: `${method.toUpperCase()} ${path}`, label: `${method.toUpperCase()} ${path}${summary}` });
34
+ }
35
+ }
36
+ for (const name of Object.keys(components(doc)))
37
+ choices.push({ value: name, label: name });
38
+ return choices;
39
+ }
40
+ /** A page to start from, from a JSON Schema, an OpenAPI document or a model's fields. Throws when it is none of them. */
41
+ function pageFromSchema(input, options = {}) {
42
+ const doc = asObject(input) ?? (Array.isArray(input) ? input : null);
43
+ if (!doc)
44
+ throw new SchemaRefused('not-json-object', 'A schema is a JSON object: a JSON Schema, an OpenAPI document or a model’s fields.');
45
+ const build = new Builder(Array.isArray(doc) ? {} : doc);
46
+ let from;
47
+ let title;
48
+ if (Array.isArray(doc) || isFieldList(doc)) {
49
+ from = 'fields';
50
+ build.fieldList(Array.isArray(doc) ? doc : Object.entries(doc).map(([name, field]) => ({ name, ...field })));
51
+ }
52
+ else if (isOpenApi(doc)) {
53
+ from = 'openapi';
54
+ title = build.openApi(doc, options.schema);
55
+ }
56
+ else if (isJsonSchema(doc)) {
57
+ from = 'json-schema';
58
+ const root = build.resolve(doc, '');
59
+ if (!root)
60
+ throw new SchemaRefused('outside', 'This JSON Schema refers to a schema outside it: give the schema itself.');
61
+ if (!build.objectLike(root))
62
+ throw new SchemaRefused('not-an-object', 'A page starts from an object schema, with properties: this schema is not one.');
63
+ title = typeof root['title'] === 'string' ? root['title'] : undefined;
64
+ build.object(root, '', null);
65
+ }
66
+ else
67
+ throw new SchemaRefused('not-a-schema', 'This is not a JSON Schema, an OpenAPI document or a model’s fields: no properties, no paths, no fields with a type.');
68
+ if (!build.fieldCount())
69
+ throw new SchemaRefused('no-properties', 'The schema has no properties to ask for.');
70
+ const pageTitle = options.title ?? title ?? 'Form';
71
+ return { page: build.page(pageTitle, options), notes: build.notes, unmapped: build.unmapped, from };
72
+ }
73
+ /** Each note in words, for an app to show; the designer says them in its own language. */
74
+ function schemaNoteWords(note) {
75
+ const at = note.path || 'the schema';
76
+ const detail = note.detail ?? '';
77
+ switch (note.code) {
78
+ case 'renamed':
79
+ return `${at} is named ${detail} on the page: a field’s name has letters, digits and _ alone.`;
80
+ case 'flattened':
81
+ return `${at}’s properties are fields of their own, in a section of its name: your data source joins them into one object.`;
82
+ case 'json':
83
+ return `${at} is kept as JSON, shown as text to edit: no field holds ${detail}.`;
84
+ case 'limit':
85
+ return `${at}: ${detail} is not checked by the page; your server checks it.`;
86
+ case 'format':
87
+ return `${at} is plain text: Fieldia does not know the format ${detail}.`;
88
+ case 'pattern':
89
+ return `${at}’s pattern ${detail} does not read as a regular expression, so it was left out.`;
90
+ case 'constant':
91
+ return `${at} is always ${detail}: shown, not asked.`;
92
+ case 'links':
93
+ return `${at} is links to ${detail} records: the fields of its lines were not given.`;
94
+ case 'languages':
95
+ return `${at} is typed in one language: a text kept in several names its languages on the page (translate).`;
96
+ case 'reference':
97
+ return `${at} was left out: it refers to ${detail}, which is not in the document.`;
98
+ case 'kind':
99
+ return `${at} was left out: ${detail} is no kind of value a page asks for.`;
100
+ }
101
+ }
102
+ const asObject = (value) => (value && typeof value === 'object' && !Array.isArray(value) ? value : null);
103
+ const METHODS = new Set(['get', 'put', 'post', 'patch', 'delete', 'options', 'head']);
104
+ const isOpenApi = (doc) => typeof doc['openapi'] === 'string' || typeof doc['swagger'] === 'string';
105
+ const isJsonSchema = (doc) => !!asObject(doc['properties']) || typeof doc['$ref'] === 'string' || Array.isArray(doc['allOf']) || doc['type'] === 'object' || typeof doc['$schema'] === 'string';
106
+ /** A model's fields: every value an object with a type and words (Fieldia's `label`, a backend's `string`). */
107
+ function isFieldList(doc) {
108
+ const values = Object.values(doc);
109
+ return values.length > 0 && !isJsonSchema(doc) && values.every((value) => {
110
+ const field = asObject(value);
111
+ return !!field && typeof field['type'] === 'string' && (typeof field['label'] === 'string' || typeof field['string'] === 'string');
112
+ });
113
+ }
114
+ function components(doc) {
115
+ return asObject(asObject(doc['components'])?.['schemas']) ?? asObject(doc['definitions']) ?? {};
116
+ }
117
+ /** Words for a name: `first_name`, `firstName` and `first-name` all "First name". */
118
+ function wordsOf(name) {
119
+ const words = name
120
+ .replace(/([a-z\d])([A-Z])/g, '$1 $2')
121
+ .replace(/[_\-.]+/g, ' ')
122
+ .trim()
123
+ .replace(/\s+/g, ' ');
124
+ if (!words)
125
+ return name;
126
+ return words.charAt(0).toUpperCase() + words.slice(1).replace(/\b([A-Z])([a-z])/g, (_, first, next) => first.toLowerCase() + next);
127
+ }
128
+ const slug = (words, separator) => words
129
+ .normalize('NFKD')
130
+ .replace(/[̀-ͯ]/g, '')
131
+ .toLowerCase()
132
+ .replace(/[^a-z0-9]+/g, separator)
133
+ .replace(new RegExp(`^\\${separator}+|\\${separator}+$`, 'g'), '');
134
+ class Builder {
135
+ doc;
136
+ notes = [];
137
+ unmapped = [];
138
+ /** The fields of the page itself, and each section's (an object's flattened), in order. */
139
+ groups = [{ made: [] }];
140
+ names = new Set();
141
+ constructor(doc) {
142
+ this.doc = doc;
143
+ }
144
+ fieldCount() {
145
+ return this.groups.reduce((n, group) => n + group.made.length, 0);
146
+ }
147
+ /** A `$ref` followed inside the document (with JSON Pointer's escapes), its own words kept over what it points to. */
148
+ resolve(schema, path, seen = []) {
149
+ let at = asObject(schema);
150
+ const followed = [...seen];
151
+ while (at && typeof at['$ref'] === 'string') {
152
+ const ref = at['$ref'];
153
+ if (!ref.startsWith('#') || followed.includes(ref)) {
154
+ this.unmapped.push({ path, code: 'reference', detail: followed.includes(ref) ? `${ref} (itself)` : ref });
155
+ return null;
156
+ }
157
+ followed.push(ref);
158
+ const target = ref
159
+ .slice(1)
160
+ .split('/')
161
+ .filter(Boolean)
162
+ .map((part) => decodeURIComponent(part).replace(/~1/g, '/').replace(/~0/g, '~'))
163
+ .reduce((node, part) => asObject(node)?.[part], this.doc);
164
+ const { $ref: _ref, ...own } = at;
165
+ const found = asObject(target);
166
+ if (!found) {
167
+ this.unmapped.push({ path, code: 'reference', detail: ref });
168
+ return null;
169
+ }
170
+ at = { ...found, ...own };
171
+ }
172
+ if (!at)
173
+ return null;
174
+ // allOf: one schema of them all, their properties and what each requires together.
175
+ if (Array.isArray(at['allOf'])) {
176
+ const parts = at['allOf'].map((part) => this.resolve(part, path, followed)).filter((part) => !!part);
177
+ const { allOf: _all, ...own } = at;
178
+ return parts.reduce((merged, part) => ({
179
+ ...part,
180
+ ...merged,
181
+ properties: { ...(asObject(part['properties']) ?? {}), ...(asObject(merged['properties']) ?? {}) },
182
+ required: [...(part['required'] ?? []), ...(merged['required'] ?? [])],
183
+ }), own);
184
+ }
185
+ return at;
186
+ }
187
+ objectLike(schema) {
188
+ return schema['type'] === 'object' || !!asObject(schema['properties']);
189
+ }
190
+ /** The kinds of value a schema allows, `null` aside: `["string", "null"]`, OpenAPI 3.0's `nullable`, a union with null. */
191
+ kindOf(schema, path) {
192
+ let at = schema;
193
+ for (const key of ['anyOf', 'oneOf']) {
194
+ const branches = Array.isArray(at[key]) ? at[key].map((branch) => this.resolve(branch, path)).filter((branch) => !!branch) : null;
195
+ if (!branches)
196
+ continue;
197
+ const real = branches.filter((branch) => branch['type'] !== 'null');
198
+ if (real.length === 1) {
199
+ const { [key]: _union, ...own } = at;
200
+ at = { ...real[0], ...own };
201
+ }
202
+ else if (real.length && real.every((branch) => 'const' in branch)) {
203
+ const { [key]: _union, ...own } = at;
204
+ at = { ...own, type: typeof real[0]['const'] === 'number' ? 'number' : 'string', enum: real.map((branch) => branch['const']), 'x-enumNames': real.map((branch) => (typeof branch['title'] === 'string' ? branch['title'] : String(branch['const']))) };
205
+ }
206
+ else
207
+ return { schema: at, type: 'union' };
208
+ }
209
+ const declared = at['type'];
210
+ const types = (Array.isArray(declared) ? declared : declared === undefined ? [] : [declared]).filter((type) => type !== 'null');
211
+ if (types.length > 1)
212
+ return { schema: at, type: 'union' };
213
+ if (types.length === 1)
214
+ return { schema: at, type: String(types[0]) };
215
+ if (Array.isArray(at['enum']))
216
+ return { schema: at, type: at['enum'].every((value) => typeof value === 'number') ? 'number' : 'string' };
217
+ if (this.objectLike(at))
218
+ return { schema: at, type: 'object' };
219
+ if (asObject(at['items']))
220
+ return { schema: at, type: 'array' };
221
+ if ('const' in at)
222
+ return { schema: at, type: typeof at['const'] === 'number' ? 'number' : typeof at['const'] === 'boolean' ? 'boolean' : 'string' };
223
+ if (declared === 'null')
224
+ return { schema: at, type: null };
225
+ // No type said: any JSON.
226
+ return { schema: at, type: 'any' };
227
+ }
228
+ /** A field's name from a property's: letters, digits and _ alone, never one already taken. */
229
+ fieldName(name, path, taken) {
230
+ let made = name.replace(/[^A-Za-z0-9_]+/g, '_').replace(/^_+(?=.)/, '');
231
+ if (!made || !names_1.FIELD_NAME.test(made))
232
+ made = `field_${made}`.replace(/_+$/, '') || 'field';
233
+ let unique = made;
234
+ for (let n = 2; taken.has(unique); n++)
235
+ unique = `${made}_${n}`;
236
+ taken.add(unique);
237
+ if (unique !== name)
238
+ this.notes.push({ path, code: 'renamed', detail: unique });
239
+ return unique;
240
+ }
241
+ /**
242
+ * An object's properties as the page's fields; an object inside one as a section of its own, its fields' names after
243
+ * its name (`prefix`) — two objects deep, then kept as JSON.
244
+ */
245
+ object(schema, path, prefix, section, depth = 0) {
246
+ const group = section === undefined ? this.groups[0] : this.groups[this.groups.push({ title: section, made: [] }) - 1];
247
+ const required = new Set(Array.isArray(schema['required']) ? schema['required'].map(String) : []);
248
+ for (const [key, value] of Object.entries(asObject(schema['properties']) ?? {})) {
249
+ const at = path ? `${path}.${key}` : key;
250
+ const resolved = this.resolve(value, at);
251
+ if (!resolved)
252
+ continue;
253
+ const { schema: property, type } = this.kindOf(resolved, at);
254
+ if (type === 'object' && asObject(property['properties']) && depth < 2) {
255
+ // An object in an object: its properties a section of their own, their names after its name.
256
+ this.notes.push({ path: at, code: 'flattened' });
257
+ this.object(property, at, `${prefix ? `${prefix}_` : ''}${key}`, typeof property['title'] === 'string' ? property['title'] : wordsOf(key), depth + 1);
258
+ continue;
259
+ }
260
+ const name = this.fieldName(prefix ? `${prefix}_${key}` : key, at, this.names);
261
+ const made = this.field(property, type, name, at, required.has(key), false);
262
+ if (made)
263
+ group.made.push(made);
264
+ }
265
+ }
266
+ /** One property's field, with its words, its rules and how it is shown; null when it is left out. */
267
+ field(schema, type, name, path, required, onLine) {
268
+ const label = typeof schema['title'] === 'string' && schema['title'].trim() ? schema['title'].trim() : wordsOf(path.split('.').pop() ?? name);
269
+ const common = { label };
270
+ if (typeof schema['description'] === 'string' && schema['description'].trim())
271
+ common['help'] = schema['description'].trim();
272
+ if (required)
273
+ common['required'] = true;
274
+ if (schema['readOnly'] === true)
275
+ common['readonly'] = true;
276
+ const made = (field, extra = {}) => {
277
+ const whole = { ...field, ...common };
278
+ this.withDefault(whole, schema, path);
279
+ return { name, field: whole, ...extra };
280
+ };
281
+ if ('const' in schema && !Array.isArray(schema['enum'])) {
282
+ this.notes.push({ path, code: 'constant', detail: JSON.stringify(schema['const']) });
283
+ common['readonly'] = true;
284
+ schema = { ...schema, default: schema['const'] };
285
+ }
286
+ if (Array.isArray(schema['enum'])) {
287
+ const options = this.options(schema);
288
+ if (options.length)
289
+ return made({ type: 'selection', options });
290
+ }
291
+ switch (type) {
292
+ case 'string':
293
+ return this.text(schema, path, made);
294
+ case 'integer':
295
+ case 'number':
296
+ return made({ type: type === 'integer' ? 'integer' : 'float', ...this.bounds(schema, path, type === 'integer') });
297
+ case 'boolean':
298
+ return made({ type: 'boolean' });
299
+ case 'array':
300
+ return this.list(schema, name, path, onLine, made);
301
+ case 'object':
302
+ case 'union':
303
+ case 'any':
304
+ this.notes.push({ path, code: 'json', detail: type === 'object' ? 'an object' : type === 'union' ? 'a value of several kinds' : 'any JSON' });
305
+ return made({ type: 'json' }, { wide: true });
306
+ default:
307
+ this.unmapped.push({ path, code: 'kind', detail: type === null ? 'null' : String(type) });
308
+ return null;
309
+ }
310
+ }
311
+ /** A schema's default, where it is a value its field takes. */
312
+ withDefault(field, schema, path) {
313
+ if (!('default' in schema) || schema['default'] === null)
314
+ return;
315
+ const value = schema['default'];
316
+ const fits = field.type === 'selection'
317
+ ? (field.multiple ? Array.isArray(value) && value.every((one) => field.options.some((option) => option.value === one)) : field.options.some((option) => option.value === value))
318
+ : field.type === 'boolean'
319
+ ? typeof value === 'boolean'
320
+ : field.type === 'integer'
321
+ ? Number.isInteger(value)
322
+ : field.type === 'float' || field.type === 'monetary'
323
+ ? typeof value === 'number'
324
+ : field.type === 'date'
325
+ ? typeof value === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(value)
326
+ : field.type === 'char' || field.type === 'text' || field.type === 'html'
327
+ ? typeof value === 'string'
328
+ : field.type === 'json';
329
+ if (fits)
330
+ field.default = value;
331
+ else
332
+ this.notes.push({ path, code: 'limit', detail: `default ${JSON.stringify(value)}` });
333
+ }
334
+ /** A list of choices: each value with its words — `x-enumNames`, else the value as words. */
335
+ options(schema) {
336
+ const names = Array.isArray(schema['x-enumNames']) ? schema['x-enumNames'] : Array.isArray(schema['x-enum-varnames']) ? schema['x-enum-varnames'] : [];
337
+ return schema['enum']
338
+ .filter((value) => typeof value === 'string' || typeof value === 'number')
339
+ .map((value, i) => ({ value, label: typeof names[i] === 'string' && names[i] ? String(names[i]) : typeof value === 'string' ? wordsOf(value) : String(value) }));
340
+ }
341
+ text(schema, path, made) {
342
+ const format = typeof schema['format'] === 'string' ? schema['format'] : '';
343
+ const media = typeof schema['contentMediaType'] === 'string' ? schema['contentMediaType'] : '';
344
+ if (format === 'date')
345
+ return made({ type: 'date' });
346
+ if (format === 'date-time')
347
+ return made({ type: 'datetime' });
348
+ if (format === 'binary' || format === 'byte' || schema['contentEncoding'] === 'base64')
349
+ return made({ type: 'binary', ...(media && media !== 'application/octet-stream' ? { accept: [media] } : {}) });
350
+ if (format === 'html' || media === 'text/html')
351
+ return made({ type: 'html' }, { wide: true });
352
+ const maxLength = typeof schema['maxLength'] === 'number' && Number.isInteger(schema['maxLength']) && schema['maxLength'] > 0 ? schema['maxLength'] : undefined;
353
+ if (typeof schema['minLength'] === 'number' && schema['minLength'] > 1)
354
+ this.notes.push({ path, code: 'limit', detail: `minLength ${schema['minLength']}` });
355
+ const long = format === 'textarea' || format === 'multiline' || (maxLength !== undefined && maxLength > 255);
356
+ if (long)
357
+ return made({ type: 'text', ...(maxLength ? { size: maxLength } : {}) }, { wide: true });
358
+ const widget = format === 'email' || format === 'idn-email' ? 'email' : format === 'uri' || format === 'url' || format === 'iri' ? 'url' : format === 'time' ? 'time' : format === 'phone' || format === 'tel' ? 'phone' : format === 'color' ? 'color' : format === 'password' || schema['writeOnly'] === true ? 'password' : undefined;
359
+ if (format && !widget && !['uuid', 'hostname', 'idn-hostname', 'ipv4', 'ipv6', 'regex', 'uri-reference', 'json-pointer'].includes(format))
360
+ this.notes.push({ path, code: 'format', detail: format });
361
+ const field = { type: 'char', ...(maxLength ? { size: maxLength } : {}) };
362
+ if (typeof schema['pattern'] === 'string' && !widget) {
363
+ const pattern = wholePattern(schema['pattern']);
364
+ if ((0, pattern_1.fieldPattern)(pattern) instanceof Error)
365
+ this.notes.push({ path, code: 'pattern', detail: schema['pattern'] });
366
+ else
367
+ field['pattern'] = pattern;
368
+ }
369
+ return made(field, widget ? { widget } : {});
370
+ }
371
+ /** A number's least and most, as the schema writes them: `minimum`, `exclusiveMinimum` (a number, or draft 4's flag), `multipleOf` as decimals. */
372
+ bounds(schema, path, whole) {
373
+ const out = {};
374
+ for (const [side, inclusive, exclusive, step] of [['min', 'minimum', 'exclusiveMinimum', 1], ['max', 'maximum', 'exclusiveMaximum', -1]]) {
375
+ const value = schema[inclusive];
376
+ const excluded = schema[exclusive];
377
+ if (typeof excluded === 'number') {
378
+ out[side] = whole ? excluded + step : excluded;
379
+ if (!whole)
380
+ this.notes.push({ path, code: 'limit', detail: `${exclusive} ${excluded}` });
381
+ }
382
+ else if (typeof value === 'number') {
383
+ out[side] = excluded === true && whole ? value + step : value;
384
+ if (excluded === true && !whole)
385
+ this.notes.push({ path, code: 'limit', detail: `${exclusive} ${value}` });
386
+ }
387
+ }
388
+ const multiple = schema['multipleOf'];
389
+ if (typeof multiple === 'number' && multiple > 0) {
390
+ const places = Math.round(-Math.log10(multiple));
391
+ if (!whole && places > 0 && places <= 8 && Math.abs(multiple - 10 ** -places) < 1e-12)
392
+ out['digits'] = [16, places];
393
+ else if (!(whole && multiple === 1))
394
+ this.notes.push({ path, code: 'limit', detail: `multipleOf ${multiple}` });
395
+ }
396
+ return out;
397
+ }
398
+ /** A list: choices (several picked), files, lines of their own — else JSON. */
399
+ list(schema, name, path, onLine, made) {
400
+ const items = this.resolve(schema['items'], `${path}[]`);
401
+ const { schema: item, type } = items ? this.kindOf(items, `${path}[]`) : { schema: {}, type: 'any' };
402
+ const counts = ['minItems', 'maxItems', 'uniqueItems'].filter((key) => key in schema && !(key === 'uniqueItems' && Array.isArray(item['enum'])));
403
+ if (Array.isArray(item['enum'])) {
404
+ const options = this.options(item);
405
+ for (const key of counts)
406
+ this.notes.push({ path, code: 'limit', detail: `${key} ${JSON.stringify(schema[key])}` });
407
+ if (options.length)
408
+ return made({ type: 'selection', options, multiple: true });
409
+ }
410
+ if (type === 'string' && (item['format'] === 'binary' || item['format'] === 'byte' || item['contentEncoding'] === 'base64')) {
411
+ const min = typeof schema['minItems'] === 'number' && schema['minItems'] > 0 ? { minFiles: schema['minItems'] } : {};
412
+ const max = typeof schema['maxItems'] === 'number' && schema['maxItems'] > 0 ? { maxFiles: schema['maxItems'] } : {};
413
+ return made({ type: 'binary', multiple: true, ...min, ...max });
414
+ }
415
+ if (type === 'object' && asObject(item['properties']) && !onLine) {
416
+ const fields = {};
417
+ const taken = new Set();
418
+ const required = new Set(Array.isArray(item['required']) ? item['required'].map(String) : []);
419
+ for (const [key, value] of Object.entries(asObject(item['properties']) ?? {})) {
420
+ const at = `${path}[].${key}`;
421
+ const resolved = this.resolve(value, at);
422
+ if (!resolved)
423
+ continue;
424
+ const { schema: property, type: kind } = this.kindOf(resolved, at);
425
+ const lineName = this.fieldName(key, at, taken);
426
+ // A line holds no lines of its own here, nor an object: those are kept as JSON.
427
+ const line = kind === 'object' || (kind === 'array' && !Array.isArray(this.resolve(property['items'], at)?.['enum']))
428
+ ? (this.notes.push({ path: at, code: 'json', detail: kind === 'object' ? 'an object inside a line' : 'a list inside a line' }), this.field(property, 'any', lineName, at, required.has(key), true))
429
+ : this.field(property, kind, lineName, at, required.has(key), true);
430
+ if (line)
431
+ fields[line.name] = line.field;
432
+ }
433
+ for (const key of counts)
434
+ this.notes.push({ path, code: 'limit', detail: `${key} ${JSON.stringify(schema[key])}` });
435
+ if (!Object.keys(fields).length)
436
+ return null;
437
+ const relation = typeof item['title'] === 'string' ? slug(item['title'], '.') || slug(name, '.') : slug(name, '.');
438
+ return made({ type: 'one2many', relation: relation || 'line', fields }, { wide: true });
439
+ }
440
+ this.notes.push({ path, code: 'json', detail: type === 'string' ? 'a list of text' : type === 'integer' || type === 'number' ? 'a list of numbers' : 'a list' });
441
+ return made({ type: 'json' }, { wide: true });
442
+ }
443
+ /** An OpenAPI document's schema, as asked: its title. */
444
+ openApi(doc, asked) {
445
+ const operations = [];
446
+ for (const [path, item] of Object.entries(asObject(doc['paths']) ?? {})) {
447
+ for (const [method, operation] of Object.entries(asObject(item) ?? {})) {
448
+ const op = asObject(operation);
449
+ if (METHODS.has(method) && op)
450
+ operations.push({ key: `${method.toUpperCase()} ${path}`, id: typeof op['operationId'] === 'string' ? op['operationId'] : undefined, path, method, operation: op, item: asObject(item) ?? {} });
451
+ }
452
+ }
453
+ const schemas = components(doc);
454
+ const wanted = asked?.trim();
455
+ const operation = wanted
456
+ ? operations.find((one) => one.key.toLowerCase() === wanted.toLowerCase() || one.id === wanted)
457
+ : schemas && Object.keys(schemas).length && !operations.some((one) => this.bodyOf(one.operation) || this.parametersOf(one.operation, one.item).length)
458
+ ? undefined
459
+ : operations.find((one) => this.bodyOf(one.operation) || this.parametersOf(one.operation, one.item).length);
460
+ if (operation) {
461
+ const body = this.bodyOf(operation.operation);
462
+ const parameters = this.parametersOf(operation.operation, operation.item);
463
+ const required = new Set();
464
+ const properties = {};
465
+ for (const parameter of parameters) {
466
+ properties[String(parameter['name'])] = { ...(asObject(parameter['schema']) ?? parameter), ...(typeof parameter['description'] === 'string' ? { description: parameter['description'] } : {}) };
467
+ if (parameter['required'] === true)
468
+ required.add(String(parameter['name']));
469
+ }
470
+ if (parameters.length)
471
+ this.object({ properties, required: [...required] }, '', null);
472
+ const resolved = body ? this.resolve(body, 'body') : null;
473
+ if (resolved && this.objectLike(resolved))
474
+ this.object(resolved, '', null);
475
+ else if (resolved) {
476
+ const made = this.field(resolved, this.kindOf(resolved, 'body').type, this.fieldName('body', 'body', this.names), 'body', true, false);
477
+ if (made)
478
+ this.groups[0].made.push(made);
479
+ }
480
+ const summary = operation.operation['summary'];
481
+ return typeof summary === 'string' && summary.trim() ? summary.trim() : typeof resolved?.['title'] === 'string' ? resolved['title'] : operation.id ? wordsOf(operation.id) : undefined;
482
+ }
483
+ const name = wanted ? Object.keys(schemas).find((one) => one === wanted || one.toLowerCase() === wanted.toLowerCase()) : Object.keys(schemas)[0];
484
+ if (wanted && !name)
485
+ throw new SchemaRefused('no-such-schema', `This document has no operation or schema “${wanted}”.`);
486
+ if (!name)
487
+ throw new SchemaRefused('nothing-in-document', 'This OpenAPI document has no operation with a request body or parameters, and no schemas.');
488
+ const root = this.resolve(schemas[name], name);
489
+ if (!root || !this.objectLike(root))
490
+ throw new SchemaRefused('not-an-object', `The schema “${name}” is not an object, with properties.`);
491
+ this.object(root, '', null);
492
+ return typeof root['title'] === 'string' ? root['title'] : wordsOf(name);
493
+ }
494
+ /** An operation's request body's JSON (or form) schema: OpenAPI 3's `requestBody`, Swagger 2's `in: body` parameter. */
495
+ bodyOf(operation) {
496
+ const body = this.resolve(operation['requestBody'], 'body');
497
+ const content = asObject(body?.['content']);
498
+ if (content) {
499
+ const type = Object.keys(content).find((one) => /json/.test(one)) ?? Object.keys(content).find((one) => /form/.test(one)) ?? Object.keys(content)[0];
500
+ return asObject(asObject(content[type])?.['schema']);
501
+ }
502
+ const parameter = (operation['parameters'] ?? []).map((one) => this.resolve(one, 'body')).find((one) => one?.['in'] === 'body');
503
+ return asObject(parameter?.['schema']);
504
+ }
505
+ /** An operation's own parameters and its path's — query, path, header, a form's — each a field to fill. */
506
+ parametersOf(operation, item) {
507
+ const all = [...(item['parameters'] ?? []), ...(operation['parameters'] ?? [])].map((one) => this.resolve(one, 'parameters')).filter((one) => !!one && typeof one['name'] === 'string' && one['in'] !== 'body' && one['in'] !== 'cookie');
508
+ const byName = new Map(all.map((one) => [`${one['in']}:${one['name']}`, one]));
509
+ return [...byName.values()];
510
+ }
511
+ /** A model's fields: Fieldia's own as they are, a backend's (`string`, `selection` pairs, `relation`) made Fieldia's. */
512
+ fieldList(list) {
513
+ for (const entry of list) {
514
+ const given = asObject(entry);
515
+ if (!given || typeof given['name'] !== 'string' || typeof given['type'] !== 'string')
516
+ continue;
517
+ const path = given['name'];
518
+ const name = this.fieldName(path, path, this.names);
519
+ const type = given['type'] === 'many2one_reference' ? 'integer' : given['type'];
520
+ if (!names_1.FIELD_TYPES.includes(type) || type === 'properties' || type === 'matrix') {
521
+ this.unmapped.push({ path, code: 'kind', detail: type });
522
+ continue;
523
+ }
524
+ const label = typeof given['label'] === 'string' ? given['label'] : typeof given['string'] === 'string' ? given['string'] : wordsOf(path);
525
+ const field = { type, label };
526
+ for (const key of ['help', 'required', 'readonly', 'relation', 'size', 'digits', 'currency', 'multiple', 'accept', 'min', 'max', 'pattern'])
527
+ if (given[key] !== undefined && given[key] !== false && given[key] !== '')
528
+ field[key] = given[key];
529
+ if (typeof given['currency_field'] === 'string')
530
+ field['currencyField'] = given['currency_field'];
531
+ if (Array.isArray(given['digits']) && given['digits'].length !== 2)
532
+ delete field['digits'];
533
+ // A text kept in several languages: Fieldia's own field keeps its languages, each typed by a person; a backend's
534
+ // `translate: true` (Flectra's) names none, so it is typed in one here, and said.
535
+ if (['char', 'text', 'html'].includes(type)) {
536
+ const tags = given['translate'];
537
+ if (Array.isArray(tags) && tags.length > 1 && tags.every((tag) => typeof tag === 'string')) {
538
+ field['translate'] = tags;
539
+ if (Array.isArray(given['requiredIn']))
540
+ field['requiredIn'] = given['requiredIn'];
541
+ }
542
+ else if (tags === true)
543
+ this.notes.push({ path, code: 'languages' });
544
+ }
545
+ if (type === 'selection' || type === 'reference') {
546
+ const raw = (Array.isArray(given['options']) ? given['options'] : Array.isArray(given['selection']) ? given['selection'] : Array.isArray(given['models']) ? given['models'] : []);
547
+ const options = raw.map((one) => (Array.isArray(one) ? { value: one[0], label: String(one[1] ?? one[0]) } : asObject(one))).filter((one) => !!one && (typeof one.value === 'string' || typeof one.value === 'number'));
548
+ if (!options.length) {
549
+ this.unmapped.push({ path, code: 'kind', detail: `${type} with no options` });
550
+ continue;
551
+ }
552
+ field[type === 'reference' ? 'models' : 'options'] = options;
553
+ }
554
+ if ((type === 'many2one' || type === 'many2many' || type === 'one2many') && typeof field['relation'] !== 'string') {
555
+ this.unmapped.push({ path, code: 'kind', detail: `${type} with no relation` });
556
+ continue;
557
+ }
558
+ if (type === 'one2many') {
559
+ const lines = asObject(given['fields']);
560
+ if (lines)
561
+ field['fields'] = lines;
562
+ else {
563
+ // Its lines' fields unknown: its records as links, which the designer can turn into lines.
564
+ field['type'] = 'many2many';
565
+ this.notes.push({ path, code: 'links', detail: String(field['relation']) });
566
+ }
567
+ }
568
+ this.groups[0].made.push({ name, field: field, wide: ['text', 'html', 'one2many', 'many2many', 'json'].includes(String(field['type'])) && type !== 'many2many' });
569
+ }
570
+ }
571
+ /** The page: its fields, and a screen's sections or a survey's steps. */
572
+ page(title, options) {
573
+ const survey = options.kind === 'survey';
574
+ const fields = {};
575
+ const nodes = (made) => made.map((one) => {
576
+ fields[one.name] = one.field;
577
+ return { type: 'field', id: `f-${one.name}`, field: one.name, ...(one.widget ? { widget: one.widget } : {}), ...(one.wide && !survey ? { colspan: 2 } : {}) };
578
+ });
579
+ const groups = this.groups.filter((group) => group.made.length);
580
+ const children = groups.map((group, i) => survey
581
+ ? { type: 'step', id: `step-${i + 1}`, label: group.title ?? title, children: nodes(group.made) }
582
+ : { type: 'section', id: `section-${i + 1}`, ...(group.title ? { title: group.title } : {}), columns: 2, children: nodes(group.made) });
583
+ const words = slug(title, '-') || 'form';
584
+ return {
585
+ fieldia: version_1.FORMAT_VERSION,
586
+ id: options.id ?? words,
587
+ title,
588
+ data: survey ? { kind: 'responses' } : { kind: 'record', model: options.model ?? (slug(title, '.') || 'record') },
589
+ fields,
590
+ layout: survey ? { type: 'wizard', id: 'steps', children } : { type: 'sections', id: 'sections', children },
591
+ };
592
+ }
593
+ }
594
+ /** A JSON Schema pattern (found anywhere in the answer) as a field's (the whole answer): `^…$` as it is, else found inside. */
595
+ function wholePattern(pattern) {
596
+ const anchored = pattern.startsWith('^') && /(^|[^\\])\$$/.test(pattern) && !pattern.includes('|');
597
+ return anchored ? pattern.slice(1, -1) : `.*(?:${pattern}).*`;
598
+ }
599
+ //# sourceMappingURL=from-schema.js.map