diff --git a/docs/modules/define-properties.md b/docs/modules/define-properties.md new file mode 100644 index 00000000..1398a0aa --- /dev/null +++ b/docs/modules/define-properties.md @@ -0,0 +1,49 @@ +--- +description: Native alternatives to the define-properties package for defining multiple object properties +--- + +# Replacements for `define-properties` + +## `Object.defineProperties` (native) + +[`Object.defineProperties`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties) can define multiple properties on an object without an extra dependency. + +Example: + +```ts +import defineProperties from 'define-properties' // [!code --] + +const obj = {} +const descriptors = { + enabled: { + configurable: true, + enumerable: false, + value: true, + writable: false + } +} + +defineProperties(obj, { enabled: true }) // [!code --] +Object.defineProperties(obj, descriptors) // [!code ++] +``` + +`define-properties` also skips existing properties unless a matching predicate returns `true`. If your code relies on that behavior, keep the condition outside the descriptor map when migrating: + +```ts +import defineProperties from 'define-properties' // [!code --] + +const descriptors = { + enabled: { + configurable: true, + enumerable: false, + value: true, + writable: false + } +} + +defineProperties(obj, { enabled: true }, { enabled: shouldOverrideEnabled }) // [!code --] +if (!Object.hasOwn(obj, 'enabled') || shouldOverrideEnabled()) { + // [!code ++] + Object.defineProperties(obj, descriptors) // [!code ++] +} +``` diff --git a/manifests/native.json b/manifests/native.json index 3099f83f..e30fc09f 100644 --- a/manifests/native.json +++ b/manifests/native.json @@ -2131,11 +2131,6 @@ "moduleName": "define-data-property", "replacements": ["Object.defineProperty"] }, - "define-properties": { - "type": "module", - "moduleName": "define-properties", - "replacements": ["Object.defineProperties"] - }, "define-property": { "type": "module", "moduleName": "define-property", diff --git a/manifests/preferred.json b/manifests/preferred.json index e5534bbd..2d39ed2a 100644 --- a/manifests/preferred.json +++ b/manifests/preferred.json @@ -220,6 +220,12 @@ "replacements": ["dequal", "util.isDeepStrictEqual", "Bun.deepEquals"], "url": {"type": "e18e", "id": "deep-equal"} }, + "define-properties": { + "type": "module", + "moduleName": "define-properties", + "replacements": ["Object.defineProperties"], + "url": {"type": "e18e", "id": "define-properties"} + }, "depcheck": { "type": "module", "moduleName": "depcheck", @@ -2918,6 +2924,18 @@ "id": "Web/JavaScript/Reference/Global_Objects/Intl/Segmenter" } }, + "Object.defineProperties": { + "id": "Object.defineProperties", + "type": "native", + "url": { + "type": "mdn", + "id": "Web/JavaScript/Reference/Global_Objects/Object/defineProperties" + }, + "webFeatureId": { + "featureId": "object-object", + "compatKey": "javascript.builtins.Object.defineProperties" + } + }, "Promise": { "id": "Promise", "type": "native",