PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-bin/src

Просмотр файла: parseUnknown.ts

import { isParserNodeValue, Parser, ParserNode, ParserNodeValue } from './Parser';

function omitObject(v: unknown): boolean {
  return typeof v === 'function';
}

function getPrototypeKeys(obj: unknown): string[] {
  const keys: string[] = [];
  let proto = obj;
  while (proto && proto !== Object.prototype) {
    keys.push(...Object.getOwnPropertyNames(proto));
    proto = Object.getPrototypeOf(proto);
  }
  return keys;
}

export function parseUnknown(
  p: Parser,
  label: string | number,
  obj: unknown,
  { omit = [] }: { omit?: string[] } = {}
): ParserNode {
  if (isParserNodeValue(obj)) {
    if (typeof obj === 'string') {
      obj = JSON.stringify(obj);
    }
    return p.node(label, obj as ParserNodeValue);
  }

  if (typeof obj !== 'object' || obj === null) {
    throw new Error(`expected object, got ${typeof obj}`);
  }

  if (Array.isArray(obj)) {
    return p.node(
      label,
      `length: ${obj.length}`,
      obj.filter((v) => !omitObject(v)).map((v, i) => parseUnknown(p, i, v))
    );
  }

  const allKeys = getPrototypeKeys(obj);
  if (allKeys.length > 0) {
    return p.node(
      label,
      undefined,
      allKeys.flatMap((k) => {
        const objAsRecord = obj as Record<string, unknown>;
        if (omitObject(objAsRecord[k]) || omit?.includes(k)) {
          return [];
        }
        try {
          return [parseUnknown(p, k, objAsRecord[k])];
        } catch (e) {
          return [p.node(k, `Error: ${e.message}}`)];
        }
      })
    );
  } else {
    return p.node(label, '{}');
  }
}

Выполнить команду


Для локальной разработки. Не используйте в интернете!