Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(logger 🔧): working towards removing the console logger #404

Merged
merged 1 commit into from
Nov 20, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .betterer.results
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ exports[`no hack comments`] = {
"packages/cli/src/cli.ts:3907603544": [
[12, 0, 7, "RegExp match", "645651780"]
],
"packages/cli/src/init/update-package-json.ts:1993811370": [
"packages/cli/src/init/update-package-json.ts:3099619299": [
[41, 4, 7, "RegExp match", "645651780"]
]
}`
Expand Down
2 changes: 1 addition & 1 deletion goldens/api/@betterer/betterer.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export declare type BettererDiff<DeserialisedType extends BettererResultValue =
expected: DeserialisedType;
result: DeserialisedType;
diff: DiffType;
log: () => void;
log: (logger: BettererLogger) => void;
};

export declare type BettererDiffer<DeserialisedType extends BettererResultValue, DiffType> = (expected: DeserialisedType, result: DeserialisedType) => BettererDiff<DeserialisedType, DiffType>;
Expand Down
69 changes: 40 additions & 29 deletions goldens/api/@betterer/logger.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,23 @@
export declare type BettererLogger = (...messages: BettererLoggerMessages) => void;
export declare class BettererConsoleLogger implements BettererLogger {
debug: BettererLogMessage;
error: BettererLogMessage;
info: BettererLogMessage;
success: BettererLogMessage;
warn: BettererLogMessage;
constructor();
code(codeInfo: BettererLoggerCodeInfo): void;
}

export declare type BettererLogCode = (codeInfo: BettererLoggerCodeInfo) => void;

export declare type BettererLogger = {
code: BettererLogCode;
debug: BettererLogMessage;
error: BettererLogMessage;
info: BettererLogMessage;
success: BettererLogMessage;
warn: BettererLogMessage;
};

export declare type BettererLoggerCodeInfo = {
message: string;
Expand All @@ -9,33 +28,34 @@ export declare type BettererLoggerCodeInfo = {
length: number;
};

export declare type BettererLoggerDiffOptions = DiffOptions;

export declare type BettererLoggerMessages = ReadonlyArray<string>;

export declare type BettererLoggerOverwriteDone = typeof logUpdate['done'];
export declare type BettererLogMessage = (...messages: BettererLoggerMessages) => void;

export declare const BettererLogo: FC;

export declare const BettererTask: FC<BettererTaskProps>;

export declare type BettererTaskColour = typeof ForegroundColor;

export declare type BettererTaskContext = {
name: string;
run: (logger: BettererTaskLogger) => Promise<BettererTaskStatusMessage | string | void>;
run: (logger: BettererTaskLogger) => Promise<BettererTaskLog | string | void>;
};

export declare type BettererTaskError = Error & {
details: string;
message: string;
};

export declare type BettererTaskLogger = {
status: BettererTaskUpdate;
debug: BettererTaskUpdate;
info: BettererTaskUpdate;
warn: BettererTaskUpdate;
export declare type BettererTaskLog = [indicator: string, colour: BettererTaskColour, message: string];

export declare type BettererTaskLogger = BettererLogger & {
progress: BettererTaskStatusUpdate;
};

export declare type BettererTaskLogs = ReadonlyArray<BettererTaskLog>;

export declare type BettererTaskProps = {
context: BettererTaskContext;
};
Expand All @@ -44,28 +64,19 @@ export declare const BettererTasks: FC<BettererTasksProps>;

export declare type BettererTasksProps = {
name: string;
statusMessage: (state: BettererTasksState) => string;
};

export declare type BettererTaskStatusMessage = [indicator: string, colour: BettererTaskColour, message: string];

export declare type BettererTaskStatusMessages = ReadonlyArray<BettererTaskStatusMessage>;

export declare type BettererTaskUpdate = (status: string) => void;

export declare function brΔ(): void;

export declare function codeΔ(codeInfo: BettererLoggerCodeInfo): void;

export declare function diffΔ(expected: unknown, result: unknown, options?: DiffOptions): void;

export declare const errorΔ: BettererLogger;

export declare const infoΔ: BettererLogger;
export declare type BettererTasksState = {
running: number;
done: number;
error: number;
};

export declare function logoΔ(): void;
export declare type BettererTaskStatusUpdate = (status: string) => void;

export declare function overwriteΔ(content: string): BettererLoggerOverwriteDone;
export declare function codeΔ(codeInfo: BettererLoggerCodeInfo): string;

export declare const successΔ: BettererLogger;
export declare function diffΔ<T>(expected: T, result: T): string | null;

export declare const warnΔ: BettererLogger;
export declare const LOGO = "\n \\ | / _ _ _ \n '-.ooo.-' | |__ ___| |_| |_ ___ _ __ ___ _ __ \n---ooooo--- | '_ \\/ _ \\ __| __/ _ \\ '__/ _ \\ '__|\n .-'ooo'-. | |_)| __/ |_| || __/ | | __/ | \n / | \\ |_.__/\\___|\\__|\\__\\___|_| \\___|_| \n ";
11 changes: 7 additions & 4 deletions packages/betterer/src/test/config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { BettererError } from '@betterer/errors/dist/error';
import { diffΔ } from '@betterer/logger';
import { BettererError } from '@betterer/errors';
import { BettererLogger, diffΔ } from '@betterer/logger';
import { BettererResultValue } from '../results';
import { isFunction } from '../utils';
import {
Expand Down Expand Up @@ -78,8 +78,11 @@ export function defaultDiffer(expected: number, result: number): BettererDiff<nu
expected,
result,
diff: null,
log(): void {
diffΔ(expected, result);
log(logger: BettererLogger): void {
const diff = diffΔ(expected, result);
if (diff) {
logger.error(diff);
}
}
};
}
Expand Down
12 changes: 6 additions & 6 deletions packages/betterer/src/test/file-test/differ.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { codeΔ, errorΔ, successΔ, warnΔ } from '@betterer/logger';
import { BettererLogger } from '@betterer/logger';
import assert from 'assert';

import { BettererFileΩ } from './file';
Expand Down Expand Up @@ -155,26 +155,26 @@ export function differ(expected: BettererFileTestResult, result: BettererFileTes
expected,
result,
diff,
log() {
log(logger: BettererLogger) {
filePaths.forEach((filePath) => {
const existing = diff[filePath].existing || [];
const fixed = diff[filePath].fixed || [];
if (fixed?.length) {
successΔ(`${fixed.length} fixed ${getIssues(fixed.length)} in "${filePath}".`);
logger.success(`${fixed.length} fixed ${getIssues(fixed.length)} in "${filePath}".`);
}
if (existing?.length) {
warnΔ(`${existing.length} existing ${getIssues(existing.length)} in "${filePath}".`);
logger.warn(`${existing.length} existing ${getIssues(existing.length)} in "${filePath}".`);
}
const newIssues = diff[filePath].new || [];
if (newIssues.length) {
const { length } = newIssues;
errorΔ(`${length} new ${getIssues(length)} in "${filePath}":`);
logger.error(`${length} new ${getIssues(length)} in "${filePath}":`);

newIssues.forEach((issue) => {
const fileΩ = resultΩ.getFile(filePath) as BettererFileΩ;
const { fileText } = fileΩ;
const { line, column, length, message } = issue;
codeΔ({ message, filePath, fileText, line, column, length });
logger.code({ message, filePath, fileText, line, column, length });
});
}
});
Expand Down
3 changes: 2 additions & 1 deletion packages/betterer/src/test/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { BettererConstraintResult } from '@betterer/constraints';
import { BettererLogger } from '@betterer/logger';

import { BettererRun } from '../context';
import { BettererResultValue } from '../results';
Expand All @@ -21,7 +22,7 @@ export type BettererDiff<DeserialisedType extends BettererResultValue = Betterer
expected: DeserialisedType;
result: DeserialisedType;
diff: DiffType;
log: () => void;
log: (logger: BettererLogger) => void;
};

export type BettererDiffer<DeserialisedType extends BettererResultValue, DiffType> = (
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/init/create-test-file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export function createTestFile(configPath: string): BettererTaskContext {
}

async function runCreateTestFile(logger: BettererTaskLogger, configPath: string): Promise<void> {
logger.status(`creating "${configPath}" file...`);
logger.progress(`creating "${configPath}" file...`);

let exists = false;
try {
Expand Down
16 changes: 14 additions & 2 deletions packages/cli/src/init/init.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { BettererTask, BettererTasks } from '@betterer/logger';
import { BettererTask, BettererTasks, BettererTasksState } from '@betterer/logger';
import React, { FC } from 'react';
import * as path from 'path';

Expand All @@ -12,9 +12,21 @@ export type InitProps = BettererCLIInitConfig & {

export const Init: FC<InitProps> = function Init({ cwd, config }) {
return (
<BettererTasks name="Initialising Betterer">
<BettererTasks name="Initialising Betterer" statusMessage={statusMessage}>
<BettererTask context={createTestFile(path.resolve(cwd, config))} />
<BettererTask context={updatePackageJSON(cwd)} />
</BettererTasks>
);
};

function statusMessage(state: BettererTasksState): string {
const { done, error, running } = state;
const runningStatus = running ? `${tasks(running)} running... ` : '';
const doneStatus = done ? `${tasks(done)} done! ` : '';
const errorStatus = error ? `${tasks(error)} errored! ` : '';
return `${runningStatus}${doneStatus}${errorStatus}`;
}

function tasks(n: number): string {
return `${n} ${n === 1 ? 'task' : 'tasks'}`;
}
2 changes: 1 addition & 1 deletion packages/cli/src/init/update-package-json.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export function updatePackageJSON(cwd: string): BettererTaskContext {
}

async function runUpdatePackageJSON(cwd: string, logger: BettererTaskLogger): Promise<void> {
logger.status('adding "betterer" to package.json file...');
logger.progress('adding "betterer" to package.json file...');

let packageJSON;
let packageJSONPath;
Expand Down
13 changes: 8 additions & 5 deletions packages/errors/src/error-handler.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
import { brΔ, errorΔ } from '@betterer/logger';
import { BettererConsoleLogger } from '@betterer/logger';

import { BettererError, isBettererError } from './error';
import { BettererErrorDetail, ErrorLike } from './types';

const logger = new BettererConsoleLogger();

export function logErrorΔ(err: ErrorLike | Error | BettererError): void {
if (isBettererError(err)) {
const errors = err.details.filter((detail) => isErrorLike(detail)) as Array<ErrorLike>;
errorΔ(err.message);
logger.error(err.message);
errors.forEach(logErrorΔ);
return;
}
brΔ();
// eslint-disable-next-line no-console
/* eslint-disable no-console */
console.log();
console.error(err.stack);
brΔ();
console.log();
/* eslint-enable no-console */
}

function isErrorLike(err: BettererErrorDetail): err is ErrorLike {
Expand Down
66 changes: 0 additions & 66 deletions packages/logger/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,69 +9,3 @@ Logger used within [**`Betterer`**](https://github.com/phenomnomnominal/betterer
## Usage

> ## 🚨🚨🚨 THIS PACKAGE SHOULD ONLY BE USED WITHIN THE BETTERER MONOREPO 🚨🚨🚨

### Code

```typescript
import { codeΔ } from '@betterer/logger';

codeΔ({
filePath: './file.js',
fileText: 'function add (a, b) {\n return a + b;\n}',
line: 1,
column: 3,
length: 13
});
```

![Example output for code logger](/packages/logger/images/code.png?raw=true)

---

### Error

```typescript
import { errorΔ } from '@betterer/logger';

errorΔ('message');
```

![Example output for error logger](/packages/logger/images/error.png?raw=true)

---

### Info

```typescript
import { infoΔ } from '@betterer/logger';

infoΔ('message');
```

![Example output for info logger](/packages/logger/images/info.png?raw=true)

---

### Success

```typescript
import { successΔ } from '@betterer/logger';

successΔ('message');
```

![Example output for success logger](/packages/logger/images/success.png?raw=true)

---

### Warning

```typescript
import { warnΔ } from '@betterer/logger';

warnΔ('message');
```

![Example output for warn logger](/packages/logger/images/warn.png?raw=true)

---
Binary file removed packages/logger/images/code.png
Binary file not shown.
Binary file removed packages/logger/images/error.png
Binary file not shown.
Binary file removed packages/logger/images/info.png
Binary file not shown.
Binary file removed packages/logger/images/success.png
Binary file not shown.
Binary file removed packages/logger/images/warn.png
Binary file not shown.
3 changes: 1 addition & 2 deletions packages/logger/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,8 @@
"@babel/code-frame": "^7.10.3",
"chalk": "^4.1.0",
"ink": "^3.0.7",
"jest-diff": "^26.1.0",
"jest-diff": "^26.6.2",
"lines-and-columns": "^1.1.6",
"log-update": "^4.0.0",
"npmlog": "^4.1.2",
"react": "^16.13.1",
"tslib": "^2.0.3"
Expand Down
28 changes: 28 additions & 0 deletions packages/logger/src/code.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { codeFrameColumns } from '@babel/code-frame';
import LinesAndColumns from 'lines-and-columns';
import * as path from 'path';

import { BettererLoggerCodeInfo } from './types';

const IS_JS_REGEXP = /.t|jsx?$/;

export function codeΔ(codeInfo: BettererLoggerCodeInfo): string {
const { filePath, fileText } = codeInfo;
const isJS = IS_JS_REGEXP.exec(path.extname(filePath));
const options = {
highlightCode: !!isJS
};
const lc = new LinesAndColumns(fileText);
const startLocation = codeInfo;
const startIndex = lc.indexForLocation(startLocation) || 0;
const endLocation = lc.locationForIndex(startIndex + codeInfo.length) || startLocation;
const start = {
line: startLocation.line + 1,
column: startLocation.column + 1
};
const end = {
line: endLocation.line + 1,
column: endLocation.column + 1
};
return codeFrameColumns(fileText, { start, end }, options);
}
12 changes: 12 additions & 0 deletions packages/logger/src/components/logo.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import React, { FC } from 'react';
import { Box, Text } from 'ink';

import { LOGO } from '../logo';

export const BettererLogo: FC = function BettererLogo() {
return (
<Box flexDirection="column">
<Text color="yellowBright">{LOGO}</Text>
</Box>
);
};
Loading