1 | 'use strict';
|
2 |
|
3 | const Assert = require('@hapi/hoek/lib/assert');
|
4 | const Clone = require('@hapi/hoek/lib/clone');
|
5 |
|
6 | const Template = require('./template');
|
7 |
|
8 |
|
9 | const internals = {};
|
10 |
|
11 |
|
12 | exports.compile = function (messages, target) {
|
13 |
|
14 |
|
15 |
|
16 | if (typeof messages === 'string') {
|
17 | Assert(!target, 'Cannot set single message string');
|
18 | return new Template(messages);
|
19 | }
|
20 |
|
21 |
|
22 |
|
23 | if (Template.isTemplate(messages)) {
|
24 | Assert(!target, 'Cannot set single message template');
|
25 | return messages;
|
26 | }
|
27 |
|
28 |
|
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 |
|
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 |
|
75 | exports.decompile = function (messages) {
|
76 |
|
77 |
|
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 |
|
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 |
|
114 | exports.merge = function (base, extended) {
|
115 |
|
116 | if (!base) {
|
117 | return exports.compile(extended);
|
118 | }
|
119 |
|
120 | if (!extended) {
|
121 | return base;
|
122 | }
|
123 |
|
124 |
|
125 |
|
126 | if (typeof extended === 'string') {
|
127 | return new Template(extended);
|
128 | }
|
129 |
|
130 |
|
131 |
|
132 | if (Template.isTemplate(extended)) {
|
133 | return extended;
|
134 | }
|
135 |
|
136 |
|
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 |
|
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 | };
|