From d8d47e30596d6a4e439c966c54b8a126c79c8aa4 Mon Sep 17 00:00:00 2001 From: LiviaMedeiros Date: Sat, 21 May 2022 17:48:37 +0800 Subject: [PATCH] util: add `kEmptyObject` to internal/util PR-URL: https://github.com/nodejs/node/pull/43159 Reviewed-By: Matteo Collina Reviewed-By: Antoine du Hamel --- lib/internal/util.js | 4 + test/parallel/test-internal-util-objects.js | 90 +++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 test/parallel/test-internal-util-objects.js diff --git a/lib/internal/util.js b/lib/internal/util.js index d1b82fd69e1..30d93c5f298 100644 --- a/lib/internal/util.js +++ b/lib/internal/util.js @@ -13,6 +13,7 @@ const { ObjectGetOwnPropertyDescriptor, ObjectGetOwnPropertyDescriptors, ObjectGetPrototypeOf, + ObjectFreeze, ObjectSetPrototypeOf, Promise, ReflectApply, @@ -511,6 +512,8 @@ function structuredClone(value) { const kEnumerableProperty = ObjectCreate(null); kEnumerableProperty.enumerable = true; +const kEmptyObject = ObjectFreeze(ObjectCreate(null)); + module.exports = { assertCrypto, cachedResult, @@ -551,5 +554,6 @@ module.exports = { kIsEncodingSymbol: Symbol('kIsEncodingSymbol'), kVmBreakFirstLineSymbol: Symbol('kVmBreakFirstLineSymbol'), + kEmptyObject, kEnumerableProperty, }; diff --git a/test/parallel/test-internal-util-objects.js b/test/parallel/test-internal-util-objects.js new file mode 100644 index 00000000000..092deb9e094 --- /dev/null +++ b/test/parallel/test-internal-util-objects.js @@ -0,0 +1,90 @@ +// Flags: --expose-internals +'use strict'; +require('../common'); + +// Test helper objects from internal/util + +const assert = require('assert'); +const { + kEnumerableProperty, + kEmptyObject, +} = require('internal/util'); + +Object.prototype.blep = 'blop'; + +{ + assert.strictEqual( + kEnumerableProperty.blep, + undefined + ); + assert.strictEqual( + kEnumerableProperty.enumerable, + true + ); + assert.strictEqual( + Object.getPrototypeOf(kEnumerableProperty), + null + ); + assert.deepStrictEqual( + Object.getOwnPropertyNames(kEnumerableProperty), + [ 'enumerable' ] + ); +} + +{ + assert.strictEqual( + kEmptyObject.blep, + undefined + ); + assert.strictEqual( + kEmptyObject.prototype, + undefined + ); + assert.strictEqual( + Object.getPrototypeOf(kEmptyObject), + null + ); + assert.strictEqual( + kEmptyObject instanceof Object, + false + ); + assert.deepStrictEqual( + Object.getOwnPropertyDescriptors(kEmptyObject), + {} + ); + assert.deepStrictEqual( + Object.getOwnPropertyNames(kEmptyObject), + [] + ); + assert.deepStrictEqual( + Object.getOwnPropertySymbols(kEmptyObject), + [] + ); + assert.strictEqual( + Object.isExtensible(kEmptyObject), + false + ); + assert.strictEqual( + Object.isSealed(kEmptyObject), + true + ); + assert.strictEqual( + Object.isFrozen(kEmptyObject), + true + ); + + assert.throws( + () => kEmptyObject.foo = 'bar', + TypeError + ); + assert.throws( + () => Object.assign(kEmptyObject, { foo: 'bar' }), + TypeError + ); + assert.throws( + () => Object.defineProperty(kEmptyObject, 'foo', {}), + TypeError + ); +} + +delete Object.prototype.blep;