Skip to content
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
20 changes: 12 additions & 8 deletions .github/workflows/quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,31 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Set up Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: '22'
node-version: '26'
cache: 'pnpm'

- name: Install dependencies
run: npm install
run: pnpm install

- name: Lint
run: npm run lint
run: pnpm run lint

- name: Format check
run: npm run format:check
run: pnpm run format:check

- name: Build
run: npm run build
run: pnpm run build

- name: Test
run: npm run test
run: pnpm run test

- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
Expand Down
12 changes: 8 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,24 @@ jobs:
fetch-depth: 0
persist-credentials: false

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
node-version: '26'
cache: 'pnpm'
registry-url: 'https://registry.npmjs.org'

- name: Install dependencies
run: npm install
run: pnpm install

- name: Build
run: npm run build
run: pnpm run build

- name: Release
env:
GITHUB_TOKEN: ${{ secrets.GH_PAT }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
run: npx semantic-release
run: pnpm dlx semantic-release
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
node_modules
dist
dist
lcov.info
6 changes: 6 additions & 0 deletions .oxfmtrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"$schema": "https://raw.githubusercontent.com/oxc-project/oxfmt/main/configuration_schema.json",
"singleQuote": true,
"trailingComma": "all",
"ignorePatterns": ["dist/**", "CHANGELOG.md"]
}
9 changes: 9 additions & 0 deletions .oxlintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json",
"plugins": ["typescript"],
"rules": {
"no-unused-vars": "error",
"no-undef": "off"
},
"ignorePatterns": ["dist/**"]
}
1 change: 0 additions & 1 deletion .prettierignore

This file was deleted.

4 changes: 0 additions & 4 deletions .prettierrc

This file was deleted.

6 changes: 1 addition & 5 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
{
"recommendations": [
"dbaeumer.vscode-eslint",
"eamodio.gitlens",
"esbenp.prettier-vscode"
]
"recommendations": ["oxc.oxc-vscode", "eamodio.gitlens"]
}
29 changes: 0 additions & 29 deletions eslint.config.js

This file was deleted.

