diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index db60ad6a93b..590887b3cad 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -91,6 +91,7 @@ libs/common/spec @bitwarden/team-platform-dev libs/common/src/state-migrations @bitwarden/team-platform-dev libs/platform @bitwarden/team-platform-dev libs/storage-core @bitwarden/team-platform-dev +libs/logging @bitwarden/team-platform-dev libs/storage-test-utils @bitwarden/team-platform-dev # Web utils used across app and connectors apps/web/src/utils/ @bitwarden/team-platform-dev diff --git a/libs/common/src/platform/abstractions/log.service.ts b/libs/common/src/platform/abstractions/log.service.ts index d77a4f69906..c540f1a2b8f 100644 --- a/libs/common/src/platform/abstractions/log.service.ts +++ b/libs/common/src/platform/abstractions/log.service.ts @@ -1,9 +1 @@ -import { LogLevelType } from "../enums/log-level-type.enum"; - -export abstract class LogService { - abstract debug(message?: any, ...optionalParams: any[]): void; - abstract info(message?: any, ...optionalParams: any[]): void; - abstract warning(message?: any, ...optionalParams: any[]): void; - abstract error(message?: any, ...optionalParams: any[]): void; - abstract write(level: LogLevelType, message?: any, ...optionalParams: any[]): void; -} +export { LogService } from "@bitwarden/logging"; diff --git a/libs/common/src/platform/enums/log-level-type.enum.ts b/libs/common/src/platform/enums/log-level-type.enum.ts index b5f84467d6e..024c71c9f97 100644 --- a/libs/common/src/platform/enums/log-level-type.enum.ts +++ b/libs/common/src/platform/enums/log-level-type.enum.ts @@ -1,8 +1 @@ -// FIXME: update to use a const object instead of a typescript enum -// eslint-disable-next-line @bitwarden/platform/no-enums -export enum LogLevelType { - Debug, - Info, - Warning, - Error, -} +export { LogLevel as LogLevelType } from "@bitwarden/logging"; diff --git a/libs/common/src/platform/services/console-log.service.spec.ts b/libs/common/src/platform/services/console-log.service.spec.ts index 508ca4eb327..e73aed5f3b5 100644 --- a/libs/common/src/platform/services/console-log.service.spec.ts +++ b/libs/common/src/platform/services/console-log.service.spec.ts @@ -1,6 +1,6 @@ -import { interceptConsole, restoreConsole } from "../../../spec"; +import { ConsoleLogService } from "@bitwarden/logging"; -import { ConsoleLogService } from "./console-log.service"; +import { interceptConsole, restoreConsole } from "../../../spec"; describe("ConsoleLogService", () => { const error = new Error("this is an error"); diff --git a/libs/common/src/platform/services/console-log.service.ts b/libs/common/src/platform/services/console-log.service.ts index cb6554e2aa2..6d55614757b 100644 --- a/libs/common/src/platform/services/console-log.service.ts +++ b/libs/common/src/platform/services/console-log.service.ts @@ -1,59 +1 @@ -// FIXME: Update this file to be type safe and remove this and next line -// @ts-strict-ignore -import { LogService as LogServiceAbstraction } from "../abstractions/log.service"; -import { LogLevelType } from "../enums/log-level-type.enum"; - -export class ConsoleLogService implements LogServiceAbstraction { - protected timersMap: Map = new Map(); - - constructor( - protected isDev: boolean, - protected filter: (level: LogLevelType) => boolean = null, - ) {} - - debug(message?: any, ...optionalParams: any[]) { - if (!this.isDev) { - return; - } - this.write(LogLevelType.Debug, message, ...optionalParams); - } - - info(message?: any, ...optionalParams: any[]) { - this.write(LogLevelType.Info, message, ...optionalParams); - } - - warning(message?: any, ...optionalParams: any[]) { - this.write(LogLevelType.Warning, message, ...optionalParams); - } - - error(message?: any, ...optionalParams: any[]) { - this.write(LogLevelType.Error, message, ...optionalParams); - } - - write(level: LogLevelType, message?: any, ...optionalParams: any[]) { - if (this.filter != null && this.filter(level)) { - return; - } - - switch (level) { - case LogLevelType.Debug: - // eslint-disable-next-line - console.log(message, ...optionalParams); - break; - case LogLevelType.Info: - // eslint-disable-next-line - console.log(message, ...optionalParams); - break; - case LogLevelType.Warning: - // eslint-disable-next-line - console.warn(message, ...optionalParams); - break; - case LogLevelType.Error: - // eslint-disable-next-line - console.error(message, ...optionalParams); - break; - default: - break; - } - } -} +export { ConsoleLogService } from "@bitwarden/logging"; diff --git a/libs/logging/README.md b/libs/logging/README.md new file mode 100644 index 00000000000..d2ef90cb3f9 --- /dev/null +++ b/libs/logging/README.md @@ -0,0 +1,5 @@ +# logging + +Owned by: platform + +Logging primitives diff --git a/libs/logging/eslint.config.mjs b/libs/logging/eslint.config.mjs new file mode 100644 index 00000000000..9c37d10e3ff --- /dev/null +++ b/libs/logging/eslint.config.mjs @@ -0,0 +1,3 @@ +import baseConfig from "../../eslint.config.mjs"; + +export default [...baseConfig]; diff --git a/libs/logging/jest.config.js b/libs/logging/jest.config.js new file mode 100644 index 00000000000..a231d3bfce9 --- /dev/null +++ b/libs/logging/jest.config.js @@ -0,0 +1,10 @@ +module.exports = { + displayName: "logging", + preset: "../../jest.preset.js", + testEnvironment: "node", + transform: { + "^.+\\.[tj]s$": ["ts-jest", { tsconfig: "/tsconfig.spec.json" }], + }, + moduleFileExtensions: ["ts", "js", "html"], + coverageDirectory: "../../coverage/libs/logging", +}; diff --git a/libs/logging/package.json b/libs/logging/package.json new file mode 100644 index 00000000000..b9cfbe35eb0 --- /dev/null +++ b/libs/logging/package.json @@ -0,0 +1,11 @@ +{ + "name": "@bitwarden/logging", + "version": "0.0.1", + "description": "Logging primitives", + "private": true, + "type": "commonjs", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "license": "GPL-3.0", + "author": "platform" +} diff --git a/libs/logging/project.json b/libs/logging/project.json new file mode 100644 index 00000000000..f2b5db313be --- /dev/null +++ b/libs/logging/project.json @@ -0,0 +1,33 @@ +{ + "name": "logging", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/logging/src", + "projectType": "library", + "tags": [], + "targets": { + "build": { + "executor": "@nx/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/libs/logging", + "main": "libs/logging/src/index.ts", + "tsConfig": "libs/logging/tsconfig.lib.json", + "assets": ["libs/logging/*.md"] + } + }, + "lint": { + "executor": "@nx/eslint:lint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["libs/logging/**/*.ts"] + } + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "libs/logging/jest.config.js" + } + } + } +} diff --git a/libs/logging/src/console-log.service.ts b/libs/logging/src/console-log.service.ts new file mode 100644 index 00000000000..3a4ffe9ead1 --- /dev/null +++ b/libs/logging/src/console-log.service.ts @@ -0,0 +1,57 @@ +import { LogLevel } from "./log-level"; +import { LogService } from "./log.service"; + +export class ConsoleLogService implements LogService { + protected timersMap: Map = new Map(); + + constructor( + protected isDev: boolean, + protected filter: ((level: LogLevel) => boolean) | null = null, + ) {} + + debug(message?: any, ...optionalParams: any[]) { + if (!this.isDev) { + return; + } + this.write(LogLevel.Debug, message, ...optionalParams); + } + + info(message?: any, ...optionalParams: any[]) { + this.write(LogLevel.Info, message, ...optionalParams); + } + + warning(message?: any, ...optionalParams: any[]) { + this.write(LogLevel.Warning, message, ...optionalParams); + } + + error(message?: any, ...optionalParams: any[]) { + this.write(LogLevel.Error, message, ...optionalParams); + } + + write(level: LogLevel, message?: any, ...optionalParams: any[]) { + if (this.filter != null && this.filter(level)) { + return; + } + + switch (level) { + case LogLevel.Debug: + // eslint-disable-next-line + console.log(message, ...optionalParams); + break; + case LogLevel.Info: + // eslint-disable-next-line + console.log(message, ...optionalParams); + break; + case LogLevel.Warning: + // eslint-disable-next-line + console.warn(message, ...optionalParams); + break; + case LogLevel.Error: + // eslint-disable-next-line + console.error(message, ...optionalParams); + break; + default: + break; + } + } +} diff --git a/libs/logging/src/index.ts b/libs/logging/src/index.ts new file mode 100644 index 00000000000..8ce4b62cd3f --- /dev/null +++ b/libs/logging/src/index.ts @@ -0,0 +1,3 @@ +export { LogService } from "./log.service"; +export { LogLevel } from "./log-level"; +export { ConsoleLogService } from "./console-log.service"; diff --git a/libs/logging/src/log-level.ts b/libs/logging/src/log-level.ts new file mode 100644 index 00000000000..adf6c145c3d --- /dev/null +++ b/libs/logging/src/log-level.ts @@ -0,0 +1,8 @@ +// FIXME: update to use a const object instead of a typescript enum +// eslint-disable-next-line @bitwarden/platform/no-enums +export enum LogLevel { + Debug, + Info, + Warning, + Error, +} diff --git a/libs/logging/src/log.service.ts b/libs/logging/src/log.service.ts new file mode 100644 index 00000000000..a63ad47c07e --- /dev/null +++ b/libs/logging/src/log.service.ts @@ -0,0 +1,9 @@ +import { LogLevel } from "./log-level"; + +export abstract class LogService { + abstract debug(message?: any, ...optionalParams: any[]): void; + abstract info(message?: any, ...optionalParams: any[]): void; + abstract warning(message?: any, ...optionalParams: any[]): void; + abstract error(message?: any, ...optionalParams: any[]): void; + abstract write(level: LogLevel, message?: any, ...optionalParams: any[]): void; +} diff --git a/libs/logging/src/logging.spec.ts b/libs/logging/src/logging.spec.ts new file mode 100644 index 00000000000..04a057a156f --- /dev/null +++ b/libs/logging/src/logging.spec.ts @@ -0,0 +1,8 @@ +import * as lib from "./index"; + +describe("logging", () => { + // This test will fail until something is exported from index.ts + it("should work", () => { + expect(lib).toBeDefined(); + }); +}); diff --git a/libs/logging/tsconfig.json b/libs/logging/tsconfig.json new file mode 100644 index 00000000000..62ebbd94647 --- /dev/null +++ b/libs/logging/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/libs/logging/tsconfig.lib.json b/libs/logging/tsconfig.lib.json new file mode 100644 index 00000000000..9cbf6736007 --- /dev/null +++ b/libs/logging/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": ["node"] + }, + "include": ["src/**/*.ts"], + "exclude": ["jest.config.js", "src/**/*.spec.ts"] +} diff --git a/libs/logging/tsconfig.spec.json b/libs/logging/tsconfig.spec.json new file mode 100644 index 00000000000..a19b962c49a --- /dev/null +++ b/libs/logging/tsconfig.spec.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../..//dist/out-tsc", + "module": "commonjs", + "moduleResolution": "node10", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.d.ts", + "src/intercept-console.ts" + ] +} diff --git a/package-lock.json b/package-lock.json index a6b965f89f7..e9701cbd7ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -353,6 +353,10 @@ "version": "0.0.0", "license": "GPL-3.0" }, + "libs/logging": { + "version": "0.0.1", + "license": "GPL-3.0" + }, "libs/node": { "name": "@bitwarden/node", "version": "0.0.0", @@ -4583,6 +4587,10 @@ "resolved": "libs/key-management-ui", "link": true }, + "node_modules/@bitwarden/logging": { + "resolved": "libs/logging", + "link": true + }, "node_modules/@bitwarden/node": { "resolved": "libs/node", "link": true diff --git a/tsconfig.base.json b/tsconfig.base.json index b826d51e66e..c820306fd15 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -37,6 +37,7 @@ "@bitwarden/importer-ui": ["./libs/importer/src/components"], "@bitwarden/key-management": ["./libs/key-management/src"], "@bitwarden/key-management-ui": ["./libs/key-management-ui/src"], + "@bitwarden/logging": ["libs/logging/src"], "@bitwarden/node/*": ["./libs/node/src/*"], "@bitwarden/nx-plugin": ["libs/nx-plugin/src/index.ts"], "@bitwarden/platform": ["./libs/platform/src"],