/* * Copyright (C) 2019 StApps * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ /** * A recursive partial object * * Copied from https://stackoverflow.com/a/51365037 */ import {Transport, VerifiableTransport} from './Transport'; export type RecursivePartial = { [P in keyof T]?: T[P] extends Array ? Array> : T[P] extends object ? RecursivePartial : T[P]; }; /** * Deletes all properties that are undefined from an object * @param obj */ export function deleteUndefinedProperties(obj: any) { // return atomic data types and arrays (recursion anchor) if (typeof obj !== 'object' || Array.isArray(obj)) { return obj; } // check each key Object.keys(obj).forEach((key) => { if (typeof obj[key] === 'undefined') { // delete undefined keys delete obj[key]; } else { // check recursive obj[key] = deleteUndefinedProperties(obj[key]); } }); return obj; } /** * Checks if environment is Node.js */ export function isNodeEnvironment(): boolean { return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'; } /** * Checks if environment is productive */ export function isProductiveEnvironment(): boolean { return typeof process.env === 'object' && typeof process.env.NODE_ENV !== 'undefined' && process.env.NODE_ENV === 'production'; } /** * Checks if environment is Node.js and productive */ export function isProductiveNodeEnvironment(): boolean { return isNodeEnvironment() && isProductiveEnvironment(); } /** * Check if a transport is a verifiable transport * * @param transport Transport to check */ export function isTransportWithVerification(transport: Transport): transport is VerifiableTransport { return transport instanceof VerifiableTransport; }