@fieldia/core 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/package.json +1 -1
  2. package/schema/page.schema.json +24 -0
  3. package/src/lib/expression/parser.js +4 -4
  4. package/src/lib/expression/parser.js.map +1 -1
  5. package/src/lib/expression/parser.mjs +5 -5
  6. package/src/lib/expression/parser.mjs.map +1 -1
  7. package/src/lib/expression/tokenizer.d.mts +12 -0
  8. package/src/lib/expression/tokenizer.d.ts +12 -0
  9. package/src/lib/expression/tokenizer.js +21 -12
  10. package/src/lib/expression/tokenizer.js.map +1 -1
  11. package/src/lib/expression/tokenizer.mjs +20 -12
  12. package/src/lib/expression/tokenizer.mjs.map +1 -1
  13. package/src/lib/format/field.d.mts +16 -0
  14. package/src/lib/format/field.d.ts +16 -0
  15. package/src/lib/format/field.js +11 -1
  16. package/src/lib/format/field.js.map +1 -1
  17. package/src/lib/format/field.mjs +11 -1
  18. package/src/lib/format/field.mjs.map +1 -1
  19. package/src/lib/format/page.d.mts +18 -0
  20. package/src/lib/format/page.d.ts +18 -0
  21. package/src/lib/format/page.js +1 -0
  22. package/src/lib/format/page.js.map +1 -1
  23. package/src/lib/format/page.mjs +1 -0
  24. package/src/lib/format/page.mjs.map +1 -1
  25. package/src/lib/format/pattern.d.mts +10 -0
  26. package/src/lib/format/pattern.d.ts +10 -0
  27. package/src/lib/format/pattern.js +33 -0
  28. package/src/lib/format/pattern.js.map +1 -0
  29. package/src/lib/format/pattern.mjs +30 -0
  30. package/src/lib/format/pattern.mjs.map +1 -0
  31. package/src/lib/format/references.js +8 -0
  32. package/src/lib/format/references.js.map +1 -1
  33. package/src/lib/format/references.mjs +8 -0
  34. package/src/lib/format/references.mjs.map +1 -1
  35. package/src/lib/format/translate.js +3 -2
  36. package/src/lib/format/translate.js.map +1 -1
  37. package/src/lib/format/translate.mjs +3 -2
  38. package/src/lib/format/translate.mjs.map +1 -1
  39. package/src/lib/record/check.d.mts +13 -3
  40. package/src/lib/record/check.d.ts +13 -3
  41. package/src/lib/record/check.js +87 -17
  42. package/src/lib/record/check.js.map +1 -1
  43. package/src/lib/record/check.mjs +85 -17
  44. package/src/lib/record/check.mjs.map +1 -1
  45. package/src/lib/record/filter.js +14 -2
  46. package/src/lib/record/filter.js.map +1 -1
  47. package/src/lib/record/filter.mjs +14 -2
  48. package/src/lib/record/filter.mjs.map +1 -1
  49. package/src/lib/record/form.d.mts +44 -0
  50. package/src/lib/record/form.d.ts +44 -0
  51. package/src/lib/record/form.js +249 -20
  52. package/src/lib/record/form.js.map +1 -1
  53. package/src/lib/record/form.mjs +251 -22
  54. package/src/lib/record/form.mjs.map +1 -1
  55. package/src/lib/record/input-rules.d.mts +277 -0
  56. package/src/lib/record/input-rules.d.ts +277 -0
  57. package/src/lib/record/input-rules.js +724 -0
  58. package/src/lib/record/input-rules.js.map +1 -0
  59. package/src/lib/record/input-rules.mjs +705 -0
  60. package/src/lib/record/input-rules.mjs.map +1 -0
  61. package/src/lib/record/inputs.d.mts +25 -0
  62. package/src/lib/record/inputs.d.ts +25 -0
  63. package/src/lib/record/inputs.js +135 -9
  64. package/src/lib/record/inputs.js.map +1 -1
  65. package/src/lib/record/inputs.mjs +131 -9
  66. package/src/lib/record/inputs.mjs.map +1 -1
  67. package/src/lib/record/locales/ar.js +13 -2
  68. package/src/lib/record/locales/ar.js.map +1 -1
  69. package/src/lib/record/locales/ar.mjs +13 -2
  70. package/src/lib/record/locales/ar.mjs.map +1 -1
  71. package/src/lib/record/locales/de.js +13 -2
  72. package/src/lib/record/locales/de.js.map +1 -1
  73. package/src/lib/record/locales/de.mjs +13 -2
  74. package/src/lib/record/locales/de.mjs.map +1 -1
  75. package/src/lib/record/locales/fr.js +13 -2
  76. package/src/lib/record/locales/fr.js.map +1 -1
  77. package/src/lib/record/locales/fr.mjs +13 -2
  78. package/src/lib/record/locales/fr.mjs.map +1 -1
  79. package/src/lib/record/memory-data-source.js +7 -3
  80. package/src/lib/record/memory-data-source.js.map +1 -1
  81. package/src/lib/record/memory-data-source.mjs +7 -3
  82. package/src/lib/record/memory-data-source.mjs.map +1 -1
  83. package/src/lib/record/messages.d.mts +22 -0
  84. package/src/lib/record/messages.d.ts +22 -0
  85. package/src/lib/record/messages.js +13 -2
  86. package/src/lib/record/messages.js.map +1 -1
  87. package/src/lib/record/messages.mjs +13 -2
  88. package/src/lib/record/messages.mjs.map +1 -1
  89. package/src/lib/record/rules.js +3 -1
  90. package/src/lib/record/rules.js.map +1 -1
  91. package/src/lib/record/rules.mjs +3 -1
  92. package/src/lib/record/rules.mjs.map +1 -1
  93. package/src/lib/record/run.d.mts +3 -2
  94. package/src/lib/record/run.d.ts +3 -2
  95. package/src/lib/record/run.js +1 -1
  96. package/src/lib/record/run.js.map +1 -1
  97. package/src/lib/record/run.mjs +1 -1
  98. package/src/lib/record/run.mjs.map +1 -1
  99. package/src/lib/record/search.d.mts +8 -1
  100. package/src/lib/record/search.d.ts +8 -1
  101. package/src/lib/record/search.js +28 -8
  102. package/src/lib/record/search.js.map +1 -1
  103. package/src/lib/record/search.mjs +28 -8
  104. package/src/lib/record/search.mjs.map +1 -1
  105. package/src/lib/record/structures.d.mts +8 -3
  106. package/src/lib/record/structures.d.ts +8 -3
  107. package/src/lib/record/structures.js +51 -7
  108. package/src/lib/record/structures.js.map +1 -1
  109. package/src/lib/record/structures.mjs +48 -6
  110. package/src/lib/record/structures.mjs.map +1 -1
  111. package/src/runtime.d.mts +5 -2
  112. package/src/runtime.d.ts +5 -2
  113. package/src/runtime.js +31 -1
  114. package/src/runtime.js.map +1 -1
  115. package/src/runtime.mjs +5 -2
  116. package/src/runtime.mjs.map +1 -1
