@fieldia/core 0.20.0 → 0.22.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 +116 -1
- package/package.json +1 -1
- package/schema/page.schema.json +173 -1
- package/src/index.d.mts +2 -2
- package/src/index.d.ts +2 -2
- package/src/index.js +3 -1
- package/src/index.js.map +1 -1
- package/src/index.mjs +2 -2
- package/src/index.mjs.map +1 -1
- package/src/lib/expression/parser.js +4 -4
- package/src/lib/expression/parser.js.map +1 -1
- package/src/lib/expression/parser.mjs +5 -5
- package/src/lib/expression/parser.mjs.map +1 -1
- package/src/lib/expression/tokenizer.d.mts +12 -0
- package/src/lib/expression/tokenizer.d.ts +12 -0
- package/src/lib/expression/tokenizer.js +21 -12
- package/src/lib/expression/tokenizer.js.map +1 -1
- package/src/lib/expression/tokenizer.mjs +20 -12
- package/src/lib/expression/tokenizer.mjs.map +1 -1
- package/src/lib/format/check-page.d.mts +3 -2
- package/src/lib/format/check-page.d.ts +3 -2
- package/src/lib/format/check-page.js +9 -4
- package/src/lib/format/check-page.js.map +1 -1
- package/src/lib/format/check-page.mjs +10 -5
- package/src/lib/format/check-page.mjs.map +1 -1
- package/src/lib/format/field.d.mts +101 -0
- package/src/lib/format/field.d.ts +101 -0
- package/src/lib/format/field.js +25 -2
- package/src/lib/format/field.js.map +1 -1
- package/src/lib/format/field.mjs +24 -1
- package/src/lib/format/field.mjs.map +1 -1
- package/src/lib/format/layout.d.mts +142 -17
- package/src/lib/format/layout.d.ts +142 -17
- package/src/lib/format/layout.js +18 -1
- package/src/lib/format/layout.js.map +1 -1
- package/src/lib/format/layout.mjs +17 -0
- package/src/lib/format/layout.mjs.map +1 -1
- package/src/lib/format/layout.types.d.mts +6 -2
- package/src/lib/format/layout.types.d.ts +6 -2
- package/src/lib/format/page.d.mts +87 -10
- package/src/lib/format/page.d.ts +87 -10
- package/src/lib/format/page.js +5 -1
- package/src/lib/format/page.js.map +1 -1
- package/src/lib/format/page.mjs +6 -2
- package/src/lib/format/page.mjs.map +1 -1
- package/src/lib/format/pattern.d.mts +10 -0
- package/src/lib/format/pattern.d.ts +10 -0
- package/src/lib/format/pattern.js +33 -0
- package/src/lib/format/pattern.js.map +1 -0
- package/src/lib/format/pattern.mjs +30 -0
- package/src/lib/format/pattern.mjs.map +1 -0
- package/src/lib/format/references.d.mts +7 -0
- package/src/lib/format/references.d.ts +7 -0
- package/src/lib/format/references.js +54 -0
- package/src/lib/format/references.js.map +1 -1
- package/src/lib/format/references.mjs +54 -0
- package/src/lib/format/references.mjs.map +1 -1
- package/src/lib/format/translate.js +6 -4
- package/src/lib/format/translate.js.map +1 -1
- package/src/lib/format/translate.mjs +6 -4
- package/src/lib/format/translate.mjs.map +1 -1
- package/src/lib/format/upgrade.d.mts +41 -0
- package/src/lib/format/upgrade.d.ts +41 -0
- package/src/lib/format/upgrade.js +41 -0
- package/src/lib/format/upgrade.js.map +1 -0
- package/src/lib/format/upgrade.mjs +37 -0
- package/src/lib/format/upgrade.mjs.map +1 -0
- package/src/lib/format/validate.d.mts +2 -1
- package/src/lib/format/validate.d.ts +2 -1
- package/src/lib/format/validate.js +4 -2
- package/src/lib/format/validate.js.map +1 -1
- package/src/lib/format/validate.mjs +4 -2
- package/src/lib/format/validate.mjs.map +1 -1
- package/src/lib/format/version.d.mts +16 -1
- package/src/lib/format/version.d.ts +16 -1
- package/src/lib/format/version.js +39 -2
- package/src/lib/format/version.js.map +1 -1
- package/src/lib/format/version.mjs +36 -1
- package/src/lib/format/version.mjs.map +1 -1
- package/src/lib/record/check.d.mts +13 -3
- package/src/lib/record/check.d.ts +13 -3
- package/src/lib/record/check.js +87 -17
- package/src/lib/record/check.js.map +1 -1
- package/src/lib/record/check.mjs +85 -17
- package/src/lib/record/check.mjs.map +1 -1
- package/src/lib/record/data-source.d.mts +224 -10
- package/src/lib/record/data-source.d.ts +224 -10
- package/src/lib/record/data-source.js +29 -0
- package/src/lib/record/data-source.js.map +1 -1
- package/src/lib/record/data-source.mjs +25 -0
- package/src/lib/record/data-source.mjs.map +1 -1
- package/src/lib/record/filter.js +14 -2
- package/src/lib/record/filter.js.map +1 -1
- package/src/lib/record/filter.mjs +14 -2
- package/src/lib/record/filter.mjs.map +1 -1
- package/src/lib/record/form.d.mts +186 -3
- package/src/lib/record/form.d.ts +186 -3
- package/src/lib/record/form.js +1036 -57
- package/src/lib/record/form.js.map +1 -1
- package/src/lib/record/form.mjs +1037 -60
- package/src/lib/record/form.mjs.map +1 -1
- package/src/lib/record/input-rules.d.mts +277 -0
- package/src/lib/record/input-rules.d.ts +277 -0
- package/src/lib/record/input-rules.js +724 -0
- package/src/lib/record/input-rules.js.map +1 -0
- package/src/lib/record/input-rules.mjs +705 -0
- package/src/lib/record/input-rules.mjs.map +1 -0
- package/src/lib/record/inputs.d.mts +25 -0
- package/src/lib/record/inputs.d.ts +25 -0
- package/src/lib/record/inputs.js +135 -9
- package/src/lib/record/inputs.js.map +1 -1
- package/src/lib/record/inputs.mjs +131 -9
- package/src/lib/record/inputs.mjs.map +1 -1
- package/src/lib/record/locales/ar.js +23 -2
- package/src/lib/record/locales/ar.js.map +1 -1
- package/src/lib/record/locales/ar.mjs +23 -2
- package/src/lib/record/locales/ar.mjs.map +1 -1
- package/src/lib/record/locales/de.js +23 -2
- package/src/lib/record/locales/de.js.map +1 -1
- package/src/lib/record/locales/de.mjs +23 -2
- package/src/lib/record/locales/de.mjs.map +1 -1
- package/src/lib/record/locales/fr.js +23 -2
- package/src/lib/record/locales/fr.js.map +1 -1
- package/src/lib/record/locales/fr.mjs +23 -2
- package/src/lib/record/locales/fr.mjs.map +1 -1
- package/src/lib/record/memory-data-source.d.mts +40 -3
- package/src/lib/record/memory-data-source.d.ts +40 -3
- package/src/lib/record/memory-data-source.js +171 -23
- package/src/lib/record/memory-data-source.js.map +1 -1
- package/src/lib/record/memory-data-source.mjs +171 -23
- package/src/lib/record/memory-data-source.mjs.map +1 -1
- package/src/lib/record/messages.d.mts +43 -0
- package/src/lib/record/messages.d.ts +43 -0
- package/src/lib/record/messages.js +23 -2
- package/src/lib/record/messages.js.map +1 -1
- package/src/lib/record/messages.mjs +23 -2
- package/src/lib/record/messages.mjs.map +1 -1
- package/src/lib/record/rules.js +3 -1
- package/src/lib/record/rules.js.map +1 -1
- package/src/lib/record/rules.mjs +3 -1
- package/src/lib/record/rules.mjs.map +1 -1
- package/src/lib/record/run.d.mts +53 -9
- package/src/lib/record/run.d.ts +53 -9
- package/src/lib/record/run.js +68 -21
- package/src/lib/record/run.js.map +1 -1
- package/src/lib/record/run.mjs +68 -21
- package/src/lib/record/run.mjs.map +1 -1
- package/src/lib/record/search.d.mts +8 -1
- package/src/lib/record/search.d.ts +8 -1
- package/src/lib/record/search.js +28 -8
- package/src/lib/record/search.js.map +1 -1
- package/src/lib/record/search.mjs +28 -8
- package/src/lib/record/search.mjs.map +1 -1
- package/src/lib/record/structures.d.mts +8 -3
- package/src/lib/record/structures.d.ts +8 -3
- package/src/lib/record/structures.js +51 -7
- package/src/lib/record/structures.js.map +1 -1
- package/src/lib/record/structures.mjs +48 -6
- package/src/lib/record/structures.mjs.map +1 -1
- package/src/lib/record/upload-to.d.mts +50 -0
- package/src/lib/record/upload-to.d.ts +50 -0
- package/src/lib/record/upload-to.js +117 -0
- package/src/lib/record/upload-to.js.map +1 -0
- package/src/lib/record/upload-to.mjs +114 -0
- package/src/lib/record/upload-to.mjs.map +1 -0
- package/src/lib/record/uploads.d.mts +152 -0
- package/src/lib/record/uploads.d.ts +152 -0
- package/src/lib/record/uploads.js +345 -0
- package/src/lib/record/uploads.js.map +1 -0
- package/src/lib/record/uploads.mjs +337 -0
- package/src/lib/record/uploads.mjs.map +1 -0
- package/src/lib/record/values.d.mts +6 -0
- package/src/lib/record/values.d.ts +6 -0
- package/src/lib/record/values.js.map +1 -1
- package/src/lib/record/values.mjs.map +1 -1
- package/src/runtime.d.mts +15 -8
- package/src/runtime.d.ts +15 -8
- package/src/runtime.js +48 -1
- package/src/runtime.js.map +1 -1
- package/src/runtime.mjs +12 -5
- package/src/runtime.mjs.map +1 -1
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* The React version dropped it silently, so `amount > -5` read as
|
|
7
7
|
* `amount > 5` and `a && b` read as `a b`. A minus sign is a token of its
|
|
8
8
|
* own, so `a-5` is a subtraction; the parser reads `-5` as a negative number.
|
|
9
|
+
*
|
|
10
|
+
* A number may be written in Arabic-Indic (٠-٩) or Persian (۰-۹) digits, with
|
|
11
|
+
* a point or the Arabic decimal separator (٫): "٢٫٥" is the token "2.5", as
|
|
12
|
+
* every box of Fieldia reads one. A comma is never a decimal mark here: it
|
|
13
|
+
* parts the values a function takes.
|
|
9
14
|
*/
|
|
10
15
|
export type TokenType = 'IDENTIFIER' | 'NUMBER' | 'STRING' | 'LIST' | 'OPERATOR' | 'LOGICAL' | 'CONSTANT' | 'ARITHMETIC' | 'COMMA' | 'PAREN';
|
|
11
16
|
export interface Token {
|
|
@@ -30,3 +35,10 @@ export declare const CONSTANTS: ReadonlyMap<string, boolean | null>;
|
|
|
30
35
|
* // ]
|
|
31
36
|
*/
|
|
32
37
|
export declare function tokenize(expr: string): Token[];
|
|
38
|
+
/**
|
|
39
|
+
* A list's item as a number, read as the formula reads its numbers: digits in
|
|
40
|
+
* any script, a point or ٫, a sign first ("٣" is 3, "-٢٫٥" is -2.5); null
|
|
41
|
+
* when it is none. Never hex ("0x10") or an exponent ("1e3"): they stay the
|
|
42
|
+
* words they are.
|
|
43
|
+
*/
|
|
44
|
+
export declare function listNumber(text: string): number | null;
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* The React version dropped it silently, so `amount > -5` read as
|
|
7
7
|
* `amount > 5` and `a && b` read as `a b`. A minus sign is a token of its
|
|
8
8
|
* own, so `a-5` is a subtraction; the parser reads `-5` as a negative number.
|
|
9
|
+
*
|
|
10
|
+
* A number may be written in Arabic-Indic (٠-٩) or Persian (۰-۹) digits, with
|
|
11
|
+
* a point or the Arabic decimal separator (٫): "٢٫٥" is the token "2.5", as
|
|
12
|
+
* every box of Fieldia reads one. A comma is never a decimal mark here: it
|
|
13
|
+
* parts the values a function takes.
|
|
9
14
|
*/
|
|
10
15
|
export type TokenType = 'IDENTIFIER' | 'NUMBER' | 'STRING' | 'LIST' | 'OPERATOR' | 'LOGICAL' | 'CONSTANT' | 'ARITHMETIC' | 'COMMA' | 'PAREN';
|
|
11
16
|
export interface Token {
|
|
@@ -30,3 +35,10 @@ export declare const CONSTANTS: ReadonlyMap<string, boolean | null>;
|
|
|
30
35
|
* // ]
|
|
31
36
|
*/
|
|
32
37
|
export declare function tokenize(expr: string): Token[];
|
|
38
|
+
/**
|
|
39
|
+
* A list's item as a number, read as the formula reads its numbers: digits in
|
|
40
|
+
* any script, a point or ٫, a sign first ("٣" is 3, "-٢٫٥" is -2.5); null
|
|
41
|
+
* when it is none. Never hex ("0x10") or an exponent ("1e3"): they stay the
|
|
42
|
+
* words they are.
|
|
43
|
+
*/
|
|
44
|
+
export declare function listNumber(text: string): number | null;
|
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Tokenizer for expressions: modifiers, and values worked out from others.
|
|
4
|
-
*
|
|
5
|
-
* Ported from the React form engine, with one change in behaviour: a
|
|
6
|
-
* character the language does not know is an error, not something to skip.
|
|
7
|
-
* The React version dropped it silently, so `amount > -5` read as
|
|
8
|
-
* `amount > 5` and `a && b` read as `a b`. A minus sign is a token of its
|
|
9
|
-
* own, so `a-5` is a subtraction; the parser reads `-5` as a negative number.
|
|
10
|
-
*/
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
exports.CONSTANTS = void 0;
|
|
13
4
|
exports.tokenize = tokenize;
|
|
5
|
+
exports.listNumber = listNumber;
|
|
6
|
+
const input_rules_1 = require("../record/input-rules");
|
|
14
7
|
/** The words that are values, not field names. */
|
|
15
8
|
exports.CONSTANTS = new Map([
|
|
16
9
|
['True', true],
|
|
@@ -44,7 +37,7 @@ function tokenize(expr) {
|
|
|
44
37
|
// characters before one, a number before anything else that could start
|
|
45
38
|
// with a digit. Sticky (`y`), so a position nothing matches is an error
|
|
46
39
|
// instead of a gap.
|
|
47
|
-
const token = /(\(|\)|,|==|!=|<=|>=|<>|<|>|[-+*/%]|not\s+in\b|in\b|and\b|or\b|not\b|\[[^\]]*\]|'[^']*'|"[^"]*"
|
|
40
|
+
const token = /(\(|\)|,|==|!=|<=|>=|<>|<|>|[-+*/%]|not\s+in\b|in\b|and\b|or\b|not\b|\[[^\]]*\]|'[^']*'|"[^"]*"|[\d\u0660-\u0669\u06f0-\u06f9]+[.\u066b]?[\d\u0660-\u0669\u06f0-\u06f9]*|\w+(?:\.\w+)*)/iy;
|
|
48
41
|
const space = /\s*/y;
|
|
49
42
|
let at = 0;
|
|
50
43
|
for (;;) {
|
|
@@ -58,10 +51,26 @@ function tokenize(expr) {
|
|
|
58
51
|
if (!match) {
|
|
59
52
|
throw new Error(`Unexpected "${expr[at]}" at character ${at + 1} of: ${expr}`);
|
|
60
53
|
}
|
|
61
|
-
|
|
54
|
+
const type = getTokenType(match[0]);
|
|
55
|
+
// A number in any of its scripts is read as 0-9 and a point.
|
|
56
|
+
tokens.push({ type, value: type === 'NUMBER' ? asciiNumber(match[0]) : match[0], position: tokens.length });
|
|
62
57
|
at = token.lastIndex;
|
|
63
58
|
}
|
|
64
59
|
}
|
|
60
|
+
/** A number's digits as 0-9 and its decimal mark as a point: "٢٫٥" is "2.5". */
|
|
61
|
+
function asciiNumber(text) {
|
|
62
|
+
return (0, input_rules_1.foldDigits)(text).replace('\u066b', '.');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A list's item as a number, read as the formula reads its numbers: digits in
|
|
66
|
+
* any script, a point or ٫, a sign first ("٣" is 3, "-٢٫٥" is -2.5); null
|
|
67
|
+
* when it is none. Never hex ("0x10") or an exponent ("1e3"): they stay the
|
|
68
|
+
* words they are.
|
|
69
|
+
*/
|
|
70
|
+
function listNumber(text) {
|
|
71
|
+
const plain = asciiNumber(text);
|
|
72
|
+
return /^[-+]?(\d+\.?\d*|\.\d+)$/.test(plain) ? Number(plain) : null;
|
|
73
|
+
}
|
|
65
74
|
/**
|
|
66
75
|
* Determines the type of a token based on its text value.
|
|
67
76
|
*/
|
|
@@ -101,7 +110,7 @@ function getTokenType(text) {
|
|
|
101
110
|
return 'STRING';
|
|
102
111
|
}
|
|
103
112
|
// Numbers (integer or float; a minus sign before one is its own token)
|
|
104
|
-
if (/^\d+\.?\d*$/.test(text)) {
|
|
113
|
+
if (/^\d+\.?\d*$/.test(asciiNumber(text))) {
|
|
105
114
|
return 'NUMBER';
|
|
106
115
|
}
|
|
107
116
|
// Default to identifier
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/tokenizer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/tokenizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Tokenizer for expressions: modifiers, and values worked out from others.
|
|
3
|
-
*
|
|
4
|
-
* Ported from the React form engine, with one change in behaviour: a
|
|
5
|
-
* character the language does not know is an error, not something to skip.
|
|
6
|
-
* The React version dropped it silently, so `amount > -5` read as
|
|
7
|
-
* `amount > 5` and `a && b` read as `a b`. A minus sign is a token of its
|
|
8
|
-
* own, so `a-5` is a subtraction; the parser reads `-5` as a negative number.
|
|
9
|
-
*/
|
|
1
|
+
import { foldDigits } from '../record/input-rules.mjs';
|
|
10
2
|
/** The words that are values, not field names. */
|
|
11
3
|
export const CONSTANTS = new Map([
|
|
12
4
|
['True', true],
|
|
@@ -40,7 +32,7 @@ export function tokenize(expr) {
|
|
|
40
32
|
// characters before one, a number before anything else that could start
|
|
41
33
|
// with a digit. Sticky (`y`), so a position nothing matches is an error
|
|
42
34
|
// instead of a gap.
|
|
43
|
-
const token = /(\(|\)|,|==|!=|<=|>=|<>|<|>|[-+*/%]|not\s+in\b|in\b|and\b|or\b|not\b|\[[^\]]*\]|'[^']*'|"[^"]*"
|
|
35
|
+
const token = /(\(|\)|,|==|!=|<=|>=|<>|<|>|[-+*/%]|not\s+in\b|in\b|and\b|or\b|not\b|\[[^\]]*\]|'[^']*'|"[^"]*"|[\d\u0660-\u0669\u06f0-\u06f9]+[.\u066b]?[\d\u0660-\u0669\u06f0-\u06f9]*|\w+(?:\.\w+)*)/iy;
|
|
44
36
|
const space = /\s*/y;
|
|
45
37
|
let at = 0;
|
|
46
38
|
for (;;) {
|
|
@@ -54,10 +46,26 @@ export function tokenize(expr) {
|
|
|
54
46
|
if (!match) {
|
|
55
47
|
throw new Error(`Unexpected "${expr[at]}" at character ${at + 1} of: ${expr}`);
|
|
56
48
|
}
|
|
57
|
-
|
|
49
|
+
const type = getTokenType(match[0]);
|
|
50
|
+
// A number in any of its scripts is read as 0-9 and a point.
|
|
51
|
+
tokens.push({ type, value: type === 'NUMBER' ? asciiNumber(match[0]) : match[0], position: tokens.length });
|
|
58
52
|
at = token.lastIndex;
|
|
59
53
|
}
|
|
60
54
|
}
|
|
55
|
+
/** A number's digits as 0-9 and its decimal mark as a point: "٢٫٥" is "2.5". */
|
|
56
|
+
function asciiNumber(text) {
|
|
57
|
+
return foldDigits(text).replace('\u066b', '.');
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* A list's item as a number, read as the formula reads its numbers: digits in
|
|
61
|
+
* any script, a point or ٫, a sign first ("٣" is 3, "-٢٫٥" is -2.5); null
|
|
62
|
+
* when it is none. Never hex ("0x10") or an exponent ("1e3"): they stay the
|
|
63
|
+
* words they are.
|
|
64
|
+
*/
|
|
65
|
+
export function listNumber(text) {
|
|
66
|
+
const plain = asciiNumber(text);
|
|
67
|
+
return /^[-+]?(\d+\.?\d*|\.\d+)$/.test(plain) ? Number(plain) : null;
|
|
68
|
+
}
|
|
61
69
|
/**
|
|
62
70
|
* Determines the type of a token based on its text value.
|
|
63
71
|
*/
|
|
@@ -97,7 +105,7 @@ function getTokenType(text) {
|
|
|
97
105
|
return 'STRING';
|
|
98
106
|
}
|
|
99
107
|
// Numbers (integer or float; a minus sign before one is its own token)
|
|
100
|
-
if (/^\d+\.?\d*$/.test(text)) {
|
|
108
|
+
if (/^\d+\.?\d*$/.test(asciiNumber(text))) {
|
|
101
109
|
return 'NUMBER';
|
|
102
110
|
}
|
|
103
111
|
// Default to identifier
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/tokenizer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tokenizer.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/expression/tokenizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,10 +5,11 @@ import { type PageValidation } from './references.mjs';
|
|
|
5
5
|
* condition in it, the same as `validatePage` finds them. It leaves out the
|
|
6
6
|
* key-by-key check of the format, and so the validation library, which an app
|
|
7
7
|
* showing forms need not carry; run `validatePage` where pages are made or
|
|
8
|
-
* tested. A page that passes is handed back as it is
|
|
8
|
+
* tested. A page that passes is handed back as it is — one in an older
|
|
9
|
+
* format, brought up to date (`upgradePage`). A line's own form —
|
|
9
10
|
* a page of a table's line fields — is checked with `parent`, the fields of
|
|
10
11
|
* the record the line is on, which its conditions read as `parent`.
|
|
11
12
|
*/
|
|
12
|
-
export declare function checkPage(
|
|
13
|
+
export declare function checkPage(given: unknown, options?: {
|
|
13
14
|
parent?: Record<string, Field | LineField>;
|
|
14
15
|
}): PageValidation;
|
|
@@ -5,10 +5,11 @@ import { type PageValidation } from './references';
|
|
|
5
5
|
* condition in it, the same as `validatePage` finds them. It leaves out the
|
|
6
6
|
* key-by-key check of the format, and so the validation library, which an app
|
|
7
7
|
* showing forms need not carry; run `validatePage` where pages are made or
|
|
8
|
-
* tested. A page that passes is handed back as it is
|
|
8
|
+
* tested. A page that passes is handed back as it is — one in an older
|
|
9
|
+
* format, brought up to date (`upgradePage`). A line's own form —
|
|
9
10
|
* a page of a table's line fields — is checked with `parent`, the fields of
|
|
10
11
|
* the record the line is on, which its conditions read as `parent`.
|
|
11
12
|
*/
|
|
12
|
-
export declare function checkPage(
|
|
13
|
+
export declare function checkPage(given: unknown, options?: {
|
|
13
14
|
parent?: Record<string, Field | LineField>;
|
|
14
15
|
}): PageValidation;
|
|
@@ -4,6 +4,7 @@ exports.checkPage = checkPage;
|
|
|
4
4
|
const names_1 = require("./names");
|
|
5
5
|
const references_1 = require("./references");
|
|
6
6
|
const version_1 = require("./version");
|
|
7
|
+
const upgrade_1 = require("./upgrade");
|
|
7
8
|
const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
8
9
|
const LAYOUTS = ['sheet', 'sections', 'tabs', 'wizard'];
|
|
9
10
|
/**
|
|
@@ -11,17 +12,21 @@ const LAYOUTS = ['sheet', 'sections', 'tabs', 'wizard'];
|
|
|
11
12
|
* condition in it, the same as `validatePage` finds them. It leaves out the
|
|
12
13
|
* key-by-key check of the format, and so the validation library, which an app
|
|
13
14
|
* showing forms need not carry; run `validatePage` where pages are made or
|
|
14
|
-
* tested. A page that passes is handed back as it is
|
|
15
|
+
* tested. A page that passes is handed back as it is — one in an older
|
|
16
|
+
* format, brought up to date (`upgradePage`). A line's own form —
|
|
15
17
|
* a page of a table's line fields — is checked with `parent`, the fields of
|
|
16
18
|
* the record the line is on, which its conditions read as `parent`.
|
|
17
19
|
*/
|
|
18
|
-
function checkPage(
|
|
20
|
+
function checkPage(given, options = {}) {
|
|
21
|
+
// A page in an older format is read as the current one (upgradePage); one newer than this Fieldia is said to be.
|
|
22
|
+
const input = (0, upgrade_1.upgradePage)(given);
|
|
19
23
|
if (!isObject(input))
|
|
20
24
|
return { ok: false, issues: [{ path: '(page)', message: 'a page is a JSON object' }] };
|
|
21
25
|
const issues = [];
|
|
22
26
|
const say = (path, message) => issues.push({ path, message });
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
const format = (0, version_1.formatProblem)(input['fieldia']);
|
|
28
|
+
if (format)
|
|
29
|
+
say('fieldia', format);
|
|
25
30
|
if (typeof input['id'] !== 'string' || !input['id'])
|
|
26
31
|
say('id', 'a page needs an id');
|
|
27
32
|
const data = input['data'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-page.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/check-page.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"check-page.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/check-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { FIELD_TYPES } from './names.mjs';
|
|
2
2
|
import { ReferenceCheck } from './references.mjs';
|
|
3
|
-
import {
|
|
3
|
+
import { formatProblem } from './version.mjs';
|
|
4
|
+
import { upgradePage } from './upgrade.mjs';
|
|
4
5
|
const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
5
6
|
const LAYOUTS = ['sheet', 'sections', 'tabs', 'wizard'];
|
|
6
7
|
/**
|
|
@@ -8,17 +9,21 @@ const LAYOUTS = ['sheet', 'sections', 'tabs', 'wizard'];
|
|
|
8
9
|
* condition in it, the same as `validatePage` finds them. It leaves out the
|
|
9
10
|
* key-by-key check of the format, and so the validation library, which an app
|
|
10
11
|
* showing forms need not carry; run `validatePage` where pages are made or
|
|
11
|
-
* tested. A page that passes is handed back as it is
|
|
12
|
+
* tested. A page that passes is handed back as it is — one in an older
|
|
13
|
+
* format, brought up to date (`upgradePage`). A line's own form —
|
|
12
14
|
* a page of a table's line fields — is checked with `parent`, the fields of
|
|
13
15
|
* the record the line is on, which its conditions read as `parent`.
|
|
14
16
|
*/
|
|
15
|
-
export function checkPage(
|
|
17
|
+
export function checkPage(given, options = {}) {
|
|
18
|
+
// A page in an older format is read as the current one (upgradePage); one newer than this Fieldia is said to be.
|
|
19
|
+
const input = upgradePage(given);
|
|
16
20
|
if (!isObject(input))
|
|
17
21
|
return { ok: false, issues: [{ path: '(page)', message: 'a page is a JSON object' }] };
|
|
18
22
|
const issues = [];
|
|
19
23
|
const say = (path, message) => issues.push({ path, message });
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
const format = formatProblem(input['fieldia']);
|
|
25
|
+
if (format)
|
|
26
|
+
say('fieldia', format);
|
|
22
27
|
if (typeof input['id'] !== 'string' || !input['id'])
|
|
23
28
|
say('id', 'a page needs an id');
|
|
24
29
|
const data = input['data'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-page.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/check-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAuC,MAAM,cAAc,CAAC;AACnF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"check-page.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/check-page.ts"],"names":[],"mappings":"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"}
|