aboutsummaryrefslogtreecommitdiffstats
path: root/backend/node_modules/object-inspect
diff options
context:
space:
mode:
Diffstat (limited to 'backend/node_modules/object-inspect')
-rw-r--r--backend/node_modules/object-inspect/.eslintrc53
-rw-r--r--backend/node_modules/object-inspect/.github/FUNDING.yml12
-rw-r--r--backend/node_modules/object-inspect/.nycrc13
-rw-r--r--backend/node_modules/object-inspect/CHANGELOG.md404
-rw-r--r--backend/node_modules/object-inspect/LICENSE21
-rw-r--r--backend/node_modules/object-inspect/example/all.js23
-rw-r--r--backend/node_modules/object-inspect/example/circular.js6
-rw-r--r--backend/node_modules/object-inspect/example/fn.js5
-rw-r--r--backend/node_modules/object-inspect/example/inspect.js10
-rw-r--r--backend/node_modules/object-inspect/index.js527
-rw-r--r--backend/node_modules/object-inspect/package-support.json20
-rw-r--r--backend/node_modules/object-inspect/package.json104
-rw-r--r--backend/node_modules/object-inspect/readme.markdown84
-rw-r--r--backend/node_modules/object-inspect/test-core-js.js26
-rw-r--r--backend/node_modules/object-inspect/test/bigint.js58
-rw-r--r--backend/node_modules/object-inspect/test/browser/dom.js15
-rw-r--r--backend/node_modules/object-inspect/test/circular.js16
-rw-r--r--backend/node_modules/object-inspect/test/deep.js12
-rw-r--r--backend/node_modules/object-inspect/test/element.js53
-rw-r--r--backend/node_modules/object-inspect/test/err.js48
-rw-r--r--backend/node_modules/object-inspect/test/fakes.js29
-rw-r--r--backend/node_modules/object-inspect/test/fn.js76
-rw-r--r--backend/node_modules/object-inspect/test/global.js17
-rw-r--r--backend/node_modules/object-inspect/test/has.js15
-rw-r--r--backend/node_modules/object-inspect/test/holes.js15
-rw-r--r--backend/node_modules/object-inspect/test/indent-option.js271
-rw-r--r--backend/node_modules/object-inspect/test/inspect.js139
-rw-r--r--backend/node_modules/object-inspect/test/lowbyte.js12
-rw-r--r--backend/node_modules/object-inspect/test/number.js58
-rw-r--r--backend/node_modules/object-inspect/test/quoteStyle.js17
-rw-r--r--backend/node_modules/object-inspect/test/toStringTag.js40
-rw-r--r--backend/node_modules/object-inspect/test/undef.js12
-rw-r--r--backend/node_modules/object-inspect/test/values.js211
-rw-r--r--backend/node_modules/object-inspect/util.inspect.js1
34 files changed, 2423 insertions, 0 deletions
diff --git a/backend/node_modules/object-inspect/.eslintrc b/backend/node_modules/object-inspect/.eslintrc
new file mode 100644
index 0000000..21f9039
--- /dev/null
+++ b/backend/node_modules/object-inspect/.eslintrc
@@ -0,0 +1,53 @@
+{
+ "root": true,
+ "extends": "@ljharb",
+ "rules": {
+ "complexity": 0,
+ "func-style": [2, "declaration"],
+ "indent": [2, 4],
+ "max-lines": 1,
+ "max-lines-per-function": 1,
+ "max-params": [2, 4],
+ "max-statements": 0,
+ "max-statements-per-line": [2, { "max": 2 }],
+ "no-magic-numbers": 0,
+ "no-param-reassign": 1,
+ "strict": 0, // TODO
+ },
+ "overrides": [
+ {
+ "files": ["test/**", "test-*", "example/**"],
+ "extends": "@ljharb/eslint-config/tests",
+ "rules": {
+ "id-length": 0,
+ },
+ },
+ {
+ "files": ["example/**"],
+ "rules": {
+ "no-console": 0,
+ },
+ },
+ {
+ "files": ["test/browser/**"],
+ "env": {
+ "browser": true,
+ },
+ },
+ {
+ "files": ["test/bigint*"],
+ "rules": {
+ "new-cap": [2, { "capIsNewExceptions": ["BigInt"] }],
+ },
+ },
+ {
+ "files": "index.js",
+ "globals": {
+ "HTMLElement": false,
+ },
+ "rules": {
+ "no-use-before-define": 1,
+ },
+ },
+ ],
+}
diff --git a/backend/node_modules/object-inspect/.github/FUNDING.yml b/backend/node_modules/object-inspect/.github/FUNDING.yml
new file mode 100644
index 0000000..730276b
--- /dev/null
+++ b/backend/node_modules/object-inspect/.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/object-inspect
+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/backend/node_modules/object-inspect/.nycrc b/backend/node_modules/object-inspect/.nycrc
new file mode 100644
index 0000000..58a5db7
--- /dev/null
+++ b/backend/node_modules/object-inspect/.nycrc
@@ -0,0 +1,13 @@
+{
+ "all": true,
+ "check-coverage": false,
+ "instrumentation": false,
+ "sourceMap": false,
+ "reporter": ["text-summary", "text", "html", "json"],
+ "exclude": [
+ "coverage",
+ "example",
+ "test",
+ "test-core-js.js"
+ ]
+}
diff --git a/backend/node_modules/object-inspect/CHANGELOG.md b/backend/node_modules/object-inspect/CHANGELOG.md
new file mode 100644
index 0000000..056fbcc
--- /dev/null
+++ b/backend/node_modules/object-inspect/CHANGELOG.md
@@ -0,0 +1,404 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [v1.13.2](https://github.com/inspect-js/object-inspect/compare/v1.13.1...v1.13.2) - 2024-06-21
+
+### Commits
+
+- [readme] update badges [`8a51e6b`](https://github.com/inspect-js/object-inspect/commit/8a51e6bedaf389ec40cc4659e9df53e8543d176e)
+- [Dev Deps] update `@ljharb/eslint-config`, `tape` [`ef05f58`](https://github.com/inspect-js/object-inspect/commit/ef05f58c9761a41416ab907299bf0fa79517014b)
+- [Dev Deps] update `error-cause`, `has-tostringtag`, `tape` [`c0c6c26`](https://github.com/inspect-js/object-inspect/commit/c0c6c26c44cee6671f7c5d43d2b91d27c5c00d90)
+- [Fix] Don't throw when `global` is not defined [`d4d0965`](https://github.com/inspect-js/object-inspect/commit/d4d096570f7dbd0e03266a96de11d05eb7b63e0f)
+- [meta] add missing `engines.node` [`17a352a`](https://github.com/inspect-js/object-inspect/commit/17a352af6fe1ba6b70a19081674231eb1a50c940)
+- [Dev Deps] update `globalthis` [`9c08884`](https://github.com/inspect-js/object-inspect/commit/9c08884aa662a149e2f11403f413927736b97da7)
+- [Dev Deps] update `error-cause` [`6af352d`](https://github.com/inspect-js/object-inspect/commit/6af352d7c3929a4cc4c55768c27bf547a5e900f4)
+- [Dev Deps] update `npmignore` [`94e617d`](https://github.com/inspect-js/object-inspect/commit/94e617d38831722562fa73dff4c895746861d267)
+- [Dev Deps] update `mock-property` [`2ac24d7`](https://github.com/inspect-js/object-inspect/commit/2ac24d7e58cd388ad093c33249e413e05bbfd6c3)
+- [Dev Deps] update `tape` [`46125e5`](https://github.com/inspect-js/object-inspect/commit/46125e58f1d1dcfb170ed3d1ea69da550ea8d77b)
+
+## [v1.13.1](https://github.com/inspect-js/object-inspect/compare/v1.13.0...v1.13.1) - 2023-10-19
+
+### Commits
+
+- [Fix] in IE 8, global can !== window despite them being prototypes of each other [`30d0859`](https://github.com/inspect-js/object-inspect/commit/30d0859dc4606cf75c2410edcd5d5c6355f8d372)
+
+## [v1.13.0](https://github.com/inspect-js/object-inspect/compare/v1.12.3...v1.13.0) - 2023-10-14
+
+### Commits
+
+- [New] add special handling for the global object [`431bab2`](https://github.com/inspect-js/object-inspect/commit/431bab21a490ee51d35395966a504501e8c685da)
+- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape` [`fd4f619`](https://github.com/inspect-js/object-inspect/commit/fd4f6193562b4b0e95dcf5c0201b4e8cbbc4f58d)
+- [Dev Deps] update `mock-property`, `tape` [`b453f6c`](https://github.com/inspect-js/object-inspect/commit/b453f6ceeebf8a1b738a1029754092e0367a4134)
+- [Dev Deps] update `error-cause` [`e8ffc57`](https://github.com/inspect-js/object-inspect/commit/e8ffc577d73b92bb6a4b00c44f14e3319e374888)
+- [Dev Deps] update `tape` [`054b8b9`](https://github.com/inspect-js/object-inspect/commit/054b8b9b98633284cf989e582450ebfbbe53503c)
+- [Dev Deps] temporarily remove `aud` due to breaking change in transitive deps [`2476845`](https://github.com/inspect-js/object-inspect/commit/2476845e0678dd290c541c81cd3dec8420782c52)
+- [Dev Deps] pin `glob`, since v10.3.8+ requires a broken `jackspeak` [`383fa5e`](https://github.com/inspect-js/object-inspect/commit/383fa5eebc0afd705cc778a4b49d8e26452e49a8)
+- [Dev Deps] pin `jackspeak` since 2.1.2+ depends on npm aliases, which kill the install process in npm < 6 [`68c244c`](https://github.com/inspect-js/object-inspect/commit/68c244c5174cdd877e5dcb8ee90aa3f44b2f25be)
+
+## [v1.12.3](https://github.com/inspect-js/object-inspect/compare/v1.12.2...v1.12.3) - 2023-01-12
+
+### Commits
+
+- [Fix] in eg FF 24, collections lack forEach [`75fc226`](https://github.com/inspect-js/object-inspect/commit/75fc22673c82d45f28322b1946bb0eb41b672b7f)
+- [actions] update rebase action to use reusable workflow [`250a277`](https://github.com/inspect-js/object-inspect/commit/250a277a095e9dacc029ab8454dcfc15de549dcd)
+- [Dev Deps] update `aud`, `es-value-fixtures`, `tape` [`66a19b3`](https://github.com/inspect-js/object-inspect/commit/66a19b3209ccc3c5ef4b34c3cb0160e65d1ce9d5)
+- [Dev Deps] update `@ljharb/eslint-config`, `aud`, `error-cause` [`c43d332`](https://github.com/inspect-js/object-inspect/commit/c43d3324b48384a16fd3dc444e5fc589d785bef3)
+- [Tests] add `@pkgjs/support` to `postlint` [`e2618d2`](https://github.com/inspect-js/object-inspect/commit/e2618d22a7a3fa361b6629b53c1752fddc9c4d80)
+
+## [v1.12.2](https://github.com/inspect-js/object-inspect/compare/v1.12.1...v1.12.2) - 2022-05-26
+
+### Commits
+
+- [Fix] use `util.inspect` for a custom inspection symbol method [`e243bf2`](https://github.com/inspect-js/object-inspect/commit/e243bf2eda6c4403ac6f1146fddb14d12e9646c1)
+- [meta] add support info [`ca20ba3`](https://github.com/inspect-js/object-inspect/commit/ca20ba35713c17068ca912a86c542f5e8acb656c)
+- [Fix] ignore `cause` in node v16.9 and v16.10 where it has a bug [`86aa553`](https://github.com/inspect-js/object-inspect/commit/86aa553a4a455562c2c56f1540f0bf857b9d314b)
+
+## [v1.12.1](https://github.com/inspect-js/object-inspect/compare/v1.12.0...v1.12.1) - 2022-05-21
+
+### Commits
+
+- [Tests] use `mock-property` [`4ec8893`](https://github.com/inspect-js/object-inspect/commit/4ec8893ea9bfd28065ca3638cf6762424bf44352)
+- [meta] use `npmignore` to autogenerate an npmignore file [`07f868c`](https://github.com/inspect-js/object-inspect/commit/07f868c10bd25a9d18686528339bb749c211fc9a)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape` [`b05244b`](https://github.com/inspect-js/object-inspect/commit/b05244b4f331e00c43b3151bc498041be77ccc91)
+- [Dev Deps] update `@ljharb/eslint-config`, `error-cause`, `es-value-fixtures`, `functions-have-names`, `tape` [`d037398`](https://github.com/inspect-js/object-inspect/commit/d037398dcc5d531532e4c19c4a711ed677f579c1)
+- [Fix] properly handle callable regexes in older engines [`848fe48`](https://github.com/inspect-js/object-inspect/commit/848fe48bd6dd0064ba781ee6f3c5e54a94144c37)
+
+## [v1.12.0](https://github.com/inspect-js/object-inspect/compare/v1.11.1...v1.12.0) - 2021-12-18
+
+### Commits
+
+- [New] add `numericSeparator` boolean option [`2d2d537`](https://github.com/inspect-js/object-inspect/commit/2d2d537f5359a4300ce1c10241369f8024f89e11)
+- [Robustness] cache more prototype methods [`191533d`](https://github.com/inspect-js/object-inspect/commit/191533da8aec98a05eadd73a5a6e979c9c8653e8)
+- [New] ensure an Error’s `cause` is displayed [`53bc2ce`](https://github.com/inspect-js/object-inspect/commit/53bc2cee4e5a9cc4986f3cafa22c0685f340715e)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config` [`bc164b6`](https://github.com/inspect-js/object-inspect/commit/bc164b6e2e7d36b263970f16f54de63048b84a36)
+- [Robustness] cache `RegExp.prototype.test` [`a314ab8`](https://github.com/inspect-js/object-inspect/commit/a314ab8271b905cbabc594c82914d2485a8daf12)
+- [meta] fix auto-changelog settings [`5ed0983`](https://github.com/inspect-js/object-inspect/commit/5ed0983be72f73e32e2559997517a95525c7e20d)
+
+## [v1.11.1](https://github.com/inspect-js/object-inspect/compare/v1.11.0...v1.11.1) - 2021-12-05
+
+### Commits
+
+- [meta] add `auto-changelog` [`7dbdd22`](https://github.com/inspect-js/object-inspect/commit/7dbdd228401d6025d8b7391476d88aee9ea9bbdf)
+- [actions] reuse common workflows [`c8823bc`](https://github.com/inspect-js/object-inspect/commit/c8823bc0a8790729680709d45fb6e652432e91aa)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape` [`7532b12`](https://github.com/inspect-js/object-inspect/commit/7532b120598307497b712890f75af8056f6d37a6)
+- [Refactor] use `has-tostringtag` to behave correctly in the presence of symbol shams [`94abb5d`](https://github.com/inspect-js/object-inspect/commit/94abb5d4e745bf33253942dea86b3e538d2ff6c6)
+- [actions] update codecov uploader [`5ed5102`](https://github.com/inspect-js/object-inspect/commit/5ed51025267a00e53b1341357315490ac4eb0874)
+- [Dev Deps] update `eslint`, `tape` [`37b2ad2`](https://github.com/inspect-js/object-inspect/commit/37b2ad26c08d94bfd01d5d07069a0b28ef4e2ad7)
+- [meta] add `sideEffects` flag [`d341f90`](https://github.com/inspect-js/object-inspect/commit/d341f905ef8bffa6a694cda6ddc5ba343532cd4f)
+
+## [v1.11.0](https://github.com/inspect-js/object-inspect/compare/v1.10.3...v1.11.0) - 2021-07-12
+
+### Commits
+
+- [New] `customInspect`: add `symbol` option, to mimic modern util.inspect behavior [`e973a6e`](https://github.com/inspect-js/object-inspect/commit/e973a6e21f8140c5837cf25e9d89bdde88dc3120)
+- [Dev Deps] update `eslint` [`05f1cb3`](https://github.com/inspect-js/object-inspect/commit/05f1cb3cbcfe1f238e8b51cf9bc294305b7ed793)
+
+## [v1.10.3](https://github.com/inspect-js/object-inspect/compare/v1.10.2...v1.10.3) - 2021-05-07
+
+### Commits
+
+- [Fix] handle core-js Symbol shams [`4acfc2c`](https://github.com/inspect-js/object-inspect/commit/4acfc2c4b503498759120eb517abad6d51c9c5d6)
+- [readme] update badges [`95c323a`](https://github.com/inspect-js/object-inspect/commit/95c323ad909d6cbabb95dd6015c190ba6db9c1f2)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud` [`cb38f48`](https://github.com/inspect-js/object-inspect/commit/cb38f485de6ec7a95109b5a9bbd0a1deba2f6611)
+
+## [v1.10.2](https://github.com/inspect-js/object-inspect/compare/v1.10.1...v1.10.2) - 2021-04-17
+
+### Commits
+
+- [Fix] use a robust check for a boxed Symbol [`87f12d6`](https://github.com/inspect-js/object-inspect/commit/87f12d6e69ce530be04659c81a4cd502943acac5)
+
+## [v1.10.1](https://github.com/inspect-js/object-inspect/compare/v1.10.0...v1.10.1) - 2021-04-17
+
+### Commits
+
+- [Fix] use a robust check for a boxed bigint [`d5ca829`](https://github.com/inspect-js/object-inspect/commit/d5ca8298b6d2e5c7b9334a5b21b96ed95d225c91)
+
+## [v1.10.0](https://github.com/inspect-js/object-inspect/compare/v1.9.0...v1.10.0) - 2021-04-17
+
+### Commits
+
+- [Tests] increase coverage [`d8abb8a`](https://github.com/inspect-js/object-inspect/commit/d8abb8a62c2f084919df994a433b346e0d87a227)
+- [actions] use `node/install` instead of `node/run`; use `codecov` action [`4bfec2e`](https://github.com/inspect-js/object-inspect/commit/4bfec2e30aaef6ddef6cbb1448306f9f8b9520b7)
+- [New] respect `Symbol.toStringTag` on objects [`799b58f`](https://github.com/inspect-js/object-inspect/commit/799b58f536a45e4484633a8e9daeb0330835f175)
+- [Fix] do not allow Symbol.toStringTag to masquerade as builtins [`d6c5b37`](https://github.com/inspect-js/object-inspect/commit/d6c5b37d7e94427796b82432fb0c8964f033a6ab)
+- [New] add `WeakRef` support [`b6d898e`](https://github.com/inspect-js/object-inspect/commit/b6d898ee21868c780a7ee66b28532b5b34ed7f09)
+- [meta] do not publish github action workflow files [`918cdfc`](https://github.com/inspect-js/object-inspect/commit/918cdfc4b6fe83f559ff6ef04fe66201e3ff5cbd)
+- [meta] create `FUNDING.yml` [`0bb5fc5`](https://github.com/inspect-js/object-inspect/commit/0bb5fc516dbcd2cd728bd89cee0b580acc5ce301)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape` [`22c8dc0`](https://github.com/inspect-js/object-inspect/commit/22c8dc0cac113d70f4781e49a950070923a671be)
+- [meta] use `prepublishOnly` script for npm 7+ [`e52ee09`](https://github.com/inspect-js/object-inspect/commit/e52ee09e8050b8dbac94ef57f786675567728223)
+- [Dev Deps] update `eslint` [`7c4e6fd`](https://github.com/inspect-js/object-inspect/commit/7c4e6fdedcd27cc980e13c9ad834d05a96f3d40c)
+
+## [v1.9.0](https://github.com/inspect-js/object-inspect/compare/v1.8.0...v1.9.0) - 2020-11-30
+
+### Commits
+
+- [Tests] migrate tests to Github Actions [`d262251`](https://github.com/inspect-js/object-inspect/commit/d262251e13e16d3490b5473672f6b6d6ff86675d)
+- [New] add enumerable own Symbols to plain object output [`ee60c03`](https://github.com/inspect-js/object-inspect/commit/ee60c033088cff9d33baa71e59a362a541b48284)
+- [Tests] add passing tests [`01ac3e4`](https://github.com/inspect-js/object-inspect/commit/01ac3e4b5a30f97875a63dc9b1416b3bd626afc9)
+- [actions] add "Require Allow Edits" action [`c2d7746`](https://github.com/inspect-js/object-inspect/commit/c2d774680cde4ca4af332d84d4121b26f798ba9e)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `core-js` [`70058de`](https://github.com/inspect-js/object-inspect/commit/70058de1579fc54d1d15ed6c2dbe246637ce70ff)
+- [Fix] hex characters in strings should be uppercased, to match node `assert` [`6ab8faa`](https://github.com/inspect-js/object-inspect/commit/6ab8faaa0abc08fe7a8e2afd8b39c6f1f0e00113)
+- [Tests] run `nyc` on all tests [`4c47372`](https://github.com/inspect-js/object-inspect/commit/4c473727879ddc8e28b599202551ddaaf07b6210)
+- [Tests] node 0.8 has an unpredictable property order; fix `groups` test by removing property [`f192069`](https://github.com/inspect-js/object-inspect/commit/f192069a978a3b60e6f0e0d45ac7df260ab9a778)
+- [New] add enumerable properties to Function inspect result, per node’s `assert` [`fd38e1b`](https://github.com/inspect-js/object-inspect/commit/fd38e1bc3e2a1dc82091ce3e021917462eee64fc)
+- [Tests] fix tests for node < 10, due to regex match `groups` [`2ac6462`](https://github.com/inspect-js/object-inspect/commit/2ac6462cc4f72eaa0b63a8cfee9aabe3008b2330)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config` [`44b59e2`](https://github.com/inspect-js/object-inspect/commit/44b59e2676a7f825ef530dfd19dafb599e3b9456)
+- [Robustness] cache `Symbol.prototype.toString` [`f3c2074`](https://github.com/inspect-js/object-inspect/commit/f3c2074d8f32faf8292587c07c9678ea931703dd)
+- [Dev Deps] update `eslint` [`9411294`](https://github.com/inspect-js/object-inspect/commit/94112944b9245e3302e25453277876402d207e7f)
+- [meta] `require-allow-edits` no longer requires an explicit github token [`36c0220`](https://github.com/inspect-js/object-inspect/commit/36c02205de3c2b0e84d53777c5c9fd54a36c48ab)
+- [actions] update rebase checkout action to v2 [`55a39a6`](https://github.com/inspect-js/object-inspect/commit/55a39a64e944f19c6a7d8efddf3df27700f20d14)
+- [actions] switch Automatic Rebase workflow to `pull_request_target` event [`f59fd3c`](https://github.com/inspect-js/object-inspect/commit/f59fd3cf406c3a7c7ece140904a80bbc6bacfcca)
+- [Dev Deps] update `eslint` [`a492bec`](https://github.com/inspect-js/object-inspect/commit/a492becec644b0155c9c4bc1caf6f9fac11fb2c7)
+
+## [v1.8.0](https://github.com/inspect-js/object-inspect/compare/v1.7.0...v1.8.0) - 2020-06-18
+
+### Fixed
+
+- [New] add `indent` option [`#27`](https://github.com/inspect-js/object-inspect/issues/27)
+
+### Commits
+
+- [Tests] add codecov [`4324cbb`](https://github.com/inspect-js/object-inspect/commit/4324cbb1a2bd7710822a4151ff373570db22453e)
+- [New] add `maxStringLength` option [`b3995cb`](https://github.com/inspect-js/object-inspect/commit/b3995cb71e15b5ee127a3094c43994df9d973502)
+- [New] add `customInspect` option, to disable custom inspect methods [`28b9179`](https://github.com/inspect-js/object-inspect/commit/28b9179ee802bb3b90810100c11637db90c2fb6d)
+- [Tests] add Date and RegExp tests [`3b28eca`](https://github.com/inspect-js/object-inspect/commit/3b28eca57b0367aeadffac604ea09e8bdae7d97b)
+- [actions] add automatic rebasing / merge commit blocking [`0d9c6c0`](https://github.com/inspect-js/object-inspect/commit/0d9c6c044e83475ff0bfffb9d35b149834c83a2e)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `core-js`, `tape`; add `aud` [`7c204f2`](https://github.com/inspect-js/object-inspect/commit/7c204f22b9e41bc97147f4d32d4cb045b17769a6)
+- [readme] fix repo URLs, remove testling [`34ca9a0`](https://github.com/inspect-js/object-inspect/commit/34ca9a0dabfe75bd311f806a326fadad029909a3)
+- [Fix] when truncating a deep array, note it as `[Array]` instead of just `[Object]` [`f74c82d`](https://github.com/inspect-js/object-inspect/commit/f74c82dd0b35386445510deb250f34c41be3ec0e)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape` [`1a8a5ea`](https://github.com/inspect-js/object-inspect/commit/1a8a5ea069ea2bee89d77caedad83ffa23d35711)
+- [Fix] do not be fooled by a function’s own `toString` method [`7cb5c65`](https://github.com/inspect-js/object-inspect/commit/7cb5c657a976f94715c19c10556a30f15bb7d5d7)
+- [patch] indicate explicitly that anon functions are anonymous, to match node [`81ebdd4`](https://github.com/inspect-js/object-inspect/commit/81ebdd4215005144074bbdff3f6bafa01407910a)
+- [Dev Deps] loosen the `core-js` dep [`e7472e8`](https://github.com/inspect-js/object-inspect/commit/e7472e8e242117670560bd995830c2a4d12080f5)
+- [Dev Deps] update `tape` [`699827e`](https://github.com/inspect-js/object-inspect/commit/699827e6b37258b5203c33c78c009bf4b0e6a66d)
+- [meta] add `safe-publish-latest` [`c5d2868`](https://github.com/inspect-js/object-inspect/commit/c5d2868d6eb33c472f37a20f89ceef2787046088)
+- [Dev Deps] update `@ljharb/eslint-config` [`9199501`](https://github.com/inspect-js/object-inspect/commit/919950195d486114ccebacbdf9d74d7f382693b0)
+
+## [v1.7.0](https://github.com/inspect-js/object-inspect/compare/v1.6.0...v1.7.0) - 2019-11-10
+
+### Commits
+
+- [Tests] use shared travis-ci configs [`19899ed`](https://github.com/inspect-js/object-inspect/commit/19899edbf31f4f8809acf745ce34ad1ce1bfa63b)
+- [Tests] add linting [`a00f057`](https://github.com/inspect-js/object-inspect/commit/a00f057d917f66ea26dd37769c6b810ec4af97e8)
+- [Tests] lint last file [`2698047`](https://github.com/inspect-js/object-inspect/commit/2698047b58af1e2e88061598ef37a75f228dddf6)
+- [Tests] up to `node` `v12.7`, `v11.15`, `v10.16`, `v8.16`, `v6.17` [`589e87a`](https://github.com/inspect-js/object-inspect/commit/589e87a99cadcff4b600e6a303418e9d922836e8)
+- [New] add support for `WeakMap` and `WeakSet` [`3ddb3e4`](https://github.com/inspect-js/object-inspect/commit/3ddb3e4e0c8287130c61a12e0ed9c104b1549306)
+- [meta] clean up license so github can detect it properly [`27527bb`](https://github.com/inspect-js/object-inspect/commit/27527bb801520c9610c68cc3b55d6f20a2bee56d)
+- [Tests] cover `util.inspect.custom` [`36d47b9`](https://github.com/inspect-js/object-inspect/commit/36d47b9c59056a57ef2f1491602c726359561800)
+- [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `core-js`, `tape` [`b614eaa`](https://github.com/inspect-js/object-inspect/commit/b614eaac901da0e5c69151f534671f990a94cace)
+- [Tests] fix coverage thresholds [`7b7b176`](https://github.com/inspect-js/object-inspect/commit/7b7b176e15f8bd6e8b2f261ff5a493c2fe78d9c2)
+- [Tests] bigint tests now can run on unflagged node [`063af31`](https://github.com/inspect-js/object-inspect/commit/063af31ce9cd13c202e3b67c07ba06dc9b7c0f81)
+- [Refactor] add early bailout to `isMap` and `isSet` checks [`fc51047`](https://github.com/inspect-js/object-inspect/commit/fc5104714a3671d37e225813db79470d6335683b)
+- [meta] add `funding` field [`7f9953a`](https://github.com/inspect-js/object-inspect/commit/7f9953a113eec7b064a6393cf9f90ba15f1d131b)
+- [Tests] Fix invalid strict-mode syntax with hexadecimal [`a8b5425`](https://github.com/inspect-js/object-inspect/commit/a8b542503b4af1599a275209a1a99f5fdedb1ead)
+- [Dev Deps] update `@ljharb/eslint-config` [`98df157`](https://github.com/inspect-js/object-inspect/commit/98df1577314d9188a3fc3f17fdcf2fba697ae1bd)
+- add copyright to LICENSE [`bb69fd0`](https://github.com/inspect-js/object-inspect/commit/bb69fd017a062d299e44da1f9b2c7dcd67f621e6)
+- [Tests] use `npx aud` in `posttest` [`4838353`](https://github.com/inspect-js/object-inspect/commit/4838353593974cf7f905b9ef04c03c094f0cdbe2)
+- [Tests] move `0.6` to allowed failures, because it won‘t build on travis [`1bff32a`](https://github.com/inspect-js/object-inspect/commit/1bff32aa52e8aea687f0856b28ba754b3e43ebf7)
+
+## [v1.6.0](https://github.com/inspect-js/object-inspect/compare/v1.5.0...v1.6.0) - 2018-05-02
+
+### Commits
+
+- [New] add support for boxed BigInt primitives [`356c66a`](https://github.com/inspect-js/object-inspect/commit/356c66a410e7aece7162c8319880a5ef647beaa9)
+- [Tests] up to `node` `v10.0`, `v9.11`, `v8.11`, `v6.14`, `v4.9` [`c77b65b`](https://github.com/inspect-js/object-inspect/commit/c77b65bba593811b906b9ec57561c5cba92e2db3)
+- [New] Add support for upcoming `BigInt` [`1ac548e`](https://github.com/inspect-js/object-inspect/commit/1ac548e4b27e26466c28c9a5e63e5d4e0591c31f)
+- [Tests] run bigint tests in CI with --harmony-bigint flag [`d31b738`](https://github.com/inspect-js/object-inspect/commit/d31b73831880254b5c6cf5691cda9a149fbc5f04)
+- [Dev Deps] update `core-js`, `tape` [`ff9eff6`](https://github.com/inspect-js/object-inspect/commit/ff9eff67113341ee1aaf80c1c22d683f43bfbccf)
+- [Docs] fix example to use `safer-buffer` [`48cae12`](https://github.com/inspect-js/object-inspect/commit/48cae12a73ec6cacc955175bc56bbe6aee6a211f)
+
+## [v1.5.0](https://github.com/inspect-js/object-inspect/compare/v1.4.1...v1.5.0) - 2017-12-25
+
+### Commits
+
+- [New] add `quoteStyle` option [`f5a72d2`](https://github.com/inspect-js/object-inspect/commit/f5a72d26edb3959b048f74c056ca7100a6b091e4)
+- [Tests] add more test coverage [`30ebe4e`](https://github.com/inspect-js/object-inspect/commit/30ebe4e1fa943b99ecbb85be7614256d536e2759)
+- [Tests] require 0.6 to pass [`99a008c`](https://github.com/inspect-js/object-inspect/commit/99a008ccace189a60fd7da18bf00e32c9572b980)
+
+## [v1.4.1](https://github.com/inspect-js/object-inspect/compare/v1.4.0...v1.4.1) - 2017-12-19
+
+### Commits
+
+- [Tests] up to `node` `v9.3`, `v8.9`, `v6.12` [`6674476`](https://github.com/inspect-js/object-inspect/commit/6674476cc56acaac1bde96c84fed5ef631911906)
+- [Fix] `inspect(Object(-0))` should be “Object(-0)”, not “Object(0)” [`d0a031f`](https://github.com/inspect-js/object-inspect/commit/d0a031f1cbb3024ee9982bfe364dd18a7e4d1bd3)
+
+## [v1.4.0](https://github.com/inspect-js/object-inspect/compare/v1.3.0...v1.4.0) - 2017-10-24
+
+### Commits
+
+- [Tests] add `npm run coverage` [`3b48fb2`](https://github.com/inspect-js/object-inspect/commit/3b48fb25db037235eeb808f0b2830aad7aa36f70)
+- [Tests] remove commented-out osx builds [`71e24db`](https://github.com/inspect-js/object-inspect/commit/71e24db8ad6ee3b9b381c5300b0475f2ba595a73)
+- [New] add support for `util.inspect.custom`, in node only. [`20cca77`](https://github.com/inspect-js/object-inspect/commit/20cca7762d7e17f15b21a90793dff84acce155df)
+- [Tests] up to `node` `v8.6`; use `nvm install-latest-npm` to ensure new npm doesn’t break old node [`252952d`](https://github.com/inspect-js/object-inspect/commit/252952d230d8065851dd3d4d5fe8398aae068529)
+- [Tests] up to `node` `v8.8` [`4aa868d`](https://github.com/inspect-js/object-inspect/commit/4aa868d3a62914091d489dd6ec6eed194ee67cd3)
+- [Dev Deps] update `core-js`, `tape` [`59483d1`](https://github.com/inspect-js/object-inspect/commit/59483d1df418f852f51fa0db7b24aa6b0209a27a)
+
+## [v1.3.0](https://github.com/inspect-js/object-inspect/compare/v1.2.2...v1.3.0) - 2017-07-31
+
+### Fixed
+
+- [Fix] Map/Set: work around core-js bug < v2.5.0 [`#9`](https://github.com/inspect-js/object-inspect/issues/9)
+
+### Commits
+
+- [New] add support for arrays with additional object keys [`0d19937`](https://github.com/inspect-js/object-inspect/commit/0d199374ee37959e51539616666f420ccb29acb9)
+- [Tests] up to `node` `v8.2`, `v7.10`, `v6.11`; fix new npm breaking on older nodes [`e24784a`](https://github.com/inspect-js/object-inspect/commit/e24784a90c49117787157a12a63897c49cf89bbb)
+- Only apps should have lockfiles [`c6faebc`](https://github.com/inspect-js/object-inspect/commit/c6faebcb2ee486a889a4a1c4d78c0776c7576185)
+- [Dev Deps] update `tape` [`7345a0a`](https://github.com/inspect-js/object-inspect/commit/7345a0aeba7e91b888a079c10004d17696a7f586)
+
+## [v1.2.2](https://github.com/inspect-js/object-inspect/compare/v1.2.1...v1.2.2) - 2017-03-24
+
+### Commits
+
+- [Tests] up to `node` `v7.7`, `v6.10`, `v4.8`; improve test matrix [`a2ddc15`](https://github.com/inspect-js/object-inspect/commit/a2ddc15a1f2c65af18076eea1c0eb9cbceb478a0)
+- [Tests] up to `node` `v7.0`, `v6.9`, `v5.12`, `v4.6`, `io.js` `v3.3`; improve test matrix [`a48949f`](https://github.com/inspect-js/object-inspect/commit/a48949f6b574b2d4d2298109d8e8d0eb3e7a83e7)
+- [Performance] check for primitive types as early as possible. [`3b8092a`](https://github.com/inspect-js/object-inspect/commit/3b8092a2a4deffd0575f94334f00194e2d48dad3)
+- [Refactor] remove unneeded `else`s. [`7255034`](https://github.com/inspect-js/object-inspect/commit/725503402e08de4f96f6bf2d8edef44ac36f26b6)
+- [Refactor] avoid recreating `lowbyte` function every time. [`81edd34`](https://github.com/inspect-js/object-inspect/commit/81edd3475bd15bdd18e84de7472033dcf5004aaa)
+- [Fix] differentiate -0 from 0 [`521d345`](https://github.com/inspect-js/object-inspect/commit/521d3456b009da7bf1c5785c8a9df5a9f8718264)
+- [Refactor] move object key gathering into separate function [`aca6265`](https://github.com/inspect-js/object-inspect/commit/aca626536eaeef697196c6e9db3e90e7e0355b6a)
+- [Refactor] consolidate wrapping logic for boxed primitives into a function. [`4e440cd`](https://github.com/inspect-js/object-inspect/commit/4e440cd9065df04802a2a1dead03f48c353ca301)
+- [Robustness] use `typeof` instead of comparing to literal `undefined` [`5ca6f60`](https://github.com/inspect-js/object-inspect/commit/5ca6f601937506daff8ed2fcf686363b55807b69)
+- [Refactor] consolidate Map/Set notations. [`4e576e5`](https://github.com/inspect-js/object-inspect/commit/4e576e5d7ed2f9ec3fb7f37a0d16732eb10758a9)
+- [Tests] ensure that this function remains anonymous, despite ES6 name inference. [`7540ae5`](https://github.com/inspect-js/object-inspect/commit/7540ae591278756db614fa4def55ca413150e1a3)
+- [Refactor] explicitly coerce Error objects to strings. [`7f4ca84`](https://github.com/inspect-js/object-inspect/commit/7f4ca8424ee8dc2c0ca5a422d94f7fac40327261)
+- [Refactor] split up `var` declarations for debuggability [`6f2c11e`](https://github.com/inspect-js/object-inspect/commit/6f2c11e6a85418586a00292dcec5e97683f89bc3)
+- [Robustness] cache `Object.prototype.toString` [`df44a20`](https://github.com/inspect-js/object-inspect/commit/df44a20adfccf31529d60d1df2079bfc3c836e27)
+- [Dev Deps] update `tape` [`3ec714e`](https://github.com/inspect-js/object-inspect/commit/3ec714eba57bc3f58a6eb4fca1376f49e70d300a)
+- [Dev Deps] update `tape` [`beb72d9`](https://github.com/inspect-js/object-inspect/commit/beb72d969653747d7cde300393c28755375329b0)
+
+## [v1.2.1](https://github.com/inspect-js/object-inspect/compare/v1.2.0...v1.2.1) - 2016-04-09
+
+### Fixed
+
+- [Fix] fix Boolean `false` object inspection. [`#7`](https://github.com/substack/object-inspect/pull/7)
+
+## [v1.2.0](https://github.com/inspect-js/object-inspect/compare/v1.1.0...v1.2.0) - 2016-04-09
+
+### Fixed
+
+- [New] add support for inspecting String/Number/Boolean objects. [`#6`](https://github.com/inspect-js/object-inspect/issues/6)
+
+### Commits
+
+- [Dev Deps] update `tape` [`742caa2`](https://github.com/inspect-js/object-inspect/commit/742caa262cf7af4c815d4821c8bd0129c1446432)
+
+## [v1.1.0](https://github.com/inspect-js/object-inspect/compare/1.0.2...v1.1.0) - 2015-12-14
+
+### Merged
+
+- [New] add ES6 Map/Set support. [`#4`](https://github.com/inspect-js/object-inspect/pull/4)
+
+### Fixed
+
+- [New] add ES6 Map/Set support. [`#3`](https://github.com/inspect-js/object-inspect/issues/3)
+
+### Commits
+
+- Update `travis.yml` to test on bunches of `iojs` and `node` versions. [`4c1fd65`](https://github.com/inspect-js/object-inspect/commit/4c1fd65cc3bd95307e854d114b90478324287fd2)
+- [Dev Deps] update `tape` [`88a907e`](https://github.com/inspect-js/object-inspect/commit/88a907e33afbe408e4b5d6e4e42a33143f88848c)
+
+## [1.0.2](https://github.com/inspect-js/object-inspect/compare/1.0.1...1.0.2) - 2015-08-07
+
+### Commits
+
+- [Fix] Cache `Object.prototype.hasOwnProperty` in case it's deleted later. [`1d0075d`](https://github.com/inspect-js/object-inspect/commit/1d0075d3091dc82246feeb1f9871cb2b8ed227b3)
+- [Dev Deps] Update `tape` [`ca8d5d7`](https://github.com/inspect-js/object-inspect/commit/ca8d5d75635ddbf76f944e628267581e04958457)
+- gitignore node_modules since this is a reusable modules. [`ed41407`](https://github.com/inspect-js/object-inspect/commit/ed41407811743ca530cdeb28f982beb96026af82)
+
+## [1.0.1](https://github.com/inspect-js/object-inspect/compare/1.0.0...1.0.1) - 2015-07-19
+
+### Commits
+
+- Make `inspect` work with symbol primitives and objects, including in node 0.11 and 0.12. [`ddf1b94`](https://github.com/inspect-js/object-inspect/commit/ddf1b94475ab951f1e3bccdc0a48e9073cfbfef4)
+- bump tape [`103d674`](https://github.com/inspect-js/object-inspect/commit/103d67496b504bdcfdd765d303a773f87ec106e2)
+- use newer travis config [`d497276`](https://github.com/inspect-js/object-inspect/commit/d497276c1da14234bb5098a59cf20de75fbc316a)
+
+## [1.0.0](https://github.com/inspect-js/object-inspect/compare/0.4.0...1.0.0) - 2014-08-05
+
+### Commits
+
+- error inspect works properly [`260a22d`](https://github.com/inspect-js/object-inspect/commit/260a22d134d3a8a482c67d52091c6040c34f4299)
+- seen coverage [`57269e8`](https://github.com/inspect-js/object-inspect/commit/57269e8baa992a7439047f47325111fdcbcb8417)
+- htmlelement instance coverage [`397ffe1`](https://github.com/inspect-js/object-inspect/commit/397ffe10a1980350868043ef9de65686d438979f)
+- more element coverage [`6905cc2`](https://github.com/inspect-js/object-inspect/commit/6905cc2f7df35600177e613b0642b4df5efd3eca)
+- failing test for type errors [`385b615`](https://github.com/inspect-js/object-inspect/commit/385b6152e49b51b68449a662f410b084ed7c601a)
+- fn name coverage [`edc906d`](https://github.com/inspect-js/object-inspect/commit/edc906d40fca6b9194d304062c037ee8e398c4c2)
+- server-side element test [`362d1d3`](https://github.com/inspect-js/object-inspect/commit/362d1d3e86f187651c29feeb8478110afada385b)
+- custom inspect fn [`e89b0f6`](https://github.com/inspect-js/object-inspect/commit/e89b0f6fe6d5e03681282af83732a509160435a6)
+- fixed browser test [`b530882`](https://github.com/inspect-js/object-inspect/commit/b5308824a1c8471c5617e394766a03a6977102a9)
+- depth test, matches node [`1cfd9e0`](https://github.com/inspect-js/object-inspect/commit/1cfd9e0285a4ae1dff44101ad482915d9bf47e48)
+- exercise hasOwnProperty path [`8d753fb`](https://github.com/inspect-js/object-inspect/commit/8d753fb362a534fa1106e4d80f2ee9bea06a66d9)
+- more cases covered for errors [`c5c46a5`](https://github.com/inspect-js/object-inspect/commit/c5c46a569ec4606583497e8550f0d8c7ad39a4a4)
+- \W obj key test case [`b0eceee`](https://github.com/inspect-js/object-inspect/commit/b0eceeea6e0eb94d686c1046e99b9e25e5005f75)
+- coverage for explicit depth param [`e12b91c`](https://github.com/inspect-js/object-inspect/commit/e12b91cd59683362f3a0e80f46481a0211e26c15)
+
+## [0.4.0](https://github.com/inspect-js/object-inspect/compare/0.3.1...0.4.0) - 2014-03-21
+
+### Commits
+
+- passing lowbyte interpolation test [`b847511`](https://github.com/inspect-js/object-inspect/commit/b8475114f5def7e7961c5353d48d3d8d9a520985)
+- lowbyte test [`4a2b0e1`](https://github.com/inspect-js/object-inspect/commit/4a2b0e142667fc933f195472759385ac08f3946c)
+
+## [0.3.1](https://github.com/inspect-js/object-inspect/compare/0.3.0...0.3.1) - 2014-03-04
+
+### Commits
+
+- sort keys [`a07b19c`](https://github.com/inspect-js/object-inspect/commit/a07b19cc3b1521a82d4fafb6368b7a9775428a05)
+
+## [0.3.0](https://github.com/inspect-js/object-inspect/compare/0.2.0...0.3.0) - 2014-03-04
+
+### Commits
+
+- [] and {} instead of [ ] and { } [`654c44b`](https://github.com/inspect-js/object-inspect/commit/654c44b2865811f3519e57bb8526e0821caf5c6b)
+
+## [0.2.0](https://github.com/inspect-js/object-inspect/compare/0.1.3...0.2.0) - 2014-03-04
+
+### Commits
+
+- failing holes test [`99cdfad`](https://github.com/inspect-js/object-inspect/commit/99cdfad03c6474740275a75636fe6ca86c77737a)
+- regex already work [`e324033`](https://github.com/inspect-js/object-inspect/commit/e324033267025995ec97d32ed0a65737c99477a6)
+- failing undef/null test [`1f88a00`](https://github.com/inspect-js/object-inspect/commit/1f88a00265d3209719dda8117b7e6360b4c20943)
+- holes in the all example [`7d345f3`](https://github.com/inspect-js/object-inspect/commit/7d345f3676dcbe980cff89a4f6c243269ebbb709)
+- check for .inspect(), fixes Buffer use-case [`c3f7546`](https://github.com/inspect-js/object-inspect/commit/c3f75466dbca125347d49847c05262c292f12b79)
+- fixes for holes [`ce25f73`](https://github.com/inspect-js/object-inspect/commit/ce25f736683de4b92ff27dc5471218415e2d78d8)
+- weird null behavior [`405c1ea`](https://github.com/inspect-js/object-inspect/commit/405c1ea72cd5a8cf3b498c3eaa903d01b9fbcab5)
+- tape is actually a devDependency, upgrade [`703b0ce`](https://github.com/inspect-js/object-inspect/commit/703b0ce6c5817b4245a082564bccd877e0bb6990)
+- put date in the example [`a342219`](https://github.com/inspect-js/object-inspect/commit/a3422190eeaa013215f46df2d0d37b48595ac058)
+- passing the null test [`4ab737e`](https://github.com/inspect-js/object-inspect/commit/4ab737ebf862a75d247ebe51e79307a34d6380d4)
+
+## [0.1.3](https://github.com/inspect-js/object-inspect/compare/0.1.1...0.1.3) - 2013-07-26
+
+### Commits
+
+- special isElement() check [`882768a`](https://github.com/inspect-js/object-inspect/commit/882768a54035d30747be9de1baf14e5aa0daa128)
+- oh right old IEs don't have indexOf either [`36d1275`](https://github.com/inspect-js/object-inspect/commit/36d12756c38b08a74370b0bb696c809e529913a5)
+
+## [0.1.1](https://github.com/inspect-js/object-inspect/compare/0.1.0...0.1.1) - 2013-07-26
+
+### Commits
+
+- tests! [`4422fd9`](https://github.com/inspect-js/object-inspect/commit/4422fd95532c2745aa6c4f786f35f1090be29998)
+- fix for ie<9, doesn't have hasOwnProperty [`6b7d611`](https://github.com/inspect-js/object-inspect/commit/6b7d61183050f6da801ea04473211da226482613)
+- fix for all IEs: no f.name [`4e0c2f6`](https://github.com/inspect-js/object-inspect/commit/4e0c2f6dfd01c306d067d7163319acc97c94ee50)
+- badges [`5ed0d88`](https://github.com/inspect-js/object-inspect/commit/5ed0d88e4e407f9cb327fa4a146c17921f9680f3)
+
+## [0.1.0](https://github.com/inspect-js/object-inspect/compare/0.0.0...0.1.0) - 2013-07-26
+
+### Commits
+
+- [Function] for functions [`ad5c485`](https://github.com/inspect-js/object-inspect/commit/ad5c485098fc83352cb540a60b2548ca56820e0b)
+
+## 0.0.0 - 2013-07-26
+
+### Commits
+
+- working browser example [`34be6b6`](https://github.com/inspect-js/object-inspect/commit/34be6b6548f9ce92bdc3c27572857ba0c4a1218d)
+- package.json etc [`cad51f2`](https://github.com/inspect-js/object-inspect/commit/cad51f23fc6bcf1a456ed6abe16088256c2f632f)
+- docs complete [`b80cce2`](https://github.com/inspect-js/object-inspect/commit/b80cce2490c4e7183a9ee11ea89071f0abec4446)
+- circular example [`4b4a7b9`](https://github.com/inspect-js/object-inspect/commit/4b4a7b92209e4e6b4630976cb6bcd17d14165a59)
+- string rep [`7afb479`](https://github.com/inspect-js/object-inspect/commit/7afb479baa798d27f09e0a178b72ea327f60f5c8)
diff --git a/backend/node_modules/object-inspect/LICENSE b/backend/node_modules/object-inspect/LICENSE
new file mode 100644
index 0000000..ca64cc1
--- /dev/null
+++ b/backend/node_modules/object-inspect/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2013 James Halliday
+
+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.
diff --git a/backend/node_modules/object-inspect/example/all.js b/backend/node_modules/object-inspect/example/all.js
new file mode 100644
index 0000000..2f3355c
--- /dev/null
+++ b/backend/node_modules/object-inspect/example/all.js
@@ -0,0 +1,23 @@
+'use strict';
+
+var inspect = require('../');
+var Buffer = require('safer-buffer').Buffer;
+
+var holes = ['a', 'b'];
+holes[4] = 'e';
+holes[6] = 'g';
+
+var obj = {
+ a: 1,
+ b: [3, 4, undefined, null],
+ c: undefined,
+ d: null,
+ e: {
+ regex: /^x/i,
+ buf: Buffer.from('abc'),
+ holes: holes
+ },
+ now: new Date()
+};
+obj.self = obj;
+console.log(inspect(obj));
diff --git a/backend/node_modules/object-inspect/example/circular.js b/backend/node_modules/object-inspect/example/circular.js
new file mode 100644
index 0000000..487a7c1
--- /dev/null
+++ b/backend/node_modules/object-inspect/example/circular.js
@@ -0,0 +1,6 @@
+'use strict';
+
+var inspect = require('../');
+var obj = { a: 1, b: [3, 4] };
+obj.c = obj;
+console.log(inspect(obj));
diff --git a/backend/node_modules/object-inspect/example/fn.js b/backend/node_modules/object-inspect/example/fn.js
new file mode 100644
index 0000000..9b5db8d
--- /dev/null
+++ b/backend/node_modules/object-inspect/example/fn.js
@@ -0,0 +1,5 @@
+'use strict';
+
+var inspect = require('../');
+var obj = [1, 2, function f(n) { return n + 5; }, 4];
+console.log(inspect(obj));
diff --git a/backend/node_modules/object-inspect/example/inspect.js b/backend/node_modules/object-inspect/example/inspect.js
new file mode 100644
index 0000000..e2df7c9
--- /dev/null
+++ b/backend/node_modules/object-inspect/example/inspect.js
@@ -0,0 +1,10 @@
+'use strict';
+
+/* eslint-env browser */
+var inspect = require('../');
+
+var d = document.createElement('div');
+d.setAttribute('id', 'beep');
+d.innerHTML = '<b>wooo</b><i>iiiii</i>';
+
+console.log(inspect([d, { a: 3, b: 4, c: [5, 6, [7, [8, [9]]]] }]));
diff --git a/backend/node_modules/object-inspect/index.js b/backend/node_modules/object-inspect/index.js
new file mode 100644
index 0000000..eb89faf
--- /dev/null
+++ b/backend/node_modules/object-inspect/index.js
@@ -0,0 +1,527 @@
+var hasMap = typeof Map === 'function' && Map.prototype;
+var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;
+var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;
+var mapForEach = hasMap && Map.prototype.forEach;
+var hasSet = typeof Set === 'function' && Set.prototype;
+var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;
+var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;
+var setForEach = hasSet && Set.prototype.forEach;
+var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;
+var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;
+var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;
+var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;
+var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;
+var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;
+var booleanValueOf = Boolean.prototype.valueOf;
+var objectToString = Object.prototype.toString;
+var functionToString = Function.prototype.toString;
+var $match = String.prototype.match;
+var $slice = String.prototype.slice;
+var $replace = String.prototype.replace;
+var $toUpperCase = String.prototype.toUpperCase;
+var $toLowerCase = String.prototype.toLowerCase;
+var $test = RegExp.prototype.test;
+var $concat = Array.prototype.concat;
+var $join = Array.prototype.join;
+var $arrSlice = Array.prototype.slice;
+var $floor = Math.floor;
+var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;
+var gOPS = Object.getOwnPropertySymbols;
+var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;
+var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';
+// ie, `has-tostringtag/shams
+var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')
+ ? Symbol.toStringTag
+ : null;
+var isEnumerable = Object.prototype.propertyIsEnumerable;
+
+var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (
+ [].__proto__ === Array.prototype // eslint-disable-line no-proto
+ ? function (O) {
+ return O.__proto__; // eslint-disable-line no-proto
+ }
+ : null
+);
+
+function addNumericSeparator(num, str) {
+ if (
+ num === Infinity
+ || num === -Infinity
+ || num !== num
+ || (num && num > -1000 && num < 1000)
+ || $test.call(/e/, str)
+ ) {
+ return str;
+ }
+ var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;
+ if (typeof num === 'number') {
+ var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)
+ if (int !== num) {
+ var intStr = String(int);
+ var dec = $slice.call(str, intStr.length + 1);
+ return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');
+ }
+ }
+ return $replace.call(str, sepRegex, '$&_');
+}
+
+var utilInspect = require('./util.inspect');
+var inspectCustom = utilInspect.custom;
+var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null;
+
+module.exports = function inspect_(obj, options, depth, seen) {
+ var opts = options || {};
+
+ if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) {
+ throw new TypeError('option "quoteStyle" must be "single" or "double"');
+ }
+ if (
+ has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'
+ ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity
+ : opts.maxStringLength !== null
+ )
+ ) {
+ throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');
+ }
+ var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;
+ if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {
+ throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`');
+ }
+
+ if (
+ has(opts, 'indent')
+ && opts.indent !== null
+ && opts.indent !== '\t'
+ && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)
+ ) {
+ throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');
+ }
+ if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {
+ throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');
+ }
+ var numericSeparator = opts.numericSeparator;
+
+ if (typeof obj === 'undefined') {
+ return 'undefined';
+ }
+ if (obj === null) {
+ return 'null';
+ }
+ if (typeof obj === 'boolean') {
+ return obj ? 'true' : 'false';
+ }
+
+ if (typeof obj === 'string') {
+ return inspectString(obj, opts);
+ }
+ if (typeof obj === 'number') {
+ if (obj === 0) {
+ return Infinity / obj > 0 ? '0' : '-0';
+ }
+ var str = String(obj);
+ return numericSeparator ? addNumericSeparator(obj, str) : str;
+ }
+ if (typeof obj === 'bigint') {
+ var bigIntStr = String(obj) + 'n';
+ return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;
+ }
+
+ var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;
+ if (typeof depth === 'undefined') { depth = 0; }
+ if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {
+ return isArray(obj) ? '[Array]' : '[Object]';
+ }
+
+ var indent = getIndent(opts, depth);
+
+ if (typeof seen === 'undefined') {
+ seen = [];
+ } else if (indexOf(seen, obj) >= 0) {
+ return '[Circular]';
+ }
+
+ function inspect(value, from, noIndent) {
+ if (from) {
+ seen = $arrSlice.call(seen);
+ seen.push(from);
+ }
+ if (noIndent) {
+ var newOpts = {
+ depth: opts.depth
+ };
+ if (has(opts, 'quoteStyle')) {
+ newOpts.quoteStyle = opts.quoteStyle;
+ }
+ return inspect_(value, newOpts, depth + 1, seen);
+ }
+ return inspect_(value, opts, depth + 1, seen);
+ }
+
+ if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable
+ var name = nameOf(obj);
+ var keys = arrObjKeys(obj, inspect);
+ return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');
+ }
+ if (isSymbol(obj)) {
+ var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj);
+ return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;
+ }
+ if (isElement(obj)) {
+ var s = '<' + $toLowerCase.call(String(obj.nodeName));
+ var attrs = obj.attributes || [];
+ for (var i = 0; i < attrs.length; i++) {
+ s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);
+ }
+ s += '>';
+ if (obj.childNodes && obj.childNodes.length) { s += '...'; }
+ s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>';
+ return s;
+ }
+ if (isArray(obj)) {
+ if (obj.length === 0) { return '[]'; }
+ var xs = arrObjKeys(obj, inspect);
+ if (indent && !singleLineValues(xs)) {
+ return '[' + indentedJoin(xs, indent) + ']';
+ }
+ return '[ ' + $join.call(xs, ', ') + ' ]';
+ }
+ if (isError(obj)) {
+ var parts = arrObjKeys(obj, inspect);
+ if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) {
+ return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';
+ }
+ if (parts.length === 0) { return '[' + String(obj) + ']'; }
+ return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';
+ }
+ if (typeof obj === 'object' && customInspect) {
+ if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) {
+ return utilInspect(obj, { depth: maxDepth - depth });
+ } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {
+ return obj.inspect();
+ }
+ }
+ if (isMap(obj)) {
+ var mapParts = [];
+ if (mapForEach) {
+ mapForEach.call(obj, function (value, key) {
+ mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));
+ });
+ }
+ return collectionOf('Map', mapSize.call(obj), mapParts, indent);
+ }
+ if (isSet(obj)) {
+ var setParts = [];
+ if (setForEach) {
+ setForEach.call(obj, function (value) {
+ setParts.push(inspect(value, obj));
+ });
+ }
+ return collectionOf('Set', setSize.call(obj), setParts, indent);
+ }
+ if (isWeakMap(obj)) {
+ return weakCollectionOf('WeakMap');
+ }
+ if (isWeakSet(obj)) {
+ return weakCollectionOf('WeakSet');
+ }
+ if (isWeakRef(obj)) {
+ return weakCollectionOf('WeakRef');
+ }
+ if (isNumber(obj)) {
+ return markBoxed(inspect(Number(obj)));
+ }
+ if (isBigInt(obj)) {
+ return markBoxed(inspect(bigIntValueOf.call(obj)));
+ }
+ if (isBoolean(obj)) {
+ return markBoxed(booleanValueOf.call(obj));
+ }
+ if (isString(obj)) {
+ return markBoxed(inspect(String(obj)));
+ }
+ // note: in IE 8, sometimes `global !== window` but both are the prototypes of each other
+ /* eslint-env browser */
+ if (typeof window !== 'undefined' && obj === window) {
+ return '{ [object Window] }';
+ }
+ if (
+ (typeof globalThis !== 'undefined' && obj === globalThis)
+ || (typeof global !== 'undefined' && obj === global)
+ ) {
+ return '{ [object globalThis] }';
+ }
+ if (!isDate(obj) && !isRegExp(obj)) {
+ var ys = arrObjKeys(obj, inspect);
+ var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;
+ var protoTag = obj instanceof Object ? '' : 'null prototype';
+ var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';
+ var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';
+ var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');
+ if (ys.length === 0) { return tag + '{}'; }
+ if (indent) {
+ return tag + '{' + indentedJoin(ys, indent) + '}';
+ }
+ return tag + '{ ' + $join.call(ys, ', ') + ' }';
+ }
+ return String(obj);
+};
+
+function wrapQuotes(s, defaultStyle, opts) {
+ var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'";
+ return quoteChar + s + quoteChar;
+}
+
+function quote(s) {
+ return $replace.call(String(s), /"/g, '&quot;');
+}
+
+function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
+function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
+function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
+function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
+function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
+function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
+function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); }
+
+// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives
+function isSymbol(obj) {
+ if (hasShammedSymbols) {
+ return obj && typeof obj === 'object' && obj instanceof Symbol;
+ }
+ if (typeof obj === 'symbol') {
+ return true;
+ }
+ if (!obj || typeof obj !== 'object' || !symToString) {
+ return false;
+ }
+ try {
+ symToString.call(obj);
+ return true;
+ } catch (e) {}
+ return false;
+}
+
+function isBigInt(obj) {
+ if (!obj || typeof obj !== 'object' || !bigIntValueOf) {
+ return false;
+ }
+ try {
+ bigIntValueOf.call(obj);
+ return true;
+ } catch (e) {}
+ return false;
+}
+
+var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };
+function has(obj, key) {
+ return hasOwn.call(obj, key);
+}
+
+function toStr(obj) {
+ return objectToString.call(obj);
+}
+
+function nameOf(f) {
+ if (f.name) { return f.name; }
+ var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/);
+ if (m) { return m[1]; }
+ return null;
+}
+
+function indexOf(xs, x) {
+ if (xs.indexOf) { return xs.indexOf(x); }
+ for (var i = 0, l = xs.length; i < l; i++) {
+ if (xs[i] === x) { return i; }
+ }
+ return -1;
+}
+
+function isMap(x) {
+ if (!mapSize || !x || typeof x !== 'object') {
+ return false;
+ }
+ try {
+ mapSize.call(x);
+ try {
+ setSize.call(x);
+ } catch (s) {
+ return true;
+ }
+ return x instanceof Map; // core-js workaround, pre-v2.5.0
+ } catch (e) {}
+ return false;
+}
+
+function isWeakMap(x) {
+ if (!weakMapHas || !x || typeof x !== 'object') {
+ return false;
+ }
+ try {
+ weakMapHas.call(x, weakMapHas);
+ try {
+ weakSetHas.call(x, weakSetHas);
+ } catch (s) {
+ return true;
+ }
+ return x instanceof WeakMap; // core-js workaround, pre-v2.5.0
+ } catch (e) {}
+ return false;
+}
+
+function isWeakRef(x) {
+ if (!weakRefDeref || !x || typeof x !== 'object') {
+ return false;
+ }
+ try {
+ weakRefDeref.call(x);
+ return true;
+ } catch (e) {}
+ return false;
+}
+
+function isSet(x) {
+ if (!setSize || !x || typeof x !== 'object') {
+ return false;
+ }
+ try {
+ setSize.call(x);
+ try {
+ mapSize.call(x);
+ } catch (m) {
+ return true;
+ }
+ return x instanceof Set; // core-js workaround, pre-v2.5.0
+ } catch (e) {}
+ return false;
+}
+
+function isWeakSet(x) {
+ if (!weakSetHas || !x || typeof x !== 'object') {
+ return false;
+ }
+ try {
+ weakSetHas.call(x, weakSetHas);
+ try {
+ weakMapHas.call(x, weakMapHas);
+ } catch (s) {
+ return true;
+ }
+ return x instanceof WeakSet; // core-js workaround, pre-v2.5.0
+ } catch (e) {}
+ return false;
+}
+
+function isElement(x) {
+ if (!x || typeof x !== 'object') { return false; }
+ if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {
+ return true;
+ }
+ return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';
+}
+
+function inspectString(str, opts) {
+ if (str.length > opts.maxStringLength) {
+ var remaining = str.length - opts.maxStringLength;
+ var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');
+ return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;
+ }
+ // eslint-disable-next-line no-control-regex
+ var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte);
+ return wrapQuotes(s, 'single', opts);
+}
+
+function lowbyte(c) {
+ var n = c.charCodeAt(0);
+ var x = {
+ 8: 'b',
+ 9: 't',
+ 10: 'n',
+ 12: 'f',
+ 13: 'r'
+ }[n];
+ if (x) { return '\\' + x; }
+ return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));
+}
+
+function markBoxed(str) {
+ return 'Object(' + str + ')';
+}
+
+function weakCollectionOf(type) {
+ return type + ' { ? }';
+}
+
+function collectionOf(type, size, entries, indent) {
+ var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');
+ return type + ' (' + size + ') {' + joinedEntries + '}';
+}
+
+function singleLineValues(xs) {
+ for (var i = 0; i < xs.length; i++) {
+ if (indexOf(xs[i], '\n') >= 0) {
+ return false;
+ }
+ }
+ return true;
+}
+
+function getIndent(opts, depth) {
+ var baseIndent;
+ if (opts.indent === '\t') {
+ baseIndent = '\t';
+ } else if (typeof opts.indent === 'number' && opts.indent > 0) {
+ baseIndent = $join.call(Array(opts.indent + 1), ' ');
+ } else {
+ return null;
+ }
+ return {
+ base: baseIndent,
+ prev: $join.call(Array(depth + 1), baseIndent)
+ };
+}
+
+function indentedJoin(xs, indent) {
+ if (xs.length === 0) { return ''; }
+ var lineJoiner = '\n' + indent.prev + indent.base;
+ return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev;
+}
+
+function arrObjKeys(obj, inspect) {
+ var isArr = isArray(obj);
+ var xs = [];
+ if (isArr) {
+ xs.length = obj.length;
+ for (var i = 0; i < obj.length; i++) {
+ xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';
+ }
+ }
+ var syms = typeof gOPS === 'function' ? gOPS(obj) : [];
+ var symMap;
+ if (hasShammedSymbols) {
+ symMap = {};
+ for (var k = 0; k < syms.length; k++) {
+ symMap['$' + syms[k]] = syms[k];
+ }
+ }
+
+ for (var key in obj) { // eslint-disable-line no-restricted-syntax
+ if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
+ if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue
+ if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {
+ // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section
+ continue; // eslint-disable-line no-restricted-syntax, no-continue
+ } else if ($test.call(/[^\w$]/, key)) {
+ xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));
+ } else {
+ xs.push(key + ': ' + inspect(obj[key], obj));
+ }
+ }
+ if (typeof gOPS === 'function') {
+ for (var j = 0; j < syms.length; j++) {
+ if (isEnumerable.call(obj, syms[j])) {
+ xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));
+ }
+ }
+ }
+ return xs;
+}
diff --git a/backend/node_modules/object-inspect/package-support.json b/backend/node_modules/object-inspect/package-support.json
new file mode 100644
index 0000000..5cc12d0
--- /dev/null
+++ b/backend/node_modules/object-inspect/package-support.json
@@ -0,0 +1,20 @@
+{
+ "versions": [
+ {
+ "version": "*",
+ "target": {
+ "node": "all"
+ },
+ "response": {
+ "type": "time-permitting"
+ },
+ "backing": {
+ "npm-funding": true,
+ "donations": [
+ "https://github.com/ljharb",
+ "https://tidelift.com/funding/github/npm/object-inspect"
+ ]
+ }
+ }
+ ]
+}
diff --git a/backend/node_modules/object-inspect/package.json b/backend/node_modules/object-inspect/package.json
new file mode 100644
index 0000000..9974d21
--- /dev/null
+++ b/backend/node_modules/object-inspect/package.json
@@ -0,0 +1,104 @@
+{
+ "name": "object-inspect",
+ "version": "1.13.2",
+ "description": "string representations of objects in node and the browser",
+ "main": "index.js",
+ "sideEffects": false,
+ "devDependencies": {
+ "@ljharb/eslint-config": "^21.1.1",
+ "@pkgjs/support": "^0.0.6",
+ "auto-changelog": "^2.4.0",
+ "core-js": "^2.6.12",
+ "error-cause": "^1.0.8",
+ "es-value-fixtures": "^1.4.2",
+ "eslint": "=8.8.0",
+ "for-each": "^0.3.3",
+ "functions-have-names": "^1.2.3",
+ "glob": "=10.3.7",
+ "globalthis": "^1.0.4",
+ "has-symbols": "^1.0.3",
+ "has-tostringtag": "^1.0.2",
+ "in-publish": "^2.0.1",
+ "jackspeak": "=2.1.1",
+ "make-arrow-function": "^1.2.0",
+ "mock-property": "^1.0.3",
+ "npmignore": "^0.3.1",
+ "nyc": "^10.3.2",
+ "safe-publish-latest": "^2.0.0",
+ "safer-buffer": "^2.1.2",
+ "string.prototype.repeat": "^1.0.0",
+ "tape": "^5.8.1"
+ },
+ "scripts": {
+ "prepack": "npmignore --auto --commentLines=autogenerated",
+ "prepublish": "not-in-publish || npm run prepublishOnly",
+ "prepublishOnly": "safe-publish-latest",
+ "pretest": "npm run lint",
+ "lint": "eslint --ext=js,mjs .",
+ "postlint": "npx @pkgjs/support validate",
+ "test": "npm run tests-only && npm run test:corejs",
+ "tests-only": "nyc tape 'test/*.js'",
+ "test:corejs": "nyc tape test-core-js.js 'test/*.js'",
+ "posttest": "npx aud --production",
+ "version": "auto-changelog && git add CHANGELOG.md",
+ "postversion": "auto-changelog && git add CHANGELOG.md && git commit --no-edit --amend && git tag -f \"v$(node -e \"console.log(require('./package.json').version)\")\""
+ },
+ "testling": {
+ "files": [
+ "test/*.js",
+ "test/browser/*.js"
+ ],
+ "browsers": [
+ "ie/6..latest",
+ "chrome/latest",
+ "firefox/latest",
+ "safari/latest",
+ "opera/latest",
+ "iphone/latest",
+ "ipad/latest",
+ "android/latest"
+ ]
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/inspect-js/object-inspect.git"
+ },
+ "homepage": "https://github.com/inspect-js/object-inspect",
+ "keywords": [
+ "inspect",
+ "util.inspect",
+ "object",
+ "stringify",
+ "pretty"
+ ],
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "license": "MIT",
+ "browser": {
+ "./util.inspect.js": false
+ },
+ "auto-changelog": {
+ "output": "CHANGELOG.md",
+ "template": "keepachangelog",
+ "unreleased": false,
+ "commitLimit": false,
+ "backfillLimit": false,
+ "hideCredit": true
+ },
+ "publishConfig": {
+ "ignore": [
+ ".github/workflows",
+ "./test-core-js.js"
+ ]
+ },
+ "support": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+}
diff --git a/backend/node_modules/object-inspect/readme.markdown b/backend/node_modules/object-inspect/readme.markdown
new file mode 100644
index 0000000..f91617d
--- /dev/null
+++ b/backend/node_modules/object-inspect/readme.markdown
@@ -0,0 +1,84 @@
+# object-inspect <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
+
+string representations of objects in node and the browser
+
+[![github actions][actions-image]][actions-url]
+[![coverage][codecov-image]][codecov-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+# example
+
+## circular
+
+``` js
+var inspect = require('object-inspect');
+var obj = { a: 1, b: [3,4] };
+obj.c = obj;
+console.log(inspect(obj));
+```
+
+## dom element
+
+``` js
+var inspect = require('object-inspect');
+
+var d = document.createElement('div');
+d.setAttribute('id', 'beep');
+d.innerHTML = '<b>wooo</b><i>iiiii</i>';
+
+console.log(inspect([ d, { a: 3, b : 4, c: [5,6,[7,[8,[9]]]] } ]));
+```
+
+output:
+
+```
+[ <div id="beep">...</div>, { a: 3, b: 4, c: [ 5, 6, [ 7, [ 8, [ ... ] ] ] ] } ]
+```
+
+# methods
+
+``` js
+var inspect = require('object-inspect')
+```
+
+## var s = inspect(obj, opts={})
+
+Return a string `s` with the string representation of `obj` up to a depth of `opts.depth`.
+
+Additional options:
+ - `quoteStyle`: must be "single" or "double", if present. Default `'single'` for strings, `'double'` for HTML elements.
+ - `maxStringLength`: must be `0`, a positive integer, `Infinity`, or `null`, if present. Default `Infinity`.
+ - `customInspect`: When `true`, a custom inspect method function will be invoked (either undere the `util.inspect.custom` symbol, or the `inspect` property). When the string `'symbol'`, only the symbol method will be invoked. Default `true`.
+ - `indent`: must be "\t", `null`, or a positive integer. Default `null`.
+ - `numericSeparator`: must be a boolean, if present. Default `false`. If `true`, all numbers will be printed with numeric separators (eg, `1234.5678` will be printed as `'1_234.567_8'`)
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install object-inspect
+```
+
+# license
+
+MIT
+
+[package-url]: https://npmjs.org/package/object-inspect
+[npm-version-svg]: https://versionbadg.es/inspect-js/object-inspect.svg
+[deps-svg]: https://david-dm.org/inspect-js/object-inspect.svg
+[deps-url]: https://david-dm.org/inspect-js/object-inspect
+[dev-deps-svg]: https://david-dm.org/inspect-js/object-inspect/dev-status.svg
+[dev-deps-url]: https://david-dm.org/inspect-js/object-inspect#info=devDependencies
+[npm-badge-png]: https://nodei.co/npm/object-inspect.png?downloads=true&stars=true
+[license-image]: https://img.shields.io/npm/l/object-inspect.svg
+[license-url]: LICENSE
+[downloads-image]: https://img.shields.io/npm/dm/object-inspect.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=object-inspect
+[codecov-image]: https://codecov.io/gh/inspect-js/object-inspect/branch/main/graphs/badge.svg
+[codecov-url]: https://app.codecov.io/gh/inspect-js/object-inspect/
+[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/inspect-js/object-inspect
+[actions-url]: https://github.com/inspect-js/object-inspect/actions
diff --git a/backend/node_modules/object-inspect/test-core-js.js b/backend/node_modules/object-inspect/test-core-js.js
new file mode 100644
index 0000000..e53c400
--- /dev/null
+++ b/backend/node_modules/object-inspect/test-core-js.js
@@ -0,0 +1,26 @@
+'use strict';
+
+require('core-js');
+
+var inspect = require('./');
+var test = require('tape');
+
+test('Maps', function (t) {
+ t.equal(inspect(new Map([[1, 2]])), 'Map (1) {1 => 2}');
+ t.end();
+});
+
+test('WeakMaps', function (t) {
+ t.equal(inspect(new WeakMap([[{}, 2]])), 'WeakMap { ? }');
+ t.end();
+});
+
+test('Sets', function (t) {
+ t.equal(inspect(new Set([[1, 2]])), 'Set (1) {[ 1, 2 ]}');
+ t.end();
+});
+
+test('WeakSets', function (t) {
+ t.equal(inspect(new WeakSet([[1, 2]])), 'WeakSet { ? }');
+ t.end();
+});
diff --git a/backend/node_modules/object-inspect/test/bigint.js b/backend/node_modules/object-inspect/test/bigint.js
new file mode 100644
index 0000000..4ecc31d
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/bigint.js
@@ -0,0 +1,58 @@
+'use strict';
+
+var inspect = require('../');
+var test = require('tape');
+var hasToStringTag = require('has-tostringtag/shams')();
+
+test('bigint', { skip: typeof BigInt === 'undefined' }, function (t) {
+ t.test('primitives', function (st) {
+ st.plan(3);
+
+ st.equal(inspect(BigInt(-256)), '-256n');
+ st.equal(inspect(BigInt(0)), '0n');
+ st.equal(inspect(BigInt(256)), '256n');
+ });
+
+ t.test('objects', function (st) {
+ st.plan(3);
+
+ st.equal(inspect(Object(BigInt(-256))), 'Object(-256n)');
+ st.equal(inspect(Object(BigInt(0))), 'Object(0n)');
+ st.equal(inspect(Object(BigInt(256))), 'Object(256n)');
+ });
+
+ t.test('syntactic primitives', function (st) {
+ st.plan(3);
+
+ /* eslint-disable no-new-func */
+ st.equal(inspect(Function('return -256n')()), '-256n');
+ st.equal(inspect(Function('return 0n')()), '0n');
+ st.equal(inspect(Function('return 256n')()), '256n');
+ });
+
+ t.test('toStringTag', { skip: !hasToStringTag }, function (st) {
+ st.plan(1);
+
+ var faker = {};
+ faker[Symbol.toStringTag] = 'BigInt';
+ st.equal(
+ inspect(faker),
+ '{ [Symbol(Symbol.toStringTag)]: \'BigInt\' }',
+ 'object lying about being a BigInt inspects as an object'
+ );
+ });
+
+ t.test('numericSeparator', function (st) {
+ st.equal(inspect(BigInt(0), { numericSeparator: false }), '0n', '0n, numericSeparator false');
+ st.equal(inspect(BigInt(0), { numericSeparator: true }), '0n', '0n, numericSeparator true');
+
+ st.equal(inspect(BigInt(1234), { numericSeparator: false }), '1234n', '1234n, numericSeparator false');
+ st.equal(inspect(BigInt(1234), { numericSeparator: true }), '1_234n', '1234n, numericSeparator true');
+ st.equal(inspect(BigInt(-1234), { numericSeparator: false }), '-1234n', '1234n, numericSeparator false');
+ st.equal(inspect(BigInt(-1234), { numericSeparator: true }), '-1_234n', '1234n, numericSeparator true');
+
+ st.end();
+ });
+
+ t.end();
+});
diff --git a/backend/node_modules/object-inspect/test/browser/dom.js b/backend/node_modules/object-inspect/test/browser/dom.js
new file mode 100644
index 0000000..210c0b2
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/browser/dom.js
@@ -0,0 +1,15 @@
+var inspect = require('../../');
+var test = require('tape');
+
+test('dom element', function (t) {
+ t.plan(1);
+
+ var d = document.createElement('div');
+ d.setAttribute('id', 'beep');
+ d.innerHTML = '<b>wooo</b><i>iiiii</i>';
+
+ t.equal(
+ inspect([d, { a: 3, b: 4, c: [5, 6, [7, [8, [9]]]] }]),
+ '[ <div id="beep">...</div>, { a: 3, b: 4, c: [ 5, 6, [ 7, [ 8, [Object] ] ] ] } ]'
+ );
+});
diff --git a/backend/node_modules/object-inspect/test/circular.js b/backend/node_modules/object-inspect/test/circular.js
new file mode 100644
index 0000000..5df4233
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/circular.js
@@ -0,0 +1,16 @@
+var inspect = require('../');
+var test = require('tape');
+
+test('circular', function (t) {
+ t.plan(2);
+ var obj = { a: 1, b: [3, 4] };
+ obj.c = obj;
+ t.equal(inspect(obj), '{ a: 1, b: [ 3, 4 ], c: [Circular] }');
+
+ var double = {};
+ double.a = [double];
+ double.b = {};
+ double.b.inner = double.b;
+ double.b.obj = double;
+ t.equal(inspect(double), '{ a: [ [Circular] ], b: { inner: [Circular], obj: [Circular] } }');
+});
diff --git a/backend/node_modules/object-inspect/test/deep.js b/backend/node_modules/object-inspect/test/deep.js
new file mode 100644
index 0000000..99ce32a
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/deep.js
@@ -0,0 +1,12 @@
+var inspect = require('../');
+var test = require('tape');
+
+test('deep', function (t) {
+ t.plan(4);
+ var obj = [[[[[[500]]]]]];
+ t.equal(inspect(obj), '[ [ [ [ [ [Array] ] ] ] ] ]');
+ t.equal(inspect(obj, { depth: 4 }), '[ [ [ [ [Array] ] ] ] ]');
+ t.equal(inspect(obj, { depth: 2 }), '[ [ [Array] ] ]');
+
+ t.equal(inspect([[[{ a: 1 }]]], { depth: 3 }), '[ [ [ [Object] ] ] ]');
+});
diff --git a/backend/node_modules/object-inspect/test/element.js b/backend/node_modules/object-inspect/test/element.js
new file mode 100644
index 0000000..47fa9e2
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/element.js
@@ -0,0 +1,53 @@
+var inspect = require('../');
+var test = require('tape');
+
+test('element', function (t) {
+ t.plan(3);
+ var elem = {
+ nodeName: 'div',
+ attributes: [{ name: 'class', value: 'row' }],
+ getAttribute: function (key) { return key; },
+ childNodes: []
+ };
+ var obj = [1, elem, 3];
+ t.deepEqual(inspect(obj), '[ 1, <div class="row"></div>, 3 ]');
+ t.deepEqual(inspect(obj, { quoteStyle: 'single' }), "[ 1, <div class='row'></div>, 3 ]");
+ t.deepEqual(inspect(obj, { quoteStyle: 'double' }), '[ 1, <div class="row"></div>, 3 ]');
+});
+
+test('element no attr', function (t) {
+ t.plan(1);
+ var elem = {
+ nodeName: 'div',
+ getAttribute: function (key) { return key; },
+ childNodes: []
+ };
+ var obj = [1, elem, 3];
+ t.deepEqual(inspect(obj), '[ 1, <div></div>, 3 ]');
+});
+
+test('element with contents', function (t) {
+ t.plan(1);
+ var elem = {
+ nodeName: 'div',
+ getAttribute: function (key) { return key; },
+ childNodes: [{ nodeName: 'b' }]
+ };
+ var obj = [1, elem, 3];
+ t.deepEqual(inspect(obj), '[ 1, <div>...</div>, 3 ]');
+});
+
+test('element instance', function (t) {
+ t.plan(1);
+ var h = global.HTMLElement;
+ global.HTMLElement = function (name, attr) {
+ this.nodeName = name;
+ this.attributes = attr;
+ };
+ global.HTMLElement.prototype.getAttribute = function () {};
+
+ var elem = new global.HTMLElement('div', []);
+ var obj = [1, elem, 3];
+ t.deepEqual(inspect(obj), '[ 1, <div></div>, 3 ]');
+ global.HTMLElement = h;
+});
diff --git a/backend/node_modules/object-inspect/test/err.js b/backend/node_modules/object-inspect/test/err.js
new file mode 100644
index 0000000..cc1d884
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/err.js
@@ -0,0 +1,48 @@
+var test = require('tape');
+var ErrorWithCause = require('error-cause/Error');
+
+var inspect = require('../');
+
+test('type error', function (t) {
+ t.plan(1);
+ var aerr = new TypeError();
+ aerr.foo = 555;
+ aerr.bar = [1, 2, 3];
+
+ var berr = new TypeError('tuv');
+ berr.baz = 555;
+
+ var cerr = new SyntaxError();
+ cerr.message = 'whoa';
+ cerr['a-b'] = 5;
+
+ var withCause = new ErrorWithCause('foo', { cause: 'bar' });
+ var withCausePlus = new ErrorWithCause('foo', { cause: 'bar' });
+ withCausePlus.foo = 'bar';
+ var withUndefinedCause = new ErrorWithCause('foo', { cause: undefined });
+ var withEnumerableCause = new Error('foo');
+ withEnumerableCause.cause = 'bar';
+
+ var obj = [
+ new TypeError(),
+ new TypeError('xxx'),
+ aerr,
+ berr,
+ cerr,
+ withCause,
+ withCausePlus,
+ withUndefinedCause,
+ withEnumerableCause
+ ];
+ t.equal(inspect(obj), '[ ' + [
+ '[TypeError]',
+ '[TypeError: xxx]',
+ '{ [TypeError] foo: 555, bar: [ 1, 2, 3 ] }',
+ '{ [TypeError: tuv] baz: 555 }',
+ '{ [SyntaxError: whoa] message: \'whoa\', \'a-b\': 5 }',
+ 'cause' in Error.prototype ? '[Error: foo]' : '{ [Error: foo] [cause]: \'bar\' }',
+ '{ [Error: foo] ' + ('cause' in Error.prototype ? '' : '[cause]: \'bar\', ') + 'foo: \'bar\' }',
+ 'cause' in Error.prototype ? '[Error: foo]' : '{ [Error: foo] [cause]: undefined }',
+ '{ [Error: foo] cause: \'bar\' }'
+ ].join(', ') + ' ]');
+});
diff --git a/backend/node_modules/object-inspect/test/fakes.js b/backend/node_modules/object-inspect/test/fakes.js
new file mode 100644
index 0000000..a65c08c
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/fakes.js
@@ -0,0 +1,29 @@
+'use strict';
+
+var inspect = require('../');
+var test = require('tape');
+var hasToStringTag = require('has-tostringtag/shams')();
+var forEach = require('for-each');
+
+test('fakes', { skip: !hasToStringTag }, function (t) {
+ forEach([
+ 'Array',
+ 'Boolean',
+ 'Date',
+ 'Error',
+ 'Number',
+ 'RegExp',
+ 'String'
+ ], function (expected) {
+ var faker = {};
+ faker[Symbol.toStringTag] = expected;
+
+ t.equal(
+ inspect(faker),
+ '{ [Symbol(Symbol.toStringTag)]: \'' + expected + '\' }',
+ 'faker masquerading as ' + expected + ' is not shown as one'
+ );
+ });
+
+ t.end();
+});
diff --git a/backend/node_modules/object-inspect/test/fn.js b/backend/node_modules/object-inspect/test/fn.js
new file mode 100644
index 0000000..de3ca62
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/fn.js
@@ -0,0 +1,76 @@
+var inspect = require('../');
+var test = require('tape');
+var arrow = require('make-arrow-function')();
+var functionsHaveConfigurableNames = require('functions-have-names').functionsHaveConfigurableNames();
+
+test('function', function (t) {
+ t.plan(1);
+ var obj = [1, 2, function f(n) { return n; }, 4];
+ t.equal(inspect(obj), '[ 1, 2, [Function: f], 4 ]');
+});
+
+test('function name', function (t) {
+ t.plan(1);
+ var f = (function () {
+ return function () {};
+ }());
+ f.toString = function toStr() { return 'function xxx () {}'; };
+ var obj = [1, 2, f, 4];
+ t.equal(inspect(obj), '[ 1, 2, [Function (anonymous)] { toString: [Function: toStr] }, 4 ]');
+});
+
+test('anon function', function (t) {
+ var f = (function () {
+ return function () {};
+ }());
+ var obj = [1, 2, f, 4];
+ t.equal(inspect(obj), '[ 1, 2, [Function (anonymous)], 4 ]');
+
+ t.end();
+});
+
+test('arrow function', { skip: !arrow }, function (t) {
+ t.equal(inspect(arrow), '[Function (anonymous)]');
+
+ t.end();
+});
+
+test('truly nameless function', { skip: !arrow || !functionsHaveConfigurableNames }, function (t) {
+ function f() {}
+ Object.defineProperty(f, 'name', { value: false });
+ t.equal(f.name, false);
+ t.equal(
+ inspect(f),
+ '[Function: f]',
+ 'named function with falsy `.name` does not hide its original name'
+ );
+
+ function g() {}
+ Object.defineProperty(g, 'name', { value: true });
+ t.equal(g.name, true);
+ t.equal(
+ inspect(g),
+ '[Function: true]',
+ 'named function with truthy `.name` hides its original name'
+ );
+
+ var anon = function () {}; // eslint-disable-line func-style
+ Object.defineProperty(anon, 'name', { value: null });
+ t.equal(anon.name, null);
+ t.equal(
+ inspect(anon),
+ '[Function (anonymous)]',
+ 'anon function with falsy `.name` does not hide its anonymity'
+ );
+
+ var anon2 = function () {}; // eslint-disable-line func-style
+ Object.defineProperty(anon2, 'name', { value: 1 });
+ t.equal(anon2.name, 1);
+ t.equal(
+ inspect(anon2),
+ '[Function: 1]',
+ 'anon function with truthy `.name` hides its anonymity'
+ );
+
+ t.end();
+});
diff --git a/backend/node_modules/object-inspect/test/global.js b/backend/node_modules/object-inspect/test/global.js
new file mode 100644
index 0000000..c57216a
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/global.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var inspect = require('../');
+
+var test = require('tape');
+var globalThis = require('globalthis')();
+
+test('global object', function (t) {
+ /* eslint-env browser */
+ var expected = typeof window === 'undefined' ? 'globalThis' : 'Window';
+ t.equal(
+ inspect([globalThis]),
+ '[ { [object ' + expected + '] } ]'
+ );
+
+ t.end();
+});
diff --git a/backend/node_modules/object-inspect/test/has.js b/backend/node_modules/object-inspect/test/has.js
new file mode 100644
index 0000000..01800de
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/has.js
@@ -0,0 +1,15 @@
+'use strict';
+
+var inspect = require('../');
+var test = require('tape');
+var mockProperty = require('mock-property');
+
+test('when Object#hasOwnProperty is deleted', function (t) {
+ t.plan(1);
+ var arr = [1, , 3]; // eslint-disable-line no-sparse-arrays
+
+ t.teardown(mockProperty(Array.prototype, 1, { value: 2 })); // this is needed to account for "in" vs "hasOwnProperty"
+ t.teardown(mockProperty(Object.prototype, 'hasOwnProperty', { 'delete': true }));
+
+ t.equal(inspect(arr), '[ 1, , 3 ]');
+});
diff --git a/backend/node_modules/object-inspect/test/holes.js b/backend/node_modules/object-inspect/test/holes.js
new file mode 100644
index 0000000..87fc8c8
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/holes.js
@@ -0,0 +1,15 @@
+var test = require('tape');
+var inspect = require('../');
+
+var xs = ['a', 'b'];
+xs[5] = 'f';
+xs[7] = 'j';
+xs[8] = 'k';
+
+test('holes', function (t) {
+ t.plan(1);
+ t.equal(
+ inspect(xs),
+ "[ 'a', 'b', , , , 'f', , 'j', 'k' ]"
+ );
+});
diff --git a/backend/node_modules/object-inspect/test/indent-option.js b/backend/node_modules/object-inspect/test/indent-option.js
new file mode 100644
index 0000000..89d8fce
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/indent-option.js
@@ -0,0 +1,271 @@
+var test = require('tape');
+var forEach = require('for-each');
+
+var inspect = require('../');
+
+test('bad indent options', function (t) {
+ forEach([
+ undefined,
+ true,
+ false,
+ -1,
+ 1.2,
+ Infinity,
+ -Infinity,
+ NaN
+ ], function (indent) {
+ t['throws'](
+ function () { inspect('', { indent: indent }); },
+ TypeError,
+ inspect(indent) + ' is invalid'
+ );
+ });
+
+ t.end();
+});
+
+test('simple object with indent', function (t) {
+ t.plan(2);
+
+ var obj = { a: 1, b: 2 };
+
+ var expectedSpaces = [
+ '{',
+ ' a: 1,',
+ ' b: 2',
+ '}'
+ ].join('\n');
+ var expectedTabs = [
+ '{',
+ ' a: 1,',
+ ' b: 2',
+ '}'
+ ].join('\n');
+
+ t.equal(inspect(obj, { indent: 2 }), expectedSpaces, 'two');
+ t.equal(inspect(obj, { indent: '\t' }), expectedTabs, 'tabs');
+});
+
+test('two deep object with indent', function (t) {
+ t.plan(2);
+
+ var obj = { a: 1, b: { c: 3, d: 4 } };
+
+ var expectedSpaces = [
+ '{',
+ ' a: 1,',
+ ' b: {',
+ ' c: 3,',
+ ' d: 4',
+ ' }',
+ '}'
+ ].join('\n');
+ var expectedTabs = [
+ '{',
+ ' a: 1,',
+ ' b: {',
+ ' c: 3,',
+ ' d: 4',
+ ' }',
+ '}'
+ ].join('\n');
+
+ t.equal(inspect(obj, { indent: 2 }), expectedSpaces, 'two');
+ t.equal(inspect(obj, { indent: '\t' }), expectedTabs, 'tabs');
+});
+
+test('simple array with all single line elements', function (t) {
+ t.plan(2);
+
+ var obj = [1, 2, 3, 'asdf\nsdf'];
+
+ var expected = '[ 1, 2, 3, \'asdf\\nsdf\' ]';
+
+ t.equal(inspect(obj, { indent: 2 }), expected, 'two');
+ t.equal(inspect(obj, { indent: '\t' }), expected, 'tabs');
+});
+
+test('array with complex elements', function (t) {
+ t.plan(2);
+
+ var obj = [1, { a: 1, b: { c: 1 } }, 'asdf\nsdf'];
+
+ var expectedSpaces = [
+ '[',
+ ' 1,',
+ ' {',
+ ' a: 1,',
+ ' b: {',
+ ' c: 1',
+ ' }',
+ ' },',
+ ' \'asdf\\nsdf\'',
+ ']'
+ ].join('\n');
+ var expectedTabs = [
+ '[',
+ ' 1,',
+ ' {',
+ ' a: 1,',
+ ' b: {',
+ ' c: 1',
+ ' }',
+ ' },',
+ ' \'asdf\\nsdf\'',
+ ']'
+ ].join('\n');
+
+ t.equal(inspect(obj, { indent: 2 }), expectedSpaces, 'two');
+ t.equal(inspect(obj, { indent: '\t' }), expectedTabs, 'tabs');
+});
+
+test('values', function (t) {
+ t.plan(2);
+ var obj = [{}, [], { 'a-b': 5 }];
+
+ var expectedSpaces = [
+ '[',
+ ' {},',
+ ' [],',
+ ' {',
+ ' \'a-b\': 5',
+ ' }',
+ ']'
+ ].join('\n');
+ var expectedTabs = [
+ '[',
+ ' {},',
+ ' [],',
+ ' {',
+ ' \'a-b\': 5',
+ ' }',
+ ']'
+ ].join('\n');
+
+ t.equal(inspect(obj, { indent: 2 }), expectedSpaces, 'two');
+ t.equal(inspect(obj, { indent: '\t' }), expectedTabs, 'tabs');
+});
+
+test('Map', { skip: typeof Map !== 'function' }, function (t) {
+ var map = new Map();
+ map.set({ a: 1 }, ['b']);
+ map.set(3, NaN);
+
+ var expectedStringSpaces = [
+ 'Map (2) {',
+ ' { a: 1 } => [ \'b\' ],',
+ ' 3 => NaN',
+ '}'
+ ].join('\n');
+ var expectedStringTabs = [
+ 'Map (2) {',
+ ' { a: 1 } => [ \'b\' ],',
+ ' 3 => NaN',
+ '}'
+ ].join('\n');
+ var expectedStringTabsDoubleQuotes = [
+ 'Map (2) {',
+ ' { a: 1 } => [ "b" ],',
+ ' 3 => NaN',
+ '}'
+ ].join('\n');
+
+ t.equal(
+ inspect(map, { indent: 2 }),
+ expectedStringSpaces,
+ 'Map keys are not indented (two)'
+ );
+ t.equal(
+ inspect(map, { indent: '\t' }),
+ expectedStringTabs,
+ 'Map keys are not indented (tabs)'
+ );
+ t.equal(
+ inspect(map, { indent: '\t', quoteStyle: 'double' }),
+ expectedStringTabsDoubleQuotes,
+ 'Map keys are not indented (tabs + double quotes)'
+ );
+
+ t.equal(inspect(new Map(), { indent: 2 }), 'Map (0) {}', 'empty Map should show as empty (two)');
+ t.equal(inspect(new Map(), { indent: '\t' }), 'Map (0) {}', 'empty Map should show as empty (tabs)');
+
+ var nestedMap = new Map();
+ nestedMap.set(nestedMap, map);
+ var expectedNestedSpaces = [
+ 'Map (1) {',
+ ' [Circular] => Map (2) {',
+ ' { a: 1 } => [ \'b\' ],',
+ ' 3 => NaN',
+ ' }',
+ '}'
+ ].join('\n');
+ var expectedNestedTabs = [
+ 'Map (1) {',
+ ' [Circular] => Map (2) {',
+ ' { a: 1 } => [ \'b\' ],',
+ ' 3 => NaN',
+ ' }',
+ '}'
+ ].join('\n');
+ t.equal(inspect(nestedMap, { indent: 2 }), expectedNestedSpaces, 'Map containing a Map should work (two)');
+ t.equal(inspect(nestedMap, { indent: '\t' }), expectedNestedTabs, 'Map containing a Map should work (tabs)');
+
+ t.end();
+});
+
+test('Set', { skip: typeof Set !== 'function' }, function (t) {
+ var set = new Set();
+ set.add({ a: 1 });
+ set.add(['b']);
+ var expectedStringSpaces = [
+ 'Set (2) {',
+ ' {',
+ ' a: 1',
+ ' },',
+ ' [ \'b\' ]',
+ '}'
+ ].join('\n');
+ var expectedStringTabs = [
+ 'Set (2) {',
+ ' {',
+ ' a: 1',
+ ' },',
+ ' [ \'b\' ]',
+ '}'
+ ].join('\n');
+ t.equal(inspect(set, { indent: 2 }), expectedStringSpaces, 'new Set([{ a: 1 }, ["b"]]) should show size and contents (two)');
+ t.equal(inspect(set, { indent: '\t' }), expectedStringTabs, 'new Set([{ a: 1 }, ["b"]]) should show size and contents (tabs)');
+
+ t.equal(inspect(new Set(), { indent: 2 }), 'Set (0) {}', 'empty Set should show as empty (two)');
+ t.equal(inspect(new Set(), { indent: '\t' }), 'Set (0) {}', 'empty Set should show as empty (tabs)');
+
+ var nestedSet = new Set();
+ nestedSet.add(set);
+ nestedSet.add(nestedSet);
+ var expectedNestedSpaces = [
+ 'Set (2) {',
+ ' Set (2) {',
+ ' {',
+ ' a: 1',
+ ' },',
+ ' [ \'b\' ]',
+ ' },',
+ ' [Circular]',
+ '}'
+ ].join('\n');
+ var expectedNestedTabs = [
+ 'Set (2) {',
+ ' Set (2) {',
+ ' {',
+ ' a: 1',
+ ' },',
+ ' [ \'b\' ]',
+ ' },',
+ ' [Circular]',
+ '}'
+ ].join('\n');
+ t.equal(inspect(nestedSet, { indent: 2 }), expectedNestedSpaces, 'Set containing a Set should work (two)');
+ t.equal(inspect(nestedSet, { indent: '\t' }), expectedNestedTabs, 'Set containing a Set should work (tabs)');
+
+ t.end();
+});
diff --git a/backend/node_modules/object-inspect/test/inspect.js b/backend/node_modules/object-inspect/test/inspect.js
new file mode 100644
index 0000000..1abf81b
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/inspect.js
@@ -0,0 +1,139 @@
+var test = require('tape');
+var hasSymbols = require('has-symbols/shams')();
+var utilInspect = require('../util.inspect');
+var repeat = require('string.prototype.repeat');
+
+var inspect = require('..');
+
+test('inspect', function (t) {
+ t.plan(5);
+
+ var obj = [{ inspect: function xyzInspect() { return '!XYZ¡'; } }, []];
+ var stringResult = '[ !XYZ¡, [] ]';
+ var falseResult = '[ { inspect: [Function: xyzInspect] }, [] ]';
+
+ t.equal(inspect(obj), stringResult);
+ t.equal(inspect(obj, { customInspect: true }), stringResult);
+ t.equal(inspect(obj, { customInspect: 'symbol' }), falseResult);
+ t.equal(inspect(obj, { customInspect: false }), falseResult);
+ t['throws'](
+ function () { inspect(obj, { customInspect: 'not a boolean or "symbol"' }); },
+ TypeError,
+ '`customInspect` must be a boolean or the string "symbol"'
+ );
+});
+
+test('inspect custom symbol', { skip: !hasSymbols || !utilInspect || !utilInspect.custom }, function (t) {
+ t.plan(4);
+
+ var obj = { inspect: function stringInspect() { return 'string'; } };
+ obj[utilInspect.custom] = function custom() { return 'symbol'; };
+
+ var symbolResult = '[ symbol, [] ]';
+ var stringResult = '[ string, [] ]';
+ var falseResult = '[ { inspect: [Function: stringInspect]' + (utilInspect.custom ? ', [' + inspect(utilInspect.custom) + ']: [Function: custom]' : '') + ' }, [] ]';
+
+ var symbolStringFallback = utilInspect.custom ? symbolResult : stringResult;
+ var symbolFalseFallback = utilInspect.custom ? symbolResult : falseResult;
+
+ t.equal(inspect([obj, []]), symbolStringFallback);
+ t.equal(inspect([obj, []], { customInspect: true }), symbolStringFallback);
+ t.equal(inspect([obj, []], { customInspect: 'symbol' }), symbolFalseFallback);
+ t.equal(inspect([obj, []], { customInspect: false }), falseResult);
+});
+
+test('symbols', { skip: !hasSymbols }, function (t) {
+ t.plan(2);
+
+ var obj = { a: 1 };
+ obj[Symbol('test')] = 2;
+ obj[Symbol.iterator] = 3;
+ Object.defineProperty(obj, Symbol('non-enum'), {
+ enumerable: false,
+ value: 4
+ });
+
+ if (typeof Symbol.iterator === 'symbol') {
+ t.equal(inspect(obj), '{ a: 1, [Symbol(test)]: 2, [Symbol(Symbol.iterator)]: 3 }', 'object with symbols');
+ t.equal(inspect([obj, []]), '[ { a: 1, [Symbol(test)]: 2, [Symbol(Symbol.iterator)]: 3 }, [] ]', 'object with symbols in array');
+ } else {
+ // symbol sham key ordering is unreliable
+ t.match(
+ inspect(obj),
+ /^(?:{ a: 1, \[Symbol\(test\)\]: 2, \[Symbol\(Symbol.iterator\)\]: 3 }|{ a: 1, \[Symbol\(Symbol.iterator\)\]: 3, \[Symbol\(test\)\]: 2 })$/,
+ 'object with symbols (nondeterministic symbol sham key ordering)'
+ );
+ t.match(
+ inspect([obj, []]),
+ /^\[ (?:{ a: 1, \[Symbol\(test\)\]: 2, \[Symbol\(Symbol.iterator\)\]: 3 }|{ a: 1, \[Symbol\(Symbol.iterator\)\]: 3, \[Symbol\(test\)\]: 2 }), \[\] \]$/,
+ 'object with symbols in array (nondeterministic symbol sham key ordering)'
+ );
+ }
+});
+
+test('maxStringLength', function (t) {
+ t['throws'](
+ function () { inspect('', { maxStringLength: -1 }); },
+ TypeError,
+ 'maxStringLength must be >= 0, or Infinity, not negative'
+ );
+
+ var str = repeat('a', 1e8);
+
+ t.equal(
+ inspect([str], { maxStringLength: 10 }),
+ '[ \'aaaaaaaaaa\'... 99999990 more characters ]',
+ 'maxStringLength option limits output'
+ );
+
+ t.equal(
+ inspect(['f'], { maxStringLength: null }),
+ '[ \'\'... 1 more character ]',
+ 'maxStringLength option accepts `null`'
+ );
+
+ t.equal(
+ inspect([str], { maxStringLength: Infinity }),
+ '[ \'' + str + '\' ]',
+ 'maxStringLength option accepts ∞'
+ );
+
+ t.end();
+});
+
+test('inspect options', { skip: !utilInspect.custom }, function (t) {
+ var obj = {};
+ obj[utilInspect.custom] = function () {
+ return JSON.stringify(arguments);
+ };
+ t.equal(
+ inspect(obj),
+ utilInspect(obj, { depth: 5 }),
+ 'custom symbols will use node\'s inspect'
+ );
+ t.equal(
+ inspect(obj, { depth: 2 }),
+ utilInspect(obj, { depth: 2 }),
+ 'a reduced depth will be passed to node\'s inspect'
+ );
+ t.equal(
+ inspect({ d1: obj }, { depth: 3 }),
+ '{ d1: ' + utilInspect(obj, { depth: 2 }) + ' }',
+ 'deep objects will receive a reduced depth'
+ );
+ t.equal(
+ inspect({ d1: obj }, { depth: 1 }),
+ '{ d1: [Object] }',
+ 'unlike nodejs inspect, customInspect will not be used once the depth is exceeded.'
+ );
+ t.end();
+});
+
+test('inspect URL', { skip: typeof URL === 'undefined' }, function (t) {
+ t.match(
+ inspect(new URL('https://nodejs.org')),
+ /nodejs\.org/, // Different environments stringify it differently
+ 'url can be inspected'
+ );
+ t.end();
+});
diff --git a/backend/node_modules/object-inspect/test/lowbyte.js b/backend/node_modules/object-inspect/test/lowbyte.js
new file mode 100644
index 0000000..68a345d
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/lowbyte.js
@@ -0,0 +1,12 @@
+var test = require('tape');
+var inspect = require('../');
+
+var obj = { x: 'a\r\nb', y: '\x05! \x1f \x12' };
+
+test('interpolate low bytes', function (t) {
+ t.plan(1);
+ t.equal(
+ inspect(obj),
+ "{ x: 'a\\r\\nb', y: '\\x05! \\x1F \\x12' }"
+ );
+});
diff --git a/backend/node_modules/object-inspect/test/number.js b/backend/node_modules/object-inspect/test/number.js
new file mode 100644
index 0000000..8f287e8
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/number.js
@@ -0,0 +1,58 @@
+var test = require('tape');
+var v = require('es-value-fixtures');
+var forEach = require('for-each');
+
+var inspect = require('../');
+
+test('negative zero', function (t) {
+ t.equal(inspect(0), '0', 'inspect(0) === "0"');
+ t.equal(inspect(Object(0)), 'Object(0)', 'inspect(Object(0)) === "Object(0)"');
+
+ t.equal(inspect(-0), '-0', 'inspect(-0) === "-0"');
+ t.equal(inspect(Object(-0)), 'Object(-0)', 'inspect(Object(-0)) === "Object(-0)"');
+
+ t.end();
+});
+
+test('numericSeparator', function (t) {
+ forEach(v.nonBooleans, function (nonBoolean) {
+ t['throws'](
+ function () { inspect(true, { numericSeparator: nonBoolean }); },
+ TypeError,
+ inspect(nonBoolean) + ' is not a boolean'
+ );
+ });
+
+ t.test('3 digit numbers', function (st) {
+ var failed = false;
+ for (var i = -999; i < 1000; i += 1) {
+ var actual = inspect(i);
+ var actualSepNo = inspect(i, { numericSeparator: false });
+ var actualSepYes = inspect(i, { numericSeparator: true });
+ var expected = String(i);
+ if (actual !== expected || actualSepNo !== expected || actualSepYes !== expected) {
+ failed = true;
+ t.equal(actual, expected);
+ t.equal(actualSepNo, expected);
+ t.equal(actualSepYes, expected);
+ }
+ }
+
+ st.notOk(failed, 'all 3 digit numbers passed');
+
+ st.end();
+ });
+
+ t.equal(inspect(1e3), '1000', '1000');
+ t.equal(inspect(1e3, { numericSeparator: false }), '1000', '1000, numericSeparator false');
+ t.equal(inspect(1e3, { numericSeparator: true }), '1_000', '1000, numericSeparator true');
+ t.equal(inspect(-1e3), '-1000', '-1000');
+ t.equal(inspect(-1e3, { numericSeparator: false }), '-1000', '-1000, numericSeparator false');
+ t.equal(inspect(-1e3, { numericSeparator: true }), '-1_000', '-1000, numericSeparator true');
+
+ t.equal(inspect(1234.5678, { numericSeparator: true }), '1_234.567_8', 'fractional numbers get separators');
+ t.equal(inspect(1234.56789, { numericSeparator: true }), '1_234.567_89', 'fractional numbers get separators');
+ t.equal(inspect(1234.567891, { numericSeparator: true }), '1_234.567_891', 'fractional numbers get separators');
+
+ t.end();
+});
diff --git a/backend/node_modules/object-inspect/test/quoteStyle.js b/backend/node_modules/object-inspect/test/quoteStyle.js
new file mode 100644
index 0000000..ae4d734
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/quoteStyle.js
@@ -0,0 +1,17 @@
+'use strict';
+
+var inspect = require('../');
+var test = require('tape');
+
+test('quoteStyle option', function (t) {
+ t['throws'](function () { inspect(null, { quoteStyle: false }); }, 'false is not a valid value');
+ t['throws'](function () { inspect(null, { quoteStyle: true }); }, 'true is not a valid value');
+ t['throws'](function () { inspect(null, { quoteStyle: '' }); }, '"" is not a valid value');
+ t['throws'](function () { inspect(null, { quoteStyle: {} }); }, '{} is not a valid value');
+ t['throws'](function () { inspect(null, { quoteStyle: [] }); }, '[] is not a valid value');
+ t['throws'](function () { inspect(null, { quoteStyle: 42 }); }, '42 is not a valid value');
+ t['throws'](function () { inspect(null, { quoteStyle: NaN }); }, 'NaN is not a valid value');
+ t['throws'](function () { inspect(null, { quoteStyle: function () {} }); }, 'a function is not a valid value');
+
+ t.end();
+});
diff --git a/backend/node_modules/object-inspect/test/toStringTag.js b/backend/node_modules/object-inspect/test/toStringTag.js
new file mode 100644
index 0000000..95f8270
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/toStringTag.js
@@ -0,0 +1,40 @@
+'use strict';
+
+var test = require('tape');
+var hasToStringTag = require('has-tostringtag/shams')();
+
+var inspect = require('../');
+
+test('Symbol.toStringTag', { skip: !hasToStringTag }, function (t) {
+ t.plan(4);
+
+ var obj = { a: 1 };
+ t.equal(inspect(obj), '{ a: 1 }', 'object, no Symbol.toStringTag');
+
+ obj[Symbol.toStringTag] = 'foo';
+ t.equal(inspect(obj), '{ a: 1, [Symbol(Symbol.toStringTag)]: \'foo\' }', 'object with Symbol.toStringTag');
+
+ t.test('null objects', { skip: 'toString' in { __proto__: null } }, function (st) {
+ st.plan(2);
+
+ var dict = { __proto__: null, a: 1 };
+ st.equal(inspect(dict), '[Object: null prototype] { a: 1 }', 'null object with Symbol.toStringTag');
+
+ dict[Symbol.toStringTag] = 'Dict';
+ st.equal(inspect(dict), '[Dict: null prototype] { a: 1, [Symbol(Symbol.toStringTag)]: \'Dict\' }', 'null object with Symbol.toStringTag');
+ });
+
+ t.test('instances', function (st) {
+ st.plan(4);
+
+ function C() {
+ this.a = 1;
+ }
+ st.equal(Object.prototype.toString.call(new C()), '[object Object]', 'instance, no toStringTag, Object.prototype.toString');
+ st.equal(inspect(new C()), 'C { a: 1 }', 'instance, no toStringTag');
+
+ C.prototype[Symbol.toStringTag] = 'Class!';
+ st.equal(Object.prototype.toString.call(new C()), '[object Class!]', 'instance, with toStringTag, Object.prototype.toString');
+ st.equal(inspect(new C()), 'C [Class!] { a: 1 }', 'instance, with toStringTag');
+ });
+});
diff --git a/backend/node_modules/object-inspect/test/undef.js b/backend/node_modules/object-inspect/test/undef.js
new file mode 100644
index 0000000..e3f4961
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/undef.js
@@ -0,0 +1,12 @@
+var test = require('tape');
+var inspect = require('../');
+
+var obj = { a: 1, b: [3, 4, undefined, null], c: undefined, d: null };
+
+test('undef and null', function (t) {
+ t.plan(1);
+ t.equal(
+ inspect(obj),
+ '{ a: 1, b: [ 3, 4, undefined, null ], c: undefined, d: null }'
+ );
+});
diff --git a/backend/node_modules/object-inspect/test/values.js b/backend/node_modules/object-inspect/test/values.js
new file mode 100644
index 0000000..4832b9f
--- /dev/null
+++ b/backend/node_modules/object-inspect/test/values.js
@@ -0,0 +1,211 @@
+'use strict';
+
+var inspect = require('../');
+var test = require('tape');
+var mockProperty = require('mock-property');
+var hasSymbols = require('has-symbols/shams')();
+var hasToStringTag = require('has-tostringtag/shams')();
+
+test('values', function (t) {
+ t.plan(1);
+ var obj = [{}, [], { 'a-b': 5 }];
+ t.equal(inspect(obj), '[ {}, [], { \'a-b\': 5 } ]');
+});
+
+test('arrays with properties', function (t) {
+ t.plan(1);
+ var arr = [3];
+ arr.foo = 'bar';
+ var obj = [1, 2, arr];
+ obj.baz = 'quux';
+ obj.index = -1;
+ t.equal(inspect(obj), '[ 1, 2, [ 3, foo: \'bar\' ], baz: \'quux\', index: -1 ]');
+});
+
+test('has', function (t) {
+ t.plan(1);
+ t.teardown(mockProperty(Object.prototype, 'hasOwnProperty', { 'delete': true }));
+
+ t.equal(inspect({ a: 1, b: 2 }), '{ a: 1, b: 2 }');
+});
+
+test('indexOf seen', function (t) {
+ t.plan(1);
+ var xs = [1, 2, 3, {}];
+ xs.push(xs);
+
+ var seen = [];
+ seen.indexOf = undefined;
+
+ t.equal(
+ inspect(xs, {}, 0, seen),
+ '[ 1, 2, 3, {}, [Circular] ]'
+ );
+});
+
+test('seen seen', function (t) {
+ t.plan(1);
+ var xs = [1, 2, 3];
+
+ var seen = [xs];
+ seen.indexOf = undefined;
+
+ t.equal(
+ inspect(xs, {}, 0, seen),
+ '[Circular]'
+ );
+});
+
+test('seen seen seen', function (t) {
+ t.plan(1);
+ var xs = [1, 2, 3];
+
+ var seen = [5, xs];
+ seen.indexOf = undefined;
+
+ t.equal(
+ inspect(xs, {}, 0, seen),
+ '[Circular]'
+ );
+});
+
+test('symbols', { skip: !hasSymbols }, function (t) {
+ var sym = Symbol('foo');
+ t.equal(inspect(sym), 'Symbol(foo)', 'Symbol("foo") should be "Symbol(foo)"');
+ if (typeof sym === 'symbol') {
+ // Symbol shams are incapable of differentiating boxed from unboxed symbols
+ t.equal(inspect(Object(sym)), 'Object(Symbol(foo))', 'Object(Symbol("foo")) should be "Object(Symbol(foo))"');
+ }
+
+ t.test('toStringTag', { skip: !hasToStringTag }, function (st) {
+ st.plan(1);
+
+ var faker = {};
+ faker[Symbol.toStringTag] = 'Symbol';
+ st.equal(
+ inspect(faker),
+ '{ [Symbol(Symbol.toStringTag)]: \'Symbol\' }',
+ 'object lying about being a Symbol inspects as an object'
+ );
+ });
+
+ t.end();
+});
+
+test('Map', { skip: typeof Map !== 'function' }, function (t) {
+ var map = new Map();
+ map.set({ a: 1 }, ['b']);
+ map.set(3, NaN);
+ var expectedString = 'Map (2) {' + inspect({ a: 1 }) + ' => ' + inspect(['b']) + ', 3 => NaN}';
+ t.equal(inspect(map), expectedString, 'new Map([[{ a: 1 }, ["b"]], [3, NaN]]) should show size and contents');
+ t.equal(inspect(new Map()), 'Map (0) {}', 'empty Map should show as empty');
+
+ var nestedMap = new Map();
+ nestedMap.set(nestedMap, map);
+ t.equal(inspect(nestedMap), 'Map (1) {[Circular] => ' + expectedString + '}', 'Map containing a Map should work');
+
+ t.end();
+});
+
+test('WeakMap', { skip: typeof WeakMap !== 'function' }, function (t) {
+ var map = new WeakMap();
+ map.set({ a: 1 }, ['b']);
+ var expectedString = 'WeakMap { ? }';
+ t.equal(inspect(map), expectedString, 'new WeakMap([[{ a: 1 }, ["b"]]]) should not show size or contents');
+ t.equal(inspect(new WeakMap()), 'WeakMap { ? }', 'empty WeakMap should not show as empty');
+
+ t.end();
+});
+
+test('Set', { skip: typeof Set !== 'function' }, function (t) {
+ var set = new Set();
+ set.add({ a: 1 });
+ set.add(['b']);
+ var expectedString = 'Set (2) {' + inspect({ a: 1 }) + ', ' + inspect(['b']) + '}';
+ t.equal(inspect(set), expectedString, 'new Set([{ a: 1 }, ["b"]]) should show size and contents');
+ t.equal(inspect(new Set()), 'Set (0) {}', 'empty Set should show as empty');
+
+ var nestedSet = new Set();
+ nestedSet.add(set);
+ nestedSet.add(nestedSet);
+ t.equal(inspect(nestedSet), 'Set (2) {' + expectedString + ', [Circular]}', 'Set containing a Set should work');
+
+ t.end();
+});
+
+test('WeakSet', { skip: typeof WeakSet !== 'function' }, function (t) {
+ var map = new WeakSet();
+ map.add({ a: 1 });
+ var expectedString = 'WeakSet { ? }';
+ t.equal(inspect(map), expectedString, 'new WeakSet([{ a: 1 }]) should not show size or contents');
+ t.equal(inspect(new WeakSet()), 'WeakSet { ? }', 'empty WeakSet should not show as empty');
+
+ t.end();
+});
+
+test('WeakRef', { skip: typeof WeakRef !== 'function' }, function (t) {
+ var ref = new WeakRef({ a: 1 });
+ var expectedString = 'WeakRef { ? }';
+ t.equal(inspect(ref), expectedString, 'new WeakRef({ a: 1 }) should not show contents');
+
+ t.end();
+});
+
+test('FinalizationRegistry', { skip: typeof FinalizationRegistry !== 'function' }, function (t) {
+ var registry = new FinalizationRegistry(function () {});
+ var expectedString = 'FinalizationRegistry [FinalizationRegistry] {}';
+ t.equal(inspect(registry), expectedString, 'new FinalizationRegistry(function () {}) should work normallys');
+
+ t.end();
+});
+
+test('Strings', function (t) {
+ var str = 'abc';
+
+ t.equal(inspect(str), "'" + str + "'", 'primitive string shows as such');
+ t.equal(inspect(str, { quoteStyle: 'single' }), "'" + str + "'", 'primitive string shows as such, single quoted');
+ t.equal(inspect(str, { quoteStyle: 'double' }), '"' + str + '"', 'primitive string shows as such, double quoted');
+ t.equal(inspect(Object(str)), 'Object(' + inspect(str) + ')', 'String object shows as such');
+ t.equal(inspect(Object(str), { quoteStyle: 'single' }), 'Object(' + inspect(str, { quoteStyle: 'single' }) + ')', 'String object shows as such, single quoted');
+ t.equal(inspect(Object(str), { quoteStyle: 'double' }), 'Object(' + inspect(str, { quoteStyle: 'double' }) + ')', 'String object shows as such, double quoted');
+
+ t.end();
+});
+
+test('Numbers', function (t) {
+ var num = 42;
+
+ t.equal(inspect(num), String(num), 'primitive number shows as such');
+ t.equal(inspect(Object(num)), 'Object(' + inspect(num) + ')', 'Number object shows as such');
+
+ t.end();
+});
+
+test('Booleans', function (t) {
+ t.equal(inspect(true), String(true), 'primitive true shows as such');
+ t.equal(inspect(Object(true)), 'Object(' + inspect(true) + ')', 'Boolean object true shows as such');
+
+ t.equal(inspect(false), String(false), 'primitive false shows as such');
+ t.equal(inspect(Object(false)), 'Object(' + inspect(false) + ')', 'Boolean false object shows as such');
+
+ t.end();
+});
+
+test('Date', function (t) {
+ var now = new Date();
+ t.equal(inspect(now), String(now), 'Date shows properly');
+ t.equal(inspect(new Date(NaN)), 'Invalid Date', 'Invalid Date shows properly');
+
+ t.end();
+});
+
+test('RegExps', function (t) {
+ t.equal(inspect(/a/g), '/a/g', 'regex shows properly');
+ t.equal(inspect(new RegExp('abc', 'i')), '/abc/i', 'new RegExp shows properly');
+
+ var match = 'abc abc'.match(/[ab]+/);
+ delete match.groups; // for node < 10
+ t.equal(inspect(match), '[ \'ab\', index: 0, input: \'abc abc\' ]', 'RegExp match object shows properly');
+
+ t.end();
+});
diff --git a/backend/node_modules/object-inspect/util.inspect.js b/backend/node_modules/object-inspect/util.inspect.js
new file mode 100644
index 0000000..7784fab
--- /dev/null
+++ b/backend/node_modules/object-inspect/util.inspect.js
@@ -0,0 +1 @@
+module.exports = require('util').inspect;