@fieldia/core 0.26.1 → 0.28.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 (435) hide show
  1. package/README.md +326 -3
  2. package/package.json +1 -1
  3. package/schema/page.schema.json +230 -24
  4. package/src/index.d.mts +10 -2
  5. package/src/index.d.ts +10 -2
  6. package/src/index.js +26 -1
  7. package/src/index.js.map +1 -1
  8. package/src/index.mjs +11 -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 +264 -190
  119. package/src/lib/format/layout.d.ts +264 -190
  120. package/src/lib/format/layout.js +34 -29
  121. package/src/lib/format/layout.js.map +1 -1
  122. package/src/lib/format/layout.mjs +14 -4
  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 +154 -71
  169. package/src/lib/format/page.d.ts +154 -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 +7 -3
  233. package/src/lib/format/upgrade.d.ts +7 -3
  234. package/src/lib/format/upgrade.js +7 -3
  235. package/src/lib/format/upgrade.js.map +1 -1
  236. package/src/lib/format/upgrade.mjs +7 -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/check.js +3 -1
  269. package/src/lib/record/check.js.map +1 -1
  270. package/src/lib/record/check.mjs +3 -1
  271. package/src/lib/record/check.mjs.map +1 -1
  272. package/src/lib/record/compute.d.mts +16 -5
  273. package/src/lib/record/compute.d.ts +16 -5
  274. package/src/lib/record/compute.js +57 -16
  275. package/src/lib/record/compute.js.map +1 -1
  276. package/src/lib/record/compute.mjs +57 -16
  277. package/src/lib/record/compute.mjs.map +1 -1
  278. package/src/lib/record/data-source.d.mts +140 -3
  279. package/src/lib/record/data-source.d.ts +140 -3
  280. package/src/lib/record/data-source.js.map +1 -1
  281. package/src/lib/record/data-source.mjs.map +1 -1
  282. package/src/lib/record/day-words.d.mts +10 -0
  283. package/src/lib/record/day-words.d.ts +10 -0
  284. package/src/lib/record/day-words.js +23 -0
  285. package/src/lib/record/day-words.js.map +1 -0
  286. package/src/lib/record/day-words.mjs +20 -0
  287. package/src/lib/record/day-words.mjs.map +1 -0
  288. package/src/lib/record/drafts.d.mts +19 -0
  289. package/src/lib/record/drafts.d.ts +19 -0
  290. package/src/lib/record/drafts.js +35 -0
  291. package/src/lib/record/drafts.js.map +1 -0
  292. package/src/lib/record/drafts.mjs +31 -0
  293. package/src/lib/record/drafts.mjs.map +1 -0
  294. package/src/lib/record/env.d.mts +5 -1
  295. package/src/lib/record/env.d.ts +5 -1
  296. package/src/lib/record/env.js +9 -1
  297. package/src/lib/record/env.js.map +1 -1
  298. package/src/lib/record/env.mjs +8 -1
  299. package/src/lib/record/env.mjs.map +1 -1
  300. package/src/lib/record/form-limits.d.mts +78 -0
  301. package/src/lib/record/form-limits.d.ts +78 -0
  302. package/src/lib/record/form-limits.js +230 -0
  303. package/src/lib/record/form-limits.js.map +1 -0
  304. package/src/lib/record/form-limits.mjs +223 -0
  305. package/src/lib/record/form-limits.mjs.map +1 -0
  306. package/src/lib/record/form.d.mts +180 -9
  307. package/src/lib/record/form.d.ts +180 -9
  308. package/src/lib/record/form.js +858 -90
  309. package/src/lib/record/form.js.map +1 -1
  310. package/src/lib/record/form.mjs +858 -90
  311. package/src/lib/record/form.mjs.map +1 -1
  312. package/src/lib/record/limits-part.d.mts +6 -0
  313. package/src/lib/record/limits-part.d.ts +6 -0
  314. package/src/lib/record/limits-part.js +12 -0
  315. package/src/lib/record/limits-part.js.map +1 -0
  316. package/src/lib/record/limits-part.mjs +7 -0
  317. package/src/lib/record/limits-part.mjs.map +1 -0
  318. package/src/lib/record/limits.js +4 -2
  319. package/src/lib/record/limits.js.map +1 -1
  320. package/src/lib/record/limits.mjs +4 -2
  321. package/src/lib/record/limits.mjs.map +1 -1
  322. package/src/lib/record/line-choices.d.mts +30 -0
  323. package/src/lib/record/line-choices.d.ts +30 -0
  324. package/src/lib/record/line-choices.js +42 -0
  325. package/src/lib/record/line-choices.js.map +1 -0
  326. package/src/lib/record/line-choices.mjs +36 -0
  327. package/src/lib/record/line-choices.mjs.map +1 -0
  328. package/src/lib/record/locales/ar.js +11 -0
  329. package/src/lib/record/locales/ar.js.map +1 -1
  330. package/src/lib/record/locales/ar.mjs +11 -0
  331. package/src/lib/record/locales/ar.mjs.map +1 -1
  332. package/src/lib/record/locales/de.js +11 -0
  333. package/src/lib/record/locales/de.js.map +1 -1
  334. package/src/lib/record/locales/de.mjs +11 -0
  335. package/src/lib/record/locales/de.mjs.map +1 -1
  336. package/src/lib/record/locales/fr.js +11 -0
  337. package/src/lib/record/locales/fr.js.map +1 -1
  338. package/src/lib/record/locales/fr.mjs +11 -0
  339. package/src/lib/record/locales/fr.mjs.map +1 -1
  340. package/src/lib/record/memory-data-source.d.mts +44 -3
  341. package/src/lib/record/memory-data-source.d.ts +44 -3
  342. package/src/lib/record/memory-data-source.js +102 -40
  343. package/src/lib/record/memory-data-source.js.map +1 -1
  344. package/src/lib/record/memory-data-source.mjs +101 -40
  345. package/src/lib/record/memory-data-source.mjs.map +1 -1
  346. package/src/lib/record/memory-kept.d.mts +20 -0
  347. package/src/lib/record/memory-kept.d.ts +20 -0
  348. package/src/lib/record/memory-kept.js +46 -0
  349. package/src/lib/record/memory-kept.js.map +1 -0
  350. package/src/lib/record/memory-kept.mjs +43 -0
  351. package/src/lib/record/memory-kept.mjs.map +1 -0
  352. package/src/lib/record/memory-later.d.mts +19 -0
  353. package/src/lib/record/memory-later.d.ts +19 -0
  354. package/src/lib/record/memory-later.js +39 -0
  355. package/src/lib/record/memory-later.js.map +1 -0
  356. package/src/lib/record/memory-later.mjs +35 -0
  357. package/src/lib/record/memory-later.mjs.map +1 -0
  358. package/src/lib/record/memory-part.d.mts +7 -0
  359. package/src/lib/record/memory-part.d.ts +7 -0
  360. package/src/lib/record/memory-part.js +13 -0
  361. package/src/lib/record/memory-part.js.map +1 -0
  362. package/src/lib/record/memory-part.mjs +8 -0
  363. package/src/lib/record/memory-part.mjs.map +1 -0
  364. package/src/lib/record/messages.d.mts +27 -2
  365. package/src/lib/record/messages.d.ts +27 -2
  366. package/src/lib/record/messages.js +13 -4
  367. package/src/lib/record/messages.js.map +1 -1
  368. package/src/lib/record/messages.mjs +13 -4
  369. package/src/lib/record/messages.mjs.map +1 -1
  370. package/src/lib/record/option-rules.d.mts +56 -0
  371. package/src/lib/record/option-rules.d.ts +56 -0
  372. package/src/lib/record/option-rules.js +143 -0
  373. package/src/lib/record/option-rules.js.map +1 -0
  374. package/src/lib/record/option-rules.mjs +140 -0
  375. package/src/lib/record/option-rules.mjs.map +1 -0
  376. package/src/lib/record/record-words.d.mts +13 -1
  377. package/src/lib/record/record-words.d.ts +13 -1
  378. package/src/lib/record/record-words.js +29 -1
  379. package/src/lib/record/record-words.js.map +1 -1
  380. package/src/lib/record/record-words.mjs +27 -1
  381. package/src/lib/record/record-words.mjs.map +1 -1
  382. package/src/lib/record/rules.d.mts +2 -2
  383. package/src/lib/record/rules.d.ts +2 -2
  384. package/src/lib/record/rules.js +3 -3
  385. package/src/lib/record/rules.js.map +1 -1
  386. package/src/lib/record/rules.mjs +3 -3
  387. package/src/lib/record/rules.mjs.map +1 -1
  388. package/src/lib/record/run.js +9 -7
  389. package/src/lib/record/run.js.map +1 -1
  390. package/src/lib/record/run.mjs +9 -7
  391. package/src/lib/record/run.mjs.map +1 -1
  392. package/src/lib/record/search.d.mts +12 -2
  393. package/src/lib/record/search.d.ts +12 -2
  394. package/src/lib/record/search.js +29 -4
  395. package/src/lib/record/search.js.map +1 -1
  396. package/src/lib/record/search.mjs +29 -4
  397. package/src/lib/record/search.mjs.map +1 -1
  398. package/src/lib/record/set-when.d.mts +3 -3
  399. package/src/lib/record/set-when.d.ts +3 -3
  400. package/src/lib/record/set-when.js +9 -9
  401. package/src/lib/record/set-when.js.map +1 -1
  402. package/src/lib/record/set-when.mjs +9 -9
  403. package/src/lib/record/set-when.mjs.map +1 -1
  404. package/src/lib/record/signed.d.mts +21 -0
  405. package/src/lib/record/signed.d.ts +21 -0
  406. package/src/lib/record/signed.js +62 -0
  407. package/src/lib/record/signed.js.map +1 -0
  408. package/src/lib/record/signed.mjs +57 -0
  409. package/src/lib/record/signed.mjs.map +1 -0
  410. package/src/lib/record/taking.d.mts +60 -0
  411. package/src/lib/record/taking.d.ts +60 -0
  412. package/src/lib/record/taking.js +58 -0
  413. package/src/lib/record/taking.js.map +1 -0
  414. package/src/lib/record/taking.mjs +50 -0
  415. package/src/lib/record/taking.mjs.map +1 -0
  416. package/src/lib/record/value-map.js +11 -4
  417. package/src/lib/record/value-map.js.map +1 -1
  418. package/src/lib/record/value-map.mjs +11 -4
  419. package/src/lib/record/value-map.mjs.map +1 -1
  420. package/src/lib/record/values.d.mts +20 -0
  421. package/src/lib/record/values.d.ts +20 -0
  422. package/src/lib/record/values.js.map +1 -1
  423. package/src/lib/record/values.mjs.map +1 -1
  424. package/src/lib/record/waits.d.mts +13 -6
  425. package/src/lib/record/waits.d.ts +13 -6
  426. package/src/lib/record/waits.js +9 -12
  427. package/src/lib/record/waits.js.map +1 -1
  428. package/src/lib/record/waits.mjs +9 -12
  429. package/src/lib/record/waits.mjs.map +1 -1
  430. package/src/runtime.d.mts +17 -6
  431. package/src/runtime.d.ts +17 -6
  432. package/src/runtime.js +45 -3
  433. package/src/runtime.js.map +1 -1
  434. package/src/runtime.mjs +17 -1
  435. package/src/runtime.mjs.map +1 -1
@@ -0,0 +1,31 @@
1
+ import type { Field, LineField } from '../format/field.mjs';
2
+ import { type FunctionsKnown, type ValueKind } from './app-functions.mjs';
3
+ import type { ASTNode } from './parser.mjs';
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,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'];