diff --git a/package.json b/package.json index 20e567454..d54377a55 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "lint": "eslint .", "test": "npm run lint && tap test/*test.js test/*/*test.js && npm run test-types", "test-ci": "npm run lint && tap --no-check-coverage test/*test.js test/*/*test.js --coverage-report=lcovonly && npm run test-types", - "test-types": "tsc && tsd", + "test-types": "tsc && tsd && ts-node test/types/pino.ts", "cov-ui": "tap --coverage-report=html test/*test.js test/*/*test.js", "bench": "node benchmarks/utils/runbench all", "bench-basic": "node benchmarks/utils/runbench basic", @@ -64,7 +64,7 @@ }, "homepage": "http://getpino.io", "devDependencies": { - "@types/node": "^15.3.0", + "@types/node": "^15.14.1", "airtap": "4.0.3", "benchmark": "^2.1.4", "bole": "^4.0.0", @@ -81,7 +81,7 @@ "import-fresh": "^3.2.1", "log": "^6.0.0", "loglevel": "^1.6.7", - "pino-pretty": "^5.0.0", + "pino-pretty": "^5.1.0", "pre-commit": "^1.2.2", "proxyquire": "^2.1.3", "pump": "^3.0.0", @@ -92,8 +92,9 @@ "tap": "^15.0.1", "tape": "^5.0.0", "through2": "^4.0.0", - "tsd": "^0.15.1", - "typescript": "^4.2.4", + "ts-node": "^10.0.0", + "tsd": "^0.17.0", + "typescript": "^4.3.5", "winston": "^3.3.3" }, "dependencies": { @@ -103,7 +104,7 @@ "pino-abstract-transport": "^0.2.0", "pino-std-serializers": "^4.0.0", "quick-format-unescaped": "^4.0.3", - "sonic-boom": "^2.0.1", + "sonic-boom": "^2.1.0", "thread-stream": "^0.10.0" }, "tsd": { diff --git a/pino.d.ts b/pino.d.ts index 4f1c4fa58..8964d01f1 100644 --- a/pino.d.ts +++ b/pino.d.ts @@ -21,7 +21,8 @@ import { EventEmitter } from "events"; import { SonicBoom } from "sonic-boom"; import * as pinoStdSerializers from "pino-std-serializers"; -import {WriteStream} from "fs"; +import { WriteStream } from "fs"; +import { WorkerOptions } from "worker_threads"; export default P; export { P as pino } @@ -200,6 +201,32 @@ declare namespace P { dest?: string | number | DestinationObjectOptions | DestinationStream | NodeJS.WritableStream, ): SonicBoom; + interface TransportTargetOptions> { + target: string + options: TransportOptions + level: LevelWithSilent + } + + interface TransportBaseOptions> { + options?: TransportOptions + worker?: WorkerOptions & { autoEnd?: boolean} + } + + interface TransportSingleOptions> extends TransportBaseOptions{ + target: string + } + + interface TransportMultiOptions> extends TransportBaseOptions{ + targets: readonly TransportTargetOptions[] + } + + // ToDo https://github.com/pinojs/thread-stream/issues/24 + type ThreadStream = any + + function transport>( + options: TransportSingleOptions | TransportMultiOptions + ): ThreadStream + interface MultiStreamOptions { levels?: Record dedupe?: boolean diff --git a/test/types/pino-transport.test-d.ts b/test/types/pino-transport.test-d.ts new file mode 100644 index 000000000..292b04b92 --- /dev/null +++ b/test/types/pino-transport.test-d.ts @@ -0,0 +1,47 @@ +import { pino } from '../../pino' + +// Single +const transport = pino.transport({ + target: '#pino/pretty', + options: { some: 'options for', the: 'transport' } +}) +pino(transport) + +// Multiple +const transports = pino.transport({targets: [ + { + level: 'info', + target: '#pino/pretty', + options: { some: 'options for', the: 'transport' } + }, + { + level: 'trace', + target: '#pino/file', + options: { destination: './test.log' } + } +]}) +pino(transports) + +type TransportConfig = { + id: string +} + +// Custom transport params +const customTransport = pino.transport({ + target: 'custom', + options: { id: 'abc' } +}) +pino(customTransport) + +// Worker +pino.transport({ + target: 'custom', + worker: { + argv: ['a', 'b'], + stdin: false, + stderr: true, + stdout: false, + autoEnd: true, + }, + options: { id: 'abc' } +}) diff --git a/test/types/pino.ts b/test/types/pino.ts new file mode 100644 index 000000000..ae7fc364d --- /dev/null +++ b/test/types/pino.ts @@ -0,0 +1,40 @@ +import { pino } from '../../pino' +import { join } from 'path' +import { tmpdir } from'os' + +const destination = join( + tmpdir(), + '_' + Math.random().toString(36).substr(2, 9) +) + +// Single +const transport = pino.transport({ + target: '#pino/pretty', + options: { some: 'options for', the: 'transport' } +}) +const logger = pino(transport) +logger.info('test2') + +const transport2 = pino.transport({ + target: '#pino/pretty', +}) +const logger2 = pino(transport2) +logger2.info('test2') + + +// Multiple + +const transports = pino.transport({targets: [ + { + level: 'info', + target: '#pino/pretty', + options: { some: 'options for', the: 'transport' } + }, + { + level: 'trace', + target: '#pino/file', + options: { destination } + } +]}) +const loggerMulti = pino(transports) +loggerMulti.info('test2')