@fieldia/core 0.26.1 → 0.27.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 (415) hide show
  1. package/README.md +307 -3
  2. package/package.json +1 -1
  3. package/schema/page.schema.json +227 -23
  4. package/src/index.d.mts +8 -2
  5. package/src/index.d.ts +8 -2
  6. package/src/index.js +22 -1
  7. package/src/index.js.map +1 -1
  8. package/src/index.mjs +9 -2
  9. package/src/index.mjs.map +1 -1
  10. package/src/lib/expression/app-functions.d.mts +47 -0
  11. package/src/lib/expression/app-functions.d.ts +47 -0
  12. package/src/lib/expression/app-functions.js +64 -0
  13. package/src/lib/expression/app-functions.js.map +1 -0
  14. package/src/lib/expression/app-functions.mjs +58 -0
  15. package/src/lib/expression/app-functions.mjs.map +1 -0
  16. package/src/lib/expression/dates.d.mts +21 -0
  17. package/src/lib/expression/dates.d.ts +21 -0
  18. package/src/lib/expression/dates.js +73 -0
  19. package/src/lib/expression/dates.js.map +1 -0
  20. package/src/lib/expression/dates.mjs +67 -0
  21. package/src/lib/expression/dates.mjs.map +1 -0
  22. package/src/lib/expression/evaluator.js +12 -6
  23. package/src/lib/expression/evaluator.js.map +1 -1
  24. package/src/lib/expression/evaluator.mjs +12 -6
  25. package/src/lib/expression/evaluator.mjs.map +1 -1
  26. package/src/lib/expression/expression.d.mts +7 -3
  27. package/src/lib/expression/expression.d.ts +7 -3
  28. package/src/lib/expression/expression.js +8 -2
  29. package/src/lib/expression/expression.js.map +1 -1
  30. package/src/lib/expression/expression.mjs +7 -2
  31. package/src/lib/expression/expression.mjs.map +1 -1
  32. package/src/lib/expression/functions-part.d.mts +7 -0
  33. package/src/lib/expression/functions-part.d.ts +7 -0
  34. package/src/lib/expression/functions-part.js +13 -0
  35. package/src/lib/expression/functions-part.js.map +1 -0
  36. package/src/lib/expression/functions-part.mjs +8 -0
  37. package/src/lib/expression/functions-part.mjs.map +1 -0
  38. package/src/lib/expression/functions.d.mts +60 -3
  39. package/src/lib/expression/functions.d.ts +60 -3
  40. package/src/lib/expression/functions.js +109 -15
  41. package/src/lib/expression/functions.js.map +1 -1
  42. package/src/lib/expression/functions.mjs +103 -16
  43. package/src/lib/expression/functions.mjs.map +1 -1
  44. package/src/lib/expression/kinds.d.mts +31 -0
  45. package/src/lib/expression/kinds.d.ts +31 -0
  46. package/src/lib/expression/kinds.js +159 -0
  47. package/src/lib/expression/kinds.js.map +1 -0
  48. package/src/lib/expression/kinds.mjs +151 -0
  49. package/src/lib/expression/kinds.mjs.map +1 -0
  50. package/src/lib/expression/modifier.d.mts +4 -3
  51. package/src/lib/expression/modifier.d.ts +4 -3
  52. package/src/lib/expression/modifier.js +4 -3
  53. package/src/lib/expression/modifier.js.map +1 -1
  54. package/src/lib/expression/modifier.mjs +4 -3
  55. package/src/lib/expression/modifier.mjs.map +1 -1
  56. package/src/lib/expression/more-functions.d.mts +8 -0
  57. package/src/lib/expression/more-functions.d.ts +8 -0
  58. package/src/lib/expression/more-functions.js +235 -0
  59. package/src/lib/expression/more-functions.js.map +1 -0
  60. package/src/lib/expression/more-functions.mjs +230 -0
  61. package/src/lib/expression/more-functions.mjs.map +1 -0
  62. package/src/lib/expression/parser.d.mts +4 -1
  63. package/src/lib/expression/parser.d.ts +4 -1
  64. package/src/lib/expression/parser.js +6 -3
  65. package/src/lib/expression/parser.js.map +1 -1
  66. package/src/lib/expression/parser.mjs +6 -3
  67. package/src/lib/expression/parser.mjs.map +1 -1
  68. package/src/lib/expression/reads.d.mts +2 -2
  69. package/src/lib/expression/reads.d.ts +2 -2
  70. package/src/lib/expression/reads.js +6 -4
  71. package/src/lib/expression/reads.js.map +1 -1
  72. package/src/lib/expression/reads.mjs +6 -4
  73. package/src/lib/expression/reads.mjs.map +1 -1
  74. package/src/lib/format/actions.d.mts +16 -16
  75. package/src/lib/format/actions.d.ts +16 -16
  76. package/src/lib/format/check-page.d.mts +7 -2
  77. package/src/lib/format/check-page.d.ts +7 -2
  78. package/src/lib/format/check-page.js +10 -4
  79. package/src/lib/format/check-page.js.map +1 -1
  80. package/src/lib/format/check-page.mjs +10 -4
  81. package/src/lib/format/check-page.mjs.map +1 -1
  82. package/src/lib/format/choice-options.d.mts +34 -0
  83. package/src/lib/format/choice-options.d.ts +34 -0
  84. package/src/lib/format/choice-options.js +60 -0
  85. package/src/lib/format/choice-options.js.map +1 -0
  86. package/src/lib/format/choice-options.mjs +51 -0
  87. package/src/lib/format/choice-options.mjs.map +1 -0
  88. package/src/lib/format/endings-checks.d.mts +8 -0
  89. package/src/lib/format/endings-checks.d.ts +8 -0
  90. package/src/lib/format/endings-checks.js +23 -0
  91. package/src/lib/format/endings-checks.js.map +1 -0
  92. package/src/lib/format/endings-checks.mjs +20 -0
  93. package/src/lib/format/endings-checks.mjs.map +1 -0
  94. package/src/lib/format/endings.d.mts +40 -0
  95. package/src/lib/format/endings.d.ts +40 -0
  96. package/src/lib/format/endings.js +15 -0
  97. package/src/lib/format/endings.js.map +1 -0
  98. package/src/lib/format/endings.mjs +12 -0
  99. package/src/lib/format/endings.mjs.map +1 -0
  100. package/src/lib/format/field.d.mts +151 -16
  101. package/src/lib/format/field.d.ts +151 -16
  102. package/src/lib/format/field.js +64 -11
  103. package/src/lib/format/field.js.map +1 -1
  104. package/src/lib/format/field.mjs +63 -10
  105. package/src/lib/format/field.mjs.map +1 -1
  106. package/src/lib/format/head-checks.d.mts +2 -0
  107. package/src/lib/format/head-checks.d.ts +2 -0
  108. package/src/lib/format/head-checks.js +2 -59
  109. package/src/lib/format/head-checks.js.map +1 -1
  110. package/src/lib/format/head-checks.mjs +1 -58
  111. package/src/lib/format/head-checks.mjs.map +1 -1
  112. package/src/lib/format/later-checks.d.mts +17 -0
  113. package/src/lib/format/later-checks.d.ts +17 -0
  114. package/src/lib/format/later-checks.js +20 -0
  115. package/src/lib/format/later-checks.js.map +1 -0
  116. package/src/lib/format/later-checks.mjs +17 -0
  117. package/src/lib/format/later-checks.mjs.map +1 -0
  118. package/src/lib/format/layout.d.mts +241 -188
  119. package/src/lib/format/layout.d.ts +241 -188
  120. package/src/lib/format/layout.js +33 -28
  121. package/src/lib/format/layout.js.map +1 -1
  122. package/src/lib/format/layout.mjs +13 -3
  123. package/src/lib/format/layout.mjs.map +1 -1
  124. package/src/lib/format/layout.types.d.mts +2 -1
  125. package/src/lib/format/layout.types.d.ts +2 -1
  126. package/src/lib/format/limits-checks.d.mts +14 -0
  127. package/src/lib/format/limits-checks.d.ts +14 -0
  128. package/src/lib/format/limits-checks.js +36 -0
  129. package/src/lib/format/limits-checks.js.map +1 -0
  130. package/src/lib/format/limits-checks.mjs +33 -0
  131. package/src/lib/format/limits-checks.mjs.map +1 -0
  132. package/src/lib/format/limits.d.mts +24 -0
  133. package/src/lib/format/limits.d.ts +24 -0
  134. package/src/lib/format/limits.js +35 -0
  135. package/src/lib/format/limits.js.map +1 -0
  136. package/src/lib/format/limits.mjs +32 -0
  137. package/src/lib/format/limits.mjs.map +1 -0
  138. package/src/lib/format/list-checks.d.mts +44 -0
  139. package/src/lib/format/list-checks.d.ts +44 -0
  140. package/src/lib/format/list-checks.js +340 -0
  141. package/src/lib/format/list-checks.js.map +1 -0
  142. package/src/lib/format/list-checks.mjs +336 -0
  143. package/src/lib/format/list-checks.mjs.map +1 -0
  144. package/src/lib/format/map-checks.d.mts +33 -0
  145. package/src/lib/format/map-checks.d.ts +33 -0
  146. package/src/lib/format/map-checks.js +180 -0
  147. package/src/lib/format/map-checks.js.map +1 -0
  148. package/src/lib/format/map-checks.mjs +175 -0
  149. package/src/lib/format/map-checks.mjs.map +1 -0
  150. package/src/lib/format/mapchecks-part.d.mts +5 -0
  151. package/src/lib/format/mapchecks-part.d.ts +5 -0
  152. package/src/lib/format/mapchecks-part.js +11 -0
  153. package/src/lib/format/mapchecks-part.js.map +1 -0
  154. package/src/lib/format/mapchecks-part.mjs +6 -0
  155. package/src/lib/format/mapchecks-part.mjs.map +1 -0
  156. package/src/lib/format/option-checks.d.mts +16 -0
  157. package/src/lib/format/option-checks.d.ts +16 -0
  158. package/src/lib/format/option-checks.js +39 -0
  159. package/src/lib/format/option-checks.js.map +1 -0
  160. package/src/lib/format/option-checks.mjs +36 -0
  161. package/src/lib/format/option-checks.mjs.map +1 -0
  162. package/src/lib/format/options-part.d.mts +6 -0
  163. package/src/lib/format/options-part.d.ts +6 -0
  164. package/src/lib/format/options-part.js +11 -0
  165. package/src/lib/format/options-part.js.map +1 -0
  166. package/src/lib/format/options-part.mjs +7 -0
  167. package/src/lib/format/options-part.mjs.map +1 -0
  168. package/src/lib/format/page.d.mts +147 -71
  169. package/src/lib/format/page.d.ts +147 -71
  170. package/src/lib/format/page.js +5 -0
  171. package/src/lib/format/page.js.map +1 -1
  172. package/src/lib/format/page.mjs +5 -0
  173. package/src/lib/format/page.mjs.map +1 -1
  174. package/src/lib/format/part-checks.d.mts +20 -0
  175. package/src/lib/format/part-checks.d.ts +20 -0
  176. package/src/lib/format/part-checks.js +3 -0
  177. package/src/lib/format/part-checks.js.map +1 -0
  178. package/src/lib/format/part-checks.mjs +2 -0
  179. package/src/lib/format/part-checks.mjs.map +1 -0
  180. package/src/lib/format/references.d.mts +71 -65
  181. package/src/lib/format/references.d.ts +71 -65
  182. package/src/lib/format/references.js +194 -631
  183. package/src/lib/format/references.js.map +1 -1
  184. package/src/lib/format/references.mjs +194 -631
  185. package/src/lib/format/references.mjs.map +1 -1
  186. package/src/lib/format/seats-checks.d.mts +3 -0
  187. package/src/lib/format/seats-checks.d.ts +3 -0
  188. package/src/lib/format/seats-checks.js +13 -0
  189. package/src/lib/format/seats-checks.js.map +1 -0
  190. package/src/lib/format/seats-checks.mjs +10 -0
  191. package/src/lib/format/seats-checks.mjs.map +1 -0
  192. package/src/lib/format/sheet-head-checks.d.mts +4 -0
  193. package/src/lib/format/sheet-head-checks.d.ts +4 -0
  194. package/src/lib/format/sheet-head-checks.js +68 -0
  195. package/src/lib/format/sheet-head-checks.js.map +1 -0
  196. package/src/lib/format/sheet-head-checks.mjs +65 -0
  197. package/src/lib/format/sheet-head-checks.mjs.map +1 -0
  198. package/src/lib/format/signature-checks.d.mts +7 -0
  199. package/src/lib/format/signature-checks.d.ts +7 -0
  200. package/src/lib/format/signature-checks.js +32 -0
  201. package/src/lib/format/signature-checks.js.map +1 -0
  202. package/src/lib/format/signature-checks.mjs +29 -0
  203. package/src/lib/format/signature-checks.mjs.map +1 -0
  204. package/src/lib/format/signature-options.d.mts +24 -0
  205. package/src/lib/format/signature-options.d.ts +24 -0
  206. package/src/lib/format/signature-options.js +30 -0
  207. package/src/lib/format/signature-options.js.map +1 -0
  208. package/src/lib/format/signature-options.mjs +26 -0
  209. package/src/lib/format/signature-options.mjs.map +1 -0
  210. package/src/lib/format/slots-checks.d.mts +4 -0
  211. package/src/lib/format/slots-checks.d.ts +4 -0
  212. package/src/lib/format/slots-checks.js +21 -0
  213. package/src/lib/format/slots-checks.js.map +1 -0
  214. package/src/lib/format/slots-checks.mjs +18 -0
  215. package/src/lib/format/slots-checks.mjs.map +1 -0
  216. package/src/lib/format/statusbar-checks.d.mts +8 -0
  217. package/src/lib/format/statusbar-checks.d.ts +8 -0
  218. package/src/lib/format/statusbar-checks.js +35 -0
  219. package/src/lib/format/statusbar-checks.js.map +1 -0
  220. package/src/lib/format/statusbar-checks.mjs +32 -0
  221. package/src/lib/format/statusbar-checks.mjs.map +1 -0
  222. package/src/lib/format/table-checks.d.mts +21 -0
  223. package/src/lib/format/table-checks.d.ts +21 -0
  224. package/src/lib/format/table-checks.js +86 -0
  225. package/src/lib/format/table-checks.js.map +1 -0
  226. package/src/lib/format/table-checks.mjs +82 -0
  227. package/src/lib/format/table-checks.mjs.map +1 -0
  228. package/src/lib/format/translate.js +2 -2
  229. package/src/lib/format/translate.js.map +1 -1
  230. package/src/lib/format/translate.mjs +2 -2
  231. package/src/lib/format/translate.mjs.map +1 -1
  232. package/src/lib/format/upgrade.d.mts +6 -3
  233. package/src/lib/format/upgrade.d.ts +6 -3
  234. package/src/lib/format/upgrade.js +6 -3
  235. package/src/lib/format/upgrade.js.map +1 -1
  236. package/src/lib/format/upgrade.mjs +6 -3
  237. package/src/lib/format/upgrade.mjs.map +1 -1
  238. package/src/lib/format/validate.d.mts +18 -2
  239. package/src/lib/format/validate.d.ts +18 -2
  240. package/src/lib/format/validate.js +36 -3
  241. package/src/lib/format/validate.js.map +1 -1
  242. package/src/lib/format/validate.mjs +35 -3
  243. package/src/lib/format/validate.mjs.map +1 -1
  244. package/src/lib/format/version.d.mts +2 -2
  245. package/src/lib/format/version.d.ts +2 -2
  246. package/src/lib/format/version.js +2 -2
  247. package/src/lib/format/version.js.map +1 -1
  248. package/src/lib/format/version.mjs +2 -2
  249. package/src/lib/format/version.mjs.map +1 -1
  250. package/src/lib/format/words.d.mts +6 -2
  251. package/src/lib/format/words.d.ts +6 -2
  252. package/src/lib/format/words.js +13 -7
  253. package/src/lib/format/words.js.map +1 -1
  254. package/src/lib/format/words.mjs +13 -7
  255. package/src/lib/format/words.mjs.map +1 -1
  256. package/src/lib/parts.d.mts +45 -0
  257. package/src/lib/parts.d.ts +45 -0
  258. package/src/lib/parts.js +60 -0
  259. package/src/lib/parts.js.map +1 -0
  260. package/src/lib/parts.mjs +53 -0
  261. package/src/lib/parts.mjs.map +1 -0
  262. package/src/lib/record/cells.d.mts +3 -3
  263. package/src/lib/record/cells.d.ts +3 -3
  264. package/src/lib/record/cells.js +16 -15
  265. package/src/lib/record/cells.js.map +1 -1
  266. package/src/lib/record/cells.mjs +16 -15
  267. package/src/lib/record/cells.mjs.map +1 -1
  268. package/src/lib/record/compute.d.mts +16 -5
  269. package/src/lib/record/compute.d.ts +16 -5
  270. package/src/lib/record/compute.js +57 -16
  271. package/src/lib/record/compute.js.map +1 -1
  272. package/src/lib/record/compute.mjs +57 -16
  273. package/src/lib/record/compute.mjs.map +1 -1
  274. package/src/lib/record/data-source.d.mts +140 -3
  275. package/src/lib/record/data-source.d.ts +140 -3
  276. package/src/lib/record/data-source.js.map +1 -1
  277. package/src/lib/record/data-source.mjs.map +1 -1
  278. package/src/lib/record/drafts.d.mts +19 -0
  279. package/src/lib/record/drafts.d.ts +19 -0
  280. package/src/lib/record/drafts.js +35 -0
  281. package/src/lib/record/drafts.js.map +1 -0
  282. package/src/lib/record/drafts.mjs +31 -0
  283. package/src/lib/record/drafts.mjs.map +1 -0
  284. package/src/lib/record/env.d.mts +5 -1
  285. package/src/lib/record/env.d.ts +5 -1
  286. package/src/lib/record/env.js +9 -1
  287. package/src/lib/record/env.js.map +1 -1
  288. package/src/lib/record/env.mjs +8 -1
  289. package/src/lib/record/env.mjs.map +1 -1
  290. package/src/lib/record/form-limits.d.mts +81 -0
  291. package/src/lib/record/form-limits.d.ts +81 -0
  292. package/src/lib/record/form-limits.js +231 -0
  293. package/src/lib/record/form-limits.js.map +1 -0
  294. package/src/lib/record/form-limits.mjs +224 -0
  295. package/src/lib/record/form-limits.mjs.map +1 -0
  296. package/src/lib/record/form.d.mts +173 -4
  297. package/src/lib/record/form.d.ts +173 -4
  298. package/src/lib/record/form.js +792 -88
  299. package/src/lib/record/form.js.map +1 -1
  300. package/src/lib/record/form.mjs +792 -88
  301. package/src/lib/record/form.mjs.map +1 -1
  302. package/src/lib/record/limits-part.d.mts +6 -0
  303. package/src/lib/record/limits-part.d.ts +6 -0
  304. package/src/lib/record/limits-part.js +12 -0
  305. package/src/lib/record/limits-part.js.map +1 -0
  306. package/src/lib/record/limits-part.mjs +7 -0
  307. package/src/lib/record/limits-part.mjs.map +1 -0
  308. package/src/lib/record/line-choices.d.mts +30 -0
  309. package/src/lib/record/line-choices.d.ts +30 -0
  310. package/src/lib/record/line-choices.js +42 -0
  311. package/src/lib/record/line-choices.js.map +1 -0
  312. package/src/lib/record/line-choices.mjs +36 -0
  313. package/src/lib/record/line-choices.mjs.map +1 -0
  314. package/src/lib/record/locales/ar.js +10 -0
  315. package/src/lib/record/locales/ar.js.map +1 -1
  316. package/src/lib/record/locales/ar.mjs +10 -0
  317. package/src/lib/record/locales/ar.mjs.map +1 -1
  318. package/src/lib/record/locales/de.js +10 -0
  319. package/src/lib/record/locales/de.js.map +1 -1
  320. package/src/lib/record/locales/de.mjs +10 -0
  321. package/src/lib/record/locales/de.mjs.map +1 -1
  322. package/src/lib/record/locales/fr.js +10 -0
  323. package/src/lib/record/locales/fr.js.map +1 -1
  324. package/src/lib/record/locales/fr.mjs +10 -0
  325. package/src/lib/record/locales/fr.mjs.map +1 -1
  326. package/src/lib/record/memory-data-source.d.mts +44 -3
  327. package/src/lib/record/memory-data-source.d.ts +44 -3
  328. package/src/lib/record/memory-data-source.js +102 -40
  329. package/src/lib/record/memory-data-source.js.map +1 -1
  330. package/src/lib/record/memory-data-source.mjs +101 -40
  331. package/src/lib/record/memory-data-source.mjs.map +1 -1
  332. package/src/lib/record/memory-kept.d.mts +20 -0
  333. package/src/lib/record/memory-kept.d.ts +20 -0
  334. package/src/lib/record/memory-kept.js +46 -0
  335. package/src/lib/record/memory-kept.js.map +1 -0
  336. package/src/lib/record/memory-kept.mjs +43 -0
  337. package/src/lib/record/memory-kept.mjs.map +1 -0
  338. package/src/lib/record/memory-later.d.mts +19 -0
  339. package/src/lib/record/memory-later.d.ts +19 -0
  340. package/src/lib/record/memory-later.js +39 -0
  341. package/src/lib/record/memory-later.js.map +1 -0
  342. package/src/lib/record/memory-later.mjs +35 -0
  343. package/src/lib/record/memory-later.mjs.map +1 -0
  344. package/src/lib/record/memory-part.d.mts +7 -0
  345. package/src/lib/record/memory-part.d.ts +7 -0
  346. package/src/lib/record/memory-part.js +13 -0
  347. package/src/lib/record/memory-part.js.map +1 -0
  348. package/src/lib/record/memory-part.mjs +8 -0
  349. package/src/lib/record/memory-part.mjs.map +1 -0
  350. package/src/lib/record/messages.d.mts +17 -0
  351. package/src/lib/record/messages.d.ts +17 -0
  352. package/src/lib/record/messages.js +10 -0
  353. package/src/lib/record/messages.js.map +1 -1
  354. package/src/lib/record/messages.mjs +10 -0
  355. package/src/lib/record/messages.mjs.map +1 -1
  356. package/src/lib/record/option-rules.d.mts +50 -0
  357. package/src/lib/record/option-rules.d.ts +50 -0
  358. package/src/lib/record/option-rules.js +137 -0
  359. package/src/lib/record/option-rules.js.map +1 -0
  360. package/src/lib/record/option-rules.mjs +134 -0
  361. package/src/lib/record/option-rules.mjs.map +1 -0
  362. package/src/lib/record/rules.d.mts +2 -2
  363. package/src/lib/record/rules.d.ts +2 -2
  364. package/src/lib/record/rules.js +3 -3
  365. package/src/lib/record/rules.js.map +1 -1
  366. package/src/lib/record/rules.mjs +3 -3
  367. package/src/lib/record/rules.mjs.map +1 -1
  368. package/src/lib/record/run.js +9 -7
  369. package/src/lib/record/run.js.map +1 -1
  370. package/src/lib/record/run.mjs +9 -7
  371. package/src/lib/record/run.mjs.map +1 -1
  372. package/src/lib/record/search.d.mts +12 -2
  373. package/src/lib/record/search.d.ts +12 -2
  374. package/src/lib/record/search.js +29 -4
  375. package/src/lib/record/search.js.map +1 -1
  376. package/src/lib/record/search.mjs +29 -4
  377. package/src/lib/record/search.mjs.map +1 -1
  378. package/src/lib/record/set-when.d.mts +3 -3
  379. package/src/lib/record/set-when.d.ts +3 -3
  380. package/src/lib/record/set-when.js +9 -9
  381. package/src/lib/record/set-when.js.map +1 -1
  382. package/src/lib/record/set-when.mjs +9 -9
  383. package/src/lib/record/set-when.mjs.map +1 -1
  384. package/src/lib/record/signed.d.mts +21 -0
  385. package/src/lib/record/signed.d.ts +21 -0
  386. package/src/lib/record/signed.js +62 -0
  387. package/src/lib/record/signed.js.map +1 -0
  388. package/src/lib/record/signed.mjs +57 -0
  389. package/src/lib/record/signed.mjs.map +1 -0
  390. package/src/lib/record/taking.d.mts +60 -0
  391. package/src/lib/record/taking.d.ts +60 -0
  392. package/src/lib/record/taking.js +58 -0
  393. package/src/lib/record/taking.js.map +1 -0
  394. package/src/lib/record/taking.mjs +50 -0
  395. package/src/lib/record/taking.mjs.map +1 -0
  396. package/src/lib/record/value-map.js +11 -4
  397. package/src/lib/record/value-map.js.map +1 -1
  398. package/src/lib/record/value-map.mjs +11 -4
  399. package/src/lib/record/value-map.mjs.map +1 -1
  400. package/src/lib/record/values.d.mts +20 -0
  401. package/src/lib/record/values.d.ts +20 -0
  402. package/src/lib/record/values.js.map +1 -1
  403. package/src/lib/record/values.mjs.map +1 -1
  404. package/src/lib/record/waits.d.mts +6 -1
  405. package/src/lib/record/waits.d.ts +6 -1
  406. package/src/lib/record/waits.js +2 -2
  407. package/src/lib/record/waits.js.map +1 -1
  408. package/src/lib/record/waits.mjs +2 -2
  409. package/src/lib/record/waits.mjs.map +1 -1
  410. package/src/runtime.d.mts +16 -5
  411. package/src/runtime.d.ts +16 -5
  412. package/src/runtime.js +41 -3
  413. package/src/runtime.js.map +1 -1
  414. package/src/runtime.mjs +13 -0
  415. package/src/runtime.mjs.map +1 -1
