mynth-logger 1.0.13 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.eslintignore ADDED
@@ -0,0 +1 @@
1
+ dist
package/.eslintrc.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "parser": "@typescript-eslint/parser",
3
+ "extends": [
4
+ "eslint:recommended",
5
+ "plugin:ava/recommended",
6
+ "plugin:@typescript-eslint/recommended",
7
+ "plugin:import/errors",
8
+ "plugin:import/warnings",
9
+ "plugin:import/typescript"
10
+ ],
11
+ "plugins": [
12
+ "ava",
13
+ "import",
14
+ "@typescript-eslint",
15
+ "file-extension-in-import-ts"
16
+ ],
17
+ "settings": {
18
+ "import/resolver": {
19
+ "node": {
20
+ "paths": ["src"]
21
+ }
22
+ }
23
+ },
24
+ "rules": {
25
+ "padding-line-between-statements": [
26
+ "error",
27
+ { "blankLine": "always", "prev": "*", "next": "block" },
28
+ { "blankLine": "always", "prev": "block", "next": "*" },
29
+ { "blankLine": "always", "prev": "*", "next": "block-like" },
30
+ { "blankLine": "always", "prev": "block-like", "next": "*" }
31
+ ],
32
+ "@typescript-eslint/no-unused-vars": [
33
+ "warn",
34
+ {
35
+ "argsIgnorePattern": "^_",
36
+ "varsIgnorePattern": "^_",
37
+ "caughtErrorsIgnorePattern": "^_"
38
+ }
39
+ ],
40
+ "@typescript-eslint/naming-convention": [
41
+ "error",
42
+ {
43
+ "selector": ["parameter", "variable"],
44
+ "leadingUnderscore": "forbid",
45
+ "format": null
46
+ },
47
+ {
48
+ "selector": "parameter",
49
+ "leadingUnderscore": "require",
50
+ "format": null,
51
+ "modifiers": ["unused"]
52
+ }
53
+ ],
54
+ "no-constant-condition": "off",
55
+ "file-extension-in-import-ts/file-extension-in-import-ts": "error",
56
+ "import/no-unresolved": ["error", { "ignore": ["\\.js$"] }],
57
+ "no-restricted-imports": ["error", { "patterns": ["src/*"] }]
58
+ },
59
+ "overrides": [
60
+ {
61
+ "files": ["tests/**/*.ts"],
62
+ "rules": {
63
+ "import/no-unresolved": "off",
64
+ "file-extension-in-import-ts/file-extension-in-import-ts": "off",
65
+ "ava/no-ignored-test-files": "off"
66
+ }
67
+ }
68
+ ]
69
+ }
@@ -17,10 +17,11 @@ jobs:
17
17
  - name: Set up Node.js
18
18
  uses: actions/setup-node@v3
19
19
  with:
20
- node-version: 18.16.1
20
+ node-version: 18
21
+ check-latest: true
21
22
 
22
23
  - name: Update npm
23
- run: npm install -g npm@9.7.2
24
+ run: npm install -g npm@latest
24
25
 
25
26
  - name: Install dependencies
26
27
  run: npm ci --include dev
@@ -28,26 +29,51 @@ jobs:
28
29
  - name: Run tests
29
30
  run: npm run test
30
31
 
31
- lint:
32
+ test-pretty:
32
33
  runs-on: ubuntu-latest
33
34
  timeout-minutes: 10
35
+ steps:
36
+ - name: Checkout repository
37
+ uses: actions/checkout@v3
38
+
39
+ - name: Set up Node.js
40
+ uses: actions/setup-node@v3
41
+ with:
42
+ node-version: 18
43
+ check-latest: true
34
44
 
45
+ - name: Update npm
46
+ run: npm install -g npm@latest
47
+
48
+ - name: Install dependencies
49
+ run: npm ci --include dev
50
+
51
+ - name: Run tests
52
+ run: npm run test:pretty
53
+
54
+ test-run:
55
+ runs-on: ubuntu-latest
56
+ timeout-minutes: 10
35
57
  steps:
36
- - name: Checkout code
58
+ - name: Checkout repository
37
59
  uses: actions/checkout@v3
38
60
 
39
61
  - name: Set up Node.js
40
62
  uses: actions/setup-node@v3
41
63
  with:
