From 797ad38715440d1443ec17dc9dfc293b5da35fc7 Mon Sep 17 00:00:00 2001 From: Mick van Duijn Date: Wed, 11 Sep 2019 14:16:27 +0200 Subject: [PATCH 1/4] fix(serializers): properly transfer Symbol based serializers --- lib/proto.js | 4 ++-- test/serializers.test.js | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/proto.js b/lib/proto.js index 1ec71cf1d..644aa946c 100644 --- a/lib/proto.js +++ b/lib/proto.js @@ -72,10 +72,10 @@ function child (bindings) { const instance = Object.create(this) if (bindings.hasOwnProperty('serializers') === true) { instance[serializersSym] = Object.create(null) - for (var k in serializers) { + for (var k of [...Object.getOwnPropertySymbols(serializers), ...Object.keys(serializers)]) { instance[serializersSym][k] = serializers[k] } - for (var bk in bindings.serializers) { + for (var bk of [...Object.getOwnPropertySymbols(bindings.serializers), ...Object.keys(bindings.serializers)]) { instance[serializersSym][bk] = bindings.serializers[bk] } } else instance[serializersSym] = serializers diff --git a/test/serializers.test.js b/test/serializers.test.js index c6a707935..a188e8954 100644 --- a/test/serializers.test.js +++ b/test/serializers.test.js @@ -124,6 +124,30 @@ test('children inherit parent serializers', async ({ is }) => { is(o.test, 'parent') }) +test('children inherit parent Symbol serializers', async ({ is, isNot }) => { + const stream = sink() + const symbolSerializers = { + [Symbol.for('pino.*')]: parentSerializers.test + } + const parent = pino({ serializers: symbolSerializers }, stream) + + is(parent[Symbol.for('pino.serializers')], symbolSerializers) + + const child = parent.child({ + serializers: { + a + } + }) + + function a () { + return 'hello' + } + + isNot(child[Symbol.for('pino.serializers')], symbolSerializers) + is(child[Symbol.for('pino.serializers')].a, a) + is(child[Symbol.for('pino.serializers')][Symbol.for('pino.*')], parentSerializers.test) +}) + test('children serializers get called', async ({ is }) => { const stream = sink() const parent = pino({ From b1e303e357d61ffd5d0a71770dc7d7d92021f92d Mon Sep 17 00:00:00 2001 From: Mick van Duijn Date: Wed, 11 Sep 2019 15:54:42 +0200 Subject: [PATCH 2/4] chore: do not use array spread --- lib/proto.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/proto.js b/lib/proto.js index 644aa946c..03aa1bc07 100644 --- a/lib/proto.js +++ b/lib/proto.js @@ -72,12 +72,18 @@ function child (bindings) { const instance = Object.create(this) if (bindings.hasOwnProperty('serializers') === true) { instance[serializersSym] = Object.create(null) - for (var k of [...Object.getOwnPropertySymbols(serializers), ...Object.keys(serializers)]) { + for (var k in serializers) { instance[serializersSym][k] = serializers[k] } - for (var bk of [...Object.getOwnPropertySymbols(bindings.serializers), ...Object.keys(bindings.serializers)]) { + for (var ks of Object.getOwnPropertySymbols(serializers)) { + instance[serializersSym][ks] = serializers[ks] + } + for (var bk in bindings.serializers) { instance[serializersSym][bk] = bindings.serializers[bk] } + for (var bks of Object.getOwnPropertySymbols(bindings.serializers)) { + instance[serializersSym][bks] = bindings.serializers[bks] + } } else instance[serializersSym] = serializers if (bindings.hasOwnProperty('customLevels') === true) { assertNoLevelCollisions(this.levels, bindings.customLevels) From 78efd5036d203190a843f6b6d63fe6151a4cd6fc Mon Sep 17 00:00:00 2001 From: Mick van Duijn Date: Wed, 11 Sep 2019 15:59:54 +0200 Subject: [PATCH 3/4] chore: replace for-of by for(;;) --- lib/proto.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/proto.js b/lib/proto.js index 03aa1bc07..8dca09c36 100644 --- a/lib/proto.js +++ b/lib/proto.js @@ -72,16 +72,22 @@ function child (bindings) { const instance = Object.create(this) if (bindings.hasOwnProperty('serializers') === true) { instance[serializersSym] = Object.create(null) + for (var k in serializers) { instance[serializersSym][k] = serializers[k] } - for (var ks of Object.getOwnPropertySymbols(serializers)) { + const parentSymbols = Object.getOwnPropertySymbols(serializers) + for (var i = 0; i < parentSymbols.length; i++) { + const ks = parentSymbols[i] instance[serializersSym][ks] = serializers[ks] } + for (var bk in bindings.serializers) { instance[serializersSym][bk] = bindings.serializers[bk] } - for (var bks of Object.getOwnPropertySymbols(bindings.serializers)) { + const bindingsSymbols = Object.getOwnPropertySymbols(bindings.serializers) + for (var bi = 0; bi < bindingsSymbols.length; bi++) { + const bks = bindingsSymbols[bi] instance[serializersSym][bks] = bindings.serializers[bks] } } else instance[serializersSym] = serializers From be84ca8bb309fadff425fbebcfb3d73d62957612 Mon Sep 17 00:00:00 2001 From: Mick van Duijn Date: Wed, 11 Sep 2019 16:30:14 +0200 Subject: [PATCH 4/4] chore: extended Symbol serializer test --- test/serializers.test.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/serializers.test.js b/test/serializers.test.js index a188e8954..70e8a6a48 100644 --- a/test/serializers.test.js +++ b/test/serializers.test.js @@ -135,6 +135,7 @@ test('children inherit parent Symbol serializers', async ({ is, isNot }) => { const child = parent.child({ serializers: { + [Symbol.for('a')]: a, a } }) @@ -145,6 +146,7 @@ test('children inherit parent Symbol serializers', async ({ is, isNot }) => { isNot(child[Symbol.for('pino.serializers')], symbolSerializers) is(child[Symbol.for('pino.serializers')].a, a) + is(child[Symbol.for('pino.serializers')][Symbol.for('a')], a) is(child[Symbol.for('pino.serializers')][Symbol.for('pino.*')], parentSerializers.test) })