Skip to content
Snippets Groups Projects
Select Git revision
  • 59531719b635108630fffc4ef6c3b3df4dcbee19
  • master default protected
  • 1.31
  • 4.24.3
  • 4.24.2
  • 4.24.1
  • 4.24.0
  • 4.23.6
  • 4.23.5
  • 4.23.4
  • 4.23.3
  • 4.23.2
  • 4.23.1
  • 4.23.0
  • 4.22.3
  • 4.22.2
  • 4.22.1
  • 4.22.0
  • 4.21.0
  • 4.20.1
  • 4.20.0
  • 4.19.0
  • 4.18.0
23 results

util.mjs

Blame
  • util.mjs 1.97 KiB
    /**
     * Copyright © schukai GmbH and all contributing authors, {{copyRightYear}}. All rights reserved.
     * Node module: @schukai/monster
     *
     * This source code is licensed under the GNU Affero General Public License version 3 (AGPLv3).
     * The full text of the license can be found at: https://www.gnu.org/licenses/agpl-3.0.en.html
     *
     * For those who do not wish to adhere to the AGPLv3, a commercial license is available.
     * Acquiring a commercial license allows you to use this software without complying with the AGPLv3 terms.
     * For more information about purchasing a commercial license, please contact schukai GmbH.
     *
     * SPDX-License-Identifier: AGPL-3.0
     */
    
    import { diff } from "../../data/diff.mjs";
    import { Pathfinder } from "../../data/pathfinder.mjs";
    import {isObject, isPrimitive} from "../../types/is.mjs";
    import { Observer } from "../../types/observer.mjs";
    
    export { handleDataSourceChanges, datasourceLinkedElementSymbol };
    
    /**
     * @private
     * @type {symbol}
     */
    const datasourceLinkedElementSymbol = Symbol("datasourceLinkedElement");
    
    /**
     * @private
     */
    function handleDataSourceChanges() {
    	if (!this[datasourceLinkedElementSymbol]) {
    		return;
    	}
    
    	let data = this[datasourceLinkedElementSymbol]?.data;
    
    	if(isPrimitive(data)) {
    		throw new Error("Data must be an object or an array");
    	}
    
    	const actualData = JSON.stringify(this.getOption("data"));
    	const actualDataAsObj = JSON.parse(actualData);
    
    	const path = this.getOption("mapping.data");
    	if (path) {
    		data = new Pathfinder(data).getVia(path);
    	}
    
    	if (isObject(data)) {
    		const tmp = [];
    		const keys = Object.keys(data);
    		for (const key of keys) {
    			tmp.push(data[key]);
    		}
    		data = tmp;
    	}
    
    	const index = this.getOption("mapping.index");
    	if (index !== undefined && index !== null) {
    		data = data?.[index];
    	}
    
    	if (data === undefined || data === null) {
    		data = [];
    	}
    
    	const result = diff(data, actualDataAsObj);
    	if (result.length === 0) {
    		return;
    	}
    
    	queueMicrotask(() => {
    		this.setOption("data", data);
    	});
    }