'use strict'; const Assert = require('@hapi/hoek/lib/assert'); const Clone = require('@hapi/hoek/lib/clone'); const Template = require('./template'); const internals = {}; exports.compile = function (messages, target) { // Single value string ('plain error message', 'template {error} message') if (typeof messages === 'string') { Assert(!target, 'Cannot set single message string'); return new Template(messages); } // Single value template if (Template.isTemplate(messages)) { Assert(!target, 'Cannot set single message template'); return messages; } // By error code { 'number.min': } Assert(typeof messages === 'object' && !Array.isArray(messages), 'Invalid message options'); target = target ? Clone(target) : {}; for (let code in messages) { const message = messages[code]; if (code === 'root' || Template.isTemplate(message)) { target[code] = message; continue; } if (typeof message === 'string') { target[code] = new Template(message); continue; } // By language { english: { 'number.min': } } Assert(typeof message === 'object' && !Array.isArray(message), 'Invalid message for', code); const language = code; target[language] = target[language] || {}; for (code in message) { const localized = message[code]; if (code === 'root' || Template.isTemplate(localized)) { target[language][code] = localized; continue; } Assert(typeof localized === 'string', 'Invalid message for', code, 'in', language); target[language][code] = new Template(localized); } } return target; }; exports.decompile = function (messages) { // By error code { 'number.min': } const target = {}; for (let code in messages) { const message = messages[code]; if (code === 'root') { target[code] = message; continue; } if (Template.isTemplate(message)) { target[code] = message.describe({ compact: true }); continue; } // By language { english: { 'number.min': } } const language = code; target[language] = {}; for (code in message) { const localized = message[code]; if (code === 'root') { target[language][code] = localized; continue; } target[language][code] = localized.describe({ compact: true }); } } return target; }; exports.merge = function (base, extended) { if (!base) { return exports.compile(extended); } if (!extended) { return base; } // Single value string if (typeof extended === 'string') { return new Template(extended); } // Single value template if (Template.isTemplate(extended)) { return extended; } // By error code { 'number.min': } const target = Clone(base); for (let code in extended) { const message = extended[code]; if (code === 'root' || Template.isTemplate(message)) { target[code] = message; continue; } if (typeof message === 'string') { target[code] = new Template(message); continue; } // By language { english: { 'number.min': } } Assert(typeof message === 'object' && !Array.isArray(message), 'Invalid message for', code); const language = code; target[language] = target[language] || {}; for (code in message) { const localized = message[code]; if (code === 'root' || Template.isTemplate(localized)) { target[language][code] = localized; continue; } Assert(typeof localized === 'string', 'Invalid message for', code, 'in', language); target[language][code] = new Template(localized); } } return target; };