@theia/core
Version:
Theia is a cloud & desktop IDE framework implemented in TypeScript.
119 lines • 4.45 kB
JavaScript
// *****************************************************************************
// 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
;