UNPKG

ngx-diagrams

Version:

> Light Weight, Modular, Typed Diagram Engine for Angular

128 lines 16.5 kB
// eslint-disable no-bitwise import SVGPath from 'paths-js/path'; import { distinctUntilChanged, shareReplay, takeUntil, tap } from 'rxjs/operators'; import { ROUTING_SCALING_FACTOR } from '../plugins/smart-routing.plugin'; export var LOG_LEVEL; (function (LOG_LEVEL) { LOG_LEVEL[LOG_LEVEL["LOG"] = 0] = "LOG"; LOG_LEVEL[LOG_LEVEL["ERROR"] = 1] = "ERROR"; })(LOG_LEVEL || (LOG_LEVEL = {})); // @internal export let __DEV__ = true; // @internal export let __LOG__ = LOG_LEVEL.ERROR; export function enableDiagramProdMode() { __DEV__ = false; } // @internal export function setLogLevel(level) { __LOG__ = level; } // @internal export function isDev() { return __DEV__; } // @internal 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 */ export function withLog(message, level = LOG_LEVEL.LOG, ...args) { return (source) => isDev() ? source.pipe(tap((val) => log(message, level, val, ...args))) : source; } /** * rxjs entity properties operator * @internal */ export function entityProperty(destroyedNotifier, replayBy = 1, logMessage = '') { return (source) => source.pipe(distinctUntilChanged((a, b) => a instanceof Map || b instanceof Map ? false : a === b), shareReplay(replayBy), withLog(logMessage), takeUntil(destroyedNotifier)); } /** * Generates a unique ID */ export function UID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { const r = (Math.random() * 16) | 0; const v = c === 'x' ? r : (r & 0x3) | 0x8; return v.toString(16); }); } export function isArray(val) { return Array.isArray(val); } export function isString(val) { return typeof val === 'string'; } export function isFunction(val) { return typeof val === 'function'; } // @internal export function isNil(v) { return v === null || v === undefined; } export function coerceArray(value) { if (isNil(value)) { return []; } return Array.isArray(value) ? value : [value]; } export function isEmptyArray(arr) { return !arr || !isArray(arr) || arr.length === 0; } export function mapToArray(map) { const result = []; for (const key in map) { if (!isNil(map[key])) { result.push(map[key]); } } return result; } export function mapToEntries(map) { const result = []; for (const key in map) { result.push([key, map[key]]); } return result; } export function unique(arr) { return [...new Set(arr)]; } export function arrayToMap(arr) { const result = {}; for (const val of arr) { if (!isNil(val)) { result[val.id] = val; } } return result; } export function generateLinePath(firstPoint, lastPoint) { return `M${firstPoint.x$},${firstPoint.y} L ${lastPoint.x$},${lastPoint.y}`; } export function generateCurvePath(firstPoint, lastPoint, curvy = 0) { const isHorizontal = Math.abs(firstPoint.x - lastPoint.x) > Math.abs(firstPoint.y - lastPoint.y); const curvyX = isHorizontal ? curvy : 0; 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}`; } export function generateDynamicPath(pathCoords) { let path = SVGPath(); path = path.moveto(pathCoords[0][0] * ROUTING_SCALING_FACTOR, pathCoords[0][1] * ROUTING_SCALING_FACTOR); pathCoords.slice(1).forEach((coords) => { path = path.lineto(coords[0] * ROUTING_SCALING_FACTOR, coords[1] * ROUTING_SCALING_FACTOR); }); return path.print(); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbC1raXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9saWJzL25neC1kaWFncmFtcy9zcmMvIiwic291cmNlcyI6WyJsaWIvdXRpbHMvdG9vbC1raXQudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2QkFBNkI7QUFDN0IsT0FBTyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBS3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5GLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR3pFLE1BQU0sQ0FBTixJQUFZLFNBR1g7QUFIRCxXQUFZLFNBQVM7SUFDbkIsdUNBQUssQ0FBQTtJQUNMLDJDQUFPLENBQUE7QUFDVCxDQUFDLEVBSFcsU0FBUyxLQUFULFNBQVMsUUFHcEI7QUFFRCxZQUFZO0FBQ1osTUFBTSxDQUFDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztBQUMxQixZQUFZO0FBQ1osTUFBTSxDQUFDLElBQUksT0FBTyxHQUFjLFNBQVMsQ0FBQyxLQUFLLENBQUM7QUFFaEQsTUFBTSxVQUFVLHFCQUFxQjtJQUNuQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ2xCLENBQUM7QUFFRCxZQUFZO0FBQ1osTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFnQjtJQUMxQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0FBQ2xCLENBQUM7QUFFRCxZQUFZO0FBQ1osTUFBTSxVQUFVLEtBQUs7SUFDbkIsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELFlBQVk7QUFDWixNQUFNLFVBQVUsR0FBRyxDQUNqQixPQUFlLEVBQ2YsUUFBbUIsU0FBUyxDQUFDLEdBQUcsRUFDaEMsR0FBRyxJQUFXO0lBRWQsSUFBSSxLQUFLLEVBQUUsSUFBSSxPQUFPLEtBQUssS0FBSyxFQUFFO1FBQ2hDLElBQUksT0FBTyxLQUFLLFNBQVMsQ0FBQyxLQUFL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Q0FBQztJQUNGLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDckMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQ2hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsRUFDbEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLHNCQUFzQixDQUNuQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUgIG5vLWJpdHdpc2VcbmltcG9ydCBTVkdQYXRoIGZyb20gJ3BhdGhzLWpzL3BhdGgnO1xuLyoqXG4gKiBVdGlsaXR5IHBhdGhpbmcgYW5kIHJvdXRpbmcgc2VydmljZVxuICovXG5pbXBvcnQgeyBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzaGFyZVJlcGxheSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb29yZHMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nvb3Jkcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUk9VVElOR19TQ0FMSU5HX0ZBQ1RPUiB9IGZyb20gJy4uL3BsdWdpbnMvc21hcnQtcm91dGluZy5wbHVnaW4nO1xuaW1wb3J0IHsgRW50cmllcywgSGFzaE1hcCB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgZW51bSBMT0dfTEVWRUwge1xuICAnTE9HJyxcbiAgJ0VSUk9SJyxcbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgbGV0IF9fREVWX18gPSB0cnVlO1xuLy8gQGludGVybmFsXG5leHBvcnQgbGV0IF9fTE9HX186IExPR19MRVZFTCA9IExPR19MRVZFTC5FUlJPUjtcblxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZURpYWdyYW1Qcm9kTW9kZSgpOiB2b2lkIHtcbiAgX19ERVZfXyA9IGZhbHNlO1xufVxuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2dMZXZlbChsZXZlbDogTE9HX0xFVkVMKTogdm9pZCB7XG4gIF9fTE9HX18gPSBsZXZlbDtcbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgZnVuY3Rpb24gaXNEZXYoKTogYm9vbGVhbiB7XG4gIHJldHVybiBfX0RFVl9fO1xufVxuXG4vLyBAaW50ZXJuYWxcbmV4cG9ydCBmdW5jdGlvbiBsb2coXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgbGV2ZWw6IExPR19MRVZFTCA9IExPR19MRVZFTC5MT0csXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiB2b2lkIHtcbiAgaWYgKGlzRGV2KCkgJiYgX19MT0dfXyA9PT0gbGV2ZWwpIHtcbiAgICBpZiAoX19MT0dfXyA9PT0gTE9HX0xFVkVMLkVSUk9SKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxufVxuXG4vKipcbiAqIHJ4anMgbG9nIG9wZXJhdG9yXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhMb2coXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgbGV2ZWw6IExPR19MRVZFTCA9IExPR19MRVZFTC5MT0csXG4gIC4uLmFyZ3M6IGFueVxuKSB7XG4gIHJldHVybiA8VD4oc291cmNlOiBPYnNlcnZhYmxlPFQ+KSA9PlxuICAgIGlzRGV2KClcbiAgICAgID8gc291cmNlLnBpcGUodGFwKCh2YWwpID0+IGxvZyhtZXNzYWdlLCBsZXZlbCwgdmFsLCAuLi5hcmdzKSkpXG4gICAgICA6IHNvdXJjZTtcbn1cblxuLyoqXG4gKiByeGpzIGVudGl0eSBwcm9wZXJ0aWVzIG9wZXJhdG9yXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudGl0eVByb3BlcnR5PFQ+KFxuICBkZXN0cm95ZWROb3RpZmllcjogT2JzZXJ2YWJsZTxhbnk+LFxuICByZXBsYXlCeSA9IDEsXG4gIGxvZ01lc3NhZ2UgPSAnJ1xuKTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFQ+IHtcbiAgcmV0dXJuIDxUPihzb3VyY2U6IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFQ+ID0+XG4gICAgc291cmNlLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT5cbiAgICAgICAgYSBpbnN0YW5jZW9mIE1hcCB8fCBiIGluc3RhbmNlb2YgTWFwID8gZmFsc2UgOiBhID09PSBiXG4gICAgICApLFxuICAgICAgc2hhcmVSZXBsYXkocmVwbGF5QnkpLFxuICAgICAgd2l0aExvZyhsb2dNZXNzYWdlKSxcbiAgICAgIHRha2VVbnRpbChkZXN0cm95ZWROb3RpZmllcilcbiAgICApO1xufVxuXG5leHBvcnQgdHlwZSBJRCA9IHN0cmluZztcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSURcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFVJRCgpOiBJRCB7XG4gIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheTxUPih2YWw6IGFueSk6IHZhbCBpcyBUW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsOiBhbnkpOiB2YWwgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWw6IGFueSk6IHZhbCBpcyAoLi4uYXJnczogYW55KSA9PiBhbnkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLy8gQGludGVybmFsXG5leHBvcnQgZnVuY3Rpb24gaXNOaWwodjogYW55KSB7XG4gIHJldHVybiB2ID09PSBudWxsIHx8IHYgPT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvZXJjZUFycmF5PFQ+KHZhbHVlOiBUIHwgVFtdKTogVFtdIHtcbiAgaWYgKGlzTmlsKHZhbHVlKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5QXJyYXk8VD4oYXJyOiBUW10pOiBib29sZWFuIHtcbiAgcmV0dXJuICFhcnIgfHwgIWlzQXJyYXkoYXJyKSB8fCBhcnIubGVuZ3RoID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9BcnJheTxUPihtYXA6IEhhc2hNYXA8VD4pOiBUW10ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgaWYgKCFpc05pbChtYXBba2V5XSkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKG1hcFtrZXldKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9FbnRyaWVzPFQ+KG1hcDogSGFzaE1hcDxUPik6IEVudHJpZXM8VD4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgcmVzdWx0LnB1c2goW2tleSwgbWFwW2tleV1dKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4oYXJyOiBUW10pOiBUW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQ8VD4oYXJyKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVRvTWFwPFQ+KGFycjogQXJyYXk8eyBpZDogSUQgfSAmIFQ+KTogSGFzaE1hcDxUPiB7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBmb3IgKGNvbnN0IHZhbCBvZiBhcnIpIHtcbiAgICBpZiAoIWlzTmlsKHZhbCkpIHtcbiAgICAgIHJlc3VsdFt2YWwuaWRdID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUxpbmVQYXRoKGZpcnN0UG9pbnQ6IGFueSwgbGFzdFBvaW50OiBhbnkpOiBzdHJpbmcge1xuICByZXR1cm4gYE0ke2ZpcnN0UG9pbnQueCR9LCR7Zmlyc3RQb2ludC55fSBMICR7bGFzdFBvaW50LngkfSwke2xhc3RQb2ludC55fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUN1cnZlUGF0aChcbiAgZmlyc3RQb2ludDogQ29vcmRzLFxuICBsYXN0UG9pbnQ6IENvb3JkcyxcbiAgY3VydnkgPSAwXG4pOiBzdHJpbmcge1xuICBjb25zdCBpc0hvcml6b250YWwgPVxuICAgIE1hdGguYWJzKGZpcnN0UG9pbnQueCAtIGxhc3RQb2ludC54KSA+IE1hdGguYWJzKGZpcnN0UG9pbnQueSAtIGxhc3RQb2ludC55KTtcbiAgY29uc3QgY3VydnlYID0gaXNIb3Jpem9udGFsID8gY3VydnkgOiAwO1xuICBjb25zdCBjdXJ2eVkgPSBpc0hvcml6b250YWwgPyAwIDogY3Vydnk7XG5cbiAgcmV0dXJuIGBNJHtmaXJzdFBvaW50Lnh9LCR7Zmlyc3RQb2ludC55fSBDICR7Zmlyc3RQb2ludC54ICsgY3VydnlYfSwke1xuICAgIGZpcnN0UG9pbnQueSArIGN1cnZ5WVxuICB9XG4gICAgJHtsYXN0UG9pbnQueCAtIGN1cnZ5WH0sJHtsYXN0UG9pbnQueSAtIGN1cnZ5WX0gJHtsYXN0UG9pbnQueH0sJHtcbiAgICBsYXN0UG9pbnQueVxuICB9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlRHluYW1pY1BhdGgocGF0aENvb3JkczogbnVtYmVyW11bXSkge1xuICBsZXQgcGF0aCA9IFNWR1BhdGgoKTtcbiAgcGF0aCA9IHBhdGgubW92ZXRvKFxuICAgIHBhdGhDb29yZHNbMF1bMF0gKiBST1VUSU5HX1NDQUxJTkdfRkFDVE9SLFxuICAgIHBhdGhDb29yZHNbMF1bMV0gKiBST1VUSU5HX1NDQUxJTkdfRkFDVE9SXG4gICk7XG4gIHBhdGhDb29yZHMuc2xpY2UoMSkuZm9yRWFjaCgoY29vcmRzKSA9PiB7XG4gICAgcGF0aCA9IHBhdGgubGluZXRvKFxuICAgICAgY29vcmRzWzBdICogUk9VVElOR19TQ0FMSU5HX0ZBQ1RPUixcbiAgICAgIGNvb3Jkc1sxXSAqIFJPVVRJTkdfU0NBTElOR19GQUNUT1JcbiAgICApO1xuICB9KTtcbiAgcmV0dXJuIHBhdGgucHJpbnQoKTtcbn1cbiJdfQ==