@@ -1,34 +1,54 @@
1
1
  import { fill } from './messages.mjs';
2
+ import { foldDigits, foldForSearch, readNumber, stripMarks } from './input-rules.mjs';
2
3
  const TEXT = new Set(['char', 'text', 'html']);
3
4
  const NUMBER = new Set(['integer', 'float', 'monetary']);
4
5
  const LINK = new Set(['many2one', 'many2many']);
6
+ /** What a phone number is typed with: digits in any script, spaces, a plus and ( ) . - — no letters. */
7
+ const PHONE_LIKE = /^[+\d\s().\-\u0660-\u0669\u06f0-\u06f9\uff10-\uff19]+$/;
5
8
  /**
6
9
  * The searches the typed text can be: text looked for in each text field, a
7
10
  * choice whose label it matches, a number where it is one, a link by its
8
11
  * record's name. Only the list's search fields, the columns unless it says.
12
+ *
13
+ * What is typed is read as every box reads it (FIELDIA INPUT RULES): digits in
14
+ * any script are 0-9, direction marks are dropped, and a number is read in the
15
+ * page's language (`locale`) — its grouping and decimal marks, never hex or an
16
+ * exponent. A column the list shows as a phone (`cells.<field>.widget: "phone"`)
17
+ * is searched by the typed digits in order, whatever the spacing: "3334400",
18
+ * "+٢٠ ٤٠ ٣٣٣ ٤٤٠٠" and "333 4400" all find "+20 40 333 4400".
9
19
  */
