UNPKG

4.31 kBJavaScriptView Raw
1'use strict';
2
3const Assert = require('@hapi/hoek/lib/assert');
4const Clone = require('@hapi/hoek/lib/clone');
5
6const Template = require('./template');
7
8
9const internals = {};
10
11
12exports.compile = function (messages, target) {
13
14 // Single value string ('plain error message', 'template {error} message')
15
16 if (typeof messages === 'string') {
17 Assert(!target, 'Cannot set single message string');
18 return new Template(messages);
19 }
20
21 // Single value template
22
23 if (Template.isTemplate(messages)) {
24 Assert(!target, 'Cannot set single message template');
25 return messages;
26 }
27
28 // By error code { 'number.min': <string | template> }
29
30 Assert(typeof messages === 'object' && !Array.isArray(messages), 'Invalid message options');
31
32 target = target ? Clone(target) : {};
33
34 for (let code in messages) {
35 const message = messages[code];
36
37 if (code === 'root' ||
38 Template.isTemplate(message)) {
39
40 target[code] = message;
41 continue;
42 }
43
44 if (typeof message === 'string') {
45 target[code] = new Template(message);
46 continue;
47 }
48
49 // By language { english: { 'number.min': <string | template> } }
50
51 Assert(typeof message === 'object' && !Array.isArray(message), 'Invalid message for', code);
52
53 const language = code;
54 target[language] = target[language] || {};
55
56 for (code in message) {
57 const localized = message[code];
58
59 if (code === 'root' ||
60 Template.isTemplate(localized)) {
61
62 target[language][code] = localized;
63 continue;
64 }
65
66 Assert(typeof localized === 'string', 'Invalid message for', code, 'in', language);
67 target[language][code] = new Template(localized);
68 }
69 }
70
71 return target;
72};
73
74
75exports.decompile = function (messages) {
76
77 // By error code { 'number.min': <string | template> }
78
79 const target = {};
80 for (let code in messages) {
81 const message = messages[code];
82
83 if (code === 'root') {
84 target.root = message;
85 continue;
86 }
87
88 if (Template.isTemplate(message)) {
89 target[code] = message.describe({ compact: true });
90 continue;
91 }
92
93 // By language { english: { 'number.min': <string | template> } }
94
95 const language = code;
96 target[language] = {};
97
98 for (code in message) {
99 const localized = message[code];
100
101 if (code === 'root') {
102 target[language].root = localized;
103 continue;
104 }
105
106 target[language][code] = localized.describe({ compact: true });
107 }
108 }
109
110 return target;
111};
112
113
114exports.merge = function (base, extended) {
115
116 if (!base) {
117 return exports.compile(extended);
118 }
119
120 if (!extended) {
121 return base;
122 }
123
124 // Single value string
125
126 if (typeof extended === 'string') {
127 return new Template(extended);
128 }
129
130 // Single value template
131
132 if (Template.isTemplate(extended)) {
133 return extended;
134 }
135
136 // By error code { 'number.min': <string | template> }
137
138 const target = Clone(base);
139
140 for (let code in extended) {
141 const message = extended[code];
142
143 if (code === 'root' ||
144 Template.isTemplate(message)) {
145
146 target[code] = message;
147 continue;
148 }
149
150 if (typeof message === 'string') {
151 target[code] = new Template(message);
152 continue;
153 }
154
155 // By language { english: { 'number.min': <string | template> } }
156
157 Assert(typeof message === 'object' && !Array.isArray(message), 'Invalid message for', code);
158
159 const language = code;
160 target[language] = target[language] || {};
161
162 for (code in message) {
163 const localized = message[code];
164
165 if (code === 'root' ||
166 Template.isTemplate(localized)) {
167
168 target[language][code] = localized;
169 continue;
170 }
171
172 Assert(typeof localized === 'string', 'Invalid message for', code, 'in', language);
173 target[language][code] = new Template(localized);
174 }
175 }
176
177 return target;
178};