travel/admin/node_modules/@hapi/hoek/lib/applyToDefaults.js

56 lines
1.9 KiB
JavaScript
Raw Normal View History

2024-06-24 11:28:18 +08:00
'use strict';
const Assert = require('./assert');
const Clone = require('./clone');
const Merge = require('./merge');
const Utils = require('./utils');
const internals = {};
module.exports = function (defaults, source, options = {}) {
Assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object');
Assert(!source || source === true || typeof source === 'object', 'Invalid source value: must be true, falsy or an object');
Assert(typeof options === 'object', 'Invalid options: must be an object');
if (!source) { // If no source, return null
return null;
}
if (options.shallow) {
return internals.applyToDefaultsWithShallow(defaults, source, options);
}
const copy = Clone(defaults);
if (source === true) { // If source is set to true, use defaults
return copy;
}
const nullOverride = options.nullOverride !== undefined ? options.nullOverride : false;
return Merge(copy, source, { nullOverride, mergeArrays: false });
};
internals.applyToDefaultsWithShallow = function (defaults, source, options) {
const keys = options.shallow;
Assert(Array.isArray(keys), 'Invalid keys');
options = Object.assign({}, options);
options.shallow = false;
const copy = Clone(defaults, { shallow: keys });
if (source === true) { // If source is set to true, use defaults
return copy;
}
const storage = Utils.store(source, keys); // Move shallow copy items to storage
Merge(copy, source, { mergeArrays: false, nullOverride: false }); // Deep copy the rest
Utils.restore(copy, source, storage); // Shallow copy the stored items and restore
return copy;
};