@fieldia/core 0.1.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/LICENSE +21 -0
- package/README.md +31 -0
- package/package.json +40 -0
- package/schema/page.schema.json +2142 -0
- package/src/index.d.mts +15 -0
- package/src/index.d.ts +15 -0
- package/src/index.js +46 -0
- package/src/index.js.map +1 -0
- package/src/index.mjs +14 -0
- package/src/index.mjs.map +1 -0
- package/src/lib/expression/evaluateModifier.d.mts +55 -0
- package/src/lib/expression/evaluateModifier.d.ts +55 -0
- package/src/lib/expression/evaluateModifier.js +121 -0
- package/src/lib/expression/evaluateModifier.js.map +1 -0
- package/src/lib/expression/evaluateModifier.mjs +117 -0
- package/src/lib/expression/evaluateModifier.mjs.map +1 -0
- package/src/lib/expression/evaluator.d.mts +23 -0
- package/src/lib/expression/evaluator.d.ts +23 -0
- package/src/lib/expression/evaluator.js +122 -0
- package/src/lib/expression/evaluator.js.map +1 -0
- package/src/lib/expression/evaluator.mjs +118 -0
- package/src/lib/expression/evaluator.mjs.map +1 -0
- package/src/lib/expression/extractFieldNames.d.mts +41 -0
- package/src/lib/expression/extractFieldNames.d.ts +41 -0
- package/src/lib/expression/extractFieldNames.js +97 -0
- package/src/lib/expression/extractFieldNames.js.map +1 -0
- package/src/lib/expression/extractFieldNames.mjs +93 -0
- package/src/lib/expression/extractFieldNames.mjs.map +1 -0
- package/src/lib/expression/modifier.d.mts +14 -0
- package/src/lib/expression/modifier.d.ts +14 -0
- package/src/lib/expression/modifier.js +55 -0
- package/src/lib/expression/modifier.js.map +1 -0
- package/src/lib/expression/modifier.mjs +52 -0
- package/src/lib/expression/modifier.mjs.map +1 -0
- package/src/lib/expression/parser.d.mts +109 -0
- package/src/lib/expression/parser.d.ts +109 -0
- package/src/lib/expression/parser.js +317 -0
- package/src/lib/expression/parser.js.map +1 -0
- package/src/lib/expression/parser.mjs +313 -0
- package/src/lib/expression/parser.mjs.map +1 -0
- package/src/lib/expression/tokenizer.d.mts +31 -0
- package/src/lib/expression/tokenizer.d.ts +31 -0
- package/src/lib/expression/tokenizer.js +100 -0
- package/src/lib/expression/tokenizer.js.map +1 -0
- package/src/lib/expression/tokenizer.mjs +96 -0
- package/src/lib/expression/tokenizer.mjs.map +1 -0
- package/src/lib/format/field.d.mts +967 -0
- package/src/lib/format/field.d.ts +967 -0
- package/src/lib/format/field.js +147 -0
- package/src/lib/format/field.js.map +1 -0
- package/src/lib/format/field.mjs +144 -0
- package/src/lib/format/field.mjs.map +1 -0
- package/src/lib/format/json-schema.d.mts +6 -0
- package/src/lib/format/json-schema.d.ts +6 -0
- package/src/lib/format/json-schema.js +14 -0
- package/src/lib/format/json-schema.js.map +1 -0
- package/src/lib/format/json-schema.mjs +11 -0
- package/src/lib/format/json-schema.mjs.map +1 -0
- package/src/lib/format/json.d.mts +7 -0
- package/src/lib/format/json.d.ts +7 -0
- package/src/lib/format/json.js +7 -0
- package/src/lib/format/json.js.map +1 -0
- package/src/lib/format/json.mjs +4 -0
- package/src/lib/format/json.mjs.map +1 -0
- package/src/lib/format/layout.d.mts +521 -0
- package/src/lib/format/layout.d.ts +521 -0
- package/src/lib/format/layout.js +150 -0
- package/src/lib/format/layout.js.map +1 -0
- package/src/lib/format/layout.mjs +147 -0
- package/src/lib/format/layout.mjs.map +1 -0
- package/src/lib/format/layout.types.d.mts +22 -0
- package/src/lib/format/layout.types.d.ts +22 -0
- package/src/lib/format/layout.types.js +3 -0
- package/src/lib/format/layout.types.js.map +1 -0
- package/src/lib/format/layout.types.mjs +2 -0
- package/src/lib/format/layout.types.mjs.map +1 -0
- package/src/lib/format/page.d.mts +511 -0
- package/src/lib/format/page.d.ts +511 -0
- package/src/lib/format/page.js +27 -0
- package/src/lib/format/page.js.map +1 -0
- package/src/lib/format/page.mjs +24 -0
- package/src/lib/format/page.mjs.map +1 -0
- package/src/lib/format/validate.d.mts +23 -0
- package/src/lib/format/validate.d.ts +23 -0
- package/src/lib/format/validate.js +210 -0
- package/src/lib/format/validate.js.map +1 -0
- package/src/lib/format/validate.mjs +207 -0
- package/src/lib/format/validate.mjs.map +1 -0
- package/src/lib/record/check.d.mts +14 -0
- package/src/lib/record/check.d.ts +14 -0
- package/src/lib/record/check.js +167 -0
- package/src/lib/record/check.js.map +1 -0
- package/src/lib/record/check.mjs +163 -0
- package/src/lib/record/check.mjs.map +1 -0
- package/src/lib/record/data-source.d.mts +109 -0
- package/src/lib/record/data-source.d.ts +109 -0
- package/src/lib/record/data-source.js +3 -0
- package/src/lib/record/data-source.js.map +1 -0
- package/src/lib/record/data-source.mjs +2 -0
- package/src/lib/record/data-source.mjs.map +1 -0
- package/src/lib/record/form.d.mts +106 -0
- package/src/lib/record/form.d.ts +106 -0
- package/src/lib/record/form.js +545 -0
- package/src/lib/record/form.js.map +1 -0
- package/src/lib/record/form.mjs +542 -0
- package/src/lib/record/form.mjs.map +1 -0
- package/src/lib/record/memory-data-source.d.mts +28 -0
- package/src/lib/record/memory-data-source.d.ts +28 -0
- package/src/lib/record/memory-data-source.js +132 -0
- package/src/lib/record/memory-data-source.js.map +1 -0
- package/src/lib/record/memory-data-source.mjs +129 -0
- package/src/lib/record/memory-data-source.mjs.map +1 -0
- package/src/lib/record/messages.d.mts +35 -0
- package/src/lib/record/messages.d.ts +35 -0
- package/src/lib/record/messages.js +111 -0
- package/src/lib/record/messages.js.map +1 -0
- package/src/lib/record/messages.mjs +107 -0
- package/src/lib/record/messages.mjs.map +1 -0
- package/src/lib/record/scheduler.d.mts +12 -0
- package/src/lib/record/scheduler.d.ts +12 -0
- package/src/lib/record/scheduler.js +16 -0
- package/src/lib/record/scheduler.js.map +1 -0
- package/src/lib/record/scheduler.mjs +12 -0
- package/src/lib/record/scheduler.mjs.map +1 -0
- package/src/lib/record/values.d.mts +54 -0
- package/src/lib/record/values.d.ts +54 -0
- package/src/lib/record/values.js +78 -0
- package/src/lib/record/values.js.map +1 -0
- package/src/lib/record/values.mjs +71 -0
- package/src/lib/record/values.mjs.map +1 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMemoryDataSource = createMemoryDataSource;
|
|
4
|
+
const scheduler_1 = require("./scheduler");
|
|
5
|
+
const values_1 = require("./values");
|
|
6
|
+
/**
|
|
7
|
+
* A data source that keeps everything in memory. It implements the whole
|
|
8
|
+
* interface, the way a backend would, so tests and demos exercise the same
|
|
9
|
+
* paths a real adapter takes.
|
|
10
|
+
*/
|
|
11
|
+
function createMemoryDataSource(options = {}) {
|
|
12
|
+
const records = (0, values_1.structuredCopy)(options.records ?? {});
|
|
13
|
+
const responses = [];
|
|
14
|
+
const calls = [];
|
|
15
|
+
let lineIds = 1000;
|
|
16
|
+
const pause = () => (options.delayMs ? (0, scheduler_1.wait)(options.delayMs, options.scheduler) : Promise.resolve());
|
|
17
|
+
const table = (model) => (records[model] ??= {});
|
|
18
|
+
const labelOf = (model, id) => {
|
|
19
|
+
const value = table(model)[String(id)]?.[options.labelField?.[model] ?? 'name'];
|
|
20
|
+
return typeof value === 'string' ? value : String(id);
|
|
21
|
+
};
|
|
22
|
+
const nextId = (model) => Math.max(0, ...Object.keys(table(model)).map(Number).filter(Number.isFinite)) + 1;
|
|
23
|
+
const asId = (key) => (Number.isFinite(Number(key)) ? Number(key) : key);
|
|
24
|
+
function applyLines(current, ops) {
|
|
25
|
+
let lines = [...current];
|
|
26
|
+
for (const op of ops) {
|
|
27
|
+
if (op.op === 'create')
|
|
28
|
+
lines.push({ key: op.key, id: ++lineIds, values: (0, values_1.structuredCopy)(op.values) });
|
|
29
|
+
else if (op.op === 'update')
|
|
30
|
+
lines = lines.map((l) => (l.id === op.id ? { ...l, values: { ...l.values, ...(0, values_1.structuredCopy)(op.values) } } : l));
|
|
31
|
+
else
|
|
32
|
+
lines = lines.filter((l) => l.id !== op.id);
|
|
33
|
+
}
|
|
34
|
+
return lines;
|
|
35
|
+
}
|
|
36
|
+
function applyLinks(current, ops, model) {
|
|
37
|
+
let links = [...current];
|
|
38
|
+
const related = (id) => ({ id, label: labelOf(model, id) });
|
|
39
|
+
for (const op of ops) {
|
|
40
|
+
if (op.op === 'link' && !links.some((r) => r.id === op.id))
|
|
41
|
+
links.push(related(op.id));
|
|
42
|
+
else if (op.op === 'unlink')
|
|
43
|
+
links = links.filter((r) => r.id !== op.id);
|
|
44
|
+
else if (op.op === 'set')
|
|
45
|
+
links = op.ids.map(related);
|
|
46
|
+
else if (op.op === 'clear')
|
|
47
|
+
links = [];
|
|
48
|
+
}
|
|
49
|
+
return links;
|
|
50
|
+
}
|
|
51
|
+
function relationOf(fields, name) {
|
|
52
|
+
const field = fields[name];
|
|
53
|
+
return field && 'relation' in field ? field.relation : name;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
records,
|
|
57
|
+
responses,
|
|
58
|
+
calls,
|
|
59
|
+
async load(request) {
|
|
60
|
+
calls.push({ method: 'load', request });
|
|
61
|
+
await pause();
|
|
62
|
+
const stored = table(request.model)[String(request.id)];
|
|
63
|
+
if (!stored)
|
|
64
|
+
throw new Error(`No ${request.model} record with id ${request.id}`);
|
|
65
|
+
return (0, values_1.structuredCopy)(stored);
|
|
66
|
+
},
|
|
67
|
+
async save(request) {
|
|
68
|
+
calls.push({ method: 'save', request });
|
|
69
|
+
await pause();
|
|
70
|
+
const id = request.id ?? nextId(request.model);
|
|
71
|
+
const stored = { ...(table(request.model)[String(id)] ?? {}), ...(0, values_1.structuredCopy)(request.changes.values) };
|
|
72
|
+
for (const [name, ops] of Object.entries(request.changes.lines)) {
|
|
73
|
+
stored[name] = applyLines(stored[name] ?? [], ops);
|
|
74
|
+
}
|
|
75
|
+
for (const [name, ops] of Object.entries(request.changes.links)) {
|
|
76
|
+
stored[name] = applyLinks(stored[name] ?? [], ops, relationOf(request.fields, name));
|
|
77
|
+
}
|
|
78
|
+
table(request.model)[String(id)] = stored;
|
|
79
|
+
return { id, values: (0, values_1.structuredCopy)(stored) };
|
|
80
|
+
},
|
|
81
|
+
async onchange(request) {
|
|
82
|
+
calls.push({ method: 'onchange', request });
|
|
83
|
+
await pause();
|
|
84
|
+
const rule = options.onchange?.[request.model]?.[request.changed];
|
|
85
|
+
return rule ? { values: rule((0, values_1.structuredCopy)(request.values)) } : {};
|
|
86
|
+
},
|
|
87
|
+
async search(request) {
|
|
88
|
+
calls.push({ method: 'search', request });
|
|
89
|
+
await pause();
|
|
90
|
+
const query = request.query.trim().toLowerCase();
|
|
91
|
+
return Object.entries(table(request.model))
|
|
92
|
+
.filter(([, values]) => (request.filter ?? []).every((condition) => matches(values, condition)))
|
|
93
|
+
.map(([key]) => ({ id: asId(key), label: labelOf(request.model, asId(key)) }))
|
|
94
|
+
.filter((record) => record.label.toLowerCase().includes(query))
|
|
95
|
+
.slice(0, request.limit ?? 8);
|
|
96
|
+
},
|
|
97
|
+
async submit(request) {
|
|
98
|
+
calls.push({ method: 'submit', request });
|
|
99
|
+
await pause();
|
|
100
|
+
responses.push((0, values_1.structuredCopy)(request));
|
|
101
|
+
return { id: responses.length };
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function matches(values, condition) {
|
|
106
|
+
const raw = values[condition.field];
|
|
107
|
+
const actual = raw !== null && typeof raw === 'object' && 'id' in raw ? raw.id : raw;
|
|
108
|
+
const expected = condition.value;
|
|
109
|
+
switch (condition.op) {
|
|
110
|
+
case '=':
|
|
111
|
+
return actual === expected;
|
|
112
|
+
case '!=':
|
|
113
|
+
return actual !== expected;
|
|
114
|
+
case '<':
|
|
115
|
+
return actual < expected;
|
|
116
|
+
case '>':
|
|
117
|
+
return actual > expected;
|
|
118
|
+
case '<=':
|
|
119
|
+
return actual <= expected;
|
|
120
|
+
case '>=':
|
|
121
|
+
return actual >= expected;
|
|
122
|
+
case 'in':
|
|
123
|
+
return Array.isArray(expected) && expected.includes(actual);
|
|
124
|
+
case 'not in':
|
|
125
|
+
return Array.isArray(expected) && !expected.includes(actual);
|
|
126
|
+
case 'like':
|
|
127
|
+
return String(actual ?? '').includes(String(expected));
|
|
128
|
+
case 'ilike':
|
|
129
|
+
return String(actual ?? '').toLowerCase().includes(String(expected).toLowerCase());
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=memory-data-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-data-source.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/memory-data-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { wait } from './scheduler.mjs';
|
|
2
|
+
import { structuredCopy } from './values.mjs';
|
|
3
|
+
/**
|
|
4
|
+
* A data source that keeps everything in memory. It implements the whole
|
|
5
|
+
* interface, the way a backend would, so tests and demos exercise the same
|
|
6
|
+
* paths a real adapter takes.
|
|
7
|
+
*/
|
|
8
|
+
export function createMemoryDataSource(options = {}) {
|
|
9
|
+
const records = structuredCopy(options.records ?? {});
|
|
10
|
+
const responses = [];
|
|
11
|
+
const calls = [];
|
|
12
|
+
let lineIds = 1000;
|
|
13
|
+
const pause = () => (options.delayMs ? wait(options.delayMs, options.scheduler) : Promise.resolve());
|
|
14
|
+
const table = (model) => (records[model] ??= {});
|
|
15
|
+
const labelOf = (model, id) => {
|
|
16
|
+
const value = table(model)[String(id)]?.[options.labelField?.[model] ?? 'name'];
|
|
17
|
+
return typeof value === 'string' ? value : String(id);
|
|
18
|
+
};
|
|
19
|
+
const nextId = (model) => Math.max(0, ...Object.keys(table(model)).map(Number).filter(Number.isFinite)) + 1;
|
|
20
|
+
const asId = (key) => (Number.isFinite(Number(key)) ? Number(key) : key);
|
|
21
|
+
function applyLines(current, ops) {
|
|
22
|
+
let lines = [...current];
|
|
23
|
+
for (const op of ops) {
|
|
24
|
+
if (op.op === 'create')
|
|
25
|
+
lines.push({ key: op.key, id: ++lineIds, values: structuredCopy(op.values) });
|
|
26
|
+
else if (op.op === 'update')
|
|
27
|
+
lines = lines.map((l) => (l.id === op.id ? { ...l, values: { ...l.values, ...structuredCopy(op.values) } } : l));
|
|
28
|
+
else
|
|
29
|
+
lines = lines.filter((l) => l.id !== op.id);
|
|
30
|
+
}
|
|
31
|
+
return lines;
|
|
32
|
+
}
|
|
33
|
+
function applyLinks(current, ops, model) {
|
|
34
|
+
let links = [...current];
|
|
35
|
+
const related = (id) => ({ id, label: labelOf(model, id) });
|
|
36
|
+
for (const op of ops) {
|
|
37
|
+
if (op.op === 'link' && !links.some((r) => r.id === op.id))
|
|
38
|
+
links.push(related(op.id));
|
|
39
|
+
else if (op.op === 'unlink')
|
|
40
|
+
links = links.filter((r) => r.id !== op.id);
|
|
41
|
+
else if (op.op === 'set')
|
|
42
|
+
links = op.ids.map(related);
|
|
43
|
+
else if (op.op === 'clear')
|
|
44
|
+
links = [];
|
|
45
|
+
}
|
|
46
|
+
return links;
|
|
47
|
+
}
|
|
48
|
+
function relationOf(fields, name) {
|
|
49
|
+
const field = fields[name];
|
|
50
|
+
return field && 'relation' in field ? field.relation : name;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
records,
|
|
54
|
+
responses,
|
|
55
|
+
calls,
|
|
56
|
+
async load(request) {
|
|
57
|
+
calls.push({ method: 'load', request });
|
|
58
|
+
await pause();
|
|
59
|
+
const stored = table(request.model)[String(request.id)];
|
|
60
|
+
if (!stored)
|
|
61
|
+
throw new Error(`No ${request.model} record with id ${request.id}`);
|
|
62
|
+
return structuredCopy(stored);
|
|
63
|
+
},
|
|
64
|
+
async save(request) {
|
|
65
|
+
calls.push({ method: 'save', request });
|
|
66
|
+
await pause();
|
|
67
|
+
const id = request.id ?? nextId(request.model);
|
|
68
|
+
const stored = { ...(table(request.model)[String(id)] ?? {}), ...structuredCopy(request.changes.values) };
|
|
69
|
+
for (const [name, ops] of Object.entries(request.changes.lines)) {
|
|
70
|
+
stored[name] = applyLines(stored[name] ?? [], ops);
|
|
71
|
+
}
|
|
72
|
+
for (const [name, ops] of Object.entries(request.changes.links)) {
|
|
73
|
+
stored[name] = applyLinks(stored[name] ?? [], ops, relationOf(request.fields, name));
|
|
74
|
+
}
|
|
75
|
+
table(request.model)[String(id)] = stored;
|
|
76
|
+
return { id, values: structuredCopy(stored) };
|
|
77
|
+
},
|
|
78
|
+
async onchange(request) {
|
|
79
|
+
calls.push({ method: 'onchange', request });
|
|
80
|
+
await pause();
|
|
81
|
+
const rule = options.onchange?.[request.model]?.[request.changed];
|
|
82
|
+
return rule ? { values: rule(structuredCopy(request.values)) } : {};
|
|
83
|
+
},
|
|
84
|
+
async search(request) {
|
|
85
|
+
calls.push({ method: 'search', request });
|
|
86
|
+
await pause();
|
|
87
|
+
const query = request.query.trim().toLowerCase();
|
|
88
|
+
return Object.entries(table(request.model))
|
|
89
|
+
.filter(([, values]) => (request.filter ?? []).every((condition) => matches(values, condition)))
|
|
90
|
+
.map(([key]) => ({ id: asId(key), label: labelOf(request.model, asId(key)) }))
|
|
91
|
+
.filter((record) => record.label.toLowerCase().includes(query))
|
|
92
|
+
.slice(0, request.limit ?? 8);
|
|
93
|
+
},
|
|
94
|
+
async submit(request) {
|
|
95
|
+
calls.push({ method: 'submit', request });
|
|
96
|
+
await pause();
|
|
97
|
+
responses.push(structuredCopy(request));
|
|
98
|
+
return { id: responses.length };
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function matches(values, condition) {
|
|
103
|
+
const raw = values[condition.field];
|
|
104
|
+
const actual = raw !== null && typeof raw === 'object' && 'id' in raw ? raw.id : raw;
|
|
105
|
+
const expected = condition.value;
|
|
106
|
+
switch (condition.op) {
|
|
107
|
+
case '=':
|
|
108
|
+
return actual === expected;
|
|
109
|
+
case '!=':
|
|
110
|
+
return actual !== expected;
|
|
111
|
+
case '<':
|
|
112
|
+
return actual < expected;
|
|
113
|
+
case '>':
|
|
114
|
+
return actual > expected;
|
|
115
|
+
case '<=':
|
|
116
|
+
return actual <= expected;
|
|
117
|
+
case '>=':
|
|
118
|
+
return actual >= expected;
|
|
119
|
+
case 'in':
|
|
120
|
+
return Array.isArray(expected) && expected.includes(actual);
|
|
121
|
+
case 'not in':
|
|
122
|
+
return Array.isArray(expected) && !expected.includes(actual);
|
|
123
|
+
case 'like':
|
|
124
|
+
return String(actual ?? '').includes(String(expected));
|
|
125
|
+
case 'ilike':
|
|
126
|
+
return String(actual ?? '').toLowerCase().includes(String(expected).toLowerCase());
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=memory-data-source.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-data-source.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/memory-data-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation messages, by language. `{label}` is the field's label; the other
|
|
3
|
+
* placeholders are named in each English message. English keeps the React
|
|
4
|
+
* engine's wording; Arabic, German and French build on its translations.
|
|
5
|
+
*/
|
|
6
|
+
export interface Messages {
|
|
7
|
+
required: string;
|
|
8
|
+
maxLength: string;
|
|
9
|
+
pattern: string;
|
|
10
|
+
text: string;
|
|
11
|
+
number: string;
|
|
12
|
+
integer: string;
|
|
13
|
+
min: string;
|
|
14
|
+
max: string;
|
|
15
|
+
decimals: string;
|
|
16
|
+
boolean: string;
|
|
17
|
+
dateFormat: string;
|
|
18
|
+
dateInvalid: string;
|
|
19
|
+
datetimeFormat: string;
|
|
20
|
+
datetimeInvalid: string;
|
|
21
|
+
choice: string;
|
|
22
|
+
choices: string;
|
|
23
|
+
record: string;
|
|
24
|
+
records: string;
|
|
25
|
+
reference: string;
|
|
26
|
+
file: string;
|
|
27
|
+
fileSize: string;
|
|
28
|
+
fileType: string;
|
|
29
|
+
/** Joins the last two items of a list: "PDF or image". */
|
|
30
|
+
or: string;
|
|
31
|
+
}
|
|
32
|
+
export type Locale = 'en' | 'ar' | 'de' | 'fr';
|
|
33
|
+
export declare const MESSAGES: Record<Locale, Messages>;
|
|
34
|
+
/** Fill `{name}` placeholders. */
|
|
35
|
+
export declare function fill(template: string, values: Record<string, string | number>): string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation messages, by language. `{label}` is the field's label; the other
|
|
3
|
+
* placeholders are named in each English message. English keeps the React
|
|
4
|
+
* engine's wording; Arabic, German and French build on its translations.
|
|
5
|
+
*/
|
|
6
|
+
export interface Messages {
|
|
7
|
+
required: string;
|
|
8
|
+
maxLength: string;
|
|
9
|
+
pattern: string;
|
|
10
|
+
text: string;
|
|
11
|
+
number: string;
|
|
12
|
+
integer: string;
|
|
13
|
+
min: string;
|
|
14
|
+
max: string;
|
|
15
|
+
decimals: string;
|
|
16
|
+
boolean: string;
|
|
17
|
+
dateFormat: string;
|
|
18
|
+
dateInvalid: string;
|
|
19
|
+
datetimeFormat: string;
|
|
20
|
+
datetimeInvalid: string;
|
|
21
|
+
choice: string;
|
|
22
|
+
choices: string;
|
|
23
|
+
record: string;
|
|
24
|
+
records: string;
|
|
25
|
+
reference: string;
|
|
26
|
+
file: string;
|
|
27
|
+
fileSize: string;
|
|
28
|
+
fileType: string;
|
|
29
|
+
/** Joins the last two items of a list: "PDF or image". */
|
|
30
|
+
or: string;
|
|
31
|
+
}
|
|
32
|
+
export type Locale = 'en' | 'ar' | 'de' | 'fr';
|
|
33
|
+
export declare const MESSAGES: Record<Locale, Messages>;
|
|
34
|
+
/** Fill `{name}` placeholders. */
|
|
35
|
+
export declare function fill(template: string, values: Record<string, string | number>): string;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MESSAGES = void 0;
|
|
4
|
+
exports.fill = fill;
|
|
5
|
+
exports.MESSAGES = {
|
|
6
|
+
en: {
|
|
7
|
+
required: '{label} is required',
|
|
8
|
+
maxLength: 'Maximum {max} characters allowed',
|
|
9
|
+
pattern: '{label} is not in the expected format',
|
|
10
|
+
text: '{label} must be text',
|
|
11
|
+
number: '{label} must be a number',
|
|
12
|
+
integer: '{label} must be a whole number',
|
|
13
|
+
min: '{label} must be at least {min}',
|
|
14
|
+
max: '{label} must be at most {max}',
|
|
15
|
+
decimals: 'Maximum {digits} decimal places allowed',
|
|
16
|
+
boolean: '{label} must be yes or no',
|
|
17
|
+
dateFormat: 'Invalid date format (expected YYYY-MM-DD)',
|
|
18
|
+
dateInvalid: 'Invalid date (check month/day values)',
|
|
19
|
+
datetimeFormat: 'Invalid date and time format (expected YYYY-MM-DDTHH:MM:SS)',
|
|
20
|
+
datetimeInvalid: 'Invalid date and time (check the values)',
|
|
21
|
+
choice: 'Must be one of: {options}',
|
|
22
|
+
choices: '{label} must be a list of choices',
|
|
23
|
+
record: '{label} must be a record',
|
|
24
|
+
records: '{label} must be a list of records',
|
|
25
|
+
reference: '{label} must point to {aModels}',
|
|
26
|
+
file: '{label} must be a file',
|
|
27
|
+
fileSize: '{label} is larger than {size}',
|
|
28
|
+
fileType: '{label} must be {aTypes} file',
|
|
29
|
+
or: 'or',
|
|
30
|
+
},
|
|
31
|
+
ar: {
|
|
32
|
+
required: '{label} مطلوب',
|
|
33
|
+
maxLength: 'الحد الأقصى {max} حرفًا',
|
|
34
|
+
pattern: 'صيغة {label} غير صحيحة',
|
|
35
|
+
text: 'يجب أن يكون {label} نصًا',
|
|
36
|
+
number: 'يجب أن يكون {label} رقمًا',
|
|
37
|
+
integer: 'يجب أن يكون {label} رقمًا صحيحًا',
|
|
38
|
+
min: 'يجب ألا يقل {label} عن {min}',
|
|
39
|
+
max: 'يجب ألا يزيد {label} عن {max}',
|
|
40
|
+
decimals: 'الحد الأقصى {digits} منازل عشرية',
|
|
41
|
+
boolean: 'يجب أن يكون {label} نعم أو لا',
|
|
42
|
+
dateFormat: 'صيغة التاريخ غير صحيحة (المتوقع YYYY-MM-DD)',
|
|
43
|
+
dateInvalid: 'التاريخ غير صحيح (تحقق من الشهر واليوم)',
|
|
44
|
+
datetimeFormat: 'صيغة التاريخ والوقت غير صحيحة (المتوقع YYYY-MM-DDTHH:MM:SS)',
|
|
45
|
+
datetimeInvalid: 'التاريخ والوقت غير صحيحين',
|
|
46
|
+
choice: 'يجب أن تكون القيمة واحدة من: {options}',
|
|
47
|
+
choices: 'يجب أن يكون {label} قائمة اختيارات',
|
|
48
|
+
record: 'يجب أن يكون {label} سجلًا',
|
|
49
|
+
records: 'يجب أن يكون {label} قائمة سجلات',
|
|
50
|
+
reference: 'يجب أن يشير {label} إلى {models}',
|
|
51
|
+
file: 'يجب أن يكون {label} ملفًا',
|
|
52
|
+
fileSize: 'حجم {label} أكبر من {size}',
|
|
53
|
+
fileType: 'يجب أن يكون {label} ملف {types}',
|
|
54
|
+
or: 'أو',
|
|
55
|
+
},
|
|
56
|
+
de: {
|
|
57
|
+
required: '{label} ist erforderlich',
|
|
58
|
+
maxLength: 'Maximal {max} Zeichen erlaubt',
|
|
59
|
+
pattern: '{label} hat nicht das erwartete Format',
|
|
60
|
+
text: '{label} muss Text sein',
|
|
61
|
+
number: '{label} muss eine Zahl sein',
|
|
62
|
+
integer: '{label} muss eine ganze Zahl sein',
|
|
63
|
+
min: '{label} muss mindestens {min} sein',
|
|
64
|
+
max: '{label} darf höchstens {max} sein',
|
|
65
|
+
decimals: 'Maximal {digits} Nachkommastellen erlaubt',
|
|
66
|
+
boolean: '{label} muss ja oder nein sein',
|
|
67
|
+
dateFormat: 'Ungültiges Datumsformat (erwartet JJJJ-MM-TT)',
|
|
68
|
+
dateInvalid: 'Ungültiges Datum (Monat und Tag prüfen)',
|
|
69
|
+
datetimeFormat: 'Ungültiges Datums- und Zeitformat (erwartet JJJJ-MM-TTTHH:MM:SS)',
|
|
70
|
+
datetimeInvalid: 'Ungültiges Datum oder ungültige Uhrzeit',
|
|
71
|
+
choice: 'Muss eines davon sein: {options}',
|
|
72
|
+
choices: '{label} muss eine Liste von Optionen sein',
|
|
73
|
+
record: '{label} muss ein Datensatz sein',
|
|
74
|
+
records: '{label} muss eine Liste von Datensätzen sein',
|
|
75
|
+
reference: '{label} muss auf {models} verweisen',
|
|
76
|
+
file: '{label} muss eine Datei sein',
|
|
77
|
+
fileSize: '{label} ist größer als {size}',
|
|
78
|
+
fileType: '{label} muss eine {types}-Datei sein',
|
|
79
|
+
or: 'oder',
|
|
80
|
+
},
|
|
81
|
+
fr: {
|
|
82
|
+
required: '{label} est obligatoire',
|
|
83
|
+
maxLength: '{max} caractères au maximum',
|
|
84
|
+
pattern: "{label} n'a pas le format attendu",
|
|
85
|
+
text: '{label} doit être du texte',
|
|
86
|
+
number: '{label} doit être un nombre',
|
|
87
|
+
integer: '{label} doit être un nombre entier',
|
|
88
|
+
min: '{label} doit être au moins {min}',
|
|
89
|
+
max: '{label} doit être au plus {max}',
|
|
90
|
+
decimals: '{digits} décimales au maximum',
|
|
91
|
+
boolean: '{label} doit être oui ou non',
|
|
92
|
+
dateFormat: 'Format de date invalide (attendu AAAA-MM-JJ)',
|
|
93
|
+
dateInvalid: 'Date invalide (vérifiez le mois et le jour)',
|
|
94
|
+
datetimeFormat: 'Format de date et heure invalide (attendu AAAA-MM-JJTHH:MM:SS)',
|
|
95
|
+
datetimeInvalid: 'Date ou heure invalide',
|
|
96
|
+
choice: 'Doit être parmi : {options}',
|
|
97
|
+
choices: '{label} doit être une liste de choix',
|
|
98
|
+
record: '{label} doit être un enregistrement',
|
|
99
|
+
records: "{label} doit être une liste d'enregistrements",
|
|
100
|
+
reference: '{label} doit pointer vers {models}',
|
|
101
|
+
file: '{label} doit être un fichier',
|
|
102
|
+
fileSize: '{label} dépasse {size}',
|
|
103
|
+
fileType: '{label} doit être un fichier {types}',
|
|
104
|
+
or: 'ou',
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
/** Fill `{name}` placeholders. */
|
|
108
|
+
function fill(template, values) {
|
|
109
|
+
return template.replace(/\{(\w+)\}/g, (match, name) => (name in values ? String(values[name]) : match));
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export const MESSAGES = {
|
|
2
|
+
en: {
|
|
3
|
+
required: '{label} is required',
|
|
4
|
+
maxLength: 'Maximum {max} characters allowed',
|
|
5
|
+
pattern: '{label} is not in the expected format',
|
|
6
|
+
text: '{label} must be text',
|
|
7
|
+
number: '{label} must be a number',
|
|
8
|
+
integer: '{label} must be a whole number',
|
|
9
|
+
min: '{label} must be at least {min}',
|
|
10
|
+
max: '{label} must be at most {max}',
|
|
11
|
+
decimals: 'Maximum {digits} decimal places allowed',
|
|
12
|
+
boolean: '{label} must be yes or no',
|
|
13
|
+
dateFormat: 'Invalid date format (expected YYYY-MM-DD)',
|
|
14
|
+
dateInvalid: 'Invalid date (check month/day values)',
|
|
15
|
+
datetimeFormat: 'Invalid date and time format (expected YYYY-MM-DDTHH:MM:SS)',
|
|
16
|
+
datetimeInvalid: 'Invalid date and time (check the values)',
|
|
17
|
+
choice: 'Must be one of: {options}',
|
|
18
|
+
choices: '{label} must be a list of choices',
|
|
19
|
+
record: '{label} must be a record',
|
|
20
|
+
records: '{label} must be a list of records',
|
|
21
|
+
reference: '{label} must point to {aModels}',
|
|
22
|
+
file: '{label} must be a file',
|
|
23
|
+
fileSize: '{label} is larger than {size}',
|
|
24
|
+
fileType: '{label} must be {aTypes} file',
|
|
25
|
+
or: 'or',
|
|
26
|
+
},
|
|
27
|
+
ar: {
|
|
28
|
+
required: '{label} مطلوب',
|
|
29
|
+
maxLength: 'الحد الأقصى {max} حرفًا',
|
|
30
|
+
pattern: 'صيغة {label} غير صحيحة',
|
|
31
|
+
text: 'يجب أن يكون {label} نصًا',
|
|
32
|
+
number: 'يجب أن يكون {label} رقمًا',
|
|
33
|
+
integer: 'يجب أن يكون {label} رقمًا صحيحًا',
|
|
34
|
+
min: 'يجب ألا يقل {label} عن {min}',
|
|
35
|
+
max: 'يجب ألا يزيد {label} عن {max}',
|
|
36
|
+
decimals: 'الحد الأقصى {digits} منازل عشرية',
|
|
37
|
+
boolean: 'يجب أن يكون {label} نعم أو لا',
|
|
38
|
+
dateFormat: 'صيغة التاريخ غير صحيحة (المتوقع YYYY-MM-DD)',
|
|
39
|
+
dateInvalid: 'التاريخ غير صحيح (تحقق من الشهر واليوم)',
|
|
40
|
+
datetimeFormat: 'صيغة التاريخ والوقت غير صحيحة (المتوقع YYYY-MM-DDTHH:MM:SS)',
|
|
41
|
+
datetimeInvalid: 'التاريخ والوقت غير صحيحين',
|
|
42
|
+
choice: 'يجب أن تكون القيمة واحدة من: {options}',
|
|
43
|
+
choices: 'يجب أن يكون {label} قائمة اختيارات',
|
|
44
|
+
record: 'يجب أن يكون {label} سجلًا',
|
|
45
|
+
records: 'يجب أن يكون {label} قائمة سجلات',
|
|
46
|
+
reference: 'يجب أن يشير {label} إلى {models}',
|
|
47
|
+
file: 'يجب أن يكون {label} ملفًا',
|
|
48
|
+
fileSize: 'حجم {label} أكبر من {size}',
|
|
49
|
+
fileType: 'يجب أن يكون {label} ملف {types}',
|
|
50
|
+
or: 'أو',
|
|
51
|
+
},
|
|
52
|
+
de: {
|
|
53
|
+
required: '{label} ist erforderlich',
|
|
54
|
+
maxLength: 'Maximal {max} Zeichen erlaubt',
|
|
55
|
+
pattern: '{label} hat nicht das erwartete Format',
|
|
56
|
+
text: '{label} muss Text sein',
|
|
57
|
+
number: '{label} muss eine Zahl sein',
|
|
58
|
+
integer: '{label} muss eine ganze Zahl sein',
|
|
59
|
+
min: '{label} muss mindestens {min} sein',
|
|
60
|
+
max: '{label} darf höchstens {max} sein',
|
|
61
|
+
decimals: 'Maximal {digits} Nachkommastellen erlaubt',
|
|
62
|
+
boolean: '{label} muss ja oder nein sein',
|
|
63
|
+
dateFormat: 'Ungültiges Datumsformat (erwartet JJJJ-MM-TT)',
|
|
64
|
+
dateInvalid: 'Ungültiges Datum (Monat und Tag prüfen)',
|
|
65
|
+
datetimeFormat: 'Ungültiges Datums- und Zeitformat (erwartet JJJJ-MM-TTTHH:MM:SS)',
|
|
66
|
+
datetimeInvalid: 'Ungültiges Datum oder ungültige Uhrzeit',
|
|
67
|
+
choice: 'Muss eines davon sein: {options}',
|
|
68
|
+
choices: '{label} muss eine Liste von Optionen sein',
|
|
69
|
+
record: '{label} muss ein Datensatz sein',
|
|
70
|
+
records: '{label} muss eine Liste von Datensätzen sein',
|
|
71
|
+
reference: '{label} muss auf {models} verweisen',
|
|
72
|
+
file: '{label} muss eine Datei sein',
|
|
73
|
+
fileSize: '{label} ist größer als {size}',
|
|
74
|
+
fileType: '{label} muss eine {types}-Datei sein',
|
|
75
|
+
or: 'oder',
|
|
76
|
+
},
|
|
77
|
+
fr: {
|
|
78
|
+
required: '{label} est obligatoire',
|
|
79
|
+
maxLength: '{max} caractères au maximum',
|
|
80
|
+
pattern: "{label} n'a pas le format attendu",
|
|
81
|
+
text: '{label} doit être du texte',
|
|
82
|
+
number: '{label} doit être un nombre',
|
|
83
|
+
integer: '{label} doit être un nombre entier',
|
|
84
|
+
min: '{label} doit être au moins {min}',
|
|
85
|
+
max: '{label} doit être au plus {max}',
|
|
86
|
+
decimals: '{digits} décimales au maximum',
|
|
87
|
+
boolean: '{label} doit être oui ou non',
|
|
88
|
+
dateFormat: 'Format de date invalide (attendu AAAA-MM-JJ)',
|
|
89
|
+
dateInvalid: 'Date invalide (vérifiez le mois et le jour)',
|
|
90
|
+
datetimeFormat: 'Format de date et heure invalide (attendu AAAA-MM-JJTHH:MM:SS)',
|
|
91
|
+
datetimeInvalid: 'Date ou heure invalide',
|
|
92
|
+
choice: 'Doit être parmi : {options}',
|
|
93
|
+
choices: '{label} doit être une liste de choix',
|
|
94
|
+
record: '{label} doit être un enregistrement',
|
|
95
|
+
records: "{label} doit être une liste d'enregistrements",
|
|
96
|
+
reference: '{label} doit pointer vers {models}',
|
|
97
|
+
file: '{label} doit être un fichier',
|
|
98
|
+
fileSize: '{label} dépasse {size}',
|
|
99
|
+
fileType: '{label} doit être un fichier {types}',
|
|
100
|
+
or: 'ou',
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
/** Fill `{name}` placeholders. */
|
|
104
|
+
export function fill(template, values) {
|
|
105
|
+
return template.replace(/\{(\w+)\}/g, (match, name) => (name in values ? String(values[name]) : match));
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=messages.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timers, injected. Core compiles without the DOM or Node's types, and tests
|
|
3
|
+
* drive time by hand instead of waiting for it.
|
|
4
|
+
*/
|
|
5
|
+
export interface Scheduler {
|
|
6
|
+
setTimeout(callback: () => void, ms: number): unknown;
|
|
7
|
+
clearTimeout(handle: unknown): void;
|
|
8
|
+
}
|
|
9
|
+
/** The host's own timers: the browser's or Node's, whichever is running. */
|
|
10
|
+
export declare const hostScheduler: Scheduler;
|
|
11
|
+
/** Resolve after `ms`, on the given scheduler. */
|
|
12
|
+
export declare function wait(ms: number, scheduler?: Scheduler): Promise<void>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timers, injected. Core compiles without the DOM or Node's types, and tests
|
|
3
|
+
* drive time by hand instead of waiting for it.
|
|
4
|
+
*/
|
|
5
|
+
export interface Scheduler {
|
|
6
|
+
setTimeout(callback: () => void, ms: number): unknown;
|
|
7
|
+
clearTimeout(handle: unknown): void;
|
|
8
|
+
}
|
|
9
|
+
/** The host's own timers: the browser's or Node's, whichever is running. */
|
|
10
|
+
export declare const hostScheduler: Scheduler;
|
|
11
|
+
/** Resolve after `ms`, on the given scheduler. */
|
|
12
|
+
export declare function wait(ms: number, scheduler?: Scheduler): Promise<void>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hostScheduler = void 0;
|
|
4
|
+
exports.wait = wait;
|
|
5
|
+
/** The host's own timers: the browser's or Node's, whichever is running. */
|
|
6
|
+
exports.hostScheduler = {
|
|
7
|
+
setTimeout: (callback, ms) => globalThis.setTimeout(callback, ms),
|
|
8
|
+
clearTimeout: (handle) => globalThis.clearTimeout(handle),
|
|
9
|
+
};
|
|
10
|
+
/** Resolve after `ms`, on the given scheduler. */
|
|
11
|
+
function wait(ms, scheduler = exports.hostScheduler) {
|
|
12
|
+
return new Promise((resolve) => {
|
|
13
|
+
scheduler.setTimeout(resolve, ms);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/record/scheduler.ts"],"names":[],"mappings":";;;AAqBA,oBAIC;AAXD,4EAA4E;AAC/D,QAAA,aAAa,GAAc;IACtC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAE,UAAoC,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC5F,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAE,UAAoC,CAAC,YAAY,CAAC,MAAM,CAAC;CACrF,CAAC;AAEF,kDAAkD;AAClD,SAAgB,IAAI,CAAC,EAAU,EAAE,YAAuB,qBAAa;IACnE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC"}
|