42
- node-version: 18.16.1
64
+ node-version: 18
65
+ check-latest: true
66
+
67
+ - name: Update npm
68
+ run: npm install -g npm@latest
43
69
 
44
70
  - name: Install dependencies
45
- run: npm install --include dev
71
+ run: npm ci --include dev
46
72
 
47
- - name: Lint
48
- run: npm run lint
73
+ - name: Run tests
74
+ run: npm run logs
49
75
 
50
- build:
76
+ lint:
51
77
  runs-on: ubuntu-latest
52
78
  timeout-minutes: 10
53
79
 
@@ -58,10 +84,14 @@ jobs:
58
84
  - name: Set up Node.js
59
85
  uses: actions/setup-node@v3
60
86
  with:
61
- node-version: 18.16.1
87
+ node-version: 18
88
+ check-latest: true
89
+
90
+ - name: Update npm
91
+ run: npm install -g npm@latest
62
92
 
63
93
  - name: Install dependencies
64
94
  run: npm install --include dev
65
95
 
66
- - name: Validate TypeScript
67
- run: npm run build
96
+ - name: Lint
97
+ run: npm run lint
@@ -16,21 +16,34 @@ jobs:
16
16
  ref: ${{ github.head_ref }}
17
17
  fetch-depth: 0
18
18
  token: ${{ secrets.PAT }}
19
+
19
20
  - uses: actions/setup-node@v3
20
21
  with:
21
- node-version: 18.16.1
22
+ node-version: 18
23
+ check-latest: true
22
24
  registry-url: https://registry.npmjs.org/
23
- - run: npm ci
24
- - run: npm run build
25
+
26
+ - name: Update npm
27
+ run: npm install -g npm@latest
28
+
29
+ - name: Install dependencies
30
+ run: npm ci --include dev
31
+
32
+ - name: Build
33
+ run: npm run build
34
+
25
35
  - name: Git configuration
26
36
  run: |
27
37
  git config --local user.email "github-actions[bot]@users.noreply.github.com"
28
38
  git config --local user.name "github-actions[bot]"
39
+
29
40
  - run: npm version --commit-hooks true patch
41
+
30
42
  - name: Git commit and push
31
43
  env:
32
44
  GITHUB_TOKEN: ${{ secrets.PAT }}
33
45
  run: git push origin
46
+
34
47
  - run: npm publish
35
48
  env:
36
49
  NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
@@ -0,0 +1,6 @@
1
+ import { DestinationStream } from "pino";
2
+ type Options = {
3
+ pretty: boolean;
4
+ };
5
+ declare const transport: (opts?: Options) => Promise<DestinationStream>;
6
+ export default transport;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const pino_abstract_transport_1 = __importDefault(require("pino-abstract-transport"));
30
+ const loadPretty = async () => {
31
+ try {
32
+ return await Promise.resolve().then(() => __importStar(require("pino-pretty")));
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ };
38
+ const transport = async (opts) => {
39
+ if (!opts || opts.pretty !== false) {
40
+ const pretty = await loadPretty();
41
+ if (pretty)
42
+ return pretty.default({ colorize: true, ignore: "pid,time,hostname" });
43
+ }
44
+ return (0, pino_abstract_transport_1.default)(async (source) => {
45
+ for await (const log of source) {
46
+ const level = "level" in log ? String(log.level) : "error";
47
+ const msg = "msg" in log ? String(log.msg) : String(log);
48
+ process.stdout.write(`${JSON.stringify({ level, msg })}\n`);
49
+ }
50
+ });
51
+ };
52
+ exports.default = transport;
@@ -1,4 +1 @@
1
- import { Logger, LoggerOptions } from "pino";
2
- declare const pinoSettings: LoggerOptions;
3
- declare const setupLogging: (settings?: LoggerOptions) => Promise<Logger>;
4
- export { pinoSettings, setupLogging };
1
+ export * from "./logging.js";
package/dist/src/index.js CHANGED
@@ -10,84 +10,8 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
10
10
  if (k2 === undefined) k2 = k;
11
11
  o[k2] = m[k];
12
12
  }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
27
15
  };
