Files
30-seconds-of-code/node_modules/@gatsbyjs/relay-compiler/lib/deepMergeAssignments.js
2019-08-20 15:52:05 +02:00

69 lines
2.1 KiB
JavaScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
*
* @format
*/
'use strict';
/**
* Given a object of nested properties, return JavaScript text that would merge
* in an object named `objectName` by a series of individual assignments.
*/
function deepMergeAssignments(objectName, properties) {
var assignments = [];
collectAssignmentsInto(assignments, [], properties);
var jsAssignments = assignments.map(function (_ref) {
var path = _ref.path,
value = _ref.value;
return formatJSAssignment(objectName, path, value);
});
return jsAssignments.length === 0 ? '' : jsAssignments.join('\n');
} // Recursively collect assignments
function collectAssignmentsInto(assignments, parentPath, parentValue) {
// Iterate over the entries in the array or object.
forEach(parentValue, function (value, key) {
// The "path" is the sequence of keys to arrive at this assignment.
var path = parentPath.concat(key); // For each entry, either add an assignment or recurse.
if (typeof value === 'object' && value !== null) {
collectAssignmentsInto(assignments, path, value);
} else {
assignments.push({
path: path,
value: value
});
}
});
} // Print a path/value pair as a JS assignment expression.
function formatJSAssignment(objectName, path, value) {
var assignmentPath = path.map(function (p) {
return typeof p === 'string' ? ".".concat(p) : "[".concat(p, "]");
}).join('');
var jsValue = value === undefined ? 'undefined' : JSON.stringify(value);
return "".concat(objectName).concat(assignmentPath, " = ").concat(jsValue, ";");
} // Utility for looping over entries in both Arrays and Objects.
function forEach(value, fn) {
if (Array.isArray(value)) {
for (var i = 0; i < value.length; i++) {
fn(value[i], i);
}
} else {
for (var k in value) {
if (value.hasOwnProperty(k)) {
fn(value[k], k);
}
}
}
}
module.exports = deepMergeAssignments;