This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
4.6 KiB
147 lines
4.6 KiB
'use strict'; |
|
|
|
var _prettyFormat = require('pretty-format'); |
|
|
|
var _prettyFormat2 = _interopRequireDefault(_prettyFormat); |
|
|
|
var _chalk = require('chalk'); |
|
|
|
var _chalk2 = _interopRequireDefault(_chalk); |
|
|
|
var _jestGetType = require('jest-get-type'); |
|
|
|
var _jestGetType2 = _interopRequireDefault(_jestGetType); |
|
|
|
var _diff_strings = require('./diff_strings'); |
|
|
|
var _diff_strings2 = _interopRequireDefault(_diff_strings); |
|
|
|
var _constants = require('./constants'); |
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
|
|
|
/** |
|
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file in the root directory of this source tree. |
|
* |
|
* |
|
*/ |
|
|
|
var _prettyFormat$plugins = _prettyFormat2.default.plugins; |
|
const AsymmetricMatcher = _prettyFormat$plugins.AsymmetricMatcher, |
|
DOMCollection = _prettyFormat$plugins.DOMCollection, |
|
DOMElement = _prettyFormat$plugins.DOMElement, |
|
Immutable = _prettyFormat$plugins.Immutable, |
|
ReactElement = _prettyFormat$plugins.ReactElement, |
|
ReactTestComponent = _prettyFormat$plugins.ReactTestComponent; |
|
|
|
|
|
const PLUGINS = [ReactTestComponent, ReactElement, DOMElement, DOMCollection, Immutable, AsymmetricMatcher]; |
|
const FORMAT_OPTIONS = { |
|
plugins: PLUGINS |
|
}; |
|
const FORMAT_OPTIONS_0 = Object.assign({}, FORMAT_OPTIONS, { |
|
indent: 0 |
|
}); |
|
const FALLBACK_FORMAT_OPTIONS = { |
|
callToJSON: false, |
|
maxDepth: 10, |
|
plugins: PLUGINS |
|
}; |
|
const FALLBACK_FORMAT_OPTIONS_0 = Object.assign({}, FALLBACK_FORMAT_OPTIONS, { |
|
indent: 0 |
|
}); |
|
|
|
const MULTILINE_REGEXP = /[\r\n]/; |
|
|
|
// Generate a string that will highlight the difference between two values |
|
// with green and red. (similar to how github does code diffing) |
|
function diff(a, b, options) { |
|
if (a === b) { |
|
return _constants.NO_DIFF_MESSAGE; |
|
} |
|
|
|
const aType = (0, _jestGetType2.default)(a); |
|
let expectedType = aType; |
|
let omitDifference = false; |
|
if (aType === 'object' && typeof a.asymmetricMatch === 'function') { |
|
if (a.$$typeof !== Symbol.for('jest.asymmetricMatcher')) { |
|
// Do not know expected type of user-defined asymmetric matcher. |
|
return null; |
|
} |
|
if (typeof a.getExpectedType !== 'function') { |
|
// For example, expect.anything() matches either null or undefined |
|
return null; |
|
} |
|
expectedType = a.getExpectedType(); |
|
// Primitive types boolean and number omit difference below. |
|
// For example, omit difference for expect.stringMatching(regexp) |
|
omitDifference = expectedType === 'string'; |
|
} |
|
|
|
if (expectedType !== (0, _jestGetType2.default)(b)) { |
|
return ' Comparing two different types of values.' + ` Expected ${_chalk2.default.green(expectedType)} but ` + `received ${_chalk2.default.red((0, _jestGetType2.default)(b))}.`; |
|
} |
|
|
|
if (omitDifference) { |
|
return null; |
|
} |
|
|
|
switch (aType) { |
|
case 'string': |
|
const multiline = MULTILINE_REGEXP.test(a) && b.indexOf('\n') !== -1; |
|
if (multiline) { |
|
return (0, _diff_strings2.default)(a, b, options); |
|
} |
|
return null; |
|
case 'number': |
|
case 'boolean': |
|
return null; |
|
case 'map': |
|
return compareObjects(sortMap(a), sortMap(b), options); |
|
case 'set': |
|
return compareObjects(sortSet(a), sortSet(b), options); |
|
default: |
|
return compareObjects(a, b, options); |
|
} |
|
} |
|
|
|
function sortMap(map) { |
|
return new Map(Array.from(map.entries()).sort()); |
|
} |
|
|
|
function sortSet(set) { |
|
return new Set(Array.from(set.values()).sort()); |
|
} |
|
|
|
function compareObjects(a, b, options) { |
|
let diffMessage; |
|
let hasThrown = false; |
|
|
|
try { |
|
diffMessage = (0, _diff_strings2.default)((0, _prettyFormat2.default)(a, FORMAT_OPTIONS_0), (0, _prettyFormat2.default)(b, FORMAT_OPTIONS_0), options, { |
|
a: (0, _prettyFormat2.default)(a, FORMAT_OPTIONS), |
|
b: (0, _prettyFormat2.default)(b, FORMAT_OPTIONS) |
|
}); |
|
} catch (e) { |
|
hasThrown = true; |
|
} |
|
|
|
// If the comparison yields no results, compare again but this time |
|
// without calling `toJSON`. It's also possible that toJSON might throw. |
|
if (!diffMessage || diffMessage === _constants.NO_DIFF_MESSAGE) { |
|
diffMessage = (0, _diff_strings2.default)((0, _prettyFormat2.default)(a, FALLBACK_FORMAT_OPTIONS_0), (0, _prettyFormat2.default)(b, FALLBACK_FORMAT_OPTIONS_0), options, { |
|
a: (0, _prettyFormat2.default)(a, FALLBACK_FORMAT_OPTIONS), |
|
b: (0, _prettyFormat2.default)(b, FALLBACK_FORMAT_OPTIONS) |
|
}); |
|
if (diffMessage !== _constants.NO_DIFF_MESSAGE && !hasThrown) { |
|
diffMessage = _constants.SIMILAR_MESSAGE + '\n\n' + diffMessage; |
|
} |
|
} |
|
|
|
return diffMessage; |
|
} |
|
|
|
module.exports = diff; |