28
16
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.setupLogging = exports.pinoSettings = void 0;
30
- const pino_1 = __importDefault(require("pino"));
31
- const pinoSettings = {
32
- base: undefined,
33
- timestamp: false,
34
- level: "debug",
35
- formatters: {
36
- level(level) {
37
- return { level };
38
- },
39
- },
40
- };
41
- exports.pinoSettings = pinoSettings;
42
- const formatItem = (item) => {
43
- if (typeof item === "undefined") {
44
- return "undefined";
45
- }
46
- // Remove colors from strings
47
- if (typeof item === "string") {
48
- return item.replace(/\x1b\[[0-9;]*m/g, "");
49
- }
50
- let stringified = "";
51
- try {
52
- stringified = JSON.stringify(item) || String(item);
53
- }
54
- catch {
55
- stringified = String(item);
56
- }
57
- return stringified.replace(/^\'|\'$/g, "");
58
- };
59
- const format = (items) => {
60
- return Array.from(items)
61
- .map((item) => formatItem(item))
62
- .join(" ");
63
- };
64
- const overrideConsole = (logger) => {
65
- console.log = function () {
66
- logger.info(format(Array.from(arguments)));
67
- };
68
- console.info = function () {
69
- logger.info(format(Array.from(arguments)));
70
- };
71
- console.warn = function () {
72
- logger.warn(format(Array.from(arguments)));
73
- };
74
- console.error = function () {
75
- logger.error(format(Array.from(arguments)));
76
- };
77
- console.debug = function () {
78
- logger.debug(format(Array.from(arguments)));
79
- };
80
- };
81
- const setupLogging = async (settings = pinoSettings) => {
82
- let pretty;
83
- try {
84
- pretty = await Promise.resolve().then(() => __importStar(require("pino-pretty")));
85
- }
86
- catch { }
87
- const logger = pretty
88
- ? (0, pino_1.default)(settings, pretty.default({ colorize: true }))
89
- : (0, pino_1.default)(settings);
90
- typeof window === "undefined" && overrideConsole(logger);
91
- return logger;
92
- };
93
- exports.setupLogging = setupLogging;
17
+ __exportStar(require("./logging.js"), exports);
@@ -0,0 +1,6 @@
1
+ import { Logger } from "pino";
2
+ type AwaitableLogger = Logger & {
3
+ untilFinished: Promise<void>;
4
+ };
5
+ declare const setupLogging: (pretty?: boolean) => AwaitableLogger;
6
+ export { AwaitableLogger, setupLogging };
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setupLogging = void 0;
7
+ const pino_1 = __importDefault(require("pino"));
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ const formatItem = (item) => {
10
+ if (typeof item === "undefined") {
11
+ return "undefined";
12
+ }
13
+ // Remove colors from strings
14
+ if (typeof item === "string") {
15
+ // eslint-disable-next-line no-control-regex
16
+ return item.replace(/\x1b\[[0-9;]*m/g, "");
17
+ }
18
+ let stringified = "";
19
+ try {
20
+ stringified = JSON.stringify(item) || String(item);
21
+ }
22
+ catch {
23
+ stringified = String(item);
24
+ }
25
+ return stringified.replace(/^'|'$/g, "");
26
+ };
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ const format = (items) => {
29
+ return Array.from(items)
30
+ .map((item) => formatItem(item))
31
+ .join(" ");
32
+ };
33
+ const overrideConsole = (logger) => {
34
+ console.log = function (...args) {
35
+ logger.info(format(Array.from(args)));
36
+ };
37
+ console.info = function (...args) {
38
+ logger.info(format(Array.from(args)));
39
+ };
40
+ console.warn = function (...args) {
41
+ logger.warn(format(Array.from(args)));
42
+ };
43
+ console.error = function (...args) {
44
+ logger.error(format(Array.from(args)));
45
+ };
46
+ console.debug = function (...args) {
47
+ logger.debug(format(Array.from(args)));
48
+ };
49
+ };
50
+ const setupLogging = (pretty = true) => {
51
+ const transport = pino_1.default.transport({
52
+ targets: [
53
+ {
54
+ target: "./datadog-stdout.js",
55
+ level: "debug",
56
+ options: { pretty },
57
+ },
58
+ ],
59
+ });
60
+ const logger = (0, pino_1.default)({ level: "debug" }, transport);
61
+ logger.untilFinished = new Promise((resolve) => {
62
+ transport.on("ready", resolve);
63
+ });
64
+ typeof window === "undefined" && overrideConsole(logger);
65
+ return logger;
66
+ };
67
+ exports.setupLogging = setupLogging;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_js_1 = require("./index.js");
4
+ const run = (prettify = true) => {
5
+ (0, index_js_1.setupLogging)(prettify);
6
+ console.debug("hello world");
7
+ };
8
+ run();
9
+ // Use `run(false)` to disable pino-pretty
10
+ // pino-pretty will also be disabled if it's not installed
@@ -5,29 +5,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const ava_1 = __importDefault(require("ava"));
7
7
  const index_1 = require("../src/index");
8
- const pino_1 = __importDefault(require("pino"));
9
- ava_1.default.serial("pinoSettings is exposed", (t) => {
10
- const logger = (0, pino_1.default)({ ...index_1.pinoSettings, enabled: false });
11
- logger.debug("Hello ava, I'm invisible");
12
- t.pass();
8
+ let logger;
9
+ const sleep = (ms) => {
10
+ return new Promise((resolve) => setTimeout(resolve, ms));
11
+ };
12
+ ava_1.default.before(() => {
13
+ logger = (0, index_1.setupLogging)("TEST_PRETTY" in process.env);
13
14
  });
14
- ava_1.default.serial("setupLogging can be called", async (t) => {
15
- (0, index_1.setupLogging)();
16
- console.debug("Hello ava");
17
- await new Promise((resolve) => setTimeout(resolve, 0));
18
- console.debug("Hello ava, I'm pretty");
19
- t.pass();
15
+ ava_1.default.afterEach(async () => {
16
+ await sleep(100);
17
+ logger && (await logger.untilFinished);
20
18
  });
21
- ava_1.default.serial("setupLogging can be awaited", async (t) => {
22
- await (0, index_1.setupLogging)();
23
- console.debug("Hello ava, I'm pretty too");
19
+ ava_1.default.serial("logs display to terminal", (t) => {
20
+ console.debug("Hello ava");
24
21
  t.pass();
25
22
  });
26
23
  ava_1.default.serial("can log various objects", (t) => {
27
24
  console.debug("Message", { message: true });
28
25
  console.debug(undefined);
29
26
  console.debug("bigint", 100n);
30
- console.debug("settings", index_1.pinoSettings);
31
27
  console.debug(false, true, "true", "false");
32
28
  t.pass();
33
29
  });
package/package.json CHANGED
@@ -1,29 +1,33 @@
1
1
  {
2
2
  "name": "mynth-logger",
3
- "version": "1.0.13",
3
+ "version": "1.1.1",
4
4
  "description": "Package to format logs for mynth microservices.",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
7
7
  "scripts": {
8
- "test": "npx ava",
9
8
  "build": "npx tsc",
9
+ "test": "npx tsc && npx ava",
10
+ "test:pretty": "npx tsc && TEST_PRETTY=true npx ava",
11
+ "logs": "npx tsc && node dist/src/run.js",
10
12
  "prettier": "npx prettier -w '**/*.{js,jsx,ts,tsx,json,yml.j2,yml,yaml,.*}'",
11
- "lint": "concurrently \"npx prettier --check '**/*.{js,jsx,ts,tsx,json,yml.j2,yml,yaml,.*}'\" \"npx eslint --max-warnings=0\""
13
+ "lint": "concurrently \"npx prettier --check '**/*.{js,jsx,ts,tsx,json,yml.j2,yml,yaml,.*}'\" \"npx eslint . --max-warnings=0\""
12
14
  },
13
15
  "repository": {
14
16
  "type": "git",
15
17
  "url": "git@github.com-mynth:MynthAI/mynth-logger.git"
16
18
  },
17
19
  "dependencies": {
18
- "ava": "^5.3.1",
19
- "json5": "^2.2.3",
20
20
  "pino": "^8.15.0"
21
21
  },
22
22
  "devDependencies": {
23
23
  "@types/node": "^20.5.0",
24
+ "@typescript-eslint/eslint-plugin": "^6.8.0",
25
+ "ava": "^5.3.1",
24
26
  "concurrently": "^8.2.0",
25
27
  "eslint": "^8.47.0",
26
28
  "eslint-plugin-ava": "^14.0.0",
29
+ "eslint-plugin-file-extension-in-import-ts": "^1.0.2",
30
+ "eslint-plugin-import": "^2.28.1",
27
31
  "pino-pretty": "^10.2.0",
28
32
  "prettier": "^3.0.2",
29
33
  "tsx": "^3.12.7",
@@ -31,13 +35,7 @@
31
35
  },
32
36
  "ava": {
33
37
  "files": [
34
- "tests/**/*.test.ts"
35
- ],
36
- "extensions": {
37
- "ts": "module"
38
- },
39
- "nodeArguments": [
40
- "--loader=tsx"
38
+ "dist/tests/**/*.test.js"
41
39
  ]
42
40
  }
43
41
  }
@@ -0,0 +1,33 @@
1
+ import build from "pino-abstract-transport";
2
+ import { DestinationStream } from "pino";
3
+
4
+ type Options = {
5
+ pretty: boolean;
6
+ };
7
+
8
+ const loadPretty = async () => {
9
+ try {
10
+ return await import("pino-pretty");
11
+ } catch {
12
+ return null;
13
+ }
14
+ };
15
+
16
+ const transport = async (opts?: Options): Promise<DestinationStream> => {
17
+ if (!opts || opts.pretty !== false) {
18
+ const pretty = await loadPretty();
19
+ if (pretty)
20
+ return pretty.default({ colorize: true, ignore: "pid,time,hostname" });
21
+ }
22
+
23
+ return build(async (source: AsyncIterable<object>) => {
24
+ for await (const log of source) {
25
+ const level = "level" in log ? String(log.level) : "error";
26
+ const msg = "msg" in log ? String(log.msg) : String(log);
27
+
28
+ process.stdout.write(`${JSON.stringify({ level, msg })}\n`);
29
+ }
30
+ });
31
+ };
32
+
33
+ export default transport;
package/src/index.ts CHANGED
@@ -1,78 +1 @@
1
- import JSON5 from "json5";
2
- import pino, { Logger, LoggerOptions } from "pino";
3
-
4
- const pinoSettings: LoggerOptions = {
5
- base: undefined,
6
- timestamp: false,
7
- level: "debug",
8
- formatters: {
9
- level(level) {
10
- return { level };
11
- },
12
- },
13
- };
14
-
15
- const formatItem = (item: any): string => {
16
- if (typeof item === "undefined") {
17
- return "undefined";
18
- }
19
-
20
- // Remove colors from strings
21
- if (typeof item === "string") {
22
- return item.replace(/\x1b\[[0-9;]*m/g, "");
23
- }
24
-
25
- let stringified = "";
26
- try {
27
- stringified = JSON.stringify(item) || String(item);
28
- } catch {
29
- stringified = String(item);
30
- }
31
-
32
- return stringified.replace(/^\'|\'$/g, "");
33
- };
34
-
35
- const format = (items: any[]): string => {
36
- return Array.from(items)
37
- .map((item) => formatItem(item))
38
- .join(" ");
39
- };
40
-
41
- const overrideConsole = (logger: Logger) => {
42
- console.log = function () {
43
- logger.info(format(Array.from(arguments)));
44
- };
45
-
46
- console.info = function () {
47
- logger.info(format(Array.from(arguments)));
48
- };
49
-
50
- console.warn = function () {
51
- logger.warn(format(Array.from(arguments)));
52
- };
53
-
54
- console.error = function () {
55
- logger.error(format(Array.from(arguments)));
56
- };
57
-
58
- console.debug = function () {
59
- logger.debug(format(Array.from(arguments)));
60
- };
61
- };
62
-
63
- const setupLogging = async (
64
- settings: LoggerOptions = pinoSettings
65
- ): Promise<Logger> => {
66
- let pretty;
67
- try {
68
- pretty = await import("pino-pretty");
69
- } catch {}
70
-
71
- const logger = pretty
72
- ? pino(settings, pretty.default({ colorize: true }))
73
- : pino(settings);
74
- typeof window === "undefined" && overrideConsole(logger);
75
- return logger;
76
- };
77
-
78
- export { pinoSettings, setupLogging };
1
+ export * from "./logging.js";
package/src/logging.ts ADDED
@@ -0,0 +1,79 @@
1
+ import pino, { Logger } from "pino";
2
+
3
+ type AwaitableLogger = Logger & {
4
+ untilFinished: Promise<void>;
5
+ };
6
+
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ const formatItem = (item: any): string => {
9
+ if (typeof item === "undefined") {
10
+ return "undefined";
11
+ }
12
+
13
+ // Remove colors from strings
14
+ if (typeof item === "string") {
15
+ // eslint-disable-next-line no-control-regex
16
+ return item.replace(/\x1b\[[0-9;]*m/g, "");
17
+ }
18
+
19
+ let stringified = "";
20
+
21
+ try {
22
+ stringified = JSON.stringify(item) || String(item);
23
+ } catch {
24
+ stringified = String(item);
25
+ }
26
+
27
+ return stringified.replace(/^'|'$/g, "");
28
+ };
29
+
30
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
+ const format = (items: any[]): string => {
32
+ return Array.from(items)
33
+ .map((item) => formatItem(item))
34
+ .join(" ");
35
+ };
36
+
37
+ const overrideConsole = (logger: Logger) => {
38
+ console.log = function (...args) {
39
+ logger.info(format(Array.from(args)));
40
+ };
41
+
42
+ console.info = function (...args) {
43
+ logger.info(format(Array.from(args)));
44
+ };
45
+
46
+ console.warn = function (...args) {
47
+ logger.warn(format(Array.from(args)));
48
+ };
49
+
50
+ console.error = function (...args) {
51
+ logger.error(format(Array.from(args)));
52
+ };
53
+
54
+ console.debug = function (...args) {
55
+ logger.debug(format(Array.from(args)));
56
+ };
57
+ };
58
+
59
+ const setupLogging = (pretty: boolean = true): AwaitableLogger => {
60
+ const transport = pino.transport({
61
+ targets: [
62
+ {
63
+ target: "./datadog-stdout.js",
64
+ level: "debug",
65
+ options: { pretty },
66
+ },
67
+ ],
68
+ });
69
+
70
+ const logger = pino({ level: "debug" }, transport) as AwaitableLogger;
71
+ logger.untilFinished = new Promise<void>((resolve) => {
72
+ transport.on("ready", resolve);
73
+ });
74
+
75
+ typeof window === "undefined" && overrideConsole(logger);
76
+ return logger;
77
+ };
78
+
79
+ export { AwaitableLogger, setupLogging };
package/src/run.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { setupLogging } from "./index.js";
2
+
3
+ const run = (prettify: boolean = true) => {
4
+ setupLogging(prettify);
5
+ console.debug("hello world");
6
+ };
7
+
8
+ run();
9
+ // Use `run(false)` to disable pino-pretty
10
+ // pino-pretty will also be disabled if it's not installed
@@ -1,24 +1,23 @@
1
1
  import test from "ava";
2
- import { setupLogging, pinoSettings } from "../src/index";
3
- import pino from "pino";
2
+ import { AwaitableLogger, setupLogging } from "../src/index";
4
3
 
5
- test.serial("pinoSettings is exposed", (t) => {
6
- const logger = pino({ ...pinoSettings, enabled: false });
7
- logger.debug("Hello ava, I'm invisible");
8
- t.pass();
4
+ let logger: AwaitableLogger | undefined;
5
+
6
+ const sleep = (ms: number) => {
7
+ return new Promise((resolve) => setTimeout(resolve, ms));
8
+ };
9
+
10
+ test.before(() => {
11
+ logger = setupLogging("TEST_PRETTY" in process.env);
9
12
  });
10
13
 
11
- test.serial("setupLogging can be called", async (t) => {
12
- setupLogging();
13
- console.debug("Hello ava");
14
- await new Promise((resolve) => setTimeout(resolve, 0));
15
- console.debug("Hello ava, I'm pretty");
16
- t.pass();
14
+ test.afterEach(async () => {
15
+ await sleep(100);
16
+ logger && (await logger.untilFinished);
17
17
  });
18
18
 
19
- test.serial("setupLogging can be awaited", async (t) => {
20
- await setupLogging();
21
- console.debug("Hello ava, I'm pretty too");
19
+ test.serial("logs display to terminal", (t) => {
20
+ console.debug("Hello ava");
22
21
  t.pass();
23
22
  });
24
23
 
@@ -26,7 +25,6 @@ test.serial("can log various objects", (t) => {
26
25
  console.debug("Message", { message: true });
27
26
  console.debug(undefined);
28
27
  console.debug("bigint", 100n);
29
- console.debug("settings", pinoSettings);
30
28
  console.debug(false, true, "true", "false");
31
29
  t.pass();
32
30
  });