From b70ecd933100d8193612a750136d21ae08b5c93e Mon Sep 17 00:00:00 2001 From: Mayel de Borniol Date: Fri, 13 Sep 2024 09:30:17 +0100 Subject: [PATCH] example only --- CHANGELOG.md | 434 - Dockerfile | 30 - LICENSE.md | 8 - NOTES.md | 5 - README.md | 527 -- config/config.exs | 32 - config/dev.exs | 1 - config/test.exs | 35 - docker-compose.yaml | 45 - lib/mix/tasks/papertrail/install.ex | 51 - lib/paper_trail.ex | 167 - lib/paper_trail/multi.ex | 213 - lib/paper_trail/repo_client.ex | 15 - lib/paper_trail/serializer.ex | 196 - lib/paper_trail/version_queries.ex | 120 - lib/version.ex | 93 - mix.exs | 72 - mix.lock | 16 - package-lock.json | 7780 ----------------- package.json | 53 - .../migrations/20160619190935_add_users.exs | 14 - .../20160619190936_add_versions.exs | 22 - .../20160619190937_add_simple_companies.exs | 19 - .../20160619190938_add_simple_people.exs | 21 - .../20170319190938_add_strict_companies.exs | 24 - .../20170319190940_add_strict_people.exs | 23 - ...niqueness_constraint_to_companies_name.exs | 8 - .../20170525133833_create_uuid_products.exs | 12 - .../20170525142546_create_admins.exs | 12 - .../20170525142612_create_versions.exs | 22 - .../20170525142613_create_items.exs | 25 - .../20201130190530_create_projects.exs | 12 - .../20201130190545_create_people.exs | 12 - .../20201130190555_create_versions.exs | 22 - scripts/test.sh | 9 - setup-database.sh | 28 - .../bang_functions_simple_mode_test.exs | 1154 --- .../bang_functions_strict_mode_test.exs | 1054 --- test/paper_trail/base_test.exs | 721 -- test/paper_trail/strict_mode_test.exs | 513 -- test/support/multi_tenant_helper.ex | 42 - test/support/repos.ex | 30 - test/support/simple_models.ex | 147 - test/support/strict_models.ex | 86 - test/support/uuid_models.ex | 90 - test/support/uuid_with_custom_name_models.ex | 36 - test/test_helper.exs | 17 - test/uuid/uuid_test.exs | 94 - test/uuid/uuid_with_custom_name_test.exs | 48 - test/version/paper_trail_version_test.exs | 174 - test/version/version_queries_test.exs | 198 - 51 files changed, 14582 deletions(-) delete mode 100644 CHANGELOG.md delete mode 100644 Dockerfile delete mode 100644 LICENSE.md delete mode 100644 NOTES.md delete mode 100644 README.md delete mode 100644 config/config.exs delete mode 100644 config/dev.exs delete mode 100644 config/test.exs delete mode 100644 docker-compose.yaml delete mode 100644 lib/mix/tasks/papertrail/install.ex delete mode 100644 lib/paper_trail.ex delete mode 100644 lib/paper_trail/multi.ex delete mode 100644 lib/paper_trail/repo_client.ex delete mode 100644 lib/paper_trail/serializer.ex delete mode 100644 lib/paper_trail/version_queries.ex delete mode 100644 lib/version.ex delete mode 100644 mix.exs delete mode 100644 mix.lock delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 priv/repo/migrations/20160619190935_add_users.exs delete mode 100644 priv/repo/migrations/20160619190936_add_versions.exs delete mode 100644 priv/repo/migrations/20160619190937_add_simple_companies.exs delete mode 100644 priv/repo/migrations/20160619190938_add_simple_people.exs delete mode 100644 priv/repo/migrations/20170319190938_add_strict_companies.exs delete mode 100644 priv/repo/migrations/20170319190940_add_strict_people.exs delete mode 100644 priv/repo/migrations/20200827222744_add_uniqueness_constraint_to_companies_name.exs delete mode 100644 priv/uuid_repo/migrations/20170525133833_create_uuid_products.exs delete mode 100644 priv/uuid_repo/migrations/20170525142546_create_admins.exs delete mode 100644 priv/uuid_repo/migrations/20170525142612_create_versions.exs delete mode 100644 priv/uuid_repo/migrations/20170525142613_create_items.exs delete mode 100644 priv/uuid_with_custom_name_repo/migrations/20201130190530_create_projects.exs delete mode 100644 priv/uuid_with_custom_name_repo/migrations/20201130190545_create_people.exs delete mode 100644 priv/uuid_with_custom_name_repo/migrations/20201130190555_create_versions.exs delete mode 100644 scripts/test.sh delete mode 100644 setup-database.sh delete mode 100644 test/paper_trail/bang_functions_simple_mode_test.exs delete mode 100644 test/paper_trail/bang_functions_strict_mode_test.exs delete mode 100644 test/paper_trail/base_test.exs delete mode 100644 test/paper_trail/strict_mode_test.exs delete mode 100644 test/support/multi_tenant_helper.ex delete mode 100644 test/support/repos.ex delete mode 100644 test/support/simple_models.ex delete mode 100644 test/support/strict_models.ex delete mode 100644 test/support/uuid_models.ex delete mode 100644 test/support/uuid_with_custom_name_models.ex delete mode 100644 test/test_helper.exs delete mode 100644 test/uuid/uuid_test.exs delete mode 100644 test/uuid/uuid_with_custom_name_test.exs delete mode 100644 test/version/paper_trail_version_test.exs delete mode 100644 test/version/version_queries_test.exs diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index de7282f9..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,434 +0,0 @@ -### Changelog - -All notable changes to this project will be documented in this file. Dates are displayed in UTC. - -Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - -#### [v1.0.0](https://github.com/izelnakri/paper_trail/compare/v0.14.5...v1.0.0) - -#### [v0.14.5](https://github.com/izelnakri/paper_trail/compare/v0.14.4...v0.14.5) - -> 20 December 2022 - -- Release 0.14.5 [`919ecf0`](https://github.com/izelnakri/paper_trail/commit/919ecf0df42a24a858f1a4316506b28af98ea700) -- Update hex packages [`c025cf7`](https://github.com/izelnakri/paper_trail/commit/c025cf7fc61300ce483c58d7b07002d1bcadee4c) - -#### [v0.14.4](https://github.com/izelnakri/paper_trail/compare/v0.14.3...v0.14.4) - -> 20 December 2022 - -- Bump actions/cache from 3.0.7 to 3.0.8 [`#194`](https://github.com/izelnakri/paper_trail/pull/194) -- Bump docker/setup-buildx-action from 1.7.0 to 2.0.0 [`#179`](https://github.com/izelnakri/paper_trail/pull/179) -- Bump docker/login-action from 1.14.1 to 2.0.0 [`#180`](https://github.com/izelnakri/paper_trail/pull/180) -- Bump docker/build-push-action from 2.10.0 to 3.1.1 [`#188`](https://github.com/izelnakri/paper_trail/pull/188) -- Bump actions/cache from 3.0.2 to 3.0.7 [`#190`](https://github.com/izelnakri/paper_trail/pull/190) -- Bump docker/build-push-action from 2.9.0 to 2.10.0 [`#172`](https://github.com/izelnakri/paper_trail/pull/172) -- Bump actions/cache from 2.1.7 to 3.0.2 [`#176`](https://github.com/izelnakri/paper_trail/pull/176) -- Bump docker/setup-buildx-action from 1.6.0 to 1.7.0 [`#177`](https://github.com/izelnakri/paper_trail/pull/177) -- Bump actions/checkout from 2.4.0 to 3 [`#169`](https://github.com/izelnakri/paper_trail/pull/169) -- Bump node-fetch from 2.6.1 to 2.6.7 [`#171`](https://github.com/izelnakri/paper_trail/pull/171) -- Bump docker/login-action from 1.12.0 to 1.14.1 [`#170`](https://github.com/izelnakri/paper_trail/pull/170) -- Bump docker/build-push-action from 2.7.0 to 2.9.0 [`#165`](https://github.com/izelnakri/paper_trail/pull/165) -- Bump handlebars from 4.7.6 to 4.7.7 [`#166`](https://github.com/izelnakri/paper_trail/pull/166) -- Bump docker/login-action from 1.10.0 to 1.12.0 [`#163`](https://github.com/izelnakri/paper_trail/pull/163) -- Bump actions/checkout from 2.3.5 to 2.4.0 [`#161`](https://github.com/izelnakri/paper_trail/pull/161) -- Bump actions/cache from 2.1.6 to 2.1.7 [`#162`](https://github.com/izelnakri/paper_trail/pull/162) -- Release 0.14.4 [`065280c`](https://github.com/izelnakri/paper_trail/commit/065280cf09b70bb2c37d4748cdd841543a9706b4) -- update npm pkgs for release [`122ade7`](https://github.com/izelnakri/paper_trail/commit/122ade72ec1d9f48f5bf59778aa4f85caf7c3691) -- upgrade npm dev packages [`c9d9642`](https://github.com/izelnakri/paper_trail/commit/c9d96422ff0d40290c02fcf50aaf739a9f22c0ea) -- Bump actions/checkout from 2.3.4 to 2.3.5 [`235d825`](https://github.com/izelnakri/paper_trail/commit/235d8251c30b6fc4e9f46a7366f6dc5b5156f8a0) - -#### [v0.14.3](https://github.com/izelnakri/paper_trail/compare/v0.14.2...v0.14.3) - -> 10 October 2021 - -- avoid compile-time dependency with Application.get_env at macro [`#158`](https://github.com/izelnakri/paper_trail/pull/158) -- Bump docker/build-push-action from 2.6.1 to 2.7.0 [`#156`](https://github.com/izelnakri/paper_trail/pull/156) -- Bump docker/setup-buildx-action from 1.5.1 to 1.6.0 [`#157`](https://github.com/izelnakri/paper_trail/pull/157) -- Bump docker/login-action from 1.9.0 to 1.10.0 [`#149`](https://github.com/izelnakri/paper_trail/pull/149) -- Bump docker/build-push-action from 2.4.0 to 2.6.1 [`#151`](https://github.com/izelnakri/paper_trail/pull/151) -- Bump docker/setup-buildx-action from 1.3.0 to 1.5.1 [`#155`](https://github.com/izelnakri/paper_trail/pull/155) -- Release 0.14.3 [`8da7909`](https://github.com/izelnakri/paper_trail/commit/8da7909052d9cf1ff9c2435fa683d4866aedbd98) -- update dependencies & formatting [`cbc6e60`](https://github.com/izelnakri/paper_trail/commit/cbc6e605293f1a7ad387ac6dee8e525bcbc8b63e) -- .env fix [`643d4a8`](https://github.com/izelnakri/paper_trail/commit/643d4a8f0a28a52527407471f02741e624290d6d) - -#### [v0.14.2](https://github.com/izelnakri/paper_trail/compare/v0.14.1...v0.14.2) - -> 30 May 2021 - -- Bump docker/setup-buildx-action from 1 to 1.3.0 [`#142`](https://github.com/izelnakri/paper_trail/pull/142) -- Bump docker/login-action from 1 to 1.9.0 [`#143`](https://github.com/izelnakri/paper_trail/pull/143) -- Bump actions/cache from 2.1.5 to 2.1.6 [`#147`](https://github.com/izelnakri/paper_trail/pull/147) -- Bump actions/checkout from 2 to 2.3.4 [`#144`](https://github.com/izelnakri/paper_trail/pull/144) -- Bump docker/build-push-action from 2 to 2.4.0 [`#145`](https://github.com/izelnakri/paper_trail/pull/145) -- add insert_or_update/2 and insert_or_update!/2 [`#141`](https://github.com/izelnakri/paper_trail/pull/141) -- Release 0.14.2 [`b5ae44f`](https://github.com/izelnakri/paper_trail/commit/b5ae44fec4cd69871215ee7f886e326d390baad2) -- update npm deps [`8374c53`](https://github.com/izelnakri/paper_trail/commit/8374c53177ff24e9705b576ae9c1b83c75976a89) -- add Christoph Schmatzler to contributors [`64a1321`](https://github.com/izelnakri/paper_trail/commit/64a13212bffe7ba0445b533964d86d732f88a620) -- write npm test script with .env [`17cb2b0`](https://github.com/izelnakri/paper_trail/commit/17cb2b023d6f5f74c6b132d998e68084f88bc59f) -- make options list always from predefined value [`d27007f`](https://github.com/izelnakri/paper_trail/commit/d27007f309b5e357dd1674e7f87126db4514d03d) -- add Don Barlow to contributors [`80c7a87`](https://github.com/izelnakri/paper_trail/commit/80c7a87f1151f022bf0822f16a7ce8932ecf3ca2) - -#### [v0.14.1](https://github.com/izelnakri/paper_trail/compare/v0.14.0...v0.14.1) - -> 25 May 2021 - -- Release 0.14.1 [`df7225c`](https://github.com/izelnakri/paper_trail/commit/df7225c87d785eff51f886bd89de2b4546fff171) -- deps updated [`5d43f87`](https://github.com/izelnakri/paper_trail/commit/5d43f87f720bccbe11bc06a3048336d3c17573fd) - -#### [v0.14.0](https://github.com/izelnakri/paper_trail/compare/v0.13.0...v0.14.0) - -> 25 May 2021 - -- Use model_key for insert in strict mode and add initial_version_key [`#146`](https://github.com/izelnakri/paper_trail/pull/146) -- Bump actions/cache from v2.1.4 to v2.1.5 [`#138`](https://github.com/izelnakri/paper_trail/pull/138) -- Release 0.14.0 [`a17cafe`](https://github.com/izelnakri/paper_trail/commit/a17cafeb3e6f62163db8a610fe16c3325eaaaf5b) -- add initial_version_key [`0465900`](https://github.com/izelnakri/paper_trail/commit/046590026ec50605f3cabfaf48354b8acbf969a9) -- use model_key for insert in strict mode [`2e08df2`](https://github.com/izelnakri/paper_trail/commit/2e08df2d36580818e08f106d5b56c8962fbf610a) - -#### [v0.13.0](https://github.com/izelnakri/paper_trail/compare/v0.12.4...v0.13.0) - -> 24 April 2021 - -- (chore): add support for using PaperTrail.Multi directly [`#140`](https://github.com/izelnakri/paper_trail/pull/140) -- Release 0.13.0 [`c7980bd`](https://github.com/izelnakri/paper_trail/commit/c7980bd9273cacd1ac16c1f6b852b3766d147e0f) -- add Francisco Correia to credits [`2eb8d7e`](https://github.com/izelnakri/paper_trail/commit/2eb8d7e331a43ff55cb361efeaebf09ba5f4f90c) - -#### [v0.12.4](https://github.com/izelnakri/paper_trail/compare/v0.12.3...v0.12.4) - -> 20 April 2021 - -- fix dialyzer warnings [`#139`](https://github.com/izelnakri/paper_trail/pull/139) -- Release 0.12.4 [`7849f37`](https://github.com/izelnakri/paper_trail/commit/7849f37b0ac2df782e258b64d8b841711474b4ec) - -#### [v0.12.3](https://github.com/izelnakri/paper_trail/compare/v0.12.2...v0.12.3) - -> 26 March 2021 - -- update ecto & ecto-sql [`#136`](https://github.com/izelnakri/paper_trail/pull/136) -- Release 0.12.3 [`5ca99ef`](https://github.com/izelnakri/paper_trail/commit/5ca99efc8f7e0112374c225dcfb827407b1961b3) - -#### [v0.12.2](https://github.com/izelnakri/paper_trail/compare/v0.12.1...v0.12.2) - -> 26 March 2021 - -- fix: typespecs [`#135`](https://github.com/izelnakri/paper_trail/pull/135) -- Bump actions/cache from v2 to v2.1.4 [`#130`](https://github.com/izelnakri/paper_trail/pull/130) -- Release 0.12.2 [`4a39e05`](https://github.com/izelnakri/paper_trail/commit/4a39e0542eed46a46aa641037dd4e2192f14888e) -- update release-it [`149fa89`](https://github.com/izelnakri/paper_trail/commit/149fa897c475d29faf9081cbe10a7db9d2602efd) -- format lib/paper_trail/version_queries.ex [`f9b881c`](https://github.com/izelnakri/paper_trail/commit/f9b881c49a177a97aae7c72542a4bc1b20a6b0c3) - -#### [v0.12.1](https://github.com/izelnakri/paper_trail/compare/v0.12.0...v0.12.1) - -> 30 January 2021 - -- fix for setting embed to nil [`#129`](https://github.com/izelnakri/paper_trail/pull/129) -- Add ELixir Format Checker [`#126`](https://github.com/izelnakri/paper_trail/pull/126) -- Release 0.12.1 [`2b409f1`](https://github.com/izelnakri/paper_trail/commit/2b409f1829fdb678d92ed1789a6439a99a4e2e25) -- upgrade @j-ulrich/release-it-regex-bumper [`719b375`](https://github.com/izelnakri/paper_trail/commit/719b37591d1ea3c70c57d6efb31c296446ecbc55) -- containerize $ mix format [`fd9463d`](https://github.com/izelnakri/paper_trail/commit/fd9463d4df5a114c881da9a3e400f0246d1b9adc) - -#### [v0.12.0](https://github.com/izelnakri/paper_trail/compare/v0.11.3...v0.12.0) - -> 18 December 2020 - -- Support Ecto Embed [`#112`](https://github.com/izelnakri/paper_trail/pull/112) -- Refactor Duplicated Code [`#124`](https://github.com/izelnakri/paper_trail/pull/124) -- Enable capture_log to make test output readable [`#123`](https://github.com/izelnakri/paper_trail/pull/123) -- Run Formatter [`#122`](https://github.com/izelnakri/paper_trail/pull/122) -- Fix Dialyzer Specs [`#120`](https://github.com/izelnakri/paper_trail/pull/120) -- Release 0.12.0 [`5ab6bf1`](https://github.com/izelnakri/paper_trail/commit/5ab6bf1eb0bf1c43b91470201b8ce101d8f790d5) -- add .dockerignore [`58ab072`](https://github.com/izelnakri/paper_trail/commit/58ab072abfe2865a760608eb4b4764cf34ccf9e3) - -#### [v0.11.3](https://github.com/izelnakri/paper_trail/compare/v0.11.2...v0.11.3) - -> 8 December 2020 - -- Release 0.11.3 [`4704bd2`](https://github.com/izelnakri/paper_trail/commit/4704bd268612cb089f3e276c6629a419a9405fa9) -- changelog is now date desc sorted [`65f625d`](https://github.com/izelnakri/paper_trail/commit/65f625dcaa140846d550c644adae8e91d0843e9a) - -#### [v0.11.2](https://github.com/izelnakri/paper_trail/compare/v0.11.1...v0.11.2) - -> 7 December 2020 - -- Release 0.11.2 [`f3dbed3`](https://github.com/izelnakri/paper_trail/commit/f3dbed309eb92652f4e2b798523394dc6fb5ec06) -- @release-it-regex-bumper trial [`704d6e2`](https://github.com/izelnakri/paper_trail/commit/704d6e290a2d682ae88321432eb5f784004cbcaa) -- Release 0.11.1 [`8c8c29a`](https://github.com/izelnakri/paper_trail/commit/8c8c29ac4a133a5d7073d5f4554b7271e7db5c87) - -#### [v0.11.1](https://github.com/izelnakri/paper_trail/compare/v0.9.0...v0.11.1) - -> 6 December 2020 - -- github docker registry support [`#119`](https://github.com/izelnakri/paper_trail/pull/119) -- initial github-actions test [`#118`](https://github.com/izelnakri/paper_trail/pull/118) -- Allow to configure Originator Field Options [`#115`](https://github.com/izelnakri/paper_trail/pull/115) -- Misc doc changes [`#117`](https://github.com/izelnakri/paper_trail/pull/117) -- Bump ecto_sql from 3.4.5 to 3.5.3 [`#116`](https://github.com/izelnakri/paper_trail/pull/116) -- Bump postgrex from 0.15.6 to 0.15.7 [`#113`](https://github.com/izelnakri/paper_trail/pull/113) -- Dump fields using Ecto when serializing changes [`#83`](https://github.com/izelnakri/paper_trail/pull/83) -- Release 0.11.1 [`0962491`](https://github.com/izelnakri/paper_trail/commit/096249125ea5d43741e4b29ff28f2935288959bb) -- release-it added [`3c7666c`](https://github.com/izelnakri/paper_trail/commit/3c7666cb50c5641f77028f82bde3e28364cd06a9) -- v0.11.0 release [`957a4bd`](https://github.com/izelnakri/paper_trail/commit/957a4bdf671ab75f8d3157329eb613d66a6464cf) -- CI fix & last contributors added to README.md [`e73107c`](https://github.com/izelnakri/paper_trail/commit/e73107c5cabb4e9d60642b4d7a73be759d535517) -- v0.10.1 release elixir 1.11 support & rm warning [`f0981b9`](https://github.com/izelnakri/paper_trail/commit/f0981b9897412dacec05893eff1cc25f5d8bc56d) -- v0.10.0 release PaperTrail.Serializer & deps up [`4787177`](https://github.com/izelnakri/paper_trail/commit/47871776902b3e3f9030b1721aa83d2da52453ff) -- mix.lock update after deps upgrade [`97a875c`](https://github.com/izelnakri/paper_trail/commit/97a875ca48afcd70fec6bb8f3a4a17da09223844) -- add last contributors to README [`675d502`](https://github.com/izelnakri/paper_trail/commit/675d5022549790b064c629016b6b278db46240fc) -- v0.9.0 flexible %PaperTrail.Version[:inserted_at] [`5108680`](https://github.com/izelnakri/paper_trail/commit/5108680ce9b1740c4b1e82923255d62099239084) - -#### [v0.9.0](https://github.com/izelnakri/paper_trail/compare/v0.8.4...v0.9.0) - -> 1 October 2020 - -- Bump postgrex from 0.15.3 to 0.15.6 [`#107`](https://github.com/izelnakri/paper_trail/pull/107) -- Make Version schema's timestamps type configurable [`#108`](https://github.com/izelnakri/paper_trail/pull/108) -- add support for ecto options in insert and insert! functions [`#102`](https://github.com/izelnakri/paper_trail/pull/102) -- Require ex_doc dependency only for ":docs". [`#101`](https://github.com/izelnakri/paper_trail/pull/101) -- Support :returning option in update [`#95`](https://github.com/izelnakri/paper_trail/pull/95) -- Update installation version in README.md [`#90`](https://github.com/izelnakri/paper_trail/pull/90) -- Bump ecto_sql from 3.4.2 to 3.4.3 [`#81`](https://github.com/izelnakri/paper_trail/pull/81) -- Bump ecto from 3.4.1 to 3.4.2 [`#80`](https://github.com/izelnakri/paper_trail/pull/80) -- Bump ecto_sql from 3.4.1 to 3.4.2 [`#78`](https://github.com/izelnakri/paper_trail/pull/78) -- Bump ecto from 3.4.0 to 3.4.1 [`#79`](https://github.com/izelnakri/paper_trail/pull/79) -- Allow named operations[model_key and version_key] on Ecto.Multi [`#75`](https://github.com/izelnakri/paper_trail/pull/75) -- Bump ecto from 3.3.0 to 3.3.3 [`#68`](https://github.com/izelnakri/paper_trail/pull/68) -- Make it compatible with mariadb [`#71`](https://github.com/izelnakri/paper_trail/pull/71) -- Require postgrex and jason only for dev and test [`#70`](https://github.com/izelnakri/paper_trail/pull/70) -- v0.9.0 flexible %PaperTrail.Version[:inserted_at] [`ac87558`](https://github.com/izelnakri/paper_trail/commit/ac8755804f8fce7a9a9d383d6db4183dc5835ce7) -- version_test tests now has utc_datetime fixtures [`551b6f6`](https://github.com/izelnakri/paper_trail/commit/551b6f6cc95dc66aa0b804221b68f043692805c1) -- v0.8.8 added docs [`d2bb0cb`](https://github.com/izelnakri/paper_trail/commit/d2bb0cb370a80c7d39550ad5f604491fbe1c38c3) -- v0.8.8 release PaperTrail.insert :ecto_options [`48a1639`](https://github.com/izelnakri/paper_trail/commit/48a163969d2a95ecd9a2aac9c4d0db3c568348a0) -- base_test.exs test_helpers fixed [`51d2e2f`](https://github.com/izelnakri/paper_trail/commit/51d2e2fa523524139ffa793cace7ac5759b3ac2f) -- renamed test/paper_trail/base_tests.exs to test/paper_trail/base_test.exs [`291b267`](https://github.com/izelnakri/paper_trail/commit/291b2672b64ce64799e9d61f271559192b1e8a80) -- tests fixed [`f3958fc`](https://github.com/izelnakri/paper_trail/commit/f3958fcefaef78794f9494372f59c1c080fe4052) -- v0.8.7 :model_key & :version_key for PaperTrail.insert and pkg upgrades [`5d8a6f6`](https://github.com/izelnakri/paper_trail/commit/5d8a6f637bf1479d5eb1579c3683a02451f860e1) -- bugfix for :model_key and :version_key feature: [`058a84f`](https://github.com/izelnakri/paper_trail/commit/058a84fe2fe05585fdee1e799829a9d23c28fb64) -- further runtime optimization for CI [`98522f0`](https://github.com/izelnakri/paper_trail/commit/98522f0b038e5b03173377939323a896839f60a3) -- backend docker service renamed to paper_trail [`92616f0`](https://github.com/izelnakri/paper_trail/commit/92616f0d7ab4e34d6c944fdf6cfe45f28cc252a6) -- single step CI optimization [`1215660`](https://github.com/izelnakri/paper_trail/commit/1215660c9cbdd5991c186b5927ceac974d454b3d) -- highly optimized elixir container builds [`0717b9c`](https://github.com/izelnakri/paper_trail/commit/0717b9c3c482993b413c91f9e4c7cffdedaceb79) -- trial without postgres client [`a0710a7`](https://github.com/izelnakri/paper_trail/commit/a0710a73c2fbebe1de54d270529e3fc92cfa3190) -- CI is finally fixed [`b38f59b`](https://github.com/izelnakri/paper_trail/commit/b38f59bd3f593a1d4c0b49f123c585bee1847c03) -- new test folder restructre for CI [`8984ac1`](https://github.com/izelnakri/paper_trail/commit/8984ac1c579276b0c9d11100575b2b1658892e45) -- seperating UUID tests from the test trial [`05c9560`](https://github.com/izelnakri/paper_trail/commit/05c956040dc58c69ba7c83c69c0e539e0a7b8cee) -- repo configurations on tests are now loaded lazily [`0fa068f`](https://github.com/izelnakri/paper_trail/commit/0fa068fbe7f5ce5319480f9bd68a39440bc1e2b7) -- CI test fix [`8b8f5e2`](https://github.com/izelnakri/paper_trail/commit/8b8f5e242272703b7c6cf2b1bdd9c640dba0ffe1) -- initial docker-compose based CI [`1bc34d1`](https://github.com/izelnakri/paper_trail/commit/1bc34d179c9f3f371d75a176dc9a33bd31dfc187) -- mix format run [`7c40472`](https://github.com/izelnakri/paper_trail/commit/7c4047233252b6b33f7a523fdf594692f616aa72) -- basic CI setup added [`53c2d66`](https://github.com/izelnakri/paper_trail/commit/53c2d660c988650844ccdb1c5144b22859130b8f) -- v0.8.6 postgrex dependency fix [`42b2606`](https://github.com/izelnakri/paper_trail/commit/42b26065e198b278f57f0d6bc803e93ec47e7273) -- v0.8.5 dependencies made optional [`bb6bab9`](https://github.com/izelnakri/paper_trail/commit/bb6bab95e8a73294972fc7598580ab8d3cfc3262) -- Added PaperTrail.Multi to readme along with docs update [`5563a3c`](https://github.com/izelnakri/paper_trail/commit/5563a3ca89eb5f2853c22eb8311dc4233ef6c2f1) - -#### [v0.8.4](https://github.com/izelnakri/paper_trail/compare/v0.8.3...v0.8.4) - -> 16 December 2019 - -- Ecto Multi Support Proposition [`#62`](https://github.com/izelnakri/paper_trail/pull/62) -- v0.8.4 release PaperTrail.Multi for multi manipulation and ecto upgrades [`200a1e1`](https://github.com/izelnakri/paper_trail/commit/200a1e15e5d7e7ff34758ba7d0c330852d487ca8) -- v0.8.3 PaperTrail.delete accepts changeset [`7b37739`](https://github.com/izelnakri/paper_trail/commit/7b37739781df28ec5b088cb02f998de1ba9af0c0) - -#### [v0.8.3](https://github.com/izelnakri/paper_trail/compare/v0.8.2...v0.8.3) - -> 10 September 2019 - -- Support delete with changeset [`#59`](https://github.com/izelnakri/paper_trail/pull/59) -- v0.8.3 PaperTrail.delete accepts changeset [`8199229`](https://github.com/izelnakri/paper_trail/commit/8199229044273c512c8b2c5a68982651ecb072b1) -- Changelog update [`d732341`](https://github.com/izelnakri/paper_trail/commit/d732341fbbff1ee3c7820e8d8f58602670fba88f) -- v0.8.2 docs update [`9b490ca`](https://github.com/izelnakri/paper_trail/commit/9b490ca9aa5ec6d61ab9573551cac19185786e31) - -#### [v0.8.2](https://github.com/izelnakri/paper_trail/compare/v0.8.1...v0.8.2) - -> 29 June 2019 - -- Remove repo module attribute from version_queries [`#55`](https://github.com/izelnakri/paper_trail/pull/55) -- v0.8.2 release [`060b781`](https://github.com/izelnakri/paper_trail/commit/060b781f5dde2bcb5562d53abe3c63212f10bb70) - -#### v0.8.1 - -> 2 November 2018 - -- Ecto 3.0-rc.1 support [`#51`](https://github.com/izelnakri/paper_trail/pull/51) -- Update Readme.md to the most recent version of paper_trail: 0.8 [`#47`](https://github.com/izelnakri/paper_trail/pull/47) -- get model id simply, and type check [`#42`](https://github.com/izelnakri/paper_trail/pull/42) -- Code refactor for tracking methods [`#37`](https://github.com/izelnakri/paper_trail/pull/37) -- fixed for non-regular primary key [`#40`](https://github.com/izelnakri/paper_trail/pull/40) -- warning: clauses for the same def should be grouped together [`#35`](https://github.com/izelnakri/paper_trail/pull/35) -- Add multi tenancy capabilities with ecto meta prefix [`#25`](https://github.com/izelnakri/paper_trail/pull/25) -- Add custom types for item_id and originator_id [`#20`](https://github.com/izelnakri/paper_trail/pull/20) -- Bang operations: PaperTrail.insert!, PaperTrail.update!, PaperTrail.delete! [`#13`](https://github.com/izelnakri/paper_trail/pull/13) -- Custom originator params [`#12`](https://github.com/izelnakri/paper_trail/pull/12) -- fix test warnings [`#11`](https://github.com/izelnakri/paper_trail/pull/11) -- strict_mode [`#9`](https://github.com/izelnakri/paper_trail/pull/9) -- setter_id foreign_key to strict versions [`#10`](https://github.com/izelnakri/paper_trail/pull/10) -- Support Ecto 2.1, by using utc_datetime as default [`#5`](https://github.com/izelnakri/paper_trail/pull/5) -- Adding index [`#2`](https://github.com/izelnakri/paper_trail/pull/2) -- Configurable repo module [`#1`](https://github.com/izelnakri/paper_trail/pull/1) -- v0.8.1 release + docs update [`bde413c`](https://github.com/izelnakri/paper_trail/commit/bde413ce9b3e4ec55438a3465c25e14abc4486cc) -- v0.8.0 release [`6ae2231`](https://github.com/izelnakri/paper_trail/commit/6ae22313bcb9548b1d945448b80c2ac6b719a48c) -- Updated README.md [`4cc2cc0`](https://github.com/izelnakri/paper_trail/commit/4cc2cc0dad5c6f216f669b572a5af30f113772f6) -- 0.8.0 release [`113ff97`](https://github.com/izelnakri/paper_trail/commit/113ff97d8283c80d24ca4aea53fe1d763f5ab5ac) -- STR to STRING_TEST [`9cc9a02`](https://github.com/izelnakri/paper_trail/commit/9cc9a0251e0cd6b587456fd9d0d6731b94a67d45) -- test with env [`e1867b1`](https://github.com/izelnakri/paper_trail/commit/e1867b18e401a0a9eca04b8585186efdc05a464f) -- a missing migration added with updated docs [`14ee50e`](https://github.com/izelnakri/paper_trail/commit/14ee50e5cd44244adcf784152f7d1090f465d065) -- 0.7.9 release [`b89a480`](https://github.com/izelnakri/paper_trail/commit/b89a480ed926b52aa53121d2e4cb44e726e937d9) -- fixed for non-regular primary key with test [`2ced4a2`](https://github.com/izelnakri/paper_trail/commit/2ced4a299577531363a880be40bcdee16ab08959) -- 0.7.8 release elixir formatter [`ea407dc`](https://github.com/izelnakri/paper_trail/commit/ea407dc2228941e6502af5be1a63b59498827199) -- dried up condition on changeset_data [`c6c1e7d`](https://github.com/izelnakri/paper_trail/commit/c6c1e7dac84b4474722b4e0af21260be6287d9ad) -- Update README.md [`c2b09c0`](https://github.com/izelnakri/paper_trail/commit/c2b09c04f09ee150cbdc0a912f035d3f00d5cd0c) -- wrong build display removed [`d7fe6dd`](https://github.com/izelnakri/paper_trail/commit/d7fe6dd3e592d632f1924adc119d2c344a942fb7) -- Fix elixir warning [`63c0127`](https://github.com/izelnakri/paper_trail/commit/63c0127bb6c54fe2246867e2fc6b15d0d216775b) -- 0.7.7 release [`0e978bf`](https://github.com/izelnakri/paper_trail/commit/0e978bf6e066802bcbbe1dc0a546a0c92d6b2052) -- longer line made more readable [`7b7537a`](https://github.com/izelnakri/paper_trail/commit/7b7537a98dd607b85a7ae57aef5da94df0bc2311) -- fixed not running tests [`d80ac23`](https://github.com/izelnakri/paper_trail/commit/d80ac23115ef8f0ec6e4702970190c4dc3124eb8) -- Refactor to use not create variables in the version schema module [`6279d19`](https://github.com/izelnakri/paper_trail/commit/6279d19be5f96cc3dbffc902a8ad89327e0b1fb7) -- Replace use of module attribute to reference repo, originator, and repo_client, was causing problem not getting the correct config value [`55e6666`](https://github.com/izelnakri/paper_trail/commit/55e6666ebcc1762292c6f604cee3834e2e07f5c0) -- Documentation update [`549fd9d`](https://github.com/izelnakri/paper_trail/commit/549fd9d5f9a0bd7a9b1754d7c969ba31059e0596) -- v0.7.6 release = multi-tenancy support [`b95c1d9`](https://github.com/izelnakri/paper_trail/commit/b95c1d97a5beb879dc00abc8ff58043cf64cfd5f) -- Add some additional assertions in tests [`1359026`](https://github.com/izelnakri/paper_trail/commit/13590263c048cace75508091758bc063ffbc7d78) -- Propagate options to repo actions in delete functions [`64231d7`](https://github.com/izelnakri/paper_trail/commit/64231d72c87165a42715e3a7915b5af0c605d074) -- Add final refactor to example app test files [`ead9cc6`](https://github.com/izelnakri/paper_trail/commit/ead9cc6120b5350cb9f4f8535f19c15360cbb233) -- Remove changeset_helper.exs and query_helper.exs from example/test/support [`0604631`](https://github.com/izelnakri/paper_trail/commit/0604631e10330645473d0d5dbce0fbcadb2df2a4) -- Add dreamingechoes to credits section in README.md [`c50eef8`](https://github.com/izelnakri/paper_trail/commit/c50eef8398d774cb8dad6461d367324577e08067) -- Add multi tenancy tests in version_queries_test file [`5f51b7e`](https://github.com/izelnakri/paper_trail/commit/5f51b7e2c30a637b523822f144f068294e93a15a) -- Add some changes to the previous code added in paper_trail_version_test file [`7414a66`](https://github.com/izelnakri/paper_trail/commit/7414a66fd118acfe6e2e9fcebef25ce61366b410) -- Add multi tenancy tests in paper_trail_version_test file [`b914cfd`](https://github.com/izelnakri/paper_trail/commit/b914cfdfde3207050becdcf6f87a7c145376f65e) -- Require new support helper in lib test_helper file [`cf638d6`](https://github.com/izelnakri/paper_trail/commit/cf638d6924853931f54ccf043ec97025f9fbcc11) -- Add changes in tests to use new definition of Version functions with new params [`8a42220`](https://github.com/izelnakri/paper_trail/commit/8a422209bbed8844fd1a65a5d44999112ef94324) -- Add new functions for multi tenancy in lib/version.ex [`a1ffd44`](https://github.com/izelnakri/paper_trail/commit/a1ffd4454d044d1b43c8feca2beaae46ff1bfc63) -- Add new count functions for multi tenancy in test support models [`8a2dfb5`](https://github.com/izelnakri/paper_trail/commit/8a2dfb5b069106c9de2fa54af69caae80d4d1ebe) -- Add tests for multi tenant in bang_functions_strict_mode_test [`95b3312`](https://github.com/izelnakri/paper_trail/commit/95b33124921dd3637d675b52e3b31647b5eb8138) -- Add tests for multi tenant in bang_functions_simple_mode_test [`d01fedf`](https://github.com/izelnakri/paper_trail/commit/d01fedffe336193eb645975991ee176a921b878b) -- Add new multi_tenant_person_test file [`96ecccd`](https://github.com/izelnakri/paper_trail/commit/96ecccd4ec7186f0a3cd556c81f39315d3927240) -- Add new multi_tenant_company_test file [`4975d2b`](https://github.com/izelnakri/paper_trail/commit/4975d2bb3b89e075c34821ea52365da27e850330) -- Add refactor in example person test in order to use helpers [`77b669c`](https://github.com/izelnakri/paper_trail/commit/77b669cde726bf2fae18fa6a8c2725aeccfac2da) -- Add refactor in example company test in order to use helpers [`9bd355f`](https://github.com/izelnakri/paper_trail/commit/9bd355f2ec1adbe3a7d56fbf3e27161ac50ba59d) -- Require new support helpers in example test_helper file [`2c4aa4d`](https://github.com/izelnakri/paper_trail/commit/2c4aa4d100c80b5d79a6be99dbea4dd98ee552d8) -- Add new ChangesetHelper module into example test support folder [`c62150e`](https://github.com/izelnakri/paper_trail/commit/c62150edf40b050f603812b6c636644af13eea29) -- Add new QueryHelper module into example test support folder [`f2519db`](https://github.com/izelnakri/paper_trail/commit/f2519dbe638f10da9aa470fb892a17856d18d6f3) -- Add new MultiTenantHelper module into lib test support folder [`a50177a`](https://github.com/izelnakri/paper_trail/commit/a50177ad1cb7900fbf0e1a5bc1cd2a690c50570e) -- Add new MultiTenantHelper module into example test support folder [`696a6c3`](https://github.com/izelnakri/paper_trail/commit/696a6c3e06365f886af981ed7f253872b054345f) -- Add some multi tenancy documentation on README.md [`4ef58a0`](https://github.com/izelnakri/paper_trail/commit/4ef58a01d92f9c1797dde59ff6fa3d3ccfd2f854) -- Change param names in defdelegates for better readability [`83a0d7a`](https://github.com/izelnakri/paper_trail/commit/83a0d7a3716049f54446bcd33c201ba721979fe1) -- Remove result type from PaperTrail.VersionQueries and specifies the value on the spec [`ad52cb4`](https://github.com/izelnakri/paper_trail/commit/ad52cb49ff83f1cae9809251a87b59fbc77d74c9) -- Add new definitions for all the functions in PaperTrail.VersionQueries [`e71b3d4`](https://github.com/izelnakri/paper_trail/commit/e71b3d403800a8f94376dc244925d4a98fbd7d41) -- Add new definition for version_query function to merge options into the Ecto query [`59f34c4`](https://github.com/izelnakri/paper_trail/commit/59f34c420debd9f695dd7a7885413616a4fbbd1f) -- Add defdelegate in PaperTrail module to PaperTrail.VersionQueries [`d4d8e40`](https://github.com/izelnakri/paper_trail/commit/d4d8e4094ad0de11f47343ce703a843cdd509f0e) -- Add patter matching case for nil prefix on add_prefix function [`61737dc`](https://github.com/izelnakri/paper_trail/commit/61737dc895f628809f38ef3ad0c4f093a9f680b3) -- Add default value for the new :prefix option on the functions definitions [`c27bbc8`](https://github.com/izelnakri/paper_trail/commit/c27bbc8dde468f5c00271a2df8f877b36c7d9ab5) -- Add new add_prefix function in paper_trail module [`e9f28cb`](https://github.com/izelnakri/paper_trail/commit/e9f28cbd61f670b9a6dd9a06fa6d496df0a76e1d) -- change of a fix [`968a0b0`](https://github.com/izelnakri/paper_trail/commit/968a0b07fef4da2fb10847cf30225d8c7e38e7c1) -- code_evals to fix the ci [`aa80590`](https://github.com/izelnakri/paper_trail/commit/aa80590756542b8f4ba936aba418fc39ef5fa91a) -- run mix test in trace mode to fix CI [`5fd9ed6`](https://github.com/izelnakri/paper_trail/commit/5fd9ed6d0025aa2fb48c995a9d427574a342f465) -- last ci fix [`61956d7`](https://github.com/izelnakri/paper_trail/commit/61956d7ee18555a2e6077d663f7d4cade8a80c26) -- another change for tests [`67b56c4`](https://github.com/izelnakri/paper_trail/commit/67b56c4756106a6a86c1aba8a0cdc3c06755f1b5) -- another test for CI [`6b76c91`](https://github.com/izelnakri/paper_trail/commit/6b76c91853531ca094b5656c108484dcc3cfec31) -- small fix for CI [`83a3c08`](https://github.com/izelnakri/paper_trail/commit/83a3c0856b0160c8ff950f3684160f70e93f6d5e) -- circle fix with new docs [`d3ceb52`](https://github.com/izelnakri/paper_trail/commit/d3ceb52bd403c48b10ee005c2ea33794d0b44c4c) -- credits and version update [`0bfcdbf`](https://github.com/izelnakri/paper_trail/commit/0bfcdbf0bb9ef5eabbd12e8a4e302a2ce9621a87) -- Test papertail versions using UUID columns [`ae834f9`](https://github.com/izelnakri/paper_trail/commit/ae834f922ee5c06f252616213038abc70b8c73d2) -- Fixed belongs_to field type [`e22cba9`](https://github.com/izelnakri/paper_trail/commit/e22cba9bb3ca4cda18420feee0a099d730890dea) -- Added custom types for item_id and originator_id [`8efa0f7`](https://github.com/izelnakri/paper_trail/commit/8efa0f7488c3dbbd71c6612a9707e6ba48ed7bd6) -- documentation fix [`da69fc5`](https://github.com/izelnakri/paper_trail/commit/da69fc5b367583a5c4396451a3f34c56598c4bb4) -- 0.7.4 release Version.first() && Version.last() [`eb51f4f`](https://github.com/izelnakri/paper_trail/commit/eb51f4f8ecc87c8e0ab83db6582d9faf15ebb8fc) -- example tests are fixed [`9852dc3`](https://github.com/izelnakri/paper_trail/commit/9852dc3ee2e567510a88f8d0694c58f324c27ec4) -- 0.7.3 release [`c0cdd38`](https://github.com/izelnakri/paper_trail/commit/c0cdd38cd2b126c2bb4f52d0aca55e17c0729baa) -- small bugfix for strict inserts with no changeset! [`e91d982`](https://github.com/izelnakri/paper_trail/commit/e91d98217a75ae1855736c302c5ef053fa5a05ef) -- small README fixes [`850a252`](https://github.com/izelnakri/paper_trail/commit/850a252b88d15cf900a97aa464e61c49123988d8) -- 0.7.2 release [`9be8e9a`](https://github.com/izelnakri/paper_trail/commit/9be8e9ac2f5d8166660f623f37525eb2d8488faf) -- 0.7.2 release [`b5e1e16`](https://github.com/izelnakri/paper_trail/commit/b5e1e1670272058932a12643975614a25b99af19) -- README updated [`d40508a`](https://github.com/izelnakri/paper_trail/commit/d40508a587559d898c0f7e96fdc900b60a4355d8) -- bang functions completely tested on strict mode [`cc855d7`](https://github.com/izelnakri/paper_trail/commit/cc855d742cbc82b6ed59b0745f0a63ccc6c9ea2f) -- bang function tests for simple mode is complete [`0e75a7d`](https://github.com/izelnakri/paper_trail/commit/0e75a7d133603f377fdaeaa961390d010df6eeb8) -- better structure for tests [`cf30124`](https://github.com/izelnakri/paper_trail/commit/cf30124b705a46f3ba2ef4c13d8c7061292ab982) -- initial hashbang designs [`9b01c35`](https://github.com/izelnakri/paper_trail/commit/9b01c35695506670823d3a53b573b06521cab721) -- initial design [`88387b9`](https://github.com/izelnakri/paper_trail/commit/88387b90c218be17a87b562b636a1816bb20219a) -- 0.7.0 release [`21fdd16`](https://github.com/izelnakri/paper_trail/commit/21fdd160e029b80d3ed55130f8a7d01aa902eebf) -- tests updated for originator params feature [`7e243a0`](https://github.com/izelnakri/paper_trail/commit/7e243a01dace8921abd727aa302226f1f6a917f6) -- logic is complete detailed tests are missing [`9d9ba81`](https://github.com/izelnakri/paper_trail/commit/9d9ba81b00acd536d671c5d80f010eaaa7d3585d) -- small changes [`c825c1b`](https://github.com/izelnakri/paper_trail/commit/c825c1bf77e8b3744f415c6721dbf7ff0abfcc79) -- credits README fix [`2c08bce`](https://github.com/izelnakri/paper_trail/commit/2c08bce67fc0b973f1c5ef0e5bee7b2797a5c85c) -- 0.6.3 release and README credits. [`fba3c64`](https://github.com/izelnakri/paper_trail/commit/fba3c646d0b549b9a1a78b7fe1bf99d0c35bfccb) -- small counter test fix [`4f77c9f`](https://github.com/izelnakri/paper_trail/commit/4f77c9f531fd18cb495284605e9270bf615baded) -- v0.6.2 release small adjustments [`5607376`](https://github.com/izelnakri/paper_trail/commit/5607376183455884d871311cbfcf60c5a6bd635b) -- 0.6.1 release small mix build bugfix [`066f287`](https://github.com/izelnakri/paper_trail/commit/066f287cd6cafaf740224ada95791e5e3c968c0d) -- 0.6.0 release [`7f56090`](https://github.com/izelnakri/paper_trail/commit/7f56090e346d764ab842d6aa4f0d8a95fbb146e0) -- small documentation edits [`22d283b`](https://github.com/izelnakri/paper_trail/commit/22d283b44d846a1303d63512b898062340451c47) -- documentation changes [`00eae33`](https://github.com/izelnakri/paper_trail/commit/00eae336b266b4d54a29b1ed51182637c2ac6d22) -- setter renamed to originator [`0129c68`](https://github.com/izelnakri/paper_trail/commit/0129c681baf576493093a8928545e47de4d579bb) -- major documentation change [`8e424cf`](https://github.com/izelnakri/paper_trail/commit/8e424cfcee54daaa1bb761f977154871ed4bad1c) -- move comment below [`d2284a2`](https://github.com/izelnakri/paper_trail/commit/d2284a22f9446f0b070a7d7b354c41050165cf69) -- ongoing documentation [`c7230f7`](https://github.com/izelnakri/paper_trail/commit/c7230f7dc271d85e57494cecd3f1b5c9a58fab53) -- some updates [`2fb204b`](https://github.com/izelnakri/paper_trail/commit/2fb204b740f228648c583537bae76dcf68ddec3f) -- setter_id logic complete with tests [`340d2fe`](https://github.com/izelnakri/paper_trail/commit/340d2febb8f888be13a089a393ff3f3f9a10ae90) -- setter foreign_key initial design [`762f7d5`](https://github.com/izelnakri/paper_trail/commit/762f7d52e36351b0ecb9cb8d61eeb4c5fc677a58) -- documentation update [`303ab1f`](https://github.com/izelnakri/paper_trail/commit/303ab1fed37f60454646c89b30236f1f17637d06) -- test and documentation update [`8a851b4`](https://github.com/izelnakri/paper_trail/commit/8a851b43195aec9b275ea480b767d5358071c9b4) -- sourced_by changed to set_by, paper trail errors now match Ecto.Repo [`1b2cb7b`](https://github.com/izelnakri/paper_trail/commit/1b2cb7b4a503a3958ea112c7b641427c26128c2f) -- simple paper trail tests done for stict_mode [`711404d`](https://github.com/izelnakri/paper_trail/commit/711404dc6c0dbf9c67b6b7ccaa3754776714392e) -- tests are now more readable [`263ebe9`](https://github.com/izelnakri/paper_trail/commit/263ebe9663151043d53f044e7de8e9f6487d6d16) -- strict_mode tests added [`750a305`](https://github.com/izelnakri/paper_trail/commit/750a3054381ffd85ee2fa587d357b5397ab31f41) -- coming soon strict mode [`b821fd8`](https://github.com/izelnakri/paper_trail/commit/b821fd8de3439c9534f8911649d9584a8f98ce6e) -- strict mode sketch written, tests are adjusted to changeless misses strict mode [`7aff1db`](https://github.com/izelnakri/paper_trail/commit/7aff1db7bc319bfa37cd4954c6efc5fb59be39cd) -- ex_doc upgrade [`5cd097c`](https://github.com/izelnakri/paper_trail/commit/5cd097c4d407f68886e82c4b563fc6c94b73ac43) -- 0.5.3 release [`627f051`](https://github.com/izelnakri/paper_trail/commit/627f051839be7dcf334dcc282950ec453189f834) -- better dependency versioning [`0a18c05`](https://github.com/izelnakri/paper_trail/commit/0a18c050da52e0ca3ce366c88b700ee6c88e1681) -- small readme adjustments [`fb32b33`](https://github.com/izelnakri/paper_trail/commit/fb32b33054b114f340e6becc883c99ee912fbc53) -- build server fix [`259eb4f`](https://github.com/izelnakri/paper_trail/commit/259eb4f3ab00a7a6678df8b5657036c0e6ea2d7a) -- badges added to README [`5124f78`](https://github.com/izelnakri/paper_trail/commit/5124f78a7049b0ffe9eadb414ab4f00086d5e338) -- 0.5.2 release updated dependencies [`c2c466c`](https://github.com/izelnakri/paper_trail/commit/c2c466c1fd473b457a0ada09cfd7a14ab1aaa232) -- 0.5.0 release [`f4be348`](https://github.com/izelnakri/paper_trail/commit/f4be348def0fe407384e4c9e278d22b79cd2c041) -- slight changes to README [`b7d71b8`](https://github.com/izelnakri/paper_trail/commit/b7d71b85f6d97bf0794bb58fc7c39cd3d7ea5bb5) -- version bump [`f6497f0`](https://github.com/izelnakri/paper_trail/commit/f6497f0042ca5e94752c95a8ffd25eade1252441) -- Update installation steps [`b0e22ed`](https://github.com/izelnakri/paper_trail/commit/b0e22ed1c43be7fde73c0f022c81d61fbdd24012) -- Prevent memory leak by using String.to_existing_atom [`c00678b`](https://github.com/izelnakri/paper_trail/commit/c00678b0952f20cf2c49feed4e15d4ec4aa81817) -- Configurable Repo module [`ce91e32`](https://github.com/izelnakri/paper_trail/commit/ce91e32a872481b5b44316ec33ccb985958d786e) -- migration added for examples on test [`d3bde7b`](https://github.com/izelnakri/paper_trail/commit/d3bde7b4541c66618a56a69d169b717cb79d339c) -- small remove [`b66c52a`](https://github.com/izelnakri/paper_trail/commit/b66c52a13b3f3085d4aa641391bf67c4db6a3c8f) -- travis removed for circleci [`f3050f4`](https://github.com/izelnakri/paper_trail/commit/f3050f4ce21f11284e9526884a1d9aa43b65042d) -- travis elixir version up [`77e1f4c`](https://github.com/izelnakri/paper_trail/commit/77e1f4c7f14c2334708df01d6976a77349d595bb) -- otp version downgrade for travis [`99e5ca3`](https://github.com/izelnakri/paper_trail/commit/99e5ca32bf9bdc368fd58936ad1cd4ec31729f80) -- travis CI added [`de258a8`](https://github.com/izelnakri/paper_trail/commit/de258a8759a87905c38a0e31378daad4ee3fc3f8) -- small fixes to README [`fe9ac0d`](https://github.com/izelnakri/paper_trail/commit/fe9ac0d811f00e7e0ea085dd4e6106f3bb06c48d) -- small documentation changes [`1af92b9`](https://github.com/izelnakri/paper_trail/commit/1af92b90d1920abf6dcb1374aa2c9c4255c47c6d) -- upgrade to 1.6 [`44e18ad`](https://github.com/izelnakri/paper_trail/commit/44e18ad1a6968a7cce3c223ac552d765cb8dc36c) -- DOCUMENTATION UPDATE [`b9d3ab4`](https://github.com/izelnakri/paper_trail/commit/b9d3ab4a5cd41d9de620c44c1a844185004544cc) -- better dependency versioning [`1feba56`](https://github.com/izelnakri/paper_trail/commit/1feba5630fbf9aa1855421a95b0972091cfdf516) -- doc and version upgrade [`1bc99da`](https://github.com/izelnakri/paper_trail/commit/1bc99daa57efee88754d9968b7e1235c1d9eef10) -- small doc update [`24b2e66`](https://github.com/izelnakri/paper_trail/commit/24b2e66418a10c68684d817134259b07e65953b1) -- small doc update [`b354254`](https://github.com/izelnakri/paper_trail/commit/b354254d99a4b7c9ec11e771c2a1e103dd80d9a5) -- small doc update [`46a8032`](https://github.com/izelnakri/paper_trail/commit/46a8032ccc42562eb6d18a95c8bf995fb509d60c) -- documentation update [`cb56f40`](https://github.com/izelnakri/paper_trail/commit/cb56f40fcf7f88cf0c190fc9f93fe8cc2974ed0f) -- PaperTrail.get_current\1 added [`dc6eb6d`](https://github.com/izelnakri/paper_trail/commit/dc6eb6d24468c971002ec0cfae508f84edee66f1) -- version bump [`324efe5`](https://github.com/izelnakri/paper_trail/commit/324efe522b9101a10ad0365a448ad8e94ac4d919) -- documentation updated for the library [`ef33f2c`](https://github.com/izelnakri/paper_trail/commit/ef33f2c007a815a331cb56b5ab043eb761b1c4b8) -- PaperTrail.VersionQueries module with first good tests [`68a60ee`](https://github.com/izelnakri/paper_trail/commit/68a60ee17d9f6f8decc124c7401d301d6c4b31c1) -- paper trail version queries test setup [`8d02e47`](https://github.com/izelnakri/paper_trail/commit/8d02e4702c1bb8c3d5b0643f3a983380da86b15e) -- some compiler warnings removed [`29de7ca`](https://github.com/izelnakri/paper_trail/commit/29de7ca4075c9ee3d35f1702616371e552bd993b) -- examples tests are ported to the actual library directory [`64e8c7e`](https://github.com/izelnakri/paper_trail/commit/64e8c7e8f8b537ba83135ae57276e16763adaf41) -- removed unused code thanks to the compiler [`b4246e2`](https://github.com/izelnakri/paper_trail/commit/b4246e2118689e7707d7022f41f4e298dcd24341) -- initial tests on actual paper_trail directory similar to the ones on examples [`05ddb6c`](https://github.com/izelnakri/paper_trail/commit/05ddb6cd6635be2f7ff91c0f11c18e42b3517a91) -- small ect odeprecation refactoring [`9e2b340`](https://github.com/izelnakri/paper_trail/commit/9e2b3408bf4f9e61aff3a8d7c35abd486dd281bc) -- paper trail alpha version complete with example tests [`c605bf5`](https://github.com/izelnakri/paper_trail/commit/c605bf5138ba78c885ee38b993771fa466764802) -- person tests continues [`cdd6f87`](https://github.com/izelnakri/paper_trail/commit/cdd6f870dd53c2db23075c748fb771edb778db13) -- PaperTrail.insert passes now fully with model relationships, it is also tested [`5218fac`](https://github.com/izelnakri/paper_trail/commit/5218fac296862322918a0353084531438c334c6c) -- small fix [`5033788`](https://github.com/izelnakri/paper_trail/commit/5033788a253c2ddd1c77c9f1229eeade9badce07) -- smarter insert tracking now support models which has belongs to [`b3c2a24`](https://github.com/izelnakri/paper_trail/commit/b3c2a2456f463c5ebbfa6e1f7319d377337d7002) -- person test added [`6875067`](https://github.com/izelnakri/paper_trail/commit/687506796159b65b4b0461c45cd85e65dc12d0af) -- model refactors [`bf290b5`](https://github.com/izelnakri/paper_trail/commit/bf290b56d67a3a505296b73e3f62a9ea42710e7d) -- awesome create update and destroy test cases finished for company modal with paper_trail [`42b5853`](https://github.com/izelnakri/paper_trail/commit/42b585330b553912f3b9bcf99f576f6e69d3bf09) -- awesome update test case added [`bcd30f7`](https://github.com/izelnakri/paper_trail/commit/bcd30f74459c608d29426ad013006ed52a3acbc8) -- version bump [`2973269`](https://github.com/izelnakri/paper_trail/commit/29732691c62447fa0a243844474b4c63f1fc6697) -- originator field removed from the paper_trail library [`9b7ba24`](https://github.com/izelnakri/paper_trail/commit/9b7ba248031b93673ccfa1e5eeb4667bb4e389c4) -- first very good test [`fadb54a`](https://github.com/izelnakri/paper_trail/commit/fadb54ac842e656f41432281ddd70563a6d4d9e7) -- final configuration ready for tests [`f2f5d59`](https://github.com/izelnakri/paper_trail/commit/f2f5d59b1de1e47a3a8d769470f98410e2860caa) -- test environment configuration [`1fbccdd`](https://github.com/izelnakri/paper_trail/commit/1fbccddf7dd0dd37646901ef67f5e738c97e1bb9) -- making library work with any Elixir project [`ddef880`](https://github.com/izelnakri/paper_trail/commit/ddef880588d6e8a28c9753cfbb6cc821f3452420) -- example folder added [`95a0ec7`](https://github.com/izelnakri/paper_trail/commit/95a0ec74cd2ae31f672b795e687dfc20de633a20) -- relationship added for example [`17c7a51`](https://github.com/izelnakri/paper_trail/commit/17c7a51b9cfff37198cd37b791006df5a6ffe503) -- migration files and example app created [`9fcdff4`](https://github.com/izelnakri/paper_trail/commit/9fcdff4ec082b8a5fa485ff4e50526ba997c0178) -- documentation start [`b3110d0`](https://github.com/izelnakri/paper_trail/commit/b3110d0f918a6f80403ae2ba045d16bdf6fa8a8c) -- test preparation [`471c929`](https://github.com/izelnakri/paper_trail/commit/471c9291d024e9aeffaeafeb5ad9b5597f303dde) -- some logic added [`f725ba6`](https://github.com/izelnakri/paper_trail/commit/f725ba6fc4b3453105f5353b9a85bfb76efa9fe9) -- mix task added: mix paper_trail.install [`73eb8b4`](https://github.com/izelnakri/paper_trail/commit/73eb8b4eac05ecef330f749fece023859c15bfed) -- init [`00f95dc`](https://github.com/izelnakri/paper_trail/commit/00f95dccf8e5bc88fc5953f14bdcd2bd41f8bbf3) diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index bc3ef5e3..00000000 --- a/Dockerfile +++ /dev/null @@ -1,30 +0,0 @@ -FROM "elixir:1.11.2-alpine" - -ARG MIX_ENV=dev -ENV MIX_ENV=$MIX_ENV - -WORKDIR /code/ - -RUN apk add postgresql | echo "y" | mix local.hex --if-missing && echo "y" | mix local.rebar --if-missing - -ADD ["mix.lock", "mix.exs", "/code/"] - -RUN mix deps.get && MIX_ENV=test mix deps.compile && \ - MIX_ENV=$MIX_ENV mix deps.compile - -ADD ["config", "lib", "priv", "/code/"] - -RUN MIX_ENV=$MIX_ENV mix compile - -ADD ["test", "/code/"] - -RUN MIX_ENV=test mix compile && MIX_ENV=$MIX_ENV mix compile - -ADD . /code/ - -RUN MIX_ENV=test mix compile && MIX_ENV=$MIX_ENV mix compile - -CMD ["/bin/sh"] - -# mix ecto.create -# mix ecto.migrate diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index c086cc23..00000000 --- a/LICENSE.md +++ /dev/null @@ -1,8 +0,0 @@ -The MIT License (MIT) -Copyright (c) 2016-present Izel Nakri - -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/NOTES.md b/NOTES.md deleted file mode 100644 index 12fdd8ee..00000000 --- a/NOTES.md +++ /dev/null @@ -1,5 +0,0 @@ -- PaperTrail.insert_all, update_all, delete_all -- insert_or_update, insert_or_update! -- if I ever do the merging logic keep it in mind that updated_at of the record -must be sourced from the inserted_at of the version/ -** add PaperTrail.insert!, PaperTrail.update!, PaperTrail.delete! # it shouldnt return a version, it shouldnt give errors/raise?(optional?) diff --git a/README.md b/README.md deleted file mode 100644 index 22f95c05..00000000 --- a/README.md +++ /dev/null @@ -1,527 +0,0 @@ -[![Hex Version](http://img.shields.io/hexpm/v/paper_trail.svg?style=flat)](https://hex.pm/packages/paper_trail) [![Hex docs](http://img.shields.io/badge/hex.pm-docs-green.svg?style=flat)](https://hexdocs.pm/paper_trail/PaperTrail.html) -[![Total Download](https://img.shields.io/hexpm/dt/paper_trail.svg)](https://hex.pm/packages/paper_trail) -[![License](https://img.shields.io/hexpm/l/paper_trail.svg)](https://github.com/izelnakri/paper_trail/blob/master/LICENSE) -[![Last Updated](https://img.shields.io/github/last-commit/izelnakri/paper_trail.svg)](https://github.com/izelnakri/paper_trail/commits/master) - -# Paper Trail - -Track and record all the changes in your database. Revert back to anytime in history. - -# How does it work? - -PaperTrail lets you record every change in your database in a separate database table called ```versions```. Library generates a new version record with associated data every time you run ```PaperTrail.insert/2```, ```PaperTrail.update/2``` or ```PaperTrail.delete/2``` functions. Simply these functions wrap your Repo insert, update or destroy actions in a database transaction, so if your database action fails you won't get a new version. - -PaperTrail is assailed with hundreds of test assertions for each release. Data integrity is an important aim of this project, please refer to the `strict_mode` if you want to ensure data correctness and integrity of your versions. For simpler use cases the default mode of PaperTrail should suffice. - -## Example - -```elixir -changeset = Post.changeset(%Post{}, %{ - title: "Word on the street is Elixir got its own database versioning library", - content: "You should try it now!" -}) - -PaperTrail.insert(changeset) -# => on success: -# {:ok, -# %{model: %Post{__meta__: #Ecto.Schema.Metadata<:loaded, "posts">, -# title: "Word on the street is Elixir got its own database versioning library", -# content: "You should try it now!", id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 21:42:38]}, -# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">, -# event: "insert", id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# item_changes: %{title: "Word on the street is Elixir got its own database versioning library", -# content: "You should try it now!", id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 21:42:38]}, -# item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil}}} - -# => on error(it matches Repo.insert/2): -# {:error, Ecto.Changeset, -# valid?: false>, %{}} - -post = Repo.get!(Post, 1) -edit_changeset = Post.changeset(post, %{ - title: "Elixir matures fast", - content: "Future is already here, Elixir is the next step!" -}) - -PaperTrail.update(edit_changeset) -# => on success: -# {:ok, -# %{model: %Post{__meta__: #Ecto.Schema.Metadata<:loaded, "posts">, -# title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!", -# id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 22:00:59]}, -# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">, -# event: "update", id: 2, inserted_at: ~N[2016-09-15 22:00:59], -# item_changes: %{title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!"}, -# item_id: 1, item_type: "Post", originator_id: nil, originator: nil -# meta: nil}}} - -# => on error(it matches Repo.update/2): -# {:error, Ecto.Changeset, -# valid?: false>, %{}} - -PaperTrail.get_version(post) -# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">, -# event: "update", id: 2, inserted_at: ~N[2016-09-15 22:00:59], -# item_changes: %{title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!"}, -# item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil}}} - -updated_post = Repo.get!(Post, 1) - -PaperTrail.delete(updated_post) -# => on success: -# {:ok, -# %{model: %Post{__meta__: #Ecto.Schema.Metadata<:deleted, "posts">, -# title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!", -# id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 22:00:59]}, -# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">, -# event: "delete", id: 3, inserted_at: ~N[2016-09-15 22:22:12], -# item_changes: %{title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!", -# id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 22:00:59]}, -# item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil}}} - -Repo.aggregate(Post, :count, :id) # => 0 -PaperTrail.Version.count() # => 3 -# same as Repo.aggregate(PaperTrail.Version, :count, :id) - -PaperTrail.Version.last() # returns the last version in the db by inserted_at -# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">, -# event: "delete", id: 3, inserted_at: ~N[2016-09-15 22:22:12], -# item_changes: %{"title" => "Elixir matures fast", content: "Future is already here, Elixir is the next step!", "id" => 1, -# "inserted_at" => "2016-09-15T21:42:38", -# "updated_at" => "2016-09-15T22:00:59"}, -# item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil} -``` - -PaperTrail is inspired by the ruby gem ```paper_trail```. However, unlike the ```paper_trail``` gem this library actually results in less data duplication, faster and more explicit programming model to version your record changes. - -The library source code is minimal and well tested. It is suggested to read the source code. - -## Installation - -1. Add paper_trail to your list of dependencies in `mix.exs`: - - ```elixir - def deps do - [{:paper_trail, "~> 0.14.3"}] - end - ``` - -2. Configure paper_trail to use your application repo in `config/config.exs`: - - ```elixir - config :paper_trail, repo: YourApplicationName.Repo - # if you don't specify this PaperTrail will assume your repo name is Repo - ``` - -3. Install and compile your dependency: - - ```mix deps.get && mix compile``` - -4. Run this command to generate the migration: - - ```mix papertrail.install``` - - You might want to edit the types for `:item_id` or `:originator_id` if you're - using UUID or other types for your primary keys before you execute - `mix ecto.migrate`. - -5. Run the migration: - - ```mix ecto.migrate``` - -Your application is now ready to collect some history! - -#### Does this work with phoenix? - -YES! Make sure you do the steps above. - -### %PaperTrail.Version{} fields: - -| Column Name | Type | Description | Entry Method | -| ------------- | ------- | -------------------------- | ------------------------ | -| event | String | either "insert", "update" or "delete" | Library generates | -| item_type | String | model name of the reference record | Library generates | -| item_id | configurable (Integer by default) | model id of the reference record | Library generates | -| item_changes | Map | all the changes in this version as a map | Library generates | -| originator_id | configurable (Integer by default) | foreign key reference to the creator/owner of this change | Optionally set | -| origin | String | short reference to origin(eg. worker:activity-checker, migration, admin:33) | Optionally set | -| meta | Map | any extra optional meta information about the version(eg. %{slug: "ausername", important: true}) | Optionally set | -| inserted_at | Date | inserted_at timestamp | Ecto generates | - -#### Configuring the types - -If you are using UUID or another type for your primary keys, you can configure -the PaperTrail.Version schema to use it. - -##### Example Config - -```elixir -config :paper_trail, item_type: Ecto.UUID, - originator_type: Ecto.UUID, - originator_relationship_options: [references: :uuid] -``` - -###### Example User - -```elixir -defmodule Acme.User do - use Ecto.Schema - - @primary_key {:uuid, :binary_id, autogenerate: true} - schema "users" do - field :email, :string - - timestamps() - end -``` - -Remember to edit the types accordingly in the generated migration. - -### Version origin references: - -PaperTrail records have a string field called ```origin```. ```PaperTrail.insert/2```, ```PaperTrail.update/2```, ```PaperTrail.delete/2``` functions accept a second argument to describe the origin of this version: -```elixir -PaperTrail.update(changeset, origin: "migration") -# or: -PaperTrail.update(changeset, origin: "user:1234") -# or: -PaperTrail.delete(changeset, origin: "worker:delete_inactive_users") -# or: -PaperTrail.insert(new_user_changeset, origin: "password_registration") -# or: -PaperTrail.insert(new_user_changeset, origin: "facebook_registration") -``` - -### Version originator relationships - -You can specify setter/originator relationship to paper_trail versions with ```originator``` assignment. This feature is only possible by specifying `:originator` keyword list for your application configuration: - -```elixir -# In your config/config.exs -config :paper_trail, originator: [name: :user, model: YourApp.User] -# For most applications originator should be the user since models can be updated/created/deleted by several users. -``` - -Note: You will need to recompile your deps after you have added the config for originator. - -Then originator name could be used for querying and preloading. Originator setting must be done via ```:originator``` or originator name that is defined in the paper_trail configuration: - -```elixir -user = create_user() -# all these set originator_id's for the version records -PaperTrail.insert(changeset, originator: user) -{:ok, result} = PaperTrail.update(edit_changeset, originator: user) -# or you can use :user in the params instead of :originator if this is your config: -# config :paper_trail, originator: [name: :user, model: YourApplication.User] -{:ok, result} = PaperTrail.update(edit_changeset, user: user) -result[:version] |> Repo.preload(:user) |> Map.get(:user) # we can access the user who made the change from the version thanks to originator relationships! -PaperTrail.delete(edit_changeset, user: user) -``` - -Also make sure you have the foreign-key constraint in the database and in your version migration file. - -### Storing version meta data -You might want to add some meta data that doesn't belong to ``originator`` and ``origin`` fields. Such data could be stored in one object named ```meta``` in paper_trail versions. Meta field could be passed as the second optional parameter to PaperTrail.insert/2, PaperTrail.update/2, PaperTrail.delete/2 functions: - -```elixir -company = Company.changeset(%Company{}, %{name: "Acme Inc."}) - |> PaperTrail.insert(meta: %{slug: "acme-llc"}) - -# You can also combine this with an origin: -edited_company = Company.changeset(company, %{name: "Acme LLC"}) - |> PaperTrail.update(origin: "documentation", meta: %{slug: "acme-llc"}) - -# Or even with an originator: -user = create_user() -deleted_company = Company.changeset(edited_company, %{}) - |> PaperTrail.delete(origin: "worker:github", originator: user, meta: %{slug: "acme-llc", important: true}) -``` - -# Strict mode -This is a feature more suitable for larger applications. Models can keep their version references via foreign key constraints. Therefore it would be impossible to delete the first and current version of a model if the model exists in the database, it also makes querying easier and the whole design more relational database/SQL friendly. In order to enable strict mode: - -```elixir -# In your config/config.exs -config :paper_trail, strict_mode: true -``` - -Strict mode expects tracked models to have foreign-key reference to their first_version and current_version. These columns must be named ```first_version_id```, and ```current_version_id``` in their respective model tables. A tracked model example with a migration file: - -```elixir -# In the migration file: priv/repo/migrations/create_company.exs -defmodule Repo.Migrations.CreateCompany do - def change do - create table(:companies) do - add :name, :string, null: false - add :founded_in, :date - - # null constraints are highly suggested: - add :first_version_id, references(:versions), null: false - add :current_version_id, references(:versions), null: false - - timestamps() - end - - create unique_index(:companies, [:first_version_id]) - create unique_index(:companies, [:current_version_id]) - end -end - -# In the model definition: -defmodule Company do - use Ecto.Schema - - import Ecto.Changeset - - schema "companies" do - field :name, :string - field :founded_in, :date - - belongs_to :first_version, PaperTrail.Version - belongs_to :current_version, PaperTrail.Version, on_replace: :update # on_replace: is important! - - timestamps() - end - - def changeset(struct, params \\ %{}) do - struct - |> cast(params, [:name, :founded_in]) - end -end -``` - -When you run PaperTrail.insert/2 transaction, ```first_version_id``` and ```current_version_id``` automagically gets assigned for the model. Example: - -```elixir -company = Company.changeset(%Company{}, %{name: "Acme LLC"}) |> PaperTrail.insert -# {:ok, -# %{model: %Company{__meta__: #Ecto.Schema.Metadata<:loaded, "companies">, -# name: "Acme LLC", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 21:42:38], first_version_id: 1, current_version_id: 1}, -# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">, -# event: "insert", id: 1, inserted_at: ~N[2016-09-15 22:22:12], -# item_changes: %{name: "Acme LLC", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38]}, -# originator_id: nil, origin: "unknown", meta: nil}}} -``` - -When you PaperTrail.update/2 a model, ```current_version_id``` gets updated during the transaction: - -```elixir -edited_company = Company.changeset(company, %{name: "Acme Inc."}) |> PaperTrail.update(origin: "documentation") -# {:ok, -# %{model: %Company{__meta__: #Ecto.Schema.Metadata<:loaded, "companies">, -# name: "Acme Inc.", founded_in: nil, id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 23:22:12], first_version_id: 1, current_version_id: 2}, -# version: %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">, -# event: "update", id: 2, inserted_at: ~N[2016-09-15 23:22:12], -# item_changes: %{name: "Acme Inc."}, originator_id: nil, origin: "documentation", meta: nil}}} -``` - -Additionally, you can put a null constraint on ```origin``` column, you should always put an ```origin``` reference to describe who makes the change. This is important for big applications because a model can change from many sources. - -### Bang(!) functions: - -PaperTrail also supports ```PaperTrail.insert!```, ```PaperTrail.update!```, ```PaperTrail.delete!```. Naming of these functions intentionally match ```Repo.insert!```, ```Repo.update!```, ```Repo.delete!``` functions. If PaperTrail is on strict_mode these bang functions will update the version references of the model just like the normal PaperTrail operations. - -Bang functions assume the operation will always be successful, otherwise functions will raise ```Ecto.InvalidChangesetError``` just like ```Repo.insert!```, ```Repo.update!``` and ```Repo.delete!```: - -```elixir -changeset = Post.changeset(%Post{}, %{ - title: "Word on the street is Elixir got its own database versioning library", - content: "You should try it now!" -}) - -inserted_post = PaperTrail.insert!(changeset) -# => on success: -# %Post{__meta__: #Ecto.Schema.Metadata<:loaded, "posts">, -# title: "Word on the street is Elixir got its own database versioning library", -# content: "You should try it now!", id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 21:42:38] -# } -# -# => on error raises: Ecto.InvalidChangesetError !! - -inserted_post_version = PaperTrail.get_version(inserted_post) -# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">, -# event: "insert", id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# item_changes: %{title: "Word on the street is Elixir got its own database versioning library", -# content: "You should try it now!", id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 21:42:38]}, -# item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil} - -edit_changeset = Post.changeset(inserted_post, %{ - title: "Elixir matures fast", - content: "Future is already here, Elixir is the next step!" -}) - -updated_post = PaperTrail.update!(edit_changeset) -# => on success: -# %Post{__meta__: #Ecto.Schema.Metadata<:loaded, "posts">, -# title: "Elixir matures fast", content: "Future is already here, you deserve to be awesome!", -# id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 22:00:59]} -# -# => on error raises: Ecto.InvalidChangesetError !! - -updated_post_version = PaperTrail.get_version(updated_post) -# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">, -# event: "update", id: 2, inserted_at: ~N[2016-09-15 22:00:59], -# item_changes: %{title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!"}, -# item_id: 1, item_type: "Post", originator_id: nil, originator: nil -# meta: nil} - -PaperTrail.delete!(updated_post) -# => on success: -# %Post{__meta__: #Ecto.Schema.Metadata<:deleted, "posts">, -# title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!", -# id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 22:00:59]} -# -# => on error raises: Ecto.InvalidChangesetError !! - -PaperTrail.get_version(updated_post) -# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">, -# event: "delete", id: 3, inserted_at: ~N[2016-09-15 22:22:12], -# item_changes: %{title: "Elixir matures fast", content: "Future is already here, Elixir is the next step!", -# id: 1, inserted_at: ~N[2016-09-15 21:42:38], -# updated_at: ~N[2016-09-15 22:00:59]}, -# item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil} - -Repo.aggregate(Post, :count, :id) # => 0 -PaperTrail.Version.count() # => 3 -# same as Repo.aggregate(PaperTrail.Version, :count, :id) - -PaperTrail.Version.last() # returns the last version in the db by inserted_at -# %PaperTrail.Version{__meta__: #Ecto.Schema.Metadata<:loaded, "versions">, -# event: "delete", id: 3, inserted_at: ~N[2016-09-15 22:22:12], -# item_changes: %{"title" => "Elixir matures fast", content: "Future is already here, Elixir is the next step!", "id" => 1, -# "inserted_at" => "2016-09-15T21:42:38", -# "updated_at" => "2016-09-15T22:00:59"}, -# item_id: 1, item_type: "Post", originator_id: nil, originator: nil, meta: nil} -``` - -## Working with multi tenancy - -Sometimes you have to deal with applications where you need multi tenancy capabilities, -and you want to keep tracking of the versions of your data on different schemas (PostgreSQL) -or databases (MySQL). - -You can use the [Ecto.Query prefix](https://hexdocs.pm/ecto/Ecto.Query.html#module-query-prefix) -in order to switch between different schemas/databases for your own data, so -you can specify in your changeset where to store your record. Example: - -```elixir -tenant = "tenant_id" -changeset = User.changeset(%User{}, %{first_name: "Izel", last_name: "Nakri"}) - -changeset -|> Ecto.Queryable.to_query() -|> Map.put(:prefix, tenant) -|> Repo.insert() -``` - -PaperTrail also allows you to store the `Version` entries generated by your activity in -different schemas/databases by using the value of the element `:prefix` on the options -of the functions. Example: - -```elixir -tenant = "tenant_id" - -changeset = - User.changeset(%User{}, %{first_name: "Izel", last_name: "Nakri"}) - |> Ecto.Queryable.to_query() - |> Map.put(:prefix, tenant) - -PaperTrail.insert(changeset, [prefix: tenant]) -``` - -By doing this, you're storing the new `User` entry into the schema/database -specified by the `:prefix` value (`tenant_id`). - -Note that the `User`'s changeset it's sent with the `:prefix`, so PaperTrail **will take care of the -storage of the generated `Version` entry in the desired schema/database**. Make sure -to add this prefix to your changeset before the execution of the PaperTrail function if you want to do versioning on a separate schema. - -PaperTrail can also get versions of records or models from different schemas/databases as well -by using the `:prefix` option. Example: - -```elixir -tenant = "tenant_id" -id = 1 - -PaperTrail.get_versions(User, id, [prefix: tenant]) -``` - -## Version timestamps - -PaperTrail can be configured to use `utc_datetime` or `utc_datetime_usec` for Version timestamps. - -```elixir -# In your config/config.exs -config :paper_trail, timestamps_type: :utc_datetime -``` - -Note: You will need to recompile your deps after you have added the config for timestamps. - -## Postgres datatype support - -PaperTrail serializes the version data in JSON and not all native Postgres data types are supported directly. [Composite types](https://www.postgresql.org/docs/current/rowtypes.html#:~:text=A%20composite%20type%20represents%20the,be%20of%20a%20composite%20type.) and [range types](https://www.postgresql.org/docs/current/rangetypes.html) are two examples which have no native JSON representation. - -Developers may derive their own [Jason encoder](https://hexdocs.pm/jason/Jason.Encoder.html) for such types. It should be noted that an encoder can only be defined for a native Elixir base type or `struct` once in an application and therefore there is a small risk of conflicting encoders. - -## Suggestions - -- PaperTrail.Version(s) order matter, -- Don't delete your paper_trail versions, instead you can merge them -- If you have a question or a problem, do not hesitate to create an issue or submit a pull request - -## Contributing - -``` -set -a -source .env -mix test --trace -``` - -# Credits -Many thanks to: -- [Jose Pablo Castro](https://github.com/josepablocastro) - Built the repo configuration for paper_trail -- [Harold Tafur](https://github.com/hdtafur) - Built the `:ecto_options` option for PaperTrail inserts -- [Florian Gerhardt](https://github.com/FlorianGerhardt) - Fixed rare compile errors for PaperTrail repos -- [Alex Antonov](https://github.com/asiniy) - Original inventor of the originator feature -- [Moritz Schmale](https://github.com/narrowtux) - UUID primary keys feature -- [Jason Draper](https://github.com/drapergeek) - UUID primary keys feature -- [Jonatan Männchen](https://github.com/maennchen) - Added non-regular :binary_id UUID support for originator -- [Josh Taylor](https://github.com/joshuataylor) - Maintenance and new feature suggestions -- [Mitchell Henke](https://github.com/mitchellhenke) - Fixed weird elixir compiler warnings -- [Iván González](https://github.com/dreamingechoes) - Multi tenancy feature and some minor refactors -- [Teo Choong Ping](https://github.com/seymores) - Fixed paper_trail references for newer Elixir versions -- [devvit](https://github.com/devvit) - Added non-regular primary key tracking support -- [rustamtolipov](https://github.com/rustamtolipov) - Added support for Ecto v3 -- [gabrielpra1](https://github.com/gabrielpra1) - Added enhanced support for Ecto.Changeset -- [Darren Thompson](https://github.com/DiscoStarslayer) - Added PaperTrail.Multi which makes paper trail transactions more usable -- [Harold Tafur](https://github.com/hdtafur) - Made PaperTrail.insert accept :ecto_options params(ie. upsert options) -- [Attila Szabo](https://github.com/szaboat) - Made %Version[:inserted_at] accept different ecto datetime options -- [Rafael Scheffer](https://github.com/rschef) - Built PaperTrail.Serializer that unifies %Version{} serialization -- [Kian Meng Ang](https://github.com/kianmeng) - Improved documentation -- [Francisco Correia](https://github.com/fv316) - Made PaperTrail transaction keys and ecto transactions more customizable -- [Don Barlow](https://github.com/ottobar) - Made :initial_version_key configurable for `strict_mode` inserts -- [Christoph Schmatzler](https://github.com/cschmatzler) - Built PaperTrail.insert_or_update feature -- [Izel Nakri](https://github.com/izelnakri) - The Originator of this library. See what I did there ;) - -Additional thanks to: -- [Ruby paper_trail gem](https://github.com/airblade/paper_trail) - Initial inspiration of this project. -- [Ecto](https://github.com/elixir-ecto/ecto) - For the great API. - -## License - -This source code is licensed under the MIT license. Copyright (c) 2016-present Izel Nakri. diff --git a/config/config.exs b/config/config.exs deleted file mode 100644 index 3ce9230d..00000000 --- a/config/config.exs +++ /dev/null @@ -1,32 +0,0 @@ -# This file is responsible for configuring your application -# and its dependencies with the aid of the Mix.Config module. -import Config - -# config :paper_trail, ecto_repos: [] -# This configuration is loaded before any dependency and is restricted -# to this project. If another project depends on this project, this -# file won't be loaded nor affect the parent project. For this reason, -# if you want to provide default values for your application for -# 3rd-party users, it should be done in your "mix.exs" file. - -# You can configure for your application as: -# -# config :paper_trail, key: :value -# -# And access this configuration in your application as: -# -# Application.get_env(:paper_trail, :key) -# -# Or configure a 3rd-party app: -# -# config :logger, level: :info -# - -# It is also possible to import configuration files, relative to this -# directory. For example, you can emulate configuration per environment -# by uncommenting the line below and defining dev.exs, test.exs and such. -# Configuration from the imported file will override the ones defined -# here (which is why it is important to import them last). -# - -import_config "#{Mix.env()}.exs" diff --git a/config/dev.exs b/config/dev.exs deleted file mode 100644 index becde769..00000000 --- a/config/dev.exs +++ /dev/null @@ -1 +0,0 @@ -import Config diff --git a/config/test.exs b/config/test.exs deleted file mode 100644 index 0ad80afe..00000000 --- a/config/test.exs +++ /dev/null @@ -1,35 +0,0 @@ -import Config - -config :paper_trail, - ecto_repos: [PaperTrail.Repo, PaperTrail.UUIDRepo, PaperTrail.UUIDWithCustomNameRepo] - -config :paper_trail, repo: PaperTrail.Repo, originator: [name: :user, model: User] - -config :paper_trail, PaperTrail.Repo, - adapter: Ecto.Adapters.Postgres, - username: System.get_env("PGUSER"), - password: System.get_env("PGPASSWORD"), - database: "paper_trail_test", - hostname: System.get_env("PGHOST"), - show_sensitive_data_on_connection_error: true, - poolsize: 10 - -config :paper_trail, PaperTrail.UUIDRepo, - adapter: Ecto.Adapters.Postgres, - username: System.get_env("PGUSER"), - password: System.get_env("PGPASSWORD"), - database: "paper_trail_uuid_test", - hostname: System.get_env("PGHOST"), - show_sensitive_data_on_connection_error: true, - poolsize: 10 - -config :paper_trail, PaperTrail.UUIDWithCustomNameRepo, - adapter: Ecto.Adapters.Postgres, - username: System.get_env("PGUSER"), - password: System.get_env("PGPASSWORD"), - database: "paper_trail_uuid_with_custom_name_test", - hostname: System.get_env("PGHOST"), - show_sensitive_data_on_connection_error: true, - poolsize: 10 - -config :logger, level: :warn diff --git a/docker-compose.yaml b/docker-compose.yaml deleted file mode 100644 index a78fd88e..00000000 --- a/docker-compose.yaml +++ /dev/null @@ -1,45 +0,0 @@ -services: - db: - image: postgres:16.4-alpine - environment: - PGPASSWORD: $PGPASSWORD - PGUSER: $PGUSER - POSTGRES_USER: $PGUSER - POSTGRES_PASSWORD: $PGPASSWORD - PGDATA: /var/lib/postgresql/data/pgdata - restart: always - networks: - - backend_network - volumes: - - pgdata:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${PGUSER}"] - interval: 1s - timeout: 5s - retries: 10 - paper_trail: - image: $REGISTRY/$REPO_OWNER/$DOCKER_TAG - build: - context: . - dockerfile: Dockerfile - cache_from: - - $REGISTRY/$REPO_OWNER/$DOCKER_TAG - environment: - PGUSER: $PGUSER - PGPASSWORD: $PGPASSWORD - PGPORT: 5432 - PGHOST: db - MIX_ENV: $MIX_ENV - tty: true - depends_on: - db: - condition: service_healthy - networks: - - backend_network - command: ["/bin/sh", "./setup-database.sh"] - -volumes: - pgdata: -networks: - backend_network: - driver: bridge diff --git a/lib/mix/tasks/papertrail/install.ex b/lib/mix/tasks/papertrail/install.ex deleted file mode 100644 index 82418ccc..00000000 --- a/lib/mix/tasks/papertrail/install.ex +++ /dev/null @@ -1,51 +0,0 @@ -defmodule Mix.Tasks.Papertrail.Install do - @shortdoc "generates paper_trail migration file for your database" - - use Mix.Task - - import Macro, only: [underscore: 1] - import Mix.Generator - - def run(_args) do - path = Path.relative_to("priv/repo/migrations", Mix.Project.app_path()) - file = Path.join(path, "#{timestamp()}_#{underscore(AddVersions)}.exs") - timestamps_type = Application.get_env(:paper_trail, :timestamps_type, :utc_datetime) - - create_directory(path) - - create_file(file, """ - defmodule Repo.Migrations.AddVersions do - use Ecto.Migration - - def change do - create table(:versions) do - add :event, :string, null: false, size: 10 - add :item_type, :string, null: false - add :item_id, :integer - add :item_changes, :map, null: false - add :originator_id, references(:users) # you can change :users to your own foreign key constraint - add :origin, :string, size: 50 - add :meta, :map - - # Configure timestamps type in config.ex :paper_trail :timestamps_type - add :inserted_at, :#{timestamps_type}, null: false - end - - create index(:versions, [:originator_id]) - create index(:versions, [:item_id, :item_type]) - # Uncomment if you want to add the following indexes to speed up special queries: - # create index(:versions, [:event, :item_type]) - # create index(:versions, [:item_type, :inserted_at]) - end - end - """) - end - - defp timestamp do - {{y, m, d}, {hh, mm, ss}} = :calendar.universal_time() - "#{y}#{pad(m)}#{pad(d)}#{pad(hh)}#{pad(mm)}#{pad(ss)}" - end - - defp pad(i) when i < 10, do: <> - defp pad(i), do: to_string(i) -end diff --git a/lib/paper_trail.ex b/lib/paper_trail.ex deleted file mode 100644 index a54aabda..00000000 --- a/lib/paper_trail.ex +++ /dev/null @@ -1,167 +0,0 @@ -defmodule PaperTrail do - alias PaperTrail.Version - alias PaperTrail.Serializer - - defdelegate get_version(record), to: PaperTrail.VersionQueries - defdelegate get_version(model_or_record, id_or_options), to: PaperTrail.VersionQueries - defdelegate get_version(model, id, options), to: PaperTrail.VersionQueries - defdelegate has_version?(record), to: PaperTrail.VersionQueries - defdelegate has_version?(model_or_record, id_or_options), to: PaperTrail.VersionQueries - defdelegate has_version?(model, id, options), to: PaperTrail.VersionQueries - defdelegate get_versions(record), to: PaperTrail.VersionQueries - defdelegate get_versions(model_or_record, id_or_options), to: PaperTrail.VersionQueries - defdelegate get_versions(model, id, options), to: PaperTrail.VersionQueries - defdelegate get_current_model(version), to: PaperTrail.VersionQueries - defdelegate make_version_struct(version, model, options), to: Serializer - defdelegate serialize(data), to: Serializer - defdelegate get_sequence_id(table_name), to: Serializer - defdelegate add_prefix(schema, prefix), to: Serializer - defdelegate get_item_type(data), to: Serializer - defdelegate get_model_id(model), to: Serializer - - @default_transaction_options [ - origin: nil, - meta: nil, - originator: nil, - prefix: nil, - model_key: :model, - version_key: :version, - ecto_options: [] - ] - - @doc """ - Explicitly inserts a non-versioned already existing record into the Versions table - """ - def initialise(model, options \\ [origin: nil, meta: nil, originator: nil, prefix: nil, version_key: :version]) do - case has_version?(model) do - false -> - - with {:ok, _} <- make_version_struct(%{event: "insert"}, model, options) - |> PaperTrail.RepoClient.repo().insert() do - :ok - end - - _ -> - # already initalised - :ok - end - end - - @doc """ - Inserts a record to the database with a related version insertion in one transaction - """ - @spec insert( - changeset :: Ecto.Changeset.t(model), - options :: Keyword.t() - ) :: - {:ok, %{model: model, version: Version.t()}} | {:error, Ecto.Changeset.t(model) | term} - when model: struct - def insert(changeset, options \\ @default_transaction_options) do - PaperTrail.Multi.new() - |> PaperTrail.Multi.insert(changeset, options) - |> PaperTrail.Multi.commit() - end - - @doc """ - Same as insert/2 but returns only the model struct or raises if the changeset is invalid. - """ - @spec insert!(changeset :: Ecto.Changeset.t(model), options :: Keyword.t()) :: model - when model: struct - def insert!(changeset, options \\ @default_transaction_options) do - changeset - |> insert(options) - |> model_or_error(:insert) - end - - @doc """ - Upserts a record to the database with a related version insertion in one transaction. - """ - @spec insert_or_update(changeset :: Ecto.Changeset.t(model), options :: Keyword.t()) :: - {:ok, %{model: model, version: Version.t()}} | {:error, Ecto.Changeset.t(model) | term} - when model: struct - def insert_or_update(changeset, options \\ @default_transaction_options) do - PaperTrail.Multi.new() - |> PaperTrail.Multi.insert_or_update(changeset, options) - |> PaperTrail.Multi.commit() - end - - @doc """ - Same as insert_or_update/2 but returns only the model struct or raises if the changeset is invalid. - """ - @spec insert_or_update!(changeset :: Ecto.Changeset.t(model), options :: Keyword.t()) :: model - when model: struct - def insert_or_update!(changeset, options \\ @default_transaction_options) do - changeset - |> insert_or_update(options) - |> model_or_error(:insert_or_update) - end - - @doc """ - Updates a record from the database with a related version insertion in one transaction - """ - @spec update(changeset :: Ecto.Changeset.t(model), options :: Keyword.t()) :: - {:ok, %{model: model, version: Version.t()}} | {:error, Ecto.Changeset.t(model) | term} - when model: struct - def update(changeset, options \\ @default_transaction_options) do - PaperTrail.Multi.new() - |> PaperTrail.Multi.update(changeset, options) - |> PaperTrail.Multi.commit() - end - - @doc """ - Same as update/2 but returns only the model struct or raises if the changeset is invalid. - """ - @spec update!(changeset :: Ecto.Changeset.t(model), options :: Keyword.t()) :: model - when model: struct - def update!(changeset, options \\ @default_transaction_options) do - changeset - |> update(options) - |> model_or_error(:update) - end - - @doc """ - Deletes a record from the database with a related version insertion in one transaction - """ - @spec delete(model_or_changeset :: model | Ecto.Changeset.t(model), options :: Keyword.t()) :: - {:ok, %{model: model, version: Version.t()}} | {:error, Ecto.Changeset.t(model) | term} - when model: struct - def delete(model_or_changeset, options \\ @default_transaction_options) do - PaperTrail.Multi.new() - |> PaperTrail.Multi.delete(model_or_changeset, options) - |> PaperTrail.Multi.commit() - end - - @doc """ - Same as delete/2 but returns only the model struct or raises if the changeset is invalid. - """ - @spec delete!(model_or_changeset :: model | Ecto.Changeset.t(model), options :: Keyword.t()) :: - model - when model: struct - def delete!(model_or_changeset, options \\ @default_transaction_options) do - model_or_changeset - |> delete(options) - |> model_or_error(:delete) - end - - @spec model_or_error( - result :: {:ok, %{required(:model) => model, optional(any()) => any()}}, - action :: :insert | :insert_or_update | :update | :delete - ) :: - model - when model: struct() - defp model_or_error({:ok, %{model: model}}, _action) do - model - end - - @spec model_or_error( - result :: {:error, reason :: term}, - action :: :insert | :insert_or_update | :update | :delete - ) :: no_return - defp model_or_error({:error, %Ecto.Changeset{} = changeset}, action) do - raise Ecto.InvalidChangesetError, action: action, changeset: changeset - end - - defp model_or_error({:error, reason}, _action) do - raise reason - end -end diff --git a/lib/paper_trail/multi.ex b/lib/paper_trail/multi.ex deleted file mode 100644 index 778029ad..00000000 --- a/lib/paper_trail/multi.ex +++ /dev/null @@ -1,213 +0,0 @@ -defmodule PaperTrail.Multi do - import Ecto.Changeset - - alias PaperTrail - alias PaperTrail.Version - alias PaperTrail.RepoClient - alias PaperTrail.Serializer - - defdelegate new(), to: Ecto.Multi - defdelegate append(lhs, rhs), to: Ecto.Multi - defdelegate error(multi, name, value), to: Ecto.Multi - defdelegate merge(multi, merge), to: Ecto.Multi - defdelegate merge(multi, mod, fun, args), to: Ecto.Multi - defdelegate prepend(lhs, rhs), to: Ecto.Multi - defdelegate run(multi, name, run), to: Ecto.Multi - defdelegate run(multi, name, mod, fun, args), to: Ecto.Multi - defdelegate to_list(multi), to: Ecto.Multi - defdelegate make_version_struct(version, model, options), to: Serializer - defdelegate serialize(data), to: Serializer - defdelegate get_sequence_id(table_name), to: Serializer - defdelegate add_prefix(schema, prefix), to: Serializer - defdelegate get_item_type(data), to: Serializer - defdelegate get_model_id(model), to: Serializer - - @default_transaction_options [ - origin: nil, - meta: nil, - originator: nil, - prefix: nil, - model_key: :model, - version_key: :version, - initial_version_key: :initial_version, - ecto_options: [] - ] - - def insert(%Ecto.Multi{} = multi, changeset, options \\ @default_transaction_options) do - model_key = options[:model_key] || :model - version_key = options[:version_key] || :version - initial_version_key = options[:initial_version_key] || :initial_version - ecto_options = options[:ecto_options] || [] - - case RepoClient.strict_mode() do - true -> - multi - |> Ecto.Multi.run(initial_version_key, fn repo, %{} -> - version_id = get_sequence_id("versions") + 1 - - changeset_data = - Map.get(changeset, :data, changeset) - |> Map.merge(%{ - id: get_sequence_id(changeset) + 1, - first_version_id: version_id, - current_version_id: version_id - }) - - initial_version = make_version_struct(%{event: "insert"}, changeset_data, options) - repo.insert(initial_version) - end) - |> Ecto.Multi.run(model_key, fn repo, %{^initial_version_key => initial_version} -> - updated_changeset = - changeset - |> change(%{ - first_version_id: initial_version.id, - current_version_id: initial_version.id - }) - - repo.insert(updated_changeset, ecto_options) - end) - |> Ecto.Multi.run(version_key, fn repo, - %{ - ^initial_version_key => initial_version, - ^model_key => model - } -> - target_version = make_version_struct(%{event: "insert"}, model, options) |> serialize() - - Version.changeset(initial_version, target_version) |> repo.update - end) - - _ -> - multi - |> Ecto.Multi.insert(model_key, changeset, ecto_options) - |> Ecto.Multi.run(version_key, fn repo, %{^model_key => model} -> - version = make_version_struct(%{event: "insert"}, model, options) - repo.insert(version) - end) - end - end - - def update(multi, changeset, options \\ @default_transaction_options) - def update(%Ecto.Multi{} = multi, %Ecto.Changeset{changes: changes} = changeset, options) when changes==%{} do - # when there's no changes to save, rely on ecto's update being a no-op - model_key = options[:model_key] || :model - ecto_options = options[:ecto_options] || [] - - multi - |> Ecto.Multi.update( - model_key, - changeset, - ecto_options ++ Keyword.take(options, [:returning]) - ) - end - - def update(%Ecto.Multi{} = multi, changeset, options) do - model_key = options[:model_key] || :model - version_key = options[:version_key] || :version - initial_version_key = options[:initial_version_key] || :initial_version - ecto_options = options[:ecto_options] || [] - - case RepoClient.strict_mode() do - true -> - multi - |> Ecto.Multi.run(initial_version_key, fn repo, %{} -> - version_data = - changeset.data - |> Map.merge(%{ - current_version_id: get_sequence_id("versions") - }) - - target_changeset = changeset |> Map.merge(%{data: version_data}) - target_version = make_version_struct(%{event: "update"}, target_changeset, options) - repo.insert(target_version) - end) - |> Ecto.Multi.run(model_key, fn repo, %{^initial_version_key => initial_version} -> - updated_changeset = changeset |> change(%{current_version_id: initial_version.id}) - repo.update(updated_changeset, Keyword.take(options, [:returning])) - end) - |> Ecto.Multi.run(version_key, fn repo, %{^initial_version_key => initial_version} -> - new_item_changes = - initial_version.item_changes - |> Map.merge(%{ - current_version_id: initial_version.id - }) - - initial_version |> change(%{item_changes: new_item_changes}) |> repo.update - end) - - _ -> - multi - |> Ecto.Multi.update( - model_key, - changeset, - ecto_options ++ Keyword.take(options, [:returning]) - ) - |> Ecto.Multi.run(version_key, fn repo, %{^model_key => _model} -> - version = make_version_struct(%{event: "update"}, changeset, options) - repo.insert(version) - end) - end - end - - def insert_or_update(%Ecto.Multi{} = multi, changeset, options \\ @default_transaction_options) do - case get_state(changeset) do - :built -> - insert(multi, changeset, options) - - :loaded -> - update(multi, changeset, options) - - state -> - raise ArgumentError, - "the changeset has an invalid state " <> - "for PaperTrail.insert_or_update/2 or PaperTrail.insert_or_update!/2: #{state}" - end - end - - def delete(%Ecto.Multi{} = multi, struct, options \\ @default_transaction_options) do - model_key = options[:model_key] || :model - version_key = options[:version_key] || :version - ecto_options = options[:ecto_options] || [] - - multi - |> Ecto.Multi.delete(model_key, struct, ecto_options) - |> Ecto.Multi.run(version_key, fn repo, %{} -> - version = make_version_struct(%{event: "delete"}, struct, options) - repo.insert(version, options) - end) - end - - def commit(%Ecto.Multi{} = multi) do - repo = RepoClient.repo() - - transaction = repo.transaction(multi) - - case RepoClient.strict_mode() do - true -> - case transaction do - {:error, _, changeset, %{}} -> - filtered_changes = - Map.drop(changeset.changes, [:current_version_id, :first_version_id]) - - {:error, Map.merge(changeset, %{repo: repo, changes: filtered_changes})} - - {:ok, map} -> - {:ok, Map.drop(map, [:initial_version])} - end - - _ -> - case transaction do - {:error, _, changeset, %{}} -> {:error, Map.merge(changeset, %{repo: repo})} - _ -> transaction - end - end - end - - defp get_state(%Ecto.Changeset{data: %{__meta__: %{state: state}}}), do: state - - defp get_state(%{__struct__: _}) do - raise ArgumentError, - "giving a struct to PaperTrail.insert_or_update/2 or " <> - "PaperTrail.insert_or_update!/2 is not supported. " <> - "Please use an Ecto.Changeset" - end -end diff --git a/lib/paper_trail/repo_client.ex b/lib/paper_trail/repo_client.ex deleted file mode 100644 index 8e470672..00000000 --- a/lib/paper_trail/repo_client.ex +++ /dev/null @@ -1,15 +0,0 @@ -defmodule PaperTrail.RepoClient do - @doc """ - Gets the configured repo module or defaults to Repo if none configured - """ - def repo, do: env(:repo, Repo) - def originator, do: env(:originator, nil) - def strict_mode, do: env(:strict_mode, false) - def item_type, do: env(:item_type, :integer) - def originator_type, do: env(:originator_type, :integer) - def originator_relationship_opts, do: env(:originator_relationship_options, []) - def timestamps_type, do: env(:timestamps_type, :utc_datetime) - def origin_read_after_writes(), do: env(:origin_read_after_writes, true) - - defp env(k, default), do: Application.get_env(:paper_trail, k, default) -end diff --git a/lib/paper_trail/serializer.ex b/lib/paper_trail/serializer.ex deleted file mode 100644 index 33e52c51..00000000 --- a/lib/paper_trail/serializer.ex +++ /dev/null @@ -1,196 +0,0 @@ -defmodule PaperTrail.Serializer do - @moduledoc """ - Serialization functions to create a version struct - """ - - alias PaperTrail.RepoClient - alias PaperTrail.Version - - @type model :: struct() | Ecto.Changeset.t() - @type options :: Keyword.t() - @type primary_key :: integer() | String.t() - - @doc """ - Creates a version struct for a model and a specific changeset action - """ - @spec make_version_struct(map(), model(), options()) :: Version.t() - def make_version_struct(%{event: "insert"}, model, options) do - originator = RepoClient.originator() - originator_ref = options[originator[:name]] || options[:originator] - - %Version{ - event: "insert", - item_type: get_item_type(model), - item_id: get_model_id(model), - item_changes: serialize(model), - originator_id: - case originator_ref do - nil -> nil - %{id: id} -> id - model when is_struct(model) -> get_model_id(originator_ref) - end, - origin: options[:origin], - meta: options[:meta] - } - |> add_prefix(options[:prefix]) - end - - def make_version_struct(%{event: "update"}, changeset, options) do - originator = RepoClient.originator() - originator_ref = options[originator[:name]] || options[:originator] - - %Version{ - event: "update", - item_type: get_item_type(changeset), - item_id: get_model_id(changeset), - item_changes: serialize_changes(changeset), - originator_id: - case originator_ref do - nil -> nil - %{id: id} -> id - model when is_struct(model) -> get_model_id(originator_ref) - end, - origin: options[:origin], - meta: options[:meta] - } - |> add_prefix(options[:prefix]) - end - - def make_version_struct(%{event: "delete"}, model_or_changeset, options) do - originator = RepoClient.originator() - originator_ref = options[originator[:name]] || options[:originator] - - %Version{ - event: "delete", - item_type: get_item_type(model_or_changeset), - item_id: get_model_id(model_or_changeset), - item_changes: serialize(model_or_changeset), - originator_id: - case originator_ref do - nil -> nil - %{id: id} -> id - model when is_struct(model) -> get_model_id(originator_ref) - end, - origin: options[:origin], - meta: options[:meta] - } - |> add_prefix(options[:prefix]) - end - - @doc """ - Returns the last primary key value of a table - """ - @spec get_sequence_id(model() | String.t()) :: primary_key() - def get_sequence_id(%Ecto.Changeset{data: data}) do - get_sequence_id(data) - end - - def get_sequence_id(%schema{}) do - :source - |> schema.__schema__() - |> get_sequence_id() - end - - def get_sequence_id(table_name) when is_binary(table_name) do - Ecto.Adapters.SQL.query!(RepoClient.repo(), "select last_value FROM #{table_name}_id_seq").rows - |> List.first() - |> List.first() - end - - @doc """ - Shows DB representation of an Ecto model, filters relationships and virtual attributes from an Ecto.Changeset or %ModelStruct{} - """ - @spec serialize(nil | Ecto.Changeset.t() | struct()) :: nil | map() - def serialize(nil), do: nil - def serialize(%Ecto.Changeset{data: data}), do: serialize(data) - def serialize(%_schema{} = model), do: Ecto.embedded_dump(model, :json) - - @doc """ - Dumps changes using Ecto fields - """ - @spec serialize_changes(Ecto.Changeset.t()) :: map() - def serialize_changes(%Ecto.Changeset{changes: changes} = changeset) do - changeset - |> serialize_model_changes() - |> serialize() - |> Map.take(Map.keys(changes)) - end - - @doc """ - Adds a prefix to the Ecto schema - """ - @spec add_prefix(Ecto.Schema.schema(), nil | String.t()) :: Ecto.Schema.schema() - def add_prefix(schema, nil), do: schema - def add_prefix(schema, prefix), do: Ecto.put_meta(schema, prefix: prefix) - - @doc """ - Returns the model type, which is the last module name - """ - @spec get_item_type(model()) :: String.t() - def get_item_type(%Ecto.Changeset{data: data}), do: get_item_type(data) - def get_item_type(%schema{}), do: schema |> Module.split() |> List.last() - - @doc """ - Returns the model primary id - """ - @spec get_model_id(model()) :: primary_key() - def get_model_id(%Ecto.Changeset{data: data}), do: get_model_id(data) - - def get_model_id(model) do - {_, model_id} = List.first(Ecto.primary_key(model)) - - case PaperTrail.Version.__schema__(:type, :item_id) do - :integer -> - model_id - - _ -> - "#{model_id}" - end - end - - @spec serialize_model_changes(nil) :: nil - defp serialize_model_changes(nil), do: nil - - @spec serialize_model_changes(Ecto.Changeset.t()) :: map() - defp serialize_model_changes(%Ecto.Changeset{data: %schema{}} = changeset) do - field_values = serialize_model_field_changes(changeset) - embed_values = serialize_model_embed_changes(changeset) - - field_values - |> Map.merge(embed_values) - |> schema.__struct__() - end - - defp serialize_model_field_changes(%Ecto.Changeset{data: %schema{}, changes: changes}) do - change_keys = changes |> Map.keys() |> MapSet.new() - - field_keys = - :fields - |> schema.__schema__() - |> MapSet.new() - |> MapSet.intersection(change_keys) - |> MapSet.to_list() - - Map.take(changes, field_keys) - end - - defp serialize_model_embed_changes(%Ecto.Changeset{data: %schema{}, changes: changes}) do - change_keys = changes |> Map.keys() |> MapSet.new() - - embed_keys = - :embeds - |> schema.__schema__() - |> MapSet.new() - |> MapSet.intersection(change_keys) - |> MapSet.to_list() - - changes - |> Map.take(embed_keys) - |> Map.new(fn {key, value} -> - case schema.__schema__(:embed, key) do - %Ecto.Embedded{cardinality: :one} -> {key, serialize_model_changes(value)} - %Ecto.Embedded{cardinality: :many} -> {key, Enum.map(value, &serialize_model_changes/1)} - end - end) - end -end diff --git a/lib/paper_trail/version_queries.ex b/lib/paper_trail/version_queries.ex deleted file mode 100644 index 56feb271..00000000 --- a/lib/paper_trail/version_queries.ex +++ /dev/null @@ -1,120 +0,0 @@ -defmodule PaperTrail.VersionQueries do - import Ecto.Query - alias PaperTrail.Version - - @doc """ - Gets all the versions of a record. - - A list of options is optional, so you can set for example the :prefix of the query, - wich allows you to change between different tenants. - - # Usage examples: - - iex(1)> PaperTrail.VersionQueries.get_versions(record) - iex(1)> PaperTrail.VersionQueries.get_versions(record, [prefix: "tenant_id"]) - iex(1)> PaperTrail.VersionQueries.get_versions(ModelName, id) - iex(1)> PaperTrail.VersionQueries.get_versions(ModelName, id, [prefix: "tenant_id"]) - """ - @spec get_versions(record :: Ecto.Schema.t()) :: [Version.t()] - def get_versions(record), do: get_versions(record, []) - - @doc """ - Gets all the versions of a record given a module and its id - """ - @spec get_versions(model :: module, id :: pos_integer) :: [Version.t()] - def get_versions(model, id) when is_atom(model) and (is_integer(id) or is_binary(id)), - do: get_versions(model, id, []) - - @spec get_versions(record :: Ecto.Schema.t(), options :: keyword | []) :: [Version.t()] - def get_versions(record, options) when is_map(record) do - item_type = record.__struct__ |> Module.split() |> List.last() - - version_query(item_type, PaperTrail.get_model_id(record), options) - |> PaperTrail.RepoClient.repo().all - end - - @spec get_versions(model :: module, id :: pos_integer, options :: keyword | []) :: [Version.t()] - def get_versions(model, id, options) do - item_type = model |> Module.split() |> List.last() - version_query(item_type, id, options) |> PaperTrail.RepoClient.repo().all - end - - @doc """ - Gets the last version of a record. - - A list of options is optional, so you can set for example the :prefix of the query, - wich allows you to change between different tenants. - - # Usage examples: - - iex(1)> PaperTrail.VersionQueries.get_version(record, id) - iex(1)> PaperTrail.VersionQueries.get_version(record, [prefix: "tenant_id"]) - iex(1)> PaperTrail.VersionQueries.get_version(ModelName, id) - iex(1)> PaperTrail.VersionQueries.get_version(ModelName, id, [prefix: "tenant_id"]) - """ - @spec get_version(record :: Ecto.Schema.t()) :: Version.t() | nil - def get_version(record), do: get_version(record, []) - - @spec get_version(model :: module, id :: pos_integer) :: Version.t() | nil - def get_version(model, id) when is_atom(model) and (is_integer(id) or is_binary(id)), - do: get_version(model, id, []) - - @spec get_version(record :: Ecto.Schema.t(), options :: keyword | []) :: Version.t() | nil - def get_version(record, options) when is_map(record) do - get_version(record.__struct__, PaperTrail.get_model_id(record), options) - end - - @spec get_version(model :: module, id :: pos_integer, options :: keyword | []) :: - Version.t() | nil - def get_version(model, id, options) do - last(version_query(model, id, options)) - |> PaperTrail.RepoClient.repo().one - end - - @spec has_version?(record :: Ecto.Schema.t()) :: boolean - def has_version?(record), do: has_version?(record, []) - - @spec has_version?(model :: module, id :: pos_integer) :: boolean - def has_version?(model, id) when is_atom(model) and (is_integer(id) or is_binary(id)), - do: has_version?(model, id, []) - - @spec has_version?(record :: Ecto.Schema.t(), options :: keyword | []) :: boolean - def has_version?(record, options) when is_map(record) do - has_version?(record.__struct__, PaperTrail.get_model_id(record), options) - end - - @spec has_version?(model :: module, id :: pos_integer, options :: keyword | []) :: boolean - def has_version?(model, id, options) do - version_query(model, id, options) - |> PaperTrail.RepoClient.repo().exists?() - end - - @doc """ - Gets the current model record/struct of a version - """ - @spec get_current_model(version :: Version.t()) :: Ecto.Schema.t() | nil - def get_current_model(version) do - PaperTrail.RepoClient.repo().get( - ("Elixir." <> version.item_type) |> String.to_existing_atom(), - version.item_id - ) - end - - defp version_query(item_type, id) do - from(v in Version, where: v.item_type == ^item_type and v.item_id == ^id) - end - - defp version_query(model, id, options) when is_atom(model) do - model - |> Module.split() - |> List.last() - |> version_query(id, options) - end - defp version_query(item_type, id, options) when is_binary(item_type) do - with opts <- Enum.into(options, %{}) do - version_query(item_type, id) - |> Ecto.Queryable.to_query() - |> Map.merge(opts) - end - end -end diff --git a/lib/version.ex b/lib/version.ex deleted file mode 100644 index 51d47fdb..00000000 --- a/lib/version.ex +++ /dev/null @@ -1,93 +0,0 @@ -defmodule PaperTrail.Version do - use Ecto.Schema - - import Ecto.Changeset - import Ecto.Query - - @type t :: %__MODULE__{} - - alias PaperTrail.RepoClient - - # @setter RepoClient.originator() - # @item_type Application.get_env(:paper_trail, :item_type, :integer) - # @originator_type Application.get_env(:paper_trail, :originator_type, :integer) - - schema "versions" do - field(:event, :string) - field(:item_type, :string) - field(:item_id, RepoClient.item_type()) - field(:item_changes, :map) - field(:originator_id, RepoClient.originator_type()) - - field(:origin, :string, read_after_writes: RepoClient.origin_read_after_writes()) - - field(:meta, :map) - - if RepoClient.originator() do - belongs_to( - RepoClient.originator()[:name], - RepoClient.originator()[:model], - Keyword.merge(RepoClient.originator_relationship_opts(), - define_field: false, - foreign_key: :originator_id, - type: RepoClient.originator_type() - ) - ) - end - - timestamps( - updated_at: false, - type: RepoClient.timestamps_type() - ) - end - - def changeset(model, params \\ %{}) do - model - |> cast(params, [:item_type, :item_id, :item_changes, :origin, :originator_id, :meta]) - |> validate_required([:event, :item_type, :item_id, :item_changes]) - end - - @doc """ - Returns the count of all version records in the database - """ - def count do - from(version in __MODULE__, select: count(version.id)) |> RepoClient.repo().one() - end - - def count(options) do - from(version in __MODULE__, select: count(version.id)) - |> Ecto.Queryable.to_query() - |> Map.put(:prefix, options[:prefix]) - |> RepoClient.repo().one - end - - @doc """ - Returns the first version record in the database by :inserted_at - """ - def first do - from(record in __MODULE__, limit: 1, order_by: [asc: :inserted_at]) - |> RepoClient.repo().one - end - - def first(options) do - from(record in __MODULE__, limit: 1, order_by: [asc: :inserted_at]) - |> Ecto.Queryable.to_query() - |> Map.put(:prefix, options[:prefix]) - |> RepoClient.repo().one - end - - @doc """ - Returns the last version record in the database by :inserted_at - """ - def last do - from(record in __MODULE__, limit: 1, order_by: [desc: :inserted_at]) - |> RepoClient.repo().one - end - - def last(options) do - from(record in __MODULE__, limit: 1, order_by: [desc: :inserted_at]) - |> Ecto.Queryable.to_query() - |> Map.put(:prefix, options[:prefix]) - |> RepoClient.repo().one - end -end diff --git a/mix.exs b/mix.exs deleted file mode 100644 index 37de73ae..00000000 --- a/mix.exs +++ /dev/null @@ -1,72 +0,0 @@ -defmodule PaperTrail.Mixfile do - use Mix.Project - - @source_url "https://github.com/izelnakri/paper_trail" - @version "1.0.0" - - def project do - [ - app: :paper_trail, - version: @version, - elixir: "~> 1.11", - description: description(), - build_embedded: Mix.env() == :prod, - start_permanent: Mix.env() == :prod, - elixirc_paths: elixirc_paths(Mix.env()), - package: package(), - deps: deps(), - docs: docs() - ] - end - - def application do - [ - applications: [:logger, :ecto, :ecto_sql, :runtime_tools] - ] - end - - defp deps do - [ - {:ecto, ">= 3.10.2"}, - {:ecto_sql, ">= 3.10.1"}, - {:ex_doc, ">= 0.0.0", only: :dev, runtime: false}, - {:jason, ">= 1.4.0", only: [:dev, :test]}, - {:postgrex, ">= 0.0.0", only: [:dev, :test]} - ] - end - - defp description do - """ - Track and record all the changes in your database. Revert back to anytime - in history. - """ - end - - defp package do - [ - name: :paper_trail, - files: ["lib", "mix.exs", "README*", "LICENSE*", "CHANGELOG*"], - maintainers: ["Izel Nakri"], - licenses: ["MIT License"], - links: %{ - "Changelog" => "#{@source_url}/blob/master/CHANGELOG.md", - "GitHub" => @source_url - } - ] - end - - defp docs do - [ - main: "readme", - source_ref: "v#{@version}", - source_url: @source_url, - extras: [ - "README.md", - "CHANGELOG.md" - ] - ] - end - - defp elixirc_paths(:test), do: ["lib", "test/support"] - defp elixirc_paths(_), do: ["lib"] -end diff --git a/mix.lock b/mix.lock deleted file mode 100644 index 20e5e853..00000000 --- a/mix.lock +++ /dev/null @@ -1,16 +0,0 @@ -%{ - "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, - "db_connection": {:hex, :db_connection, "2.5.0", "bb6d4f30d35ded97b29fe80d8bd6f928a1912ca1ff110831edcd238a1973652c", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c92d5ba26cd69ead1ff7582dbb860adeedfff39774105a4f1c92cbb654b55aa2"}, - "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.32", "fa739a0ecfa34493de19426681b23f6814573faee95dfd4b4aafe15a7b5b32c6", [:mix], [], "hexpm", "b8b0dd77d60373e77a3d7e8afa598f325e49e8663a51bcc2b88ef41838cca755"}, - "ecto": {:hex, :ecto, "3.10.2", "6b887160281a61aa16843e47735b8a266caa437f80588c3ab80a8a960e6abe37", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "6a895778f0d7648a4b34b486af59a1c8009041fbdf2b17f1ac215eb829c60235"}, - "ecto_sql": {:hex, :ecto_sql, "3.10.1", "6ea6b3036a0b0ca94c2a02613fd9f742614b5cfe494c41af2e6571bb034dd94c", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.10.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f6a25bdbbd695f12c8171eaff0851fa4c8e72eec1e98c7364402dda9ce11c56b"}, - "ex_doc": {:hex, :ex_doc, "0.29.4", "6257ecbb20c7396b1fe5accd55b7b0d23f44b6aa18017b415cb4c2b91d997729", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2c6699a737ae46cb61e4ed012af931b57b699643b24dabe2400a8168414bc4f5"}, - "jason": {:hex, :jason, "1.4.0", "e855647bc964a44e2f67df589ccf49105ae039d4179db7f6271dfd3843dc27e6", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "79a3791085b2a0f743ca04cec0f7be26443738779d09302e01318f97bdb82121"}, - "makeup": {:hex, :makeup, "1.1.0", "6b67c8bc2882a6b6a445859952a602afc1a41c2e08379ca057c0f525366fc3ca", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "0a45ed501f4a8897f580eabf99a2e5234ea3e75a4373c8a52824f6e873be57a6"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.2", "ad87296a092a46e03b7e9b0be7631ddcf64c790fa68a9ef5323b6cbb36affc72", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f3f5a1ca93ce6e092d92b6d9c049bcda58a3b617a8d888f8e7231c85630e8108"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.3.1", "2c54013ecf170e249e9291ed0a62e5832f70a476c61da16f6aac6dca0189f2af", [:mix], [], "hexpm", "2682e3c0b2eb58d90c6375fc0cc30bc7be06f365bf72608804fb9cffa5e1b167"}, - "postgrex": {:hex, :postgrex, "0.17.1", "01c29fd1205940ee55f7addb8f1dc25618ca63a8817e56fac4f6846fc2cddcbe", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "14b057b488e73be2beee508fb1955d8db90d6485c6466428fe9ccf1d6692a555"}, - "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 64cd457f..00000000 --- a/package-lock.json +++ /dev/null @@ -1,7780 +0,0 @@ -{ - "name": "paper_trail", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "paper_trail", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@j-ulrich/release-it-regex-bumper": "^4.1.1", - "auto-changelog": "^2.4.0", - "release-it": "^15.5.1" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz", - "integrity": "sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==", - "dev": true, - "dependencies": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, - "node_modules/@j-ulrich/release-it-regex-bumper": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@j-ulrich/release-it-regex-bumper/-/release-it-regex-bumper-4.1.1.tgz", - "integrity": "sha512-KVDJWqxlTGZUnmx9RfqErcS6RIls3FGSZCFUlkD3tthUpeSsfQP66n6HjUSfeDqOWbarlKoAOmovTBa/x++Auw==", - "dev": true, - "dependencies": { - "chalk": "^5.0.0", - "date-fns": "^2.8.0", - "fast-glob": "^3.2.0", - "lodash": "^4.17.20", - "semver": "^7.3.0", - "xregexp": "^5.0.0" - }, - "engines": { - "node": ">=14.9" - }, - "optionalDependencies": { - "diff": "3 - 5" - }, - "peerDependencies": { - "release-it": "15" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz", - "integrity": "sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==", - "dev": true, - "dependencies": { - "@octokit/types": "^8.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.1.0.tgz", - "integrity": "sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^8.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz", - "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==", - "dev": true, - "dependencies": { - "@octokit/types": "^8.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz", - "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==", - "dev": true, - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^8.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz", - "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz", - "integrity": "sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==", - "dev": true, - "dependencies": { - "@octokit/types": "^8.0.0" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz", - "integrity": "sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==", - "dev": true, - "dependencies": { - "@octokit/types": "^8.0.0", - "deprecation": "^2.3.1" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz", - "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^8.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz", - "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==", - "dev": true, - "dependencies": { - "@octokit/types": "^8.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/rest": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.5.tgz", - "integrity": "sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==", - "dev": true, - "dependencies": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^5.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^6.7.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.0.0.tgz", - "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^14.0.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/npm-conf": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz", - "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==", - "dev": true, - "dependencies": { - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.0.0.tgz", - "integrity": "sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==", - "dev": true, - "dependencies": { - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array.prototype.map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", - "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/auto-changelog": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.4.0.tgz", - "integrity": "sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==", - "dev": true, - "dependencies": { - "commander": "^7.2.0", - "handlebars": "^4.7.7", - "node-fetch": "^2.6.1", - "parse-github-url": "^1.0.2", - "semver": "^7.3.5" - }, - "bin": { - "auto-changelog": "src/index.js" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/boxen": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", - "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.7", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.7.tgz", - "integrity": "sha512-I4SA6mKgDxcxVbSt/UmIkb9Ny8qSkg6ReBHtAAXnZHk7KOSx5g3DTiAOaYzcHCs6oOdHn+bip9T48E6tMvK9hw==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", - "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/core-js-pure": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", - "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", - "dev": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/date-fns": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.22.1.tgz", - "integrity": "sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg==", - "dev": true, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/degenerator": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", - "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", - "dev": true, - "dependencies": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0", - "vm2": "^3.9.8" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "node_modules/es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", - "dev": true, - "dependencies": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ftp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/ftp/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ftp/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/ftp/node_modules/xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/git-url-parse": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", - "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", - "dev": true, - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.5.3", - "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", - "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.1", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "dev": true, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/inquirer": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.4.tgz", - "integrity": "sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^6.0.0", - "chalk": "^5.1.2", - "cli-cursor": "^4.0.0", - "cli-width": "^4.0.0", - "external-editor": "^3.0.3", - "figures": "^5.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^6.1.2", - "run-async": "^2.4.0", - "rxjs": "^7.5.7", - "string-width": "^5.1.2", - "strip-ansi": "^7.0.1", - "through": "^2.3.6", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "dev": true, - "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/macos-release": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.1.0.tgz", - "integrity": "sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/new-github-release-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", - "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", - "dev": true, - "dependencies": { - "type-fest": "^2.5.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/new-github-release-url/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", - "dev": true, - "dependencies": { - "bl": "^5.0.0", - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.0.1.tgz", - "integrity": "sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==", - "dev": true, - "dependencies": { - "macos-release": "^3.0.1", - "windows-release": "^5.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/pac-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", - "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^5.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/pac-resolver": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", - "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", - "dev": true, - "dependencies": { - "degenerator": "^3.0.2", - "ip": "^1.1.5", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/package-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", - "dev": true, - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true, - "bin": { - "parse-github-url": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/promise.allsettled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", - "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", - "dev": true, - "dependencies": { - "array.prototype.map": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "iterate-value": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "node_modules/proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", - "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.0", - "debug": "4", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^5.0.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^5.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/proxy-agent/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dev": true, - "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", - "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^1.0.4" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/release-it": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.5.1.tgz", - "integrity": "sha512-1X1oyqay/amJh/V+xkSU9zN6LqGmLQJ0Q40+FaHE6+Pu6QCmgX9HbrpHxvF0HZeXkB5cdhHjmYsPbHnUQLRnYg==", - "dev": true, - "dependencies": { - "@iarna/toml": "2.2.5", - "@octokit/rest": "19.0.5", - "async-retry": "1.3.3", - "chalk": "5.1.2", - "cosmiconfig": "8.0.0", - "execa": "6.1.0", - "form-data": "4.0.0", - "git-url-parse": "13.1.0", - "globby": "13.1.2", - "got": "12.5.3", - "inquirer": "9.1.4", - "is-ci": "3.0.1", - "lodash": "4.17.21", - "mime-types": "2.1.35", - "new-github-release-url": "2.0.0", - "node-fetch": "3.3.0", - "open": "8.4.0", - "ora": "6.1.2", - "os-name": "5.0.1", - "promise.allsettled": "1.0.6", - "proxy-agent": "5.0.0", - "semver": "7.3.8", - "shelljs": "0.8.5", - "update-notifier": "6.0.2", - "url-join": "5.0.0", - "wildcard-match": "5.1.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "release-it": "bin/release-it.js" - }, - "engines": { - "node": ">=14.9" - } - }, - "node_modules/release-it/node_modules/chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/release-it/node_modules/data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/release-it/node_modules/node-fetch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", - "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", - "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "dependencies": { - "lowercase-keys": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "4", - "socks": "^2.3.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/socks/node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.4.0.tgz", - "integrity": "sha512-PEPg6RHlB9cFwoTMNENNrQFL0cXX04voWr2UPwQBJ3pVs7Mt8Y1oLWdUeMdGEwZE8HFFlujq8gS9enmyiQ8pLg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/url-join": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", - "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vm2": { - "version": "3.9.13", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.13.tgz", - "integrity": "sha512-0rvxpB8P8Shm4wX2EKOiMp7H2zq+HUE/UwodY0pCZXs9IffIKZq6vUti5OgkVCTakKo9e/fgO4X1fkwfjWxE3Q==", - "dev": true, - "dependencies": { - "acorn": "^8.7.0", - "acorn-walk": "^8.2.0" - }, - "bin": { - "vm2": "bin/vm2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wildcard-match": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.2.tgz", - "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==", - "dev": true - }, - "node_modules/windows-release": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.0.1.tgz", - "integrity": "sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==", - "dev": true, - "dependencies": { - "execa": "^5.1.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/windows-release/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/windows-release/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/windows-release/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/windows-release/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", - "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/xregexp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-5.1.1.tgz", - "integrity": "sha512-fKXeVorD+CzWvFs7VBuKTYIW63YD1e1osxwQ8caZ6o1jg6pDAbABDG54LCIq0j5cy7PjRvGIq6sef9DYPXpncg==", - "dev": true, - "dependencies": { - "@babel/runtime-corejs3": "^7.16.5" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "@babel/runtime-corejs3": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz", - "integrity": "sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==", - "dev": true, - "requires": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" - } - }, - "@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, - "@j-ulrich/release-it-regex-bumper": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@j-ulrich/release-it-regex-bumper/-/release-it-regex-bumper-4.1.1.tgz", - "integrity": "sha512-KVDJWqxlTGZUnmx9RfqErcS6RIls3FGSZCFUlkD3tthUpeSsfQP66n6HjUSfeDqOWbarlKoAOmovTBa/x++Auw==", - "dev": true, - "requires": { - "chalk": "^5.0.0", - "date-fns": "^2.8.0", - "diff": "3 - 5", - "fast-glob": "^3.2.0", - "lodash": "^4.17.20", - "semver": "^7.3.0", - "xregexp": "^5.0.0" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz", - "integrity": "sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==", - "dev": true, - "requires": { - "@octokit/types": "^8.0.0" - } - }, - "@octokit/core": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.1.0.tgz", - "integrity": "sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ==", - "dev": true, - "requires": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^8.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz", - "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==", - "dev": true, - "requires": { - "@octokit/types": "^8.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz", - "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==", - "dev": true, - "requires": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^8.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz", - "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==", - "dev": true - }, - "@octokit/plugin-paginate-rest": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz", - "integrity": "sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==", - "dev": true, - "requires": { - "@octokit/types": "^8.0.0" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "requires": {} - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz", - "integrity": "sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==", - "dev": true, - "requires": { - "@octokit/types": "^8.0.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz", - "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==", - "dev": true, - "requires": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^8.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz", - "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==", - "dev": true, - "requires": { - "@octokit/types": "^8.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.5.tgz", - "integrity": "sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==", - "dev": true, - "requires": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^5.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^6.7.0" - } - }, - "@octokit/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.0.0.tgz", - "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^14.0.0" - } - }, - "@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "requires": { - "graceful-fs": "4.2.10" - } - }, - "@pnpm/npm-conf": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz", - "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==", - "dev": true, - "requires": { - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - } - }, - "@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "ansi-escapes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.0.0.tgz", - "integrity": "sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==", - "dev": true, - "requires": { - "type-fest": "^3.0.0" - } - }, - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array.prototype.map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", - "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, - "ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "requires": { - "tslib": "^2.0.1" - } - }, - "async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "requires": { - "retry": "0.13.1" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "auto-changelog": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.4.0.tgz", - "integrity": "sha512-vh17hko1c0ItsEcw6m7qPRf3m45u+XK5QyCrrBFViElZ8jnKrPC1roSznrd1fIB/0vR/zawdECCRJtTuqIXaJw==", - "dev": true, - "requires": { - "commander": "^7.2.0", - "handlebars": "^4.7.7", - "node-fetch": "^2.6.1", - "parse-github-url": "^1.0.2", - "semver": "^7.3.5" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "boxen": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", - "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", - "dev": true, - "requires": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "dependencies": { - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true - }, - "cacheable-request": { - "version": "10.2.7", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.7.tgz", - "integrity": "sha512-I4SA6mKgDxcxVbSt/UmIkb9Ny8qSkg6ReBHtAAXnZHk7KOSx5g3DTiAOaYzcHCs6oOdHn+bip9T48E6tMvK9hw==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true - }, - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "ci-info": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", - "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", - "dev": true - }, - "cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true - }, - "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "requires": { - "restore-cursor": "^4.0.0" - } - }, - "cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true - }, - "cli-width": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", - "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", - "dev": true - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - } - } - }, - "configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "requires": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - } - }, - "core-js-pure": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", - "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", - "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==", - "dev": true, - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "requires": { - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "dev": true - }, - "date-fns": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.22.1.tgz", - "integrity": "sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "degenerator": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", - "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", - "dev": true, - "requires": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0", - "vm2": "^3.9.8" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "optional": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true - }, - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "requires": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - } - }, - "figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, - "requires": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - } - }, - "file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", - "dev": true - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true - }, - "formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "requires": { - "fetch-blob": "^3.1.2" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", - "dev": true, - "requires": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==", - "dev": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" - } - }, - "git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "requires": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "git-url-parse": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", - "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", - "dev": true, - "requires": { - "git-up": "^7.0.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, - "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "got": { - "version": "12.5.3", - "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", - "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", - "dev": true, - "requires": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.1", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, - "inquirer": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.4.tgz", - "integrity": "sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==", - "dev": true, - "requires": { - "ansi-escapes": "^6.0.0", - "chalk": "^5.1.2", - "cli-cursor": "^4.0.0", - "cli-width": "^4.0.0", - "external-editor": "^3.0.3", - "figures": "^5.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^6.1.2", - "run-async": "^2.4.0", - "rxjs": "^7.5.7", - "string-width": "^5.1.2", - "strip-ansi": "^7.0.1", - "through": "^2.3.6", - "wrap-ansi": "^8.0.1" - } - }, - "internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "requires": { - "ci-info": "^3.2.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, - "requires": { - "protocols": "^2.0.1" - } - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", - "dev": true - }, - "iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "dev": true, - "requires": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "requires": { - "package-json": "^8.1.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, - "requires": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - } - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "macos-release": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.1.0.tgz", - "integrity": "sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true - }, - "new-github-release-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", - "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", - "dev": true, - "requires": { - "type-fest": "^2.5.1" - }, - "dependencies": { - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } - } - }, - "node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "dev": true - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - }, - "dependencies": { - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - } - } - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", - "dev": true, - "requires": { - "bl": "^5.0.0", - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - } - }, - "os-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.0.1.tgz", - "integrity": "sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==", - "dev": true, - "requires": { - "macos-release": "^3.0.1", - "windows-release": "^5.0.1" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true - }, - "pac-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", - "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^5.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" - } - }, - "pac-resolver": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", - "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", - "dev": true, - "requires": { - "degenerator": "^3.0.2", - "ip": "^1.1.5", - "netmask": "^2.0.2" - } - }, - "package-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", - "dev": true, - "requires": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-github-url": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", - "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, - "requires": { - "protocols": "^2.0.0" - } - }, - "parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "requires": { - "parse-path": "^7.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "promise.allsettled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", - "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", - "dev": true, - "requires": { - "array.prototype.map": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "iterate-value": "^1.0.2" - } - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", - "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", - "dev": true, - "requires": { - "agent-base": "^6.0.0", - "debug": "4", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^5.0.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^5.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", - "dev": true, - "requires": { - "escape-goat": "^4.0.0" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "registry-auth-token": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz", - "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==", - "dev": true, - "requires": { - "@pnpm/npm-conf": "^1.0.4" - } - }, - "registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "release-it": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.5.1.tgz", - "integrity": "sha512-1X1oyqay/amJh/V+xkSU9zN6LqGmLQJ0Q40+FaHE6+Pu6QCmgX9HbrpHxvF0HZeXkB5cdhHjmYsPbHnUQLRnYg==", - "dev": true, - "requires": { - "@iarna/toml": "2.2.5", - "@octokit/rest": "19.0.5", - "async-retry": "1.3.3", - "chalk": "5.1.2", - "cosmiconfig": "8.0.0", - "execa": "6.1.0", - "form-data": "4.0.0", - "git-url-parse": "13.1.0", - "globby": "13.1.2", - "got": "12.5.3", - "inquirer": "9.1.4", - "is-ci": "3.0.1", - "lodash": "4.17.21", - "mime-types": "2.1.35", - "new-github-release-url": "2.0.0", - "node-fetch": "3.3.0", - "open": "8.4.0", - "ora": "6.1.2", - "os-name": "5.0.1", - "promise.allsettled": "1.0.6", - "proxy-agent": "5.0.0", - "semver": "7.3.8", - "shelljs": "0.8.5", - "update-notifier": "6.0.2", - "url-join": "5.0.0", - "wildcard-match": "5.1.2", - "yargs-parser": "21.1.1" - }, - "dependencies": { - "chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", - "dev": true - }, - "data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", - "dev": true - }, - "node-fetch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", - "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", - "dev": true, - "requires": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - } - } - } - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", - "dev": true, - "requires": { - "lowercase-keys": "^3.0.0" - } - }, - "restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - } - } - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "dependencies": { - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - } - } - }, - "socks-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "4", - "socks": "^2.3.3" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.4.0.tgz", - "integrity": "sha512-PEPg6RHlB9cFwoTMNENNrQFL0cXX04voWr2UPwQBJ3pVs7Mt8Y1oLWdUeMdGEwZE8HFFlujq8gS9enmyiQ8pLg==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "requires": { - "crypto-random-string": "^4.0.0" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "requires": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - } - }, - "url-join": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", - "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "vm2": { - "version": "3.9.13", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.13.tgz", - "integrity": "sha512-0rvxpB8P8Shm4wX2EKOiMp7H2zq+HUE/UwodY0pCZXs9IffIKZq6vUti5OgkVCTakKo9e/fgO4X1fkwfjWxE3Q==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-walk": "^8.2.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "requires": { - "string-width": "^5.0.1" - } - }, - "wildcard-match": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.2.tgz", - "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==", - "dev": true - }, - "windows-release": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.0.1.tgz", - "integrity": "sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==", - "dev": true, - "requires": { - "execa": "^5.1.1" - }, - "dependencies": { - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - } - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "wrap-ansi": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz", - "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true - }, - "xregexp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-5.1.1.tgz", - "integrity": "sha512-fKXeVorD+CzWvFs7VBuKTYIW63YD1e1osxwQ8caZ6o1jg6pDAbABDG54LCIq0j5cy7PjRvGIq6sef9DYPXpncg==", - "dev": true, - "requires": { - "@babel/runtime-corejs3": "^7.16.5" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 18484330..00000000 --- a/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "private": true, - "name": "paper_trail", - "author": "Izel Nakri", - "version": "1.0.0", - "description": "[![Hex Version](http://img.shields.io/hexpm/v/paper_trail.svg?style=flat)](https://hex.pm/packages/paper_trail) [![Hex docs](http://img.shields.io/badge/hex.pm-docs-green.svg?style=flat)](https://hexdocs.pm/paper_trail/PaperTrail.html) [![Total Download](https://img.shields.io/hexpm/dt/paper_trail.svg)](https://hex.pm/packages/paper_trail) [![License](https://img.shields.io/hexpm/l/paper_trail.svg)](https://github.com/izelnakri/paper_trail/blob/main/LICENSE) [![Last Updated](https://img.shields.io/github/last-commit/izelnakri/paper_trail.svg)](https://github.com/izelnakri/paper_trail/commits/main)", - "main": "index.js", - "repository": { - "type": "git", - "url": "git+https://github.com/izelnakri/paper_trail.git" - }, - "scripts": { - "changelog:unreleased": "node_modules/.bin/auto-changelog --stdout --commit-limit false --package --unreleased-only --hide-credit --sort-commits date-desc", - "changelog:preview": "node_modules/.bin/auto-changelog --stdout --commit-limit false --package -u --sort-commits date-desc", - "changelog:update": "node_modules/.bin/auto-changelog --commit-limit false --package --sort-commits date-desc", - "release:alpha": "node_modules/.bin/release-it --preRelease=alpha --no-npm.publish && MIX_ENV=dev mix hex.publish --yes", - "release:beta": "node_modules/.bin/release-it --preRelease=beta --no-npm.publish && MIX_ENV=dev mix hex.publish --yes", - "release": "node_modules/.bin/release-it --no-npm.publish && MIX_ENV=dev mix hex.publish --yes", - "test": "sh setup-database.sh && mix test test/paper_trail && mix test test/version && mix test test/uuid && STRING_TEST=true mix test test/uuid" - }, - "license": "MIT", - "release-it": { - "plugins": { - "@j-ulrich/release-it-regex-bumper": { - "in": "package.json", - "out": { - "file": "mix.exs", - "search": { - "pattern": "@version \"([0-9.]+)\"" - }, - "replace": "@version \"{{version}}\"" - } - } - }, - "git": { - "changelog": "npm run changelog:preview" - }, - "github": { - "release": true - }, - "hooks": { - "after:bump": "npm run changelog:update" - } - }, - "devDependencies": { - "@j-ulrich/release-it-regex-bumper": "^4.1.1", - "auto-changelog": "^2.4.0", - "release-it": "^15.5.1" - }, - "volta": { - "node": "18.12.1" - } -} diff --git a/priv/repo/migrations/20160619190935_add_users.exs b/priv/repo/migrations/20160619190935_add_users.exs deleted file mode 100644 index 4bed44b0..00000000 --- a/priv/repo/migrations/20160619190935_add_users.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule Repo.Migrations.AddUsers do - use Ecto.Migration - - def change do - create table(:users) do - add :token, :string, null: false - add :username, :string, null: false - - timestamps() - end - - create index(:users, [:token]) - end -end diff --git a/priv/repo/migrations/20160619190936_add_versions.exs b/priv/repo/migrations/20160619190936_add_versions.exs deleted file mode 100644 index 72a045fd..00000000 --- a/priv/repo/migrations/20160619190936_add_versions.exs +++ /dev/null @@ -1,22 +0,0 @@ -defmodule Repo.Migrations.AddVersions do - use Ecto.Migration - - def change do - create table(:versions) do - add :event, :string, null: false - add :item_type, :string, null: false - add :item_id, :integer, null: false - add :item_changes, :map, null: false - add :originator_id, references(:users) # you can change users to your own foreign key constraint - add :origin, :string, size: 50 - add :meta, :map - - add :inserted_at, :utc_datetime, null: false - end - - create index(:versions, [:originator_id]) - create index(:versions, [:item_type, :item_id]) - create index(:versions, [:item_type, :inserted_at]) - # create index(:versions, [:event, :item_type]) - end -end diff --git a/priv/repo/migrations/20160619190937_add_simple_companies.exs b/priv/repo/migrations/20160619190937_add_simple_companies.exs deleted file mode 100644 index 36c78216..00000000 --- a/priv/repo/migrations/20160619190937_add_simple_companies.exs +++ /dev/null @@ -1,19 +0,0 @@ -defmodule Repo.Migrations.CreateSimpleCompanies do - use Ecto.Migration - - def change do - create table(:simple_companies) do - add :name, :string, null: false - add :is_active, :boolean - add :website, :string - add :city, :string - add :address, :string - add :facebook, :string - add :twitter, :string - add :founded_in, :string - add :location, :map - - timestamps() - end - end -end diff --git a/priv/repo/migrations/20160619190938_add_simple_people.exs b/priv/repo/migrations/20160619190938_add_simple_people.exs deleted file mode 100644 index 0e69e5f8..00000000 --- a/priv/repo/migrations/20160619190938_add_simple_people.exs +++ /dev/null @@ -1,21 +0,0 @@ -defmodule Repo.Migrations.CreateSimplePeople do - use Ecto.Migration - - def change do - create table(:simple_people) do - add :first_name, :string, null: false - add :last_name, :string - add :visit_count, :integer - add :gender, :boolean - add :birthdate, :date - add :singular, :map - add :plural, {:array, :map} - - add :company_id, references(:simple_companies), null: false - - timestamps() - end - - create index(:simple_people, [:company_id]) - end -end diff --git a/priv/repo/migrations/20170319190938_add_strict_companies.exs b/priv/repo/migrations/20170319190938_add_strict_companies.exs deleted file mode 100644 index 906a27df..00000000 --- a/priv/repo/migrations/20170319190938_add_strict_companies.exs +++ /dev/null @@ -1,24 +0,0 @@ -defmodule Repo.Migrations.CreateStrictCompanies do - use Ecto.Migration - - def change do - create table(:strict_companies) do - add :name, :string, null: false - add :is_active, :boolean - add :website, :string - add :city, :string - add :address, :string - add :facebook, :string - add :twitter, :string - add :founded_in, :string - - add :first_version_id, references(:versions), null: false - add :current_version_id, references(:versions), null: false - - timestamps() - end - - create index(:strict_companies, [:first_version_id]) - create index(:strict_companies, [:current_version_id]) - end -end diff --git a/priv/repo/migrations/20170319190940_add_strict_people.exs b/priv/repo/migrations/20170319190940_add_strict_people.exs deleted file mode 100644 index 63492ce6..00000000 --- a/priv/repo/migrations/20170319190940_add_strict_people.exs +++ /dev/null @@ -1,23 +0,0 @@ -defmodule Repo.Migrations.CreateStrictPeople do - use Ecto.Migration - - def change do - create table(:strict_people) do - add :first_name, :string, null: false - add :last_name, :string - add :visit_count, :integer - add :gender, :boolean - add :birthdate, :date - - add :company_id, references(:strict_companies), null: false - add :first_version_id, references(:versions), null: false - add :current_version_id, references(:versions), null: false - - timestamps() - end - - create index(:strict_people, [:company_id]) - create index(:strict_people, [:first_version_id]) - create index(:strict_people, [:current_version_id]) - end -end diff --git a/priv/repo/migrations/20200827222744_add_uniqueness_constraint_to_companies_name.exs b/priv/repo/migrations/20200827222744_add_uniqueness_constraint_to_companies_name.exs deleted file mode 100644 index c757aff3..00000000 --- a/priv/repo/migrations/20200827222744_add_uniqueness_constraint_to_companies_name.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule PaperTrail.Repo.Migrations.AddUniquenessConstraintToCompaniesName do - use Ecto.Migration - - def change do - create unique_index(:simple_companies, [:name]) - create unique_index(:strict_companies, [:name]) - end -end diff --git a/priv/uuid_repo/migrations/20170525133833_create_uuid_products.exs b/priv/uuid_repo/migrations/20170525133833_create_uuid_products.exs deleted file mode 100644 index f14a5820..00000000 --- a/priv/uuid_repo/migrations/20170525133833_create_uuid_products.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule PaperTrail.UUIDRepo.Migrations.CreateUuidProducts do - use Ecto.Migration - - def change do - create table(:products, primary_key: false) do - add :id, :binary_id, primary_key: true - add :name, :string, null: false - - timestamps() - end - end -end diff --git a/priv/uuid_repo/migrations/20170525142546_create_admins.exs b/priv/uuid_repo/migrations/20170525142546_create_admins.exs deleted file mode 100644 index e06e2168..00000000 --- a/priv/uuid_repo/migrations/20170525142546_create_admins.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule PaperTrail.UUIDRepo.Migrations.CreateAdmins do - use Ecto.Migration - - def change do - create table(:admins, primary_key: false) do - add :id, :binary_id, primary_key: true - add :email, :string, null: false - - timestamps() - end - end -end diff --git a/priv/uuid_repo/migrations/20170525142612_create_versions.exs b/priv/uuid_repo/migrations/20170525142612_create_versions.exs deleted file mode 100644 index 2cd73187..00000000 --- a/priv/uuid_repo/migrations/20170525142612_create_versions.exs +++ /dev/null @@ -1,22 +0,0 @@ -defmodule PaperTrail.UUIDRepo.Migrations.CreateVersions do - use Ecto.Migration - - def change do - create table(:versions) do - add :event, :string, null: false, size: 10 - add :item_type, :string, null: false - add :item_id, (if System.get_env("STRING_TEST") == nil, do: :binary_id, else: :string) - add :item_changes, :map, null: false - add :originator_id, references(:admins, type: :binary_id) - add :origin, :string, size: 50 - add :meta, :map - - add :inserted_at, :utc_datetime, null: false - end - - create index(:versions, [:originator_id]) - create index(:versions, [:item_id, :item_type]) - create index(:versions, [:event, :item_type]) - create index(:versions, [:item_type, :inserted_at]) - end -end diff --git a/priv/uuid_repo/migrations/20170525142613_create_items.exs b/priv/uuid_repo/migrations/20170525142613_create_items.exs deleted file mode 100644 index b9811cb8..00000000 --- a/priv/uuid_repo/migrations/20170525142613_create_items.exs +++ /dev/null @@ -1,25 +0,0 @@ -defmodule PaperTrail.UUIDRepo.Migrations.CreateItems do - use Ecto.Migration - - def change do - create table(:items) do - add :item_id, :binary_id, null: false, primary_key: true - add :title, :string, null: false - - timestamps() - end - - create table(:foo_items) do - add :title, :string, null: false - - timestamps() - end - - create table(:bar_items, primary_key: false) do - add :item_id, :string, primary_key: true - add :title, :string, null: false - - timestamps() - end - end -end diff --git a/priv/uuid_with_custom_name_repo/migrations/20201130190530_create_projects.exs b/priv/uuid_with_custom_name_repo/migrations/20201130190530_create_projects.exs deleted file mode 100644 index 378407eb..00000000 --- a/priv/uuid_with_custom_name_repo/migrations/20201130190530_create_projects.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule PaperTrail.UUIDWithCustomNameRepo.Migrations.CreateProjects do - use Ecto.Migration - - def change do - create table(:projects, primary_key: false) do - add :uuid, :binary_id, primary_key: true - add :name, :string, null: false - - timestamps() - end - end -end diff --git a/priv/uuid_with_custom_name_repo/migrations/20201130190545_create_people.exs b/priv/uuid_with_custom_name_repo/migrations/20201130190545_create_people.exs deleted file mode 100644 index 2275b1b0..00000000 --- a/priv/uuid_with_custom_name_repo/migrations/20201130190545_create_people.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule PaperTrail.UUIDWithCustomNameRepo.Migrations.CreatePeople do - use Ecto.Migration - - def change do - create table(:people, primary_key: false) do - add :uuid, :binary_id, primary_key: true - add :email, :string, null: false - - timestamps() - end - end -end diff --git a/priv/uuid_with_custom_name_repo/migrations/20201130190555_create_versions.exs b/priv/uuid_with_custom_name_repo/migrations/20201130190555_create_versions.exs deleted file mode 100644 index 993f42bc..00000000 --- a/priv/uuid_with_custom_name_repo/migrations/20201130190555_create_versions.exs +++ /dev/null @@ -1,22 +0,0 @@ -defmodule PaperTrail.UUIDWithCustomNameRepo.Migrations.CreateVersions do - use Ecto.Migration - - def change do - create table(:versions) do - add :event, :string, null: false, size: 10 - add :item_type, :string, null: false - add :item_id, (if System.get_env("STRING_TEST") == nil, do: :binary_id, else: :string) - add :item_changes, :map, null: false - add :originator_id, references(:people, type: :binary_id, column: :uuid) - add :origin, :string, size: 50 - add :meta, :map - - add :inserted_at, :utc_datetime, null: false - end - - create index(:versions, [:originator_id]) - create index(:versions, [:item_id, :item_type]) - create index(:versions, [:event, :item_type]) - create index(:versions, [:item_type, :inserted_at]) - end -end diff --git a/scripts/test.sh b/scripts/test.sh deleted file mode 100644 index 7f22d6c7..00000000 --- a/scripts/test.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -aeuo pipefail - -DOCKER_TAG=$(git rev-parse --short HEAD) -source .env - -mix test test/paper_trail -mix test test/version -mix test test/uuid diff --git a/setup-database.sh b/setup-database.sh deleted file mode 100644 index 6e494397..00000000 --- a/setup-database.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -set -oe allexport -source ./.env - -echo "PGHOST IS:" -echo $PGHOST - -# Prepare Dialyzer if the project has Dialyxer set up -# if mix help dialyzer >/dev/null 2>&1 -# then -# echo "\nFound Dialyxer: Setting up PLT..." -# mix do deps.compile, dialyzer --plt -# else -# echo "\nNo Dialyxer config: Skipping setup..." -# fi - -# Wait for Postgres to become available. -until psql -h $PGHOST -U "$PGUSER" -c '\q' 2>/dev/null; do - echo "Postgres is unavailable - sleeping" - sleep 1 -done - -echo "\nPostgres is available: continuing with database setup..." - -mix ecto.create -# mix ecto.migrate - -# echo "\nPostgres migrations finished..." diff --git a/test/paper_trail/bang_functions_simple_mode_test.exs b/test/paper_trail/bang_functions_simple_mode_test.exs deleted file mode 100644 index dba37f41..00000000 --- a/test/paper_trail/bang_functions_simple_mode_test.exs +++ /dev/null @@ -1,1154 +0,0 @@ -defmodule PaperTrailTest.SimpleModeBangFunctions do - use ExUnit.Case - - import Ecto.Query - - alias PaperTrail.Version - alias SimpleCompany, as: Company - alias SimplePerson, as: Person - alias PaperTrailTest.MultiTenantHelper, as: MultiTenant - alias PaperTrail.RepoClient - alias PaperTrail.Serializer - - @create_company_params %{name: "Acme LLC", is_active: true, city: "Greenwich"} - @update_company_params %{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - } - - defdelegate repo, to: RepoClient - defdelegate serialize(data), to: Serializer - - doctest PaperTrail - - setup_all do - Application.put_env(:paper_trail, :strict_mode, false) - Application.put_env(:paper_trail, :repo, PaperTrail.Repo) - Application.put_env(:paper_trail, :originator_type, :integer) - - - MultiTenant.setup_tenant(repo()) - :ok - end - - setup do - reset_all_data() - - on_exit(fn -> - reset_all_data() - end) - - :ok - end - - test "creating a company creates a company version with correct attributes" do - user = create_user() - company = create_company_with_version(@create_company_params, originator: user) - - company_count = Company.count() - version_count = Version.count() - - version = PaperTrail.get_version(company) |> serialize - - assert company_count == 1 - assert version_count == 1 - - assert company |> serialize |> Map.drop([:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Greenwich", - website: nil, - address: nil, - facebook: nil, - twitter: nil, - founded_in: nil, - location: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: company |> serialize |> convert_to_string_map, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> repo().one - end - - test "PaperTrail.insert!/2 with an error raises Ecto.InvalidChangesetError" do - assert_raise(Ecto.InvalidChangesetError, fn -> - create_company_with_version(%{name: nil, is_active: true, city: "Greenwich"}) - end) - end - - test "PaperTrail.insert!/2 passes ecto options through (e.g. upsert options)" do - user = create_user() - _result = create_company_with_version(@create_company_params, originator: user) - - new_create_company_params = @create_company_params |> Map.replace!(:city, "Barcelona") - - ecto_options = [on_conflict: {:replace_all_except, ~w{name}a}, conflict_target: :name] - - result = - create_company_with_version(new_create_company_params, - originator: user, - ecto_options: ecto_options - ) - - assert Company.count() == 1 - assert Version.count() == 2 - - assert Map.take(serialize(result), [:name, :city]) == %{name: "Acme LLC", city: "Barcelona"} - end - - test "updating a company with originator creates a correct company version" do - user = create_user() - inserted_company = create_company_with_version() - - updated_company = - update_company_with_version( - inserted_company, - @update_company_params, - user: user - ) - - company_count = Company.count() - version_count = Version.count() - - company = updated_company |> serialize - version = PaperTrail.get_version(updated_company) |> serialize - - assert company_count == 1 - assert version_count == 2 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: - convert_to_string_map(%{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> repo().one |> serialize - end - - test "updating a company with originator[user] creates a correct company version" do - user = create_user() - inserted_company = create_company_with_version() - - updated_company = - update_company_with_version( - inserted_company, - @update_company_params, - user: user - ) - - company_count = Company.count() - version_count = Version.count() - - company = updated_company |> serialize - version = PaperTrail.get_version(updated_company) |> serialize - - assert company_count == 1 - assert version_count == 2 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: - convert_to_string_map(%{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> repo().one |> serialize - end - - test "PaperTrail.update!/2 with an error raises Ecto.InvalidChangesetError" do - assert_raise(Ecto.InvalidChangesetError, fn -> - inserted_company = create_company_with_version() - - update_company_with_version(inserted_company, %{ - name: nil, - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }) - end) - end - - test "deleting a company creates a company version with correct attributes" do - user = create_user() - inserted_company = create_company_with_version() - updated_company = update_company_with_version(inserted_company) - company_before_deletion = first(Company, :id) |> repo().one |> serialize - deleted_company = PaperTrail.delete!(updated_company, originator: user) - - company_count = Company.count() - version_count = Version.count() - - company = deleted_company |> serialize - version = PaperTrail.get_version(deleted_company) |> serialize - - assert company_count == 0 - assert version_count == 3 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: - convert_to_string_map(%{ - id: company.id, - inserted_at: company.inserted_at, - updated_at: company.updated_at, - name: "Acme LLC", - is_active: true, - website: "http://www.acme.com", - city: "Hong Kong", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: nil - }), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == company_before_deletion - end - - test "PaperTrail.delete!/2 with an error raises Ecto.InvalidChangesetError" do - assert_raise(Ecto.InvalidChangesetError, fn -> - inserted_company = create_company_with_version() - - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_company.id - }) - |> PaperTrail.insert!() - - inserted_company |> Company.changeset() |> PaperTrail.delete!() - end) - end - - test "creating a person with meta tag creates a person version with correct attributes" do - create_company_with_version() - - second_company = - Company.changeset(%Company{}, %{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - |> PaperTrail.insert!() - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: second_company.id - }) - |> PaperTrail.insert!(origin: "admin", meta: %{linkname: "izelnakri"}) - - person_count = Person.count() - company_count = Company.count() - version_count = Version.count() - - person = inserted_person |> serialize - version = PaperTrail.get_version(inserted_person) |> serialize - - assert person_count == 1 - assert company_count == 2 - assert version_count == 3 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - visit_count: nil, - birthdate: nil, - company_id: second_company.id, - plural: [], - singular: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "SimplePerson", - item_id: person.id, - item_changes: convert_to_string_map(person), - originator_id: nil, - origin: "admin", - meta: %{"linkname" => "izelnakri"} - } - - assert person == first(Person, :id) |> repo().one |> serialize - end - - test "creating a person with embeds creates a person version with correct attributes" do - company = create_company_with_version() - - %Person{ - id: person_id, - plural: [%{id: _, name: "Plural"}], - singular: %{id: _, name: "Singular"} - } = - person = - %Person{} - |> Person.changeset(%{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: company.id, - plural: [%{name: "Plural"}], - singular: %{name: "Singular"} - }) - |> PaperTrail.insert!() - - version = PaperTrail.get_version(person) - person_change = person |> serialize() |> convert_to_string_map - - assert %{ - event: "insert", - item_type: "SimplePerson", - item_id: ^person_id, - item_changes: ^person_change - } = version - - assert person == first(Person, :id) |> repo().one - end - - test "updating a person creates a person version with correct attributes" do - inserted_initial_company = - create_company_with_version(%{ - name: "Acme LLC", - website: "http://www.acme.com" - }) - - inserted_target_company = - create_company_with_version(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_target_company.id - }) - |> PaperTrail.insert!(origin: "admin") - - updated_person = - Person.changeset(inserted_person, %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_initial_company.id - }) - |> PaperTrail.update!(origin: "scraper", meta: %{linkname: "izelnakri"}) - - person_count = Person.count() - company_count = Company.count() - version_count = Version.count() - - person = updated_person |> serialize - version = PaperTrail.get_version(updated_person) |> serialize - - assert person_count == 1 - assert company_count == 2 - assert version_count == 4 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - company_id: inserted_initial_company.id, - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - last_name: "Nakri", - gender: true, - plural: [], - singular: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "SimplePerson", - item_id: person.id, - item_changes: - convert_to_string_map(%{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_initial_company.id - }), - originator_id: nil, - origin: "scraper", - meta: %{"linkname" => "izelnakri"} - } - - assert person == first(Person, :id) |> repo().one |> serialize - end - - test "updating a person with embeds creates a person version with correct attributes" do - company = create_company_with_version() - - %Person{ - id: person_id, - plural: [%{id: _, name: "Plural"}], - singular: %{id: _, name: "Singular"} - } = - person = - %Person{} - |> Person.changeset(%{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: company.id - }) - |> PaperTrail.insert!() - |> Person.changeset(%{ - plural: [%{name: "Plural"}], - singular: %{name: "Singular"} - }) - |> PaperTrail.update!() - - version = PaperTrail.get_version(person) - - assert %{ - event: "update", - item_type: "SimplePerson", - item_id: ^person_id, - item_changes: %{ - "plural" => [%{"id" => _, "name" => "Plural"}], - "singular" => %{"id" => _, "name" => "Singular"} - } - } = version - - assert person == first(Person, :id) |> repo().one - end - - test "deleting a person creates a person version with correct attributes" do - create_company_with_version(%{name: "Acme LLC", website: "http://www.acme.com"}) - - inserted_target_company = - create_company_with_version(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_target_company.id - }) - |> PaperTrail.insert!(origin: "admin") - - updated_person = - Person.changeset(inserted_person, %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_target_company.id - }) - |> PaperTrail.update!(origin: "scraper", meta: %{linkname: "izelnakri"}) - - person_before_deletion = first(Person, :id) |> repo().one |> serialize - - deleted_person = - PaperTrail.delete!( - updated_person, - origin: "admin", - meta: %{linkname: "izelnakri"} - ) - - person_count = Person.count() - company_count = Company.count() - version_count = Version.count() - - old_person = updated_person |> serialize - version = PaperTrail.get_version(deleted_person) |> serialize - - assert person_count == 0 - assert company_count == 2 - assert version_count == 5 - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "SimplePerson", - item_id: old_person.id, - item_changes: - convert_to_string_map(%{ - id: old_person.id, - inserted_at: old_person.inserted_at, - updated_at: old_person.updated_at, - first_name: "Isaac", - last_name: "Nakri", - gender: true, - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_target_company.id, - plural: [], - singular: nil - }), - originator_id: nil, - origin: "admin", - meta: %{"linkname" => "izelnakri"} - } - - assert old_person == person_before_deletion - end - - test "deleting a person with embeds creates a person version with correct attributes" do - company = create_company_with_version() - - %Person{ - id: person_id, - plural: [%{id: _, name: "Plural"}], - singular: %{id: _, name: "Singular"} - } = - person = - %Person{} - |> Person.changeset(%{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: company.id, - plural: [%{name: "Plural"}], - singular: %{name: "Singular"} - }) - |> PaperTrail.insert!() - |> PaperTrail.delete!() - - version = PaperTrail.get_version(person) - person_change = person |> serialize() |> convert_to_string_map - - assert %{ - event: "delete", - item_type: "SimplePerson", - item_id: ^person_id, - item_changes: ^person_change - } = version - - assert is_nil(first(Person, :id) |> repo().one) - end - - # Multi tenant tests - test "[multi tenant] creating a company creates a company version with correct attributes" do - tenant = MultiTenant.tenant() - user = create_user(:multitenant) - company = create_company_with_version_multi(@create_company_params, originator: user) - - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - version = - PaperTrail.get_version(company, prefix: tenant) - |> serialize - - assert Company.count() == 0 - assert Version.count() == 0 - assert company_count == 1 - assert version_count == 1 - - assert company |> serialize |> Map.drop([:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Greenwich", - website: nil, - address: nil, - facebook: nil, - twitter: nil, - founded_in: nil, - location: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: company |> serialize |> convert_to_string_map, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first_company(:multitenant) - end - - test "[multi tenant] PaperTrail.insert!/2 with an error raises Ecto.InvalidChangesetError" do - assert_raise(Ecto.InvalidChangesetError, fn -> - create_company_with_version_multi(%{name: nil, is_active: true, city: "Greenwich"}) - end) - end - - test "[multi tenant] updating a company with originator creates a correct company version" do - tenant = MultiTenant.tenant() - user = create_user(:multitenant) - inserted_company = create_company_with_version_multi() - - updated_company = - update_company_with_version_multi( - inserted_company, - @update_company_params, - user: user - ) - - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - company = updated_company |> serialize - - version = - PaperTrail.get_version(updated_company, prefix: tenant) - |> serialize - - assert Company.count() == 0 - assert Version.count() == 0 - assert company_count == 1 - assert version_count == 2 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: - convert_to_string_map(%{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first_company(:multitenant) |> serialize - end - - test "[multi tenant] updating a company with originator[user] creates a correct company version" do - tenant = MultiTenant.tenant() - - user = create_user(:multitenant) - inserted_company = create_company_with_version_multi() - - updated_company = - update_company_with_version_multi( - inserted_company, - @update_company_params, - user: user - ) - - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - company = updated_company |> serialize - - version = - PaperTrail.get_version(updated_company, prefix: tenant) - |> serialize - - assert Company.count() == 0 - assert Version.count() == 0 - assert company_count == 1 - assert version_count == 2 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: - convert_to_string_map(%{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first_company(:multitenant) |> serialize - end - - test "[multi tenant] PaperTrail.update!/2 with an error raises Ecto.InvalidChangesetError" do - assert_raise(Ecto.InvalidChangesetError, fn -> - inserted_company = create_company_with_version_multi() - - update_company_with_version_multi(inserted_company, %{ - name: nil, - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }) - end) - end - - test "[multi tenant] deleting a company creates a company version with correct attributes" do - tenant = MultiTenant.tenant() - - user = create_user(:multitenant) - inserted_company = create_company_with_version_multi() - updated_company = update_company_with_version_multi(inserted_company) - company_before_deletion = first_company(:multitenant) |> serialize - - deleted_company = - PaperTrail.delete!( - updated_company, - originator: user, - prefix: tenant - ) - - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - company = deleted_company |> serialize - version = PaperTrail.get_version(deleted_company, prefix: tenant) |> serialize - - assert Company.count() == 0 - assert Version.count() == 0 - assert company_count == 0 - assert version_count == 3 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: - convert_to_string_map(%{ - id: company.id, - inserted_at: company.inserted_at, - updated_at: company.updated_at, - name: "Acme LLC", - is_active: true, - website: "http://www.acme.com", - city: "Hong Kong", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: nil - }), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == company_before_deletion - end - - test "[multi tenant] PaperTrail.delete!/2 with an error raises Ecto.InvalidChangesetError" do - tenant = MultiTenant.tenant() - - assert_raise(Ecto.InvalidChangesetError, fn -> - inserted_company = create_company_with_version_multi() - - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_company.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert!(prefix: tenant) - - inserted_company - |> Company.changeset() - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.delete!(prefix: tenant) - end) - end - - test "[multi tenant] creating a person with meta tag creates a person version with correct attributes" do - tenant = MultiTenant.tenant() - - create_company_with_version_multi() - - second_company = - Company.changeset(%Company{}, %{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert!(prefix: tenant) - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: second_company.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert!(origin: "admin", meta: %{linkname: "izelnakri"}, prefix: tenant) - - assert Person.count() == 0 - assert Company.count() == 0 - assert Version.count() == 0 - person_count = Person.count(:multitenant) - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - person = inserted_person |> serialize - version = PaperTrail.get_version(inserted_person, prefix: tenant) |> serialize - - assert person_count == 1 - assert company_count == 2 - assert version_count == 3 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - visit_count: nil, - birthdate: nil, - company_id: second_company.id, - plural: [], - singular: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "SimplePerson", - item_id: person.id, - item_changes: convert_to_string_map(person), - originator_id: nil, - origin: "admin", - meta: %{"linkname" => "izelnakri"} - } - - assert person == first_person(:multitenant) |> serialize - end - - test "[multi tenant] updating a person creates a person version with correct attributes" do - tenant = MultiTenant.tenant() - - inserted_initial_company = - create_company_with_version_multi(%{ - name: "Acme LLC", - website: "http://www.acme.com" - }) - - inserted_target_company = - create_company_with_version_multi(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_target_company.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert!(origin: "admin", prefix: tenant) - - updated_person = - Person.changeset(inserted_person, %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_initial_company.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.update!(origin: "scraper", meta: %{linkname: "izelnakri"}, prefix: tenant) - - person_count = Person.count(:multitenant) - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - person = updated_person |> serialize - version = PaperTrail.get_version(updated_person, prefix: tenant) |> serialize - - assert Person.count() == 0 - assert Company.count() == 0 - assert Version.count() == 0 - assert person_count == 1 - assert company_count == 2 - assert version_count == 4 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - company_id: inserted_initial_company.id, - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - last_name: "Nakri", - gender: true, - plural: [], - singular: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "SimplePerson", - item_id: person.id, - item_changes: - convert_to_string_map(%{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_initial_company.id - }), - originator_id: nil, - origin: "scraper", - meta: %{"linkname" => "izelnakri"} - } - - assert person == first_person(:multitenant) |> serialize - end - - test "[multi tenant] deleting a person creates a person version with correct attributes" do - tenant = MultiTenant.tenant() - - create_company_with_version_multi(%{name: "Acme LLC", website: "http://www.acme.com"}) - - inserted_target_company = - create_company_with_version_multi(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_target_company.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert!(origin: "admin", prefix: tenant) - - updated_person = - Person.changeset(inserted_person, %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_target_company.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.update!(origin: "scraper", meta: %{linkname: "izelnakri"}, prefix: tenant) - - person_before_deletion = first_person(:multitenant) |> serialize - - deleted_person = - PaperTrail.delete!( - updated_person, - origin: "admin", - meta: %{linkname: "izelnakri"}, - prefix: tenant - ) - - person_count = Person.count(:multitenant) - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - old_person = updated_person |> serialize - version = PaperTrail.get_version(deleted_person, prefix: tenant) |> serialize - - assert Person.count() == 0 - assert Company.count() == 0 - assert Version.count() == 0 - assert person_count == 0 - assert company_count == 2 - assert version_count == 5 - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "SimplePerson", - item_id: old_person.id, - item_changes: - convert_to_string_map(%{ - id: old_person.id, - inserted_at: old_person.inserted_at, - updated_at: old_person.updated_at, - first_name: "Isaac", - last_name: "Nakri", - gender: true, - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_target_company.id, - plural: [], - singular: nil - }), - originator_id: nil, - origin: "admin", - meta: %{"linkname" => "izelnakri"} - } - - assert old_person == person_before_deletion - end - - # Functions - defp create_user() do - User.changeset(%User{}, %{token: "fake-token", username: "izelnakri"}) - |> repo().insert! - end - - defp create_user(:multitenant) do - User.changeset(%User{}, %{token: "fake-token", username: "izelnakri"}) - |> MultiTenant.add_prefix_to_changeset() - |> repo().insert! - end - - defp create_company_with_version(params \\ @create_company_params, options \\ nil) do - Company.changeset(%Company{}, params) |> PaperTrail.insert!(options) - end - - defp create_company_with_version_multi(params \\ @create_company_params, options \\ nil) do - opts_with_prefix = Keyword.put(options || [], :prefix, MultiTenant.tenant()) - - Company.changeset(%Company{}, params) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert!(opts_with_prefix) - end - - defp update_company_with_version(company, params \\ @update_company_params, options \\ []) do - Company.changeset(company, params) |> PaperTrail.update!(options) - end - - defp update_company_with_version_multi( - company, - params \\ @update_company_params, - options \\ nil - ) do - opts_with_prefix = Keyword.put(options || [], :prefix, MultiTenant.tenant()) - - Company.changeset(company, params) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.update!(opts_with_prefix) - end - - defp first_company(:multitenant) do - first(Company, :id) |> MultiTenant.add_prefix_to_query() |> repo().one() - end - - defp first_person(:multitenant) do - first(Person, :id) |> MultiTenant.add_prefix_to_query() |> repo().one() - end - - defp reset_all_data() do - repo().delete_all(Person) - repo().delete_all(Company) - repo().delete_all(Version) - - Person - |> MultiTenant.add_prefix_to_query() - |> repo().delete_all() - - Company - |> MultiTenant.add_prefix_to_query() - |> repo().delete_all() - - Version - |> MultiTenant.add_prefix_to_query() - |> repo().delete_all() - end - - defp convert_to_string_map(map) do - map |> Jason.encode!() |> Jason.decode!() - end -end diff --git a/test/paper_trail/bang_functions_strict_mode_test.exs b/test/paper_trail/bang_functions_strict_mode_test.exs deleted file mode 100644 index c4b33f28..00000000 --- a/test/paper_trail/bang_functions_strict_mode_test.exs +++ /dev/null @@ -1,1054 +0,0 @@ -defmodule PaperTrailTest.StrictModeBangFunctions do - use ExUnit.Case - - import Ecto.Query - - alias PaperTrail.Version - alias StrictCompany, as: Company - alias StrictPerson, as: Person - alias PaperTrailTest.MultiTenantHelper, as: MultiTenant - alias PaperTrail.RepoClient - alias PaperTrail.Serializer - - @create_company_params %{name: "Acme LLC", is_active: true, city: "Greenwich"} - @update_company_params %{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - } - - defdelegate repo, to: RepoClient - defdelegate serialize(data), to: Serializer - - doctest PaperTrail - - setup_all do - Application.put_env(:paper_trail, :strict_mode, true) - Application.put_env(:paper_trail, :repo, PaperTrail.Repo) - Application.put_env(:paper_trail, :originator_type, :integer) - - - MultiTenant.setup_tenant(repo()) - :ok - end - - setup do - reset_all_data() - - on_exit(fn -> - reset_all_data() - end) - - :ok - end - - test "creating a company creates a company version with correct attributes" do - user = create_user() - inserted_company = create_company_with_version(@create_company_params, user: user) - - company_count = Company.count() - version_count = Version.count() - - company = inserted_company |> serialize() - version = PaperTrail.get_version(inserted_company) |> serialize() - - assert company_count == 1 - assert version_count == 1 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Greenwich", - website: nil, - address: nil, - facebook: nil, - twitter: nil, - founded_in: nil, - first_version_id: version.id, - current_version_id: version.id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "StrictCompany", - item_id: company.id, - item_changes: convert_to_string_map(company), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> repo().one |> serialize - end - - test "creating a company without changeset creates a company version with correct attributes" do - inserted_company = PaperTrail.insert!(%Company{name: "Acme LLC"}) - company_count = Company.count() - version_count = Version.count() - - company = inserted_company |> serialize - version = PaperTrail.get_version(inserted_company) |> serialize - - assert company_count == 1 - assert version_count == 1 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: nil, - city: nil, - website: nil, - address: nil, - facebook: nil, - twitter: nil, - founded_in: nil, - first_version_id: version.id, - current_version_id: version.id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "StrictCompany", - item_id: company.id, - item_changes: convert_to_string_map(company), - originator_id: nil, - origin: nil, - meta: nil - } - end - - test "PaperTrail.insert!/2 with an error raises Ecto.InvalidChangesetError" do - assert_raise(Ecto.InvalidChangesetError, fn -> - create_company_with_version(%{name: nil, is_active: true, city: "Greenwich"}) - end) - end - - test "PaperTrail.insert!/2 passes ecto options through (e.g. upsert options)" do - user = create_user() - _result = create_company_with_version(@create_company_params, originator: user) - - new_create_company_params = @create_company_params |> Map.replace!(:city, "Barcelona") - - ecto_options = [on_conflict: {:replace_all_except, ~w{name}a}, conflict_target: :name] - - result = - create_company_with_version(new_create_company_params, - originator: user, - ecto_options: ecto_options - ) - - assert Company.count() == 1 - assert Version.count() == 2 - - assert Map.take(serialize(result), [:name, :city]) == %{name: "Acme LLC", city: "Barcelona"} - end - - test "updating a company creates a company version with correct item_changes" do - user = create_user() - inserted_company = create_company_with_version() - inserted_company_version = PaperTrail.get_version(inserted_company) |> serialize - - updated_company = - update_company_with_version( - inserted_company, - @update_company_params, - originator: user - ) - - company_count = Company.count() - version_count = Version.count() - - company = updated_company |> serialize - updated_company_version = PaperTrail.get_version(updated_company) |> serialize - - assert company_count == 1 - assert version_count == 2 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - first_version_id: inserted_company_version.id, - current_version_id: updated_company_version.id - } - - assert Map.drop(updated_company_version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "StrictCompany", - item_id: company.id, - item_changes: - convert_to_string_map(%{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc", - current_version_id: updated_company_version.id - }), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> repo().one |> serialize - end - - test "PaperTrail.update!/2 with an error raises Ecto.InvalidChangesetError" do - assert_raise(Ecto.InvalidChangesetError, fn -> - inserted_company = create_company_with_version() - - update_company_with_version(inserted_company, %{ - name: nil, - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }) - end) - end - - test "deleting a company creates a company version with correct attributes" do - user = create_user() - inserted_company = create_company_with_version() - inserted_company_version = PaperTrail.get_version(inserted_company) - updated_company = update_company_with_version(inserted_company) - updated_company_version = PaperTrail.get_version(updated_company) - company_before_deletion = first(Company, :id) |> repo().one |> serialize - deleted_company = PaperTrail.delete!(updated_company, user: user) - - company_count = Company.count() - version_count = Version.count() - - old_company = deleted_company |> serialize - deleted_company_version = PaperTrail.get_version(deleted_company) |> serialize - - assert company_count == 0 - assert version_count == 3 - - assert Map.drop(old_company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - first_version_id: inserted_company_version.id, - current_version_id: updated_company_version.id - } - - assert Map.drop(deleted_company_version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "StrictCompany", - item_id: old_company.id, - item_changes: - convert_to_string_map(%{ - id: old_company.id, - inserted_at: old_company.inserted_at, - updated_at: old_company.updated_at, - name: "Acme LLC", - is_active: true, - website: "http://www.acme.com", - city: "Hong Kong", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - first_version_id: inserted_company_version.id, - current_version_id: updated_company_version.id - }), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert old_company == company_before_deletion - end - - test "PaperTrail.delete!/2 with an error raises Ecto.InvalidChangesetError" do - assert_raise(Ecto.InvalidChangesetError, fn -> - inserted_company = create_company_with_version() - - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_company.id - }) - |> PaperTrail.insert!() - - inserted_company |> Company.changeset() |> PaperTrail.delete!() - end) - end - - test "creating a person with meta tag creates a person version with correct attributes" do - create_company_with_version(%{name: "Acme LLC", website: "http://www.acme.com"}) - - inserted_company = - create_company_with_version(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_company.id - }) - |> PaperTrail.insert!(origin: "admin", meta: %{linkname: "izelnakri"}) - - person_count = Person.count() - version_count = Version.count() - - person = inserted_person |> serialize - version = PaperTrail.get_version(inserted_person) |> serialize - - assert person_count == 1 - assert version_count == 3 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - visit_count: nil, - birthdate: nil, - company_id: inserted_company.id, - first_version_id: version.id, - current_version_id: version.id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "StrictPerson", - item_id: person.id, - item_changes: convert_to_string_map(person), - originator_id: nil, - origin: "admin", - meta: %{"linkname" => "izelnakri"} - } - - assert person == first(Person, :id) |> repo().one |> serialize - end - - test "updating a person creates a person version with correct attributes" do - inserted_initial_company = - create_company_with_version(%{ - name: "Acme LLC", - website: "http://www.acme.com" - }) - - inserted_target_company = - create_company_with_version(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_target_company.id - }) - |> PaperTrail.insert!(origin: "admin") - - inserted_person_version = PaperTrail.get_version(inserted_person) |> serialize - - updated_person = - Person.changeset(inserted_person, %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_initial_company.id - }) - |> PaperTrail.update!(origin: "scraper", meta: %{linkname: "izelnakri"}) - - person_count = Person.count() - company_count = Company.count() - version_count = Version.count() - - person = updated_person |> serialize - updated_person_version = PaperTrail.get_version(updated_person) |> serialize - - assert person_count == 1 - assert company_count == 2 - assert version_count == 4 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - company_id: inserted_initial_company.id, - first_name: "Isaac", - visit_count: 10, - # this is the only problem - birthdate: ~D[1992-04-01], - last_name: "Nakri", - gender: true, - first_version_id: inserted_person_version.id, - current_version_id: updated_person_version.id - } - - assert Map.drop(updated_person_version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "StrictPerson", - item_id: person.id, - item_changes: - convert_to_string_map(%{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - current_version_id: updated_person_version.id, - company_id: inserted_initial_company.id - }), - originator_id: nil, - origin: "scraper", - meta: %{"linkname" => "izelnakri"} - } - - assert person == first(Person, :id) |> repo().one |> serialize - end - - test "deleting a person creates a person version with correct attributes" do - create_company_with_version(%{name: "Acme LLC", website: "http://www.acme.com"}) - - inserted_company = - create_company_with_version(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_company.id - }) - |> PaperTrail.insert!(origin: "admin") - - inserted_person_version = PaperTrail.get_version(inserted_person) |> serialize - - updated_person = - Person.changeset(inserted_person, %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01] - }) - |> PaperTrail.update!(origin: "scraper", meta: %{linkname: "izelnakri"}) - - updated_person_version = PaperTrail.get_version(updated_person) |> serialize - person_before_deletion = first(Person, :id) |> repo().one - - deleted_person = - PaperTrail.delete!( - updated_person, - origin: "admin", - meta: %{linkname: "izelnakri"} - ) - - deleted_person_version = PaperTrail.get_version(deleted_person) |> serialize - - person_count = Person.count() - company_count = Company.count() - version_count = Version.count() - - assert person_count == 0 - assert company_count == 2 - assert version_count == 5 - - assert Map.drop(deleted_person_version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "StrictPerson", - item_id: deleted_person.id, - item_changes: - convert_to_string_map(%{ - id: deleted_person.id, - inserted_at: deleted_person.inserted_at, - updated_at: deleted_person.updated_at, - first_name: "Isaac", - last_name: "Nakri", - gender: true, - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_company.id, - first_version_id: inserted_person_version.id, - current_version_id: updated_person_version.id - }), - originator_id: nil, - origin: "admin", - meta: %{"linkname" => "izelnakri"} - } - - assert deleted_person |> serialize == person_before_deletion |> serialize - end - - # Multi tenant tests - test "[multi tenant] creating a company creates a company version with correct attributes" do - tenant = MultiTenant.tenant() - user = create_user(:multitenant) - inserted_company = create_company_with_version_multi(@create_company_params, user: user) - - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - company = inserted_company |> serialize() - - version = - PaperTrail.get_version(inserted_company, prefix: tenant) - |> serialize() - - assert Company.count() == 0 - assert Version.count() == 0 - assert company_count == 1 - assert version_count == 1 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Greenwich", - website: nil, - address: nil, - facebook: nil, - twitter: nil, - founded_in: nil, - first_version_id: version.id, - current_version_id: version.id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "StrictCompany", - item_id: company.id, - item_changes: convert_to_string_map(company), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first_company(:multitenant) |> serialize - end - - test "[multi tenant] creating a company without changeset creates a company version with correct attributes" do - tenant = MultiTenant.tenant() - - inserted_company = - create_company_with_version_multi(%{name: "Acme LLC"}, prefix: MultiTenant.tenant()) - - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - company = inserted_company |> serialize - - version = - PaperTrail.get_version(inserted_company, prefix: tenant) - |> serialize - - assert Company.count() == 0 - assert Version.count() == 0 - assert company_count == 1 - assert version_count == 1 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: nil, - city: nil, - website: nil, - address: nil, - facebook: nil, - twitter: nil, - founded_in: nil, - first_version_id: version.id, - current_version_id: version.id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "StrictCompany", - item_id: company.id, - item_changes: convert_to_string_map(company), - originator_id: nil, - origin: nil, - meta: nil - } - end - - test "[multi tenant] PaperTrail.insert!/2 with an error raises Ecto.InvalidChangesetError" do - assert_raise(Ecto.InvalidChangesetError, fn -> - create_company_with_version_multi(%{name: nil, is_active: true, city: "Greenwich"}) - end) - end - - test "[multi tenant] updating a company creates a company version with correct item_changes" do - tenant = MultiTenant.tenant() - - user = create_user(:multitenant) - inserted_company = create_company_with_version_multi() - - inserted_company_version = - PaperTrail.get_version(inserted_company, prefix: tenant) - |> serialize - - updated_company = - update_company_with_version_multi( - inserted_company, - @update_company_params, - originator: user - ) - - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - company = updated_company |> serialize - - updated_company_version = - PaperTrail.get_version(updated_company, prefix: tenant) - |> serialize - - assert Company.count() == 0 - assert Version.count() == 0 - assert company_count == 1 - assert version_count == 2 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - first_version_id: inserted_company_version.id, - current_version_id: updated_company_version.id - } - - assert Map.drop(updated_company_version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "StrictCompany", - item_id: company.id, - item_changes: - convert_to_string_map(%{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc", - current_version_id: updated_company_version.id - }), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first_company(:multitenant) |> serialize - end - - test "[multi tenant] PaperTrail.update!/2 with an error raises Ecto.InvalidChangesetError" do - assert_raise(Ecto.InvalidChangesetError, fn -> - inserted_company = create_company_with_version_multi() - - update_company_with_version_multi(inserted_company, %{ - name: nil, - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }) - end) - end - - test "[multi tenant] deleting a company creates a company version with correct attributes" do - tenant = MultiTenant.tenant() - - user = create_user(:multitenant) - inserted_company = create_company_with_version_multi() - inserted_company_version = PaperTrail.get_version(inserted_company, prefix: tenant) - updated_company = update_company_with_version_multi(inserted_company) - updated_company_version = PaperTrail.get_version(updated_company, prefix: tenant) - company_before_deletion = first_company(:multitenant) |> serialize - deleted_company = PaperTrail.delete!(updated_company, user: user, prefix: tenant) - - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - old_company = deleted_company |> serialize - - deleted_company_version = - PaperTrail.get_version(deleted_company, prefix: tenant) - |> serialize - - assert Company.count() == 0 - assert Version.count() == 0 - assert company_count == 0 - assert version_count == 3 - - assert Map.drop(old_company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - first_version_id: inserted_company_version.id, - current_version_id: updated_company_version.id - } - - assert Map.drop(deleted_company_version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "StrictCompany", - item_id: old_company.id, - item_changes: - convert_to_string_map(%{ - id: old_company.id, - inserted_at: old_company.inserted_at, - updated_at: old_company.updated_at, - name: "Acme LLC", - is_active: true, - website: "http://www.acme.com", - city: "Hong Kong", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - first_version_id: inserted_company_version.id, - current_version_id: updated_company_version.id - }), - originator_id: user.id, - origin: nil, - meta: nil - } - - assert old_company == company_before_deletion - end - - test "[multi tenant] PaperTrail.delete!/2 with an error raises Ecto.InvalidChangesetError" do - tenant = MultiTenant.tenant() - - assert_raise(Ecto.InvalidChangesetError, fn -> - inserted_company = create_company_with_version_multi() - - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_company.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert!(prefix: tenant) - - inserted_company - |> Company.changeset() - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.delete!(prefix: tenant) - end) - end - - test "[multi tenant] creating a person with meta tag creates a person version with correct attributes" do - tenant = MultiTenant.tenant() - - create_company_with_version_multi(%{name: "Acme LLC", website: "http://www.acme.com"}) - - inserted_company = - create_company_with_version_multi(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_company.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert!(origin: "admin", meta: %{linkname: "izelnakri"}, prefix: tenant) - - person_count = Person.count(:multitenant) - version_count = Version.count(prefix: tenant) - - person = inserted_person |> serialize - version = PaperTrail.get_version(inserted_person, prefix: tenant) |> serialize - - assert Person.count() == 0 - assert Version.count() == 0 - assert person_count == 1 - assert version_count == 3 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - visit_count: nil, - birthdate: nil, - company_id: inserted_company.id, - first_version_id: version.id, - current_version_id: version.id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "StrictPerson", - item_id: person.id, - item_changes: convert_to_string_map(person), - originator_id: nil, - origin: "admin", - meta: %{"linkname" => "izelnakri"} - } - - assert person == first_person(:multitenant) |> serialize - end - - test "[multi tenant] updating a person creates a person version with correct attributes" do - tenant = MultiTenant.tenant() - - inserted_initial_company = - create_company_with_version_multi(%{ - name: "Acme LLC", - website: "http://www.acme.com" - }) - - inserted_target_company = - create_company_with_version_multi(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_target_company.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert!(origin: "admin", prefix: tenant) - - inserted_person_version = - PaperTrail.get_version(inserted_person, prefix: tenant) - |> serialize - - updated_person = - Person.changeset(inserted_person, %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_initial_company.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.update!(origin: "scraper", meta: %{linkname: "izelnakri"}, prefix: tenant) - - person_count = Person.count(:multitenant) - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - person = updated_person |> serialize - - updated_person_version = - PaperTrail.get_version(updated_person, prefix: tenant) - |> serialize - - assert Person.count() == 0 - assert Version.count() == 0 - assert person_count == 1 - assert company_count == 2 - assert version_count == 4 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - company_id: inserted_initial_company.id, - first_name: "Isaac", - visit_count: 10, - # this is the only problem - birthdate: ~D[1992-04-01], - last_name: "Nakri", - gender: true, - first_version_id: inserted_person_version.id, - current_version_id: updated_person_version.id - } - - assert Map.drop(updated_person_version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "StrictPerson", - item_id: person.id, - item_changes: - convert_to_string_map(%{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - current_version_id: updated_person_version.id, - company_id: inserted_initial_company.id - }), - originator_id: nil, - origin: "scraper", - meta: %{"linkname" => "izelnakri"} - } - - assert person == first_person(:multitenant) |> serialize - end - - test "[multi tenant] deleting a person creates a person version with correct attributes" do - tenant = MultiTenant.tenant() - - create_company_with_version_multi(%{name: "Acme LLC", website: "http://www.acme.com"}) - - inserted_company = - create_company_with_version_multi(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - inserted_person = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: inserted_company.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert!(origin: "admin", prefix: tenant) - - inserted_person_version = - PaperTrail.get_version(inserted_person, prefix: tenant) - |> serialize - - updated_person = - Person.changeset(inserted_person, %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01] - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.update!(origin: "scraper", meta: %{linkname: "izelnakri"}, prefix: tenant) - - updated_person_version = - PaperTrail.get_version(updated_person, prefix: tenant) - |> serialize - - person_before_deletion = first_person(:multitenant) - - deleted_person = - PaperTrail.delete!( - updated_person, - origin: "admin", - meta: %{linkname: "izelnakri"}, - prefix: tenant - ) - - deleted_person_version = - PaperTrail.get_version(deleted_person, prefix: tenant) - |> serialize - - person_count = Person.count(:multitenant) - company_count = Company.count(:multitenant) - version_count = Version.count(prefix: tenant) - - assert Company.count() == 0 - assert Person.count() == 0 - assert Version.count() == 0 - assert person_count == 0 - assert company_count == 2 - assert version_count == 5 - - assert Map.drop(deleted_person_version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "StrictPerson", - item_id: deleted_person.id, - item_changes: - convert_to_string_map(%{ - id: deleted_person.id, - inserted_at: deleted_person.inserted_at, - updated_at: deleted_person.updated_at, - first_name: "Isaac", - last_name: "Nakri", - gender: true, - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: inserted_company.id, - first_version_id: inserted_person_version.id, - current_version_id: updated_person_version.id - }), - originator_id: nil, - origin: "admin", - meta: %{"linkname" => "izelnakri"} - } - - assert deleted_person |> serialize == person_before_deletion |> serialize - end - - # Functions - defp create_user() do - User.changeset(%User{}, %{token: "fake-token", username: "izelnakri"}) - |> repo().insert! - end - - defp create_user(:multitenant) do - User.changeset(%User{}, %{token: "fake-token", username: "izelnakri"}) - |> MultiTenant.add_prefix_to_changeset() - |> repo().insert! - end - - defp create_company_with_version(params \\ @create_company_params, options \\ nil) do - Company.changeset(%Company{}, params) |> PaperTrail.insert!(options) - end - - defp create_company_with_version_multi(params \\ @create_company_params, options \\ nil) do - opts_with_prefix = Keyword.put(options || [], :prefix, MultiTenant.tenant()) - - Company.changeset(%Company{}, params) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert!(opts_with_prefix) - end - - defp update_company_with_version(company, params \\ @update_company_params, options \\ []) do - Company.changeset(company, params) |> PaperTrail.update!(options) - end - - defp update_company_with_version_multi( - company, - params \\ @update_company_params, - options \\ [] - ) do - opts_with_prefix = Keyword.put(options || [], :prefix, MultiTenant.tenant()) - - Company.changeset(company, params) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.update!(opts_with_prefix) - end - - defp first_company(:multitenant) do - first(Company, :id) |> MultiTenant.add_prefix_to_query() |> repo().one() - end - - defp first_person(:multitenant) do - first(Person, :id) |> MultiTenant.add_prefix_to_query() |> repo().one() - end - - defp reset_all_data() do - repo().delete_all(Person) - repo().delete_all(Company) - repo().delete_all(Version) - - Person - |> MultiTenant.add_prefix_to_query() - |> repo().delete_all() - - Company - |> MultiTenant.add_prefix_to_query() - |> repo().delete_all() - - Version - |> MultiTenant.add_prefix_to_query() - |> repo().delete_all() - end - - defp convert_to_string_map(map) do - map |> Jason.encode!() |> Jason.decode!() - end -end diff --git a/test/paper_trail/base_test.exs b/test/paper_trail/base_test.exs deleted file mode 100644 index d06f1658..00000000 --- a/test/paper_trail/base_test.exs +++ /dev/null @@ -1,721 +0,0 @@ -defmodule PaperTrailTest do - use ExUnit.Case - - import Ecto.Query - - alias PaperTrail.Version - alias SimpleCompany, as: Company - alias SimplePerson, as: Person - alias PaperTrail.Serializer - - @repo PaperTrail.RepoClient.repo() - @create_company_params %{ - name: "Acme LLC", - is_active: true, - city: "Greenwich", - location: %{country: "Brazil"} - } - @update_company_params %{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc", - location: %{country: "Chile"} - } - - defdelegate serialize(data), to: Serializer - - doctest PaperTrail - - setup_all do - Application.put_env(:paper_trail, :strict_mode, false) - Application.put_env(:paper_trail, :repo, PaperTrail.Repo) - - :ok - end - - setup do - @repo.delete_all(Person) - @repo.delete_all(Company) - @repo.delete_all(Version) - - on_exit(fn -> - @repo.delete_all(Person) - @repo.delete_all(Company) - @repo.delete_all(Version) - end) - - :ok - end - - test "creating a company creates a company version with correct attributes" do - user = create_user() - {:ok, result} = create_company_with_version(@create_company_params, originator: user) - - company_count = Company.count() - version_count = Version.count() - - company = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert company_count == 1 - assert version_count == 1 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Greenwich", - website: nil, - address: nil, - facebook: nil, - twitter: nil, - founded_in: nil, - location: %{country: "Brazil"} - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: company, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> @repo.one |> serialize - end - - test "PaperTrail.insert/2 with an error returns and error tuple like Repo.insert/2" do - result = create_company_with_version(%{name: nil, is_active: true, city: "Greenwich"}) - - ecto_result = - Company.changeset(%Company{}, %{name: nil, is_active: true, city: "Greenwich"}) - |> @repo.insert - - assert result == ecto_result - end - - test "PaperTrail.insert/2 passes ecto options through (e.g. upsert options)" do - user = create_user() - {:ok, _result} = create_company_with_version(@create_company_params, originator: user) - - new_create_company_params = @create_company_params |> Map.replace!(:city, "Barcelona") - - ecto_options = [on_conflict: {:replace_all_except, ~w{name}a}, conflict_target: :name] - - {:ok, result} = - create_company_with_version(new_create_company_params, - originator: user, - ecto_options: ecto_options - ) - - assert Company.count() == 1 - assert Version.count() == 2 - - assert Map.take(serialize(result[:model]), [:name, :city]) == %{ - name: "Acme LLC", - city: "Barcelona" - } - end - - test "PaperTrail.insert_or_update/2 creates a new record when it does not already exist" do - user = create_user() - - {:ok, result} = - Company.changeset(%Company{}, @create_company_params) - |> PaperTrail.insert_or_update(originator: user) - - company_count = Company.count() - version_count = Version.count() - - company = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert company_count == 1 - assert version_count == 1 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Greenwich", - website: nil, - address: nil, - facebook: nil, - twitter: nil, - founded_in: nil, - location: %{country: "Brazil"} - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: company, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> @repo.one |> serialize - end - - test "PaperTrail.insert_or_update/2 updates a record when already exists" do - user = create_user() - {:ok, insert_result} = create_company_with_version() - - {:ok, result} = - Company.changeset(insert_result[:model], @update_company_params) - |> PaperTrail.insert_or_update(originator: user) - - company_count = Company.count() - version_count = Version.count() - - company = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert company_count == 1 - assert version_count == 2 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: %{country: "Chile"} - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: %{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc", - location: %{country: "Chile"} - }, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> @repo.one |> serialize - end - - test "updating a company with originator creates a correct company version" do - user = create_user() - {:ok, insert_result} = create_company_with_version() - - {:ok, result} = - update_company_with_version( - insert_result[:model], - @update_company_params, - user: user - ) - - company_count = Company.count() - version_count = Version.count() - - company = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert company_count == 1 - assert version_count == 2 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: %{country: "Chile"} - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: %{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc", - location: %{country: "Chile"} - }, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> @repo.one |> serialize - end - - test "updating a company with originator[user] creates a correct company version" do - user = create_user() - {:ok, insert_result} = create_company_with_version() - - {:ok, result} = - update_company_with_version( - insert_result[:model], - @update_company_params, - user: user - ) - - company_count = Company.count() - version_count = Version.count() - - company = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert company_count == 1 - assert version_count == 2 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: %{country: "Chile"} - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: %{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc", - location: %{country: "Chile"} - }, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> @repo.one |> serialize - end - - test "PaperTrail.update/2 with an error returns and error tuple like Repo.update/2" do - {:ok, insert_result} = create_company_with_version() - company = insert_result[:model] - - result = - update_company_with_version(company, %{ - name: nil, - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }) - - ecto_result = - Company.changeset(company, %{ - name: nil, - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }) - |> @repo.update - - assert result == ecto_result - end - - test "deleting a company creates a company version with correct attributes" do - user = create_user() - {:ok, insert_result} = create_company_with_version() - {:ok, update_result} = update_company_with_version(insert_result[:model]) - company_before_deletion = first(Company, :id) |> @repo.one |> serialize - {:ok, result} = PaperTrail.delete(update_result[:model], originator: user) - - company_count = Company.count() - version_count = Version.count() - - company = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert company_count == 0 - assert version_count == 3 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: %{country: "Chile"} - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: %{ - id: company.id, - inserted_at: company.inserted_at, - updated_at: company.updated_at, - name: "Acme LLC", - is_active: true, - website: "http://www.acme.com", - city: "Hong Kong", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: %{country: "Chile"} - }, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == company_before_deletion - end - - test "delete works with a changeset" do - user = create_user() - {:ok, insert_result} = create_company_with_version() - {:ok, _update_result} = update_company_with_version(insert_result[:model]) - company_before_deletion = first(Company, :id) |> @repo.one - - changeset = Company.changeset(company_before_deletion, %{}) - {:ok, result} = PaperTrail.delete(changeset, originator: user) - - company_count = Company.count() - version_count = Version.count() - - company = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert company_count == 0 - assert version_count == 3 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: %{country: "Chile"} - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "SimpleCompany", - item_id: company.id, - item_changes: %{ - id: company.id, - inserted_at: company.inserted_at, - updated_at: company.updated_at, - name: "Acme LLC", - is_active: true, - website: "http://www.acme.com", - city: "Hong Kong", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - location: %{country: "Chile"} - }, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == serialize(company_before_deletion) - end - - test "PaperTrail.delete/2 with an error returns and error tuple like Repo.delete/2" do - {:ok, insert_company_result} = create_company_with_version() - - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: insert_company_result[:model].id - }) - |> PaperTrail.insert() - - {:error, ecto_result} = insert_company_result[:model] |> Company.changeset() |> @repo.delete - {:error, result} = insert_company_result[:model] |> Company.changeset() |> PaperTrail.delete() - - assert Map.drop(result, [:repo_opts]) == Map.drop(ecto_result, [:repo_opts]) - end - - test "creating a person with meta tag creates a person version with correct attributes" do - create_company_with_version() - - {:ok, new_company_result} = - Company.changeset(%Company{}, %{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - |> PaperTrail.insert() - - {:ok, result} = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: new_company_result[:model].id - }) - |> PaperTrail.insert(origin: "admin", meta: %{linkname: "izelnakri"}) - - person_count = Person.count() - version_count = Version.count() - - person = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert person_count == 1 - assert version_count == 3 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - visit_count: nil, - birthdate: nil, - company_id: new_company_result[:model].id, - plural: [], - singular: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "SimplePerson", - item_id: person.id, - item_changes: person, - originator_id: nil, - origin: "admin", - meta: %{linkname: "izelnakri"} - } - - assert person == first(Person, :id) |> @repo.one |> serialize - end - - test "updating a person creates a person version with correct attributes" do - {:ok, initial_company_insertion} = - create_company_with_version(%{ - name: "Acme LLC", - website: "http://www.acme.com" - }) - - {:ok, target_company_insertion} = - create_company_with_version(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - {:ok, insert_person_result} = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: target_company_insertion[:model].id - }) - |> PaperTrail.insert(origin: "admin") - - {:ok, result} = - Person.changeset(insert_person_result[:model], %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: initial_company_insertion[:model].id - }) - |> PaperTrail.update(origin: "scraper", meta: %{linkname: "izelnakri"}) - - person_count = Person.count() - version_count = Version.count() - - person = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert person_count == 1 - assert version_count == 4 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - company_id: initial_company_insertion[:model].id, - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - last_name: "Nakri", - gender: true, - plural: [], - singular: nil - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "SimplePerson", - item_id: person.id, - item_changes: %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: initial_company_insertion[:model].id - }, - originator_id: nil, - origin: "scraper", - meta: %{linkname: "izelnakri"} - } - - assert person == first(Person, :id) |> @repo.one |> serialize - end - - test "deleting a person creates a person version with correct attributes" do - create_company_with_version(%{name: "Acme LLC", website: "http://www.acme.com"}) - - {:ok, target_company_insertion} = - create_company_with_version(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - # add link name later on - {:ok, insert_person_result} = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: target_company_insertion[:model].id - }) - |> PaperTrail.insert(origin: "admin") - - {:ok, update_result} = - Person.changeset(insert_person_result[:model], %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: target_company_insertion[:model].id - }) - |> PaperTrail.update(origin: "scraper", meta: %{linkname: "izelnakri"}) - - person_before_deletion = first(Person, :id) |> @repo.one |> serialize - - {:ok, result} = - PaperTrail.delete( - update_result[:model], - origin: "admin", - meta: %{linkname: "izelnakri"} - ) - - person_count = Person.count() - version_count = Version.count() - - assert Map.keys(result) == [:model, :version] - old_person = update_result[:model] |> serialize - version = result[:version] |> serialize - - assert person_count == 0 - assert version_count == 5 - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "SimplePerson", - item_id: old_person.id, - item_changes: %{ - id: old_person.id, - inserted_at: old_person.inserted_at, - updated_at: old_person.updated_at, - first_name: "Isaac", - last_name: "Nakri", - gender: true, - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: target_company_insertion[:model].id, - plural: [], - singular: nil - }, - originator_id: nil, - origin: "admin", - meta: %{linkname: "izelnakri"} - } - - assert old_person == person_before_deletion - end - - test "works with nil embed" do - {:ok, target_company_insertion} = - create_company_with_version(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - {:ok, insert_person_result} = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: target_company_insertion[:model].id, - singular: %{} - }) - |> PaperTrail.insert(origin: "admin") - - assert {:ok, insert_person_result} = - Person.changeset(insert_person_result[:model], %{ - singular: nil - }) - |> PaperTrail.update(origin: "admin") - end - - test "updating a company with current params should not create a version" do - {:ok, insert_result} = create_company_with_version() - - insert_result_version = PaperTrail.get_version(insert_result[:model]) - version_count_before_update = PaperTrail.Version.count() - - {:ok, update_result} = - update_company_with_version( - insert_result[:model], - @create_company_params, - [] - ) - - version_count_after_update = PaperTrail.Version.count() - update_result_version = PaperTrail.get_version(update_result[:model]) - - assert version_count_before_update == version_count_after_update - assert insert_result_version == update_result_version - end - - defp create_user do - User.changeset(%User{}, %{token: "fake-token", username: "izelnakri"}) |> @repo.insert! - end - - defp create_company_with_version(params \\ @create_company_params, options \\ []) do - Company.changeset(%Company{}, params) |> PaperTrail.insert(options) - end - - defp update_company_with_version(company, params \\ @update_company_params, options \\ []) do - Company.changeset(company, params) |> PaperTrail.update(options) - end -end diff --git a/test/paper_trail/strict_mode_test.exs b/test/paper_trail/strict_mode_test.exs deleted file mode 100644 index 3036d4c4..00000000 --- a/test/paper_trail/strict_mode_test.exs +++ /dev/null @@ -1,513 +0,0 @@ -# test one with user:, one with originator -defmodule PaperTrailStrictModeTest do - use ExUnit.Case - - import Ecto.Query - - alias PaperTrail.Version - alias StrictCompany, as: Company - alias StrictPerson, as: Person - alias PaperTrail.Serializer - - @repo PaperTrail.RepoClient.repo() - @create_company_params %{name: "Acme LLC", is_active: true, city: "Greenwich"} - @update_company_params %{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - } - - defdelegate serialize(data), to: Serializer - - doctest PaperTrail - - setup_all do - Application.put_env(:paper_trail, :strict_mode, true) - Application.put_env(:paper_trail, :repo, PaperTrail.Repo) - - - :ok - end - - setup do - @repo.delete_all(Person) - @repo.delete_all(Company) - @repo.delete_all(Version) - - on_exit(fn -> - @repo.delete_all(Person) - @repo.delete_all(Company) - @repo.delete_all(Version) - end) - - :ok - end - - test "creating a company creates a company version with correct attributes" do - user = create_user() - {:ok, result} = create_company_with_version(@create_company_params, user: user) - - company_count = Company.count() - version_count = Version.count() - - company = result[:model] |> serialize() - version = result[:version] |> serialize() - - assert Map.keys(result) == [:model, :version] - assert company_count == 1 - assert version_count == 1 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Greenwich", - website: nil, - address: nil, - facebook: nil, - twitter: nil, - founded_in: nil, - first_version_id: version.id, - current_version_id: version.id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "StrictCompany", - item_id: company.id, - item_changes: company, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> @repo.one |> serialize - end - - test "creating a company without changeset creates a company version with correct attributes" do - {:ok, result} = PaperTrail.insert(%Company{name: "Acme LLC"}) - company_count = Company.count() - version_count = Version.count() - - company = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert company_count == 1 - assert version_count == 1 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: nil, - city: nil, - website: nil, - address: nil, - facebook: nil, - twitter: nil, - founded_in: nil, - first_version_id: version.id, - current_version_id: version.id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "StrictCompany", - item_id: company.id, - item_changes: company, - originator_id: nil, - origin: nil, - meta: nil - } - end - - test "PaperTrail.insert/2 with an error returns and error tuple like Repo.insert/2" do - result = create_company_with_version(%{name: nil, is_active: true, city: "Greenwich"}) - - ecto_result = - Company.changeset(%Company{}, %{name: nil, is_active: true, city: "Greenwich"}) - |> @repo.insert - - assert result == ecto_result - end - - test "PaperTrail.insert/2 passes ecto options through (e.g. upsert options)" do - user = create_user() - {:ok, _result} = create_company_with_version(@create_company_params, originator: user) - - new_create_company_params = @create_company_params |> Map.replace!(:city, "Barcelona") - - ecto_options = [on_conflict: {:replace_all_except, ~w{name}a}, conflict_target: :name] - - {:ok, result} = - create_company_with_version(new_create_company_params, - originator: user, - ecto_options: ecto_options - ) - - assert Company.count() == 1 - assert Version.count() == 2 - - assert Map.take(serialize(result[:model]), [:name, :city]) == %{ - name: "Acme LLC", - city: "Barcelona" - } - end - - test "updating a company creates a company version with correct item_changes" do - user = create_user() - {:ok, insert_company_result} = create_company_with_version() - - {:ok, result} = - update_company_with_version( - insert_company_result[:model], - @update_company_params, - originator: user - ) - - company_count = Company.count() - version_count = Version.count() - - company = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert company_count == 1 - assert version_count == 2 - - assert Map.drop(company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - first_version_id: insert_company_result[:version].id, - current_version_id: version.id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "StrictCompany", - item_id: company.id, - item_changes: %{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc", - current_version_id: version.id - }, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert company == first(Company, :id) |> @repo.one |> serialize - end - - test "PaperTrail.update/2 with an error returns and error tuple like Repo.update/2" do - {:ok, insert_result} = create_company_with_version() - company = insert_result[:model] - - result = - update_company_with_version(company, %{ - name: nil, - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }) - - ecto_result = - Company.changeset(company, %{ - name: nil, - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }) - |> @repo.update - - assert result == ecto_result - end - - test "deleting a company creates a company version with correct attributes" do - user = create_user() - {:ok, insert_company_result} = create_company_with_version() - {:ok, update_company_result} = update_company_with_version(insert_company_result[:model]) - company_before_deletion = first(Company, :id) |> @repo.one |> serialize - {:ok, result} = PaperTrail.delete(update_company_result[:model], user: user) - - company_count = Company.count() - version_count = Version.count() - - old_company = result[:model] |> serialize() - version = result[:version] |> serialize() - - assert Map.keys(result) == [:model, :version] - assert company_count == 0 - assert version_count == 3 - - assert Map.drop(old_company, [:id, :inserted_at, :updated_at]) == %{ - name: "Acme LLC", - is_active: true, - city: "Hong Kong", - website: "http://www.acme.com", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - first_version_id: insert_company_result[:version].id, - current_version_id: update_company_result[:version].id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "StrictCompany", - item_id: old_company.id, - item_changes: %{ - id: old_company.id, - inserted_at: old_company.inserted_at, - updated_at: old_company.updated_at, - name: "Acme LLC", - is_active: true, - website: "http://www.acme.com", - city: "Hong Kong", - address: nil, - facebook: "acme.llc", - twitter: nil, - founded_in: nil, - first_version_id: insert_company_result[:version].id, - current_version_id: update_company_result[:version].id - }, - originator_id: user.id, - origin: nil, - meta: nil - } - - assert old_company == company_before_deletion - end - - test "PaperTrail.delete/2 with an error returns and error tuple like Repo.delete/2" do - {:ok, insert_company_result} = create_company_with_version() - - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: insert_company_result[:model].id - }) - |> PaperTrail.insert() - - {:error, ecto_result} = insert_company_result[:model] |> Company.changeset() |> @repo.delete - {:error, result} = insert_company_result[:model] |> Company.changeset() |> PaperTrail.delete() - - assert Map.drop(result, [:repo_opts]) == Map.drop(ecto_result, [:repo_opts]) - end - - test "creating a person with meta tag creates a person version with correct attributes" do - create_company_with_version(%{name: "Acme LLC", website: "http://www.acme.com"}) - - {:ok, insert_company_result} = - create_company_with_version(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - {:ok, result} = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: insert_company_result[:model].id - }) - |> PaperTrail.insert(origin: "admin", meta: %{linkname: "izelnakri"}) - - person_count = Person.count() - version_count = Version.count() - - person = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert person_count == 1 - assert version_count == 3 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - visit_count: nil, - birthdate: nil, - company_id: insert_company_result[:model].id, - first_version_id: result[:version].id, - current_version_id: result[:version].id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "insert", - item_type: "StrictPerson", - item_id: person.id, - item_changes: person, - originator_id: nil, - origin: "admin", - meta: %{linkname: "izelnakri"} - } - - assert person == first(Person, :id) |> @repo.one |> serialize - end - - test "updating a person creates a person version with correct attributes" do - {:ok, insert_company_result} = - create_company_with_version(%{ - name: "Acme LLC", - website: "http://www.acme.com" - }) - - {:ok, target_company_insertion} = - create_company_with_version(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - {:ok, insert_person_result} = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: target_company_insertion[:model].id - }) - |> PaperTrail.insert(origin: "admin") - - {:ok, result} = - Person.changeset(insert_person_result[:model], %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: insert_company_result[:model].id - }) - |> PaperTrail.update(origin: "scraper", meta: %{linkname: "izelnakri"}) - - person_count = Person.count() - version_count = Version.count() - - person = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert person_count == 1 - assert version_count == 4 - - assert Map.drop(person, [:id, :inserted_at, :updated_at]) == %{ - company_id: insert_company_result[:model].id, - first_name: "Isaac", - visit_count: 10, - # this is the only problem - birthdate: ~D[1992-04-01], - last_name: "Nakri", - gender: true, - first_version_id: insert_person_result[:version].id, - current_version_id: version.id - } - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "update", - item_type: "StrictPerson", - item_id: person.id, - item_changes: %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - current_version_id: version.id, - company_id: insert_company_result[:model].id - }, - originator_id: nil, - origin: "scraper", - meta: %{linkname: "izelnakri"} - } - - assert person == first(Person, :id) |> @repo.one |> serialize - end - - test "deleting a person creates a person version with correct attributes" do - create_company_with_version(%{name: "Acme LLC", website: "http://www.acme.com"}) - - {:ok, target_company_insertion} = - create_company_with_version(%{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - - {:ok, insert_person_result} = - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: target_company_insertion[:model].id - }) - |> PaperTrail.insert(origin: "admin") - - {:ok, update_person_result} = - Person.changeset(insert_person_result[:model], %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01] - }) - |> PaperTrail.update(origin: "scraper", meta: %{linkname: "izelnakri"}) - - person_before_deletion = first(Person, :id) |> @repo.one |> serialize - - {:ok, result} = - PaperTrail.delete( - update_person_result[:model], - origin: "admin", - meta: %{linkname: "izelnakri"} - ) - - person_count = Person.count() - version_count = Version.count() - - old_person = result[:model] |> serialize - version = result[:version] |> serialize - - assert Map.keys(result) == [:model, :version] - assert person_count == 0 - assert version_count == 5 - - assert Map.drop(version, [:id, :inserted_at]) == %{ - event: "delete", - item_type: "StrictPerson", - item_id: old_person.id, - item_changes: %{ - id: old_person.id, - inserted_at: old_person.inserted_at, - updated_at: old_person.updated_at, - first_name: "Isaac", - last_name: "Nakri", - gender: true, - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: target_company_insertion[:model].id, - first_version_id: insert_person_result[:version].id, - current_version_id: update_person_result[:version].id - }, - originator_id: nil, - origin: "admin", - meta: %{linkname: "izelnakri"} - } - - assert old_person == person_before_deletion - end - - defp create_user do - User.changeset(%User{}, %{token: "fake-token", username: "izelnakri"}) |> @repo.insert! - end - - defp create_company_with_version(params \\ @create_company_params, options \\ []) do - Company.changeset(%Company{}, params) |> PaperTrail.insert(options) - end - - defp update_company_with_version(company, params \\ @update_company_params, options \\ []) do - Company.changeset(company, params) |> PaperTrail.update(options) - end -end diff --git a/test/support/multi_tenant_helper.ex b/test/support/multi_tenant_helper.ex deleted file mode 100644 index 9f8c7a41..00000000 --- a/test/support/multi_tenant_helper.ex +++ /dev/null @@ -1,42 +0,0 @@ -defmodule PaperTrailTest.MultiTenantHelper do - alias Ecto.Adapters.SQL - alias Ecto.Changeset - - @migrations_path "migrations" - @tenant "tenant_id" - - def add_prefix_to_changeset(%Changeset{} = changeset) do - %{changeset | data: add_prefix_to_struct(changeset.data)} - end - - def add_prefix_to_query(query) do - query |> Ecto.Queryable.to_query() |> Map.put(:prefix, @tenant) - end - - def add_prefix_to_struct(%{__struct__: _} = model) do - Ecto.put_meta(model, prefix: @tenant) - end - - def setup_tenant(repo, direction \\ :up, opts \\ [all: true]) do - # Drop the previous tenant to reset the data - SQL.query(repo, "DROP SCHEMA \"#{@tenant}\" CASCADE", []) - - opts_with_prefix = Keyword.put(opts, :prefix, @tenant) - - # Create new tenant - SQL.query(repo, "CREATE SCHEMA \"#{@tenant}\"", []) - Ecto.Migrator.run(repo, migrations_path(repo), direction, opts_with_prefix) - end - - def tenant(), do: @tenant - - defp migrations_path(repo), do: Path.join(build_repo_priv(repo), @migrations_path) - - def source_repo_priv(repo) do - repo.config()[:priv] || "priv/#{repo |> Module.split() |> List.last() |> Macro.underscore()}" - end - - def build_repo_priv(repo) do - Application.app_dir(Keyword.fetch!(repo.config(), :otp_app), source_repo_priv(repo)) - end -end diff --git a/test/support/repos.ex b/test/support/repos.ex deleted file mode 100644 index 793a2d49..00000000 --- a/test/support/repos.ex +++ /dev/null @@ -1,30 +0,0 @@ -defmodule PaperTrail.Repo do - use Ecto.Repo, otp_app: :paper_trail, adapter: Ecto.Adapters.Postgres -end - -defmodule PaperTrail.UUIDRepo do - use Ecto.Repo, otp_app: :paper_trail, adapter: Ecto.Adapters.Postgres -end - -defmodule PaperTrail.UUIDWithCustomNameRepo do - use Ecto.Repo, otp_app: :paper_trail, adapter: Ecto.Adapters.Postgres -end - -defmodule User do - use Ecto.Schema - - import Ecto.Changeset - - schema "users" do - field(:token, :string) - field(:username, :string) - - timestamps() - end - - def changeset(model, params \\ %{}) do - model - |> cast(params, [:token, :username]) - |> validate_required([:token, :username]) - end -end diff --git a/test/support/simple_models.ex b/test/support/simple_models.ex deleted file mode 100644 index 87f0106d..00000000 --- a/test/support/simple_models.ex +++ /dev/null @@ -1,147 +0,0 @@ -defmodule LocationType do - use Ecto.Type - - defstruct [:country] - - @impl true - def type, do: :map - - @impl true - def embed_as(_format), do: :dump - - @impl true - def cast(%__MODULE__{} = location), do: {:ok, location} - def cast(%{} = data), do: {:ok, struct!(__MODULE__, data)} - def cast(_), do: :error - - @impl true - def load(data) when is_map(data) do - data = Enum.map(data, fn {key, val} -> {String.to_existing_atom(key), val} end) - - {:ok, struct!(__MODULE__, data)} - end - - @impl true - def dump(%__MODULE__{} = location), do: {:ok, Map.from_struct(location)} - def dump(_), do: :error -end - -defmodule SimpleCompany do - use Ecto.Schema - - alias PaperTrailTest.MultiTenantHelper, as: MultiTenant - - import Ecto.Changeset - import Ecto.Query - - schema "simple_companies" do - field(:name, :string) - field(:is_active, :boolean) - field(:website, :string) - field(:city, :string) - field(:address, :string) - field(:facebook, :string) - field(:twitter, :string) - field(:founded_in, :string) - field(:location, LocationType) - - has_many(:people, SimplePerson, foreign_key: :company_id) - - timestamps() - end - - @optional_fields ~w( - name - is_active - website - city - address - facebook - twitter - founded_in - location - )a - - def changeset(model, params \\ %{}) do - model - |> cast(params, @optional_fields) - |> validate_required([:name]) - |> no_assoc_constraint(:people) - end - - def count do - from(record in __MODULE__, select: count(record.id)) |> PaperTrail.RepoClient.repo().one - end - - def count(:multitenant) do - from(record in __MODULE__, select: count(record.id)) - |> MultiTenant.add_prefix_to_query() - |> PaperTrail.RepoClient.repo().one - end -end - -defmodule SimplePerson do - use Ecto.Schema - - alias PaperTrailTest.MultiTenantHelper, as: MultiTenant - - import Ecto.Changeset - import Ecto.Query - - schema "simple_people" do - field(:first_name, :string) - field(:last_name, :string) - field(:visit_count, :integer) - field(:gender, :boolean) - field(:birthdate, :date) - - belongs_to(:company, SimpleCompany, foreign_key: :company_id) - - embeds_one(:singular, SimpleEmbed, on_replace: :update) - embeds_many(:plural, SimpleEmbed) - - timestamps() - end - - @optional_fields ~w( - first_name - last_name - visit_count - gender - birthdate - company_id - )a - - def changeset(model, params \\ %{}) do - model - |> cast(params, @optional_fields) - |> foreign_key_constraint(:company_id) - |> cast_embed(:singular) - |> cast_embed(:plural) - end - - def count do - from(record in __MODULE__, select: count(record.id)) |> PaperTrail.RepoClient.repo().one - end - - def count(:multitenant) do - from(record in __MODULE__, select: count(record.id)) - |> MultiTenant.add_prefix_to_query() - |> PaperTrail.RepoClient.repo().one - end -end - -defmodule SimpleEmbed do - use Ecto.Schema - - import Ecto.Changeset - - embedded_schema do - field(:name, :string) - end - - def changeset(model, params \\ %{}) do - model - |> cast(params, [:name]) - end -end diff --git a/test/support/strict_models.ex b/test/support/strict_models.ex deleted file mode 100644 index 2d70d529..00000000 --- a/test/support/strict_models.ex +++ /dev/null @@ -1,86 +0,0 @@ -defmodule StrictCompany do - use Ecto.Schema - - alias PaperTrailTest.MultiTenantHelper, as: MultiTenant - - import Ecto.Changeset - import Ecto.Query - - schema "strict_companies" do - field(:name, :string) - field(:is_active, :boolean) - field(:website, :string) - field(:city, :string) - field(:address, :string) - field(:facebook, :string) - field(:twitter, :string) - field(:founded_in, :string) - - belongs_to(:first_version, PaperTrail.Version) - belongs_to(:current_version, PaperTrail.Version, on_replace: :update) - - has_many(:people, StrictPerson, foreign_key: :company_id) - - timestamps() - end - - @optional_fields ~w(name is_active website city address facebook twitter founded_in)a - - def changeset(model, params \\ %{}) do - model - |> cast(params, @optional_fields) - |> validate_required([:name]) - |> no_assoc_constraint(:people) - end - - def count do - from(record in __MODULE__, select: count(record.id)) |> PaperTrail.RepoClient.repo().one - end - - def count(:multitenant) do - from(record in __MODULE__, select: count(record.id)) - |> MultiTenant.add_prefix_to_query() - |> PaperTrail.RepoClient.repo().one - end -end - -defmodule StrictPerson do - use Ecto.Schema - - alias PaperTrailTest.MultiTenantHelper, as: MultiTenant - - import Ecto.Changeset - import Ecto.Query - - schema "strict_people" do - field(:first_name, :string) - field(:last_name, :string) - field(:visit_count, :integer) - field(:gender, :boolean) - field(:birthdate, :date) - - belongs_to(:first_version, PaperTrail.Version) - belongs_to(:current_version, PaperTrail.Version, on_replace: :update) - belongs_to(:company, StrictCompany, foreign_key: :company_id) - - timestamps() - end - - @optional_fields ~w(first_name last_name visit_count gender birthdate company_id)a - - def changeset(model, params \\ %{}) do - model - |> cast(params, @optional_fields) - |> foreign_key_constraint(:company_id) - end - - def count do - from(record in __MODULE__, select: count(record.id)) |> PaperTrail.RepoClient.repo().one - end - - def count(:multitenant) do - from(record in __MODULE__, select: count(record.id)) - |> MultiTenant.add_prefix_to_query() - |> PaperTrail.RepoClient.repo().one - end -end diff --git a/test/support/uuid_models.ex b/test/support/uuid_models.ex deleted file mode 100644 index 405087e9..00000000 --- a/test/support/uuid_models.ex +++ /dev/null @@ -1,90 +0,0 @@ -defmodule Product do - use Ecto.Schema - - import Ecto.Changeset - - @primary_key {:id, :binary_id, autogenerate: true} - schema "products" do - field(:name, :string) - - timestamps() - end - - def changeset(model, params \\ %{}) do - model - |> cast(params, [:name]) - |> validate_required([:name]) - end -end - -defmodule Admin do - use Ecto.Schema - import Ecto.Changeset - - @primary_key {:id, :binary_id, autogenerate: true} - schema "admins" do - field(:email, :string) - - timestamps() - end - - def changeset(model, params \\ %{}) do - model - |> cast(params, [:email]) - |> validate_required([:email]) - end -end - -defmodule Item do - use Ecto.Schema - import Ecto.Changeset - - @primary_key {:item_id, :binary_id, autogenerate: true} - schema "items" do - field(:title, :string) - - timestamps() - end - - def changeset(model, params \\ %{}) do - model - |> cast(params, [:title]) - |> validate_required(:title) - end -end - -defmodule FooItem do - use Ecto.Schema - import Ecto.Changeset - - @primary_key {:id, :id, autogenerate: true} - schema "foo_items" do - field(:title, :string) - - timestamps() - end - - def changeset(model, params \\ %{}) do - model - |> cast(params, [:title]) - |> validate_required(:title) - end -end - -defmodule BarItem do - use Ecto.Schema - import Ecto.Changeset - - @primary_key {:item_id, :string, autogenerate: false} - schema "bar_items" do - field(:title, :string) - - timestamps() - end - - def changeset(model, params \\ %{}) do - model - |> cast(params, [:item_id, :title]) - |> validate_required([:item_id, :title]) - end -end diff --git a/test/support/uuid_with_custom_name_models.ex b/test/support/uuid_with_custom_name_models.ex deleted file mode 100644 index dfb87339..00000000 --- a/test/support/uuid_with_custom_name_models.ex +++ /dev/null @@ -1,36 +0,0 @@ -defmodule Project do - use Ecto.Schema - - import Ecto.Changeset - - @primary_key {:uuid, :binary_id, autogenerate: true} - schema "projects" do - field(:name, :string) - - timestamps() - end - - def changeset(model, params \\ %{}) do - model - |> cast(params, [:name]) - |> validate_required([:name]) - end -end - -defmodule Person do - use Ecto.Schema - import Ecto.Changeset - - @primary_key {:uuid, :binary_id, autogenerate: true} - schema "people" do - field(:email, :string) - - timestamps() - end - - def changeset(model, params \\ %{}) do - model - |> cast(params, [:email]) - |> validate_required([:email]) - end -end diff --git a/test/test_helper.exs b/test/test_helper.exs deleted file mode 100644 index f97ad995..00000000 --- a/test/test_helper.exs +++ /dev/null @@ -1,17 +0,0 @@ -Application.start(:postgrex) - -Application.put_env(:paper_trail, :ecto_repos, [PaperTrail.Repo, PaperTrail.UUIDRepo, PaperTrail.UUIDWithCustomNameRepo]) -Application.put_env(:paper_trail, :repo, PaperTrail.Repo) -Application.put_env(:paper_trail, :originator, [name: :user, model: User]) - -Mix.Task.run("ecto.drop") -Mix.Task.run("ecto.create") -Mix.Task.run("ecto.migrate") - -PaperTrail.Repo.start_link() -PaperTrail.UUIDRepo.start_link() -PaperTrail.UUIDWithCustomNameRepo.start_link() - -ExUnit.configure(seed: 0) - -ExUnit.start(capture_log: true) diff --git a/test/uuid/uuid_test.exs b/test/uuid/uuid_test.exs deleted file mode 100644 index 9d900add..00000000 --- a/test/uuid/uuid_test.exs +++ /dev/null @@ -1,94 +0,0 @@ -defmodule PaperTrailTest.UUIDTest do - use ExUnit.Case - import PaperTrail.RepoClient, only: [repo: 0] - alias PaperTrail.Version - import Ecto.Query - - setup_all do - Application.put_env(:paper_trail, :repo, PaperTrail.UUIDRepo) - Application.put_env(:paper_trail, :originator, name: :admin, model: Admin) - Application.put_env(:paper_trail, :originator_type, Ecto.UUID) - - Application.put_env( - :paper_trail, - :item_type, - if(System.get_env("STRING_TEST") == nil, do: Ecto.UUID, else: :string) - ) - - Code.eval_file("lib/paper_trail.ex") - Code.eval_file("lib/version.ex") - - repo().delete_all(Version) - repo().delete_all(Admin) - repo().delete_all(Product) - repo().delete_all(Item) - :ok - end - - describe "PaperTrailTest.UUIDTest" do - test "creates versions with models that have a UUID primary key" do - product = - %Product{} - |> Product.changeset(%{name: "Hair Cream"}) - |> PaperTrail.insert!() - - version = Version |> last |> repo().one - - assert version.item_id == product.id - assert version.item_type == "Product" - end - - test "handles originators with a UUID primary key" do - admin = - %Admin{} - |> Admin.changeset(%{email: "admin@example.com"}) - |> repo().insert! - - %Product{} - |> Product.changeset(%{name: "Hair Cream"}) - |> PaperTrail.insert!(originator: admin) - - version = - Version - |> last - |> repo().one - |> repo().preload(:admin) - - assert version.admin == admin - end - - test "versioning models that have a non-regular primary key" do - item = - %Item{} - |> Item.changeset(%{title: "hello"}) - |> PaperTrail.insert!() - - version = Version |> last |> repo().one - assert version.item_id == item.item_id - end - - test "test INTEGER primary key for item_type == :string" do - if PaperTrail.Version.__schema__(:type, :item_id) == :string do - item = - %FooItem{} - |> FooItem.changeset(%{title: "hello"}) - |> PaperTrail.insert!() - - version = Version |> last |> repo().one - assert version.item_id == "#{item.id}" - end - end - - test "test STRING primary key for item_type == :string" do - if PaperTrail.Version.__schema__(:type, :item_id) == :string do - item = - %BarItem{} - |> BarItem.changeset(%{item_id: "#{:os.system_time()}", title: "hello"}) - |> PaperTrail.insert!() - - version = Version |> last |> repo().one - assert version.item_id == item.item_id - end - end - end -end diff --git a/test/uuid/uuid_with_custom_name_test.exs b/test/uuid/uuid_with_custom_name_test.exs deleted file mode 100644 index af348542..00000000 --- a/test/uuid/uuid_with_custom_name_test.exs +++ /dev/null @@ -1,48 +0,0 @@ -defmodule PaperTrailTest.UUIDWithCustomNameTest do - use ExUnit.Case - import PaperTrail.RepoClient, only: [repo: 0] - alias PaperTrail.Version - import Ecto.Query - - setup_all do - Application.put_env(:paper_trail, :repo, PaperTrail.UUIDWithCustomNameRepo) - Application.put_env(:paper_trail, :originator, name: :originator, model: Person) - Application.put_env(:paper_trail, :originator_type, Ecto.UUID) - Application.put_env(:paper_trail, :originator_relationship_options, references: :uuid) - - Application.put_env( - :paper_trail, - :item_type, - if(System.get_env("STRING_TEST") == nil, do: Ecto.UUID, else: :string) - ) - - Code.eval_file("lib/paper_trail.ex") - Code.eval_file("lib/version.ex") - - repo().delete_all(Version) - repo().delete_all(Person) - repo().delete_all(Project) - :ok - end - - describe "PaperTrailTest.UUIDWithCustomNameTest" do - test "handles originators with a UUID primary key" do - person = - %Person{} - |> Person.changeset(%{email: "admin@example.com"}) - |> repo().insert! - - %Project{} - |> Project.changeset(%{name: "Interesting Stuff"}) - |> PaperTrail.insert!(originator: person) - - version = - Version - |> last - |> repo().one - |> repo().preload(:originator) - - assert version.originator == person - end - end -end diff --git a/test/version/paper_trail_version_test.exs b/test/version/paper_trail_version_test.exs deleted file mode 100644 index 4c967a60..00000000 --- a/test/version/paper_trail_version_test.exs +++ /dev/null @@ -1,174 +0,0 @@ -defmodule PaperTrailTest.Version do - use ExUnit.Case - - alias PaperTrail.Version - alias PaperTrailTest.MultiTenantHelper, as: MultiTenant - alias PaperTrail.RepoClient - alias PaperTrail.Serializer - - @valid_attrs %{ - event: "insert", - item_type: "Person", - item_id: 1, - item_changes: %{first_name: "Izel", last_name: "Nakri"}, - origin: "test", - inserted_at: DateTime.from_naive!(~N[1952-04-01 01:00:00], "Etc/UTC") - } - @invalid_attrs %{} - - defdelegate repo, to: RepoClient - defdelegate serialize(data), to: Serializer - - setup_all do - Application.put_env(:paper_trail, :strict_mode, false) - Application.put_env(:paper_trail, :repo, PaperTrail.Repo) - Application.put_env(:paper_trail, :originator_type, :integer) - - - MultiTenant.setup_tenant(repo()) - :ok - end - - setup do - repo().delete_all(Version) - - Version - |> MultiTenant.add_prefix_to_query() - |> repo().delete_all() - - on_exit(fn -> - repo().delete_all(Version) - - Version - |> MultiTenant.add_prefix_to_query() - |> repo().delete_all() - end) - - :ok - end - - test "changeset with valid attributes" do - changeset = Version.changeset(%Version{event: "insert"}, @valid_attrs) - assert changeset.valid? - end - - test "changeset without invalid attributes" do - changeset = Version.changeset(%Version{event: "insert"}, @invalid_attrs) - refute changeset.valid? - end - - test "count works" do - versions = add_three_versions() - assert Version.count() == length(versions) - end - - test "first works" do - add_three_versions() - - target_model = - @valid_attrs - |> Map.delete(:inserted_at) - |> Map.merge(%{ - item_changes: %{"first_name" => "Izel", "last_name" => "Nakri"} - }) - - target_version = - Version.first() - |> serialize - |> Map.drop([ - :id, - :meta, - :originator_id, - :inserted_at - ]) - - assert target_version == target_model - end - - test "last works" do - add_three_versions() - - assert Version.last() |> serialize != %{ - event: "insert", - item_type: "Person", - item_id: 3, - item_changes: %{first_name: "Yukihiro", last_name: "Matsumoto"}, - origin: "test", - inserted_at: DateTime.from_naive!(~N[1965-04-14 01:00:00], "Etc/UTC") - } - end - - # Multi tenant tests - test "[multi tenant] count works" do - versions = add_three_versions(MultiTenant.tenant()) - assert Version.count(prefix: MultiTenant.tenant()) == length(versions) - assert Version.count() != length(versions) - end - - test "[multi tenant] first works" do - add_three_versions(MultiTenant.tenant()) - - target_version = - Version.first(prefix: MultiTenant.tenant()) - |> serialize - |> Map.drop([ - :id, - :meta, - :originator_id, - :inserted_at - ]) - - target_model = - @valid_attrs - |> Map.delete(:inserted_at) - |> Map.merge(%{ - item_changes: %{"first_name" => "Izel", "last_name" => "Nakri"} - }) - - assert target_version == target_model - assert Version.first() == nil - end - - test "[multi tenant] last works" do - add_three_versions(MultiTenant.tenant()) - - assert Version.last(prefix: MultiTenant.tenant()) |> serialize != %{ - event: "insert", - item_type: "Person", - item_id: 3, - item_changes: %{first_name: "Yukihiro", last_name: "Matsumoto"}, - origin: "test", - inserted_at: DateTime.from_naive!(~N[1965-04-14 01:00:00], "Etc/UTC") - } - - assert Version.last() == nil - end - - def add_three_versions(prefix \\ nil) do - repo().insert_all( - Version, - [ - @valid_attrs, - %{ - event: "insert", - item_type: "Person", - item_id: 2, - item_changes: %{first_name: "Brendan", last_name: "Eich"}, - origin: "test", - inserted_at: DateTime.from_naive!(~N[1961-07-04 01:00:00], "Etc/UTC") - }, - %{ - event: "insert", - item_type: "Person", - item_id: 3, - item_changes: %{first_name: "Yukihiro", last_name: "Matsumoto"}, - origin: "test", - inserted_at: DateTime.from_naive!(~N[1965-04-14 01:00:00], "Etc/UTC") - } - ], - returning: true, - prefix: prefix - ) - |> elem(1) - end -end diff --git a/test/version/version_queries_test.exs b/test/version/version_queries_test.exs deleted file mode 100644 index 1861a82a..00000000 --- a/test/version/version_queries_test.exs +++ /dev/null @@ -1,198 +0,0 @@ -defmodule PaperTrailTest.VersionQueries do - use ExUnit.Case - - alias PaperTrail.Version - alias SimpleCompany, as: Company - alias SimplePerson, as: Person - alias PaperTrailTest.MultiTenantHelper, as: MultiTenant - alias PaperTrail.RepoClient - - import Ecto.Query - - defdelegate repo, to: RepoClient - - setup_all do - Application.put_env(:paper_trail, :repo, PaperTrail.Repo) - Application.put_env(:paper_trail, :originator_type, :integer) - - MultiTenant.setup_tenant(repo()) - reset_all_data() - - Company.changeset(%Company{}, %{ - name: "Acme LLC", - is_active: true, - city: "Greenwich" - }) - |> PaperTrail.insert() - - old_company = first(Company, :id) |> repo().one - - Company.changeset(old_company, %{ - city: "Hong Kong", - website: "http://www.acme.com", - facebook: "acme.llc" - }) - |> PaperTrail.update() - - first(Company, :id) |> repo().one |> PaperTrail.delete() - - Company.changeset(%Company{}, %{ - name: "Acme LLC", - website: "http://www.acme.com" - }) - |> PaperTrail.insert() - - Company.changeset(%Company{}, %{ - name: "Another Company Corp.", - is_active: true, - address: "Sesame street 100/3, 101010" - }) - |> PaperTrail.insert() - - company = first(Company, :id) |> repo().one - - # add link name later on - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: company.id - }) - |> PaperTrail.insert(set_by: "admin") - - another_company = - repo().one( - from( - c in Company, - where: c.name == "Another Company Corp.", - limit: 1 - ) - ) - - Person.changeset(first(Person, :id) |> repo().one, %{ - first_name: "Isaac", - visit_count: 10, - birthdate: ~D[1992-04-01], - company_id: another_company.id - }) - |> PaperTrail.update(set_by: "user:1", meta: %{linkname: "izelnakri"}) - - # Multi tenant - Company.changeset(%Company{}, %{ - name: "Acme LLC", - is_active: true, - city: "Greenwich" - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert(prefix: MultiTenant.tenant()) - - company_multi = - first(Company, :id) - |> MultiTenant.add_prefix_to_query() - |> repo().one - - Person.changeset(%Person{}, %{ - first_name: "Izel", - last_name: "Nakri", - gender: true, - company_id: company_multi.id - }) - |> MultiTenant.add_prefix_to_changeset() - |> PaperTrail.insert(set_by: "admin", prefix: MultiTenant.tenant()) - - :ok - end - - test "get_version gives us the right version" do - tenant = MultiTenant.tenant() - last_person = last(Person, :id) |> repo().one - target_version = last(Version, :id) |> repo().one - - last_person_multi = - last(Person, :id) - |> MultiTenant.add_prefix_to_query() - |> repo().one - - target_version_multi = - last(Version, :id) - |> MultiTenant.add_prefix_to_query() - |> repo().one - - assert PaperTrail.get_version(last_person) == target_version - assert PaperTrail.get_version(Person, last_person.id) == target_version - assert PaperTrail.get_version(last_person_multi, prefix: tenant) == target_version_multi - - assert PaperTrail.get_version(Person, last_person_multi.id, prefix: tenant) == - target_version_multi - - assert target_version != target_version_multi - end - - test "get_versions gives us the right versions" do - tenant = MultiTenant.tenant() - last_person = last(Person, :id) |> repo().one - - target_versions = - repo().all( - from( - version in Version, - where: version.item_type == "SimplePerson" and version.item_id == ^last_person.id - ) - ) - - last_person_multi = - last(Person, :id) - |> MultiTenant.add_prefix_to_query() - |> repo().one - - target_versions_multi = - from( - version in Version, - where: version.item_type == "SimplePerson" and version.item_id == ^last_person_multi.id - ) - |> MultiTenant.add_prefix_to_query() - |> repo().all - - assert PaperTrail.get_versions(last_person) == target_versions - assert PaperTrail.get_versions(Person, last_person.id) == target_versions - assert PaperTrail.get_versions(last_person_multi, prefix: tenant) == target_versions_multi - - assert PaperTrail.get_versions(Person, last_person_multi.id, prefix: tenant) == - target_versions_multi - - assert target_versions != target_versions_multi - end - - test "get_current_model/1 gives us the current record of a version" do - person = first(Person, :id) |> repo().one - - first_version = - Version - |> where([v], v.item_type == "SimplePerson" and v.item_id == ^person.id) - |> first - |> repo().one - - assert PaperTrail.get_current_model(first_version) == person - end - - # query meta data!! - - # Functions - defp reset_all_data() do - repo().delete_all(Person) - repo().delete_all(Company) - repo().delete_all(Version) - - Person - |> MultiTenant.add_prefix_to_query() - |> repo().delete_all() - - Company - |> MultiTenant.add_prefix_to_query() - |> repo().delete_all() - - Version - |> MultiTenant.add_prefix_to_query() - |> repo().delete_all() - end -end