@@ -0,0 +1,31 @@
1
+ import type { Field, LineField } from '../format/field';
2
+ import { type FunctionsKnown, type ValueKind } from './app-functions';
3
+ import type { ASTNode } from './parser';
4
+ /** The kind a field's value is, as expressions read it. */
5
+ export declare function fieldKind(def: Field | LineField | undefined): ValueKind;
6
+ /** A value handed to a function of a kind it does not take. */
7
+ export interface KindProblem {
8
+ /** The function. */
9
+ name: string;
10
+ /** Which of its values, from 0. */
11
+ at: number;
12
+ /** The kinds it takes there. */
13
+ wants: readonly ValueKind[];
14
+ /** The kind it was given. */
15
+ got: ValueKind;
16
+ /** What was given, as written. */
17
+ given: ASTNode;
18
+ }
19
+ /** Where an expression's names are found: its fields, and on a line the record it is on (`parent`). */
20
+ export interface KindScope {
21
+ fields: Readonly<Record<string, Field | LineField>>;
22
+ parent?: Readonly<Record<string, Field | LineField>>;
23
+ }
24
+ /** Every value in the expression handed to a function of a kind it does not take, the outer call first. */
25
+ export declare function kindProblems(ast: ASTNode, scope: KindScope, functions?: FunctionsKnown): KindProblem[];
26
+ /** A kind in English words, as a page's checks say them: "a number", "a date or text". */
27
+ export declare const kindWords: (kinds: readonly ValueKind[]) => string;
28
+ /** A part of an expression as it is written, shortly: a field by its name, words in quotes, a call by its function. */
29
+ export declare function writtenAs(node: ASTNode): string;
30
+ /** A problem in a page's check's words: `age takes a date as its first value; "notes" is text`. */
31
+ export declare function kindProblemWords(problem: KindProblem): string;
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.kindWords = void 0;
4
+ exports.fieldKind = fieldKind;
5
+ exports.kindProblems = kindProblems;
6
+ exports.writtenAs = writtenAs;
7
+ exports.kindProblemWords = kindProblemWords;
8
+ const app_functions_1 = require("./app-functions");
9
+ const any = { values: ['any'], gives: 'any' };
10
+ const n = (...values) => values;
11
+ /** Fieldia's own functions, by kind. */
12
+ const FUNCTION_KINDS = {
13
+ round: { values: n('number', 'number'), gives: 'number' },
14
+ abs: { values: n('number'), gives: 'number' },
15
+ min: any,
16
+ max: any,
17
+ len: { values: n(['text', 'list']), gives: 'number' },
18
+ today: { values: [], gives: 'date' },
19
+ sum: { values: n('list', 'text', 'text'), gives: 'number' },
20
+ count: { values: n('list', 'text'), gives: 'number' },
21
+ days: { values: n('date', 'date'), gives: 'number' },
22
+ if: any,
23
+ age: { values: n('date', 'date'), gives: 'number' },
24
+ years: { values: n('date', 'date'), gives: 'number' },
25
+ months: { values: n('date', 'date'), gives: 'number' },
26
+ addDays: { values: n('date', 'number'), gives: 'date' },
27
+ addMonths: { values: n('date', 'number'), gives: 'date' },
28
+ addYears: { values: n('date', 'number'), gives: 'date' },
29
+ contains: { values: n(['text', 'list'], 'any'), gives: 'boolean' },
30
+ startsWith: { values: n('text', ['text', 'number']), gives: 'boolean' },
31
+ endsWith: { values: n('text', ['text', 'number']), gives: 'boolean' },
32
+ upper: { values: n('text'), gives: 'text' },
33
+ lower: { values: n('text'), gives: 'text' },
34
+ join: { values: n('text', 'any'), gives: 'text' },
35
+ average: { values: n('any'), gives: 'number' },
36
+ roundMoney: { values: n('number', 'text'), gives: 'number' },
37
+ empty: { values: n('any'), gives: 'boolean' },
38
+ firstOf: any,
39
+ };
40
+ /** The kind a field's value is, as expressions read it. */
41
+ function fieldKind(def) {
42
+ switch (def?.type) {
43
+ case 'char':
44
+ case 'text':
45
+ case 'html':
46
+ return 'text';
47
+ case 'integer':
48
+ case 'float':
49
+ case 'monetary':
50
+ return 'number';
51
+ case 'boolean':
52
+ return 'boolean';
53
+ case 'date':
54
+ case 'datetime':
55
+ return 'date';
56
+ case 'many2many':
57
+ case 'one2many':
58
+ return 'list';
59
+ case 'selection':
60
+ if (def.multiple)
61
+ return 'list';
62
+ return def.options.length && def.options.every((o) => typeof o.value === 'string') ? 'text' : 'any';
63
+ default:
64
+ return 'any';
65
+ }
66
+ }
67
+ /** Whether a value of kind `got` may go where `wants` are taken: a date is text too. */
68
+ const takes = (wants, got) => got === 'any' || wants.includes('any') || wants.includes(got) || (got === 'date' && wants.includes('text'));
69
+ /** Every value in the expression handed to a function of a kind it does not take, the outer call first. */
70
+ function kindProblems(ast, scope, functions) {
71
+ const problems = [];
72
+ const kindsOf = (name) => {
73
+ if (FUNCTION_KINDS[name])
74
+ return FUNCTION_KINDS[name];
75
+ const entry = functions?.[name];
76
+ if (!entry)
77
+ return undefined;
78
+ const info = (0, app_functions_1.functionInfo)(entry);
79
+ return { values: info.values ?? ['any'], gives: info.gives ?? 'any' };
80
+ };
81
+ const kind = (node) => {
82
+ switch (node.type) {
83
+ case 'Literal':
84
+ if (typeof node.value === 'number')
85
+ return 'number';
86
+ if (typeof node.value === 'boolean')
87
+ return 'boolean';
88
+ if (Array.isArray(node.value))
89
+ return 'list';
90
+ if (typeof node.value === 'string')
91
+ return /^\d{4}-\d{2}-\d{2}/.test(node.value) ? 'date' : 'text';
92
+ return 'any';
93
+ case 'Identifier': {
94
+ const [root, part, ...more] = node.name.split('.');
95
+ if (part === undefined)
96
+ return fieldKind(scope.fields[root]);
97
+ if (root === 'parent' && !more.length && scope.parent)
98
+ return fieldKind(scope.parent[part]);
99
+ return 'any';
100
+ }
101
+ case 'UnaryOp':
102
+ kind(node.operand);
103
+ return node.operator === 'not' ? 'boolean' : 'number';
104
+ case 'BinaryOp': {
105
+ const left = kind(node.left);
106
+ const right = kind(node.right);
107
+ if (node.operator === 'and' || node.operator === 'or')
108
+ return left === right ? left : 'any';
109
+ if (node.operator === '+')
110
+ return left === 'text' || right === 'text' ? 'text' : left === 'number' && right === 'number' ? 'number' : 'any';
111
+ return ['-', '*', '/', '%'].includes(node.operator) ? 'number' : 'boolean';
112
+ }
113
+ case 'Call': {
114
+ const kinds = kindsOf(node.name);
115
+ node.args.forEach((arg, at) => {
116
+ const got = kind(arg);
117
+ if (!kinds || !kinds.values.length)
118
+ return;
119
+ const wanted = kinds.values[Math.min(at, kinds.values.length - 1)];
120
+ const wants = typeof wanted === 'string' ? [wanted] : wanted;
121
+ // What a sum, a count or an average of lines is given is read by their own checks.
122
+ if (node.name === 'sum' || node.name === 'count' || node.name === 'average')
123
+ return;
124
+ if (!takes(wants, got))
125
+ problems.push({ name: node.name, at, wants, got, given: arg });
126
+ });
127
+ return kinds?.gives ?? 'any';
128
+ }
129
+ default:
130
+ return 'any';
131
+ }
132
+ };
133
+ kind(ast);
134
+ return problems;
135
+ }
136
+ const KIND_WORDS = { number: 'a number', text: 'text', date: 'a date', boolean: 'yes or no', list: 'a list', any: 'any value' };
137
+ const PLACES = ['first', 'second', 'third', 'fourth', 'fifth'];
138
+ /** A kind in English words, as a page's checks say them: "a number", "a date or text". */
139
+ const kindWords = (kinds) => kinds.map((k) => KIND_WORDS[k]).join(' or ');
140
+ exports.kindWords = kindWords;
141
+ /** A part of an expression as it is written, shortly: a field by its name, words in quotes, a call by its function. */
142
+ function writtenAs(node) {
143
+ switch (node.type) {
144
+ case 'Identifier':
145
+ return `"${node.name}"`;
146
+ case 'Literal':
147
+ return typeof node.value === 'string' ? `'${node.value}'` : JSON.stringify(node.value);
148
+ case 'Call':
149
+ return `${node.name}(…)`;
150
+ default:
151
+ return 'what it is given';
152
+ }
153
+ }
154
+ /** A problem in a page's check's words: `age takes a date as its first value; "notes" is text`. */
155
+ function kindProblemWords(problem) {
156
+ const place = problem.at < PLACES.length ? `as its ${PLACES[problem.at]} value` : `as value ${problem.at + 1}`;
157
+ return `${problem.name} takes ${(0, exports.kindWords)(problem.wants)} ${place}; ${writtenAs(problem.given)} is ${KIND_WORDS[problem.got]}`;
158
+ }
159
+ //# sourceMappingURL=kinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinds.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/kinds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ import { functionInfo } from './app-functions.mjs';
2
+ const any = { values: ['any'], gives: 'any' };
3
+ const n = (...values) => values;
4
+ /** Fieldia's own functions, by kind. */
5
+ const FUNCTION_KINDS = {
6
+ round: { values: n('number', 'number'), gives: 'number' },
7
+ abs: { values: n('number'), gives: 'number' },
8
+ min: any,
9
+ max: any,
10
+ len: { values: n(['text', 'list']), gives: 'number' },
11
+ today: { values: [], gives: 'date' },
12
+ sum: { values: n('list', 'text', 'text'), gives: 'number' },
13
+ count: { values: n('list', 'text'), gives: 'number' },
14
+ days: { values: n('date', 'date'), gives: 'number' },
15
+ if: any,
16
+ age: { values: n('date', 'date'), gives: 'number' },
17
+ years: { values: n('date', 'date'), gives: 'number' },
18
+ months: { values: n('date', 'date'), gives: 'number' },
19
+ addDays: { values: n('date', 'number'), gives: 'date' },
20
+ addMonths: { values: n('date', 'number'), gives: 'date' },
21
+ addYears: { values: n('date', 'number'), gives: 'date' },
22
+ contains: { values: n(['text', 'list'], 'any'), gives: 'boolean' },
23
+ startsWith: { values: n('text', ['text', 'number']), gives: 'boolean' },
24
+ endsWith: { values: n('text', ['text', 'number']), gives: 'boolean' },
25
+ upper: { values: n('text'), gives: 'text' },
26
+ lower: { values: n('text'), gives: 'text' },
27
+ join: { values: n('text', 'any'), gives: 'text' },
28
+ average: { values: n('any'), gives: 'number' },
29
+ roundMoney: { values: n('number', 'text'), gives: 'number' },
30
+ empty: { values: n('any'), gives: 'boolean' },
31
+ firstOf: any,
32
+ };
33
+ /** The kind a field's value is, as expressions read it. */
34
+ export function fieldKind(def) {
35
+ switch (def?.type) {
36
+ case 'char':
37
+ case 'text':
38
+ case 'html':
39
+ return 'text';
40
+ case 'integer':
41
+ case 'float':
42
+ case 'monetary':
43
+ return 'number';
44
+ case 'boolean':
45
+ return 'boolean';
46
+ case 'date':
47
+ case 'datetime':
48
+ return 'date';
49
+ case 'many2many':
50
+ case 'one2many':
51
+ return 'list';
52
+ case 'selection':
53
+ if (def.multiple)
54
+ return 'list';
55
+ return def.options.length && def.options.every((o) => typeof o.value === 'string') ? 'text' : 'any';
56
+ default:
57
+ return 'any';
58
+ }
59
+ }
60
+ /** Whether a value of kind `got` may go where `wants` are taken: a date is text too. */
61
+ const takes = (wants, got) => got === 'any' || wants.includes('any') || wants.includes(got) || (got === 'date' && wants.includes('text'));
62
+ /** Every value in the expression handed to a function of a kind it does not take, the outer call first. */
63
+ export function kindProblems(ast, scope, functions) {
64
+ const problems = [];
65
+ const kindsOf = (name) => {
66
+ if (FUNCTION_KINDS[name])
67
+ return FUNCTION_KINDS[name];
68
+ const entry = functions?.[name];
69
+ if (!entry)
70
+ return undefined;
71
+ const info = functionInfo(entry);
72
+ return { values: info.values ?? ['any'], gives: info.gives ?? 'any' };
73
+ };
74
+ const kind = (node) => {
75
+ switch (node.type) {
76
+ case 'Literal':
77
+ if (typeof node.value === 'number')
78
+ return 'number';
79
+ if (typeof node.value === 'boolean')
80
+ return 'boolean';
81
+ if (Array.isArray(node.value))
82
+ return 'list';
83
+ if (typeof node.value === 'string')
84
+ return /^\d{4}-\d{2}-\d{2}/.test(node.value) ? 'date' : 'text';
85
+ return 'any';
86
+ case 'Identifier': {
87
+ const [root, part, ...more] = node.name.split('.');
88
+ if (part === undefined)
89
+ return fieldKind(scope.fields[root]);
90
+ if (root === 'parent' && !more.length && scope.parent)
91
+ return fieldKind(scope.parent[part]);
92
+ return 'any';
93
+ }
94
+ case 'UnaryOp':
95
+ kind(node.operand);
96
+ return node.operator === 'not' ? 'boolean' : 'number';
97
+ case 'BinaryOp': {
98
+ const left = kind(node.left);
99
+ const right = kind(node.right);
100
+ if (node.operator === 'and' || node.operator === 'or')
101
+ return left === right ? left : 'any';
102
+ if (node.operator === '+')
103
+ return left === 'text' || right === 'text' ? 'text' : left === 'number' && right === 'number' ? 'number' : 'any';
104
+ return ['-', '*', '/', '%'].includes(node.operator) ? 'number' : 'boolean';
105
+ }
106
+ case 'Call': {
107
+ const kinds = kindsOf(node.name);
108
+ node.args.forEach((arg, at) => {
109
+ const got = kind(arg);
110
+ if (!kinds || !kinds.values.length)
111
+ return;
112
+ const wanted = kinds.values[Math.min(at, kinds.values.length - 1)];
113
+ const wants = typeof wanted === 'string' ? [wanted] : wanted;
114
+ // What a sum, a count or an average of lines is given is read by their own checks.
115
+ if (node.name === 'sum' || node.name === 'count' || node.name === 'average')
116
+ return;
117
+ if (!takes(wants, got))
118
+ problems.push({ name: node.name, at, wants, got, given: arg });
119
+ });
120
+ return kinds?.gives ?? 'any';
121
+ }
122
+ default:
123
+ return 'any';
124
+ }
125
+ };
126
+ kind(ast);
127
+ return problems;
128
+ }
129
+ const KIND_WORDS = { number: 'a number', text: 'text', date: 'a date', boolean: 'yes or no', list: 'a list', any: 'any value' };
130
+ const PLACES = ['first', 'second', 'third', 'fourth', 'fifth'];
131
+ /** A kind in English words, as a page's checks say them: "a number", "a date or text". */
132
+ export const kindWords = (kinds) => kinds.map((k) => KIND_WORDS[k]).join(' or ');
133
+ /** A part of an expression as it is written, shortly: a field by its name, words in quotes, a call by its function. */
134
+ export function writtenAs(node) {
135
+ switch (node.type) {
136
+ case 'Identifier':
137
+ return `"${node.name}"`;
138
+ case 'Literal':
139
+ return typeof node.value === 'string' ? `'${node.value}'` : JSON.stringify(node.value);
140
+ case 'Call':
141
+ return `${node.name}(…)`;
142
+ default:
143
+ return 'what it is given';
144
+ }
145
+ }
146
+ /** A problem in a page's check's words: `age takes a date as its first value; "notes" is text`. */
147
+ export function kindProblemWords(problem) {
148
+ const place = problem.at < PLACES.length ? `as its ${PLACES[problem.at]} value` : `as value ${problem.at + 1}`;
149
+ return `${problem.name} takes ${kindWords(problem.wants)} ${place}; ${writtenAs(problem.given)} is ${KIND_WORDS[problem.got]}`;
150
+ }
151
+ //# sourceMappingURL=kinds.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinds.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/kinds.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Modifier } from '../format/layout.mjs';
2
- import type { ExpressionEnv } from './functions.mjs';
2
+ import type { ExpressionEnv, FunctionTable } from './functions.mjs';
3
3
  /** A modifier read once, ready to evaluate against a record's values. */
