diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..404abb2
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1 @@
+coverage/
diff --git a/.eslintrc b/.eslintrc
index db992d7..10a3108 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -7,6 +7,14 @@
 		"id-length": [2, { "min": 1, "max": 35 }],
 		"max-lines-per-function": [2, 100],
 		"max-params": [2, 4],
-		"max-statements": [2, 13]
-	}
+	},
+
+	"overrides": [
+		{
+			"files": "test/**",
+			"rules": {
+				"max-lines-per-function": 0,
+			},
+		},
+	],
 }
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000..c70f264
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: [ljharb]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: npm/define-properties
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/.jscs.json b/.jscs.json
deleted file mode 100644
index 6f2d7f9..0000000
--- a/.jscs.json
+++ /dev/null
@@ -1,175 +0,0 @@
-{
-	"es3": true,
-
-	"additionalRules": [],
-
-	"requireSemicolons": true,
-
-	"disallowMultipleSpaces": true,
-
-	"disallowIdentifierNames": [],
-
-	"requireCurlyBraces": {
-		"allExcept": [],
-		"keywords": ["if", "else", "for", "while", "do", "try", "catch"]
-	},
-
-	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
-
-	"disallowSpaceAfterKeywords": [],
-
-	"disallowSpaceBeforeComma": true,
-	"disallowSpaceAfterComma": false,
-	"disallowSpaceBeforeSemicolon": true,
-
-	"disallowNodeTypes": [
-		"DebuggerStatement",
-		"LabeledStatement",
-		"SwitchCase",
-		"SwitchStatement",
-		"WithStatement"
-	],
-
-	"requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },
-
-	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
-	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
-	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
-
-	"requireSpaceBetweenArguments": true,
-
-	"disallowSpacesInsideParentheses": true,
-
-	"disallowSpacesInsideArrayBrackets": true,
-
-	"disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },
-
-	"disallowSpaceAfterObjectKeys": true,
-
-	"requireCommaBeforeLineBreak": true,
-
-	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
-	"requireSpaceAfterPrefixUnaryOperators": [],
-
-	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
-	"requireSpaceBeforePostfixUnaryOperators": [],
-
-	"disallowSpaceBeforeBinaryOperators": [],
-	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-
-	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-	"disallowSpaceAfterBinaryOperators": [],
-
-	"disallowImplicitTypeConversion": ["binary", "string"],
-
-	"disallowKeywords": ["with", "eval"],
-
-	"requireKeywordsOnNewLine": [],
-	"disallowKeywordsOnNewLine": ["else"],
-
-	"requireLineFeedAtFileEnd": true,
-
-	"disallowTrailingWhitespace": true,
-
-	"disallowTrailingComma": true,
-
-	"excludeFiles": ["node_modules/**", "vendor/**"],
-
-	"disallowMultipleLineStrings": true,
-
-	"requireDotNotation": { "allExcept": ["keywords"] },
-
-	"requireParenthesesAroundIIFE": true,
-
-	"validateLineBreaks": "LF",
-
-	"validateQuoteMarks": {
-		"escape": true,
-		"mark": "'"
-	},
-
-	"disallowOperatorBeforeLineBreak": [],
-
-	"requireSpaceBeforeKeywords": [
-		"do",
-		"for",
-		"if",
-		"else",
-		"switch",
-		"case",
-		"try",
-		"catch",
-		"finally",
-		"while",
-		"with",
-		"return"
-	],
-
-	"validateAlignedFunctionParameters": {
-		"lineBreakAfterOpeningBraces": true,
-		"lineBreakBeforeClosingBraces": true
-	},
-
-	"requirePaddingNewLinesBeforeExport": true,
-
-	"validateNewlineAfterArrayElements": {
-		"maximum": 3
-	},
-
-	"requirePaddingNewLinesAfterUseStrict": true,
-
-	"disallowArrowFunctions": true,
-
-	"disallowMultiLineTernary": true,
-
-	"validateOrderInObjectKeys": "asc-insensitive",
-
-	"disallowIdenticalDestructuringNames": true,
-
-	"disallowNestedTernaries": { "maxLevel": 1 },
-
-	"requireSpaceAfterComma": { "allExcept": ["trailing"] },
-	"requireAlignedMultilineParams": false,
-
-	"requireSpacesInGenerator": {
-		"afterStar": true
-	},
-
-	"disallowSpacesInGenerator": {
-		"beforeStar": true
-	},
-
-	"disallowVar": false,
-
-	"requireArrayDestructuring": false,
-
-	"requireEnhancedObjectLiterals": false,
-
-	"requireObjectDestructuring": false,
-
-	"requireEarlyReturn": false,
-
-	"requireCapitalizedConstructorsNew": {
-		"allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
-	},
-
-	"requireImportAlphabetized": false,
-
-	"requireSpaceBeforeObjectValues": true,
-	"requireSpaceBeforeDestructuredValues": true,
-
-	"disallowSpacesInsideTemplateStringPlaceholders": true,
-
-	"disallowArrayDestructuringReturn": false,
-
-	"requireNewlineBeforeSingleStatementsInIf": false,
-
-	"disallowUnusedVariables": true,
-
-	"requireSpacesInsideImportedObjectBraces": true,
-
-	"requireUseStrict": true
-}
-
diff --git a/.npmignore b/.npmignore
deleted file mode 100644
index a777a81..0000000
--- a/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-test/*
-
diff --git a/.npmrc b/.npmrc
deleted file mode 100644
index 43c97e7..0000000
--- a/.npmrc
+++ /dev/null
@@ -1 +0,0 @@
-package-lock=false
diff --git a/.nycrc b/.nycrc
new file mode 100644
index 0000000..bdd626c
--- /dev/null
+++ b/.nycrc
@@ -0,0 +1,9 @@
+{
+	"all": true,
+	"check-coverage": false,
+	"reporter": ["text-summary", "text", "html", "json"],
+	"exclude": [
+		"coverage",
+		"test"
+	]
+}
diff --git a/README.md b/README.md
index 33b6111..5e4b115 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,5 @@
-#define-properties <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
+# define-properties <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
 
-[![Build Status][travis-svg]][travis-url]
 [![dependency status][deps-svg]][deps-url]
 [![dev dependency status][dev-deps-svg]][dev-deps-url]
 [![License][license-image]][license-url]
@@ -8,8 +7,6 @@
 
 [![npm badge][npm-badge-png]][package-url]
 
-[![browser support][testling-svg]][testling-url]
-
 Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.
 Existing properties are not overridden. Accepts a map of property names to a predicate that, when true, force-overrides.
 
@@ -69,18 +66,14 @@ if (define.supportsDescriptors) {
 Simply clone the repo, `npm install`, and run `npm test`
 
 [package-url]: https://npmjs.org/package/define-properties
-[npm-version-svg]: http://versionbadg.es/ljharb/define-properties.svg
-[travis-svg]: https://travis-ci.org/ljharb/define-properties.svg
-[travis-url]: https://travis-ci.org/ljharb/define-properties
+[npm-version-svg]: https://versionbadg.es/ljharb/define-properties.svg
 [deps-svg]: https://david-dm.org/ljharb/define-properties.svg
 [deps-url]: https://david-dm.org/ljharb/define-properties
 [dev-deps-svg]: https://david-dm.org/ljharb/define-properties/dev-status.svg
 [dev-deps-url]: https://david-dm.org/ljharb/define-properties#info=devDependencies
-[testling-svg]: https://ci.testling.com/ljharb/define-properties.png
-[testling-url]: https://ci.testling.com/ljharb/define-properties
 [npm-badge-png]: https://nodei.co/npm/define-properties.png?downloads=true&stars=true
-[license-image]: http://img.shields.io/npm/l/define-properties.svg
+[license-image]: https://img.shields.io/npm/l/define-properties.svg
 [license-url]: LICENSE
-[downloads-image]: http://img.shields.io/npm/dm/define-properties.svg
-[downloads-url]: http://npm-stat.com/charts.html?package=define-properties
+[downloads-image]: https://img.shields.io/npm/dm/define-properties.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=define-properties
 
diff --git a/debian/changelog b/debian/changelog
index 2f5e656..0551fb8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,11 +1,12 @@
-node-define-properties (1.1.3-2) UNRELEASED; urgency=medium
+node-define-properties (1.1.3+git20210418.1.4d61866-1) UNRELEASED; urgency=medium
 
   * Set upstream metadata fields: Bug-Submit.
   * Remove obsolete fields Contact, Name from debian/upstream/metadata
     (already present in machine-readable debian/copyright).
   * Update standards version to 4.5.0, no changes needed.
+  * New upstream snapshot.
 
- -- Debian Janitor <janitor@jelmer.uk>  Sat, 25 Apr 2020 23:24:53 +0000
+ -- Debian Janitor <janitor@jelmer.uk>  Sat, 24 Apr 2021 02:22:45 -0000
 
 node-define-properties (1.1.3-1) unstable; urgency=medium
 
diff --git a/index.js b/index.js
index cb3ae1c..b72c2a4 100644
--- a/index.js
+++ b/index.js
@@ -15,8 +15,8 @@ var arePropertyDescriptorsSupported = function () {
 	var obj = {};
 	try {
 		origDefineProperty(obj, 'x', { enumerable: false, value: obj });
-		// eslint-disable-next-line no-unused-vars, no-restricted-syntax
-		for (var _ in obj) { // jscs:ignore disallowUnusedVariables
+		// eslint-disable-next-line no-restricted-syntax, no-unreachable-loop
+		for (var _ in obj) {
 			return false;
 		}
 		return obj.x === obj;
@@ -38,7 +38,7 @@ var defineProperty = function (object, name, value, predicate) {
 			writable: true
 		});
 	} else {
-		object[name] = value;
+		object[name] = value; // eslint-disable-line no-param-reassign
 	}
 };
 
diff --git a/object-keys/.editorconfig b/object-keys/.editorconfig
deleted file mode 100644
index eaa2141..0000000
--- a/object-keys/.editorconfig
+++ /dev/null
@@ -1,13 +0,0 @@
-root = true
-
-[*]
-indent_style = tab;
-insert_final_newline = true;
-quote_type = auto;
-space_after_anonymous_functions = true;
-space_after_control_statements = true;
-spaces_around_operators = true;
-trim_trailing_whitespace = true;
-spaces_in_brackets = false;
-end_of_line = lf;
-
diff --git a/object-keys/.eslintrc b/object-keys/.eslintrc
deleted file mode 100644
index 9a8d5b0..0000000
--- a/object-keys/.eslintrc
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"complexity": [2, 23],
-		"id-length": [2, { "min": 1, "max": 40 }],
-		"max-params": [2, 3],
-		"max-statements": [2, 23],
-		"max-statements-per-line": [2, { "max": 2 }],
-		"no-extra-parens": [1],
-		"no-invalid-this": [1],
-		"no-restricted-syntax": [2, "BreakStatement", "ContinueStatement", "LabeledStatement", "WithStatement"],
-		"operator-linebreak": [2, "after"]
-	}
-}
diff --git a/object-keys/.npmignore b/object-keys/.npmignore
deleted file mode 100644
index a777a81..0000000
--- a/object-keys/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-test/*
-
diff --git a/object-keys/.npmrc b/object-keys/.npmrc
deleted file mode 100644
index c6d2e51..0000000
--- a/object-keys/.npmrc
+++ /dev/null
@@ -1,2 +0,0 @@
-package-lock=false
-audit-level=high
diff --git a/object-keys/CHANGELOG.md b/object-keys/CHANGELOG.md
deleted file mode 100644
index b7d92df..0000000
--- a/object-keys/CHANGELOG.md
+++ /dev/null
@@ -1,232 +0,0 @@
-1.1.1 / 2019-04-06
-=================
-  * [Fix] exclude deprecated Firefox keys (#53)
-
-1.1.0 / 2019-02-10
-=================
-  * [New] [Refactor] move full implementation to `implementation` entry point
-  * [Refactor] only evaluate the implementation if `Object.keys` is not present
-  * [Tests] up to `node` `v11.8`, `v10.15`, `v8.15`, `v6.16`
-  * [Tests] remove jscs
-  * [Tests] switch to `npm audit` from `nsp`
-
-1.0.12 / 2018-06-18
-=================
-  * [Fix] avoid accessing `window.applicationCache`, to avoid issues with latest Chrome on HTTP (#46)
-
-1.0.11 / 2016-07-05
-=================
-  * [Fix] exclude keys regarding the style (eg. `pageYOffset`) on `window` to avoid reflow (#32)
-
-1.0.10 / 2016-07-04
-=================
-  * [Fix] exclude `height` and `width` keys on `window` to avoid reflow (#31)
-  * [Fix] In IE 6, `window.external` makes `Object.keys` throw
-  * [Tests] up to `node` `v6.2`, `v5.10`, `v4.4`
-  * [Tests] use pretest/posttest for linting/security
-  * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`
-  * [Dev Deps] remove unused eccheck script + dep
-
-1.0.9 / 2015-10-19
-=================
-  * [Fix] Blacklist 'frame' property on window (#16, #17)
-  * [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config`
-
-1.0.8 / 2015-10-14
-=================
-  * [Fix] wrap automation equality bug checking in try/catch, per [es5-shim#327](https://github.com/es-shims/es5-shim/issues/327)
-  * [Fix] Blacklist 'window.frameElement' per [es5-shim#322](https://github.com/es-shims/es5-shim/issues/322)
-  * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
-  * [Tests] up to `io.js` `v3.3`, `node` `v4.2`
-  * [Dev Deps] update `eslint`, `tape`, `@ljharb/eslint-config`, `jscs`
-
-1.0.7 / 2015-07-18
-=================
-  * [Fix] A proper fix for 176f03335e90d5c8d0d8125a99f27819c9b9cdad / https://github.com/es-shims/es5-shim/issues/275 that doesn't break dontEnum/constructor fixes in IE 8.
-  * [Fix] Remove deprecation message in Chrome by touching deprecated window properties (#15)
-  * [Tests] Improve test output for automation equality bugfix
-  * [Tests] Test on `io.js` `v2.4`
-
-1.0.6 / 2015-07-09
-=================
-  * [Fix] Use an object lookup rather than ES5's `indexOf` (#14)
-  * [Tests] ES3 browsers don't have `Array.isArray`
-  * [Tests] Fix `no-shadow` rule, as well as an IE 8 bug caused by engine NFE shadowing bugs.
-
-1.0.5 / 2015-07-03
-=================
-  * [Fix] Fix a flabbergasting IE 8 bug where `localStorage.constructor.prototype === localStorage` throws
-  * [Tests] Test up to `io.js` `v2.3`
-  * [Dev Deps] Update `nsp`, `eslint`
-
-1.0.4 / 2015-05-23
-=================
-  * Fix a Safari 5.0 bug with `Object.keys` not working with `arguments`
-  * Test on latest `node` and `io.js`
-  * Update `jscs`, `tape`, `eslint`, `nsp`, `is`, `editorconfig-tools`, `covert`
-
-1.0.3 / 2015-01-06
-=================
-  * Revert "Make `object-keys` more robust against later environment tampering" to maintain ES3 compliance
-
-1.0.2 / 2014-12-28
-=================
-  * Update lots of dev dependencies
-  * Tweaks to README
-  * Make `object-keys` more robust against later environment tampering
-
-1.0.1 / 2014-09-03
-=================
-  * Update URLs and badges in README
-
-1.0.0 / 2014-08-26
-=================
-  * v1.0.0
-
-0.6.1 / 2014-08-25
-=================
-  * v0.6.1
-  * Updating dependencies (tape, covert, is)
-  * Update badges in readme
-  * Use separate var statements
-
-0.6.0 / 2014-04-23
-=================
-  * v0.6.0
-  * Updating dependencies (tape, covert)
-  * Make sure boxed primitives, and arguments objects, work properly in ES3 browsers
-  * Improve test matrix: test all node versions, but only latest two stables are a failure
-  * Remove internal foreach shim.
-
-0.5.1 / 2014-03-09
-=================
-  * 0.5.1
-  * Updating dependencies (tape, covert, is)
-  * Removing forEach from the module (but keeping it in tests)
-
-0.5.0 / 2014-01-30
-=================
-  * 0.5.0
-  * Explicitly returning the shim, instead of returning native Object.keys when present
-  * Adding a changelog.
-  * Cleaning up IIFE wrapping
-  * Testing on node 0.4 through 0.11
-
-0.4.0 / 2013-08-14
-==================
-
-  * v0.4.0
-  * In Chrome 4-10 and Safari 4, typeof (new RegExp) === 'function'
-  * If it's a string, make sure to use charAt instead of brackets.
-  * Only use Function#call if necessary.
-  * Making sure the context tests actually run.
-  * Better function detection
-  * Adding the android browser
-  * Fixing testling files
-  * Updating tape
-  * Removing the "is" dependency.
-  * Making an isArguments shim.
-  * Adding a local forEach shim and tests.
-  * Updating paths.
-  * Moving the shim test.
-  * v0.3.0
-
-0.3.0 / 2013-05-18
-==================
-
-  * README tweak.
-  * Fixing constructor enum issue. Fixes [#5](https://github.com/ljharb/object-keys/issues/5).
-  * Adding a test for [#5](https://github.com/ljharb/object-keys/issues/5)
-  * Updating readme.
-  * Updating dependencies.
-  * Giving credit to lodash.
-  * Make sure that a prototype's constructor property is not enumerable. Fixes [#3](https://github.com/ljharb/object-keys/issues/3).
-  * Adding additional tests to handle arguments objects, and to skip "prototype" in functions. Fixes [#2](https://github.com/ljharb/object-keys/issues/2).
-  * Fixing a typo on this test for [#3](https://github.com/ljharb/object-keys/issues/3).
-  * Adding node 0.10 to travis.
-  * Adding an IE < 9 test per [#3](https://github.com/ljharb/object-keys/issues/3)
-  * Adding an iOS 5 mobile Safari test per [#2](https://github.com/ljharb/object-keys/issues/2)
-  * Moving "indexof" and "is" to be dev dependencies.
-  * Making sure the shim works with functions.
-  * Flattening the tests.
-
-0.2.0 / 2013-05-10
-==================
-
-  * v0.2.0
-  * Object.keys should work with arrays.
-
-0.1.8 / 2013-05-10
-==================
-
-  * v0.1.8
-  * Upgrading dependencies.
-  * Using a simpler check.
-  * Fixing a bug in hasDontEnumBug browsers.
-  * Using the newest tape!
-  * Fixing this error test.
-  * "undefined" is probably a reserved word in ES3.
-  * Better test message.
-
-0.1.7 / 2013-04-17
-==================
-
-  * Upgrading "is" once more.
-  * The key "null" is breaking some browsers.
-
-0.1.6 / 2013-04-17
-==================
-
-  * v0.1.6
-  * Upgrading "is"
-
-0.1.5 / 2013-04-14
-==================
-
-  * Bumping version.
-  * Adding more testling browsers.
-  * Updating "is"
-
-0.1.4 / 2013-04-08
-==================
-
-  * Using "is" instead of "is-extended".
-
-0.1.3 / 2013-04-07
-==================
-
-  * Using "foreach" instead of my own shim.
-  * Removing "tap"; I'll just wait for "tape" to fix its node 0.10 bug.
-
-0.1.2 / 2013-04-03
-==================
-
-  * Adding dependency status; moving links to an index at the bottom.
-  * Upgrading is-extended; version 0.1.2
-  * Adding an npm version badge.
-
-0.1.1 / 2013-04-01
-==================
-
-  * Adding Travis CI.
-  * Bumping the version.
-  * Adding indexOf since IE sucks.
-  * Adding a forEach shim since older browsers don't have Array#forEach.
-  * Upgrading tape - 0.3.2 uses Array#map
-  * Using explicit end instead of plan.
-  * Can't test with Array.isArray in older browsers.
-  * Using is-extended.
-  * Fixing testling files.
-  * JSHint/JSLint-ing.
-  * Removing an unused object.
-  * Using strict mode.
-
-0.1.0 / 2013-03-30
-==================
-
-  * Changing the exports should have meant a higher version bump.
-  * Oops, fixing the repo URL.
-  * Adding more tests.
-  * 0.0.2
-  * Merge branch 'export_one_thing'; closes [#1](https://github.com/ljharb/object-keys/issues/1)
-  * Move shim export to a separate file.
diff --git a/object-keys/LICENSE b/object-keys/LICENSE
deleted file mode 100644
index 28553fd..0000000
--- a/object-keys/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (C) 2013 Jordan Harband
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
\ No newline at end of file
diff --git a/object-keys/README.md b/object-keys/README.md
deleted file mode 100644
index ed4c277..0000000
--- a/object-keys/README.md
+++ /dev/null
@@ -1,76 +0,0 @@
-#object-keys <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
-
-[![Build Status][travis-svg]][travis-url]
-[![dependency status][deps-svg]][deps-url]
-[![dev dependency status][dev-deps-svg]][dev-deps-url]
-[![License][license-image]][license-url]
-[![Downloads][downloads-image]][downloads-url]
-
-[![npm badge][npm-badge-png]][package-url]
-
-[![browser support][testling-svg]][testling-url]
-
-An Object.keys shim. Invoke its "shim" method to shim Object.keys if it is unavailable.
-
-Most common usage:
-```js
-var keys = Object.keys || require('object-keys');
-```
-
-## Example
-
-```js
-var keys = require('object-keys');
-var assert = require('assert');
-var obj = {
-	a: true,
-	b: true,
-	c: true
-};
-
-assert.deepEqual(keys(obj), ['a', 'b', 'c']);
-```
-
-```js
-var keys = require('object-keys');
-var assert = require('assert');
-/* when Object.keys is not present */
-delete Object.keys;
-var shimmedKeys = keys.shim();
-assert.equal(shimmedKeys, keys);
-assert.deepEqual(Object.keys(obj), keys(obj));
-```
-
-```js
-var keys = require('object-keys');
-var assert = require('assert');
-/* when Object.keys is present */
-var shimmedKeys = keys.shim();
-assert.equal(shimmedKeys, Object.keys);
-assert.deepEqual(Object.keys(obj), keys(obj));
-```
-
-## Source
-Implementation taken directly from [es5-shim][es5-shim-url], with modifications, including from [lodash][lodash-url].
-
-## Tests
-Simply clone the repo, `npm install`, and run `npm test`
-
-[package-url]: https://npmjs.org/package/object-keys
-[npm-version-svg]: http://versionbadg.es/ljharb/object-keys.svg
-[travis-svg]: https://travis-ci.org/ljharb/object-keys.svg
-[travis-url]: https://travis-ci.org/ljharb/object-keys
-[deps-svg]: https://david-dm.org/ljharb/object-keys.svg
-[deps-url]: https://david-dm.org/ljharb/object-keys
-[dev-deps-svg]: https://david-dm.org/ljharb/object-keys/dev-status.svg
-[dev-deps-url]: https://david-dm.org/ljharb/object-keys#info=devDependencies
-[testling-svg]: https://ci.testling.com/ljharb/object-keys.png
-[testling-url]: https://ci.testling.com/ljharb/object-keys
-[es5-shim-url]: https://github.com/es-shims/es5-shim/blob/master/es5-shim.js#L542-589
-[lodash-url]: https://github.com/lodash/lodash
-[npm-badge-png]: https://nodei.co/npm/object-keys.png?downloads=true&stars=true
-[license-image]: http://img.shields.io/npm/l/object-keys.svg
-[license-url]: LICENSE
-[downloads-image]: http://img.shields.io/npm/dm/object-keys.svg
-[downloads-url]: http://npm-stat.com/charts.html?package=object-keys
-
diff --git a/object-keys/implementation.js b/object-keys/implementation.js
deleted file mode 100644
index 5b32986..0000000
--- a/object-keys/implementation.js
+++ /dev/null
@@ -1,122 +0,0 @@
-'use strict';
-
-var keysShim;
-if (!Object.keys) {
-	// modified from https://github.com/es-shims/es5-shim
-	var has = Object.prototype.hasOwnProperty;
-	var toStr = Object.prototype.toString;
-	var isArgs = require('./isArguments'); // eslint-disable-line global-require
-	var isEnumerable = Object.prototype.propertyIsEnumerable;
-	var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
-	var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
-	var dontEnums = [
-		'toString',
-		'toLocaleString',
-		'valueOf',
-		'hasOwnProperty',
-		'isPrototypeOf',
-		'propertyIsEnumerable',
-		'constructor'
-	];
-	var equalsConstructorPrototype = function (o) {
-		var ctor = o.constructor;
-		return ctor && ctor.prototype === o;
-	};
-	var excludedKeys = {
-		$applicationCache: true,
-		$console: true,
-		$external: true,
-		$frame: true,
-		$frameElement: true,
-		$frames: true,
-		$innerHeight: true,
-		$innerWidth: true,
-		$onmozfullscreenchange: true,
-		$onmozfullscreenerror: true,
-		$outerHeight: true,
-		$outerWidth: true,
-		$pageXOffset: true,
-		$pageYOffset: true,
-		$parent: true,
-		$scrollLeft: true,
-		$scrollTop: true,
-		$scrollX: true,
-		$scrollY: true,
-		$self: true,
-		$webkitIndexedDB: true,
-		$webkitStorageInfo: true,
-		$window: true
-	};
-	var hasAutomationEqualityBug = (function () {
-		/* global window */
-		if (typeof window === 'undefined') { return false; }
-		for (var k in window) {
-			try {
-				if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
-					try {
-						equalsConstructorPrototype(window[k]);
-					} catch (e) {
-						return true;
-					}
-				}
-			} catch (e) {
-				return true;
-			}
-		}
-		return false;
-	}());
-	var equalsConstructorPrototypeIfNotBuggy = function (o) {
-		/* global window */
-		if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
-			return equalsConstructorPrototype(o);
-		}
-		try {
-			return equalsConstructorPrototype(o);
-		} catch (e) {
-			return false;
-		}
-	};
-
-	keysShim = function keys(object) {
-		var isObject = object !== null && typeof object === 'object';
-		var isFunction = toStr.call(object) === '[object Function]';
-		var isArguments = isArgs(object);
-		var isString = isObject && toStr.call(object) === '[object String]';
-		var theKeys = [];
-
-		if (!isObject && !isFunction && !isArguments) {
-			throw new TypeError('Object.keys called on a non-object');
-		}
-
-		var skipProto = hasProtoEnumBug && isFunction;
-		if (isString && object.length > 0 && !has.call(object, 0)) {
-			for (var i = 0; i < object.length; ++i) {
-				theKeys.push(String(i));
-			}
-		}
-
-		if (isArguments && object.length > 0) {
-			for (var j = 0; j < object.length; ++j) {
-				theKeys.push(String(j));
-			}
-		} else {
-			for (var name in object) {
-				if (!(skipProto && name === 'prototype') && has.call(object, name)) {
-					theKeys.push(String(name));
-				}
-			}
-		}
-
-		if (hasDontEnumBug) {
-			var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
-
-			for (var k = 0; k < dontEnums.length; ++k) {
-				if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
-					theKeys.push(dontEnums[k]);
-				}
-			}
-		}
-		return theKeys;
-	};
-}
-module.exports = keysShim;
diff --git a/object-keys/index.js b/object-keys/index.js
deleted file mode 100644
index a43807d..0000000
--- a/object-keys/index.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-
-var slice = Array.prototype.slice;
-var isArgs = require('./isArguments');
-
-var origKeys = Object.keys;
-var keysShim = origKeys ? function keys(o) { return origKeys(o); } : require('./implementation');
-
-var originalKeys = Object.keys;
-
-keysShim.shim = function shimObjectKeys() {
-	if (Object.keys) {
-		var keysWorksWithArguments = (function () {
-			// Safari 5.0 bug
-			var args = Object.keys(arguments);
-			return args && args.length === arguments.length;
-		}(1, 2));
-		if (!keysWorksWithArguments) {
-			Object.keys = function keys(object) { // eslint-disable-line func-name-matching
-				if (isArgs(object)) {
-					return originalKeys(slice.call(object));
-				}
-				return originalKeys(object);
-			};
-		}
-	} else {
-		Object.keys = keysShim;
-	}
-	return Object.keys || keysShim;
-};
-
-module.exports = keysShim;
diff --git a/object-keys/isArguments.js b/object-keys/isArguments.js
deleted file mode 100644
index f2a2a90..0000000
--- a/object-keys/isArguments.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-var toStr = Object.prototype.toString;
-
-module.exports = function isArguments(value) {
-	var str = toStr.call(value);
-	var isArgs = str === '[object Arguments]';
-	if (!isArgs) {
-		isArgs = str !== '[object Array]' &&
-			value !== null &&
-			typeof value === 'object' &&
-			typeof value.length === 'number' &&
-			value.length >= 0 &&
-			toStr.call(value.callee) === '[object Function]';
-	}
-	return isArgs;
-};
diff --git a/object-keys/package.json b/object-keys/package.json
deleted file mode 100644
index 99ea923..0000000
--- a/object-keys/package.json
+++ /dev/null
@@ -1,88 +0,0 @@
-{
-	"name": "object-keys",
-	"version": "1.1.1",
-	"author": {
-		"name": "Jordan Harband",
-		"email": "ljharb@gmail.com",
-		"url": "http://ljharb.codes"
-	},
-	"contributors": [
-		{
-			"name": "Jordan Harband",
-			"email": "ljharb@gmail.com",
-			"url": "http://ljharb.codes"
-		},
-		{
-			"name": "Raynos",
-			"email": "raynos2@gmail.com"
-		},
-		{
-			"name": "Nathan Rajlich",
-			"email": "nathan@tootallnate.net"
-		},
-		{
-			"name": "Ivan Starkov",
-			"email": "istarkov@gmail.com"
-		},
-		{
-			"name": "Gary Katsevman",
-			"email": "git@gkatsev.com"
-		}
-	],
-	"description": "An Object.keys replacement, in case Object.keys is not available. From https://github.com/es-shims/es5-shim",
-	"license": "MIT",
-	"main": "index.js",
-	"scripts": {
-		"pretest": "npm run --silent lint",
-		"test": "npm run --silent tests-only",
-		"posttest": "npm run --silent audit",
-		"tests-only": "node test/index.js",
-		"coverage": "covert test/*.js",
-		"coverage-quiet": "covert test/*.js --quiet",
-		"lint": "eslint .",
-		"preaudit": "npm install --package-lock --package-lock-only",
-		"audit": "npm audit",
-		"postaudit": "rm package-lock.json"
-	},
-	"repository": {
-		"type": "git",
-		"url": "git://github.com/ljharb/object-keys.git"
-	},
-	"keywords": [
-		"Object.keys",
-		"keys",
-		"ES5",
-		"shim"
-	],
-	"dependencies": {},
-	"devDependencies": {
-		"@ljharb/eslint-config": "^13.1.1",
-		"covert": "^1.1.1",
-		"eslint": "^5.13.0",
-		"foreach": "^2.0.5",
-		"indexof": "^0.0.1",
-		"is": "^3.3.0",
-		"tape": "^4.9.2"
-	},
-	"testling": {
-		"files": "test/index.js",
-		"browsers": [
-			"iexplore/6.0..latest",
-			"firefox/3.0..6.0",
-			"firefox/15.0..latest",
-			"firefox/nightly",
-			"chrome/4.0..10.0",
-			"chrome/20.0..latest",
-			"chrome/canary",
-			"opera/10.0..latest",
-			"opera/next",
-			"safari/4.0..latest",
-			"ipad/6.0..latest",
-			"iphone/6.0..latest",
-			"android-browser/4.2"
-		]
-	},
-	"engines": {
-		"node": ">= 0.4"
-	}
-}
diff --git a/object-keys/test/.eslintrc b/object-keys/test/.eslintrc
deleted file mode 100644
index e5c98be..0000000
--- a/object-keys/test/.eslintrc
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-	"rules": {
-		"array-bracket-newline": 0,
-		"array-element-newline": 0,
-		"max-nested-callbacks": 0,
-		"no-magic-numbers": 0,
-	}
-}
diff --git a/object-keys/test/index.js b/object-keys/test/index.js
deleted file mode 100644
index 5402465..0000000
--- a/object-keys/test/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-'use strict';
-
-require('./isArguments');
-
-require('./shim');
diff --git a/object-keys/test/isArguments.js b/object-keys/test/isArguments.js
deleted file mode 100644
index 092f633..0000000
--- a/object-keys/test/isArguments.js
+++ /dev/null
@@ -1,16 +0,0 @@
-'use strict';
-
-var test = require('tape');
-var isArguments = require('../isArguments');
-
-test('is.arguments', function (t) {
-	t.notOk(isArguments([]), 'array is not arguments');
-	(function () { t.ok(isArguments(arguments), 'arguments is arguments'); }());
-	(function () { t.notOk(isArguments(Array.prototype.slice.call(arguments)), 'sliced arguments is not arguments'); }());
-	var fakeOldArguments = {
-		callee: function () {},
-		length: 3
-	};
-	t.ok(isArguments(fakeOldArguments), 'old-style arguments is arguments');
-	t.end();
-});
diff --git a/object-keys/test/shim.js b/object-keys/test/shim.js
deleted file mode 100644
index c30b79c..0000000
--- a/object-keys/test/shim.js
+++ /dev/null
@@ -1,263 +0,0 @@
-/* global window */
-
-'use strict';
-
-var test = require('tape');
-var is = require('is');
-var keysShim;
-var reRequire = function reRequireImplementation() {
-	delete require.cache[require.resolve('../implementation')];
-	delete require.cache[require.resolve('../')];
-	keysShim = require('../'); // eslint-disable-line global-require
-};
-reRequire();
-
-var indexOf = require('indexof');
-var has = Object.prototype.hasOwnProperty;
-var enumerable = Object.prototype.propertyIsEnumerable;
-
-var obj = {
-	aNull: null,
-	arr: [],
-	bool: true,
-	num: 42,
-	obj: {},
-	str: 'boz',
-	undef: undefined
-};
-var objKeys = ['aNull', 'arr', 'bool', 'num', 'obj', 'str', 'undef'];
-
-var returnEmptyArray = function () { return []; };
-var preserve = function preserveProperty(object, property, callback) {
-	reRequire();
-	return function preserved() {
-		var original = object[property];
-		try {
-			return callback.apply(this, arguments);
-		} finally {
-			object[property] = original;
-			// eslint-disable-next-line no-unsafe-finally
-			if (object[property] !== original) { throw new EvalError('should never happen'); }
-			reRequire();
-		}
-	};
-};
-
-test('exports a "shim" function', function (t) {
-	t.equal(typeof keysShim.shim, 'function', 'keysShim.shim is a function');
-
-	t.test('when Object.keys is present', preserve(Object, 'keys', function (st) {
-		Object.keys = returnEmptyArray;
-		st.equal(Object.keys, returnEmptyArray, 'Object.keys has been replaced');
-		var shimmedKeys = keysShim.shim();
-		st.notEqual(Object.keys, keysShim, 'Object.keys is not overridden to the shim');
-		st.notEqual(Object.keys, returnEmptyArray, 'Object.keys is overridden, is not returnEmptyArray');
-		st.equal(shimmedKeys, Object.keys, 'Object.keys is returned');
-		st.end();
-	}));
-
-	t.test('when Object.keys is not present', { skip: Object.keys }, preserve(Object, 'keys', function (st) {
-		st.notOk(Object.keys, 'Object.keys does not exist');
-		var shimmedKeys = keysShim.shim();
-
-		st.equal(Object.keys, keysShim, 'Object.keys is overridden');
-		st.equal(shimmedKeys, keysShim, 'shim is returned');
-
-		st.end();
-	}));
-
-	t.test('when Object.keys has arguments bug', preserve(Object, 'keys', function (st) {
-		st.deepEqual(arguments.length, 1, 'arguments has expected length');
-
-		var originalObjectKeys = Object.keys;
-		var fakeKeys = function keys(object) {
-			if (is.args(object)) { return []; }
-			return originalObjectKeys(object);
-		};
-		Object.keys = fakeKeys;
-		st.deepEqual(Object.keys(arguments), [], 'Object.keys has arguments bug');
-		var shimmedKeys = keysShim.shim();
-		st.notEqual(fakeKeys, shimmedKeys, 'Object.keys is not original fake value');
-		st.equal(Object.keys, shimmedKeys, 'Object.keys is overridden');
-		st.deepEqual(Object.keys(arguments), ['0'], 'Object.keys now works with arguments');
-		st.end();
-	}));
-
-	t.end();
-});
-
-test('working with actual shim', function (t) {
-	t.notEqual(Object.keys, keysShim, 'keys shim is not native Object.keys');
-	t.end();
-});
-
-test('works with an object literal', function (t) {
-	var theKeys = keysShim(obj);
-	t.equal(is.array(theKeys), true, 'returns an array');
-	t.deepEqual(theKeys, objKeys, 'Object has expected keys');
-	t.end();
-});
-
-test('works with an arguments object', function (t) {
-	(function () {
-		t.equal(arguments.length, 3, 'arguments has length of 3');
-		t.deepEqual(keysShim(arguments), ['0', '1', '2'], 'returns keys of arguments');
-	}(1, 2, 3));
-	t.end();
-});
-
-test('works with a boxed primitive', function (t) {
-	t.deepEqual(keysShim(Object('hello')), ['0', '1', '2', '3', '4'], 'object string returns proper keys');
-	/* eslint-disable no-new-wrappers */
-	t.deepEqual(keysShim(new String('hello')), ['0', '1', '2', '3', '4'], 'String object returns proper keys');
-
-	var x = new String('x');
-	/* eslint-enable no-new-wrappers */
-	x.y = 1;
-	t.deepEqual(keysShim(x).sort(), ['0', 'y'].sort(), 'String object with extra properties returns proper keys');
-
-	t.end();
-});
-
-test('works with an array', function (t) {
-	var arr = [1, 2, 3];
-	var theKeys = keysShim(arr);
-	t.equal(is.array(theKeys), true, 'returns an array');
-	t.deepEqual(theKeys, ['0', '1', '2'], 'Array has expected keys');
-	t.end();
-});
-
-test('works with a function', function (t) {
-	var foo = function () {};
-	foo.a = true;
-
-	t.doesNotThrow(function () { return keysShim(foo); }, 'does not throw an error');
-	t.deepEqual(keysShim(foo), ['a'], 'returns expected keys');
-	t.end();
-});
-
-test('returns names which are own properties', function (t) {
-	var theKeys = keysShim(obj);
-	for (var i = 0; i < theKeys.length; ++i) {
-		t.equal(has.call(obj, theKeys[i]), true, theKeys[i] + ' should be returned');
-	}
-	t.end();
-});
-
-test('returns names which are enumerable', function (t) {
-	var k;
-	var loopedValues = [];
-	for (k in obj) {
-		if (enumerable.call(obj, k)) {
-			loopedValues.push(k);
-		}
-	}
-	var theKeys = keysShim(obj);
-	for (var i = 0; i < theKeys.length; ++i) {
-		t.notEqual(indexOf(loopedValues, theKeys[i]), -1, theKeys[i] + ' is not enumerable');
-	}
-	t.end();
-});
-
-test('throws an error for a non-object', function (t) {
-	t['throws'](
-		function () { return keysShim(null); },
-		new TypeError('Object.keys called on a non-object'),
-		'throws on a non-object'
-	);
-	t.end();
-});
-
-test('works with an object instance', function (t) {
-	var Prototype = function () {};
-	Prototype.prototype.foo = true;
-	var instance = new Prototype();
-	instance.bar = true;
-	var theKeys = keysShim(instance);
-	t.equal(is.array(theKeys), true, 'returns an array');
-	t.deepEqual(theKeys, ['bar'], 'Instance has expected keys');
-	t.end();
-});
-
-test('works in iOS 5 mobile Safari', function (t) {
-	var Foo = function () {};
-	Foo.a = function () {};
-
-	// the bug is keysShim(Foo) => ['a', 'prototype'] instead of ['a']
-	t.deepEqual(keysShim(Foo), ['a'], 'has expected keys');
-	t.end();
-});
-
-test('works in environments with the dontEnum bug (IE < 9)', function (t) {
-	var Foo = function () {};
-	Foo.prototype.a = function () {};
-
-	// the bug is keysShim(Foo.prototype) => ['a', 'constructor'] instead of ['a']
-	t.deepEqual(keysShim(Foo.prototype), ['a'], 'has expected keys');
-	t.end();
-});
-
-test('shadowed properties', function (t) {
-	var shadowedProps = [
-		'dummyControlProp', /* just to be sure */
-		'constructor',
-		'hasOwnProperty',
-		'isPrototypeOf',
-		'propertyIsEnumerable',
-		'toLocaleString',
-		'toString',
-		'valueOf'
-	];
-	shadowedProps.sort();
-	var shadowedObject = {};
-	for (var i = 0; i < shadowedProps.length; ++i) {
-		shadowedObject[shadowedProps[i]] = i;
-	}
-	var shadowedObjectKeys = keysShim(shadowedObject);
-	shadowedObjectKeys.sort();
-	t.deepEqual(shadowedObjectKeys, shadowedProps, 'troublesome shadowed properties are keys of object literals');
-	t.end();
-});
-
-test('host objects on `window` constructor.prototype equal to themselves', { skip: typeof window === 'undefined' }, function (t) {
-	var keys, exception;
-	var excludedKeys = {
-		$applicationCache: true,
-		$console: true,
-		$external: true,
-		$frame: true,
-		$frameElement: true,
-		$frames: true,
-		$innerHeight: true,
-		$innerWidth: true,
-		$onmozfullscreenchange: true,
-		$onmozfullscreenerror: true,
-		$outerHeight: true,
-		$outerWidth: true,
-		$pageXOffset: true,
-		$pageYOffset: true,
-		$parent: true,
-		$scrollLeft: true,
-		$scrollTop: true,
-		$scrollX: true,
-		$scrollY: true,
-		$self: true,
-		$webkitIndexedDB: true,
-		$webkitStorageInfo: true,
-		$window: true
-	};
-	for (var k in window) {
-		keys = undefined;
-		exception = undefined;
-		if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
-			try {
-				keys = keysShim(window[k]);
-			} catch (e) {
-				exception = e;
-			}
-			t.ok(is.array(keys), 'keys of window["' + k + '"] is an array');
-			t.equal(exception, undefined, 'there is no exception: window["' + k + '"]');
-		}
-	}
-	t.end();
-});
diff --git a/package.json b/package.json
index b520f7b..3e8b15f 100644
--- a/package.json
+++ b/package.json
@@ -1,21 +1,21 @@
 {
 	"name": "define-properties",
 	"version": "1.1.3",
-	"author": "Jordan Harband",
+	"author": "Jordan Harband <ljharb@gmail.com>",
+	"funding": {
+		"url": "https://github.com/sponsors/ljharb"
+	},
 	"description": "Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.",
 	"license": "MIT",
 	"main": "index.js",
 	"scripts": {
-		"pretest": "npm run --silent lint",
-		"test": "npm run --silent tests-only",
-		"posttest": "npm run --silent security",
-		"tests-only": "node test/index.js",
-		"coverage": "covert test/*.js",
-		"coverage-quiet": "covert test/*.js --quiet",
-		"lint": "npm run --silent jscs && npm run --silent eslint",
-		"jscs": "jscs test/*.js *.js",
-		"eslint": "eslint test/*.js *.js",
-		"security": "nsp check"
+		"prepublish": "not-in-publish || npm run prepublishOnly",
+		"prepublishOnly": "safe-publish-latest",
+		"pretest": "npm run lint",
+		"test": "npm run tests-only",
+		"posttest": "aud --production",
+		"tests-only": "nyc tape 'test/**/*.js'",
+		"lint": "eslint ."
 	},
 	"repository": {
 		"type": "git",
@@ -31,15 +31,15 @@
 		"ES5"
 	],
 	"dependencies": {
-		"object-keys": "^1.0.12"
+		"object-keys": "^1.1.1"
 	},
 	"devDependencies": {
-		"@ljharb/eslint-config": "^13.0.0",
-		"covert": "^1.1.0",
-		"eslint": "^5.3.0",
-		"jscs": "^3.0.7",
-		"nsp": "^3.2.1",
-		"tape": "^4.9.0"
+		"@ljharb/eslint-config": "^17.5.1",
+		"aud": "^1.1.4",
+		"eslint": "^7.24.0",
+		"nyc": "^10.3.2",
+		"safe-publish-latest": "^1.1.4",
+		"tape": "^5.2.2"
 	},
 	"testling": {
 		"files": "test/index.js",
diff --git a/test/.eslintrc b/test/.eslintrc
deleted file mode 100644
index b346207..0000000
--- a/test/.eslintrc
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-	"rules": {
-		"no-magic-numbers": 0,
-		"array-bracket-newline": 0,
-		"array-element-newline": 0,
-	}
-}
diff --git a/test/index.js b/test/index.js
deleted file mode 100644
index 3387f6b..0000000
--- a/test/index.js
+++ /dev/null
@@ -1,125 +0,0 @@
-'use strict';
-
-var define = require('../');
-var test = require('tape');
-var keys = require('object-keys');
-
-var arePropertyDescriptorsSupported = function () {
-	var obj = { a: 1 };
-	try {
-		Object.defineProperty(obj, 'x', { value: obj });
-		return obj.x === obj;
-	} catch (e) { /* this is IE 8. */
-		return false;
-	}
-};
-var descriptorsSupported = !!Object.defineProperty && arePropertyDescriptorsSupported();
-
-var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
-
-test('defineProperties', function (dt) {
-	dt.test('with descriptor support', { skip: !descriptorsSupported }, function (t) {
-		var getDescriptor = function (value) {
-			return {
-				configurable: true,
-				enumerable: false,
-				value: value,
-				writable: true
-			};
-		};
-
-		var obj = {
-			a: 1,
-			b: 2,
-			c: 3
-		};
-		t.deepEqual(keys(obj), ['a', 'b', 'c'], 'all literal-set keys start enumerable');
-		define(obj, {
-			b: 3,
-			c: 4,
-			d: 5
-		});
-		t.deepEqual(obj, {
-			a: 1,
-			b: 2,
-			c: 3
-		}, 'existing properties were not overridden');
-		t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'new property "d" was added and is not enumerable');
-		t.deepEqual(['a', 'b', 'c'], keys(obj), 'new keys are not enumerable');
-
-		define(obj, {
-			a: 2,
-			b: 3,
-			c: 4
-		}, {
-			a: function () { return true; },
-			b: function () { return false; }
-		});
-		t.deepEqual(obj, {
-			b: 2,
-			c: 3
-		}, 'properties only overriden when predicate exists and returns true');
-		t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'existing property "d" remained and is not enumerable');
-		t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'a'), getDescriptor(2), 'existing property "a" was overridden and is not enumerable');
-		t.deepEqual(['b', 'c'], keys(obj), 'overridden keys are not enumerable');
-
-		t.end();
-	});
-
-	dt.test('without descriptor support', { skip: descriptorsSupported }, function (t) {
-		var obj = {
-			a: 1,
-			b: 2,
-			c: 3
-		};
-		define(obj, {
-			b: 3,
-			c: 4,
-			d: 5
-		});
-		t.deepEqual(obj, {
-			a: 1,
-			b: 2,
-			c: 3,
-			d: 5
-		}, 'existing properties were not overridden, new properties were added');
-
-		define(obj, {
-			a: 2,
-			b: 3,
-			c: 4
-		}, {
-			a: function () { return true; },
-			b: function () { return false; }
-		});
-		t.deepEqual(obj, {
-			a: 2,
-			b: 2,
-			c: 3,
-			d: 5
-		}, 'properties only overriden when predicate exists and returns true');
-
-		t.end();
-	});
-
-	dt.end();
-});
-
-test('symbols', { skip: !hasSymbols }, function (t) {
-	var sym = Symbol('foo');
-	var obj = {};
-	var aValue = {};
-	var bValue = {};
-	var properties = { a: aValue };
-	properties[sym] = bValue;
-
-	define(obj, properties);
-
-	t.deepEqual(Object.keys(obj), [], 'object has no enumerable keys');
-	t.deepEqual(Object.getOwnPropertyNames(obj), ['a'], 'object has non-enumerable "a" key');
-	t.deepEqual(Object.getOwnPropertySymbols(obj), [sym], 'object has non-enumerable symbol key');
-	t.equal(obj.a, aValue, 'string keyed value is defined');
-	t.equal(obj[sym], bValue, 'symbol keyed value is defined');
-
-	t.end();
-});