From 8531c04da6799be20b10599903d88cfdae56d0ed Mon Sep 17 00:00:00 2001 From: Mark Bakhit Date: Mon, 23 Sep 2024 18:59:15 -0700 Subject: [PATCH 1/6] Fix Python and docs tests (#250) - Fix python tests failures caused by upgraded mypy stubs - Switch `linkcheckmd` to it's replacement `linkspector` --- .github/workflows/test-docs.yml | 9 ++++++--- .gitignore | 1 + .linkspector.yml | 7 +++++++ requirements/build-docs.txt | 1 - src/reactpy_django/clean.py | 2 +- 5 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 .linkspector.yml diff --git a/.github/workflows/test-docs.yml b/.github/workflows/test-docs.yml index 907e1a2c..3062ebc1 100644 --- a/.github/workflows/test-docs.yml +++ b/.github/workflows/test-docs.yml @@ -20,12 +20,15 @@ jobs: - uses: actions/setup-python@v5 with: python-version: 3.x + - name: Check docs links + uses: umbrelladocs/action-linkspector@v1 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-review + fail_on_error: true - name: Check docs build run: | pip install -r requirements/build-docs.txt - linkcheckMarkdown docs/ -v -r - linkcheckMarkdown README.md -v -r - linkcheckMarkdown CHANGELOG.md -v -r cd docs mkdocs build --strict - name: Check docs examples diff --git a/.gitignore b/.gitignore index ffabb7fc..e3cbc599 100644 --- a/.gitignore +++ b/.gitignore @@ -101,6 +101,7 @@ venv.bak/ # mkdocs documentation /site +docs/site # mypy .mypy_cache/ diff --git a/.linkspector.yml b/.linkspector.yml new file mode 100644 index 00000000..6c0747e7 --- /dev/null +++ b/.linkspector.yml @@ -0,0 +1,7 @@ +dirs: + - ./docs +files: + - README.md + - CHANGELOG.md +useGitIgnore: true +modifiedFilesOnly: false diff --git a/requirements/build-docs.txt b/requirements/build-docs.txt index f32563ca..a7d5b1cf 100644 --- a/requirements/build-docs.txt +++ b/requirements/build-docs.txt @@ -2,7 +2,6 @@ mkdocs mkdocs-git-revision-date-localized-plugin mkdocs-material==9.4.0 mkdocs-include-markdown-plugin -linkcheckmd mkdocs-spellcheck[all] mkdocs-git-authors-plugin mkdocs-minify-plugin diff --git a/src/reactpy_django/clean.py b/src/reactpy_django/clean.py index a5953adc..93df7be6 100644 --- a/src/reactpy_django/clean.py +++ b/src/reactpy_django/clean.py @@ -87,7 +87,7 @@ def clean_user_data(verbosity: int = 1): start_time = timezone.now() user_model = get_user_model() all_users = user_model.objects.all() - all_user_pks = all_users.values_list(user_model._meta.pk.name, flat=True) # type: ignore + all_user_pks = all_users.values_list(user_model._meta.pk.name, flat=True) # Django doesn't support using QuerySets as an argument with cross-database relations. if user_model.objects.db != UserDataModel.objects.db: From 50c26e459b3b7a4b98caf94e64c786f509bed772 Mon Sep 17 00:00:00 2001 From: Mark Bakhit Date: Tue, 24 Sep 2024 01:33:21 -0700 Subject: [PATCH 2/6] Docs updates & Docs CI concurrency fix (#249) - Minor improvements to docs clarity. - Prevent concurrent docs publishing runs from stomping on each other. --- .github/workflows/publish-develop-docs.yml | 2 + .github/workflows/publish-release-docs.yml | 2 + CHANGELOG.md | 4 +- .../home-code-examples/add-interactivity.py | 12 +- .../create-user-interfaces.py | 18 +- .../write-components-with-python.py | 5 +- docs/src/assets/css/home.css | 474 +++++++++--------- docs/src/assets/img/add-interactivity.png | Bin 20118 -> 20821 bytes .../src/assets/img/create-user-interfaces.png | Bin 12381 -> 12427 bytes .../img/write-components-with-python.png | Bin 15412 -> 16519 bytes docs/src/reference/components.md | 2 + docs/src/reference/decorators.md | 2 +- docs/src/reference/hooks.md | 4 +- docs/src/reference/html.md | 6 +- docs/src/reference/template-tag.md | 7 +- docs/src/reference/utils.md | 2 +- src/reactpy_django/utils.py | 2 +- 17 files changed, 277 insertions(+), 265 deletions(-) diff --git a/.github/workflows/publish-develop-docs.yml b/.github/workflows/publish-develop-docs.yml index b79d3cd2..c2b62d95 100644 --- a/.github/workflows/publish-develop-docs.yml +++ b/.github/workflows/publish-develop-docs.yml @@ -21,3 +21,5 @@ jobs: git config user.email github-actions@github.com cd docs mike deploy --push develop + concurrency: + group: publish-docs diff --git a/.github/workflows/publish-release-docs.yml b/.github/workflows/publish-release-docs.yml index a98e9869..3f24d129 100644 --- a/.github/workflows/publish-release-docs.yml +++ b/.github/workflows/publish-release-docs.yml @@ -21,3 +21,5 @@ jobs: git config user.email github-actions@github.com cd docs mike deploy --push --update-aliases ${{ github.event.release.name }} latest + concurrency: + group: publish-docs diff --git a/CHANGELOG.md b/CHANGELOG.md index 620c1f75..9652b644 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,9 @@ Using the following categories, list your changes in this order: ### Security - for vulnerability fixes. - --> + +Don't forget to remove deprecated code on each major release! +--> diff --git a/docs/overrides/home-code-examples/add-interactivity.py b/docs/overrides/home-code-examples/add-interactivity.py index 90976446..f29ba3c8 100644 --- a/docs/overrides/home-code-examples/add-interactivity.py +++ b/docs/overrides/home-code-examples/add-interactivity.py @@ -1,16 +1,14 @@ +# pylint: disable=assignment-from-no-return, unnecessary-lambda from reactpy import component, html, use_state -def filter_videos(videos, search_text): - return None +def filter_videos(*_, **__): ... -def search_input(dictionary, value): - return None +def search_input(*_, **__): ... -def video_list(videos, empty_heading): - return None +def video_list(*_, **__): ... @component @@ -20,7 +18,7 @@ def searchable_video_list(videos): return html._( search_input( - {"on_change": lambda new_text: set_search_text(new_text)}, + {"onChange": lambda new_text: set_search_text(new_text)}, value=search_text, ), video_list( diff --git a/docs/overrides/home-code-examples/create-user-interfaces.py b/docs/overrides/home-code-examples/create-user-interfaces.py index 37776ab1..873b9d88 100644 --- a/docs/overrides/home-code-examples/create-user-interfaces.py +++ b/docs/overrides/home-code-examples/create-user-interfaces.py @@ -1,22 +1,20 @@ from reactpy import component, html -def thumbnail(video): - return None +def thumbnail(*_, **__): ... -def like_button(video): - return None +def like_button(*_, **__): ... @component -def video(video): +def video(data): return html.div( - thumbnail(video), + thumbnail(data), html.a( - {"href": video.url}, - html.h3(video.title), - html.p(video.description), + {"href": data.url}, + html.h3(data.title), + html.p(data.description), ), - like_button(video), + like_button(data), ) diff --git a/docs/overrides/home-code-examples/write-components-with-python.py b/docs/overrides/home-code-examples/write-components-with-python.py index 6af43baa..47e28b68 100644 --- a/docs/overrides/home-code-examples/write-components-with-python.py +++ b/docs/overrides/home-code-examples/write-components-with-python.py @@ -1,6 +1,9 @@ from reactpy import component, html +def video(*_, **__): ... + + @component def video_list(videos, empty_heading): count = len(videos) @@ -11,5 +14,5 @@ def video_list(videos, empty_heading): return html.section( html.h2(heading), - [video(video) for video in videos], + [video(x, key=x.id) for x in videos], ) diff --git a/docs/src/assets/css/home.css b/docs/src/assets/css/home.css index c72e7093..70f05cf2 100644 --- a/docs/src/assets/css/home.css +++ b/docs/src/assets/css/home.css @@ -1,335 +1,337 @@ img.home-logo { - height: 120px; + height: 120px; } .home .row { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - padding: 6rem 0.8rem; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + padding: 6rem 0.8rem; } .home .row:not(.first, .stripe) { - background: var(--row-bg-color); + background: var(--row-bg-color); } .home .row.stripe { - background: var(--row-stripe-bg-color); - border: 0 solid var(--stripe-border-color); - border-top-width: 1px; - border-bottom-width: 1px; + background: var(--row-stripe-bg-color); + border: 0 solid var(--stripe-border-color); + border-top-width: 1px; + border-bottom-width: 1px; } .home .row.first { - text-align: center; + text-align: center; } .home .row h1 { - max-width: 28rem; - line-height: 1.15; - font-weight: 500; - margin-bottom: 0.55rem; - margin-top: -1rem; + max-width: 28rem; + line-height: 1.15; + font-weight: 500; + margin-bottom: 0.55rem; + margin-top: -1rem; } .home .row.first h1 { - margin-top: 0.55rem; - margin-bottom: -0.75rem; + margin-top: 0.55rem; + margin-bottom: -0.75rem; } .home .row > p { - max-width: 35rem; - line-height: 1.5; - font-weight: 400; + max-width: 35rem; + line-height: 1.5; + font-weight: 400; } .home .row.first > p { - font-size: 32px; - font-weight: 500; + font-size: 32px; + font-weight: 500; } /* Code blocks */ .home .row .tabbed-set { - background: var(--home-tabbed-set-bg-color); - margin: 0; + background: var(--home-tabbed-set-bg-color); + margin: 0; } .home .row .tabbed-content { - padding: 20px 18px; - overflow-x: auto; + padding: 20px 18px; + overflow-x: auto; } .home .row .tabbed-content img { - user-select: none; - -moz-user-select: none; - -webkit-user-drag: none; - -webkit-user-select: none; - -ms-user-select: none; - max-width: 580px; + user-select: none; + -moz-user-select: none; + -webkit-user-drag: none; + -webkit-user-select: none; + -ms-user-select: none; + max-width: 580px; } .home .row .tabbed-content { - -webkit-filter: var(--code-block-filter); - filter: var(--code-block-filter); + -webkit-filter: var(--code-block-filter); + filter: var(--code-block-filter); } /* Code examples */ .home .example-container { - background: radial-gradient( - circle at 0% 100%, - rgb(41 84 147 / 11%) 0%, - rgb(22 89 189 / 4%) 70%, - rgb(48 99 175 / 0%) 80% - ), - radial-gradient( - circle at 100% 100%, - rgb(24 87 45 / 55%) 0%, - rgb(29 61 12 / 4%) 70%, - rgb(94 116 93 / 0%) 80% - ), - radial-gradient( - circle at 100% 0%, - rgba(54, 66, 84, 0.55) 0%, - rgb(102 111 125 / 4%) 70%, - rgba(54, 66, 84, 0) 80% - ), - radial-gradient( - circle at 0% 0%, - rgba(91, 114, 135, 0.55) 0%, - rgb(45 111 171 / 4%) 70%, - rgb(5 82 153 / 0%) 80% - ), - rgb(0, 0, 0) center center/cover no-repeat fixed; - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - align-items: center; - border-radius: 16px; - margin: 30px 0; - max-width: 100%; - grid-column-gap: 20px; - padding-left: 20px; - padding-right: 20px; + background: radial-gradient( + circle at 0% 100%, + rgb(41 84 147 / 11%) 0%, + rgb(22 89 189 / 4%) 70%, + rgb(48 99 175 / 0%) 80% + ), + radial-gradient( + circle at 100% 100%, + rgb(24 87 45 / 55%) 0%, + rgb(29 61 12 / 4%) 70%, + rgb(94 116 93 / 0%) 80% + ), + radial-gradient( + circle at 100% 0%, + rgba(54, 66, 84, 0.55) 0%, + rgb(102 111 125 / 4%) 70%, + rgba(54, 66, 84, 0) 80% + ), + radial-gradient( + circle at 0% 0%, + rgba(91, 114, 135, 0.55) 0%, + rgb(45 111 171 / 4%) 70%, + rgb(5 82 153 / 0%) 80% + ), + rgb(0, 0, 0) center center/cover no-repeat fixed; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + align-items: center; + border-radius: 16px; + margin: 30px 0; + max-width: 100%; + grid-column-gap: 20px; + padding-left: 20px; + padding-right: 20px; } .home .demo .white-bg { - background: #fff; - border-radius: 16px; - display: flex; - flex-direction: column; - max-width: 590px; - min-width: -webkit-min-content; - min-width: -moz-min-content; - min-width: min-content; - row-gap: 1rem; - padding: 1rem; + background: #fff; + border-radius: 16px; + display: flex; + flex-direction: column; + max-width: 590px; + min-width: -webkit-min-content; + min-width: -moz-min-content; + min-width: min-content; + row-gap: 1rem; + padding: 1rem; + border: 1px rgb(0 0 0 / 20%) solid; + overflow: hidden; } .home .demo .vid-row { - display: flex; - flex-direction: row; - -moz-column-gap: 12px; - column-gap: 12px; + display: flex; + flex-direction: row; + -moz-column-gap: 12px; + column-gap: 12px; } .home .demo { - color: #000; + color: #000; } .home .demo .vid-thumbnail { - background: radial-gradient( - circle at 0% 100%, - rgb(41 84 147 / 55%) 0%, - rgb(22 89 189 / 4%) 70%, - rgb(48 99 175 / 0%) 80% - ), - radial-gradient( - circle at 100% 100%, - rgb(24 63 87 / 55%) 0%, - rgb(29 61 12 / 4%) 70%, - rgb(94 116 93 / 0%) 80% - ), - radial-gradient( - circle at 100% 0%, - rgba(54, 66, 84, 0.55) 0%, - rgb(102 111 125 / 4%) 70%, - rgba(54, 66, 84, 0) 80% - ), - radial-gradient( - circle at 0% 0%, - rgba(91, 114, 135, 0.55) 0%, - rgb(45 111 171 / 4%) 70%, - rgb(5 82 153 / 0%) 80% - ), - rgb(0, 0, 0) center center/cover no-repeat fixed; - width: 9rem; - aspect-ratio: 16 / 9; - border-radius: 8px; - display: flex; - justify-content: center; - align-items: center; + background: radial-gradient( + circle at 0% 100%, + rgb(41 84 147 / 55%) 0%, + rgb(22 89 189 / 4%) 70%, + rgb(48 99 175 / 0%) 80% + ), + radial-gradient( + circle at 100% 100%, + rgb(24 63 87 / 55%) 0%, + rgb(29 61 12 / 4%) 70%, + rgb(94 116 93 / 0%) 80% + ), + radial-gradient( + circle at 100% 0%, + rgba(54, 66, 84, 0.55) 0%, + rgb(102 111 125 / 4%) 70%, + rgba(54, 66, 84, 0) 80% + ), + radial-gradient( + circle at 0% 0%, + rgba(91, 114, 135, 0.55) 0%, + rgb(45 111 171 / 4%) 70%, + rgb(5 82 153 / 0%) 80% + ), + rgb(0, 0, 0) center center/cover no-repeat fixed; + width: 9rem; + aspect-ratio: 16 / 9; + border-radius: 8px; + display: flex; + justify-content: center; + align-items: center; } .home .demo .vid-text { - display: flex; - flex-direction: column; - justify-content: center; - align-items: flex-start; - width: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + width: 100%; } .home .demo h2 { - font-size: 18px; - line-height: 1.375; - margin: 0; - text-align: left; - font-weight: 700; + font-size: 18px; + line-height: 1.375; + margin: 0; + text-align: left; + font-weight: 700; } .home .demo h3 { - font-size: 16px; - line-height: 1.25; - margin: 0; + font-size: 16px; + line-height: 1.25; + margin: 0; } .home .demo p { - font-size: 14px; - line-height: 1.375; - margin: 0; + font-size: 14px; + line-height: 1.375; + margin: 0; } .home .demo .browser-nav-url { - background: rgba(153, 161, 179, 0.2); - border-radius: 9999px; - font-size: 14px; - color: grey; - display: flex; - align-items: center; - justify-content: center; - -moz-column-gap: 5px; - column-gap: 5px; + background: rgba(153, 161, 179, 0.2); + border-radius: 9999px; + font-size: 14px; + color: grey; + display: flex; + align-items: center; + justify-content: center; + -moz-column-gap: 5px; + column-gap: 5px; } .home .demo .browser-navbar { - margin: -1rem; - margin-bottom: 0; - padding: 0.75rem 1rem; - border-bottom: 1px solid darkgrey; + margin: -1rem; + margin-bottom: 0; + padding: 0.75rem 1rem; + border-bottom: 1px solid darkgrey; } .home .demo .browser-viewport { - background: #fff; - border-radius: 16px; - display: flex; - flex-direction: column; - row-gap: 1rem; - height: 400px; - overflow-y: scroll; - margin: -1rem; - padding: 1rem; + background: #fff; + border-radius: 16px; + display: flex; + flex-direction: column; + row-gap: 1rem; + height: 400px; + overflow-y: scroll; + margin: -1rem; + padding: 1rem; } .home .demo .browser-viewport .search-header > h1 { - color: #000; - text-align: left; - font-size: 24px; - margin: 0; + color: #000; + text-align: left; + font-size: 24px; + margin: 0; } .home .demo .browser-viewport .search-header > p { - text-align: left; - font-size: 16px; - margin: 10px 0; + text-align: left; + font-size: 16px; + margin: 10px 0; } .home .demo .search-bar input { - width: 100%; - background: rgba(153, 161, 179, 0.2); - border-radius: 9999px; - padding-left: 40px; - padding-right: 40px; - height: 40px; - color: #000; + width: 100%; + background: rgba(153, 161, 179, 0.2); + border-radius: 9999px; + padding-left: 40px; + padding-right: 40px; + height: 40px; + color: #000; } .home .demo .search-bar svg { - height: 40px; - position: absolute; - transform: translateX(75%); + height: 40px; + position: absolute; + transform: translateX(75%); } .home .demo .search-bar { - position: relative; + position: relative; } /* Desktop Styling */ @media screen and (min-width: 60em) { - .home .row { - text-align: center; - } - .home .row > p { - font-size: 21px; - } - .home .row > h1 { - font-size: 52px; - } - .home .row .pop-left { - margin-left: -20px; - margin-right: 0; - margin-top: -20px; - margin-bottom: -20px; - } - .home .row .pop-right { - margin-left: 0px; - margin-right: 0px; - margin-top: -20px; - margin-bottom: -20px; - } + .home .row { + text-align: center; + } + .home .row > p { + font-size: 21px; + } + .home .row > h1 { + font-size: 52px; + } + .home .row .pop-left { + margin-left: -20px; + margin-right: 0; + margin-top: -20px; + margin-bottom: -20px; + } + .home .row .pop-right { + margin-left: 0px; + margin-right: 0px; + margin-top: -20px; + margin-bottom: -20px; + } } /* Mobile Styling */ @media screen and (max-width: 60em) { - .home .row { - padding: 4rem 0.8rem; - } - .home .row > h1, - .home .row > p { - padding-left: 1rem; - padding-right: 1rem; - } - .home .row.first { - padding-top: 2rem; - } - .home-btns { - width: 100%; - display: grid; - grid-gap: 0.5rem; - gap: 0.5rem; - } - .home .example-container { - display: flex; - flex-direction: column; - row-gap: 20px; - width: 100%; - justify-content: center; - border-radius: 0; - padding: 1rem 0; - } - .home .row { - padding-left: 0; - padding-right: 0; - } - .home .tabbed-set { - width: 100%; - border-radius: 0; - } - .home .demo { - width: 100%; - display: flex; - justify-content: center; - } - .home .demo > .white-bg { - width: 80%; - max-width: 80%; - } + .home .row { + padding: 4rem 0.8rem; + } + .home .row > h1, + .home .row > p { + padding-left: 1rem; + padding-right: 1rem; + } + .home .row.first { + padding-top: 2rem; + } + .home-btns { + width: 100%; + display: grid; + grid-gap: 0.5rem; + gap: 0.5rem; + } + .home .example-container { + display: flex; + flex-direction: column; + row-gap: 20px; + width: 100%; + justify-content: center; + border-radius: 0; + padding: 1rem 0; + } + .home .row { + padding-left: 0; + padding-right: 0; + } + .home .tabbed-set { + width: 100%; + border-radius: 0; + } + .home .demo { + width: 100%; + display: flex; + justify-content: center; + } + .home .demo > .white-bg { + width: 80%; + max-width: 80%; + } } diff --git a/docs/src/assets/img/add-interactivity.png b/docs/src/assets/img/add-interactivity.png index e5e24d2925db020621ed3a157b3b34bd516353c1..009b52ac123e2854259c3b2b3e478a721ed6b110 100644 GIT binary patch literal 20821 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 diff --git a/docs/src/assets/img/create-user-interfaces.png b/docs/src/assets/img/create-user-interfaces.png index 13abd064d9ba90d6640f3769bba0eade6e366868..06f6ea0cb6fdd4e17a6af5e374ced578cc0728f3 100644 GIT binary patch delta 11314 zcma*NWl&u~lr4O*puyb(!QEYhySoG@5Zv`Zg1fr~3GVKJ;O+zu9^CC>-%Vz|s(JHX zP0gQEeNJ_qmfgMA+H3E%kC7(t!c~-{-y#trfk2?QvN95CAP^K0q&jhS zhX?(prj}n9T7Z*@m5+&?U4xy2pN)&3gPVz!ho6;|g51;2kzdil{F9}Zgo&$#5CuCc z`+w=m&dJZlmpB1Ug8qMfe1!I*BRGXJR+yGGnr|X;9wdCev;^yY%GvVXrW;3@;T!f+eU-ct{ z)t3BU{LhSn+{IPW-Id?N+QR<7FYDh9B(}qf;yasL@_+vHpIuGNTt7KLI=h&-C+fhG zN}6z+vYDB1nK1F1a9A>Na&dAqnX;O5GnsR8a`3QQnwfD}aQ#oiu(R^Bu|kFsWd6?q z%&bl9tt`xiC|D?1gvkZ}$HD&>d;34G@jpxl864yP8a(k9)(H68lZycY(FMv%h-r9c zon-r{BrdkScDK9T%^`=c=HF2rY^HQt*EK6Q7byAQJ$yuCs;zIa3v%Y(bUI#IemldER&%X3%chf z{Y7j+?@TW;BNVu)*f-p`c{)8P&V2*g+*4nAA^=Tk((r0PK?nXuiiHwAWTsy^t04bC zK7=k4e|}-vp0`GW_}*L()uClCuu8!kT0-ngM|Ho5c#vFu^^j|H{f*59!78 z%a@u2Bs(TToe%9v3g42IKt1bEoLRi1OYuLr=-|bXgx71c-hx!JF*>N=|A?(1&#AhK zpkYfdoSm{d8-I1C^+y$b()mK;r9ezt_&FJ-SFS85U#=vUr=U2u3hVC_j;jkg#R5-9 zv)e{hXn~Wh{(ZbDWWv-lmdO(J2gcYt0S4Xz^CP^rJlKIEL1)CLhR%0Q{7{w>r#c0~ z6zJyIv>~4211?zI&1PO31W;?TKbF;9X+SNuF1+KeG#nI*5l}&r_Kl+d5>z^AGT$&O})v4EP*ts4p*`WqpYtm)RU&_fMj6SjAt zyicV}@SqP&KjS8fj`Nm7Egipnc7qmmvwS{91!f0wy-9I;C*egX|1FB6U*{2dO7Mawvn?hCw{JTG3xWjcY2LkB= zUZJx-%^u6-J+aWWr3{|^E}fYA)*aEzer^=bY&syZUb5y>!y^)U(G$Xqb5h&vde1n? z{H^Y-5NN`ECjM%W5{~RFucYzXin_uI<{`W;?TOgZpsou;aPSO?NZ6>L=?>0~1Tdk( znKy2rk+$!q3uHy~tjMo|i_diHu{9}DpTG$eWwk)sp;@?cSCxuc@>C8NJva3q%u1p{ zM>zdmdyxYQWGyAfl_YOTq}vt>93BIn27#zM?9Uh7uaDi^Lcy{Kx&;WZ9^#ArJ@}aHRd})oyEse7mQvA!|{VY{T=%F_+gzI1kK)jDvwg zFYA9<0_NUs{G@&O-Oj}-7Ph*t-*0YCQ$XCQ$jNwJ`7}F5z^kLpUMp`alqHl1qI~k8`0as@K%48H~3Y0 zmhy5hvb+B$n2Elf|Cy>GiR#3*fg8I=l@#Xp>;Bl(i}J)tq(C#vX}LbQEDcV8r>2Wu z81lN>rQE<`5fTFPi!?*Oo1cdxDLS3SqH3bjIQwz>OL4`m5|=xEIlVZqFxql=AxJcb zVh9~!A`O{P5tzROn~s)w9?f`%PXOFaGZP4%hed*Ps z@-U0Q4=7X{8egr(52%YN%^yc}xx!MBO~p2nFi%*rtk|-`@mXd_akr28)^#pc>g(ua z+BOte6oJ(gH@`L=LN-sR<@k%ykI(iZHx=!vzM%oQ-f=s5+O2j3m2@A>5iUFS;?^}Z zFNfvw;tGZoUy9?Fb%FQUt}=>^vcEDcrn?>J>}&r-&RIbvw%x$g%C@LqgB(1q zyJjA!20x!ni{pDYK+2(f&aSzEaYGbzf6+_jm#J&gQ*kPvOQhAam;XLKj8WyZ$J^Yr z=}du}hq`%P#d*|5pGc#@oeDu4VM?qh~RbRt6lMe)yvv3)6Jx;3^ULF!iikdb~HpUD40*li7F1vN3Z1t8O#P z^t>I(S}#K9wiSUNksw)=?TywWRTOGwt?+pAfQK~6ID>=sfHYzd0wS7P6RC4!YCKTZ zgHAN#oeZYoZPCVCkdY89iqhAG0zqzm<^{MnsX~SpiQ|qKj+LjIYt1)la34PJu5HaR z4BQJ}gjX>aY$t;!yvD@x{9`XQ2V!Kn6jmX_vxB;ymWC=T=R5ZPE6>Z9HM({>VH3*P zZNmY-VPiKp*7O{$f?Kh#sQs1DvjC}NRYlRQ8PNi`I=;J|>u#YB+0Eu9V1l&1DvU5M9%t?u7t z7+=&M#@1u@p#dVS*s}B%Pp0u@IvtM*K?M;(6Ph6mL&^RhAJW>%kk=Ee_cJ4tcB=w+SQZ_3dG zW=jq0bX?Lsea(gn=cVl)&jOC8LM0Ka-qaaxUL3aZ1p*p(gxLhjEs1sYMr*fL-STa4 zaal$)tMw+8hE?wUd5i<1! zA=gV>HE>KhWY*Kuvn>Pty5U0k5< zc)mH;=~UL~Lv4d))uxL{gn@;gDPH*&@MS;U6Bj4NgOkqe!E+KCl%HTEl)m{pP`~lL zVn*76tIuaEb40x-kw4)c_OS5e(^ugkK%ttoSf9mPy(i-xu?vwNZZkVo26w8Wnri#! z6d&JtUl3Y%)#KX5qKzspVvwu&9#fySZaeC%P zMwLig)d3fadEY~xvcSyrHf>)~nzzwP2>vvN4JnVM{(ym9t!w)_RNvJ}$! zew8E_&&*Bj@)OJVDatNjd-F??yPu5KJ>hFpALl32&Jn96j!dX52StU%6ypPFD|OQh zPBz7i7X5hzw3etFNxfM+aJ+Z&BuBmBudm@mGnDgD>qeGS{@2Hdlh}Z>JkEgLa6#%y zqyM++KTVnjsQQm~SE`00xP7ld7yXovC8sW*#*Lv%G}i{k_(lVFCodhhVe54ovmd?x z9PDScLJy@0WZj3EbE#L+)yoGtN0d?e z=3AT5a^3{*e(hdzS@hagkHPU|m4D`%!4`P;LgN{65uUSHW)CR)I9)MEZiE<(e;`|r zz|f46#!I=Q#_GWL$v9h+K3^R#II$cROIM&4sL?cbY=F2#s$h`IXz(*Ly1gxb;(q~>yLrCuK36_o;s`R z_EU6dxvvn%C~#G2^>b@6$!Rel{6^RAQ`pnX6mlV% zsMpgGzi@aOJt^0`t)+F?Z!QcX^P%(`ZtX&Z<_qRT1nw=y%epRdU;+axRAIje5a>rz zB>40ey!kK0^`9ePM`V(#;mKuJ-eD8Y#&64)qgRiP2+CAerNY(}S8ZqfeiE&B9e=%h zf=eI7h3WMnNdJ2g<-sm^%gg@cVtQbdNv`D~DVb$ANXp-|ll+6q+~p6`la3ESyHSS+ zI1)pbhJ-p_oNBl^xpX@1kVu<%nrt^pVfBL};-#?7*f;mHZ^z9u^_{#KD@)kgLY7x- z(wWUg2XUPIEM>ygOJ-k{j5-$cub1}XKPHLG<+>X^86jpHDW-l9F8sYs^5RUL+wsxC zAGKKbJjDPKGrT3aqj(T>otKRV(8Ddiu658uzC)poHY76Fz3F5+E|WBs^9UK$3$jIrxZ0yQll#;XF^ivS{e z?h^@eNHBWjC!f2!r1~sL0NoQWpOMGqlWwrQbtkT${wYh&m zDz&tmrXoI!7w^u6BmMd&-*f;{K4Uo2EGdRjHdT!c**Z(cCRzr zMmz9mqka%xFR5%s7DsEb)WP3>-|08L1neuP%A8bO52vp*vXez)TilHSV_$c z7}!ic%ag`;z-O8Wb8wk2z>jqcF&D``KwcRi7v!hrJ3e05;=3AL1$3Y4JZ z2`bWpFDmOFYg;oRoTyH*(X^HreAdiw?v81@L@05UbF}YpcM-&1j=%X6ZRkMciVLx} zPTan;?ILQBQ2`tP?tiRar7*gYX!~(OaMRX$73%vWJUK*%c+uut&sBT#aW% z-DCBDb{!Krt-@RgQWLB;d!JX&xOMYPoy#rQmo5yp zkobdB^|5#8W|)lxpPM+le=IO8#bjOLN}T4EV9N2T6a)Bm8$2FNlF2F>vP#y{J!Hzi zA_7L0vos(62D1X)h1!$Fr}-tA5qhIAhNEL~{`>M4S61Y-Jv%}Ue@%FvAh^xqG@0`g z4bM+DflD1*62X83CE69PR;y)M8nIipwdl=~ zar6i?FfW*dH4{o|p#W5%Ags+utkM$W%B`%=iLV%B1=PW!+&{b1Jd0eMgk&tBAF<&^_7c zkre+&Gn_|%ZZGP7r0}5Nbl`^bETx9tnnsY&vtDxP2Z5Q3RmPnv@-pH&su$U=lpwP; zje=mudj9wBPLFXl+&uXu?4nU{%x^B5R45RCCZ_yc=34UJnoM#bpqez`a5$~0gWG^b z%GR-Zbft?+GW8yUr8y_p#$bMUQJ0(GKF)(BB@{!x(Lyg4lRmdonJZx)5vb&brjBz8 zibND`R9*fqMbGPV=SadfXDw$^kWxeG?=!O%@zuCJ5+NT`H|U#x0889CGxQ}d`y65G z#wfQKV?id$0sy?f#k+iQ?=9>fU8Gf3PfNf-T;uvsgj7H!yK-{bCY`3BpcZ*}c;@jb z(|jO|^9;m#{!@Mw_rD3T`jy-vj$V$8CZjfv6`a3qhmR3y(ns^iR{6EiIP4-bnr;b7!9SZRAu}?`5DFl2LQiX zlW;$-J-7n1p&zY^o=k>6s+%$))#dYPza}eulHw7ENC81t1c?upy*0Z5pAA_-D9wN4 z@;RKz(wuIg1h|tmGkGqNsEuRd5S=8&`+ZzyjWzJ&VXh$e*0JPD%9fs6w0@Ker-Vic z>|w9CAz^=Q@ga#S4&-NJoQ=Rdn(P_?f4|==G5_;b20X7`??kY5vt%mwk=(v9Ep0Xy z2JPEHYiOh&q4k?ppw}j4gHv%Ik9x20fS~WE|J%IQ>cBRKB;+KInVI~Y;fH6>$zF^h z!rk|G_S9$aAOi=v4tqT=+v({-s#%bARj0n!6-B^OWDNC#;jayx6dZuW+`zu4(M*Tn z$D20_kNu&IT&`cAlesK4^-)I_;M{U>JJl_KL#fuSXy>Rlrp+gW{JQd47`o{dO%Qsb ze)gVx_!RyR8VT zLr<=Nx2(o1Rd4uBO=yAbB{;*kV|6a^ZKTbv7o+tKr`15^L!42&XEwNKj9Jqml2|7j zmB1)nbfKRvC0qx6l+ zya(}8#E5ABpCo>Ee6)$fsJ}MCO1$BJnP7+qG*JNCZ!keT(64aSP|z?7GtA035id81M+K76C6Q5EYii} z8vnAy0JU%UVVo7JLO!U*Npds0^rCnRi4OS^WkHPdBaEU2EhSq*RxV?E`F91e#l@rM zzyZE}sl#U9!?I21O#ovIADB3cI|A@TtgyZ_1hY;|lBKW`CI{n#^f&pOGJT zULYTn7``$R^y>h?Y6{N#(6;0K>Pp*GHG}F!;<2C_b^Gmx5ZO{`wObsL^JhwS*#-x>>wQ}9m@Ff zh=bQcE=ts8JF8c&&EZjLgYK_lkncPaQI;WjvA_5nJL2Ba-`$5{1(bM8zsC$$67WT$ zwmNtI-P^6D+;As?WhWejF~oy&_+9}6r|ddH+-&za=@-dW-n~7F(qKEXG>*Z?N zeJBz@x!;})*(qQYvO~eT6yDF$f}I>M??J!aJ2jmB!7DzL=g-eYqb+|v^GE*S>TzwA zH#@Z0AK^DSwwP@rZN#M>u0ispbi7Mj@}s6sprJ&Zl@V+I_D?0f?)6Mm;*6NNS6r|N z0}DjeC{gRf;|HCxwa$;lyL`0=M#c0{0JOegb0-k%lO|oIaD$YFyBk=(0mi=S_4VKj z^a|E@ZsJVd2s%^Mg$oESs<0>u#*PzQ*c$Es_POatb8jbp91OhsWpAwbcCUZsg<3 z)-f~*3@J?{w!7XBRG}14l&|9+RA+b&#+ym#qZM`+et%2%SH$%^W!nDgE5d1WW~EGP z$Fd}?J6I}l-JGd04$1@Pdjp=>X7m=NHkdwwYAbA>{YZ9%8{}mm? zDrmiI`dQ;!)d$9r@)B#+2(3vRXlKxUw=felvCkBrm=A<}zQ+zu_lfz^FGj_tC6X5Bm#Iag@16cN#7;8%Il6pL?A^%)`nio`Du`v8|wzzI|KhE(`Kzl|C zVlhzQvFF06(#L23h=feXexON1iRvU`e`>?D7a~s_HiuXIup8|$kKo@UNNyj!*A9bV zv?Ei~*?Q2v`J0!>>ET5AeskYwRwuWgz#FMfif{b9=Wt;p+g6Dg<|EDbWWcC3eGgCh)Hhz8->##Y^PCqal0T!XTsh^g{#ki#G zP?eHZei&;i{zSORxW-L-FjWk&Mu10rygyWAaT;2()tO0GtDWoj{Y1c_1>Ki14J;)s zx-m3bmhT)36kowBaV#!*<8Iw}@pN+&w?+;Xo6@M%jG8HgceYI_UpT0{M2u9W3=fQF ziFOE|?L(kpmFA`C>+=m;walAsVaWCKc6eU%b+TucBiyj136oTWcJ_XKL0AurpA~pF zfB8RqmytKLx=0uVix>!23&h$E_XctaBK985$Q~* zT)yR|;794RE^1hPBu<`sR(sAoFf|9*S>N+ftXz_Dk?i;-rT!3UcKmj@P;kGF=$P2B zPLjQIO`6FAJhqlHXXg;~$zHXO^yk&dT=9Ifawf2q% zv*9&JYm}s2?TtNXqtGHD-MGt#JqRt~za-B4M59h*7XDi659)m;n_Do*|VV0-{L;8=#Zm(VW- z#-}3s{zb0`tf}uME0T4~=O6!NN+MEKREMx9|DFLM)~ma|w+Hcu{QNHMV{sy>7!9+0 zn;7XyxhTKu(qu8JlcqHdq;~D;w1Eyc$SJ7a_SK}v4425C!L6*~rEcbrnN_3y`|iyp zqDa#fHtcsrb@K`1Ybl>DE&P|oVc4%0f7uUBWOvT(D&ZX!q-R|U#>k(8C(gFoKd##6 zZC~|48lB?`74S*<<2&NSbSF$Jtj+aFBXU89mP?JZ(c)Qt_D0-;ga7E@rt?VZOaJ_*E-r``; zrPj^ZW!ungxxOme6nXLU&tIr`V196&`9ufJ^y7~aSzzmiFIrmTBAAY1UG#B3%3$$J zrqll~%Y_CxW#fpoPg4%)4C6Sw!+NajFsfocAWJxli9R!wR$-J*sE#m zp}7AF6cb@}IPjt42|gJnPUMlKtdhO9VfB3Z>`kHCI^FZrINRCUq~UiE(F@lw;V!3H zS;T&HSU=QQrK{yd(dgE)BVYEOp>DJBJDG2hc8JT-q$c3zc!qW8=*RWg3MJ*l;TZ_D z9(*e77EL7sq=R7UIMW%UUsgZ07@bi)8|O>_vlP^(S~pDy@D|=Y)3^PM+=VwiTBlRQ zbgj)ZvhxBI#8b+JM-4-Jl3Cv0g(v6zjjhT?ZS29PiZAlBet2I>wrEfxcNufSYRpY? z?|d@2Ge(~>p-7~R*Cq73PrAAgAW-bEBht43Q^%_$uZwvB?g&bmZ?<>B>r!Q1zw!k7 z=nz&(AFhfm_ZoHs6r?g|yQCnV5KY8S$MvpyDex&vl~{rzDuS-IR@sR8ko)!3_$Eg6 zV}hq2L@az~^p~PRBEcbO$+Q5^S_oIeLO1;@Bfk5a6vsMiDuD$5noNY*8X2OF4C{8P z<2;k)#$${*JnL8F=&qj4k^s~o`%$%HJ{nc@oge}%p+hsRXr}bqCQ{g$bQ->AwKe5h_$&+Q5Zg4x7QO^H31<)jO>1Aic^lmb$u>G=Ndb;HW% z5ZGQF4nD>ah}1K69hb|H{tGc^nuCCmo-Rya)vZTkYIXH`jg@uH1K8vp4?i#2ddBS^ z!D3WVh#n_B`3;D$k-4~R= z-%$*@eS#s5S9CV1!LTQ#?T|_r=d%l5Zd`r}l354|on7@TZ9i4zENix;}hiS;lVrN(iSa5c6 zl{#D$9%V`DueO>#X7?}cPuoq)VyI+=H&0X29Oq~xZPwE$BA2=&xi(H&y(qmkZi(eWmyJ7x}9WTv@ZPq zFyX_d^Qc%~+Ks3BPIpOLz8I)hCrG{0Kj^#s&pdsc1AXDum@RgZ0!||RifOMGjE943 zT}~_orn0<(RAgO0(sC9G0PF=b^iHV__$DpVhj?ysN5O)U)GV3GtWThM=6XqosbGBy zJTp?3oxzEMlFM9_u5k6!GY!~NN19&km@mk#SWy{#M0f3qxJV|^0p%4~@=~{eZiO-< z%O}kqhnUK+;Lf0{fBL1VYD!v^QLdY%#HAO0+nn{z;>D9?%?+@Q2WlUlk5)ky49I=9 zjG6U_b^h*ku3%LM6-g8kJ#&NlYeL9@X47|j?J<3FBC5yGxoIOydNdzm`y>+=rCa9O zRcoN=6W#qbVsY09ieNWE22^`HGYvu-6X;Jm!X6j~rYX~7ooqm1&>QzZ^4qeqgsR`_ z2rL^i9fbkQb%m1lFh1Sis#jpqlXdlCB)KW+s?n9?&;A(8E1mWYYRyjysg^b^OkiU6+*kMK*YA(b5d2|JKmMVW$>9%s zzQ+ZDTO2Zp*P&5JO;ISMz-T!B10?@}8X1UKmoEK8zs_F=$t>_`gymT)#~9>Lh*C9v zo$>QZ{#)Fp|MPN7zQps#`(tY5_z*SM)y~C?QN;Y1UHheCl1y@3kzP8SH8!4R z$36D^YUDNnZ0`zGSc2y1T^UZdLEwDTPjeP-t}}PmoVE;oM zm&!k(-0S|qij*)~6rV-VOf^;;`4|1+COj!YlqkNmpp(n!f8^hNEyYKS5n=DxZ*gz_ zBh4OUJm5kP0kgTMVM3wl*FaICr Cg~xyZ delta 11435 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�wQwLK+5Z%JTb!YxBy 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 ZTP@T1>bv9!&_5i4q(3Q$SBM$}{C`(dFKhq+ diff --git a/docs/src/reference/components.md b/docs/src/reference/components.md index aaeabba7..1b7ae9b2 100644 --- a/docs/src/reference/components.md +++ b/docs/src/reference/components.md @@ -14,6 +14,8 @@ This allows you to embedded any number of client-side PyScript components within {% include-markdown "../reference/template-tag.md" start="" end="" %} +{% include-markdown "../reference/template-tag.md" start="" end="" %} + === "components.py" ```python diff --git a/docs/src/reference/decorators.md b/docs/src/reference/decorators.md index 6a0345da..962ec1e6 100644 --- a/docs/src/reference/decorators.md +++ b/docs/src/reference/decorators.md @@ -12,7 +12,7 @@ Decorator functions can be used within your `components.py` to help simplify dev You can limit component access to users that pass a test function by using this decorator. -This decorator is inspired by Django's [`user_passes_test`](http://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.decorators.user_passes_test) decorator, but works with ReactPy components. +This decorator is inspired by Django's [`user_passes_test`](http://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.decorators.user_passes_test) decorator, but this one works with ReactPy components. === "components.py" diff --git a/docs/src/reference/hooks.md b/docs/src/reference/hooks.md index 6d7da90f..43c4641b 100644 --- a/docs/src/reference/hooks.md +++ b/docs/src/reference/hooks.md @@ -400,7 +400,7 @@ This is often used to create chat systems, synchronize data between components, In these cases, you can use the `#!python use_channel_layer` hook to receive a signal within your component, and then use the `#!python get_channel_layer().send(...)` to send the signal. - In the example below, the sender will send a signal every time `#!python ExampleModel` is saved. Then, when the receiver component gets this signal, it explicitly calls `#!python set_message(...)` to trigger a re-render. + In the example below, the sender will signal every time `#!python ExampleModel` is saved. Then, when the receiver gets this signal, it explicitly calls `#!python set_message(...)` to trigger a re-render. === "signals.py" @@ -522,7 +522,7 @@ You can expect this hook to provide strings such as `http://example.com`. Shortcut that returns the root component's `#!python id` from the WebSocket or HTTP connection. -The root ID is currently a randomly generated `#!python uuid4` (unique across all root component). +The root ID is a randomly generated `#!python uuid4`. It is notable to mention that it is persistent across the current connection. The `uuid` is reset when the page is refreshed. This is useful when used in combination with [`#!python use_channel_layer`](#use-channel-layer) to send messages to a specific component instance, and/or retain a backlog of messages in case that component is disconnected via `#!python use_channel_layer( ... , group_discard=False)`. diff --git a/docs/src/reference/html.md b/docs/src/reference/html.md index fd63c033..3fe3fe46 100644 --- a/docs/src/reference/html.md +++ b/docs/src/reference/html.md @@ -10,11 +10,11 @@ We supply some pre-generated that HTML nodes can be used to help simplify develo ## PyScript -Primitive HTML tag that is leveraged by [`reactpy_django.components.pyscript_component`](./components.md#pyscript-component). +PyScript code block. The text content of this tag are executed within the PyScript interpreter. This can be used as an alternative to the `#!python reactpy.html.script`. -This can be used as an alternative to the `#!python reactpy.html.script` tag to execute JavaScript and run client-side Python code. +This is a primitive HTML tag that is leveraged by [`reactpy_django.components.pyscript_component`](./components.md#pyscript-component). -Additionally, this tag functions identically to any other tag contained within `#!python reactpy.html`, and can be used in the same way. +The `pyscript` tag functions identically to HTML tags contained within `#!python reactpy.html`. === "components.py" diff --git a/docs/src/reference/template-tag.md b/docs/src/reference/template-tag.md index 434c81d0..197a3b29 100644 --- a/docs/src/reference/template-tag.md +++ b/docs/src/reference/template-tag.md @@ -10,7 +10,7 @@ Django template tags can be used within your HTML templates to provide ReactPy f ## Component -This template tag can be used to insert any number of ReactPy components onto your page. +This template tag can be used to insert any number of **server-side** ReactPy components onto your page. Each component loaded via this template tag will receive a dedicated WebSocket connection to the server. @@ -159,9 +159,10 @@ This template tag can be used to insert any number of **client-side** ReactPy co By default, the only dependencies available are the Python standard library, `pyscript`, `pyodide`, `reactpy` core. -Your PyScript component file requires a `#!python def root()` component to function as the entry point. +The entire file path provided is loaded directly into the browser, and must have a `#!python def root()` component to act as the entry point. + !!! warning "Pitfall" @@ -169,6 +170,8 @@ Your PyScript component file requires a `#!python def root()` component to funct As a result of running client-side, Python packages within your local environment (such as those installed via `pip install ...`) are **not accessible** within PyScript components. + + === "my_template.html" ```jinja diff --git a/docs/src/reference/utils.md b/docs/src/reference/utils.md index 6590012c..5402cc85 100644 --- a/docs/src/reference/utils.md +++ b/docs/src/reference/utils.md @@ -14,7 +14,7 @@ Utility functions provide various miscellaneous functionality for advanced use c ## Register Iframe -This function is used register a view as an `#!python iframe` with ReactPy. +This function is used register a Django view as a ReactPy `#!python iframe`. It is mandatory to use this function alongside [`view_to_iframe`](../reference/components.md#view-to-iframe). diff --git a/src/reactpy_django/utils.py b/src/reactpy_django/utils.py index 48559e84..401cf724 100644 --- a/src/reactpy_django/utils.py +++ b/src/reactpy_django/utils.py @@ -334,7 +334,7 @@ def django_query_postprocessor( "One of the following may have occurred:\n" " - You are using a non-Django ORM.\n" " - You are attempting to use `use_query` to fetch non-ORM data.\n\n" - "If these situations seem correct, you may want to consider disabling the postprocessor." + "If these situations apply, you may want to disable the postprocessor." ) return data From 741de489419af95cba51228fc63db41bb7b3de0a Mon Sep 17 00:00:00 2001 From: Mark Bakhit Date: Mon, 21 Oct 2024 17:52:41 -0700 Subject: [PATCH 3/6] Support ReactPy Router v1.0.0 (#252) - Adds support for ReactPy Router v1.0.0 - Docs cleanup - Tests cleanup - Remove deprecated code --- CHANGELOG.md | 20 ++- README.md | 2 +- ...module.html => pyscript-local-import.html} | 0 ...t-js-execution.py => pyodide-js-module.py} | 0 ...-js-module.py => pyscript-local-import.py} | 0 docs/mkdocs.yml | 2 - docs/src/dictionary.txt | 64 ++++----- .../learn/add-reactpy-to-a-django-project.md | 16 +-- docs/src/learn/your-first-component.md | 22 +-- docs/src/reference/components.md | 12 +- docs/src/reference/decorators.md | 2 +- docs/src/reference/hooks.md | 8 +- docs/src/reference/html.md | 2 +- docs/src/reference/management-commands.md | 2 +- docs/src/reference/router.md | 11 +- docs/src/reference/settings.md | 7 +- docs/src/reference/template-tag.md | 32 +++-- docs/src/reference/utils.md | 8 +- requirements/build-docs.txt | 1 - requirements/pkg-deps.txt | 3 +- setup.cfg | 2 - src/reactpy_django/__init__.py | 8 +- src/reactpy_django/checks.py | 68 +++++---- src/reactpy_django/components.py | 90 +++--------- src/reactpy_django/config.py | 10 +- src/reactpy_django/database.py | 2 +- src/reactpy_django/decorators.py | 40 +----- src/reactpy_django/http/views.py | 6 +- src/reactpy_django/router/__init__.py | 2 +- src/reactpy_django/router/converters.py | 3 +- src/reactpy_django/router/resolvers.py | 64 ++------- src/reactpy_django/websocket/paths.py | 6 +- tests/test_app/apps.py | 12 +- tests/test_app/components.py | 104 ++++---------- tests/test_app/router/components.py | 47 +++---- tests/test_app/router/urls.py | 2 +- tests/test_app/templates/base.html | 20 +-- ...ple-button.js => button-from-js-module.js} | 0 tests/test_app/tests/test_components.py | 129 ++++++++---------- tests/test_app/views.py | 10 +- 40 files changed, 332 insertions(+), 507 deletions(-) rename docs/examples/html/{pyscript-js-module.html => pyscript-local-import.html} (100%) rename docs/examples/python/{pyscript-js-execution.py => pyodide-js-module.py} (100%) rename docs/examples/python/{pyscript-js-module.py => pyscript-local-import.py} (100%) delete mode 100644 setup.cfg rename tests/test_app/tests/js/{simple-button.js => button-from-js-module.js} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9652b644..6680348a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,9 +36,21 @@ Don't forget to remove deprecated code on each major release! ## [Unreleased] -- Nothing (yet)! +### Changed + +- Now using ReactPy-Router v1 for URL routing, which comes with a slightly different API than before. +- Removed dependency on `aiofile`. + +### Removed + +- Removed the following **deprecated** features: + - The `compatibility` argument on `reactpy_django.components.view_to_component` + - `reactpy_django.components.view_to_component` **usage as a decorator** + - `reactpy_django.decorators.auth_required` + - `reactpy_django.REACTPY_WEBSOCKET_PATH` + - `settings.py:REACTPY_WEBSOCKET_URL` -## [4.0.0] +## [4.0.0] - 2024-06-22 ### Added @@ -112,8 +124,8 @@ Don't forget to remove deprecated code on each major release! - New Django `User` related features! - `reactpy_django.hooks.use_user` can be used to access the current user. - `reactpy_django.hooks.use_user_data` provides a simplified interface for storing user key-value data. - - `reactpy_django.decorators.user_passes_test` is inspired by the [equivalent Django decorator](http://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.decorators.user_passes_test), but ours works with ReactPy components. - - `settings.py:REACTPY_AUTO_RELOGIN` will cause component WebSocket connections to automatically [re-login](https://channels.readthedocs.io/en/latest/topics/authentication.html#how-to-log-a-user-in-out) users that are already authenticated. This is useful to continuously update `last_login` timestamps and refresh the [Django login session](https://docs.djangoproject.com/en/dev/topics/http/sessions/). + - `reactpy_django.decorators.user_passes_test` is inspired by the [equivalent Django decorator](http://docs.djangoproject.com/en/stable/topics/auth/default/#django.contrib.auth.decorators.user_passes_test), but ours works with ReactPy components. + - `settings.py:REACTPY_AUTO_RELOGIN` will cause component WebSocket connections to automatically [re-login](https://channels.readthedocs.io/en/latest/topics/authentication.html#how-to-log-a-user-in-out) users that are already authenticated. This is useful to continuously update `last_login` timestamps and refresh the [Django login session](https://docs.djangoproject.com/en/stable/topics/http/sessions/). ### Changed diff --git a/README.md b/README.md index 817e684b..d3d2a1a9 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ def hello_world(recipient: str): -## [`my_app/templates/my_template.html`](https://docs.djangoproject.com/en/dev/topics/templates/) +## [`my_app/templates/my_template.html`](https://docs.djangoproject.com/en/stable/topics/templates/) diff --git a/docs/examples/html/pyscript-js-module.html b/docs/examples/html/pyscript-local-import.html similarity index 100% rename from docs/examples/html/pyscript-js-module.html rename to docs/examples/html/pyscript-local-import.html diff --git a/docs/examples/python/pyscript-js-execution.py b/docs/examples/python/pyodide-js-module.py similarity index 100% rename from docs/examples/python/pyscript-js-execution.py rename to docs/examples/python/pyodide-js-module.py diff --git a/docs/examples/python/pyscript-js-module.py b/docs/examples/python/pyscript-local-import.py similarity index 100% rename from docs/examples/python/pyscript-js-module.py rename to docs/examples/python/pyscript-local-import.py diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index e4159640..c1b5922f 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -89,8 +89,6 @@ plugins: - spellcheck: known_words: dictionary.txt allow_unicode: no - ignore_code: yes - # - section-index extra: generator: false diff --git a/docs/src/dictionary.txt b/docs/src/dictionary.txt index 66265e78..14aa7a61 100644 --- a/docs/src/dictionary.txt +++ b/docs/src/dictionary.txt @@ -1,43 +1,45 @@ +asgi +async +backend +backends +backhaul +broadcasted +changelog django -sanic -plotly +frontend +frontends +hello_world +html +iframe +jupyter +keyworded +middleware +misconfiguration +misconfigurations +my_template nox -WebSocket -WebSockets -changelog -async +plotly +postfixed +postprocessing +postprocessor pre prefetch prefetching preloader -whitespace +preprocessor +py +pyodide +pyscript +reactpy refetch refetched refetching -html -jupyter -iframe -keyworded +sanic +serializable stylesheet stylesheets -unstyled -py -reactpy -asgi -postfixed -postprocessing -serializable -postprocessor -preprocessor -middleware -backends -backend -frontend -frontends -misconfiguration -misconfigurations -backhaul sublicense -broadcasted -hello_world -my_template +unstyled +WebSocket +WebSockets +whitespace diff --git a/docs/src/learn/add-reactpy-to-a-django-project.md b/docs/src/learn/add-reactpy-to-a-django-project.md index dd258737..0bf919e2 100644 --- a/docs/src/learn/add-reactpy-to-a-django-project.md +++ b/docs/src/learn/add-reactpy-to-a-django-project.md @@ -8,7 +8,7 @@ If you want to add some interactivity to your existing **Django project**, you d !!! abstract "Note" - These docs assumes you have already created [a **Django project**](https://docs.djangoproject.com/en/dev/intro/tutorial01/), which involves creating and installing at least one **Django app**. + These docs assumes you have already created [a **Django project**](https://docs.djangoproject.com/en/stable/intro/tutorial01/), which involves creating and installing at least one **Django app**. If do not have a **Django project**, check out this [9 minute YouTube tutorial](https://www.youtube.com/watch?v=ZsJRXS_vrw0) created by _IDG TECHtalk_. @@ -24,7 +24,7 @@ pip install reactpy-django ## Step 2: Configure `settings.py` -Add `#!python "reactpy_django"` to [`INSTALLED_APPS`](https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-INSTALLED_APPS) in your [`settings.py`](https://docs.djangoproject.com/en/dev/topics/settings/) file. +Add `#!python "reactpy_django"` to [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std:setting-INSTALLED_APPS) in your [`settings.py`](https://docs.djangoproject.com/en/stable/topics/settings/) file. === "settings.py" @@ -36,7 +36,7 @@ Add `#!python "reactpy_django"` to [`INSTALLED_APPS`](https://docs.djangoproject ReactPy-Django requires Django ASGI and [Django Channels](https://github.com/django/channels) WebSockets. - If you have not enabled ASGI on your **Django project** yet, here is a summary of the [`django`](https://docs.djangoproject.com/en/dev/howto/deployment/asgi/) and [`channels`](https://channels.readthedocs.io/en/stable/installation.html) installation docs: + If you have not enabled ASGI on your **Django project** yet, here is a summary of the [`django`](https://docs.djangoproject.com/en/stable/howto/deployment/asgi/) and [`channels`](https://channels.readthedocs.io/en/stable/installation.html) installation docs: 1. Install `channels[daphne]` 2. Add `#!python "daphne"` to `#!python INSTALLED_APPS`. @@ -59,7 +59,7 @@ Add `#!python "reactpy_django"` to [`INSTALLED_APPS`](https://docs.djangoproject ## Step 3: Configure `urls.py` -Add ReactPy HTTP paths to your `#!python urlpatterns` in your [`urls.py`](https://docs.djangoproject.com/en/dev/topics/http/urls/) file. +Add ReactPy HTTP paths to your `#!python urlpatterns` in your [`urls.py`](https://docs.djangoproject.com/en/stable/topics/http/urls/) file. === "urls.py" @@ -69,7 +69,7 @@ Add ReactPy HTTP paths to your `#!python urlpatterns` in your [`urls.py`](https: ## Step 4: Configure `asgi.py` -Register ReactPy's WebSocket using `#!python REACTPY_WEBSOCKET_ROUTE` in your [`asgi.py`](https://docs.djangoproject.com/en/dev/howto/deployment/asgi/) file. +Register ReactPy's WebSocket using `#!python REACTPY_WEBSOCKET_ROUTE` in your [`asgi.py`](https://docs.djangoproject.com/en/stable/howto/deployment/asgi/) file. === "asgi.py" @@ -97,7 +97,7 @@ Register ReactPy's WebSocket using `#!python REACTPY_WEBSOCKET_ROUTE` in your [` ## Step 5: Run database migrations -Run Django's [`migrate` command](https://docs.djangoproject.com/en/dev/topics/migrations/) to initialize ReactPy-Django's database table. +Run Django's [`migrate` command](https://docs.djangoproject.com/en/stable/topics/migrations/) to initialize ReactPy-Django's database table. ```bash linenums="0" python manage.py migrate @@ -105,7 +105,7 @@ python manage.py migrate ## Step 6: Check your configuration -Run Django's [`check` command](https://docs.djangoproject.com/en/dev/ref/django-admin/#check) to verify if ReactPy was set up correctly. +Run Django's [`check` command](https://docs.djangoproject.com/en/stable/ref/django-admin/#check) to verify if ReactPy was set up correctly. ```bash linenums="0" python manage.py check @@ -113,7 +113,7 @@ python manage.py check ## Step 7: Create your first component -The [next step](./your-first-component.md) will show you how to create your first ReactPy component. +The [next page](./your-first-component.md) will show you how to create your first ReactPy component. Prefer a quick summary? Read the **At a Glance** section below. diff --git a/docs/src/learn/your-first-component.md b/docs/src/learn/your-first-component.md index 08df6a57..85af4109 100644 --- a/docs/src/learn/your-first-component.md +++ b/docs/src/learn/your-first-component.md @@ -18,7 +18,7 @@ You will now need to pick at least one **Django app** to start using ReactPy-Dja For the following examples, we will assume the following: -1. You have a **Django app** named `my_app`, which was created by Django's [`startapp` command](https://docs.djangoproject.com/en/dev/intro/tutorial01/#creating-the-polls-app). +1. You have a **Django app** named `my_app`, which was created by Django's [`startapp` command](https://docs.djangoproject.com/en/stable/intro/tutorial01/#creating-the-polls-app). 2. You have placed `my_app` directly into your **Django project** folder (`./example_project/my_app`). This is common for small projects. ??? question "How do I organize my Django project for ReactPy?" @@ -31,7 +31,7 @@ You will need a file to start creating ReactPy components. We recommend creating a `components.py` file within your chosen **Django app** to start out. For this example, the file path will look like this: `./example_project/my_app/components.py`. -Within this file, you can define your component functions using ReactPy's `#!python @component` decorator. +Within this file, you will define your component function(s) using the `#!python @component` decorator. === "components.py" @@ -43,7 +43,7 @@ Within this file, you can define your component functions using ReactPy's `#!pyt We recommend creating a `components.py` for small **Django apps**. If your app has a lot of components, you should consider breaking them apart into individual modules such as `components/navbar.py`. - Ultimately, components are referenced by Python dotted path in `my_template.html` ([_see next step_](#embedding-in-a-template)). This path must be valid to Python's `#!python importlib`. + Ultimately, components are referenced by Python dotted path in `my_template.html` ([_see next step_](#embedding-in-a-template)). This dotted path must be valid to Python's `#!python importlib`. ??? question "What does the decorator actually do?" @@ -66,17 +66,23 @@ Additionally, you can pass in `#!python args` and `#!python kwargs` into your co {% include-markdown "../../../README.md" start="" end="" %} +???+ tip "Components are automatically registered!" + + ReactPy-Django will automatically register any component that is referenced in a Django HTML template. This means you [typically](../reference/utils.md#register-component) do not need to manually register components in your **Django app**. + + Please note that this HTML template must be properly stored within a registered Django app. ReactPy-Django will output a console log message containing all detected components when the server starts up. + {% include-markdown "../reference/template-tag.md" start="" end="" %} {% include-markdown "../reference/template-tag.md" start="" end="" %} ??? question "Where is my templates folder?" - If you do not have a `./templates/` folder in your **Django app**, you can simply create one! Keep in mind, templates within this folder will not be detected by Django unless you [add the corresponding **Django app** to `settings.py:INSTALLED_APPS`](https://docs.djangoproject.com/en/dev/ref/applications/#configuring-applications). + If you do not have a `./templates/` folder in your **Django app**, you can simply create one! Keep in mind, templates within this folder will not be detected by Django unless you [add the corresponding **Django app** to `settings.py:INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/applications/#configuring-applications). ## Setting up a Django view -Within your **Django app**'s `views.py` file, you will need to [create a view function](https://docs.djangoproject.com/en/dev/intro/tutorial01/#write-your-first-view) to render the HTML template `my_template.html` ([_from the previous step_](#embedding-in-a-template)). +Within your **Django app**'s `views.py` file, you will need to [create a view function](https://docs.djangoproject.com/en/stable/intro/tutorial01/#write-your-first-view) to render the HTML template `my_template.html` ([_from the previous step_](#embedding-in-a-template)). === "views.py" @@ -84,7 +90,7 @@ Within your **Django app**'s `views.py` file, you will need to [create a view fu {% include "../../examples/python/example/views.py" %} ``` -We will add this new view into your [`urls.py`](https://docs.djangoproject.com/en/dev/intro/tutorial01/#write-your-first-view) and define what URL it should be accessible at. +We will add this new view into your [`urls.py`](https://docs.djangoproject.com/en/stable/intro/tutorial01/#write-your-first-view) and define what URL it should be accessible at. === "urls.py" @@ -98,7 +104,7 @@ We will add this new view into your [`urls.py`](https://docs.djangoproject.com/e Once you reach that point, we recommend creating an individual `urls.py` within each of your **Django apps**. - Then, within your **Django project's** `urls.py` you will use Django's [`include` function](https://docs.djangoproject.com/en/dev/ref/urls/#include) to link it all together. + Then, within your **Django project's** `urls.py` you will use Django's [`include` function](https://docs.djangoproject.com/en/stable/ref/urls/#include) to link it all together. ## Viewing your component @@ -114,7 +120,7 @@ If you copy-pasted our example component, you will now see your component displa ??? warning "Do not use `manage.py runserver` for production" - This command is only intended for development purposes. For production deployments make sure to read [Django's documentation](https://docs.djangoproject.com/en/dev/howto/deployment/). + This command is only intended for development purposes. For production deployments make sure to read [Django's documentation](https://docs.djangoproject.com/en/stable/howto/deployment/). ## Learn more diff --git a/docs/src/reference/components.md b/docs/src/reference/components.md index 1b7ae9b2..943b76c0 100644 --- a/docs/src/reference/components.md +++ b/docs/src/reference/components.md @@ -124,7 +124,7 @@ Automatically convert a Django view into a component. At this time, this works best with static views with no interactivity. -Compatible with sync or async [Function Based Views](https://docs.djangoproject.com/en/dev/topics/http/views/) and [Class Based Views](https://docs.djangoproject.com/en/dev/topics/class-based-views/). +Compatible with sync or async [Function Based Views](https://docs.djangoproject.com/en/stable/topics/http/views/) and [Class Based Views](https://docs.djangoproject.com/en/stable/topics/class-based-views/). === "components.py" @@ -254,7 +254,7 @@ Automatically convert a Django view into an [`iframe` element](https://www.techt The contents of this `#!python iframe` is handled entirely by traditional Django view rendering. While this solution is compatible with more views than `#!python view_to_component`, it comes with different limitations. -Compatible with sync or async [Function Based Views](https://docs.djangoproject.com/en/dev/topics/http/views/) and [Class Based Views](https://docs.djangoproject.com/en/dev/topics/class-based-views/). +Compatible with sync or async [Function Based Views](https://docs.djangoproject.com/en/stable/topics/http/views/) and [Class Based Views](https://docs.djangoproject.com/en/stable/topics/class-based-views/). === "components.py" @@ -383,7 +383,7 @@ Compatible with sync or async [Function Based Views](https://docs.djangoproject. ## Django CSS -Allows you to defer loading a CSS stylesheet until a component begins rendering. This stylesheet must be stored within [Django's static files](https://docs.djangoproject.com/en/dev/howto/static-files/). +Allows you to defer loading a CSS stylesheet until a component begins rendering. This stylesheet must be stored within [Django's static files](https://docs.djangoproject.com/en/stable/howto/static-files/). === "components.py" @@ -436,11 +436,11 @@ Allows you to defer loading a CSS stylesheet until a component begins rendering. ## Django JS -Allows you to defer loading JavaScript until a component begins rendering. This JavaScript must be stored within [Django's static files](https://docs.djangoproject.com/en/dev/howto/static-files/). +Allows you to defer loading JavaScript until a component begins rendering. This JavaScript must be stored within [Django's static files](https://docs.djangoproject.com/en/stable/howto/static-files/). - - You can use the `#!python prerender` argument in your [template tag](../reference/template-tag.md#component) to manually override this default. --- diff --git a/docs/src/reference/template-tag.md b/docs/src/reference/template-tag.md index 197a3b29..e5c60a79 100644 --- a/docs/src/reference/template-tag.md +++ b/docs/src/reference/template-tag.md @@ -78,7 +78,7 @@ Each component loaded via this template tag will receive a dedicated WebSocket c

{% component "example_project.my_app.components.my_title" %}

{% component "example_project.my_app_2.components.goodbye_world" class="bold small-font" %}

- {% component "example_project.my_app_3.components.simple_button" %} + {% component "example_project.my_app_3.components.my_button" %} ``` @@ -157,7 +157,7 @@ This template tag can be used to insert any number of **client-side** ReactPy co -By default, the only dependencies available are the Python standard library, `pyscript`, `pyodide`, `reactpy` core. +By default, the only [available dependencies](./template-tag.md#pyscript-setup) are the Python standard library, `pyscript`, `pyodide`, `reactpy` core. The entire file path provided is loaded directly into the browser, and must have a `#!python def root()` component to act as the entry point. @@ -166,9 +166,9 @@ The entire file path provided is loaded directly into the browser, and must have !!! warning "Pitfall" - Your provided Python file is loaded directly into the client (web browser) **as raw text**, and ran using a PyScript interpreter. Be cautious about what you include in your Python file. + Similar to JavaScript, your provided Python file is loaded directly into the client (web browser) **as raw text** to run using the PyScript interpreter. Be cautious about what you include in your Python file. - As a result of running client-side, Python packages within your local environment (such as those installed via `pip install ...`) are **not accessible** within PyScript components. + As a result being client-sided, Python packages within your local environment (such as those installed via `pip install ...`) are **not accessible** within PyScript components. @@ -198,28 +198,40 @@ The entire file path provided is loaded directly into the browser, and must have ??? question "How do I execute JavaScript within PyScript components?" - PyScript components have the ability to directly execute standard library JavaScript using the [`pyodide` `js` module](https://pyodide.org/en/stable/usage/type-conversions.html#importing-javascript-objects-into-python) or [`pyscript` foreign function interface](https://docs.pyscript.net/2024.6.1/user-guide/dom/). + PyScript components several options available to execute JavaScript, including... - The `#!python js` module has access to everything within the browser's JavaScript environment. Therefore, any global JavaScript functions loaded within your HTML `#!html ` can be called as well. However, be mindful of JavaScript load order! + - [Pyodide's `js` module](https://pyodide.org/en/stable/usage/type-conversions.html#importing-javascript-objects-into-python) + - [Pyscript's foreign function interface](https://docs.pyscript.net/latest/user-guide/dom/#ffi) + - [Pyscript's JavaScript modules](https://docs.pyscript.net/latest/user-guide/configuration/#javascript-modules). + + **Pyodide JS Module** + + The Pyodide `#!python js` module has access to everything within the browser's JavaScript environment. Therefore, any global JavaScript functions loaded within your HTML `#!html ` can be called as well. However, you will need to be mindful of JavaScript load order if using [`async` or `deferred`](https://javascript.info/script-async-defer) loading! === "root.py" ```python - {% include "../../examples/python/pyscript-js-execution.py" %} + {% include "../../examples/python/pyodide-js-module.py" %} ``` - To import JavaScript modules in a fashion similar to `#!javascript import {moment} from 'static/moment.js'`, you will need to configure your `#!jinja {% pyscript_setup %}` block to make the module available to PyScript. This module will be accessed within `#!python pyscript.js_modules.*`. For more information, see the [PyScript JS modules docs](https://docs.pyscript.net/2024.6.2/user-guide/configuration/#javascript-modules). + **PyScript FFI** + + ... + + **PyScript JS Modules** + + Assuming you have a local bundle stored within your project's static files, you can import JavaScript modules in a fashion similar to `#!javascript import {moment} from 'static/moment.js'`. You will first need to configure your `#!jinja {% pyscript_setup %}` block to make the `moment.js` module available to PyScript. Then, this module can be accessed within `#!python pyscript.js_modules.*`. === "root.py" ```python - {% include "../../examples/python/pyscript-js-module.py" %} + {% include "../../examples/python/pyscript-local-import.py" %} ``` === "my_template.html" ```jinja - {% include "../../examples/html/pyscript-js-module.html" %} + {% include "../../examples/html/pyscript-local-import.html" %} ``` diff --git a/docs/src/reference/utils.md b/docs/src/reference/utils.md index 5402cc85..917ba959 100644 --- a/docs/src/reference/utils.md +++ b/docs/src/reference/utils.md @@ -36,9 +36,9 @@ It is mandatory to use this function alongside [`view_to_iframe`](../reference/c `#!python None` -??? warning "Only use this within `#!python MyAppConfig.ready()`" +??? warning "Only use this within `#!python AppConfig.ready()`" - You should always call `#!python register_iframe` within a Django [`MyAppConfig.ready()` method](https://docs.djangoproject.com/en/dev/ref/applications/#django.apps.AppConfig.ready). This ensures you will retain multiprocessing compatibility, such as with ASGI web server workers. + You should always call `#!python register_iframe` within a Django [`AppConfig.ready()` method](https://docs.djangoproject.com/en/stable/ref/applications/#django.apps.AppConfig.ready). This ensures you will retain multiprocessing compatibility, such as with ASGI web server workers. --- @@ -68,7 +68,7 @@ Typically, this function is automatically called on all components contained wit ??? warning "Only use this within `#!python MyAppConfig.ready()`" - You should always call `#!python register_component` within a Django [`MyAppConfig.ready()` method](https://docs.djangoproject.com/en/dev/ref/applications/#django.apps.AppConfig.ready). This ensures you will retain multiprocessing compatibility, such as with ASGI web server workers. + You should always call `#!python register_component` within a Django [`MyAppConfig.ready()` method](https://docs.djangoproject.com/en/stable/ref/applications/#django.apps.AppConfig.ready). This ensures you will retain multiprocessing compatibility, such as with ASGI web server workers. ??? question "Do I need to use this?" @@ -84,7 +84,7 @@ Typically, this function is automatically called on all components contained wit This is the default postprocessor for the `#!python use_query` hook. -Since ReactPy is rendered within an `#!python asyncio` loop, this postprocessor is exists to prevent Django's `#!python SynchronousOnlyException` by recursively prefetching fields within a `#!python Model` or `#!python QuerySet`. This prefetching step works to eliminate Django's [lazy execution](https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy) behavior. +Since ReactPy is rendered within an `#!python asyncio` loop, this postprocessor is exists to prevent Django's `#!python SynchronousOnlyException` by recursively prefetching fields within Django's ORM. Note that this effectively eliminates Django's [lazy execution](https://docs.djangoproject.com/en/stable/topics/db/queries/#querysets-are-lazy) behavior. === "components.py" diff --git a/requirements/build-docs.txt b/requirements/build-docs.txt index a7d5b1cf..846a7ba3 100644 --- a/requirements/build-docs.txt +++ b/requirements/build-docs.txt @@ -5,5 +5,4 @@ mkdocs-include-markdown-plugin mkdocs-spellcheck[all] mkdocs-git-authors-plugin mkdocs-minify-plugin -mkdocs-section-index mike diff --git a/requirements/pkg-deps.txt b/requirements/pkg-deps.txt index c6102c18..cec6a9e1 100644 --- a/requirements/pkg-deps.txt +++ b/requirements/pkg-deps.txt @@ -1,8 +1,7 @@ channels >=4.0.0 django >=4.2.0 reactpy >=1.0.2, <1.1.0 -reactpy-router >=0.1.1, <1.0.0 -aiofile >=3.0 +reactpy-router >=1.0.0, <2.0.0 dill >=0.3.5 orjson >=3.6.0 nest_asyncio >=1.5.0 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 3c6e79cf..00000000 --- a/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[bdist_wheel] -universal=1 diff --git a/src/reactpy_django/__init__.py b/src/reactpy_django/__init__.py index d4ece375..77b56743 100644 --- a/src/reactpy_django/__init__.py +++ b/src/reactpy_django/__init__.py @@ -3,7 +3,6 @@ import nest_asyncio from reactpy_django import ( - checks, components, decorators, hooks, @@ -12,14 +11,10 @@ types, utils, ) -from reactpy_django.websocket.paths import ( - REACTPY_WEBSOCKET_PATH, - REACTPY_WEBSOCKET_ROUTE, -) +from reactpy_django.websocket.paths import REACTPY_WEBSOCKET_ROUTE __version__ = "4.0.0" __all__ = [ - "REACTPY_WEBSOCKET_PATH", "REACTPY_WEBSOCKET_ROUTE", "html", "hooks", @@ -27,7 +22,6 @@ "decorators", "types", "utils", - "checks", "router", ] diff --git a/src/reactpy_django/checks.py b/src/reactpy_django/checks.py index d836a9ca..740df974 100644 --- a/src/reactpy_django/checks.py +++ b/src/reactpy_django/checks.py @@ -19,7 +19,7 @@ def reactpy_warnings(app_configs, **kwargs): warnings = [] INSTALLED_APPS: list[str] = getattr(settings, "INSTALLED_APPS", []) - # REACTPY_DATABASE is not an in-memory database. + # Check if REACTPY_DATABASE is not an in-memory database. if ( getattr(settings, "DATABASES", {}) .get(getattr(settings, "REACTPY_DATABASE", "default"), {}) @@ -36,7 +36,7 @@ def reactpy_warnings(app_configs, **kwargs): ) ) - # ReactPy URLs exist + # Check if ReactPy URLs are reachable try: reverse("reactpy:web_modules", kwargs={"file": "example"}) reverse("reactpy:view_to_iframe", kwargs={"dotted_path": "example"}) @@ -102,16 +102,7 @@ def reactpy_warnings(app_configs, **kwargs): # DELETED W007: Check if REACTPY_WEBSOCKET_URL doesn't end with a slash # DELETED W008: Check if REACTPY_WEBSOCKET_URL doesn't start with an alphanumeric character - - # Removed REACTPY_WEBSOCKET_URL setting - if getattr(settings, "REACTPY_WEBSOCKET_URL", None): - warnings.append( - Warning( - "REACTPY_WEBSOCKET_URL has been removed.", - hint="Use REACTPY_URL_PREFIX instead.", - id="reactpy_django.W009", - ) - ) + # DELETED W009: Check if deprecated value REACTPY_WEBSOCKET_URL exists # Check if REACTPY_URL_PREFIX is being used properly in our HTTP URLs with contextlib.suppress(NoReverseMatch): @@ -152,22 +143,16 @@ def reactpy_warnings(app_configs, **kwargs): ): warnings.append( Warning( - "You have not configured runserver to use ASGI.", + "You have not configured the `runserver` command to use ASGI. " + "ReactPy will work properly in this configuration.", hint="Add daphne to settings.py:INSTALLED_APPS.", id="reactpy_django.W012", ) ) - # Removed REACTPY_RECONNECT_MAX setting - if getattr(settings, "REACTPY_RECONNECT_MAX", None): - warnings.append( - Warning( - "REACTPY_RECONNECT_MAX has been removed.", - hint="See the docs for the new REACTPY_RECONNECT_* settings.", - id="reactpy_django.W013", - ) - ) + # DELETED W013: Check if deprecated value REACTPY_RECONNECT_MAX exists + # Check if REACTPY_RECONNECT_INTERVAL is set to a large value if ( isinstance(config.REACTPY_RECONNECT_INTERVAL, int) and config.REACTPY_RECONNECT_INTERVAL > 30000 @@ -181,20 +166,22 @@ def reactpy_warnings(app_configs, **kwargs): ) ) + # Check if REACTPY_RECONNECT_MAX_RETRIES is set to a large value if ( isinstance(config.REACTPY_RECONNECT_MAX_RETRIES, int) and config.REACTPY_RECONNECT_MAX_RETRIES > 5000 ): warnings.append( Warning( - "REACTPY_RECONNECT_MAX_RETRIES is set to a very large value. Are you sure this is intentional? " + "REACTPY_RECONNECT_MAX_RETRIES is set to a very large value " + f"{config.REACTPY_RECONNECT_MAX_RETRIES}. Are you sure this is intentional? " "This may leave your clients attempting reconnections for a long time.", hint="Check your value for REACTPY_RECONNECT_MAX_RETRIES or suppress this warning.", id="reactpy_django.W015", ) ) - # Check if the value is too large (greater than 50) + # Check if the REACTPY_RECONNECT_BACKOFF_MULTIPLIER is set to a large value if ( isinstance(config.REACTPY_RECONNECT_BACKOFF_MULTIPLIER, (int, float)) and config.REACTPY_RECONNECT_BACKOFF_MULTIPLIER > 100 @@ -207,6 +194,7 @@ def reactpy_warnings(app_configs, **kwargs): ) ) + # Check if REACTPY_RECONNECT_MAX_INTERVAL is reachable if ( isinstance(config.REACTPY_RECONNECT_MAX_INTERVAL, int) and isinstance(config.REACTPY_RECONNECT_INTERVAL, int) @@ -239,6 +227,7 @@ def reactpy_warnings(app_configs, **kwargs): ) ) + # Check if 'reactpy_django' is in the correct position in INSTALLED_APPS position_to_beat = 0 for app in INSTALLED_APPS: if app.startswith("django.contrib."): @@ -255,6 +244,7 @@ def reactpy_warnings(app_configs, **kwargs): ) ) + # Check if REACTPY_CLEAN_SESSION is not a valid property if getattr(settings, "REACTPY_CLEAN_SESSION", None): warnings.append( Warning( @@ -301,7 +291,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) - # All settings in reactpy_django.conf are the correct data type + # Check if REACTPY_URL_PREFIX is a valid data type if not isinstance(getattr(settings, "REACTPY_URL_PREFIX", ""), str): errors.append( Error( @@ -311,6 +301,8 @@ def reactpy_errors(app_configs, **kwargs): id="reactpy_django.E003", ) ) + + # Check if REACTPY_SESSION_MAX_AGE is a valid data type if not isinstance(getattr(settings, "REACTPY_SESSION_MAX_AGE", 0), int): errors.append( Error( @@ -320,6 +312,8 @@ def reactpy_errors(app_configs, **kwargs): id="reactpy_django.E004", ) ) + + # Check if REACTPY_CACHE is a valid data type if not isinstance(getattr(settings, "REACTPY_CACHE", ""), str): errors.append( Error( @@ -329,6 +323,8 @@ def reactpy_errors(app_configs, **kwargs): id="reactpy_django.E005", ) ) + + # Check if REACTPY_DATABASE is a valid data type if not isinstance(getattr(settings, "REACTPY_DATABASE", ""), str): errors.append( Error( @@ -338,6 +334,8 @@ def reactpy_errors(app_configs, **kwargs): id="reactpy_django.E006", ) ) + + # Check if REACTPY_DEFAULT_QUERY_POSTPROCESSOR is a valid data type if not isinstance( getattr(settings, "REACTPY_DEFAULT_QUERY_POSTPROCESSOR", ""), (str, type(None)) ): @@ -349,6 +347,8 @@ def reactpy_errors(app_configs, **kwargs): id="reactpy_django.E007", ) ) + + # Check if REACTPY_AUTH_BACKEND is a valid data type if not isinstance(getattr(settings, "REACTPY_AUTH_BACKEND", ""), str): errors.append( Error( @@ -361,6 +361,7 @@ def reactpy_errors(app_configs, **kwargs): # DELETED E009: Check if `channels` is in INSTALLED_APPS + # Check if REACTPY_DEFAULT_HOSTS is a valid data type if not isinstance(getattr(settings, "REACTPY_DEFAULT_HOSTS", []), list): errors.append( Error( @@ -371,7 +372,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) - # Check of all values in the list are strings + # Check of all values in the REACTPY_DEFAULT_HOSTS are strings if isinstance(getattr(settings, "REACTPY_DEFAULT_HOSTS", None), list): for host in settings.REACTPY_DEFAULT_HOSTS: if not isinstance(host, str): @@ -385,6 +386,7 @@ def reactpy_errors(app_configs, **kwargs): ) break + # Check if REACTPY_RECONNECT_INTERVAL is a valid data type if not isinstance(config.REACTPY_RECONNECT_INTERVAL, int): errors.append( Error( @@ -394,6 +396,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_RECONNECT_INTERVAL is a positive integer if ( isinstance(config.REACTPY_RECONNECT_INTERVAL, int) and config.REACTPY_RECONNECT_INTERVAL < 0 @@ -406,6 +409,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_RECONNECT_MAX_INTERVAL is a valid data type if not isinstance(config.REACTPY_RECONNECT_MAX_INTERVAL, int): errors.append( Error( @@ -415,6 +419,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_RECONNECT_MAX_INTERVAL is a positive integer if ( isinstance(config.REACTPY_RECONNECT_MAX_INTERVAL, int) and config.REACTPY_RECONNECT_MAX_INTERVAL < 0 @@ -427,6 +432,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_RECONNECT_MAX_INTERVAL is greater than REACTPY_RECONNECT_INTERVAL if ( isinstance(config.REACTPY_RECONNECT_MAX_INTERVAL, int) and isinstance(config.REACTPY_RECONNECT_INTERVAL, int) @@ -440,6 +446,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_RECONNECT_MAX_RETRIES is a valid data type if not isinstance(config.REACTPY_RECONNECT_MAX_RETRIES, int): errors.append( Error( @@ -449,6 +456,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_RECONNECT_MAX_RETRIES is a positive integer if ( isinstance(config.REACTPY_RECONNECT_MAX_RETRIES, int) and config.REACTPY_RECONNECT_MAX_RETRIES < 0 @@ -461,6 +469,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_RECONNECT_BACKOFF_MULTIPLIER is a valid data type if not isinstance(config.REACTPY_RECONNECT_BACKOFF_MULTIPLIER, (int, float)): errors.append( Error( @@ -470,6 +479,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_RECONNECT_BACKOFF_MULTIPLIER is greater than or equal to 1 if ( isinstance(config.REACTPY_RECONNECT_BACKOFF_MULTIPLIER, (int, float)) and config.REACTPY_RECONNECT_BACKOFF_MULTIPLIER < 1 @@ -482,6 +492,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_PRERENDER is a valid data type if not isinstance(config.REACTPY_PRERENDER, bool): errors.append( Error( @@ -491,6 +502,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_AUTO_RELOGIN is a valid data type if not isinstance(config.REACTPY_AUTO_RELOGIN, bool): errors.append( Error( @@ -500,6 +512,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_CLEAN_INTERVAL is a valid data type if not isinstance(config.REACTPY_CLEAN_INTERVAL, (int, type(None))): errors.append( Error( @@ -509,6 +522,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_CLEAN_INTERVAL is a positive integer if ( isinstance(config.REACTPY_CLEAN_INTERVAL, int) and config.REACTPY_CLEAN_INTERVAL < 0 @@ -521,6 +535,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_CLEAN_SESSIONS is a valid data type if not isinstance(config.REACTPY_CLEAN_SESSIONS, bool): errors.append( Error( @@ -530,6 +545,7 @@ def reactpy_errors(app_configs, **kwargs): ) ) + # Check if REACTPY_CLEAN_USER_DATA is a valid data type if not isinstance(config.REACTPY_CLEAN_USER_DATA, bool): errors.append( Error( diff --git a/src/reactpy_django/components.py b/src/reactpy_django/components.py index 579c73e3..3794ba73 100644 --- a/src/reactpy_django/components.py +++ b/src/reactpy_django/components.py @@ -2,10 +2,9 @@ import json import os -from typing import Any, Callable, Sequence, Union, cast, overload +from typing import Any, Callable, Sequence, Union, cast from urllib.parse import urlencode from uuid import uuid4 -from warnings import warn from django.contrib.staticfiles.finders import find from django.core.cache import caches @@ -26,40 +25,15 @@ ) -# Type hints for: -# 1. example = view_to_component(my_view, ...) -# 2. @view_to_component -@overload def view_to_component( view: Callable | View | str, - compatibility: bool = False, transforms: Sequence[Callable[[VdomDict], Any]] = (), strict_parsing: bool = True, -) -> Any: ... - - -# Type hints for: -# 1. @view_to_component(...) -@overload -def view_to_component( - view: None = ..., - compatibility: bool = False, - transforms: Sequence[Callable[[VdomDict], Any]] = (), - strict_parsing: bool = True, -) -> Callable[[Callable], Any]: ... - - -def view_to_component( - view: Callable | View | str | None = None, - compatibility: bool = False, - transforms: Sequence[Callable[[VdomDict], Any]] = (), - strict_parsing: bool = True, -) -> Any | Callable[[Callable], Any]: +) -> Any: """Converts a Django view to a ReactPy component. Keyword Args: view: The view to convert, or the view's dotted path as a string. - compatibility: **DEPRECATED.** Use `view_to_iframe` instead. transforms: A list of functions that transforms the newly generated VDOM. \ The functions will be called on each VDOM node. strict_parsing: If True, an exception will be generated if the HTML does not \ @@ -69,37 +43,23 @@ def view_to_component( A function that takes `request, *args, key, **kwargs` and returns a ReactPy component. """ - def decorator(view: Callable | View | str): - if not view: - raise ValueError("A view must be provided to `view_to_component`") - - def constructor( - request: HttpRequest | None = None, - *args, - key: Key | None = None, - **kwargs, - ): - return _view_to_component( - view=view, - compatibility=compatibility, - transforms=transforms, - strict_parsing=strict_parsing, - request=request, - args=args, - kwargs=kwargs, - key=key, - ) - - return constructor - - if not view: - warn( - "Using `view_to_component` as a decorator is deprecated. " - "This functionality will be removed in a future version.", - DeprecationWarning, + def constructor( + request: HttpRequest | None = None, + *args, + key: Key | None = None, + **kwargs, + ): + return _view_to_component( + view=view, + transforms=transforms, + strict_parsing=strict_parsing, + request=request, + args=args, + kwargs=kwargs, + key=key, ) - return decorator(view) if view else decorator + return constructor def view_to_iframe( @@ -180,7 +140,6 @@ def pyscript_component( @component def _view_to_component( view: Callable | View | str, - compatibility: bool, transforms: Sequence[Callable[[VdomDict], Any]], strict_parsing: bool, request: HttpRequest | None, @@ -209,10 +168,6 @@ def _view_to_component( ) async def async_render(): """Render the view in an async hook to avoid blocking the main thread.""" - # Compatibility mode doesn't require a traditional render - if compatibility: - return - # Render the view response = await render_view(resolved_view, _request, _args, _kwargs) set_converted_view( @@ -224,17 +179,6 @@ async def async_render(): ) ) - # Render in compatibility mode, if needed - if compatibility: - # Warn the user that compatibility mode is deprecated - warn( - "view_to_component(compatibility=True) is deprecated and will be removed in a future version. " - "Please use `view_to_iframe` instead.", - DeprecationWarning, - ) - - return view_to_iframe(resolved_view)(*_args, **_kwargs) - # Return the view if it's been rendered via the `async_render` hook return converted_view diff --git a/src/reactpy_django/config.py b/src/reactpy_django/config.py index 21a30a32..a891cb5d 100644 --- a/src/reactpy_django/config.py +++ b/src/reactpy_django/config.py @@ -23,19 +23,11 @@ REACTPY_FAILED_COMPONENTS: set[str] = set() REACTPY_REGISTERED_IFRAME_VIEWS: dict[str, Callable | View] = {} - -# Remove in a future release -REACTPY_WEBSOCKET_URL = getattr( - settings, - "REACTPY_WEBSOCKET_URL", - "reactpy/", -) - # Configurable through Django settings.py REACTPY_URL_PREFIX: str = getattr( settings, "REACTPY_URL_PREFIX", - REACTPY_WEBSOCKET_URL, + "reactpy/", ).strip("/") REACTPY_SESSION_MAX_AGE: int = getattr( settings, diff --git a/src/reactpy_django/database.py b/src/reactpy_django/database.py index 2a7f826d..0d0b2065 100644 --- a/src/reactpy_django/database.py +++ b/src/reactpy_django/database.py @@ -21,7 +21,7 @@ def db_for_write(self, model, **hints): def allow_relation(self, obj1, obj2, **hints): """Returning `None` only allow relations within the same database. - https://docs.djangoproject.com/en/dev/topics/db/multi-db/#limitations-of-multiple-databases + https://docs.djangoproject.com/en/stable/topics/db/multi-db/#limitations-of-multiple-databases """ return None diff --git a/src/reactpy_django/decorators.py b/src/reactpy_django/decorators.py index 59c110b3..39a028a4 100644 --- a/src/reactpy_django/decorators.py +++ b/src/reactpy_django/decorators.py @@ -2,53 +2,17 @@ from functools import wraps from typing import TYPE_CHECKING, Any, Callable -from warnings import warn from reactpy import component -from reactpy.core.types import ComponentConstructor, ComponentType, VdomDict +from reactpy.core.types import ComponentConstructor from reactpy_django.exceptions import DecoratorParamError -from reactpy_django.hooks import use_scope, use_user +from reactpy_django.hooks import use_user if TYPE_CHECKING: from django.contrib.auth.models import AbstractUser -def auth_required( - component: Callable | None = None, - auth_attribute: str = "is_active", - fallback: ComponentType | Callable | VdomDict | None = None, -) -> Callable: - """If the user passes authentication criteria, the decorated component will be rendered. - Otherwise, the fallback component will be rendered. - - This decorator can be used with or without parentheses. - - Args: - auth_attribute: The value to check within the user object. \ - This is checked in the form of `UserModel.`. \ - fallback: The component or VDOM (`reactpy.html` snippet) to render if the user is not authenticated. - """ - - warn( - "auth_required is deprecated and will be removed in the next major version. " - "An equivalent to this decorator's default is @user_passes_test(lambda user: user.is_active).", - DeprecationWarning, - ) - - def decorator(component): - @wraps(component) - def _wrapped_func(*args, **kwargs): - scope = use_scope() - - if getattr(scope["user"], auth_attribute): - return component(*args, **kwargs) - return fallback(*args, **kwargs) if callable(fallback) else fallback - - return _wrapped_func - - # Return for @authenticated(...) and @authenticated respectively - return decorator if component is None else decorator(component) def user_passes_test( diff --git a/src/reactpy_django/http/views.py b/src/reactpy_django/http/views.py index 983c8361..522d3dcf 100644 --- a/src/reactpy_django/http/views.py +++ b/src/reactpy_django/http/views.py @@ -1,7 +1,7 @@ +import asyncio import os from urllib.parse import parse_qs -from aiofile import async_open from django.core.cache import caches from django.core.exceptions import SuspiciousOperation from django.http import HttpRequest, HttpResponse, HttpResponseNotFound @@ -31,8 +31,8 @@ async def web_modules_file(request: HttpRequest, file: str) -> HttpResponse: cache_key, version=int(last_modified_time) ) if file_contents is None: - async with async_open(path, "r") as fp: - file_contents = await fp.read() + with open(path, "r", encoding="utf-8") as fp: + file_contents = await asyncio.to_thread(fp.read) await caches[REACTPY_CACHE].adelete(cache_key) await caches[REACTPY_CACHE].aset( cache_key, file_contents, timeout=604800, version=int(last_modified_time) diff --git a/src/reactpy_django/router/__init__.py b/src/reactpy_django/router/__init__.py index 3c48e1ab..4c9c0efd 100644 --- a/src/reactpy_django/router/__init__.py +++ b/src/reactpy_django/router/__init__.py @@ -1,4 +1,4 @@ -from reactpy_router.core import create_router +from reactpy_router import create_router from reactpy_django.router.resolvers import DjangoResolver diff --git a/src/reactpy_django/router/converters.py b/src/reactpy_django/router/converters.py index 3611f63e..483dbcbb 100644 --- a/src/reactpy_django/router/converters.py +++ b/src/reactpy_django/router/converters.py @@ -1,7 +1,8 @@ from django.urls.converters import get_converters -from reactpy_router.simple import ConversionInfo +from reactpy_router.types import ConversionInfo CONVERTERS: dict[str, ConversionInfo] = { name: {"regex": converter.regex, "func": converter.to_python} for name, converter in get_converters().items() } +CONVERTERS["any"] = {"regex": r".*", "func": str} diff --git a/src/reactpy_django/router/resolvers.py b/src/reactpy_django/router/resolvers.py index 7c095081..4568786c 100644 --- a/src/reactpy_django/router/resolvers.py +++ b/src/reactpy_django/router/resolvers.py @@ -1,58 +1,22 @@ from __future__ import annotations -import re -from typing import Any - -from reactpy_router.simple import ConverterMapping -from reactpy_router.types import Route +from reactpy_router.resolvers import StarletteResolver +from reactpy_router.types import ConversionInfo, Route from reactpy_django.router.converters import CONVERTERS -PARAM_PATTERN = re.compile(r"<(?P\w+:)?(?P\w+)>") - -# TODO: Make reactpy_router's SimpleResolver generic enough to where we don't have to define our own -class DjangoResolver: +class DjangoResolver(StarletteResolver): """A simple route resolver that uses regex to match paths""" - def __init__(self, route: Route) -> None: - self.element = route.element - self.pattern, self.converters = parse_path(route.path) - self.key = self.pattern.pattern - - def resolve(self, path: str) -> tuple[Any, dict[str, Any]] | None: - match = self.pattern.match(path) - if match: - return ( - self.element, - {k: self.converters[k](v) for k, v in match.groupdict().items()}, - ) - return None - - -# TODO: Make reactpy_router's parse_path generic enough to where we don't have to define our own -def parse_path(path: str) -> tuple[re.Pattern[str], ConverterMapping]: - # Convert path to regex pattern, and make sure to interpret the registered converters (ex. ) - pattern = "^" - last_match_end = 0 - converters: ConverterMapping = {} - for match in PARAM_PATTERN.finditer(path): - param_name = match.group("name") - param_type = (match.group("type") or "str").strip(":") - try: - param_conv = CONVERTERS[param_type] - except KeyError as e: - raise ValueError( - f"Unknown conversion type {param_type!r} in {path!r}" - ) from e - pattern += re.escape(path[last_match_end : match.start()]) - pattern += f"(?P<{param_name}>{param_conv['regex']})" - converters[param_name] = param_conv["func"] - last_match_end = match.end() - pattern += f"{re.escape(path[last_match_end:])}$" - - # Replace literal `*` with "match anything" regex pattern, if it's at the end of the path - if pattern.endswith(r"\*$"): - pattern = f"{pattern[:-3]}.*$" - - return re.compile(pattern), converters + def __init__( + self, + route: Route, + param_pattern=r"<(?P\w+:)?(?P\w+)>", + converters: dict[str, ConversionInfo] | None = None, + ) -> None: + super().__init__( + route=route, + param_pattern=param_pattern, + converters=converters or CONVERTERS, + ) diff --git a/src/reactpy_django/websocket/paths.py b/src/reactpy_django/websocket/paths.py index 17a9c48e..435f9b71 100644 --- a/src/reactpy_django/websocket/paths.py +++ b/src/reactpy_django/websocket/paths.py @@ -10,8 +10,6 @@ ) """A URL path for :class:`ReactpyAsyncWebsocketConsumer`. -Required since the `reverse()` function does not exist for Django Channels, but we need -to know the websocket path. +Required since the `reverse()` function does not exist for Django Channels, but ReactPy needs +to know the current websocket path. """ - -REACTPY_WEBSOCKET_PATH = REACTPY_WEBSOCKET_ROUTE diff --git a/tests/test_app/apps.py b/tests/test_app/apps.py index a5bad495..2bef8446 100644 --- a/tests/test_app/apps.py +++ b/tests/test_app/apps.py @@ -2,8 +2,8 @@ import sys from django.apps import AppConfig -from reactpy_django.utils import register_iframe +from reactpy_django.utils import register_iframe from test_app import views @@ -13,11 +13,11 @@ class TestAppConfig(AppConfig): def ready(self): from django.contrib.auth.models import User - register_iframe("test_app.views.view_to_component_sync_func_compatibility") - register_iframe(views.view_to_component_async_func_compatibility) - register_iframe(views.ViewToComponentSyncClassCompatibility) - register_iframe(views.ViewToComponentAsyncClassCompatibility) - register_iframe(views.ViewToComponentTemplateViewClassCompatibility) + register_iframe("test_app.views.view_to_iframe_sync_func") + register_iframe(views.view_to_iframe_async_func) + register_iframe(views.ViewToIframeSyncClass) + register_iframe(views.ViewToIframeAsyncClass) + register_iframe(views.ViewToIframeTemplateViewClass) register_iframe(views.view_to_iframe_args) if "test" in sys.argv: diff --git a/tests/test_app/components.py b/tests/test_app/components.py index 69b1541c..4ae0544e 100644 --- a/tests/test_app/components.py +++ b/tests/test_app/components.py @@ -2,15 +2,14 @@ import inspect from pathlib import Path -import reactpy_django from channels.auth import login, logout from channels.db import database_sync_to_async from django.contrib.auth import get_user_model from django.http import HttpRequest -from django.shortcuts import render from reactpy import component, hooks, html, web -from reactpy_django.components import view_to_component, view_to_iframe +import reactpy_django +from reactpy_django.components import view_to_component, view_to_iframe from test_app.models import ( AsyncForiegnChild, AsyncRelationalChild, @@ -72,7 +71,7 @@ def object_in_templatetag(my_object: TestObject): SimpleButtonModule = web.module_from_file( "SimpleButton", - Path(__file__).parent / "tests" / "js" / "simple-button.js", + Path(__file__).parent / "tests" / "js" / "button-from-js-module.js", resolve_exports=False, fallback="...", ) @@ -80,8 +79,10 @@ def object_in_templatetag(my_object: TestObject): @component -def simple_button(): - return html._("simple_button:", SimpleButton({"id": "simple-button"})) +def button_from_js_module(): + return html._( + "button_from_js_module:", SimpleButton({"id": "button-from-js-module"}) + ) @component @@ -146,45 +147,24 @@ def django_js(): ) -@component -@reactpy_django.decorators.auth_required( - fallback=html.div( - {"id": "unauthorized-user-fallback"}, "unauthorized_user: Success" - ) -) -def unauthorized_user(): - return html.div({"id": "unauthorized-user"}, "unauthorized_user: Fail") - - -@component -@reactpy_django.decorators.auth_required( - auth_attribute="is_anonymous", - fallback=html.div({"id": "authorized-user-fallback"}, "authorized_user: Fail"), -) -def authorized_user(): - return html.div({"id": "authorized-user"}, "authorized_user: Success") - - @reactpy_django.decorators.user_passes_test( lambda user: user.is_anonymous, - fallback=html.div( - {"id": "authorized-user-test-fallback"}, "authorized_user_test: Fail" - ), + fallback=html.div({"id": "authorized-user-fallback"}, "authorized_user: Fail"), ) @component -def authorized_user_test(): - return html.div({"id": "authorized-user-test"}, "authorized_user_test: Success") +def authorized_user(): + return html.div({"id": "authorized-user"}, "authorized_user: Success") @reactpy_django.decorators.user_passes_test( lambda user: user.is_active, fallback=html.div( - {"id": "unauthorized-user-test-fallback"}, "unauthorized_user_test: Success" + {"id": "unauthorized-user-fallback"}, "unauthorized_user: Success" ), ) @component -def unauthorized_user_test(): - return html.div({"id": "unauthorized-user-test"}, "unauthorized_user_test: Fail") +def unauthorized_user(): + return html.div({"id": "unauthorized-user"}, "unauthorized_user: Fail") @reactpy_django.decorators.user_passes_test(lambda user: True) @@ -485,20 +465,12 @@ async def on_change(event): view_to_component_template_view_class = view_to_component( views.ViewToComponentTemplateViewClass.as_view() ) -_view_to_component_sync_func_compatibility = view_to_component( - views.view_to_component_sync_func_compatibility, compatibility=True -) -_view_to_component_async_func_compatibility = view_to_component( - views.view_to_component_async_func_compatibility, compatibility=True -) -_view_to_component_sync_class_compatibility = view_to_component( - views.ViewToComponentSyncClassCompatibility.as_view(), compatibility=True -) -_view_to_component_async_class_compatibility = view_to_component( - views.ViewToComponentAsyncClassCompatibility.as_view(), compatibility=True -) -_view_to_component_template_view_class_compatibility = view_to_component( - views.ViewToComponentTemplateViewClassCompatibility.as_view(), compatibility=True +_view_to_iframe_sync_func = view_to_iframe(views.view_to_iframe_sync_func) +_view_to_iframe_async_func = view_to_iframe(views.view_to_iframe_async_func) +_view_to_iframe_sync_class = view_to_iframe(views.ViewToIframeSyncClass.as_view()) +_view_to_iframe_async_class = view_to_iframe(views.ViewToIframeAsyncClass.as_view()) +_view_to_iframe_template_view_class = view_to_iframe( + views.ViewToIframeTemplateViewClass.as_view() ) _view_to_iframe_args = view_to_iframe(views.view_to_iframe_args) _view_to_iframe_not_registered = view_to_iframe("view_does_not_exist") @@ -509,42 +481,42 @@ async def on_change(event): @component -def view_to_component_sync_func_compatibility(): +def view_to_iframe_sync_func(): return html.div( {"id": inspect.currentframe().f_code.co_name}, # type: ignore - _view_to_component_sync_func_compatibility(key="test"), + _view_to_iframe_sync_func(key="test"), ) @component -def view_to_component_async_func_compatibility(): +def view_to_iframe_async_func(): return html.div( {"id": inspect.currentframe().f_code.co_name}, # type: ignore - _view_to_component_async_func_compatibility(), + _view_to_iframe_async_func(), ) @component -def view_to_component_sync_class_compatibility(): +def view_to_iframe_sync_class(): return html.div( {"id": inspect.currentframe().f_code.co_name}, # type: ignore - _view_to_component_sync_class_compatibility(), + _view_to_iframe_sync_class(), ) @component -def view_to_component_async_class_compatibility(): +def view_to_iframe_async_class(): return html.div( {"id": inspect.currentframe().f_code.co_name}, # type: ignore - _view_to_component_async_class_compatibility(), + _view_to_iframe_async_class(), ) @component -def view_to_component_template_view_class_compatibility(): +def view_to_iframe_template_view_class(): return html.div( {"id": inspect.currentframe().f_code.co_name}, # type: ignore - _view_to_component_template_view_class_compatibility(), + _view_to_iframe_template_view_class(), ) @@ -623,24 +595,6 @@ def on_click(_): ) -@view_to_component -def view_to_component_decorator(request): - return render( - request, - "view_to_component.html", - {"test_name": inspect.currentframe().f_code.co_name}, # type: ignore - ) - - -@view_to_component(strict_parsing=False) -def view_to_component_decorator_args(request): - return render( - request, - "view_to_component.html", - {"test_name": inspect.currentframe().f_code.co_name}, # type: ignore - ) - - @component def custom_host(number=0): scope = reactpy_django.hooks.use_scope() diff --git a/tests/test_app/router/components.py b/tests/test_app/router/components.py index 19eee0ba..ea95c5f2 100644 --- a/tests/test_app/router/components.py +++ b/tests/test_app/router/components.py @@ -1,45 +1,42 @@ from reactpy import component, html, use_location +from reactpy_router import route, use_params, use_search_params +from reactpy_router.types import Route + from reactpy_django.router import django_router -from reactpy_router import route, use_params, use_query @component def display_params(string: str): location = use_location() - query = use_query() - params = use_params() + search_params = use_search_params() + url_params = use_params() return html._( html.div({"id": "router-string"}, string), - html.div(f"Params: {params}"), html.div( {"id": "router-path", "data-path": location.pathname}, - f"Path Name: {location.pathname}", + f"path: {location.pathname}", ), - html.div(f"Query String: {location.search}"), - html.div(f"Query: {query}"), + html.div(f"url_params: {url_params}"), + html.div(f"location.search: {location.search}"), + html.div(f"search_params: {search_params}"), ) +def show_route(path: str, *children: Route) -> Route: + return route(path, display_params(path), *children) + + @component def main(): return django_router( - route("/router/", display_params("Path 1")), - route("/router/any//", display_params("Path 2")), - route("/router/integer//", display_params("Path 3")), - route("/router/path//", display_params("Path 4")), - route("/router/slug//", display_params("Path 5")), - route("/router/string//", display_params("Path 6")), - route("/router/uuid//", display_params("Path 7")), - route("/router/", None, route("abc/", display_params("Path 8"))), - route( - "/router/two///", - display_params("Path 9"), - ), - route( - "/router/star/", - None, - route("one/", display_params("Path 11")), - route("*", display_params("Path 12")), - ), + show_route("/router/", show_route("subroute/")), + show_route("/router/unspecified//"), + show_route("/router/integer//"), + show_route("/router/path//"), + show_route("/router/slug//"), + show_route("/router/string//"), + show_route("/router/uuid//"), + show_route("/router/any/"), + show_route("/router/two///"), ) diff --git a/tests/test_app/router/urls.py b/tests/test_app/router/urls.py index b497b951..73b60990 100644 --- a/tests/test_app/router/urls.py +++ b/tests/test_app/router/urls.py @@ -3,5 +3,5 @@ from test_app.router.views import router urlpatterns = [ - re_path(r"^router/(?P.*)/?$", router), + re_path(r"^router/(?P.*)$", router), ] diff --git a/tests/test_app/templates/base.html b/tests/test_app/templates/base.html index f15094ac..117e867d 100644 --- a/tests/test_app/templates/base.html +++ b/tests/test_app/templates/base.html @@ -27,7 +27,7 @@

ReactPy Test Page


{% component "test_app.components.object_in_templatetag" my_object %}
- {% component "test_app.components.simple_button" %} + {% component "test_app.components.button_from_js_module" %}
{% component "test_app.components.use_connection" %}
@@ -45,10 +45,6 @@

ReactPy Test Page


{% component "test_app.components.authorized_user" %}
- {% component "test_app.components.unauthorized_user_test" %} -
- {% component "test_app.components.authorized_user_test" %} -
{% component "test_app.components.relational_query" %}
{% component "test_app.components.async_relational_query" %} @@ -75,19 +71,15 @@

ReactPy Test Page


{% component "test_app.components.view_to_component_kwargs" %}
- {% component "test_app.components.view_to_component_decorator" %} -
- {% component "test_app.components.view_to_component_decorator_args" %} -
- {% component "test_app.components.view_to_component_sync_func_compatibility" %} + {% component "test_app.components.view_to_iframe_sync_func" %}
- {% component "test_app.components.view_to_component_async_func_compatibility" %} + {% component "test_app.components.view_to_iframe_async_func" %}
- {% component "test_app.components.view_to_component_sync_class_compatibility" %} + {% component "test_app.components.view_to_iframe_sync_class" %}
- {% component "test_app.components.view_to_component_async_class_compatibility" %} + {% component "test_app.components.view_to_iframe_async_class" %}
- {% component "test_app.components.view_to_component_template_view_class_compatibility" %} + {% component "test_app.components.view_to_iframe_template_view_class" %}
{% component "test_app.components.view_to_iframe_args" %}
diff --git a/tests/test_app/tests/js/simple-button.js b/tests/test_app/tests/js/button-from-js-module.js similarity index 100% rename from tests/test_app/tests/js/simple-button.js rename to tests/test_app/tests/js/button-from-js-module.js diff --git a/tests/test_app/tests/test_components.py b/tests/test_app/tests/test_components.py index 11fdc390..f3726a4c 100644 --- a/tests/test_app/tests/test_components.py +++ b/tests/test_app/tests/test_components.py @@ -12,6 +12,7 @@ from django.db import connections from django.test.utils import modify_settings from playwright.sync_api import TimeoutError, sync_playwright + from reactpy_django.models import ComponentSession from reactpy_django.utils import strtobool @@ -21,6 +22,7 @@ class ComponentTests(ChannelsLiveServerTestCase): from django.db import DEFAULT_DB_ALIAS + from reactpy_django import config databases = {"default"} @@ -65,6 +67,7 @@ def setUpClass(cls): headless = strtobool(os.environ.get("PLAYWRIGHT_HEADLESS", GITHUB_ACTIONS)) cls.browser = cls.playwright.chromium.launch(headless=bool(headless)) cls.page = cls.browser.new_page() + cls.page.set_default_timeout(5000) @classmethod def tearDownClass(cls): @@ -74,14 +77,14 @@ def tearDownClass(cls): cls.playwright.stop() # Close the other server processes + cls._server_process.terminate() + cls._server_process.join() cls._server_process2.terminate() cls._server_process2.join() cls._server_process3.terminate() cls._server_process3.join() # Repurposed from ChannelsLiveServerTestCase._post_teardown - cls._server_process.terminate() - cls._server_process.join() cls._live_server_modified_settings.disable() for db_name in {"default", config.REACTPY_DATABASE}: call_command( @@ -94,13 +97,11 @@ def tearDownClass(cls): def _pre_setup(self): """Handled manually in `setUpClass` to speed things up.""" - pass def _post_teardown(self): """Handled manually in `tearDownClass` to prevent TransactionTestCase from doing database flushing. This is needed to prevent a `SynchronousOnlyOperation` from occuring due to a bug within `ChannelsLiveServerTestCase`.""" - pass def setUp(self): if self.page.url == "about:blank": @@ -121,7 +122,7 @@ def test_object_in_templatetag(self): self.page.locator("#object_in_templatetag[data-success=true]").wait_for() def test_component_from_web_module(self): - self.page.wait_for_selector("#simple-button") + self.page.wait_for_selector("#button-from-js-module") def test_use_connection(self): self.page.locator("#use-connection[data-success=true]").wait_for() @@ -164,24 +165,6 @@ def test_authorized_user(self): ) self.page.wait_for_selector("#authorized-user") - def test_unauthorized_user_test(self): - self.assertRaises( - TimeoutError, - self.page.wait_for_selector, - "#unauthorized-user-test", - timeout=1, - ) - self.page.wait_for_selector("#unauthorized-user-test-fallback") - - def test_authorized_user_test(self): - self.assertRaises( - TimeoutError, - self.page.wait_for_selector, - "#authorized-user-test-fallback", - timeout=1, - ) - self.page.wait_for_selector("#authorized-user-test") - def test_relational_query(self): self.page.locator("#relational-query[data-success=true]").wait_for() @@ -260,39 +243,29 @@ def test_view_to_component_args(self): def test_view_to_component_kwargs(self): self._click_btn_and_check_success("view_to_component_kwargs") - def test_view_to_component_sync_func_compatibility(self): - self.page.frame_locator( - "#view_to_component_sync_func_compatibility > iframe" - ).locator( - "#view_to_component_sync_func_compatibility[data-success=true]" + def test_view_to_iframe_sync_func(self): + self.page.frame_locator("#view_to_iframe_sync_func > iframe").locator( + "#view_to_iframe_sync_func[data-success=true]" ).wait_for() - def test_view_to_component_async_func_compatibility(self): - self.page.frame_locator( - "#view_to_component_async_func_compatibility > iframe" - ).locator( - "#view_to_component_async_func_compatibility[data-success=true]" + def test_view_to_iframe_async_func(self): + self.page.frame_locator("#view_to_iframe_async_func > iframe").locator( + "#view_to_iframe_async_func[data-success=true]" ).wait_for() - def test_view_to_component_sync_class_compatibility(self): - self.page.frame_locator( - "#view_to_component_sync_class_compatibility > iframe" - ).locator( - "#ViewToComponentSyncClassCompatibility[data-success=true]" + def test_view_to_iframe_sync_class(self): + self.page.frame_locator("#view_to_iframe_sync_class > iframe").locator( + "#ViewToIframeSyncClass[data-success=true]" ).wait_for() - def test_view_to_component_async_class_compatibility(self): - self.page.frame_locator( - "#view_to_component_async_class_compatibility > iframe" - ).locator( - "#ViewToComponentAsyncClassCompatibility[data-success=true]" + def test_view_to_iframe_async_class(self): + self.page.frame_locator("#view_to_iframe_async_class > iframe").locator( + "#ViewToIframeAsyncClass[data-success=true]" ).wait_for() - def test_view_to_component_template_view_class_compatibility(self): - self.page.frame_locator( - "#view_to_component_template_view_class_compatibility > iframe" - ).locator( - "#ViewToComponentTemplateViewClassCompatibility[data-success=true]" + def test_view_to_iframe_template_view_class(self): + self.page.frame_locator("#view_to_iframe_template_view_class > iframe").locator( + "#ViewToIframeTemplateViewClass[data-success=true]" ).wait_for() def test_view_to_iframe_args(self): @@ -300,14 +273,6 @@ def test_view_to_iframe_args(self): "#view_to_iframe_args[data-success=Success]" ).wait_for() - def test_view_to_component_decorator(self): - self.page.locator("#view_to_component_decorator[data-success=true]").wait_for() - - def test_view_to_component_decorator_args(self): - self.page.locator( - "#view_to_component_decorator_args[data-success=true]" - ).wait_for() - def test_component_session_exists(self): """Session should exist for components with args/kwargs.""" component = self.page.locator("#parametrized-component") @@ -322,7 +287,7 @@ def test_component_session_exists(self): def test_component_session_missing(self): """No session should exist for components that don't have args/kwargs.""" - component = self.page.locator("#simple-button") + component = self.page.locator("#button-from-js-module") component.wait_for() parent = component.locator("..") session_id = parent.get_attribute("id") @@ -577,26 +542,44 @@ def test_url_router(self): new_page.goto(f"{self.live_server_url}/router/") path = new_page.wait_for_selector("#router-path") self.assertIn("/router/", path.get_attribute("data-path")) + string = new_page.query_selector("#router-string") + self.assertEqual("/router/", string.text_content()) - new_page.goto(f"{self.live_server_url}/router/any/123/") + new_page.goto(f"{self.live_server_url}/router/subroute/") path = new_page.wait_for_selector("#router-path") - self.assertIn("/router/any/123/", path.get_attribute("data-path")) + self.assertIn("/router/subroute/", path.get_attribute("data-path")) + string = new_page.query_selector("#router-string") + self.assertEqual("subroute/", string.text_content()) + + new_page.goto(f"{self.live_server_url}/router/unspecified/123/") + path = new_page.wait_for_selector("#router-path") + self.assertIn("/router/unspecified/123/", path.get_attribute("data-path")) + string = new_page.query_selector("#router-string") + self.assertEqual("/router/unspecified//", string.text_content()) new_page.goto(f"{self.live_server_url}/router/integer/123/") path = new_page.wait_for_selector("#router-path") self.assertIn("/router/integer/123/", path.get_attribute("data-path")) + string = new_page.query_selector("#router-string") + self.assertEqual("/router/integer//", string.text_content()) new_page.goto(f"{self.live_server_url}/router/path/abc/123/") path = new_page.wait_for_selector("#router-path") self.assertIn("/router/path/abc/123/", path.get_attribute("data-path")) + string = new_page.query_selector("#router-string") + self.assertEqual("/router/path//", string.text_content()) new_page.goto(f"{self.live_server_url}/router/slug/abc-123/") path = new_page.wait_for_selector("#router-path") self.assertIn("/router/slug/abc-123/", path.get_attribute("data-path")) + string = new_page.query_selector("#router-string") + self.assertEqual("/router/slug//", string.text_content()) new_page.goto(f"{self.live_server_url}/router/string/abc/") path = new_page.wait_for_selector("#router-path") self.assertIn("/router/string/abc/", path.get_attribute("data-path")) + string = new_page.query_selector("#router-string") + self.assertEqual("/router/string//", string.text_content()) new_page.goto( f"{self.live_server_url}/router/uuid/123e4567-e89b-12d3-a456-426614174000/" @@ -606,29 +589,27 @@ def test_url_router(self): "/router/uuid/123e4567-e89b-12d3-a456-426614174000/", path.get_attribute("data-path"), ) - - new_page.goto(f"{self.live_server_url}/router/abc/") - path = new_page.wait_for_selector("#router-path") - self.assertIn("/router/abc/", path.get_attribute("data-path")) - - new_page.goto(f"{self.live_server_url}/router/two/123/abc/") - path = new_page.wait_for_selector("#router-path") - self.assertIn("/router/two/123/abc/", path.get_attribute("data-path")) - - new_page.goto(f"{self.live_server_url}/router/star/one/") - path = new_page.wait_for_selector("#router-path") - self.assertIn("/router/star/one/", path.get_attribute("data-path")) + string = new_page.query_selector("#router-string") + self.assertEqual("/router/uuid//", string.text_content()) new_page.goto( - f"{self.live_server_url}/router/star/adslkjgklasdjhfah/6789543256/" + f"{self.live_server_url}/router/any/adslkjgklasdjhfah/6789543256/" ) path = new_page.wait_for_selector("#router-path") self.assertIn( - "/router/star/adslkjgklasdjhfah/6789543256/", + "/router/any/adslkjgklasdjhfah/6789543256/", path.get_attribute("data-path"), ) string = new_page.query_selector("#router-string") - self.assertEqual("Path 12", string.text_content()) + self.assertEqual("/router/any/", string.text_content()) + + new_page.goto(f"{self.live_server_url}/router/two/123/abc/") + path = new_page.wait_for_selector("#router-path") + self.assertIn("/router/two/123/abc/", path.get_attribute("data-path")) + string = new_page.query_selector("#router-string") + self.assertEqual( + "/router/two///", string.text_content() + ) finally: new_page.close() diff --git a/tests/test_app/views.py b/tests/test_app/views.py index 7af05f61..0c75b357 100644 --- a/tests/test_app/views.py +++ b/tests/test_app/views.py @@ -87,7 +87,7 @@ def get_context_data(self, **kwargs): return {"test_name": self.__class__.__name__} -def view_to_component_sync_func_compatibility(request): +def view_to_iframe_sync_func(request): return render( request, "view_to_component.html", @@ -95,7 +95,7 @@ def view_to_component_sync_func_compatibility(request): ) -async def view_to_component_async_func_compatibility(request): +async def view_to_iframe_async_func(request): return await database_sync_to_async(render)( request, "view_to_component.html", @@ -103,7 +103,7 @@ async def view_to_component_async_func_compatibility(request): ) -class ViewToComponentSyncClassCompatibility(View): +class ViewToIframeSyncClass(View): def get(self, request, *args, **kwargs): return render( request, @@ -112,7 +112,7 @@ def get(self, request, *args, **kwargs): ) -class ViewToComponentAsyncClassCompatibility(View): +class ViewToIframeAsyncClass(View): async def get(self, request, *args, **kwargs): return await database_sync_to_async(render)( request, @@ -121,7 +121,7 @@ async def get(self, request, *args, **kwargs): ) -class ViewToComponentTemplateViewClassCompatibility(TemplateView): +class ViewToIframeTemplateViewClass(TemplateView): template_name = "view_to_component.html" def get_context_data(self, **kwargs): From 7948ac4eddad97fddc3a2a8aa781f12a75376d58 Mon Sep 17 00:00:00 2001 From: Mark Bakhit Date: Tue, 22 Oct 2024 00:40:13 -0700 Subject: [PATCH 4/6] Bump javascript dependencies (#253) --- .editorconfig | 32 + .prettierrc | 4 + src/js/package-lock.json | 1497 +++++++++++++++++++++----------------- src/js/package.json | 20 +- src/js/src/index.tsx | 4 +- src/js/tsconfig.json | 6 +- 6 files changed, 866 insertions(+), 697 deletions(-) create mode 100644 .editorconfig create mode 100644 .prettierrc diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..356385d7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,32 @@ +# http://editorconfig.org + +root = true + +[*] +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 +end_of_line = lf + +[*.py] +indent_size = 4 +max_line_length = 120 + +[*.md] +indent_size = 4 + +[*.html] +max_line_length = off + +[*.js] +max_line_length = off + +[*.css] +indent_size = 4 +max_line_length = off + +# Tests can violate line width restrictions in the interest of clarity. +[**/test_*.py] +max_line_length = off diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..32ad81f3 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "proseWrap": "never", + "trailingComma": "all" +} diff --git a/src/js/package-lock.json b/src/js/package-lock.json index d4cb1c0b..0bdd2ca5 100644 --- a/src/js/package-lock.json +++ b/src/js/package-lock.json @@ -5,23 +5,23 @@ "packages": { "": { "dependencies": { - "@pyscript/core": "^0.4.48", + "@pyscript/core": "^0.6.7", "@reactpy/client": "^0.3.1", - "@rollup/plugin-typescript": "^11.1.6", - "morphdom": "^2.7.3", - "tslib": "^2.6.2" + "@rollup/plugin-typescript": "^12.1.1", + "morphdom": "^2.7.4", + "tslib": "^2.8.0" }, "devDependencies": { - "@rollup/plugin-commonjs": "^25.0.7", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^5.0.5", + "@rollup/plugin-commonjs": "^28.0.1", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-replace": "^6.0.1", "@types/react": "^18.2.48", "@types/react-dom": "^18.2.18", "eslint": "^8.38.0", "eslint-plugin-react": "^7.32.2", - "prettier": "^3.2.3", - "rollup": "^4.9.5", - "typescript": "^5.3.3" + "prettier": "^3.3.3", + "rollup": "^4.24.0", + "typescript": "^5.6.3" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -49,9 +49,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -80,44 +80,23 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/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/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -125,28 +104,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -161,9 +118,10 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@jridgewell/sourcemap-codec": { @@ -208,16 +166,22 @@ } }, "node_modules/@pyscript/core": { - "version": "0.4.48", - "resolved": "https://registry.npmjs.org/@pyscript/core/-/core-0.4.48.tgz", - "integrity": "sha512-cVZ//1WDkWhjZ1tOjUB1YJ5mKxDf3kMpzS/pw7Oe9/BMrB/NM3TxxCQ9Oyvq7Fkfv1F+srIcsi1xZ5gQeP+5Tg==", + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@pyscript/core/-/core-0.6.7.tgz", + "integrity": "sha512-Ij9nrIAp49IkavzTYYwoV4K12MzzVCvcfmkGeqc9nPhtwBxPWSDJ9LEJtfO9MzoMV3dog5FwHdUh2WbZbqqZfw==", "dependencies": { "@ungap/with-resolvers": "^0.1.0", + "@webreflection/idb-map": "^0.3.2", + "add-promise-listener": "^0.1.3", "basic-devtools": "^0.1.6", - "polyscript": "^0.13.5", + "polyscript": "^0.16.3", + "sabayon": "^0.5.2", "sticky-module": "^0.1.1", "to-json-callback": "^0.1.1", "type-checked-collections": "^0.1.7" + }, + "engines": { + "node": ">=20" } }, "node_modules/@reactpy/client": { @@ -234,20 +198,21 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", - "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", + "version": "28.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.1.tgz", + "integrity": "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", - "glob": "^8.0.3", + "fdir": "^6.2.0", "is-reference": "1.2.1", - "magic-string": "^0.30.3" + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0 || 14 >= 14.17" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" @@ -258,16 +223,41 @@ } } }, + "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" }, @@ -284,9 +274,9 @@ } }, "node_modules/@rollup/plugin-replace": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz", - "integrity": "sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.1.tgz", + "integrity": "sha512-2sPh9b73dj5IxuMmDAsQWVFT7mR+yoHweBaXG2W/R8vQ+IWZlnaI7BR7J6EguVQUp1hd8Z7XuozpDjEKQAAC2Q==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", @@ -305,9 +295,9 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "11.1.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", - "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.1.tgz", + "integrity": "sha512-t7O653DpfB5MbFrqPe/VcKFFkvRuFNp9qId3xq4Eth5xlyymzxNpye2z8Hrl0RIMuXTSr5GGcFpkdlMeacUiFQ==", "dependencies": { "@rollup/pluginutils": "^5.1.0", "resolve": "^1.22.1" @@ -351,9 +341,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.5.tgz", - "integrity": "sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", "cpu": [ "arm" ], @@ -364,9 +354,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.5.tgz", - "integrity": "sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", "cpu": [ "arm64" ], @@ -377,9 +367,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.5.tgz", - "integrity": "sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", "cpu": [ "arm64" ], @@ -390,9 +380,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.5.tgz", - "integrity": "sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", "cpu": [ "x64" ], @@ -403,9 +393,22 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.5.tgz", - "integrity": "sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", "cpu": [ "arm" ], @@ -416,9 +419,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.5.tgz", - "integrity": "sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", "cpu": [ "arm64" ], @@ -429,9 +432,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.5.tgz", - "integrity": "sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", "cpu": [ "arm64" ], @@ -441,10 +444,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.5.tgz", - "integrity": "sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", "cpu": [ "riscv64" ], @@ -454,10 +470,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", - "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", "cpu": [ "x64" ], @@ -468,9 +497,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.5.tgz", - "integrity": "sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", "cpu": [ "x64" ], @@ -481,9 +510,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.5.tgz", - "integrity": "sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", "cpu": [ "arm64" ], @@ -494,9 +523,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.5.tgz", - "integrity": "sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", "cpu": [ "ia32" ], @@ -507,9 +536,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz", - "integrity": "sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", "cpu": [ "x64" ], @@ -520,9 +549,9 @@ ] }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/prop-types": { "version": "15.7.11", @@ -578,14 +607,14 @@ "integrity": "sha512-zCcqCJoNLvdeF41asAK71XPlwSPieeRDsE09albBunJEksuYPYNillKNQjf8p5BqSoTKTuKrW3lUm3MNodUC4g==" }, "node_modules/@webreflection/idb-map": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@webreflection/idb-map/-/idb-map-0.3.1.tgz", - "integrity": "sha512-lRCanqwR7tHHFohJHAMSMEZnoNPvgjcKr0f5e4y+lTJA+fctT61EZ+f5pT5/+8+wlSsMAvXjzfKRLT6o9aqxbA==" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@webreflection/idb-map/-/idb-map-0.3.2.tgz", + "integrity": "sha512-VLBTx6EUYF/dPdLyyjWWKxQmTWnVXTT1YJekrJUmfGxBcqEVL0Ih2EQptNG/JezkTYgJ0uSTb0yAum/THltBvQ==" }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -603,6 +632,11 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/add-promise-listener": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/add-promise-listener/-/add-promise-listener-0.1.3.tgz", + "integrity": "sha512-hQ6IgGJ7NvvlPYbwdekhdVwPb4QzEptNZ5v7B4XRKz7FukUPDuF/v+R5EFHArWmhmq4d+xv0G4/B5bu2GSiz9Q==" + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -650,28 +684,32 @@ "dev": true }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -681,6 +719,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -718,30 +776,34 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -751,20 +813,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -784,35 +840,29 @@ "integrity": "sha512-g9zJ63GmdUesS3/Fwv0B5SYX6nR56TQXmGr+wE5PRTNCnGQMYWhUx/nZB/mMWnQJVLPPAp89oxDNlasdtNkW5Q==" }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "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" - } - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -852,17 +902,13 @@ } }, "node_modules/coincident": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/coincident/-/coincident-1.2.3.tgz", - "integrity": "sha512-Uxz3BMTWIslzeWjuQnizGWVg0j6khbvHUQ8+5BdM7WuJEm4ALXwq3wluYoB+uF68uPBz/oUOeJnYURKyfjexlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/coincident/-/coincident-2.2.3.tgz", + "integrity": "sha512-yxLzgZqDSEPOczzNoM4T3gVyg955Kbk5snkaAkQw8xvh8zfxGuUtbaOaDNCaP3HxWeRZZjwbJi80hapAikpvoQ==", "dependencies": { - "@ungap/structured-clone": "^1.2.0", - "@ungap/with-resolvers": "^0.1.0", - "gc-hook": "^0.3.1", - "proxy-target": "^3.0.2" - }, - "optionalDependencies": { - "ws": "^8.16.0" + "gc-hook": "^0.4.1", + "js-proxy": "^0.5.1", + "sabayon": "^0.5.2" } }, "node_modules/color-convert": { @@ -915,13 +961,64 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -948,17 +1045,20 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -991,50 +1091,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -1043,37 +1150,73 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", + "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", "dev": true, "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -1118,16 +1261,17 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -1173,43 +1317,35 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", + "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", + "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react/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" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react/node_modules/doctrine": { @@ -1224,18 +1360,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-react/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/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -1281,28 +1405,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/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/eslint/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/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -1394,9 +1496,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", - "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -1445,9 +1547,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/for-each": { @@ -1520,33 +1622,38 @@ } }, "node_modules/gc-hook": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/gc-hook/-/gc-hook-0.3.1.tgz", - "integrity": "sha512-E5M+O/h2o7eZzGhzRZGex6hbB3k4NWqO0eA+OzLRLXxhdbYPajZnynPwAtphnh+cRHPwsj5Z80dqZlfI4eK55A==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/gc-hook/-/gc-hook-0.4.1.tgz", + "integrity": "sha512-uiF+uUftDVLr+VRdudsdsT3/LQYnv2ntwhRH964O7xXDI57Smrek5olv75Wb8Nnz6U+7iVTRXsBlxKcsaDTJTQ==" }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -1556,19 +1663,21 @@ } }, "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=12" + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -1602,12 +1711,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -1653,21 +1763,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -1689,12 +1799,12 @@ } }, "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -1704,9 +1814,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -1720,9 +1830,9 @@ "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -1757,6 +1867,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "dependencies": { "once": "^1.3.0", @@ -1770,12 +1881,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -1784,14 +1895,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1840,21 +1953,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -1878,6 +1976,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "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", @@ -1942,10 +2055,13 @@ } }, "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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -1957,9 +2073,9 @@ "dev": true }, "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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -2018,21 +2134,27 @@ } }, "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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "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==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2069,12 +2191,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -2084,10 +2206,13 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2105,13 +2230,16 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2130,9 +2258,9 @@ "dev": true }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", "dev": true, "dependencies": { "define-properties": "^1.2.1", @@ -2140,8 +2268,25 @@ "has-symbols": "^1.0.3", "reflect.getprototypeof": "^1.0.4", "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/js-proxy": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/js-proxy/-/js-proxy-0.5.1.tgz", + "integrity": "sha512-G1AswnGndelrmZ2tuJi5NWlXo28BucJdgO8aKP5U1NkxWxPvgFA510Ku6at+1A17Kh2ja7A/r4RDtd9Hdr6sOw==", + "dependencies": { + "gc-hook": "^0.3.1", + "proxy-target": "^3.0.2" } }, + "node_modules/js-proxy/node_modules/gc-hook": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/gc-hook/-/gc-hook-0.3.1.tgz", + "integrity": "sha512-E5M+O/h2o7eZzGhzRZGex6hbB3k4NWqO0eA+OzLRLXxhdbYPajZnynPwAtphnh+cRHPwsj5Z80dqZlfI4eK55A==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2267,26 +2412,26 @@ } }, "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "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": "^2.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" + "node": "*" } }, "node_modules/morphdom": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.3.tgz", - "integrity": "sha512-rvGK92GxSuPEZLY8D/JH07cG3BxyA+/F0Bxg32OoGAEFFhGWA3OqVpqPZlOgZTCR52clXrmz+z2pYSJ6gOig1w==" + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.4.tgz", + "integrity": "sha512-ATTbWMgGa+FaMU3FhnFYB6WgulCqwf6opOll4CBzmVDTLvPMmUPrEv8CudmLPK0MESa64+6B89fWOxP3+YIlxQ==" }, "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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/natural-compare": { @@ -2304,10 +2449,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2340,28 +2488,29 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2370,28 +2519,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2517,24 +2653,33 @@ "integrity": "sha512-yyVAOFKTAElc7KdLt2+UKGExNYwYb/Y/WE9i+1ezCQsJE8gbKSjewfpRqK2nQgZ4d4hhAAGgDCOcIZVilqE5UA==" }, "node_modules/polyscript": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/polyscript/-/polyscript-0.13.5.tgz", - "integrity": "sha512-PwXWnhLbOMtvZWFIN271JhaN7KnxESaMtv9Rcdrq1TKTCMnkz9idvYb3Od1iumBJlr49lLlwyUKeGb423rFR4w==", + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/polyscript/-/polyscript-0.16.3.tgz", + "integrity": "sha512-I3kHxt62FMRAX2iVl24iCEtG4UnUInMSbv/LnwevkmjOErLPAQtES4CNzU/fgKRpXYCqp0WWQaRvRYkJhpMIbA==", "dependencies": { "@ungap/structured-clone": "^1.2.0", "@ungap/with-resolvers": "^0.1.0", "@webreflection/fetch": "^0.1.5", - "@webreflection/idb-map": "^0.3.1", + "@webreflection/idb-map": "^0.3.2", "basic-devtools": "^0.1.6", "codedent": "^0.1.2", - "coincident": "^1.2.3", - "gc-hook": "^0.3.1", + "coincident": "^2.2.2", + "gc-hook": "^0.4.1", "html-escaper": "^3.0.3", "proxy-target": "^3.0.2", "sticky-module": "^0.1.1", "to-json-callback": "^0.1.1" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2545,9 +2690,9 @@ } }, "node_modules/prettier": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.3.tgz", - "integrity": "sha512-QNhUTBq+mqt1oH1dTfY3phOKNhcDdJkfttHI6u0kj7M2+c+7fmNKlgh2GhnHiqMcbxJ+a0j2igz/2jfl9QKLuw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -2638,15 +2783,16 @@ "dev": true }, "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -2658,14 +2804,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -2713,6 +2860,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -2724,55 +2872,13 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/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/rimraf/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/rimraf/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/rollup": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.5.tgz", - "integrity": "sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", "devOptional": true, "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -2782,19 +2888,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.5", - "@rollup/rollup-android-arm64": "4.9.5", - "@rollup/rollup-darwin-arm64": "4.9.5", - "@rollup/rollup-darwin-x64": "4.9.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.5", - "@rollup/rollup-linux-arm64-gnu": "4.9.5", - "@rollup/rollup-linux-arm64-musl": "4.9.5", - "@rollup/rollup-linux-riscv64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-musl": "4.9.5", - "@rollup/rollup-win32-arm64-msvc": "4.9.5", - "@rollup/rollup-win32-ia32-msvc": "4.9.5", - "@rollup/rollup-win32-x64-msvc": "4.9.5", + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", "fsevents": "~2.3.2" } }, @@ -2821,14 +2930,22 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/sabayon": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/sabayon/-/sabayon-0.5.2.tgz", + "integrity": "sha512-7y8dwQFhInkUuI0JL1rAGLYeKz9LypgfzMOVO04v9pYvepzYJ6B7MhyoRiVIx2sGm7MhrD5h/SaHP6p+5Uc7Cw==", + "bin": { + "sabayon": "cli.cjs" + } + }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -2840,13 +2957,13 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, "engines": { @@ -2876,30 +2993,32 @@ } }, "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2927,14 +3046,18 @@ } }, "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==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2946,34 +3069,51 @@ "integrity": "sha512-IuYgnyIMUx/m6rtu14l/LR2MaqOLtpXcWkxPmtPsiScRHEo+S4Tojk+DWFHOncSdFX/OsoLOM4+T92yOmI1AMw==" }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2983,28 +3123,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3069,9 +3212,9 @@ "integrity": "sha512-BzOeinTT3NjE+FJ2iCvWB8HvyuyBzoH3WlSnJ+AYVC4tlePyZWSYdkQIFOARWiq0t35/XhmI0uQsFiUsRksRqg==" }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" }, "node_modules/type-check": { "version": "0.4.0", @@ -3103,29 +3246,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -3135,16 +3279,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -3154,23 +3299,29 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3235,13 +3386,13 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", "dev": true, "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -3250,8 +3401,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -3261,31 +3412,34 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3300,27 +3454,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "optional": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/src/js/package.json b/src/js/package.json index 949b6cf9..ef6aae27 100644 --- a/src/js/package.json +++ b/src/js/package.json @@ -8,22 +8,22 @@ "check": "prettier --check . && eslint" }, "devDependencies": { - "@rollup/plugin-commonjs": "^25.0.7", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^5.0.5", + "@rollup/plugin-commonjs": "^28.0.1", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-replace": "^6.0.1", "@types/react": "^18.2.48", "@types/react-dom": "^18.2.18", "eslint": "^8.38.0", "eslint-plugin-react": "^7.32.2", - "prettier": "^3.2.3", - "rollup": "^4.9.5", - "typescript": "^5.3.3" + "prettier": "^3.3.3", + "rollup": "^4.24.0", + "typescript": "^5.6.3" }, "dependencies": { - "@pyscript/core": "^0.4.48", + "@pyscript/core": "^0.6.7", "@reactpy/client": "^0.3.1", - "@rollup/plugin-typescript": "^11.1.6", - "morphdom": "^2.7.3", - "tslib": "^2.6.2" + "@rollup/plugin-typescript": "^12.1.1", + "morphdom": "^2.7.4", + "tslib": "^2.8.0" } } diff --git a/src/js/src/index.tsx b/src/js/src/index.tsx index 23300874..51a387f3 100644 --- a/src/js/src/index.tsx +++ b/src/js/src/index.tsx @@ -1,6 +1,6 @@ import { ReactPyDjangoClient } from "./client"; import React from "react"; -import { render } from "react-dom"; +import ReactDOM from "react-dom"; import { Layout } from "@reactpy/client/src/components"; export function mountComponent( @@ -77,5 +77,5 @@ export function mountComponent( } // Start rendering the component - render(, client.mountElement); + ReactDOM.render(, client.mountElement); } diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json index b73afab7..f1b84b50 100644 --- a/src/js/tsconfig.json +++ b/src/js/tsconfig.json @@ -4,10 +4,10 @@ "module": "esnext", "moduleResolution": "node", "jsx": "react", - "allowSyntheticDefaultImports": true, + "allowSyntheticDefaultImports": true }, "paths": { "react": ["./node_modules/preact/compat/"], - "react-dom": ["./node_modules/preact/compat/"], - }, + "react-dom": ["./node_modules/preact/compat/"] + } } From e09fa17c6ab97504190a90603fad60eedfaf5085 Mon Sep 17 00:00:00 2001 From: Mark Bakhit Date: Tue, 22 Oct 2024 21:29:57 -0700 Subject: [PATCH 5/6] Cleanup PyScript renderer & use `Bun` for building JS (#254) - Switch to `Bun` for building JS - Minor cleanup to pyscript renderer - Revert pyscript version to 0.5 due to [bugs](https://github.com/pyscript/pyscript/issues/2228) --- .editorconfig | 4 + .github/workflows/publish-develop-docs.yml | 3 + .github/workflows/publish-py.yml | 3 + .github/workflows/publish-release-docs.yml | 3 + .github/workflows/test-docs.yml | 3 + .github/workflows/test-src.yml | 3 + .../pyscript-setup-local-interpreter.html | 1 + docs/src/about/code.md | 1 + docs/src/reference/template-tag.md | 14 + noxfile.py | 10 +- pyproject.toml | 2 +- requirements/test-env.txt | 1 - setup.py | 45 +- src/js/bun.lockb | Bin 0 -> 101426 bytes src/js/eslint.config.js | 1 + src/js/package-lock.json | 3470 ----------------- src/js/package.json | 20 +- src/js/rollup.config.mjs | 23 - src/js/tsconfig.json | 13 - src/reactpy_django/components.py | 1 - src/reactpy_django/pyscript/layout_handler.py | 23 +- src/reactpy_django/templatetags/reactpy.py | 4 +- tests/test_app/__init__.py | 62 +- 23 files changed, 135 insertions(+), 3575 deletions(-) create mode 100644 docs/examples/html/pyscript-setup-local-interpreter.html create mode 100644 src/js/bun.lockb create mode 100644 src/js/eslint.config.js delete mode 100644 src/js/package-lock.json delete mode 100644 src/js/rollup.config.mjs delete mode 100644 src/js/tsconfig.json diff --git a/.editorconfig b/.editorconfig index 356385d7..170d7ddb 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,10 +14,14 @@ end_of_line = lf indent_size = 4 max_line_length = 120 +[*.yml] +indent_size = 4 + [*.md] indent_size = 4 [*.html] +indent_size = 4 max_line_length = off [*.js] diff --git a/.github/workflows/publish-develop-docs.yml b/.github/workflows/publish-develop-docs.yml index c2b62d95..53c5aa16 100644 --- a/.github/workflows/publish-develop-docs.yml +++ b/.github/workflows/publish-develop-docs.yml @@ -11,6 +11,9 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest - uses: actions/setup-python@v5 with: python-version: 3.x diff --git a/.github/workflows/publish-py.yml b/.github/workflows/publish-py.yml index 72a04dae..6a86db98 100644 --- a/.github/workflows/publish-py.yml +++ b/.github/workflows/publish-py.yml @@ -12,6 +12,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest - name: Set up Python uses: actions/setup-python@v5 with: diff --git a/.github/workflows/publish-release-docs.yml b/.github/workflows/publish-release-docs.yml index 3f24d129..93df3e2a 100644 --- a/.github/workflows/publish-release-docs.yml +++ b/.github/workflows/publish-release-docs.yml @@ -11,6 +11,9 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest - uses: actions/setup-python@v5 with: python-version: 3.x diff --git a/.github/workflows/test-docs.yml b/.github/workflows/test-docs.yml index 3062ebc1..95d131c4 100644 --- a/.github/workflows/test-docs.yml +++ b/.github/workflows/test-docs.yml @@ -17,6 +17,9 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest - uses: actions/setup-python@v5 with: python-version: 3.x diff --git a/.github/workflows/test-src.yml b/.github/workflows/test-src.yml index 328bd1c3..5eb2e67a 100644 --- a/.github/workflows/test-src.yml +++ b/.github/workflows/test-src.yml @@ -18,6 +18,9 @@ jobs: python-version: ["3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest - name: Use Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: diff --git a/docs/examples/html/pyscript-setup-local-interpreter.html b/docs/examples/html/pyscript-setup-local-interpreter.html new file mode 100644 index 00000000..8371fa94 --- /dev/null +++ b/docs/examples/html/pyscript-setup-local-interpreter.html @@ -0,0 +1 @@ +{% pyscript_setup config='{"interpreter":"/static/pyodide/pyodide.mjs"}' %} diff --git a/docs/src/about/code.md b/docs/src/about/code.md index 205c2c96..81e49c51 100644 --- a/docs/src/about/code.md +++ b/docs/src/about/code.md @@ -19,6 +19,7 @@ If you plan to make code changes to this repository, you will need to install the following dependencies first: - [Python 3.9+](https://www.python.org/downloads/) +- [Bun](https://bun.sh/) - [Git](https://git-scm.com/downloads) Once done, you should clone this repository: diff --git a/docs/src/reference/template-tag.md b/docs/src/reference/template-tag.md index e5c60a79..091b2ac8 100644 --- a/docs/src/reference/template-tag.md +++ b/docs/src/reference/template-tag.md @@ -391,3 +391,17 @@ You can optionally use this tag to configure the current PyScript environment. F ```python {% include "../../examples/python/pyscript-setup-config-object.py" %} ``` + +??? question "Can I use a local interpreter for PyScript?" + + Yes, you can set up a local interpreter by following PyScript's [standard documentation](https://docs.pyscript.net/latest/user-guide/offline/#local-pyodide-packages). + + To summarize, + + 1. Download the latest Pyodide bundle from the [Pyodide GitHub releases page](https://github.com/pyodide/pyodide/releases) (for example `pyodide-0.26.3.tar.bz2`). + 2. Extract the contents of the bundle to your project's static files. + 3. Configure your `#!jinja {% pyscript_setup %}` template tag to use `pyodide` as an interpreter. + + ```jinja linenums="0" + {% include "../../examples/html/pyscript-setup-local-interpreter.html" %} + ``` diff --git a/noxfile.py b/noxfile.py index 7c228143..8776de45 100644 --- a/noxfile.py +++ b/noxfile.py @@ -31,14 +31,14 @@ def test_python(session: Session) -> None: settings_files = glob(settings_glob) assert settings_files, f"No Django settings files found at '{settings_glob}'!" for settings_file in settings_files: - settings_module = settings_file.strip(".py").replace("/", ".").replace("\\", ".") + settings_module = ( + settings_file.strip(".py").replace("/", ".").replace("\\", ".") + ) session.run( "python", "manage.py", "test", *posargs, - "-v", - "2", "--settings", settings_module, ) @@ -62,8 +62,8 @@ def test_style(session: Session) -> None: def test_javascript(session: Session) -> None: install_requirements_file(session, "test-env") session.chdir(ROOT_DIR / "src" / "js") - session.run("python", "-m", "nodejs.npm", "install", external=True) - session.run("python", "-m", "nodejs.npm", "run", "check") + session.run("bun", "install", external=True) + session.run("bun", "run", "check", external=True) def install_requirements_file(session: Session, name: str) -> None: diff --git a/pyproject.toml b/pyproject.toml index 274a352e..99ff6917 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools>=42", "wheel", "nodejs-bin==18.4.0a4"] +requires = ["setuptools>=42", "wheel"] build-backend = "setuptools.build_meta" [tool.mypy] diff --git a/requirements/test-env.txt b/requirements/test-env.txt index 6f146715..fc1ba2ce 100644 --- a/requirements/test-env.txt +++ b/requirements/test-env.txt @@ -3,4 +3,3 @@ twisted channels[daphne]>=4.0.0 tblib whitenoise -nodejs-bin==18.4.0a4 diff --git a/setup.py b/setup.py index 76a91edf..a3388b35 100644 --- a/setup.py +++ b/setup.py @@ -1,16 +1,18 @@ from __future__ import annotations, print_function import shutil +import subprocess import sys import traceback -from distutils import log +from logging import getLogger from pathlib import Path -from nodejs import npm from setuptools import find_namespace_packages, setup from setuptools.command.develop import develop from setuptools.command.sdist import sdist +log = getLogger(__name__) + # ----------------------------------------------------------------------------- # Basic Constants # ----------------------------------------------------------------------------- @@ -97,19 +99,44 @@ # ---------------------------------------------------------------------------- # Build Javascript # ---------------------------------------------------------------------------- +def copy_js_files(source_dir: Path, destination: Path) -> None: + if destination.exists(): + shutil.rmtree(destination) + destination.mkdir() + + for file in source_dir.iterdir(): + if file.is_file(): + shutil.copy(file, destination / file.name) + else: + copy_js_files(file, destination / file.name) + + def build_javascript_first(build_cls: type): class Command(build_cls): def run(self): log.info("Installing Javascript...") - result = npm.call(["install"], cwd=str(js_dir)) + result = subprocess.run( + ["bun", "install"], cwd=str(js_dir), check=True + ).returncode if result != 0: log.error(traceback.format_exc()) log.error("Failed to install Javascript") raise RuntimeError("Failed to install Javascript") log.info("Building Javascript...") - result = npm.call(["run", "build"], cwd=str(js_dir)) + result = subprocess.run( + [ + "bun", + "build", + "./src/index.tsx", + "--outfile", + str(static_dir / "client.js"), + "--minify", + ], + cwd=str(js_dir), + check=True, + ).returncode if result != 0: log.error(traceback.format_exc()) log.error("Failed to build Javascript") @@ -118,18 +145,12 @@ def run(self): log.info("Copying @pyscript/core distribution") pyscript_dist = js_dir / "node_modules" / "@pyscript" / "core" / "dist" pyscript_static_dir = static_dir / "pyscript" - if not pyscript_static_dir.exists(): - pyscript_static_dir.mkdir() - for file in pyscript_dist.iterdir(): - shutil.copy(file, pyscript_static_dir / file.name) + copy_js_files(pyscript_dist, pyscript_static_dir) log.info("Copying Morphdom distribution") morphdom_dist = js_dir / "node_modules" / "morphdom" / "dist" morphdom_static_dir = static_dir / "morphdom" - if not morphdom_static_dir.exists(): - morphdom_static_dir.mkdir() - for file in morphdom_dist.iterdir(): - shutil.copy(file, morphdom_static_dir / file.name) + copy_js_files(morphdom_dist, morphdom_static_dir) log.info("Successfully built Javascript") super().run() diff --git a/src/js/bun.lockb b/src/js/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..3807b5711eaf5836a8f91e41e3a15c31dc0c1370 GIT binary patch literal 101426 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 literal 0 HcmV?d00001 diff --git a/src/js/eslint.config.js b/src/js/eslint.config.js new file mode 100644 index 00000000..27082ef3 --- /dev/null +++ b/src/js/eslint.config.js @@ -0,0 +1 @@ +export default [{}]; diff --git a/src/js/package-lock.json b/src/js/package-lock.json deleted file mode 100644 index 0bdd2ca5..00000000 --- a/src/js/package-lock.json +++ /dev/null @@ -1,3470 +0,0 @@ -{ - "name": "js", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@pyscript/core": "^0.6.7", - "@reactpy/client": "^0.3.1", - "@rollup/plugin-typescript": "^12.1.1", - "morphdom": "^2.7.4", - "tslib": "^2.8.0" - }, - "devDependencies": { - "@rollup/plugin-commonjs": "^28.0.1", - "@rollup/plugin-node-resolve": "^15.3.0", - "@rollup/plugin-replace": "^6.0.1", - "@types/react": "^18.2.48", - "@types/react-dom": "^18.2.18", - "eslint": "^8.38.0", - "eslint-plugin-react": "^7.32.2", - "prettier": "^3.3.3", - "rollup": "^4.24.0", - "typescript": "^5.6.3" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "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/@pyscript/core": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@pyscript/core/-/core-0.6.7.tgz", - "integrity": "sha512-Ij9nrIAp49IkavzTYYwoV4K12MzzVCvcfmkGeqc9nPhtwBxPWSDJ9LEJtfO9MzoMV3dog5FwHdUh2WbZbqqZfw==", - "dependencies": { - "@ungap/with-resolvers": "^0.1.0", - "@webreflection/idb-map": "^0.3.2", - "add-promise-listener": "^0.1.3", - "basic-devtools": "^0.1.6", - "polyscript": "^0.16.3", - "sabayon": "^0.5.2", - "sticky-module": "^0.1.1", - "to-json-callback": "^0.1.1", - "type-checked-collections": "^0.1.7" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@reactpy/client": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@reactpy/client/-/client-0.3.1.tgz", - "integrity": "sha512-mvFwAvmRMgo7lTjkhkEJzBep6HX/wfm5BaNbtEMOUzto7G/h+z1AmqlOMXLH37DSI0iwfmCuNwy07EJM0JWZ0g==", - "dependencies": { - "event-to-object": "^0.1.2", - "json-pointer": "^0.6.2" - }, - "peerDependencies": { - "react": ">=16 <18", - "react-dom": ">=16 <18" - } - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "28.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.1.tgz", - "integrity": "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "fdir": "^6.2.0", - "is-reference": "1.2.1", - "magic-string": "^0.30.3", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0 || 14 >= 14.17" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", - "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", - "dev": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", - "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.1.tgz", - "integrity": "sha512-2sPh9b73dj5IxuMmDAsQWVFT7mR+yoHweBaXG2W/R8vQ+IWZlnaI7BR7J6EguVQUp1hd8Z7XuozpDjEKQAAC2Q==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-typescript": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.1.tgz", - "integrity": "sha512-t7O653DpfB5MbFrqPe/VcKFFkvRuFNp9qId3xq4Eth5xlyymzxNpye2z8Hrl0RIMuXTSr5GGcFpkdlMeacUiFQ==", - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.14.0||^3.0.0||^4.0.0", - "tslib": "*", - "typescript": ">=3.7.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - }, - "tslib": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", - "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", - "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", - "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", - "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", - "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", - "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", - "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", - "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", - "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", - "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", - "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", - "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", - "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", - "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", - "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", - "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", - "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", - "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" - }, - "node_modules/@ungap/with-resolvers": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@ungap/with-resolvers/-/with-resolvers-0.1.0.tgz", - "integrity": "sha512-g7f0IkJdPW2xhY7H4iE72DAsIyfuwEFc6JWc2tYFwKDMWWAF699vGjrM348cwQuOXgHpe1gWFe+Eiyjx/ewvvw==" - }, - "node_modules/@webreflection/fetch": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@webreflection/fetch/-/fetch-0.1.5.tgz", - "integrity": "sha512-zCcqCJoNLvdeF41asAK71XPlwSPieeRDsE09albBunJEksuYPYNillKNQjf8p5BqSoTKTuKrW3lUm3MNodUC4g==" - }, - "node_modules/@webreflection/idb-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@webreflection/idb-map/-/idb-map-0.3.2.tgz", - "integrity": "sha512-VLBTx6EUYF/dPdLyyjWWKxQmTWnVXTT1YJekrJUmfGxBcqEVL0Ih2EQptNG/JezkTYgJ0uSTb0yAum/THltBvQ==" - }, - "node_modules/acorn": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", - "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/add-promise-listener": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/add-promise-listener/-/add-promise-listener-0.1.3.tgz", - "integrity": "sha512-hQ6IgGJ7NvvlPYbwdekhdVwPb4QzEptNZ5v7B4XRKz7FukUPDuF/v+R5EFHArWmhmq4d+xv0G4/B5bu2GSiz9Q==" - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "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-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "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-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/basic-devtools": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/basic-devtools/-/basic-devtools-0.1.6.tgz", - "integrity": "sha512-g9zJ63GmdUesS3/Fwv0B5SYX6nR56TQXmGr+wE5PRTNCnGQMYWhUx/nZB/mMWnQJVLPPAp89oxDNlasdtNkW5Q==" - }, - "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/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "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/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/codedent": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/codedent/-/codedent-0.1.2.tgz", - "integrity": "sha512-qEqzcy5viM3UoCN0jYHZeXZoyd4NZQzYFg0kOBj8O1CgoGG9WYYTF+VeQRsN0OSKFjF3G1u4WDUOtOsWEx6N2w==", - "dependencies": { - "plain-tag": "^0.1.3" - } - }, - "node_modules/coincident": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/coincident/-/coincident-2.2.3.tgz", - "integrity": "sha512-yxLzgZqDSEPOczzNoM4T3gVyg955Kbk5snkaAkQw8xvh8zfxGuUtbaOaDNCaP3HxWeRZZjwbJi80hapAikpvoQ==", - "dependencies": { - "gc-hook": "^0.4.1", - "js-proxy": "^0.5.1", - "sabayon": "^0.5.2" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "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/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/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", - "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.4", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.3", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "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-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", - "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.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/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "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/event-to-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/event-to-object/-/event-to-object-0.1.2.tgz", - "integrity": "sha512-+fUmp1XOCZiYomwe5Zxp4IlchuZZfdVdjFUk5MbgRT4M+V2TEWKc0jJwKLCX/nxlJ6xM5VUb/ylzERh7YDCRrg==", - "dependencies": { - "json-pointer": "^0.6.2" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "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.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreach": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", - "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==" - }, - "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/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "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/gc-hook": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/gc-hook/-/gc-hook-0.4.1.tgz", - "integrity": "sha512-uiF+uUftDVLr+VRdudsdsT3/LQYnv2ntwhRH964O7xXDI57Smrek5olv75Wb8Nnz6U+7iVTRXsBlxKcsaDTJTQ==" - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "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": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "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": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "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.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", - "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "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/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==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "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/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "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-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-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-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-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "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.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/iterator.prototype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", - "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/js-proxy": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/js-proxy/-/js-proxy-0.5.1.tgz", - "integrity": "sha512-G1AswnGndelrmZ2tuJi5NWlXo28BucJdgO8aKP5U1NkxWxPvgFA510Ku6at+1A17Kh2ja7A/r4RDtd9Hdr6sOw==", - "dependencies": { - "gc-hook": "^0.3.1", - "proxy-target": "^3.0.2" - } - }, - "node_modules/js-proxy/node_modules/gc-hook": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/gc-hook/-/gc-hook-0.3.1.tgz", - "integrity": "sha512-E5M+O/h2o7eZzGhzRZGex6hbB3k4NWqO0eA+OzLRLXxhdbYPajZnynPwAtphnh+cRHPwsj5Z80dqZlfI4eK55A==" - }, - "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==" - }, - "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-pointer": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", - "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "dependencies": { - "foreach": "^2.0.4" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "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/morphdom": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.4.tgz", - "integrity": "sha512-ATTbWMgGa+FaMU3FhnFYB6WgulCqwf6opOll4CBzmVDTLvPMmUPrEv8CudmLPK0MESa64+6B89fWOxP3+YIlxQ==" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "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.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "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/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "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/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/plain-tag": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/plain-tag/-/plain-tag-0.1.3.tgz", - "integrity": "sha512-yyVAOFKTAElc7KdLt2+UKGExNYwYb/Y/WE9i+1ezCQsJE8gbKSjewfpRqK2nQgZ4d4hhAAGgDCOcIZVilqE5UA==" - }, - "node_modules/polyscript": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/polyscript/-/polyscript-0.16.3.tgz", - "integrity": "sha512-I3kHxt62FMRAX2iVl24iCEtG4UnUInMSbv/LnwevkmjOErLPAQtES4CNzU/fgKRpXYCqp0WWQaRvRYkJhpMIbA==", - "dependencies": { - "@ungap/structured-clone": "^1.2.0", - "@ungap/with-resolvers": "^0.1.0", - "@webreflection/fetch": "^0.1.5", - "@webreflection/idb-map": "^0.3.2", - "basic-devtools": "^0.1.6", - "codedent": "^0.1.2", - "coincident": "^2.2.2", - "gc-hook": "^0.4.1", - "html-escaper": "^3.0.3", - "proxy-target": "^3.0.2", - "sticky-module": "^0.1.1", - "to-json-callback": "^0.1.1" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/proxy-target": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/proxy-target/-/proxy-target-3.0.2.tgz", - "integrity": "sha512-FFE1XNwXX/FNC3/P8HiKaJSy/Qk68RitG/QEcLy/bVnTAPlgTAWPZKh0pARLAnpfXQPKyalBhk009NRTgsk8vQ==" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.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-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/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/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", - "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", - "devOptional": true, - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", - "fsevents": "~2.3.2" - } - }, - "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/sabayon": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/sabayon/-/sabayon-0.5.2.tgz", - "integrity": "sha512-7y8dwQFhInkUuI0JL1rAGLYeKz9LypgfzMOVO04v9pYvepzYJ6B7MhyoRiVIx2sGm7MhrD5h/SaHP6p+5Uc7Cw==", - "bin": { - "sabayon": "cli.cjs" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sticky-module": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/sticky-module/-/sticky-module-0.1.1.tgz", - "integrity": "sha512-IuYgnyIMUx/m6rtu14l/LR2MaqOLtpXcWkxPmtPsiScRHEo+S4Tojk+DWFHOncSdFX/OsoLOM4+T92yOmI1AMw==" - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-json-callback": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-json-callback/-/to-json-callback-0.1.1.tgz", - "integrity": "sha512-BzOeinTT3NjE+FJ2iCvWB8HvyuyBzoH3WlSnJ+AYVC4tlePyZWSYdkQIFOARWiq0t35/XhmI0uQsFiUsRksRqg==" - }, - "node_modules/tslib": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", - "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-checked-collections": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/type-checked-collections/-/type-checked-collections-0.1.7.tgz", - "integrity": "sha512-fLIydlJy7IG9XL4wjRwEcKhxx/ekLXiWiMvcGo01cOMF+TN+5ZqajM1mRNRz2bNNi1bzou2yofhjZEQi7kgl9A==" - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "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/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.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/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/src/js/package.json b/src/js/package.json index ef6aae27..7f6cc019 100644 --- a/src/js/package.json +++ b/src/js/package.json @@ -1,29 +1,19 @@ { - "description": "ReactPy-Django Client", - "main": "src/index.tsx", "type": "module", "scripts": { - "build": "rollup --config", "format": "prettier --write . && eslint --fix", "check": "prettier --check . && eslint" }, "devDependencies": { - "@rollup/plugin-commonjs": "^28.0.1", - "@rollup/plugin-node-resolve": "^15.3.0", - "@rollup/plugin-replace": "^6.0.1", "@types/react": "^18.2.48", "@types/react-dom": "^18.2.18", - "eslint": "^8.38.0", - "eslint-plugin-react": "^7.32.2", - "prettier": "^3.3.3", - "rollup": "^4.24.0", - "typescript": "^5.6.3" + "eslint": "^9.13.0", + "eslint-plugin-react": "^7.37.1", + "prettier": "^3.3.3" }, "dependencies": { - "@pyscript/core": "^0.6.7", + "@pyscript/core": "^0.5", "@reactpy/client": "^0.3.1", - "@rollup/plugin-typescript": "^12.1.1", - "morphdom": "^2.7.4", - "tslib": "^2.8.0" + "morphdom": "^2.7.4" } } diff --git a/src/js/rollup.config.mjs b/src/js/rollup.config.mjs deleted file mode 100644 index 5a6de090..00000000 --- a/src/js/rollup.config.mjs +++ /dev/null @@ -1,23 +0,0 @@ -import resolve from "@rollup/plugin-node-resolve"; -import commonjs from "@rollup/plugin-commonjs"; -import replace from "@rollup/plugin-replace"; -import typescript from "@rollup/plugin-typescript"; - -export default { - input: "src/index.tsx", - output: { - file: "../reactpy_django/static/reactpy_django/client.js", - format: "esm", - }, - plugins: [ - resolve(), - commonjs(), - replace({ - "process.env.NODE_ENV": JSON.stringify("production"), - }), - typescript(), - ], - onwarn: function (warning) { - console.warn(warning.message); - }, -}; diff --git a/src/js/tsconfig.json b/src/js/tsconfig.json deleted file mode 100644 index f1b84b50..00000000 --- a/src/js/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "esnext", - "moduleResolution": "node", - "jsx": "react", - "allowSyntheticDefaultImports": true - }, - "paths": { - "react": ["./node_modules/preact/compat/"], - "react-dom": ["./node_modules/preact/compat/"] - } -} diff --git a/src/reactpy_django/components.py b/src/reactpy_django/components.py index 3794ba73..98981730 100644 --- a/src/reactpy_django/components.py +++ b/src/reactpy_django/components.py @@ -215,7 +215,6 @@ def _view_to_iframe( { "src": reverse("reactpy:view_to_iframe", args=[dotted_path]) + query_string, "style": {"border": "none"}, - "onload": 'javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+"px";}(this));', "loading": "lazy", } | extra_props diff --git a/src/reactpy_django/pyscript/layout_handler.py b/src/reactpy_django/pyscript/layout_handler.py index da5bfb1b..479cb613 100644 --- a/src/reactpy_django/pyscript/layout_handler.py +++ b/src/reactpy_django/pyscript/layout_handler.py @@ -14,7 +14,7 @@ def __init__(self, uuid): self.uuid = uuid @staticmethod - def apply_update(update, root_model): + def update_model(update, root_model): """Apply an update ReactPy's internal DOM model.""" from jsonpointer import set_pointer @@ -23,21 +23,22 @@ def apply_update(update, root_model): else: root_model.update(update["model"]) - def render(self, layout, model): + def render_html(self, layout, model): """Submit ReactPy's internal DOM model into the HTML DOM.""" - import js from pyscript.js_modules import morphdom + import js + # Create a new container to render the layout into container = js.document.getElementById(f"pyscript-{self.uuid}") - temp_container = container.cloneNode(False) - self.build_element_tree(layout, temp_container, model) + temp_root_container = container.cloneNode(False) + self.build_element_tree(layout, temp_root_container, model) # Use morphdom to update the DOM - morphdom.default(container, temp_container) + morphdom.default(container, temp_root_container) # Remove the cloned container to prevent memory leaks - temp_container.remove() + temp_root_container.remove() def build_element_tree(self, layout, parent, model): """Recursively build an element tree, starting from the root component.""" @@ -131,8 +132,8 @@ async def run(self, workspace_function): self.delete_old_workspaces() root_model: dict = {} - async with Layout(workspace_function()) as layout: + async with Layout(workspace_function()) as root_layout: while True: - update = await layout.render() - self.apply_update(update, root_model) - self.render(layout, root_model) + update = await root_layout.render() + self.update_model(update, root_model) + self.render_html(root_layout, root_model) diff --git a/src/reactpy_django/templatetags/reactpy.py b/src/reactpy_django/templatetags/reactpy.py index 1fdfa6af..2f34651a 100644 --- a/src/reactpy_django/templatetags/reactpy.py +++ b/src/reactpy_django/templatetags/reactpy.py @@ -226,11 +226,11 @@ def pyscript_setup( extra_py: Dependencies that need to be loaded on the page for \ your PyScript components. Each dependency must be contained \ within it's own string and written in Python requirements file syntax. - + Kwargs: extra_js: A JSON string or Python dictionary containing a vanilla \ JavaScript module URL and the `name: str` to access it within \ - `pyscript.js_modules.*`. + `pyscript.js_modules.*`. config: A JSON string or Python dictionary containing PyScript \ configuration values. """ diff --git a/tests/test_app/__init__.py b/tests/test_app/__init__.py index 392e6066..27d5e41d 100644 --- a/tests/test_app/__init__.py +++ b/tests/test_app/__init__.py @@ -1,39 +1,59 @@ import shutil +import subprocess from pathlib import Path -from nodejs import npm - # Make sure the JS is always re-built before running the tests js_dir = Path(__file__).parent.parent.parent / "src" / "js" -assert npm.call(["install"], cwd=str(js_dir)) == 0 -assert npm.call(["run", "build"], cwd=str(js_dir)) == 0 +static_dir = ( + Path(__file__).parent.parent.parent + / "src" + / "reactpy_django" + / "static" + / "reactpy_django" +) +assert subprocess.run(["bun", "install"], cwd=str(js_dir), check=True).returncode == 0 +assert ( + subprocess.run( + ["bun", "build", "./src/index.tsx", "--outfile", str(static_dir / "client.js")], + cwd=str(js_dir), + check=True, + ).returncode + == 0 +) + + +# Make sure the test environment is always using the latest JS +def copy_js_files(source_dir: Path, destination: Path) -> None: + if destination.exists(): + shutil.rmtree(destination) + destination.mkdir() + + for file in source_dir.iterdir(): + if file.is_file(): + shutil.copy(file, destination / file.name) + else: + copy_js_files(file, destination / file.name) -# Make sure the current PyScript distribution is always available -pyscript_dist = js_dir / "node_modules" / "@pyscript" / "core" / "dist" -pyscript_static_dir = ( + +# Copy PyScript +copy_js_files( + js_dir / "node_modules" / "@pyscript" / "core" / "dist", Path(__file__).parent.parent.parent / "src" / "reactpy_django" / "static" / "reactpy_django" - / "pyscript" + / "pyscript", ) -if not pyscript_static_dir.exists(): - pyscript_static_dir.mkdir() -for file in pyscript_dist.iterdir(): - shutil.copy(file, pyscript_static_dir / file.name) - -# Make sure the current Morphdom distrubiton is always available -morphdom_dist = js_dir / "node_modules" / "morphdom" / "dist" -morphdom_static_dir = ( + + +# Copy MorphDOM +copy_js_files( + js_dir / "node_modules" / "morphdom" / "dist", Path(__file__).parent.parent.parent / "src" / "reactpy_django" / "static" / "reactpy_django" - / "morphdom" + / "morphdom", ) -if not morphdom_static_dir.exists(): - morphdom_static_dir.mkdir() -for file in morphdom_dist.iterdir(): - shutil.copy(file, morphdom_static_dir / file.name) From 95f8abf4b84e0ce4b5303afbbab5dadc23d52f70 Mon Sep 17 00:00:00 2001 From: Mark Bakhit Date: Tue, 22 Oct 2024 21:56:02 -0700 Subject: [PATCH 6/6] 5.0.0 (#255) --- .github/workflows/test-docs.yml | 12 ++++++------ CHANGELOG.md | 7 ++++++- src/reactpy_django/__init__.py | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test-docs.yml b/.github/workflows/test-docs.yml index 95d131c4..66a5c942 100644 --- a/.github/workflows/test-docs.yml +++ b/.github/workflows/test-docs.yml @@ -23,12 +23,12 @@ jobs: - uses: actions/setup-python@v5 with: python-version: 3.x - - name: Check docs links - uses: umbrelladocs/action-linkspector@v1 - with: - github_token: ${{ secrets.github_token }} - reporter: github-pr-review - fail_on_error: true + # - name: Check docs links + # uses: umbrelladocs/action-linkspector@v1 + # with: + # github_token: ${{ secrets.github_token }} + # reporter: github-pr-review + # fail_on_error: false - name: Check docs build run: | pip install -r requirements/build-docs.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 6680348a..5342e003 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,10 @@ Don't forget to remove deprecated code on each major release! ## [Unreleased] +- Nothing (yet)! + +## [5.0.0] - 2024-10-22 + ### Changed - Now using ReactPy-Router v1 for URL routing, which comes with a slightly different API than before. @@ -515,7 +519,8 @@ Don't forget to remove deprecated code on each major release! - Support for IDOM within the Django -[Unreleased]: https://github.com/reactive-python/reactpy-django/compare/4.0.0...HEAD +[Unreleased]: https://github.com/reactive-python/reactpy-django/compare/5.0.0...HEAD +[5.0.0]: https://github.com/reactive-python/reactpy-django/compare/4.0.0...5.0.0 [4.0.0]: https://github.com/reactive-python/reactpy-django/compare/3.8.1...4.0.0 [3.8.1]: https://github.com/reactive-python/reactpy-django/compare/3.8.0...3.8.1 [3.8.0]: https://github.com/reactive-python/reactpy-django/compare/3.7.0...3.8.0 diff --git a/src/reactpy_django/__init__.py b/src/reactpy_django/__init__.py index 77b56743..806428de 100644 --- a/src/reactpy_django/__init__.py +++ b/src/reactpy_django/__init__.py @@ -13,7 +13,7 @@ ) from reactpy_django.websocket.paths import REACTPY_WEBSOCKET_ROUTE -__version__ = "4.0.0" +__version__ = "5.0.0" __all__ = [ "REACTPY_WEBSOCKET_ROUTE", "html",