8a5de327bb
The first parameter to Object.assign() is the same target object that
will be returned. That is, since commit 46874eed0
Params.parse() modifies
the @defaults object. Usually we pass that parameter as an object literal
and this isn't an issue, but the change breaks spectacularly in the few
cases where we use a re-usable variable.
Restore the previous behavior by copying the object first.
https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/615
30 lines
1.0 KiB
JavaScript
30 lines
1.0 KiB
JavaScript
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
|
|
const Lang = imports.lang;
|
|
|
|
// parse:
|
|
// @params: caller-provided parameter object, or %null
|
|
// @defaults-provided defaults object
|
|
// @allowExtras: whether or not to allow properties not in @default
|
|
//
|
|
// Examines @params and fills in default values from @defaults for
|
|
// any properties in @defaults that don't appear in @params. If
|
|
// @allowExtras is not %true, it will throw an error if @params
|
|
// contains any properties that aren't in @defaults.
|
|
//
|
|
// If @params is %null, this returns the values from @defaults.
|
|
//
|
|
// Return value: a new object, containing the merged parameters from
|
|
// @params and @defaults
|
|
function parse(params = {}, defaults, allowExtras) {
|
|
if (!allowExtras) {
|
|
for (let prop in params)
|
|
if (!(prop in defaults))
|
|
throw new Error(`Unrecognized parameter "${prop}"`);
|
|
}
|
|
|
|
let defaultsCopy = {};
|
|
Lang.copyProperties(defaults, defaultsCopy);
|
|
return Object.assign(defaultsCopy, params);
|
|
}
|