From 17b68e420ae64a7e2e7ea998c7300dc445e0346f Mon Sep 17 00:00:00 2001 From: morgan-coded <256248948+morgan-coded@users.noreply.github.com> Date: Thu, 25 Jun 2026 23:48:10 -0500 Subject: [PATCH 1/4] fix: move define-properties to preferred manifest --- manifests/native.json | 5 ----- manifests/preferred.json | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) 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..ffb7e8b9 100644 --- a/manifests/preferred.json +++ b/manifests/preferred.json @@ -220,6 +220,11 @@ "replacements": ["dequal", "util.isDeepStrictEqual", "Bun.deepEquals"], "url": {"type": "e18e", "id": "deep-equal"} }, + "define-properties": { + "type": "module", + "moduleName": "define-properties", + "replacements": ["Object.defineProperties"] + }, "depcheck": { "type": "module", "moduleName": "depcheck", @@ -2918,6 +2923,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", From d356ae2640da7ea2cb9d910ebe03a145a968d62b Mon Sep 17 00:00:00 2001 From: morgan-coded <256248948+morgan-coded@users.noreply.github.com> Date: Fri, 26 Jun 2026 07:22:02 -0500 Subject: [PATCH 2/4] docs: add define-properties replacement notes --- docs/modules/define-properties.md | 47 +++++++++++++++++++++++++++++++ manifests/preferred.json | 3 +- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 docs/modules/define-properties.md diff --git a/docs/modules/define-properties.md b/docs/modules/define-properties.md new file mode 100644 index 00000000..31171c24 --- /dev/null +++ b/docs/modules/define-properties.md @@ -0,0 +1,47 @@ +--- +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' + +const obj = {} + +defineProperties(obj, { + enabled: true +}) + +Object.defineProperties(obj, { + enabled: { + configurable: true, + enumerable: false, + value: true, + writable: false + } +}) +``` + +`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 +const descriptors = { + enabled: { + configurable: true, + enumerable: false, + value: true, + writable: false + } +} + +if (!Object.hasOwn(obj, 'enabled') || shouldOverrideEnabled()) { + Object.defineProperties(obj, descriptors) +} +``` diff --git a/manifests/preferred.json b/manifests/preferred.json index ffb7e8b9..2d39ed2a 100644 --- a/manifests/preferred.json +++ b/manifests/preferred.json @@ -223,7 +223,8 @@ "define-properties": { "type": "module", "moduleName": "define-properties", - "replacements": ["Object.defineProperties"] + "replacements": ["Object.defineProperties"], + "url": {"type": "e18e", "id": "define-properties"} }, "depcheck": { "type": "module", From 6da17a66281375fe43eb6b0f52c7f69279b154f4 Mon Sep 17 00:00:00 2001 From: morgan-coded <256248948+morgan-coded@users.noreply.github.com> Date: Fri, 26 Jun 2026 08:03:02 -0500 Subject: [PATCH 3/4] docs: show define-properties migration diff --- docs/modules/define-properties.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/docs/modules/define-properties.md b/docs/modules/define-properties.md index 31171c24..25d18fe4 100644 --- a/docs/modules/define-properties.md +++ b/docs/modules/define-properties.md @@ -11,22 +11,20 @@ description: Native alternatives to the define-properties package for defining m Example: ```ts -import defineProperties from 'define-properties' +import defineProperties from 'define-properties' // [!code --] const obj = {} - -defineProperties(obj, { - enabled: true -}) - -Object.defineProperties(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: From 30e8b4e2ee5a17a41e3283a207cdffed20c41126 Mon Sep 17 00:00:00 2001 From: morgan-coded <256248948+morgan-coded@users.noreply.github.com> Date: Fri, 26 Jun 2026 08:18:07 -0500 Subject: [PATCH 4/4] docs: show predicate migration diff --- docs/modules/define-properties.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/modules/define-properties.md b/docs/modules/define-properties.md index 25d18fe4..1398a0aa 100644 --- a/docs/modules/define-properties.md +++ b/docs/modules/define-properties.md @@ -30,6 +30,8 @@ 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, @@ -39,7 +41,9 @@ const descriptors = { } } +defineProperties(obj, { enabled: true }, { enabled: shouldOverrideEnabled }) // [!code --] if (!Object.hasOwn(obj, 'enabled') || shouldOverrideEnabled()) { - Object.defineProperties(obj, descriptors) + // [!code ++] + Object.defineProperties(obj, descriptors) // [!code ++] } ```