UNPKG

@theia/core

Version:

Theia is a cloud & desktop IDE framework implemented in TypeScript.

119 lines 4.45 kB
"use strict"; // ***************************************************************************** // Copyright (C) 2018 Ericsson and others. // // This program and the accompanying materials are made available under the // terms of the Eclipse Public License v. 2.0 which is available at // http://www.eclipse.org/legal/epl-2.0. // // This Source Code may also be made available under the following Secondary // Licenses when the conditions for such availability set forth in the Eclipse // Public License v. 2.0 are satisfied: GNU General Public License, version 2 // with the GNU Classpath Exception which is available at // https://www.gnu.org/software/classpath/license.html. // // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** Object.defineProperty(exports, "__esModule", { value: true }); exports.cloneAndChange = exports.isEmpty = exports.notEmpty = exports.deepFreeze = exports.deepClone = void 0; const types_1 = require("./types"); function deepClone(obj) { if (!(0, types_1.isObject)(obj)) { return obj; } if (obj instanceof RegExp) { return obj; } // eslint-disable-next-line @typescript-eslint/no-explicit-any const result = Array.isArray(obj) ? [] : {}; Object.keys(obj).forEach((key) => { const prop = obj[key]; if ((0, types_1.isObject)(prop)) { result[key] = deepClone(prop); } else { result[key] = prop; } }); return result; } exports.deepClone = deepClone; function deepFreeze(obj) { if (!(0, types_1.isObject)(obj)) { return obj; } // eslint-disable-next-line @typescript-eslint/no-explicit-any const stack = [obj]; while (stack.length > 0) { const objectToFreeze = stack.shift(); Object.freeze(objectToFreeze); for (const key in objectToFreeze) { if (_hasOwnProperty.call(objectToFreeze, key)) { const prop = objectToFreeze[key]; if ((0, types_1.isObject)(prop) && !Object.isFrozen(prop)) { stack.push(prop); } } } } return obj; } exports.deepFreeze = deepFreeze; const _hasOwnProperty = Object.prototype.hasOwnProperty; function notEmpty(arg) { // eslint-disable-next-line no-null/no-null return arg !== undefined && arg !== null; } exports.notEmpty = notEmpty; /** * `true` if the argument is an empty object. Otherwise, `false`. */ function isEmpty(arg) { return Object.keys(arg).length === 0 && arg.constructor === Object; } exports.isEmpty = isEmpty; /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation and others. All rights reserved. * Licensed under the MIT License. See https://github.com/Microsoft/vscode/blob/master/LICENSE.txt for license information. *--------------------------------------------------------------------------------------------*/ // Copied from https://github.com/microsoft/vscode/blob/1.72.2/src/vs/base/common/objects.ts // eslint-disable-next-line @typescript-eslint/no-explicit-any function cloneAndChange(obj, changer) { return _cloneAndChange(obj, changer, new Set()); } exports.cloneAndChange = cloneAndChange; // eslint-disable-next-line @typescript-eslint/no-explicit-any function _cloneAndChange(obj, changer, seen) { if ((0, types_1.isUndefinedOrNull)(obj)) { return obj; } const changed = changer(obj); if (!(0, types_1.isUndefined)(changed)) { return changed; } if (Array.isArray(obj)) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const r1 = []; for (const e of obj) { r1.push(_cloneAndChange(e, changer, seen)); } return r1; } if ((0, types_1.isObject)(obj)) { if (seen.has(obj)) { throw new Error('Cannot clone recursive data-structure'); } seen.add(obj); const r2 = {}; for (const i2 in obj) { if (_hasOwnProperty.call(obj, i2)) { // eslint-disable-next-line @typescript-eslint/no-explicit-any r2[i2] = _cloneAndChange(obj[i2], changer, seen); } } seen.delete(obj); return r2; } return obj; } //# sourceMappingURL=objects.js.map