@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.
- package/README.md +326 -3
- package/package.json +1 -1
- package/schema/page.schema.json +230 -24
- package/src/index.d.mts +10 -2
- package/src/index.d.ts +10 -2
- package/src/index.js +26 -1
- package/src/index.js.map +1 -1
- package/src/index.mjs +11 -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 +264 -190
- package/src/lib/format/layout.d.ts +264 -190
- package/src/lib/format/layout.js +34 -29
- package/src/lib/format/layout.js.map +1 -1
- package/src/lib/format/layout.mjs +14 -4
- 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 +154 -71
- package/src/lib/format/page.d.ts +154 -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 +7 -3
- package/src/lib/format/upgrade.d.ts +7 -3
- package/src/lib/format/upgrade.js +7 -3
- package/src/lib/format/upgrade.js.map +1 -1
- package/src/lib/format/upgrade.mjs +7 -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/check.js +3 -1
- package/src/lib/record/check.js.map +1 -1
- package/src/lib/record/check.mjs +3 -1
- package/src/lib/record/check.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/day-words.d.mts +10 -0
- package/src/lib/record/day-words.d.ts +10 -0
- package/src/lib/record/day-words.js +23 -0
- package/src/lib/record/day-words.js.map +1 -0
- package/src/lib/record/day-words.mjs +20 -0
- package/src/lib/record/day-words.mjs.map +1 -0
- 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 +78 -0
- package/src/lib/record/form-limits.d.ts +78 -0
- package/src/lib/record/form-limits.js +230 -0
- package/src/lib/record/form-limits.js.map +1 -0
- package/src/lib/record/form-limits.mjs +223 -0
- package/src/lib/record/form-limits.mjs.map +1 -0
- package/src/lib/record/form.d.mts +180 -9
- package/src/lib/record/form.d.ts +180 -9
- package/src/lib/record/form.js +858 -90
- package/src/lib/record/form.js.map +1 -1
- package/src/lib/record/form.mjs +858 -90
- 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/limits.js +4 -2
- package/src/lib/record/limits.js.map +1 -1
- package/src/lib/record/limits.mjs +4 -2
- package/src/lib/record/limits.mjs.map +1 -1
- 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 +11 -0
- package/src/lib/record/locales/ar.js.map +1 -1
- package/src/lib/record/locales/ar.mjs +11 -0
- package/src/lib/record/locales/ar.mjs.map +1 -1
- package/src/lib/record/locales/de.js +11 -0
- package/src/lib/record/locales/de.js.map +1 -1
- package/src/lib/record/locales/de.mjs +11 -0
- package/src/lib/record/locales/de.mjs.map +1 -1
- package/src/lib/record/locales/fr.js +11 -0
- package/src/lib/record/locales/fr.js.map +1 -1
- package/src/lib/record/locales/fr.mjs +11 -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 +27 -2
- package/src/lib/record/messages.d.ts +27 -2
- package/src/lib/record/messages.js +13 -4
- package/src/lib/record/messages.js.map +1 -1
- package/src/lib/record/messages.mjs +13 -4
- package/src/lib/record/messages.mjs.map +1 -1
- package/src/lib/record/option-rules.d.mts +56 -0
- package/src/lib/record/option-rules.d.ts +56 -0
- package/src/lib/record/option-rules.js +143 -0
- package/src/lib/record/option-rules.js.map +1 -0
- package/src/lib/record/option-rules.mjs +140 -0
- package/src/lib/record/option-rules.mjs.map +1 -0
- package/src/lib/record/record-words.d.mts +13 -1
- package/src/lib/record/record-words.d.ts +13 -1
- package/src/lib/record/record-words.js +29 -1
- package/src/lib/record/record-words.js.map +1 -1
- package/src/lib/record/record-words.mjs +27 -1
- package/src/lib/record/record-words.mjs.map +1 -1
- 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 +13 -6
- package/src/lib/record/waits.d.ts +13 -6
- package/src/lib/record/waits.js +9 -12
- package/src/lib/record/waits.js.map +1 -1
- package/src/lib/record/waits.mjs +9 -12
- package/src/lib/record/waits.mjs.map +1 -1
- package/src/runtime.d.mts +17 -6
- package/src/runtime.d.ts +17 -6
- package/src/runtime.js +45 -3
- package/src/runtime.js.map +1 -1
- package/src/runtime.mjs +17 -1
- package/src/runtime.mjs.map +1 -1
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { optionsField, optionsList } from '../format/choice-options.mjs';
|
|
2
|
+
import { compileModifier } from '../expression/modifier.mjs';
|
|
3
|
+
import { expressionEnv, lineContext, recordContext } from './env.mjs';
|
|
4
|
+
/** A choice's options that show or hide by a condition, read once: by each option's value. */
|
|
5
|
+
function rulesOf(options, table) {
|
|
6
|
+
const rules = new Map();
|
|
7
|
+
for (const option of options)
|
|
8
|
+
if (option.invisible !== undefined && option.invisible !== false)
|
|
9
|
+
rules.set(option.value, compileModifier(option.invisible, table));
|
|
10
|
+
return rules;
|
|
11
|
+
}
|
|
12
|
+
export function optionRules(host) {
|
|
13
|
+
const { page, table, app, today } = host;
|
|
14
|
+
/** The app's list a choice's options come from; none for one whose options are its own or carried. */
|
|
15
|
+
const fromList = (name) => optionsList(page.fields[name]?.optionsFrom);
|
|
16
|
+
/** Each choice's options that show or hide by a condition, read once: by the field, by each option's value. */
|
|
17
|
+
const optionRules = new Map();
|
|
18
|
+
for (const [name, def] of Object.entries(page.fields)) {
|
|
19
|
+
if (def.type !== 'selection')
|
|
20
|
+
continue;
|
|
21
|
+
const rules = rulesOf(def.options, table);
|
|
22
|
+
if (rules.size)
|
|
23
|
+
optionRules.set(name, rules);
|
|
24
|
+
}
|
|
25
|
+
/** The choices whose options change with the record's answers. */
|
|
26
|
+
const changing = Object.keys(page.fields).filter((name) => optionRules.has(name) || (page.fields[name].type === 'selection' && !!optionsField(page.fields[name].optionsFrom)));
|
|
27
|
+
/**
|
|
28
|
+
* A table line's choices whose options show or hide by a condition on the line's values (and `parent.` the record's),
|
|
29
|
+
* read once: by the table, its column, each option's value.
|
|
30
|
+
*/
|
|
31
|
+
const lineOptionRules = new Map();
|
|
32
|
+
for (const [lines, def] of Object.entries(page.fields)) {
|
|
33
|
+
if (def.type !== 'one2many')
|
|
34
|
+
continue;
|
|
35
|
+
for (const [column, sub] of Object.entries(def.fields)) {
|
|
36
|
+
if (sub.type !== 'selection')
|
|
37
|
+
continue;
|
|
38
|
+
const rules = rulesOf(sub.options, table);
|
|
39
|
+
if (!rules.size)
|
|
40
|
+
continue;
|
|
41
|
+
if (!lineOptionRules.has(lines))
|
|
42
|
+
lineOptionRules.set(lines, new Map());
|
|
43
|
+
lineOptionRules.get(lines)?.set(column, rules);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function lineOffered(lines, line, column, record) {
|
|
47
|
+
const sub = page.fields[lines].fields[column];
|
|
48
|
+
const options = (optionsList(sub.optionsFrom) && host.state().choices[`${lines}.${line.key}.${column}`]?.options) || sub.options;
|
|
49
|
+
const rules = lineOptionRules.get(lines)?.get(column);
|
|
50
|
+
if (!rules)
|
|
51
|
+
return [...options];
|
|
52
|
+
const context = lineContext(line.values, page.fields[lines].fields, record, line.id ?? null);
|
|
53
|
+
const env = { ...app, today };
|
|
54
|
+
return options.filter((o) => !rules.get(o.value)?.evaluate(context, env));
|
|
55
|
+
}
|
|
56
|
+
function offeredIn(name, values, read, seen = []) {
|
|
57
|
+
const def = page.fields[name];
|
|
58
|
+
const carried = optionsField(def.optionsFrom);
|
|
59
|
+
let options;
|
|
60
|
+
if (carried && page.fields[carried.field]?.type === 'selection' && !seen.includes(carried.field)) {
|
|
61
|
+
const picked = new Set([values[carried.field]].flat().filter((value) => value !== null && value !== undefined));
|
|
62
|
+
// A "None of these" goes alone: it is no choice to carry.
|
|
63
|
+
const from = offeredIn(carried.field, values, read, [...seen, name]).filter((o) => !o.exclusive && picked.has(o.value) === (carried.picked !== false));
|
|
64
|
+
options = [...from.map(({ invisible: _, ...option }) => option), ...def.options];
|
|
65
|
+
}
|
|
66
|
+
else
|
|
67
|
+
options = (fromList(name) && host.state().choices[name]?.options) || def.options;
|
|
68
|
+
const rules = optionRules.get(name);
|
|
69
|
+
return rules ? options.filter((o) => !rules.get(o.value)?.evaluate(read.context, read.env)) : [...options];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The chosen options a write no longer offers — hidden by their condition, or no longer picked where they are
|
|
73
|
+
* carried from — taken out of their answers, with what is said: those offered before it and not after, so a record
|
|
74
|
+
* opened holding one keeps it, and says so. A table line's alike, by its cell's path, its conditions read on the line
|
|
75
|
+
* as it was and as it is. Again while one taken out takes another's away. Null when none goes.
|
|
76
|
+
*/
|
|
77
|
+
function takeOut(before, after) {
|
|
78
|
+
if (!changing.length && !lineOptionRules.size)
|
|
79
|
+
return null;
|
|
80
|
+
const was = before === host.state().values ? host.reading() : { context: recordContext(before, page.fields, host.about()), env: expressionEnv(before, page.fields, today, app) };
|
|
81
|
+
const said = {};
|
|
82
|
+
const taken = {};
|
|
83
|
+
/** Said at a path: the options gone, by their labels as they were offered. */
|
|
84
|
+
const say = (path, gone, offeredBefore) => {
|
|
85
|
+
taken[path] = gone.map((value) => ({ value: value, label: offeredBefore.get(value) ?? String(value) }));
|
|
86
|
+
said[path] = host.words(taken[path].map((option) => option.label));
|
|
87
|
+
};
|
|
88
|
+
let values = after;
|
|
89
|
+
for (let round = 0; round < 4; round++) {
|
|
90
|
+
const now = { context: recordContext(values, page.fields, host.about()), env: expressionEnv(values, page.fields, today, app) };
|
|
91
|
+
let next = values;
|
|
92
|
+
for (const name of changing) {
|
|
93
|
+
const chosen = [values[name]].flat().filter((value) => value !== null && value !== undefined);
|
|
94
|
+
if (!chosen.length)
|
|
95
|
+
continue;
|
|
96
|
+
const offeredBefore = new Map(offeredIn(name, before, was).map((o) => [o.value, o.label]));
|
|
97
|
+
const offeredNow = new Set(offeredIn(name, values, now).map((o) => o.value));
|
|
98
|
+
const gone = chosen.filter((value) => offeredBefore.has(value) && !offeredNow.has(value));
|
|
99
|
+
if (!gone.length)
|
|
100
|
+
continue;
|
|
101
|
+
const held = values[name];
|
|
102
|
+
next = { ...next, [name]: Array.isArray(held) ? held.filter((value) => !gone.includes(value)) : null };
|
|
103
|
+
say(name, gone, offeredBefore);
|
|
104
|
+
}
|
|
105
|
+
// A line's choice its line's change hides: only a line that was there, and what it offered then.
|
|
106
|
+
for (const [lines, columns] of lineOptionRules) {
|
|
107
|
+
const rows = values[lines] ?? [];
|
|
108
|
+
const rowsBefore = before[lines] ?? [];
|
|
109
|
+
let written = null;
|
|
110
|
+
rows.forEach((line, i) => {
|
|
111
|
+
const old = rowsBefore.find((one) => one.key === line.key);
|
|
112
|
+
if (!old)
|
|
113
|
+
return;
|
|
114
|
+
for (const column of columns.keys()) {
|
|
115
|
+
const held = (written?.[i] ?? line).values[column];
|
|
116
|
+
const chosen = [held].flat().filter((value) => value !== null && value !== undefined);
|
|
117
|
+
if (!chosen.length)
|
|
118
|
+
continue;
|
|
119
|
+
const offeredBefore = new Map(lineOffered(lines, old, column, was.context).map((o) => [o.value, o.label]));
|
|
120
|
+
const offeredNow = new Set(lineOffered(lines, written?.[i] ?? line, column, now.context).map((o) => o.value));
|
|
121
|
+
const gone = chosen.filter((value) => offeredBefore.has(value) && !offeredNow.has(value));
|
|
122
|
+
if (!gone.length)
|
|
123
|
+
continue;
|
|
124
|
+
written ??= [...rows];
|
|
125
|
+
written[i] = { ...written[i], values: { ...written[i].values, [column]: (Array.isArray(held) ? held.filter((value) => !gone.includes(value)) : null) } };
|
|
126
|
+
say(`${lines}.${line.key}.${column}`, gone, offeredBefore);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
if (written)
|
|
130
|
+
next = { ...next, [lines]: written };
|
|
131
|
+
}
|
|
132
|
+
if (next === values)
|
|
133
|
+
break;
|
|
134
|
+
values = host.settle(next);
|
|
135
|
+
}
|
|
136
|
+
return Object.keys(said).length ? { values, said, gone: taken } : null;
|
|
137
|
+
}
|
|
138
|
+
return { offered: (name, values, read) => offeredIn(name, values, read), lineOffered, takeOut };
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=option-rules.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"option-rules.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/option-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,16 @@ import type { PageRecords } from '../format/records.mjs';
|
|
|
7
7
|
* (`named` left out), or the sentence needs `a` and the page gave none — an article is never guessed.
|
|
8
8
|
*/
|
|
9
9
|
export declare function recordSentence(records: PageRecords | undefined, named: string | undefined, plain: string, locale?: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Whether a label is a question put to the person: it ends with a question mark — in any script: ?, ؟, ? — or with an
|
|
12
|
+
* ellipsis the answer completes ("May we tell you about…"). A name ("Your name", "Rate (1–5)") is none.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isQuestion(label: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* A label as a sentence names it: a question (`isQuestion`) between the language's quotation marks — "Please answer
|
|
17
|
+
* “How was your visit?”", "“How many days?” must be at most 5" — and a name as written.
|
|
18
|
+
*/
|
|
19
|
+
export declare function quotedLabel(label: string, locale?: string): string;
|
|
10
20
|
/**
|
|
11
21
|
* A field's label as a sentence of Fieldia's puts it at its blank `key` (`{label}`, `{field}`, `{fields}`…): with a
|
|
12
22
|
* small first letter where the page asks (`lower`: its `lowerLabels`) and the blank stands inside the sentence
|
|
@@ -14,6 +24,8 @@ export declare function recordSentence(records: PageRecords | undefined, named:
|
|
|
14
24
|
* phone" — else as written. A label that begins its sentence keeps its capital: "Phone is required", and "Status: …" at
|
|
15
25
|
* a line's start, a heading's place. So does a name ("IBAN", "WhatsApp", "E-mail"), and every label in a language that
|
|
16
26
|
* writes its nouns with a capital (German) or in a script with none (Arabic): a label there is as the page wrote it. Where a sentence puts the blank in both places, as
|
|
17
|
-
* written.
|
|
27
|
+
* written. A label that is a question (`isQuestion`) is quoted, as written, wherever it stands (`quotedLabel`): "Fix
|
|
28
|
+
* “How was your visit?” to see Total". The one rule every caller asks; the quiet look's "Add story points" asks it
|
|
29
|
+
* always.
|
|
18
30
|
*/
|
|
19
31
|
export declare function labelAt(template: string, key: string, lower: boolean | undefined, locale?: string): (label: string) => string;
|
|
@@ -7,6 +7,16 @@ import type { PageRecords } from '../format/records';
|
|
|
7
7
|
* (`named` left out), or the sentence needs `a` and the page gave none — an article is never guessed.
|
|
8
8
|
*/
|
|
9
9
|
export declare function recordSentence(records: PageRecords | undefined, named: string | undefined, plain: string, locale?: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Whether a label is a question put to the person: it ends with a question mark — in any script: ?, ؟, ? — or with an
|
|
12
|
+
* ellipsis the answer completes ("May we tell you about…"). A name ("Your name", "Rate (1–5)") is none.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isQuestion(label: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* A label as a sentence names it: a question (`isQuestion`) between the language's quotation marks — "Please answer
|
|
17
|
+
* “How was your visit?”", "“How many days?” must be at most 5" — and a name as written.
|
|
18
|
+
*/
|
|
19
|
+
export declare function quotedLabel(label: string, locale?: string): string;
|
|
10
20
|
/**
|
|
11
21
|
* A field's label as a sentence of Fieldia's puts it at its blank `key` (`{label}`, `{field}`, `{fields}`…): with a
|
|
12
22
|
* small first letter where the page asks (`lower`: its `lowerLabels`) and the blank stands inside the sentence
|
|
@@ -14,6 +24,8 @@ export declare function recordSentence(records: PageRecords | undefined, named:
|
|
|
14
24
|
* phone" — else as written. A label that begins its sentence keeps its capital: "Phone is required", and "Status: …" at
|
|
15
25
|
* a line's start, a heading's place. So does a name ("IBAN", "WhatsApp", "E-mail"), and every label in a language that
|
|
16
26
|
* writes its nouns with a capital (German) or in a script with none (Arabic): a label there is as the page wrote it. Where a sentence puts the blank in both places, as
|
|
17
|
-
* written.
|
|
27
|
+
* written. A label that is a question (`isQuestion`) is quoted, as written, wherever it stands (`quotedLabel`): "Fix
|
|
28
|
+
* “How was your visit?” to see Total". The one rule every caller asks; the quiet look's "Add story points" asks it
|
|
29
|
+
* always.
|
|
18
30
|
*/
|
|
19
31
|
export declare function labelAt(template: string, key: string, lower: boolean | undefined, locale?: string): (label: string) => string;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.recordSentence = recordSentence;
|
|
4
|
+
exports.isQuestion = isQuestion;
|
|
5
|
+
exports.quotedLabel = quotedLabel;
|
|
4
6
|
exports.labelAt = labelAt;
|
|
5
7
|
const translate_1 = require("../format/translate");
|
|
6
8
|
/** The words of a page's records in a sentence: one, more than one, and one with its article. */
|
|
@@ -27,6 +29,25 @@ function recordSentence(records, named, plain, locale = 'en') {
|
|
|
27
29
|
return /^\{(record|records|aRecord)\}/.test(named) ? capital(filled, locale) : filled;
|
|
28
30
|
}
|
|
29
31
|
const asWritten = (label) => label;
|
|
32
|
+
/**
|
|
33
|
+
* Whether a label is a question put to the person: it ends with a question mark — in any script: ?, ؟, ? — or with an
|
|
34
|
+
* ellipsis the answer completes ("May we tell you about…"). A name ("Your name", "Rate (1–5)") is none.
|
|
35
|
+
*/
|
|
36
|
+
function isQuestion(label) {
|
|
37
|
+
return /([?؟?⸮]|…|\.\.\.)\s*$/u.test(label);
|
|
38
|
+
}
|
|
39
|
+
/** Each language's quotation marks round a question its sentence names: “…” where it has none of its own here. */
|
|
40
|
+
const QUOTES = { de: ['„', '“'], fr: ['« ', ' »'], ar: ['«', '»'] };
|
|
41
|
+
/**
|
|
42
|
+
* A label as a sentence names it: a question (`isQuestion`) between the language's quotation marks — "Please answer
|
|
43
|
+
* “How was your visit?”", "“How many days?” must be at most 5" — and a name as written.
|
|
44
|
+
*/
|
|
45
|
+
function quotedLabel(label, locale = 'en') {
|
|
46
|
+
if (!isQuestion(label))
|
|
47
|
+
return label;
|
|
48
|
+
const [open, close] = QUOTES[locale.split('-')[0].toLowerCase()] ?? ['“', '”'];
|
|
49
|
+
return `${open}${label.trim()}${close}`;
|
|
50
|
+
}
|
|
30
51
|
/**
|
|
31
52
|
* A label with a small first letter: one whose first word starts as a common word does ("Phone", "Tax ID", "Order
|
|
32
53
|
* lines"), never a name — a first word with another capital, or none small after its first ("IBAN", "WhatsApp",
|
|
@@ -45,9 +66,16 @@ const small = (locale) => (label) => {
|
|
|
45
66
|
* phone" — else as written. A label that begins its sentence keeps its capital: "Phone is required", and "Status: …" at
|
|
46
67
|
* a line's start, a heading's place. So does a name ("IBAN", "WhatsApp", "E-mail"), and every label in a language that
|
|
47
68
|
* writes its nouns with a capital (German) or in a script with none (Arabic): a label there is as the page wrote it. Where a sentence puts the blank in both places, as
|
|
48
|
-
* written.
|
|
69
|
+
* written. A label that is a question (`isQuestion`) is quoted, as written, wherever it stands (`quotedLabel`): "Fix
|
|
70
|
+
* “How was your visit?” to see Total". The one rule every caller asks; the quiet look's "Add story points" asks it
|
|
71
|
+
* always.
|
|
49
72
|
*/
|
|
50
73
|
function labelAt(template, key, lower, locale = 'en') {
|
|
74
|
+
const cased = casedAt(template, key, lower, locale);
|
|
75
|
+
// A question is quoted as written, wherever its sentence puts it.
|
|
76
|
+
return (label) => (isQuestion(label) ? quotedLabel(label, locale) : cased(label));
|
|
77
|
+
}
|
|
78
|
+
function casedAt(template, key, lower, locale) {
|
|
51
79
|
if (!lower || NOUNS_CAPITAL.test(locale) || (0, translate_1.isRightToLeft)(locale))
|
|
52
80
|
return asWritten;
|
|
53
81
|
const parts = template.split(`{${key}}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-words.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/record-words.ts"],"names":[],"mappings":";;AAoBA,wCAMC;AAwBD,
|
|
1
|
+
{"version":3,"file":"record-words.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/record-words.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,25 @@ export function recordSentence(records, named, plain, locale = 'en') {
|
|
|
23
23
|
return /^\{(record|records|aRecord)\}/.test(named) ? capital(filled, locale) : filled;
|
|
24
24
|
}
|
|
25
25
|
const asWritten = (label) => label;
|
|
26
|
+
/**
|
|
27
|
+
* Whether a label is a question put to the person: it ends with a question mark — in any script: ?, ؟, ? — or with an
|
|
28
|
+
* ellipsis the answer completes ("May we tell you about…"). A name ("Your name", "Rate (1–5)") is none.
|
|
29
|
+
*/
|
|
30
|
+
export function isQuestion(label) {
|
|
31
|
+
return /([?؟?⸮]|…|\.\.\.)\s*$/u.test(label);
|
|
32
|
+
}
|
|
33
|
+
/** Each language's quotation marks round a question its sentence names: “…” where it has none of its own here. */
|
|
34
|
+
const QUOTES = { de: ['„', '“'], fr: ['« ', ' »'], ar: ['«', '»'] };
|
|
35
|
+
/**
|
|
36
|
+
* A label as a sentence names it: a question (`isQuestion`) between the language's quotation marks — "Please answer
|
|
37
|
+
* “How was your visit?”", "“How many days?” must be at most 5" — and a name as written.
|
|
38
|
+
*/
|
|
39
|
+
export function quotedLabel(label, locale = 'en') {
|
|
40
|
+
if (!isQuestion(label))
|
|
41
|
+
return label;
|
|
42
|
+
const [open, close] = QUOTES[locale.split('-')[0].toLowerCase()] ?? ['“', '”'];
|
|
43
|
+
return `${open}${label.trim()}${close}`;
|
|
44
|
+
}
|
|
26
45
|
/**
|
|
27
46
|
* A label with a small first letter: one whose first word starts as a common word does ("Phone", "Tax ID", "Order
|
|
28
47
|
* lines"), never a name — a first word with another capital, or none small after its first ("IBAN", "WhatsApp",
|
|
@@ -41,9 +60,16 @@ const small = (locale) => (label) => {
|
|
|
41
60
|
* phone" — else as written. A label that begins its sentence keeps its capital: "Phone is required", and "Status: …" at
|
|
42
61
|
* a line's start, a heading's place. So does a name ("IBAN", "WhatsApp", "E-mail"), and every label in a language that
|
|
43
62
|
* writes its nouns with a capital (German) or in a script with none (Arabic): a label there is as the page wrote it. Where a sentence puts the blank in both places, as
|
|
44
|
-
* written.
|
|
63
|
+
* written. A label that is a question (`isQuestion`) is quoted, as written, wherever it stands (`quotedLabel`): "Fix
|
|
64
|
+
* “How was your visit?” to see Total". The one rule every caller asks; the quiet look's "Add story points" asks it
|
|
65
|
+
* always.
|
|
45
66
|
*/
|
|
46
67
|
export function labelAt(template, key, lower, locale = 'en') {
|
|
68
|
+
const cased = casedAt(template, key, lower, locale);
|
|
69
|
+
// A question is quoted as written, wherever its sentence puts it.
|
|
70
|
+
return (label) => (isQuestion(label) ? quotedLabel(label, locale) : cased(label));
|
|
71
|
+
}
|
|
72
|
+
function casedAt(template, key, lower, locale) {
|
|
47
73
|
if (!lower || NOUNS_CAPITAL.test(locale) || isRightToLeft(locale))
|
|
48
74
|
return asWritten;
|
|
49
75
|
const parts = template.split(`{${key}}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-words.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/record-words.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,iGAAiG;AACjG,MAAM,KAAK,GAAG,+BAA+B,CAAC;AAE9C,uGAAuG;AACvG,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAEvC,2FAA2F;AAC3F,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvG,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjI;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgC,EAAE,KAAyB,EAAE,KAAa,EAAE,MAAM,GAAG,IAAI;IACtH,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAY,CAAC,CAAC,CAAC;IACjI,OAAO,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACxF,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC;AAE3C;;;;GAIG;AACH,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,KAAa,EAAE,EAAE;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnG,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"record-words.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/record-words.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Field } from '../format/field.mjs';
|
|
2
2
|
import type { AnswerRule } from '../format/layout.mjs';
|
|
3
|
-
import type { ExpressionEnv } from '../expression/functions.mjs';
|
|
3
|
+
import type { ExpressionEnv, FunctionTable } from '../expression/functions.mjs';
|
|
4
4
|
import { type CompiledModifier } from '../expression/modifier.mjs';
|
|
5
5
|
import { type Messages } from './messages.mjs';
|
|
6
6
|
import { type Value } from './values.mjs';
|
|
@@ -18,7 +18,7 @@ export interface CompiledRule {
|
|
|
18
18
|
readonly pattern: RegExp | null;
|
|
19
19
|
readonly holds: CompiledModifier | null;
|
|
20
20
|
}
|
|
21
|
-
export declare function compileRules(rules: readonly AnswerRule[] | undefined): CompiledRule[];
|
|
21
|
+
export declare function compileRules(rules: readonly AnswerRule[] | undefined, functions?: FunctionTable): CompiledRule[];
|
|
22
22
|
/** What a rule is checked with: the record as expressions read it, the clock, and the words to say. */
|
|
23
23
|
export interface RuleContext {
|
|
24
24
|
context: Record<string, unknown>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Field } from '../format/field';
|
|
2
2
|
import type { AnswerRule } from '../format/layout';
|
|
3
|
-
import type { ExpressionEnv } from '../expression/functions';
|
|
3
|
+
import type { ExpressionEnv, FunctionTable } from '../expression/functions';
|
|
4
4
|
import { type CompiledModifier } from '../expression/modifier';
|
|
5
5
|
import { type Messages } from './messages';
|
|
6
6
|
import { type Value } from './values';
|
|
@@ -18,7 +18,7 @@ export interface CompiledRule {
|
|
|
18
18
|
readonly pattern: RegExp | null;
|
|
19
19
|
readonly holds: CompiledModifier | null;
|
|
20
20
|
}
|
|
21
|
-
export declare function compileRules(rules: readonly AnswerRule[] | undefined): CompiledRule[];
|
|
21
|
+
export declare function compileRules(rules: readonly AnswerRule[] | undefined, functions?: FunctionTable): CompiledRule[];
|
|
22
22
|
/** What a rule is checked with: the record as expressions read it, the clock, and the words to say. */
|
|
23
23
|
export interface RuleContext {
|
|
24
24
|
context: Record<string, unknown>;
|
package/src/lib/record/rules.js
CHANGED
|
@@ -8,13 +8,13 @@ const operations_1 = require("../expression/operations");
|
|
|
8
8
|
const input_rules_1 = require("./input-rules");
|
|
9
9
|
const messages_1 = require("./messages");
|
|
10
10
|
const values_1 = require("./values");
|
|
11
|
-
function compileRules(rules) {
|
|
11
|
+
function compileRules(rules, functions) {
|
|
12
12
|
return (rules ?? []).map((rule) => ({
|
|
13
13
|
rule,
|
|
14
|
-
when: (0, modifier_1.compileModifier)(rule.when ?? true),
|
|
14
|
+
when: (0, modifier_1.compileModifier)(rule.when ?? true, functions),
|
|
15
15
|
// A pattern is about the whole answer, not a part of it.
|
|
16
16
|
pattern: rule.pattern === undefined ? null : new RegExp(`^(?:${rule.pattern})$`),
|
|
17
|
-
holds: rule.holds === undefined ? null : (0, modifier_1.compileModifier)(rule.holds),
|
|
17
|
+
holds: rule.holds === undefined ? null : (0, modifier_1.compileModifier)(rule.holds, functions),
|
|
18
18
|
}));
|
|
19
19
|
}
|
|
20
20
|
/** The first broken error rule's message and the first broken warning rule's, for one answer. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/rules.ts"],"names":[],"mappings":";;AA0BA,oCAQC;AAWD,gCAgBC;AA1DD,uDAAmD;AACnD,qDAAgF;AAChF,yDAAoD;AACpD,+CAAuD;AACvD,yCAAyE;AACzE,qCAAwF;AAkBxF,SAAgB,YAAY,CAAC,KAAwC;
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/rules.ts"],"names":[],"mappings":"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"}
|
package/src/lib/record/rules.mjs
CHANGED
|
@@ -4,13 +4,13 @@ import { isNumber } from '../expression/operations.mjs';
|
|
|
4
4
|
import { foldDigits, stripMarks } from './input-rules.mjs';
|
|
5
5
|
import { fillMessage } from './messages.mjs';
|
|
6
6
|
import { isEmpty, lineKind } from './values.mjs';
|
|
7
|
-
export function compileRules(rules) {
|
|
7
|
+
export function compileRules(rules, functions) {
|
|
8
8
|
return (rules ?? []).map((rule) => ({
|
|
9
9
|
rule,
|
|
10
|
-
when: compileModifier(rule.when ?? true),
|
|
10
|
+
when: compileModifier(rule.when ?? true, functions),
|
|
11
11
|
// A pattern is about the whole answer, not a part of it.
|
|
12
12
|
pattern: rule.pattern === undefined ? null : new RegExp(`^(?:${rule.pattern})$`),
|
|
13
|
-
holds: rule.holds === undefined ? null : compileModifier(rule.holds),
|
|
13
|
+
holds: rule.holds === undefined ? null : compileModifier(rule.holds, functions),
|
|
14
14
|
}));
|
|
15
15
|
}
|
|
16
16
|
/** The first broken error rule's message and the first broken warning rule's, for one answer. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/rules.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAyB,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,WAAW,EAAkC,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAA6C,MAAM,UAAU,CAAC;AAkBxF,MAAM,UAAU,YAAY,CAAC,KAAwC;
|
|
1
|
+
{"version":3,"file":"rules.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/rules.ts"],"names":[],"mappings":"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"}
|
package/src/lib/record/run.js
CHANGED
|
@@ -18,10 +18,12 @@ const wordsOf = (error) => (error instanceof Error ? error.message : String(erro
|
|
|
18
18
|
function createRunner(form) {
|
|
19
19
|
const expressions = new Map();
|
|
20
20
|
const conditions = new Map();
|
|
21
|
+
/** The app's functions the form's expressions call: one table for the form's life. */
|
|
22
|
+
const functions = () => form.reading().env.functions;
|
|
21
23
|
const expression = (source) => {
|
|
22
24
|
let found = expressions.get(source);
|
|
23
25
|
if (!found)
|
|
24
|
-
expressions.set(source, (found = (0, expression_1.compileExpression)(source)));
|
|
26
|
+
expressions.set(source, (found = (0, expression_1.compileExpression)(source, functions())));
|
|
25
27
|
return found;
|
|
26
28
|
};
|
|
27
29
|
function holds(when) {
|
|
@@ -29,7 +31,7 @@ function createRunner(form) {
|
|
|
29
31
|
return when;
|
|
30
32
|
let found = conditions.get(when);
|
|
31
33
|
if (!found)
|
|
32
|
-
conditions.set(when, (found = (0, modifier_1.compileModifier)(when)));
|
|
34
|
+
conditions.set(when, (found = (0, modifier_1.compileModifier)(when, functions())));
|
|
33
35
|
const { context, env } = form.reading();
|
|
34
36
|
return found.evaluate(context, env);
|
|
35
37
|
}
|
|
@@ -198,7 +200,7 @@ function createRunner(form) {
|
|
|
198
200
|
for (const [name, source] of Object.entries(map)) {
|
|
199
201
|
const def = fieldOf(name);
|
|
200
202
|
const alone = named(source);
|
|
201
|
-
const raw = alone === 'id' ? id : alone !== null && !EXPRESSIBLE.has(def.type) && alone in answers ? answers[alone] : expression(source).evaluate(context, { today: form.today });
|
|
203
|
+
const raw = alone === 'id' ? id : alone !== null && !EXPRESSIBLE.has(def.type) && alone in answers ? answers[alone] : expression(source).evaluate(context, { today: form.today, functions: functions() });
|
|
202
204
|
values[name] = fit(def, raw, label);
|
|
203
205
|
}
|
|
204
206
|
return values;
|
|
@@ -294,11 +296,11 @@ function createRunner(form) {
|
|
|
294
296
|
/** Words posted: a `post` step's with each `{field}` filled in, or the app's as they are. */
|
|
295
297
|
async function post(message, kind, filled) {
|
|
296
298
|
const parts = filled ? (0, words_1.splitValues)(message) : [{ text: message }];
|
|
297
|
-
|
|
299
|
+
// A field empty says its words while empty, where the page gives some ({field|words}).
|
|
300
|
+
const said = (part) => (part.field ? form.wordsOf(part.field) || (part.fallback ?? '') : part.text);
|
|
301
|
+
const text = parts.map(said).join('');
|
|
298
302
|
// An html field's value comes as HTML; the rest are escaped, a line each.
|
|
299
|
-
const body = parts
|
|
300
|
-
.map((part) => (part.field && form.fields[part.field]?.type === 'html' ? String(form.values()[part.field] ?? '') : escapeHtml(part.field ? form.wordsOf(part.field) : part.text)))
|
|
301
|
-
.join('');
|
|
303
|
+
const body = parts.map((part) => (part.field && form.fields[part.field]?.type === 'html' && form.values()[part.field] ? String(form.values()[part.field]) : escapeHtml(said(part)))).join('');
|
|
302
304
|
const posted = await form.post({ kind, text, body: `<p>${body}</p>` });
|
|
303
305
|
return posted ? null : cannot('Nothing can post a message here: no conversation is beside this record');
|
|
304
306
|
}
|