@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.
- package/README.md +307 -3
- package/package.json +1 -1
- package/schema/page.schema.json +227 -23
- package/src/index.d.mts +8 -2
- package/src/index.d.ts +8 -2
- package/src/index.js +22 -1
- package/src/index.js.map +1 -1
- package/src/index.mjs +9 -2
- package/src/index.mjs.map +1 -1
- package/src/lib/expression/app-functions.d.mts +47 -0
- package/src/lib/expression/app-functions.d.ts +47 -0
- package/src/lib/expression/app-functions.js +64 -0
- package/src/lib/expression/app-functions.js.map +1 -0
- package/src/lib/expression/app-functions.mjs +58 -0
- package/src/lib/expression/app-functions.mjs.map +1 -0
- package/src/lib/expression/dates.d.mts +21 -0
- package/src/lib/expression/dates.d.ts +21 -0
- package/src/lib/expression/dates.js +73 -0
- package/src/lib/expression/dates.js.map +1 -0
- package/src/lib/expression/dates.mjs +67 -0
- package/src/lib/expression/dates.mjs.map +1 -0
- package/src/lib/expression/evaluator.js +12 -6
- package/src/lib/expression/evaluator.js.map +1 -1
- package/src/lib/expression/evaluator.mjs +12 -6
- package/src/lib/expression/evaluator.mjs.map +1 -1
- package/src/lib/expression/expression.d.mts +7 -3
- package/src/lib/expression/expression.d.ts +7 -3
- package/src/lib/expression/expression.js +8 -2
- package/src/lib/expression/expression.js.map +1 -1
- package/src/lib/expression/expression.mjs +7 -2
- package/src/lib/expression/expression.mjs.map +1 -1
- package/src/lib/expression/functions-part.d.mts +7 -0
- package/src/lib/expression/functions-part.d.ts +7 -0
- package/src/lib/expression/functions-part.js +13 -0
- package/src/lib/expression/functions-part.js.map +1 -0
- package/src/lib/expression/functions-part.mjs +8 -0
- package/src/lib/expression/functions-part.mjs.map +1 -0
- package/src/lib/expression/functions.d.mts +60 -3
- package/src/lib/expression/functions.d.ts +60 -3
- package/src/lib/expression/functions.js +109 -15
- package/src/lib/expression/functions.js.map +1 -1
- package/src/lib/expression/functions.mjs +103 -16
- package/src/lib/expression/functions.mjs.map +1 -1
- package/src/lib/expression/kinds.d.mts +31 -0
- package/src/lib/expression/kinds.d.ts +31 -0
- package/src/lib/expression/kinds.js +159 -0
- package/src/lib/expression/kinds.js.map +1 -0
- package/src/lib/expression/kinds.mjs +151 -0
- package/src/lib/expression/kinds.mjs.map +1 -0
- package/src/lib/expression/modifier.d.mts +4 -3
- package/src/lib/expression/modifier.d.ts +4 -3
- package/src/lib/expression/modifier.js +4 -3
- package/src/lib/expression/modifier.js.map +1 -1
- package/src/lib/expression/modifier.mjs +4 -3
- package/src/lib/expression/modifier.mjs.map +1 -1
- package/src/lib/expression/more-functions.d.mts +8 -0
- package/src/lib/expression/more-functions.d.ts +8 -0
- package/src/lib/expression/more-functions.js +235 -0
- package/src/lib/expression/more-functions.js.map +1 -0
- package/src/lib/expression/more-functions.mjs +230 -0
- package/src/lib/expression/more-functions.mjs.map +1 -0
- package/src/lib/expression/parser.d.mts +4 -1
- package/src/lib/expression/parser.d.ts +4 -1
- package/src/lib/expression/parser.js +6 -3
- package/src/lib/expression/parser.js.map +1 -1
- package/src/lib/expression/parser.mjs +6 -3
- package/src/lib/expression/parser.mjs.map +1 -1
- package/src/lib/expression/reads.d.mts +2 -2
- package/src/lib/expression/reads.d.ts +2 -2
- package/src/lib/expression/reads.js +6 -4
- package/src/lib/expression/reads.js.map +1 -1
- package/src/lib/expression/reads.mjs +6 -4
- package/src/lib/expression/reads.mjs.map +1 -1
- package/src/lib/format/actions.d.mts +16 -16
- package/src/lib/format/actions.d.ts +16 -16
- package/src/lib/format/check-page.d.mts +7 -2
- package/src/lib/format/check-page.d.ts +7 -2
- package/src/lib/format/check-page.js +10 -4
- package/src/lib/format/check-page.js.map +1 -1
- package/src/lib/format/check-page.mjs +10 -4
- package/src/lib/format/check-page.mjs.map +1 -1
- package/src/lib/format/choice-options.d.mts +34 -0
- package/src/lib/format/choice-options.d.ts +34 -0
- package/src/lib/format/choice-options.js +60 -0
- package/src/lib/format/choice-options.js.map +1 -0
- package/src/lib/format/choice-options.mjs +51 -0
- package/src/lib/format/choice-options.mjs.map +1 -0
- package/src/lib/format/endings-checks.d.mts +8 -0
- package/src/lib/format/endings-checks.d.ts +8 -0
- package/src/lib/format/endings-checks.js +23 -0
- package/src/lib/format/endings-checks.js.map +1 -0
- package/src/lib/format/endings-checks.mjs +20 -0
- package/src/lib/format/endings-checks.mjs.map +1 -0
- package/src/lib/format/endings.d.mts +40 -0
- package/src/lib/format/endings.d.ts +40 -0
- package/src/lib/format/endings.js +15 -0
- package/src/lib/format/endings.js.map +1 -0
- package/src/lib/format/endings.mjs +12 -0
- package/src/lib/format/endings.mjs.map +1 -0
- package/src/lib/format/field.d.mts +151 -16
- package/src/lib/format/field.d.ts +151 -16
- package/src/lib/format/field.js +64 -11
- package/src/lib/format/field.js.map +1 -1
- package/src/lib/format/field.mjs +63 -10
- package/src/lib/format/field.mjs.map +1 -1
- package/src/lib/format/head-checks.d.mts +2 -0
- package/src/lib/format/head-checks.d.ts +2 -0
- package/src/lib/format/head-checks.js +2 -59
- package/src/lib/format/head-checks.js.map +1 -1
- package/src/lib/format/head-checks.mjs +1 -58
- package/src/lib/format/head-checks.mjs.map +1 -1
- package/src/lib/format/later-checks.d.mts +17 -0
- package/src/lib/format/later-checks.d.ts +17 -0
- package/src/lib/format/later-checks.js +20 -0
- package/src/lib/format/later-checks.js.map +1 -0
- package/src/lib/format/later-checks.mjs +17 -0
- package/src/lib/format/later-checks.mjs.map +1 -0
- package/src/lib/format/layout.d.mts +241 -188
- package/src/lib/format/layout.d.ts +241 -188
- package/src/lib/format/layout.js +33 -28
- package/src/lib/format/layout.js.map +1 -1
- package/src/lib/format/layout.mjs +13 -3
- package/src/lib/format/layout.mjs.map +1 -1
- package/src/lib/format/layout.types.d.mts +2 -1
- package/src/lib/format/layout.types.d.ts +2 -1
- package/src/lib/format/limits-checks.d.mts +14 -0
- package/src/lib/format/limits-checks.d.ts +14 -0
- package/src/lib/format/limits-checks.js +36 -0
- package/src/lib/format/limits-checks.js.map +1 -0
- package/src/lib/format/limits-checks.mjs +33 -0
- package/src/lib/format/limits-checks.mjs.map +1 -0
- package/src/lib/format/limits.d.mts +24 -0
- package/src/lib/format/limits.d.ts +24 -0
- package/src/lib/format/limits.js +35 -0
- package/src/lib/format/limits.js.map +1 -0
- package/src/lib/format/limits.mjs +32 -0
- package/src/lib/format/limits.mjs.map +1 -0
- package/src/lib/format/list-checks.d.mts +44 -0
- package/src/lib/format/list-checks.d.ts +44 -0
- package/src/lib/format/list-checks.js +340 -0
- package/src/lib/format/list-checks.js.map +1 -0
- package/src/lib/format/list-checks.mjs +336 -0
- package/src/lib/format/list-checks.mjs.map +1 -0
- package/src/lib/format/map-checks.d.mts +33 -0
- package/src/lib/format/map-checks.d.ts +33 -0
- package/src/lib/format/map-checks.js +180 -0
- package/src/lib/format/map-checks.js.map +1 -0
- package/src/lib/format/map-checks.mjs +175 -0
- package/src/lib/format/map-checks.mjs.map +1 -0
- package/src/lib/format/mapchecks-part.d.mts +5 -0
- package/src/lib/format/mapchecks-part.d.ts +5 -0
- package/src/lib/format/mapchecks-part.js +11 -0
- package/src/lib/format/mapchecks-part.js.map +1 -0
- package/src/lib/format/mapchecks-part.mjs +6 -0
- package/src/lib/format/mapchecks-part.mjs.map +1 -0
- package/src/lib/format/option-checks.d.mts +16 -0
- package/src/lib/format/option-checks.d.ts +16 -0
- package/src/lib/format/option-checks.js +39 -0
- package/src/lib/format/option-checks.js.map +1 -0
- package/src/lib/format/option-checks.mjs +36 -0
- package/src/lib/format/option-checks.mjs.map +1 -0
- package/src/lib/format/options-part.d.mts +6 -0
- package/src/lib/format/options-part.d.ts +6 -0
- package/src/lib/format/options-part.js +11 -0
- package/src/lib/format/options-part.js.map +1 -0
- package/src/lib/format/options-part.mjs +7 -0
- package/src/lib/format/options-part.mjs.map +1 -0
- package/src/lib/format/page.d.mts +147 -71
- package/src/lib/format/page.d.ts +147 -71
- package/src/lib/format/page.js +5 -0
- package/src/lib/format/page.js.map +1 -1
- package/src/lib/format/page.mjs +5 -0
- package/src/lib/format/page.mjs.map +1 -1
- package/src/lib/format/part-checks.d.mts +20 -0
- package/src/lib/format/part-checks.d.ts +20 -0
- package/src/lib/format/part-checks.js +3 -0
- package/src/lib/format/part-checks.js.map +1 -0
- package/src/lib/format/part-checks.mjs +2 -0
- package/src/lib/format/part-checks.mjs.map +1 -0
- package/src/lib/format/references.d.mts +71 -65
- package/src/lib/format/references.d.ts +71 -65
- package/src/lib/format/references.js +194 -631
- package/src/lib/format/references.js.map +1 -1
- package/src/lib/format/references.mjs +194 -631
- package/src/lib/format/references.mjs.map +1 -1
- package/src/lib/format/seats-checks.d.mts +3 -0
- package/src/lib/format/seats-checks.d.ts +3 -0
- package/src/lib/format/seats-checks.js +13 -0
- package/src/lib/format/seats-checks.js.map +1 -0
- package/src/lib/format/seats-checks.mjs +10 -0
- package/src/lib/format/seats-checks.mjs.map +1 -0
- package/src/lib/format/sheet-head-checks.d.mts +4 -0
- package/src/lib/format/sheet-head-checks.d.ts +4 -0
- package/src/lib/format/sheet-head-checks.js +68 -0
- package/src/lib/format/sheet-head-checks.js.map +1 -0
- package/src/lib/format/sheet-head-checks.mjs +65 -0
- package/src/lib/format/sheet-head-checks.mjs.map +1 -0
- package/src/lib/format/signature-checks.d.mts +7 -0
- package/src/lib/format/signature-checks.d.ts +7 -0
- package/src/lib/format/signature-checks.js +32 -0
- package/src/lib/format/signature-checks.js.map +1 -0
- package/src/lib/format/signature-checks.mjs +29 -0
- package/src/lib/format/signature-checks.mjs.map +1 -0
- package/src/lib/format/signature-options.d.mts +24 -0
- package/src/lib/format/signature-options.d.ts +24 -0
- package/src/lib/format/signature-options.js +30 -0
- package/src/lib/format/signature-options.js.map +1 -0
- package/src/lib/format/signature-options.mjs +26 -0
- package/src/lib/format/signature-options.mjs.map +1 -0
- package/src/lib/format/slots-checks.d.mts +4 -0
- package/src/lib/format/slots-checks.d.ts +4 -0
- package/src/lib/format/slots-checks.js +21 -0
- package/src/lib/format/slots-checks.js.map +1 -0
- package/src/lib/format/slots-checks.mjs +18 -0
- package/src/lib/format/slots-checks.mjs.map +1 -0
- package/src/lib/format/statusbar-checks.d.mts +8 -0
- package/src/lib/format/statusbar-checks.d.ts +8 -0
- package/src/lib/format/statusbar-checks.js +35 -0
- package/src/lib/format/statusbar-checks.js.map +1 -0
- package/src/lib/format/statusbar-checks.mjs +32 -0
- package/src/lib/format/statusbar-checks.mjs.map +1 -0
- package/src/lib/format/table-checks.d.mts +21 -0
- package/src/lib/format/table-checks.d.ts +21 -0
- package/src/lib/format/table-checks.js +86 -0
- package/src/lib/format/table-checks.js.map +1 -0
- package/src/lib/format/table-checks.mjs +82 -0
- package/src/lib/format/table-checks.mjs.map +1 -0
- package/src/lib/format/translate.js +2 -2
- package/src/lib/format/translate.js.map +1 -1
- package/src/lib/format/translate.mjs +2 -2
- package/src/lib/format/translate.mjs.map +1 -1
- package/src/lib/format/upgrade.d.mts +6 -3
- package/src/lib/format/upgrade.d.ts +6 -3
- package/src/lib/format/upgrade.js +6 -3
- package/src/lib/format/upgrade.js.map +1 -1
- package/src/lib/format/upgrade.mjs +6 -3
- package/src/lib/format/upgrade.mjs.map +1 -1
- package/src/lib/format/validate.d.mts +18 -2
- package/src/lib/format/validate.d.ts +18 -2
- package/src/lib/format/validate.js +36 -3
- package/src/lib/format/validate.js.map +1 -1
- package/src/lib/format/validate.mjs +35 -3
- package/src/lib/format/validate.mjs.map +1 -1
- package/src/lib/format/version.d.mts +2 -2
- package/src/lib/format/version.d.ts +2 -2
- package/src/lib/format/version.js +2 -2
- package/src/lib/format/version.js.map +1 -1
- package/src/lib/format/version.mjs +2 -2
- package/src/lib/format/version.mjs.map +1 -1
- package/src/lib/format/words.d.mts +6 -2
- package/src/lib/format/words.d.ts +6 -2
- package/src/lib/format/words.js +13 -7
- package/src/lib/format/words.js.map +1 -1
- package/src/lib/format/words.mjs +13 -7
- package/src/lib/format/words.mjs.map +1 -1
- package/src/lib/parts.d.mts +45 -0
- package/src/lib/parts.d.ts +45 -0
- package/src/lib/parts.js +60 -0
- package/src/lib/parts.js.map +1 -0
- package/src/lib/parts.mjs +53 -0
- package/src/lib/parts.mjs.map +1 -0
- package/src/lib/record/cells.d.mts +3 -3
- package/src/lib/record/cells.d.ts +3 -3
- package/src/lib/record/cells.js +16 -15
- package/src/lib/record/cells.js.map +1 -1
- package/src/lib/record/cells.mjs +16 -15
- package/src/lib/record/cells.mjs.map +1 -1
- package/src/lib/record/compute.d.mts +16 -5
- package/src/lib/record/compute.d.ts +16 -5
- package/src/lib/record/compute.js +57 -16
- package/src/lib/record/compute.js.map +1 -1
- package/src/lib/record/compute.mjs +57 -16
- package/src/lib/record/compute.mjs.map +1 -1
- package/src/lib/record/data-source.d.mts +140 -3
- package/src/lib/record/data-source.d.ts +140 -3
- package/src/lib/record/data-source.js.map +1 -1
- package/src/lib/record/data-source.mjs.map +1 -1
- package/src/lib/record/drafts.d.mts +19 -0
- package/src/lib/record/drafts.d.ts +19 -0
- package/src/lib/record/drafts.js +35 -0
- package/src/lib/record/drafts.js.map +1 -0
- package/src/lib/record/drafts.mjs +31 -0
- package/src/lib/record/drafts.mjs.map +1 -0
- package/src/lib/record/env.d.mts +5 -1
- package/src/lib/record/env.d.ts +5 -1
- package/src/lib/record/env.js +9 -1
- package/src/lib/record/env.js.map +1 -1
- package/src/lib/record/env.mjs +8 -1
- package/src/lib/record/env.mjs.map +1 -1
- package/src/lib/record/form-limits.d.mts +81 -0
- package/src/lib/record/form-limits.d.ts +81 -0
- package/src/lib/record/form-limits.js +231 -0
- package/src/lib/record/form-limits.js.map +1 -0
- package/src/lib/record/form-limits.mjs +224 -0
- package/src/lib/record/form-limits.mjs.map +1 -0
- package/src/lib/record/form.d.mts +173 -4
- package/src/lib/record/form.d.ts +173 -4
- package/src/lib/record/form.js +792 -88
- package/src/lib/record/form.js.map +1 -1
- package/src/lib/record/form.mjs +792 -88
- package/src/lib/record/form.mjs.map +1 -1
- package/src/lib/record/limits-part.d.mts +6 -0
- package/src/lib/record/limits-part.d.ts +6 -0
- package/src/lib/record/limits-part.js +12 -0
- package/src/lib/record/limits-part.js.map +1 -0
- package/src/lib/record/limits-part.mjs +7 -0
- package/src/lib/record/limits-part.mjs.map +1 -0
- package/src/lib/record/line-choices.d.mts +30 -0
- package/src/lib/record/line-choices.d.ts +30 -0
- package/src/lib/record/line-choices.js +42 -0
- package/src/lib/record/line-choices.js.map +1 -0
- package/src/lib/record/line-choices.mjs +36 -0
- package/src/lib/record/line-choices.mjs.map +1 -0
- package/src/lib/record/locales/ar.js +10 -0
- package/src/lib/record/locales/ar.js.map +1 -1
- package/src/lib/record/locales/ar.mjs +10 -0
- package/src/lib/record/locales/ar.mjs.map +1 -1
- package/src/lib/record/locales/de.js +10 -0
- package/src/lib/record/locales/de.js.map +1 -1
- package/src/lib/record/locales/de.mjs +10 -0
- package/src/lib/record/locales/de.mjs.map +1 -1
- package/src/lib/record/locales/fr.js +10 -0
- package/src/lib/record/locales/fr.js.map +1 -1
- package/src/lib/record/locales/fr.mjs +10 -0
- package/src/lib/record/locales/fr.mjs.map +1 -1
- package/src/lib/record/memory-data-source.d.mts +44 -3
- package/src/lib/record/memory-data-source.d.ts +44 -3
- package/src/lib/record/memory-data-source.js +102 -40
- package/src/lib/record/memory-data-source.js.map +1 -1
- package/src/lib/record/memory-data-source.mjs +101 -40
- package/src/lib/record/memory-data-source.mjs.map +1 -1
- package/src/lib/record/memory-kept.d.mts +20 -0
- package/src/lib/record/memory-kept.d.ts +20 -0
- package/src/lib/record/memory-kept.js +46 -0
- package/src/lib/record/memory-kept.js.map +1 -0
- package/src/lib/record/memory-kept.mjs +43 -0
- package/src/lib/record/memory-kept.mjs.map +1 -0
- package/src/lib/record/memory-later.d.mts +19 -0
- package/src/lib/record/memory-later.d.ts +19 -0
- package/src/lib/record/memory-later.js +39 -0
- package/src/lib/record/memory-later.js.map +1 -0
- package/src/lib/record/memory-later.mjs +35 -0
- package/src/lib/record/memory-later.mjs.map +1 -0
- package/src/lib/record/memory-part.d.mts +7 -0
- package/src/lib/record/memory-part.d.ts +7 -0
- package/src/lib/record/memory-part.js +13 -0
- package/src/lib/record/memory-part.js.map +1 -0
- package/src/lib/record/memory-part.mjs +8 -0
- package/src/lib/record/memory-part.mjs.map +1 -0
- package/src/lib/record/messages.d.mts +17 -0
- package/src/lib/record/messages.d.ts +17 -0
- package/src/lib/record/messages.js +10 -0
- package/src/lib/record/messages.js.map +1 -1
- package/src/lib/record/messages.mjs +10 -0
- package/src/lib/record/messages.mjs.map +1 -1
- package/src/lib/record/option-rules.d.mts +50 -0
- package/src/lib/record/option-rules.d.ts +50 -0
- package/src/lib/record/option-rules.js +137 -0
- package/src/lib/record/option-rules.js.map +1 -0
- package/src/lib/record/option-rules.mjs +134 -0
- package/src/lib/record/option-rules.mjs.map +1 -0
- package/src/lib/record/rules.d.mts +2 -2
- package/src/lib/record/rules.d.ts +2 -2
- package/src/lib/record/rules.js +3 -3
- package/src/lib/record/rules.js.map +1 -1
- package/src/lib/record/rules.mjs +3 -3
- package/src/lib/record/rules.mjs.map +1 -1
- package/src/lib/record/run.js +9 -7
- package/src/lib/record/run.js.map +1 -1
- package/src/lib/record/run.mjs +9 -7
- package/src/lib/record/run.mjs.map +1 -1
- package/src/lib/record/search.d.mts +12 -2
- package/src/lib/record/search.d.ts +12 -2
- package/src/lib/record/search.js +29 -4
- package/src/lib/record/search.js.map +1 -1
- package/src/lib/record/search.mjs +29 -4
- package/src/lib/record/search.mjs.map +1 -1
- package/src/lib/record/set-when.d.mts +3 -3
- package/src/lib/record/set-when.d.ts +3 -3
- package/src/lib/record/set-when.js +9 -9
- package/src/lib/record/set-when.js.map +1 -1
- package/src/lib/record/set-when.mjs +9 -9
- package/src/lib/record/set-when.mjs.map +1 -1
- package/src/lib/record/signed.d.mts +21 -0
- package/src/lib/record/signed.d.ts +21 -0
- package/src/lib/record/signed.js +62 -0
- package/src/lib/record/signed.js.map +1 -0
- package/src/lib/record/signed.mjs +57 -0
- package/src/lib/record/signed.mjs.map +1 -0
- package/src/lib/record/taking.d.mts +60 -0
- package/src/lib/record/taking.d.ts +60 -0
- package/src/lib/record/taking.js +58 -0
- package/src/lib/record/taking.js.map +1 -0
- package/src/lib/record/taking.mjs +50 -0
- package/src/lib/record/taking.mjs.map +1 -0
- package/src/lib/record/value-map.js +11 -4
- package/src/lib/record/value-map.js.map +1 -1
- package/src/lib/record/value-map.mjs +11 -4
- package/src/lib/record/value-map.mjs.map +1 -1
- package/src/lib/record/values.d.mts +20 -0
- package/src/lib/record/values.d.ts +20 -0
- package/src/lib/record/values.js.map +1 -1
- package/src/lib/record/values.mjs.map +1 -1
- package/src/lib/record/waits.d.mts +6 -1
- package/src/lib/record/waits.d.ts +6 -1
- package/src/lib/record/waits.js +2 -2
- package/src/lib/record/waits.js.map +1 -1
- package/src/lib/record/waits.mjs +2 -2
- package/src/lib/record/waits.mjs.map +1 -1
- package/src/runtime.d.mts +16 -5
- package/src/runtime.d.ts +16 -5
- package/src/runtime.js +41 -3
- package/src/runtime.js.map +1 -1
- package/src/runtime.mjs +13 -0
- 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":";;
|
|
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
|
|
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'];
|