10
- export function suggestions(typed, page, list, words = { searchFor: 'Search {field} for: {text}' }) {
20
+ export function suggestions(typed, page, list, words = { searchFor: 'Search {field} for: {text}' }, locale = 'en') {
11
21
  const text = typed.trim();
12
22
  if (!text)
13
23
  return [];
24
+ /** The typed text as it is searched for: digits as 0-9, no direction marks. */
25
+ const sought = foldDigits(stripMarks(text)).trim();
14
26
  const found = [];
15
27
  for (const field of list.searchFields ?? list.columns) {
16
28
  const def = page.fields[field];
17
29
  if (!def)
18
30
  continue;
19
31
  const say = (op, value, valueLabel, label) => found.push({ field, fieldLabel: def.label, op, value, valueLabel, label: label ?? fill(words.searchFor, { field: def.label, text }) });
20
- if (TEXT.has(def.type) || LINK.has(def.type))
21
- say('ilike', text, text);
32
+ if (list.cells?.[field]?.widget === 'phone' && TEXT.has(def.type)) {
33
+ // Its digits in order, whatever lies between them: a server's ilike finds them with % between.
34
+ const digits = sought.replace(/\D/g, '');
35
+ if (PHONE_LIKE.test(stripMarks(text)) && digits)
36
+ say('ilike', digits.split('').join('%'), text);
37
+ else
38
+ say('ilike', sought, text);
39
+ }
40
+ else if (TEXT.has(def.type) || LINK.has(def.type))
41
+ say('ilike', sought, text);
22
42
  else if (def.type === 'selection') {
23
- const lower = text.toLowerCase();
43
+ const wanted = foldForSearch(text);
24
44
  for (const option of def.options)
25
- if (option.label.toLowerCase().includes(lower))
45
+ if (foldForSearch(option.label).includes(wanted))
26
46
  say('=', option.value, option.label, `${def.label}: ${option.label}`);
27
47
  }
28
48
  else if (NUMBER.has(def.type)) {
29
- const number = Number(text.replace(/[\s,]/g, ''));
30
- if (text && Number.isFinite(number))
31
- say('=', number, text);
49
+ const read = readNumber(text, locale);
50
+ if (read.ok && read.value !== null)
51
+ say('=', read.value, text);
32
52
  }
33
53
  }
34
54
  // Text fields first, then the choices, then the links: the order a person looks in.
@@ -1 +1 @@
1
- {"version":3,"file":"search.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/search.ts"],"names":[],"mappings":"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"}
@@ -5,10 +5,15 @@ import type { Value } from './values.mjs';
5
5
  /**
6
6
  * What a structure's widget asks of its answer beyond Required: an address
7
7
  * (`json.address`) its parts in `options.requiredParts` filled — the first
8
- * missing one named — and a table of lines or a repeating group as few lines
9
- * as `options.min` and as many as `options.max`, once it has any. Undefined
10
- * when it keeps them, or when there is nothing to check.
8
+ * missing one named — and its postcode of its country's shape where that is
9
+ * known; and a table of lines or a repeating group as few lines as
10
+ * `options.min` and as many as `options.max`, once it has any. Undefined when
11
+ * it keeps them, or when there is nothing to check.
11
12
  */
12
13
  /** An address's parts, in the order its boxes and its messages name them. */
13
14
  export declare const ADDRESS_PARTS: readonly ["street", "line2", "city", "region", "postcode", "country"];
15
+ /** A postcode as it is kept: digits in any script as 0-9, no direction marks, no spaces at its ends. */
16
+ export declare const settledPostcode: (text: string) => string;
17
+ /** Whether a postcode is of its country's shape: null when the country's shape is not known, or there is no postcode. */
18
+ export declare function postcodeFits(country: unknown, postcode: unknown): boolean | null;
14
19
  export declare function checkStructure(field: Field, node: FieldNode, value: Value | undefined, messages: Messages): string | undefined;
@@ -5,10 +5,15 @@ import type { Value } from './values';
5
5
  /**
6
6
  * What a structure's widget asks of its answer beyond Required: an address
7
7
  * (`json.address`) its parts in `options.requiredParts` filled — the first
8
- * missing one named — and a table of lines or a repeating group as few lines
9
- * as `options.min` and as many as `options.max`, once it has any. Undefined
10
- * when it keeps them, or when there is nothing to check.
8
+ * missing one named — and its postcode of its country's shape where that is
9
+ * known; and a table of lines or a repeating group as few lines as
10
+ * `options.min` and as many as `options.max`, once it has any. Undefined when
11
+ * it keeps them, or when there is nothing to check.
11
12
  */
12
13
  /** An address's parts, in the order its boxes and its messages name them. */
13
14
  export declare const ADDRESS_PARTS: readonly ["street", "line2", "city", "region", "postcode", "country"];
15
+ /** A postcode as it is kept: digits in any script as 0-9, no direction marks, no spaces at its ends. */
16
+ export declare const settledPostcode: (text: string) => string;
17
+ /** Whether a postcode is of its country's shape: null when the country's shape is not known, or there is no postcode. */
18
+ export declare function postcodeFits(country: unknown, postcode: unknown): boolean | null;
14
19
  export declare function checkStructure(field: Field, node: FieldNode, value: Value | undefined, messages: Messages): string | undefined;
@@ -1,17 +1,54 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ADDRESS_PARTS = void 0;
3
+ exports.settledPostcode = exports.ADDRESS_PARTS = void 0;
4
+ exports.postcodeFits = postcodeFits;
4
5
  exports.checkStructure = checkStructure;
6
+ const input_rules_1 = require("./input-rules");
5
7
  const messages_1 = require("./messages");
6
8
  /**
7
9
  * What a structure's widget asks of its answer beyond Required: an address
8
10
  * (`json.address`) its parts in `options.requiredParts` filled — the first
9
- * missing one named — and a table of lines or a repeating group as few lines
10
- * as `options.min` and as many as `options.max`, once it has any. Undefined
11
- * when it keeps them, or when there is nothing to check.
11
+ * missing one named — and its postcode of its country's shape where that is
12
+ * known; and a table of lines or a repeating group as few lines as
13
+ * `options.min` and as many as `options.max`, once it has any. Undefined when
14
+ * it keeps them, or when there is nothing to check.
12
15
  */
13
16
  /** An address's parts, in the order its boxes and its messages name them. */
14
17
  exports.ADDRESS_PARTS = ['street', 'line2', 'city', 'region', 'postcode', 'country'];
18
+ /**
19
+ * A postcode's shape by its country, where it is known: how many digits, and
20
+ * one as the country writes it. Egypt's, Saudi Arabia's, Kuwait's and
21
+ * Jordan's have five; Bahrain's three or four; Oman's three. Others are not
22
+ * checked.
23
+ */
24
+ const POSTCODES = {
25
+ EG: { least: 5, most: 5, example: '11511' },
26
+ SA: { least: 5, most: 5, example: '12271' },
27
+ KW: { least: 5, most: 5, example: '13001' },
28
+ JO: { least: 5, most: 5, example: '11118' },
29
+ BH: { least: 3, most: 4, example: '317' },
30
+ OM: { least: 3, most: 3, example: '112' },
31
+ };
32
+ /** A postcode as it is kept: digits in any script as 0-9, no direction marks, no spaces at its ends. */
33
+ const settledPostcode = (text) => (0, input_rules_1.foldDigits)((0, input_rules_1.stripMarks)(text)).trim();
34
+ exports.settledPostcode = settledPostcode;
35
+ /** Whether a postcode is of its country's shape: null when the country's shape is not known, or there is no postcode. */
36
+ function postcodeFits(country, postcode) {
37
+ const shape = typeof country === 'string' ? POSTCODES[country.toUpperCase()] : undefined;
38
+ if (!shape || typeof postcode !== 'string' || !postcode.trim())
39
+ return null;
40
+ const digits = (0, exports.settledPostcode)(postcode);
41
+ return /^[0-9]+$/.test(digits) && digits.length >= shape.least && digits.length <= shape.most;
42
+ }
43
+ /** A country's name in a language, by its code: Egypt, مصر, Égypte, Ägypten. */
44
+ function countryName(code, locale) {
45
+ try {
46
+ return new Intl.DisplayNames([locale], { type: 'region' }).of(code) ?? code;
47
+ }
48
+ catch {
49
+ return code;
50
+ }
51
+ }
15
52
  function checkStructure(field, node, value, messages) {
16
53
  const options = node.options ?? {};
17
54
  const label = node.label ?? field.label;
@@ -21,12 +58,19 @@ function checkStructure(field, node, value, messages) {
21
58
  if (typeof options['max'] === 'number' && value.length > options['max'])
22
59
  return (0, messages_1.fill)(messages.maxLines, { label, max: options['max'] });
23
60
  }
24
- const needed = options['requiredParts'];
25
- if (node.widget !== 'address' || !Array.isArray(needed) || !value || typeof value !== 'object' || Array.isArray(value))
61
+ const needed = Array.isArray(options['requiredParts']) ? options['requiredParts'] : [];
62
+ if (node.widget !== 'address' || !value || typeof value !== 'object' || Array.isArray(value))
26
63
  return undefined;
27
64
  const asked = Array.isArray(options['parts']) ? options['parts'] : exports.ADDRESS_PARTS;
28
65
  const parts = value;
29
66
  const missing = exports.ADDRESS_PARTS.findIndex((part) => needed.includes(part) && asked.includes(part) && !String(parts[part] ?? '').trim());
30
- return missing < 0 ? undefined : (0, messages_1.fill)(messages.required, { label: messages.addressParts.split('|')[missing] });
67
+ if (missing >= 0)
68
+ return (0, messages_1.fill)(messages.required, { label: messages.addressParts.split('|')[missing] });
69
+ if (postcodeFits(parts['country'], parts['postcode']) !== false)
70
+ return undefined;
71
+ const country = String(parts['country']).toUpperCase();
72
+ const shape = POSTCODES[country];
73
+ const n = shape.least === shape.most ? shape.least : `${shape.least}–${shape.most}`;
74
+ return (0, messages_1.fill)(messages.postcode, { label, country: countryName(country, messages.locale), n, example: shape.example });
31
75
  }
32
76
  //# sourceMappingURL=structures.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"structures.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/structures.ts"],"names":[],"mappings":";;;AAgBA,wCAaC;AA3BD,yCAAiD;AAGjD;;;;;;GAMG;AAEH,6EAA6E;AAChE,QAAA,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAU,CAAC;AAEnG,SAAgB,cAAc,CAAC,KAAY,EAAE,IAAe,EAAE,KAAwB,EAAE,QAAkB;IACxG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IACxC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACtE,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAA,eAAI,EAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxI,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAA,eAAI,EAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1I,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzI,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,qBAAa,CAAC;IACjF,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,MAAM,OAAO,GAAG,qBAAa,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtI,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,eAAI,EAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACjH,CAAC"}
1
+ {"version":3,"file":"structures.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/structures.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,48 @@
1
+ import { foldDigits, stripMarks } from './input-rules.mjs';
1
2
  import { fill } from './messages.mjs';
2
3
  /**
3
4
  * What a structure's widget asks of its answer beyond Required: an address
4
5
  * (`json.address`) its parts in `options.requiredParts` filled — the first
5
- * missing one named — and a table of lines or a repeating group as few lines
6
- * as `options.min` and as many as `options.max`, once it has any. Undefined
7
- * when it keeps them, or when there is nothing to check.
6
+ * missing one named — and its postcode of its country's shape where that is
7
+ * known; and a table of lines or a repeating group as few lines as
8
+ * `options.min` and as many as `options.max`, once it has any. Undefined when
9
+ * it keeps them, or when there is nothing to check.
8
10
  */
9
11
  /** An address's parts, in the order its boxes and its messages name them. */
10
12
  export const ADDRESS_PARTS = ['street', 'line2', 'city', 'region', 'postcode', 'country'];
13
+ /**
14
+ * A postcode's shape by its country, where it is known: how many digits, and
15
+ * one as the country writes it. Egypt's, Saudi Arabia's, Kuwait's and
16
+ * Jordan's have five; Bahrain's three or four; Oman's three. Others are not
17
+ * checked.
18
+ */
19
+ const POSTCODES = {
20
+ EG: { least: 5, most: 5, example: '11511' },
21
+ SA: { least: 5, most: 5, example: '12271' },
22
+ KW: { least: 5, most: 5, example: '13001' },
23
+ JO: { least: 5, most: 5, example: '11118' },
24
+ BH: { least: 3, most: 4, example: '317' },
25
+ OM: { least: 3, most: 3, example: '112' },
26
+ };
27
+ /** A postcode as it is kept: digits in any script as 0-9, no direction marks, no spaces at its ends. */
28
+ export const settledPostcode = (text) => foldDigits(stripMarks(text)).trim();
29
+ /** Whether a postcode is of its country's shape: null when the country's shape is not known, or there is no postcode. */
30
+ export function postcodeFits(country, postcode) {
31
+ const shape = typeof country === 'string' ? POSTCODES[country.toUpperCase()] : undefined;
32
+ if (!shape || typeof postcode !== 'string' || !postcode.trim())
33
+ return null;
34
+ const digits = settledPostcode(postcode);
35
+ return /^[0-9]+$/.test(digits) && digits.length >= shape.least && digits.length <= shape.most;
36
+ }
37
+ /** A country's name in a language, by its code: Egypt, مصر, Égypte, Ägypten. */
38
+ function countryName(code, locale) {
39
+ try {
40
+ return new Intl.DisplayNames([locale], { type: 'region' }).of(code) ?? code;
41
+ }
42
+ catch {
43
+ return code;
44
+ }
45
+ }
11
46
  export function checkStructure(field, node, value, messages) {
12
47
  const options = node.options ?? {};
13
48
  const label = node.label ?? field.label;
@@ -17,12 +52,19 @@ export function checkStructure(field, node, value, messages) {
17
52
  if (typeof options['max'] === 'number' && value.length > options['max'])
18
53
  return fill(messages.maxLines, { label, max: options['max'] });
19
54
  }
20
- const needed = options['requiredParts'];
21
- if (node.widget !== 'address' || !Array.isArray(needed) || !value || typeof value !== 'object' || Array.isArray(value))
55
+ const needed = Array.isArray(options['requiredParts']) ? options['requiredParts'] : [];
56
+ if (node.widget !== 'address' || !value || typeof value !== 'object' || Array.isArray(value))
22
57
  return undefined;
23
58
  const asked = Array.isArray(options['parts']) ? options['parts'] : ADDRESS_PARTS;
24
59
  const parts = value;
25
60
  const missing = ADDRESS_PARTS.findIndex((part) => needed.includes(part) && asked.includes(part) && !String(parts[part] ?? '').trim());
26
- return missing < 0 ? undefined : fill(messages.required, { label: messages.addressParts.split('|')[missing] });
61
+ if (missing >= 0)
62
+ return fill(messages.required, { label: messages.addressParts.split('|')[missing] });
63
+ if (postcodeFits(parts['country'], parts['postcode']) !== false)
64
+ return undefined;
65
+ const country = String(parts['country']).toUpperCase();
66
+ const shape = POSTCODES[country];
67
+ const n = shape.least === shape.most ? shape.least : `${shape.least}–${shape.most}`;
68
+ return fill(messages.postcode, { label, country: countryName(country, messages.locale), n, example: shape.example });
27
69
  }
28
70
  //# sourceMappingURL=structures.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"structures.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/structures.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAiB,MAAM,YAAY,CAAC;AAGjD;;;;;;GAMG;AAEH,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAU,CAAC;AAEnG,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,IAAe,EAAE,KAAwB,EAAE,QAAkB;IACxG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IACxC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACtE,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxI,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1I,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzI,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACjF,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtI,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AACjH,CAAC"}
1
+ {"version":3,"file":"structures.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/structures.ts"],"names":[],"mappings":"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"}
package/src/runtime.d.mts CHANGED
@@ -27,7 +27,7 @@ export { rolesAllow } from './lib/record/roles.mjs';
27
27
  export type { CellState, FieldTone, LineState } from './lib/record/cells.mjs';
28
28
  export { evaluateModifier, isModifierValid } from './lib/expression/evaluateModifier.mjs';
29
29
  export { emptyValue, initialValues, isEmpty, expressionContext, lineKind, type RecordId, type RelatedRecord, type ReferenceValue, type FileValue, type Line, type Value, type Values, } from './lib/record/values.mjs';
30
- export { checkValue, formatBytes, fileProblem, describeTypes } from './lib/record/check.mjs';
30
+ export { checkValue, checkProperties, decimalsWords, formatBytes, fileProblem, describeTypes } from './lib/record/check.mjs';
31
31
  export { scoreOf, type Score } from './lib/record/score.mjs';
32
32
  export type { DataSource, LoadRequest, SaveRequest, SaveResult, OnchangeRequest, OnchangeResult, SearchRequest, CreateRequest, SubmitRequest, SubmitResult, ResolvedFilterCondition, ResolvedFilter, RecordChanges, LineOp, LinkOp, SaveProblem, SortOrder, ListRequest, ListResult, GroupRequest, Group, OptionsRequest, RecordRequest, ArchiveRequest, } from './lib/record/data-source.mjs';
33
33
  export { saveRefused, saveProblemOf } from './lib/record/data-source.mjs';
@@ -38,5 +38,8 @@ export { hostScheduler, wait, type Scheduler } from './lib/record/scheduler.mjs'
38
38
  export { createForm, type Form, type FormOptions, type FormUser, type FormState, type FormStatus, type NodeState, type Choices, type Definitions, type DraftStore, type ActionRequest, type ChangeBy, type FormEvents, } from './lib/record/form.mjs';
39
39
  export type { ActionHost, ActionResult, ChosenLines, OnAction, OpenRequest, OpenResult, PostedMessage, RunContext, RunResult, RunStop } from './lib/record/run.mjs';
40
40
  export { MESSAGES, fill, type Messages, type Locale } from './lib/record/messages.mjs';
41
+ export { stripMarks, foldDigits, oneLine, charCount, foldForSearch, numberMarks, readNumber, couldBeNumber, numberMisfit, cleanPastedNumber, readDuration, readDate, couldBeMonth, readTime, placesOfCurrency, placesOf, MOST_DIGITS, type NumberMarks, type NumberProblem, type NumberReading, type NumberRead, type NumberReadOptions, type NumberLimits, type NumberRefusal, type PastedNumber, type DurationProblem, type DurationRead, type DateOrder, type DateProblem, type DateRead, type TimeRead, } from './lib/record/input-rules.mjs';
41
42
  export { dayOf } from './lib/record/limits.mjs';
42
- export { ADDRESS_PARTS } from './lib/record/structures.mjs';
43
+ export { ADDRESS_PARTS, postcodeFits, settledPostcode } from './lib/record/structures.mjs';
44
+ export { webAddress, settledText, hasPattern, EMAIL_LOCAL_STRAYS } from './lib/record/inputs.mjs';
45
+ export { fieldPattern } from './lib/format/pattern.mjs';
package/src/runtime.d.ts CHANGED
@@ -27,7 +27,7 @@ export { rolesAllow } from './lib/record/roles';
27
27
  export type { CellState, FieldTone, LineState } from './lib/record/cells';
28
28
  export { evaluateModifier, isModifierValid } from './lib/expression/evaluateModifier';
29
29
  export { emptyValue, initialValues, isEmpty, expressionContext, lineKind, type RecordId, type RelatedRecord, type ReferenceValue, type FileValue, type Line, type Value, type Values, } from './lib/record/values';
30
- export { checkValue, formatBytes, fileProblem, describeTypes } from './lib/record/check';
30
+ export { checkValue, checkProperties, decimalsWords, formatBytes, fileProblem, describeTypes } from './lib/record/check';
31
31
  export { scoreOf, type Score } from './lib/record/score';
32
32
  export type { DataSource, LoadRequest, SaveRequest, SaveResult, OnchangeRequest, OnchangeResult, SearchRequest, CreateRequest, SubmitRequest, SubmitResult, ResolvedFilterCondition, ResolvedFilter, RecordChanges, LineOp, LinkOp, SaveProblem, SortOrder, ListRequest, ListResult, GroupRequest, Group, OptionsRequest, RecordRequest, ArchiveRequest, } from './lib/record/data-source';
33
33
  export { saveRefused, saveProblemOf } from './lib/record/data-source';
@@ -38,5 +38,8 @@ export { hostScheduler, wait, type Scheduler } from './lib/record/scheduler';
38
38
  export { createForm, type Form, type FormOptions, type FormUser, type FormState, type FormStatus, type NodeState, type Choices, type Definitions, type DraftStore, type ActionRequest, type ChangeBy, type FormEvents, } from './lib/record/form';
39
39
  export type { ActionHost, ActionResult, ChosenLines, OnAction, OpenRequest, OpenResult, PostedMessage, RunContext, RunResult, RunStop } from './lib/record/run';
40
40
  export { MESSAGES, fill, type Messages, type Locale } from './lib/record/messages';
41
+ export { stripMarks, foldDigits, oneLine, charCount, foldForSearch, numberMarks, readNumber, couldBeNumber, numberMisfit, cleanPastedNumber, readDuration, readDate, couldBeMonth, readTime, placesOfCurrency, placesOf, MOST_DIGITS, type NumberMarks, type NumberProblem, type NumberReading, type NumberRead, type NumberReadOptions, type NumberLimits, type NumberRefusal, type PastedNumber, type DurationProblem, type DurationRead, type DateOrder, type DateProblem, type DateRead, type TimeRead, } from './lib/record/input-rules';
41
42
  export { dayOf } from './lib/record/limits';
42
- export { ADDRESS_PARTS } from './lib/record/structures';
43
+ export { ADDRESS_PARTS, postcodeFits, settledPostcode } from './lib/record/structures';
44
+ export { webAddress, settledText, hasPattern, EMAIL_LOCAL_STRAYS } from './lib/record/inputs';
45
+ export { fieldPattern } from './lib/format/pattern';
package/src/runtime.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ADDRESS_PARTS = exports.dayOf = exports.fill = exports.MESSAGES = exports.createForm = exports.wait = exports.hostScheduler = exports.createMemoryDataSource = exports.groupByFields = exports.facetsToFilter = exports.suggestions = exports.matchesFilter = exports.saveProblemOf = exports.saveRefused = exports.scoreOf = exports.describeTypes = exports.fileProblem = exports.formatBytes = exports.checkValue = exports.lineKind = exports.expressionContext = exports.isEmpty = exports.initialValues = exports.emptyValue = exports.isModifierValid = exports.evaluateModifier = exports.rolesAllow = exports.compileModifier = exports.isRightToLeft = exports.pageWords = exports.localizePage = exports.translatePage = exports.hotkeyWords = exports.HOTKEY = exports.BROWSER_HOTKEYS = exports.valuesIn = exports.splitValues = exports.fillValues = exports.checkPage = exports.PART_LOOKS = exports.SKINS = exports.THEMES = exports.FORMAT_VERSION = exports.cardPart = exports.cardLineFields = exports.cardLines = exports.wideColumns = exports.FIELD_TYPES = exports.FIELD_NAME = void 0;
3
+ exports.stripMarks = exports.fill = exports.MESSAGES = exports.createForm = exports.wait = exports.hostScheduler = exports.createMemoryDataSource = exports.groupByFields = exports.facetsToFilter = exports.suggestions = exports.matchesFilter = exports.saveProblemOf = exports.saveRefused = exports.scoreOf = exports.describeTypes = exports.fileProblem = exports.formatBytes = exports.decimalsWords = exports.checkProperties = exports.checkValue = exports.lineKind = exports.expressionContext = exports.isEmpty = exports.initialValues = exports.emptyValue = exports.isModifierValid = exports.evaluateModifier = exports.rolesAllow = exports.compileModifier = exports.isRightToLeft = exports.pageWords = exports.localizePage = exports.translatePage = exports.hotkeyWords = exports.HOTKEY = exports.BROWSER_HOTKEYS = exports.valuesIn = exports.splitValues = exports.fillValues = exports.checkPage = exports.PART_LOOKS = exports.SKINS = exports.THEMES = exports.FORMAT_VERSION = exports.cardPart = exports.cardLineFields = exports.cardLines = exports.wideColumns = exports.FIELD_TYPES = exports.FIELD_NAME = void 0;
4
+ exports.fieldPattern = exports.EMAIL_LOCAL_STRAYS = exports.hasPattern = exports.settledText = exports.webAddress = exports.settledPostcode = exports.postcodeFits = exports.ADDRESS_PARTS = exports.dayOf = exports.MOST_DIGITS = exports.placesOf = exports.placesOfCurrency = exports.readTime = exports.couldBeMonth = exports.readDate = exports.readDuration = exports.cleanPastedNumber = exports.numberMisfit = exports.couldBeNumber = exports.readNumber = exports.numberMarks = exports.foldForSearch = exports.charCount = exports.oneLine = exports.foldDigits = void 0;
4
5
  var names_1 = require("./lib/format/names");
5
6
  Object.defineProperty(exports, "FIELD_NAME", { enumerable: true, get: function () { return names_1.FIELD_NAME; } });
6
7
  Object.defineProperty(exports, "FIELD_TYPES", { enumerable: true, get: function () { return names_1.FIELD_TYPES; } });
@@ -48,6 +49,8 @@ Object.defineProperty(exports, "expressionContext", { enumerable: true, get: fun
48
49
  Object.defineProperty(exports, "lineKind", { enumerable: true, get: function () { return values_1.lineKind; } });
49
50
  var check_1 = require("./lib/record/check");
50
51
  Object.defineProperty(exports, "checkValue", { enumerable: true, get: function () { return check_1.checkValue; } });
52
+ Object.defineProperty(exports, "checkProperties", { enumerable: true, get: function () { return check_1.checkProperties; } });
53
+ Object.defineProperty(exports, "decimalsWords", { enumerable: true, get: function () { return check_1.decimalsWords; } });
51
54
  Object.defineProperty(exports, "formatBytes", { enumerable: true, get: function () { return check_1.formatBytes; } });
52
55
  Object.defineProperty(exports, "fileProblem", { enumerable: true, get: function () { return check_1.fileProblem; } });
53
56
  Object.defineProperty(exports, "describeTypes", { enumerable: true, get: function () { return check_1.describeTypes; } });
@@ -72,8 +75,35 @@ Object.defineProperty(exports, "createForm", { enumerable: true, get: function (
72
75
  var messages_1 = require("./lib/record/messages");
73
76
  Object.defineProperty(exports, "MESSAGES", { enumerable: true, get: function () { return messages_1.MESSAGES; } });
74
77
  Object.defineProperty(exports, "fill", { enumerable: true, get: function () { return messages_1.fill; } });
78
+ var input_rules_1 = require("./lib/record/input-rules");
79
+ Object.defineProperty(exports, "stripMarks", { enumerable: true, get: function () { return input_rules_1.stripMarks; } });
80
+ Object.defineProperty(exports, "foldDigits", { enumerable: true, get: function () { return input_rules_1.foldDigits; } });
81
+ Object.defineProperty(exports, "oneLine", { enumerable: true, get: function () { return input_rules_1.oneLine; } });
82
+ Object.defineProperty(exports, "charCount", { enumerable: true, get: function () { return input_rules_1.charCount; } });
83
+ Object.defineProperty(exports, "foldForSearch", { enumerable: true, get: function () { return input_rules_1.foldForSearch; } });
84
+ Object.defineProperty(exports, "numberMarks", { enumerable: true, get: function () { return input_rules_1.numberMarks; } });
85
+ Object.defineProperty(exports, "readNumber", { enumerable: true, get: function () { return input_rules_1.readNumber; } });
86
+ Object.defineProperty(exports, "couldBeNumber", { enumerable: true, get: function () { return input_rules_1.couldBeNumber; } });
87
+ Object.defineProperty(exports, "numberMisfit", { enumerable: true, get: function () { return input_rules_1.numberMisfit; } });
88
+ Object.defineProperty(exports, "cleanPastedNumber", { enumerable: true, get: function () { return input_rules_1.cleanPastedNumber; } });
89
+ Object.defineProperty(exports, "readDuration", { enumerable: true, get: function () { return input_rules_1.readDuration; } });
90
+ Object.defineProperty(exports, "readDate", { enumerable: true, get: function () { return input_rules_1.readDate; } });
91
+ Object.defineProperty(exports, "couldBeMonth", { enumerable: true, get: function () { return input_rules_1.couldBeMonth; } });
92
+ Object.defineProperty(exports, "readTime", { enumerable: true, get: function () { return input_rules_1.readTime; } });
93
+ Object.defineProperty(exports, "placesOfCurrency", { enumerable: true, get: function () { return input_rules_1.placesOfCurrency; } });
94
+ Object.defineProperty(exports, "placesOf", { enumerable: true, get: function () { return input_rules_1.placesOf; } });
95
+ Object.defineProperty(exports, "MOST_DIGITS", { enumerable: true, get: function () { return input_rules_1.MOST_DIGITS; } });
75
96
  var limits_1 = require("./lib/record/limits");
76
97
  Object.defineProperty(exports, "dayOf", { enumerable: true, get: function () { return limits_1.dayOf; } });
77
98
  var structures_1 = require("./lib/record/structures");
78
99
  Object.defineProperty(exports, "ADDRESS_PARTS", { enumerable: true, get: function () { return structures_1.ADDRESS_PARTS; } });
100
+ Object.defineProperty(exports, "postcodeFits", { enumerable: true, get: function () { return structures_1.postcodeFits; } });
101
+ Object.defineProperty(exports, "settledPostcode", { enumerable: true, get: function () { return structures_1.settledPostcode; } });
102
+ var inputs_1 = require("./lib/record/inputs");
103
+ Object.defineProperty(exports, "webAddress", { enumerable: true, get: function () { return inputs_1.webAddress; } });
104
+ Object.defineProperty(exports, "settledText", { enumerable: true, get: function () { return inputs_1.settledText; } });
105
+ Object.defineProperty(exports, "hasPattern", { enumerable: true, get: function () { return inputs_1.hasPattern; } });
106
+ Object.defineProperty(exports, "EMAIL_LOCAL_STRAYS", { enumerable: true, get: function () { return inputs_1.EMAIL_LOCAL_STRAYS; } });
107
+ var pattern_1 = require("./lib/format/pattern");
108
+ Object.defineProperty(exports, "fieldPattern", { enumerable: true, get: function () { return pattern_1.fieldPattern; } });
79
109
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../libs/core/src/runtime.ts"],"names":[],"mappings":";;;AAMA,4CAA6E;AAApE,mGAAA,UAAU,OAAA;AAAE,oGAAA,WAAW,OAAA;AAmEhC,gDAAmD;AAA1C,sGAAA,WAAW,OAAA;AACpB,sDAAiG;AAAxF,uGAAA,SAAS,OAAA;AAAE,4GAAA,cAAc,OAAA;AAAE,sGAAA,QAAQ,OAAA;AA0B5C,gDAAsD;AAA7C,yGAAA,cAAc,OAAA;AAEvB,8CAAyD;AAAhD,gGAAA,MAAM,OAAA;AACf,8CAAuD;AAA9C,+FAAA,KAAK,OAAA;AACd,oDAAsG;AAA7F,uGAAA,UAAU,OAAA;AACnB,sDAAoD;AAA3C,uGAAA,SAAS,OAAA;AAClB,4CAAuE;AAA9D,mGAAA,UAAU,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,iGAAA,QAAQ,OAAA;AAC1C,gDAA4E;AAAnE,0GAAA,eAAe,OAAA;AAAE,iGAAA,MAAM,OAAA;AAAE,sGAAA,WAAW,OAAA;AAE7C,oDAA+F;AAAtF,0GAAA,aAAa,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,sGAAA,SAAS,OAAA;AAAE,0GAAA,aAAa,OAAA;AAC9D,sDAAmF;AAA1E,2GAAA,eAAe,OAAA;AACxB,4CAAgD;AAAvC,mGAAA,UAAU,OAAA;AAEnB,sEAAsF;AAA7E,oHAAA,gBAAgB,OAAA;AAAE,mHAAA,eAAe,OAAA;AAC1C,8CAa6B;AAZ3B,oGAAA,UAAU,OAAA;AACV,uGAAA,aAAa,OAAA;AACb,iGAAA,OAAO,OAAA;AACP,2GAAA,iBAAiB,OAAA;AACjB,kGAAA,QAAQ,OAAA;AASV,4CAAyF;AAAhF,mGAAA,UAAU,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,sGAAA,aAAa,OAAA;AAC5D,4CAAyD;AAAhD,gGAAA,OAAO,OAAA;AA2BhB,wDAAsE;AAA7D,0GAAA,WAAW,OAAA;AAAE,4GAAA,aAAa,OAAA;AACnC,8CAAoD;AAA3C,uGAAA,aAAa,OAAA;AACtB,8CAA8G;AAArG,qGAAA,WAAW,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,uGAAA,aAAa,OAAA;AACnD,sEAA8H;AAArH,4HAAA,sBAAsB,OAAA;AAC/B,oDAA6E;AAApE,0GAAA,aAAa,OAAA;AAAE,iGAAA,IAAI,OAAA;AAC5B,0CAc2B;AAbzB,kGAAA,UAAU,OAAA;AAeZ,kDAAmF;AAA1E,oGAAA,QAAQ,OAAA;AAAE,gGAAA,IAAI,OAAA;AACvB,8CAA4C;AAAnC,+FAAA,KAAK,OAAA;AACd,sDAAwD;AAA/C,2GAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../../libs/core/src/runtime.ts"],"names":[],"mappings":";;;;AAMA,4CAA6E;AAApE,mGAAA,UAAU,OAAA;AAAE,oGAAA,WAAW,OAAA;AAmEhC,gDAAmD;AAA1C,sGAAA,WAAW,OAAA;AACpB,sDAAiG;AAAxF,uGAAA,SAAS,OAAA;AAAE,4GAAA,cAAc,OAAA;AAAE,sGAAA,QAAQ,OAAA;AA0B5C,gDAAsD;AAA7C,yGAAA,cAAc,OAAA;AAEvB,8CAAyD;AAAhD,gGAAA,MAAM,OAAA;AACf,8CAAuD;AAA9C,+FAAA,KAAK,OAAA;AACd,oDAAsG;AAA7F,uGAAA,UAAU,OAAA;AACnB,sDAAoD;AAA3C,uGAAA,SAAS,OAAA;AAClB,4CAAuE;AAA9D,mGAAA,UAAU,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,iGAAA,QAAQ,OAAA;AAC1C,gDAA4E;AAAnE,0GAAA,eAAe,OAAA;AAAE,iGAAA,MAAM,OAAA;AAAE,sGAAA,WAAW,OAAA;AAE7C,oDAA+F;AAAtF,0GAAA,aAAa,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,sGAAA,SAAS,OAAA;AAAE,0GAAA,aAAa,OAAA;AAC9D,sDAAmF;AAA1E,2GAAA,eAAe,OAAA;AACxB,4CAAgD;AAAvC,mGAAA,UAAU,OAAA;AAEnB,sEAAsF;AAA7E,oHAAA,gBAAgB,OAAA;AAAE,mHAAA,eAAe,OAAA;AAC1C,8CAa6B;AAZ3B,oGAAA,UAAU,OAAA;AACV,uGAAA,aAAa,OAAA;AACb,iGAAA,OAAO,OAAA;AACP,2GAAA,iBAAiB,OAAA;AACjB,kGAAA,QAAQ,OAAA;AASV,4CAAyH;AAAhH,mGAAA,UAAU,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,sGAAA,aAAa,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,sGAAA,aAAa,OAAA;AAC5F,4CAAyD;AAAhD,gGAAA,OAAO,OAAA;AA2BhB,wDAAsE;AAA7D,0GAAA,WAAW,OAAA;AAAE,4GAAA,aAAa,OAAA;AACnC,8CAAoD;AAA3C,uGAAA,aAAa,OAAA;AACtB,8CAA8G;AAArG,qGAAA,WAAW,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,uGAAA,aAAa,OAAA;AACnD,sEAA8H;AAArH,4HAAA,sBAAsB,OAAA;AAC/B,oDAA6E;AAApE,0GAAA,aAAa,OAAA;AAAE,iGAAA,IAAI,OAAA;AAC5B,0CAc2B;AAbzB,kGAAA,UAAU,OAAA;AAeZ,kDAAmF;AAA1E,oGAAA,QAAQ,OAAA;AAAE,gGAAA,IAAI,OAAA;AACvB,wDAgCkC;AA/BhC,yGAAA,UAAU,OAAA;AACV,yGAAA,UAAU,OAAA;AACV,sGAAA,OAAO,OAAA;AACP,wGAAA,SAAS,OAAA;AACT,4GAAA,aAAa,OAAA;AACb,0GAAA,WAAW,OAAA;AACX,yGAAA,UAAU,OAAA;AACV,4GAAA,aAAa,OAAA;AACb,2GAAA,YAAY,OAAA;AACZ,gHAAA,iBAAiB,OAAA;AACjB,2GAAA,YAAY,OAAA;AACZ,uGAAA,QAAQ,OAAA;AACR,2GAAA,YAAY,OAAA;AACZ,uGAAA,QAAQ,OAAA;AACR,+GAAA,gBAAgB,OAAA;AAChB,uGAAA,QAAQ,OAAA;AACR,0GAAA,WAAW,OAAA;AAgBb,8CAA4C;AAAnC,+FAAA,KAAK,OAAA;AACd,sDAAuF;AAA9E,2GAAA,aAAa,OAAA;AAAE,0GAAA,YAAY,OAAA;AAAE,6GAAA,eAAe,OAAA;AACrD,8CAA8F;AAArF,oGAAA,UAAU,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAChE,gDAAoD;AAA3C,uGAAA,YAAY,OAAA"}
package/src/runtime.mjs CHANGED
@@ -13,7 +13,7 @@ export { compileModifier } from './lib/expression/modifier.mjs';
13
13
  export { rolesAllow } from './lib/record/roles.mjs';
14
14
  export { evaluateModifier, isModifierValid } from './lib/expression/evaluateModifier.mjs';
15
15
  export { emptyValue, initialValues, isEmpty, expressionContext, lineKind, } from './lib/record/values.mjs';
16
- export { checkValue, formatBytes, fileProblem, describeTypes } from './lib/record/check.mjs';
16
+ export { checkValue, checkProperties, decimalsWords, formatBytes, fileProblem, describeTypes } from './lib/record/check.mjs';
17
17
  export { scoreOf } from './lib/record/score.mjs';
18
18
  export { saveRefused, saveProblemOf } from './lib/record/data-source.mjs';
19
19
  export { matchesFilter } from './lib/record/filter.mjs';
@@ -22,6 +22,9 @@ export { createMemoryDataSource } from './lib/record/memory-data-source.mjs';
22
22
  export { hostScheduler, wait } from './lib/record/scheduler.mjs';
23
23
  export { createForm, } from './lib/record/form.mjs';
24
24
  export { MESSAGES, fill } from './lib/record/messages.mjs';
25
+ export { stripMarks, foldDigits, oneLine, charCount, foldForSearch, numberMarks, readNumber, couldBeNumber, numberMisfit, cleanPastedNumber, readDuration, readDate, couldBeMonth, readTime, placesOfCurrency, placesOf, MOST_DIGITS, } from './lib/record/input-rules.mjs';
25
26
  export { dayOf } from './lib/record/limits.mjs';
26
- export { ADDRESS_PARTS } from './lib/record/structures.mjs';
27
+ export { ADDRESS_PARTS, postcodeFits, settledPostcode } from './lib/record/structures.mjs';
28
+ export { webAddress, settledText, hasPattern, EMAIL_LOCAL_STRAYS } from './lib/record/inputs.mjs';
29
+ export { fieldPattern } from './lib/format/pattern.mjs';
27
30
  //# sourceMappingURL=runtime.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.mjs","sourceRoot":"","sources":["../../../../libs/core/src/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAkB,MAAM,oBAAoB,CAAC;AAmE7E,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAqB,MAAM,yBAAyB,CAAC;AA0BjG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAc,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAa,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAoD,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAyB,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EACL,UAAU,EACV,aAAa,EACb,OAAO,EACP,iBAAiB,EACjB,QAAQ,GAQT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,OAAO,EAAc,MAAM,oBAAoB,CAAC;AA2BzD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAA+B,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,sBAAsB,EAAuD,MAAM,iCAAiC,CAAC;AAC9H,OAAO,EAAE,aAAa,EAAE,IAAI,EAAkB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EACL,UAAU,GAaX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAA8B,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"runtime.mjs","sourceRoot":"","sources":["../../../../libs/core/src/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAkB,MAAM,oBAAoB,CAAC;AAmE7E,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAqB,MAAM,yBAAyB,CAAC;AA0BjG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,MAAM,EAAc,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAa,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAoD,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAyB,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EACL,UAAU,EACV,aAAa,EACb,OAAO,EACP,iBAAiB,EACjB,QAAQ,GAQT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzH,OAAO,EAAE,OAAO,EAAc,MAAM,oBAAoB,CAAC;AA2BzD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAA+B,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,sBAAsB,EAAuD,MAAM,iCAAiC,CAAC;AAC9H,OAAO,EAAE,aAAa,EAAE,IAAI,EAAkB,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EACL,UAAU,GAaX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAA8B,MAAM,uBAAuB,CAAC;AACnF,OAAO,EACL,UAAU,EACV,UAAU,EACV,OAAO,EACP,SAAS,EACT,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,WAAW,GAeZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}