|
| 1 | +import signale from 'signale' |
| 2 | +import { Node } from 'ts-morph' |
| 3 | + |
| 4 | +import { ManualChangeError } from './errors' |
| 5 | + |
| 6 | +export interface ManualChangeLog { |
| 7 | + node: Node |
| 8 | + message: string |
| 9 | +} |
| 10 | + |
| 11 | +export type ManualChangesReported = Record<string, ManualChangeLog> |
| 12 | + |
| 13 | +export interface ManualChangeList { |
| 14 | + manualChangesReported: ManualChangesReported |
| 15 | + throwManualChangeError(manualChangeLog: ManualChangeLog): void |
| 16 | + addManualChangeLog(manualChangeLog: ManualChangeLog): void |
| 17 | +} |
| 18 | + |
| 19 | +// Used to avoid the duplicate reports on the same AST node. |
| 20 | +function getManualLogId(manualChangeLog: ManualChangeLog): string { |
| 21 | + const { node, message } = manualChangeLog |
| 22 | + |
| 23 | + return [ |
| 24 | + node.getSourceFile().getFilePath(), |
| 25 | + node.getPos(), |
| 26 | + node.getStartLinePos(), |
| 27 | + node.getEndLineNumber(), |
| 28 | + message, |
| 29 | + ].join(',') |
| 30 | +} |
| 31 | + |
| 32 | +export function throwManualChangeError({ node, message }: ManualChangeLog): void { |
| 33 | + throw new ManualChangeError(node, message) |
| 34 | +} |
| 35 | + |
| 36 | +export function logRequiredManualChanges(manualChangesReported: ManualChangesReported): void { |
| 37 | + for (const { message } of Object.values(manualChangesReported)) { |
| 38 | + signale.log(message) |
| 39 | + } |
| 40 | +} |
| 41 | + |
| 42 | +export function createManualChangeList(this: void): ManualChangeList { |
| 43 | + const manualChangesReported: ManualChangesReported = {} |
| 44 | + |
| 45 | + function addManualChangeLog(manualChangeLog: ManualChangeLog): void { |
| 46 | + const { node, message } = manualChangeLog |
| 47 | + const { line, column } = node.getSourceFile().getLineAndColumnAtPos(node.getPos()) |
| 48 | + const filePath = node.getSourceFile().getFilePath() |
| 49 | + |
| 50 | + manualChangesReported[getManualLogId(manualChangeLog)] = { |
| 51 | + node, |
| 52 | + message: ['', `${filePath}:${line}:${column} - warning: ${message}`, `>>> ${node.getFullText()}`].join( |
| 53 | + '\n' |
| 54 | + ), |
| 55 | + } |
| 56 | + } |
| 57 | + |
| 58 | + return { manualChangesReported, throwManualChangeError, addManualChangeLog } |
| 59 | +} |
0 commit comments