Разбор TypeScript для генерации простого графа вызовов - PullRequest
0 голосов
/ 13 апреля 2020

Я не совсем уверен, с чего начать, поэтому я ищу несколько указателей на как начать . Если это не подходящее место для вопросов такого типа, просто дайте мне знать, спасибо ^^

Я хочу визуализировать список вызовов в swimlanes.io , поэтому я думаю, что парсер поможет мне автоматизировать этот процесс:

пример ввода:

const removeKey = (key: string, { [key]: _, ...rest }: any) => rest;

export const expandedOutput = (array: any[]) => {
  return array.reduce(function(r, o, i) {
    Object.keys(o).forEach(function(k) {
      r[k] = r[k] || [];
      r[k][i] = o[k];
    });
    return r;
  }, {});
};

export const previewQuery = (table: string, lines: number) => `
select * from ${table} limit ${lines};
`;

const id = 'test';

const [preview] = await bigquery.query(previewQuery(id, 3));

console.table(removeKey('created_at', expandedOutput(preview)));

желаемый вывод:

(https://swimlanes.io/d/JXXXMC0YF)

previewQuery -> previewQuery: table: string
note:
'test'

previewQuery -> previewQuery: lines: number
note:
3

previewQuery -> bigquery.query: query: string
note: 
=> \`
select * from ${table} limit ${lines};
\`

bigquery.query -> [preview]: PagedResponse<any, Query, bigquery.ITableDataList>

[preview] -> expandedOutput: array: any[]

removeKey -> removeKey: key: string
note:
'created_at'

expandedOutput -> removeKey: { [key]: _, ...rest }: any
note:
=> {
  return array.reduce(function(r, o, i) {
    Object.keys(o).forEach(function(k) {
      r[k] = r[k] || [];
      r[k][i] = o[k];
    });
    return r;
  }, {});
}

removeKey -> console.table: (key: string, { [key]: _, ...rest }: any)
note:
=> rest

Я удивлен, что такого инструмента уже нет, но, может быть, я над головой ...

  1. Я хотел бы иметь возможность разобрать один машинописный файл, но также включает все вызываемые функции из других модулей. Нужно ли мне писать что-то, что выглядит как «встряхивание дерева» ??

  2. Я не уверен, что делать с внутренними функциями, такими как extendedOutput () в моем примере ... Для я, смысл всего этого процесса в основном в том, чтобы увидеть связь между функциями, поэтому меня не очень заботят внутренние функции. Хорошо просто игнорировать их

  3. Было бы здорово, если бы я мог понять, как читать неявные типы или типы в файлах объявлений *.ts.d, например, как VS Code смог вытащить "PagedResponse" в моем примере ... сколько работы вы думаете, это будет? Может быть, было бы проще, если бы я включил только явные типы

хммм, может быть, я могу использовать typescript-estree

...