1 change: 0 additions & 1 deletion lib/hellog.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,6 @@ describe(Hellog.name, () => {

for (const plugin of logger.plugins) {
const formatMock = mock.fn((messages: HellogMessage[]) => messages);
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function
const writeMock = mock.fn((_message: HellogMessage) => {});

plugin.format = formatMock;
Expand Down
6 changes: 5 additions & 1 deletion lib/hellog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,11 @@ export class Hellog {
new HellogStdoutDefaultPlugin(),
];

constructor(readonly options?: HellogOptions) {}
readonly options: HellogOptions | undefined;

constructor(options?: HellogOptions) {
this.options = options;
}

get maxLevel(): HellogLevel {
return this.options?.level ?? HellogLevel.INFO;
Expand Down
18 changes: 10 additions & 8 deletions lib/levels.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
export const enum HellogLevel {
TRACE = 'TRACE',
DEBUG = 'DEBUG',
INFO = 'INFO',
SUCCESS = 'SUCCESS',
WARN = 'WARN',
ERROR = 'ERROR',
}
export const HellogLevel = {
TRACE: 'TRACE',
DEBUG: 'DEBUG',
INFO: 'INFO',
SUCCESS: 'SUCCESS',
WARN: 'WARN',
ERROR: 'ERROR',
} as const;

export type HellogLevel = (typeof HellogLevel)[keyof typeof HellogLevel];

export const HellogLevelOrder = {
TRACE: 0,
Expand Down
75 changes: 21 additions & 54 deletions lib/plugins.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,11 @@ describe(HellogLogFormatDefaultPlugin.name, () => {
const result = plugin.format([source]);

const message = result.at(0);
assert.notEqual(message, undefined);
assert.ok(message);

assert.strictEqual(message?.level, source.level);
assert.equal(message.meta['foo'], source.meta.foo);
assert.strictEqual(
message.timestamp.toISOString(),
source.timestamp.toISOString(),
);
assert.strictEqual(message.timestamp.toISOString(), source.timestamp.toISOString());
assert.strictEqual(
message.content,
'timestamp="2021-01-01T00:00:00.000Z" level="INFO" message="Hello, world!" foo="bar"',
Expand All @@ -46,14 +43,11 @@ describe(HellogLogFormatDefaultPlugin.name, () => {
const result = plugin.format([source]);

const message = result.at(0);
assert.notEqual(message, undefined);
assert.ok(message);

assert.strictEqual(message?.level, source.level);
assert.equal(message.meta['foo'], source.meta.foo);
assert.strictEqual(
message.timestamp.toISOString(),
source.timestamp.toISOString(),
);
assert.strictEqual(message.timestamp.toISOString(), source.timestamp.toISOString());
assert.strictEqual(
message.content,
'timestamp="2021-01-01T00:00:00.000Z" ' +
Expand All @@ -76,14 +70,11 @@ describe(HellogLogFormatDefaultPlugin.name, () => {
const result = plugin.format([source]);

const message = result.at(0);
assert.notEqual(message, undefined);
assert.ok(message);

assert.strictEqual(message?.level, source.level);
assert.equal(message.meta['foo'], source.meta.foo);
assert.strictEqual(
message.timestamp.toISOString(),
source.timestamp.toISOString(),
);
assert.strictEqual(message.timestamp.toISOString(), source.timestamp.toISOString());
assert.strictEqual(
message.content,
'ts="2021-01-01T00:00:00.000Z" lvl="INFO" msg="Hello, world!" foo="bar"',
Expand All @@ -103,14 +94,11 @@ describe(HellogJsonDefaultPlugin.name, () => {
const result = plugin.format([source]);

const message = result.at(0);
assert.notEqual(message, undefined);
assert.ok(message);

assert.strictEqual(message?.level, source.level);
assert.equal(message.meta['foo'], source.meta.foo);
assert.strictEqual(
message.timestamp.toISOString(),
source.timestamp.toISOString(),
);
assert.strictEqual(message.timestamp.toISOString(), source.timestamp.toISOString());
assert.strictEqual(
message.content,
'{"level":"INFO","timestamp":"2021-01-01T00:00:00.000Z","content":"Hello, world!","foo":"bar"}',
Expand All @@ -128,14 +116,11 @@ describe(HellogJsonDefaultPlugin.name, () => {
const result = plugin.format([source]);

const message = result.at(0);
assert.notEqual(message, undefined);
assert.ok(message);

assert.strictEqual(message?.level, source.level);
assert.equal(message.meta['foo'], source.meta.foo);
assert.strictEqual(
message.timestamp.toISOString(),
source.timestamp.toISOString(),
);
assert.strictEqual(message.timestamp.toISOString(), source.timestamp.toISOString());
assert.strictEqual(
message.content,
'{"level":"INFO","timestamp":"2021-01-01T00:00:00.000Z","content":"Hello, world! \\nThis is a new line.","foo":"bar"}',
Expand All @@ -155,14 +140,11 @@ describe(HellogColorizeDefaultPlugin.name, () => {
const result = plugin.format([source]);

const message = result.at(0);
assert.notEqual(message, undefined);
assert.ok(message);

assert.strictEqual(message?.level, source.level);
assert.equal(message.meta['foo'], source.meta.foo);
assert.strictEqual(
message.timestamp.toISOString(),
source.timestamp.toISOString(),
);
assert.strictEqual(message.timestamp.toISOString(), source.timestamp.toISOString());
assert.strictEqual(message.content, source.content);
});

Expand All @@ -187,14 +169,11 @@ describe(HellogColorizeDefaultPlugin.name, () => {

for (const [index, source] of sources.entries()) {
const message = results.at(index);
assert.notEqual(message, undefined);
assert.ok(message);

assert.strictEqual(message?.level, source.level);
assert.equal(message.meta['foo'], source.meta.foo);
assert.strictEqual(
message.timestamp.toISOString(),
source.timestamp.toISOString(),
);
assert.strictEqual(message.timestamp.toISOString(), source.timestamp.toISOString());

switch (source.level) {
case HellogLevel.TRACE:
Expand Down Expand Up @@ -229,18 +208,12 @@ describe(HellogPrettyDefaultPlugin.name, () => {
const result = plugin.format([source]);

const message = result.at(0);
assert.notEqual(message, undefined);
assert.ok(message);

assert.strictEqual(message?.level, source.level);
assert.equal(message.meta['foo'], source.meta.foo);
assert.strictEqual(
message.timestamp.toISOString(),
source.timestamp.toISOString(),
);
assert.strictEqual(
message.content,
'2021-01-01T00:00:00.000Z [INFO] Hello, world!',
);
assert.strictEqual(message.timestamp.toISOString(), source.timestamp.toISOString());
assert.strictEqual(message.content, '2021-01-01T00:00:00.000Z [INFO] Hello, world!');
});
});

Expand All @@ -258,25 +231,19 @@ describe(HellogLineBreakDefaultPlugin.name, () => {
assert.strictEqual(result.length, 2);

const message1 = result.at(0);
assert.notEqual(message1, undefined);
assert.ok(message1);

assert.strictEqual(message1?.level, source.level);
assert.equal(message1.meta['foo'], source.meta.foo);
assert.strictEqual(
message1.timestamp.toISOString(),
source.timestamp.toISOString(),
);
assert.strictEqual(message1.timestamp.toISOString(), source.timestamp.toISOString());
assert.strictEqual(message1.content, 'Hello, world!');

const message2 = result.at(1);
assert.notEqual(message2, undefined);
assert.ok(message2);

assert.strictEqual(message2?.level, source.level);
assert.equal(message2.meta['foo'], source.meta.foo);
assert.strictEqual(
message2.timestamp.toISOString(),
source.timestamp.toISOString(),
);
assert.strictEqual(message2.timestamp.toISOString(), source.timestamp.toISOString());
assert.strictEqual(message2.content, 'This is a new line.');
});
});
8 changes: 4 additions & 4 deletions lib/plugins.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ export abstract class HellogPlugin {
return message;
}

// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function
write(_message: HellogMessage): void {}
}
/* node:coverage enable */
Expand Down Expand Up @@ -79,8 +78,11 @@ interface HellogLogFormatDefaultPluginOptions {
}

export class HellogLogFormatDefaultPlugin extends HellogPlugin {
constructor(private readonly options?: HellogLogFormatDefaultPluginOptions) {
private readonly options: HellogLogFormatDefaultPluginOptions | undefined;

constructor(options?: HellogLogFormatDefaultPluginOptions) {
super();
this.options = options;
}

override format(messages: HellogMessage[]): HellogMessage[] {
Expand All @@ -96,11 +98,9 @@ export class HellogLogFormatDefaultPlugin extends HellogPlugin {
[levelKey]: message.level,
[messageKey]: message.content,
};
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
for (const key in message.meta) data[key] = message.meta[key]!;

let content = '';
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
for (const key in data) content += `${key}="${data[key]!}" `;
if (content.endsWith(' ')) content = content.slice(0, -1);

Expand Down
Loading
Loading