4
4
  export interface CompiledModifier {
5
5
  readonly source: Modifier | undefined;
@@ -18,6 +18,7 @@ export interface CompiledModifier {
18
18
  /**
19
19
  * Read a modifier. `true`, `false` and a missing modifier become constants;
20
20
  * an expression is parsed now, so a mistake surfaces here and not on the
21
- * first keystroke. Throws when the expression cannot be read.
21
+ * first keystroke. Throws when the expression cannot be read. `functions`, the
22
+ * app's own, which it may call besides Fieldia's.
22
23
  */
23
- export declare function compileModifier(modifier: Modifier | undefined): CompiledModifier;
24
+ export declare function compileModifier(modifier: Modifier | undefined, functions?: FunctionTable): CompiledModifier;
@@ -1,5 +1,5 @@
1
1
  import type { Modifier } from '../format/layout';
2
- import type { ExpressionEnv } from './functions';
2
+ import type { ExpressionEnv, FunctionTable } from './functions';
3
3
  /** A modifier read once, ready to evaluate against a record's values. */
4
4
  export interface CompiledModifier {
5
5
  readonly source: Modifier | undefined;
@@ -18,6 +18,7 @@ export interface CompiledModifier {
18
18
  /**
19
19
  * Read a modifier. `true`, `false` and a missing modifier become constants;
20
20
  * an expression is parsed now, so a mistake surfaces here and not on the
21
- * first keystroke. Throws when the expression cannot be read.
21
+ * first keystroke. Throws when the expression cannot be read. `functions`, the
22
+ * app's own, which it may call besides Fieldia's.
22
23
  */
23
- export declare function compileModifier(modifier: Modifier | undefined): CompiledModifier;
24
+ export declare function compileModifier(modifier: Modifier | undefined, functions?: FunctionTable): CompiledModifier;
@@ -8,14 +8,15 @@ const tokenizer_1 = require("./tokenizer");
8
8
  /**
9
9
  * Read a modifier. `true`, `false` and a missing modifier become constants;
10
10
  * an expression is parsed now, so a mistake surfaces here and not on the
11
- * first keystroke. Throws when the expression cannot be read.
11
+ * first keystroke. Throws when the expression cannot be read. `functions`, the
12
+ * app's own, which it may call besides Fieldia's.
12
13
  */
13
- function compileModifier(modifier) {
14
+ function compileModifier(modifier, functions) {
14
15
  if (typeof modifier !== 'string') {
15
16
  const value = modifier === true;
16
17
  return { source: modifier, fields: [], paths: [], wheres: [], evaluate: () => value };
17
18
  }
18
- const ast = new parser_1.ExpressionParser((0, tokenizer_1.tokenize)(modifier)).parse();
19
+ const ast = new parser_1.ExpressionParser((0, tokenizer_1.tokenize)(modifier), functions).parse();
19
20
  return {
20
21
  source: modifier,
21
22
  fields: (0, reads_1.fieldsRead)(ast),
@@ -1 +1 @@
1
- {"version":3,"file":"modifier.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/modifier.ts"],"names":[],"mappings":";;AAyBA,0CAmBC;AA3CD,2CAA+C;AAE/C,qCAA4C;AAC5C,mCAA4D;AAC5D,2CAAuC;AAevC;;;;GAIG;AACH,SAAgB,eAAe,CAAC,QAA8B;IAC5D,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACxF,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,yBAAgB,CAAC,IAAA,oBAAQ,EAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,IAAA,kBAAU,EAAC,GAAG,CAAC;QACvB,KAAK,EAAE,IAAA,iBAAS,EAAC,GAAG,CAAC;QACrB,MAAM,EAAE,IAAA,kBAAU,EAAC,GAAG,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,GAAG;YAClB,IAAI,CAAC;gBACH,OAAO,IAAA,kBAAM,EAAC,IAAA,oBAAQ,EAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"modifier.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/modifier.ts"],"names":[],"mappings":";;AA0BA,0CAmBC;AA5CD,2CAA+C;AAE/C,qCAA4C;AAC5C,mCAA4D;AAC5D,2CAAuC;AAevC;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,QAA8B,EAAE,SAAyB;IACvF,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACxF,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,yBAAgB,CAAC,IAAA,oBAAQ,EAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;IACxE,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,IAAA,kBAAU,EAAC,GAAG,CAAC;QACvB,KAAK,EAAE,IAAA,iBAAS,EAAC,GAAG,CAAC;QACrB,MAAM,EAAE,IAAA,kBAAU,EAAC,GAAG,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,GAAG;YAClB,IAAI,CAAC;gBACH,OAAO,IAAA,kBAAM,EAAC,IAAA,oBAAQ,EAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -5,14 +5,15 @@ import { tokenize } from './tokenizer.mjs';
5
5
  /**
6
6
  * Read a modifier. `true`, `false` and a missing modifier become constants;
7
7
  * an expression is parsed now, so a mistake surfaces here and not on the
8
- * first keystroke. Throws when the expression cannot be read.
8
+ * first keystroke. Throws when the expression cannot be read. `functions`, the
9
+ * app's own, which it may call besides Fieldia's.
9
10
  */
10
- export function compileModifier(modifier) {
11
+ export function compileModifier(modifier, functions) {
11
12
  if (typeof modifier !== 'string') {
12
13
  const value = modifier === true;
13
14
  return { source: modifier, fields: [], paths: [], wheres: [], evaluate: () => value };
14
15
  }
15
- const ast = new ExpressionParser(tokenize(modifier)).parse();
16
+ const ast = new ExpressionParser(tokenize(modifier), functions).parse();
16
17
  return {
17
18
  source: modifier,
18
19
  fields: fieldsRead(ast),
@@ -1 +1 @@
1
- {"version":3,"file":"modifier.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/modifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAevC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,QAA8B;IAC5D,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACxF,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC;QACvB,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC;QACrB,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,GAAG;YAClB,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"modifier.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/modifier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAevC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,QAA8B,EAAE,SAAyB;IACvF,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACxF,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;IACxE,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC;QACvB,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC;QACrB,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,GAAG;YAClB,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type ExpressionFunction } from './functions.mjs';
2
+ import { type AppFunction, type FunctionInfo } from './app-functions.mjs';
3
+ /** Empty as a person sees it: nothing, text of only spaces, an empty list or object. Zero and no are values. */
4
+ export declare function isBlank(value: unknown): boolean;
5
+ /** A function's body, by its name: what its stand-in in the main table calls once the part has come. */
6
+ export declare function functionBody(name: string): ExpressionFunction['call'];
7
+ /** One of the app's functions called: its call made once — said whether it asks its server, or found out — and kept. */
8
+ export declare function appCall(name: string, entry: FunctionInfo | AppFunction | ((...values: never[]) => unknown)): ExpressionFunction['call'];
@@ -0,0 +1,8 @@
1
+ import { type ExpressionFunction } from './functions';
2
+ import { type AppFunction, type FunctionInfo } from './app-functions';
3
+ /** Empty as a person sees it: nothing, text of only spaces, an empty list or object. Zero and no are values. */
4
+ export declare function isBlank(value: unknown): boolean;
5
+ /** A function's body, by its name: what its stand-in in the main table calls once the part has come. */
6
+ export declare function functionBody(name: string): ExpressionFunction['call'];
7
+ /** One of the app's functions called: its call made once — said whether it asks its server, or found out — and kept. */
8
+ export declare function appCall(name: string, entry: FunctionInfo | AppFunction | ((...values: never[]) => unknown)): ExpressionFunction['call'];