ngx-diagrams
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.
195 lines • 13.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/utils/tool-kit.util.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
// tslint:disable no-bitwise
// import { ROUTING_SCALING_FACTOR } from './routing/path-finding.service';
// import * as Path from 'paths-js/path';
/**
* Utility pathing and routing service
*/
import { tap } from 'rxjs/operators';
/** @enum {number} */
const LOG_LEVEL = {
'LOG': 0,
'ERROR': 1,
};
export { LOG_LEVEL };
LOG_LEVEL[LOG_LEVEL['LOG']] = 'LOG';
LOG_LEVEL[LOG_LEVEL['ERROR']] = 'ERROR';
// @internal
/** @type {?} */
export let __DEV__ = true;
// @internal
/** @type {?} */
export let __LOG__ = LOG_LEVEL.ERROR;
/**
* @return {?}
*/
export function enableDiagramProdMode() {
__DEV__ = false;
}
// @internal
/**
* @param {?} level
* @return {?}
*/
export function setLogLevel(level) {
__LOG__ = level;
}
// @internal
/**
* @return {?}
*/
export function isDev() {
return __DEV__;
}
// @internal
/**
* @param {?} message
* @param {?=} level
* @param {...?} args
* @return {?}
*/
export function log(message, level = LOG_LEVEL.LOG, ...args) {
if (isDev() && __LOG__ === level) {
if (__LOG__ === LOG_LEVEL.ERROR) {
console.error(message, ...args);
}
console.log(message, ...args);
}
}
/**
* rxjs log operator
* \@internal
* @param {?} message
* @param {?=} level
* @param {...?} args
* @return {?}
*/
export function withLog(message, level = LOG_LEVEL.LOG, ...args) {
return (/**
* @template T
* @param {?} source
* @return {?}
*/
(source) => (isDev() ? source.pipe(tap((/**
* @param {?} val
* @return {?}
*/
val => log(message, level, val, ...args)))) : source));
}
/**
* Generates a unique ID
* @return {?}
*/
export function UID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (/**
* @param {?} c
* @return {?}
*/
c => {
/** @type {?} */
const r = (Math.random() * 16) | 0;
/** @type {?} */
const v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
}));
}
/**
* @template T
* @param {?} val
* @return {?}
*/
export function isArray(val) {
return Array.isArray(val);
}
/**
* @param {?} val
* @return {?}
*/
export function isString(val) {
return typeof val === 'string';
}
/**
* @param {?} val
* @return {?}
*/
export function isFunction(val) {
return typeof val === 'function';
}
// @internal
/**
* @param {?} v
* @return {?}
*/
export function isNil(v) {
return v === null || v === undefined;
}
/**
* @template T
* @param {?} value
* @return {?}
*/
export function coerceArray(value) {
if (isNil(value)) {
return [];
}
return Array.isArray(value) ? value : [value];
}
/**
* @template T
* @param {?} map
* @return {?}
*/
export function mapToArray(map) {
/** @type {?} */
const result = [];
for (const key in map) {
if (!isNil(map[key])) {
result.push(map[key]);
}
}
return result;
}
/**
* @template T
* @param {?} arr
* @return {?}
*/
export function arrayToMap(arr) {
/** @type {?} */
const result = {};
for (const val of arr) {
if (!isNil(val)) {
result[val.id] = val;
}
}
return result;
}
/**
* @param {?} firstPoint
* @param {?} lastPoint
* @return {?}
*/
export function generateLinePath(firstPoint, lastPoint) {
return `M${firstPoint.x$},${firstPoint.y} L ${lastPoint.x$},${lastPoint.y}`;
}
/**
* @param {?} firstPoint
* @param {?} lastPoint
* @param {?=} curvy
* @return {?}
*/
export function generateCurvePath(firstPoint, lastPoint, curvy = 0) {
/** @type {?} */
const isHorizontal = Math.abs(firstPoint.x - lastPoint.x) > Math.abs(firstPoint.y - lastPoint.y);
/** @type {?} */
const curvyX = isHorizontal ? curvy : 0;
/** @type {?} */
const curvyY = isHorizontal ? 0 : curvy;
return `M${firstPoint.x},${firstPoint.y} C ${firstPoint.x + curvyX},${firstPoint.y + curvyY}
${lastPoint.x - curvyX},${lastPoint.y - curvyY} ${lastPoint.x},${lastPoint.y}`;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1raXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1kaWFncmFtcy8iLCJzb3VyY2VzIjpbImxpYi91dGlscy90b29sLWtpdC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBU0EsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUdyQyxNQUFZLFNBQVM7SUFDcEIsS0FBSyxHQUFBO0lBQ0wsT0FBTyxHQUFBO0VBQ1A7O29CQUZBLEtBQUssS0FBTCxLQUFLO29CQUNMLE9BQU8sS0FBUCxPQUFPOzs7QUFJUixNQUFNLEtBQUssT0FBTyxHQUFHLElBQUk7OztBQUV6QixNQUFNLEtBQUssT0FBTyxHQUFjLFNBQVMsQ0FBQyxLQUFLOzs7O0FBRS9DLE1BQU0sVUFBVSxxQkFBcUI7SUFDcEMsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUNqQixDQUFDOzs7Ozs7QUFHRCxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQWdCO0lBQzNDLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFDakIsQ0FBQzs7Ozs7QUFHRCxNQUFNLFVBQVUsS0FBSztJQUNwQixPQUFPLE9BQU8sQ0FBQztBQUNoQixDQUFDOzs7Ozs7OztBQUdELE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBZSxFQUFFLFFBQW1CLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFXO0lBQ3BGLElBQUksS0FBSyxFQUFFLElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTtRQUNqQyxJQUFJLE9BQU8sS0FBSyxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQ2hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDaEM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0tBQzlCO0FBQ0YsQ0FBQzs7Ozs7Ozs7O0FBTUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxPQUFlLEVBQUUsUUFBbUIs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QkFBaUIsQ0FBQyxVQUFrQixFQUFFLFNBQWlCLEVBQUUsUUFBZ0IsQ0FBQzs7VUFDbkYsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7O1VBQzFGLE1BQU0sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzs7VUFDakMsTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO0lBRXZDLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLE1BQU0sVUFBVSxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksVUFBVSxDQUFDLENBQUMsR0FBRyxNQUFNO01BQ3RGLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxJQUFJLFNBQVMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ25GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZSBuby1iaXR3aXNlXG4vLyBpbXBvcnQgeyBST1VUSU5HX1NDQUxJTkdfRkFDVE9SIH0gZnJvbSAnLi9yb3V0aW5nL3BhdGgtZmluZGluZy5zZXJ2aWNlJztcbi8vIGltcG9ydCAqIGFzIFBhdGggZnJvbSAncGF0aHMtanMvcGF0aCc7XG5cbi8qKlxuICogVXRpbGl0eSBwYXRoaW5nIGFuZCByb3V0aW5nIHNlcnZpY2VcbiAqL1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb29yZHMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nvb3Jkcy5pbnRlcmZhY2UnO1xuXG5leHBvcnQgZW51bSBMT0dfTEVWRUwge1xuXHQnTE9HJyxcblx0J0VSUk9SJ1xufVxuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBsZXQgX19ERVZfXyA9IHRydWU7XG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBsZXQgX19MT0dfXzogTE9HX0xFVkVMID0gTE9HX0xFVkVMLkVSUk9SO1xuXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlRGlhZ3JhbVByb2RNb2RlKCk6IHZvaWQge1xuXHRfX0RFVl9fID0gZmFsc2U7XG59XG5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGZ1bmN0aW9uIHNldExvZ0xldmVsKGxldmVsOiBMT0dfTEVWRUwpOiB2b2lkIHtcblx0X19MT0dfXyA9IGxldmVsO1xufVxuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBmdW5jdGlvbiBpc0RldigpOiBib29sZWFuIHtcblx0cmV0dXJuIF9fREVWX187XG59XG5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGZ1bmN0aW9uIGxvZyhtZXNzYWdlOiBzdHJpbmcsIGxldmVsOiBMT0dfTEVWRUwgPSBMT0dfTEVWRUwuTE9HLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuXHRpZiAoaXNEZXYoKSAmJiBfX0xPR19fID09PSBsZXZlbCkge1xuXHRcdGlmIChfX0xPR19fID09PSBMT0dfTEVWRUwuRVJST1IpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgLi4uYXJncyk7XG5cdFx0fVxuXHRcdGNvbnNvbGUubG9nKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuXHR9XG59XG5cbi8qKlxuICogcnhqcyBsb2cgb3BlcmF0b3JcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aExvZyhtZXNzYWdlOiBzdHJpbmcsIGxldmVsOiBMT0dfTEVWRUwgPSBMT0dfTEVWRUwuTE9HLCAuLi5hcmdzOiBhbnkpIHtcblx0cmV0dXJuIDxUPihzb3VyY2U6IE9ic2VydmFibGU8VD4pID0+IChpc0RldigpID8gc291cmNlLnBpcGUodGFwKHZhbCA9PiBsb2cobWVzc2FnZSwgbGV2ZWwsIHZhbCwgLi4uYXJncykpKSA6IHNvdXJjZSk7XG59XG5cbmV4cG9ydCB0eXBlIElEID0gc3RyaW5nO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRFxuICovXG5leHBvcnQgZnVuY3Rpb24gVUlEKCk6IElEIHtcblx0cmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgYyA9PiB7XG5cdFx0Y29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcblx0XHRjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcblx0XHRyZXR1cm4gdi50b1N0cmluZygxNik7XG5cdH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheTxUPih2YWw6IGFueSk6IHZhbCBpcyBUW10ge1xuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsOiBhbnkpOiB2YWwgaXMgc3RyaW5nIHtcblx0cmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWw6IGFueSk6IHZhbCBpcyAoLi4uYXJnczogYW55KSA9PiBhbnkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgZnVuY3Rpb24gaXNOaWwodjogYW55KSB7XG5cdHJldHVybiB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvZXJjZUFycmF5PFQ+KHZhbHVlOiBUIHwgVFtdKTogVFtdIHtcblx0aWYgKGlzTmlsKHZhbHVlKSkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRyZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb0FycmF5PFQ+KG1hcDogeyBba2V5OiBzdHJpbmddOiBUIH0pOiBUW10ge1xuXHRjb25zdCByZXN1bHQgPSBbXTtcblx0Zm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG5cdFx0aWYgKCFpc05pbChtYXBba2V5XSkpIHtcblx0XHRcdHJlc3VsdC5wdXNoKG1hcFtrZXldKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlUb01hcDxUPihhcnI6IEFycmF5PHsgaWQ6IElEIH0gJiBUPik6IHsgW2tleTogc3RyaW5nXTogVCB9IHtcblx0Y29uc3QgcmVzdWx0ID0ge307XG5cdGZvciAoY29uc3QgdmFsIG9mIGFycikge1xuXHRcdGlmICghaXNOaWwodmFsKSkge1xuXHRcdFx0cmVzdWx0W3ZhbC5pZF0gPSB2YWw7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTGluZVBhdGgoZmlyc3RQb2ludDogYW55LCBsYXN0UG9pbnQ6IGFueSk6IHN0cmluZyB7XG5cdHJldHVybiBgTSR7Zmlyc3RQb2ludC54JH0sJHtmaXJzdFBvaW50Lnl9IEwgJHtsYXN0UG9pbnQueCR9LCR7bGFzdFBvaW50Lnl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQ3VydmVQYXRoKGZpcnN0UG9pbnQ6IENvb3JkcywgbGFzdFBvaW50OiBDb29yZHMsIGN1cnZ5OiBudW1iZXIgPSAwKTogc3RyaW5nIHtcblx0Y29uc3QgaXNIb3Jpem9udGFsID0gTWF0aC5hYnMoZmlyc3RQb2ludC54IC0gbGFzdFBvaW50LngpID4gTWF0aC5hYnMoZmlyc3RQb2ludC55IC0gbGFzdFBvaW50LnkpO1xuXHRjb25zdCBjdXJ2eVggPSBpc0hvcml6b250YWwgPyBjdXJ2eSA6IDA7XG5cdGNvbnN0IGN1cnZ5WSA9IGlzSG9yaXpvbnRhbCA/IDAgOiBjdXJ2eTtcblxuXHRyZXR1cm4gYE0ke2ZpcnN0UG9pbnQueH0sJHtmaXJzdFBvaW50Lnl9IEMgJHtmaXJzdFBvaW50LnggKyBjdXJ2eVh9LCR7Zmlyc3RQb2ludC55ICsgY3VydnlZfVxuICAgICR7bGFzdFBvaW50LnggLSBjdXJ2eVh9LCR7bGFzdFBvaW50LnkgLSBjdXJ2eVl9ICR7bGFzdFBvaW50Lnh9LCR7bGFzdFBvaW50Lnl9YDtcbn1cblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRHluYW1pY1BhdGgocGF0aENvb3JkczogbnVtYmVyW11bXSkge1xuLy8gICAgIGxldCBwYXRoID0gUGF0aCgpO1xuLy8gICAgIHBhdGggPSBwYXRoLm1vdmV0byhwYXRoQ29vcmRzWzBdWzBdICogUk9VVElOR19TQ0FMSU5HX0ZBQ1RPUiwgcGF0aENvb3Jkc1swXVsxXSAqIFJPVVRJTkdfU0NBTElOR19GQUNUT1IpO1xuLy8gICAgIHBhdGhDb29yZHMuc2xpY2UoMSkuZm9yRWFjaChjb29yZHMgPT4ge1xuLy8gICAgICAgICBwYXRoID0gcGF0aC5saW5ldG8oY29vcmRzWzBdICogUk9VVElOR19TQ0FMSU5HX0ZBQ1RPUiwgY29vcmRzWzFdICogUk9VVElOR19TQ0FMSU5HX0ZBQ1RPUik7XG4vLyAgICAgfSk7XG4vLyAgICAgcmV0dXJuIHBhdGgucHJpbnQoKTtcbi8vIH1cbiJdfQ==