Merge branch 'main' into application-wizard-2-with-api-and-tests
* main: web: package up horizontal elements into their own components (#7053) core: bump django from 4.2.5 to 4.2.6 (#7066) translate: Updates for file locale/en/LC_MESSAGES/django.po in fr on branch main (#7065) web: bump postcss from 8.4.29 to 8.4.31 in /web (#7064) translate: Updates for file locale/en/LC_MESSAGES/django.po in zh-Hans on branch main (#7057) translate: Updates for file locale/en/LC_MESSAGES/django.po in zh_CN on branch main (#7056) web: bump pyright from 1.1.329 to 1.1.330 in /web (#7060) web: bump the storybook group in /web with 5 updates (#7059) web: bump the wdio group in /tests/wdio with 2 updates (#7063) core: bump duo-client from 5.0.1 to 5.1.0 (#7062) core: bump goauthentik.io/api/v3 from 3.2023083.3 to 3.2023083.4 (#7061) Add meta description to black box blog post (#7049) web/flows: fix plex login not opening new tab on mobile safari (#7050) web: bump API Client version (#7052) web/flows: bottom-align about text on flows page (#7051) core: bump codespell from 2.2.5 to 2.2.6 (#7046) core: bump coverage from 7.3.1 to 7.3.2 (#7047) web: laying the groundwork for future expansion (#7045)
This commit is contained in:
commit
3592aae3df
2
Makefile
2
Makefile
|
@ -78,7 +78,7 @@ install: web-install website-install ## Install all requires dependencies for `
|
|||
poetry install
|
||||
|
||||
dev-drop-db:
|
||||
echo dropdb -U ${pg_user} -h ${pg_host} ${pg_name}
|
||||
dropdb -U ${pg_user} -h ${pg_host} ${pg_name}
|
||||
# Also remove the test-db if it exists
|
||||
dropdb -U ${pg_user} -h ${pg_host} test_${pg_name} || true
|
||||
echo redis-cli -n 0 flushall
|
||||
|
|
|
@ -141,7 +141,7 @@ class BaseEvaluator:
|
|||
"""Create event with supplied data and try to extract as much relevant data
|
||||
from the context"""
|
||||
context = self._context.copy()
|
||||
# If the result was a complex variable, we don't want to re-use it
|
||||
# If the result was a complex variable, we don't want to reuse it
|
||||
context.pop("result", None)
|
||||
context.pop("handler", None)
|
||||
event_kwargs = context
|
||||
|
|
|
@ -380,7 +380,7 @@ class Outpost(SerializerModel, ManagedModel):
|
|||
managed=managed,
|
||||
)
|
||||
except IntegrityError:
|
||||
# Integrity error happens mostly when managed is re-used
|
||||
# Integrity error happens mostly when managed is reused
|
||||
Token.objects.filter(managed=managed).delete()
|
||||
Token.objects.filter(identifier=self.token_identifier).delete()
|
||||
return self.token
|
||||
|
|
|
@ -21,7 +21,7 @@ class OktaOAuth2Callback(OAuthCallback):
|
|||
"""Okta OAuth2 Callback"""
|
||||
|
||||
# Okta has the same quirk as azure and throws an error if the access token
|
||||
# is set via query parameter, so we re-use the azure client
|
||||
# is set via query parameter, so we reuse the azure client
|
||||
# see https://github.com/goauthentik/authentik/issues/1910
|
||||
client_class = UserprofileHeaderAuthClient
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ class TwitterClient(UserprofileHeaderAuthClient):
|
|||
the access token endpoint for some reason."""
|
||||
|
||||
# Twitter has the same quirk as azure and throws an error if the access token
|
||||
# is set via query parameter, so we re-use the azure client
|
||||
# is set via query parameter, so we reuse the azure client
|
||||
# see https://github.com/goauthentik/authentik/issues/1910
|
||||
|
||||
def get_access_token(self, **request_kwargs) -> Optional[dict[str, Any]]:
|
||||
|
|
|
@ -17,7 +17,7 @@ class Migration(migrations.Migration):
|
|||
help_text=(
|
||||
"When enabled, the Phone number is only used during enrollment to verify the"
|
||||
" users authenticity. Only a hash of the phone number is saved to ensure it is"
|
||||
" not re-used in the future."
|
||||
" not reused in the future."
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
@ -56,7 +56,7 @@ class AuthenticatorSMSStage(ConfigurableStage, FriendlyNamedStage, Stage):
|
|||
help_text=_(
|
||||
"When enabled, the Phone number is only used during enrollment to verify the "
|
||||
"users authenticity. Only a hash of the phone number is saved to ensure it is "
|
||||
"not re-used in the future."
|
||||
"not reused in the future."
|
||||
),
|
||||
)
|
||||
|
||||
|
|
|
@ -5884,7 +5884,7 @@
|
|||
"verify_only": {
|
||||
"type": "boolean",
|
||||
"title": "Verify only",
|
||||
"description": "When enabled, the Phone number is only used during enrollment to verify the users authenticity. Only a hash of the phone number is saved to ensure it is not re-used in the future."
|
||||
"description": "When enabled, the Phone number is only used during enrollment to verify the users authenticity. Only a hash of the phone number is saved to ensure it is not reused in the future."
|
||||
},
|
||||
"mapping": {
|
||||
"type": "integer",
|
||||
|
|
|
@ -96,7 +96,7 @@ func attemptProxyStart(ws *web.WebServer, u *url.URL) {
|
|||
continue
|
||||
}
|
||||
// Init tenant_tls here too since it requires an API Client,
|
||||
// so we just re-use the same one as the outpost uses
|
||||
// so we just reuse the same one as the outpost uses
|
||||
tw := tenant_tls.NewWatcher(ac.Client)
|
||||
go tw.Start()
|
||||
ws.TenantTLS = tw
|
||||
|
|
2
go.mod
2
go.mod
|
@ -26,7 +26,7 @@ require (
|
|||
github.com/sirupsen/logrus v1.9.3
|
||||
github.com/spf13/cobra v1.7.0
|
||||
github.com/stretchr/testify v1.8.4
|
||||
goauthentik.io/api/v3 v3.2023083.3
|
||||
goauthentik.io/api/v3 v3.2023083.4
|
||||
golang.org/x/exp v0.0.0-20230210204819-062eb4c674ab
|
||||
golang.org/x/oauth2 v0.12.0
|
||||
golang.org/x/sync v0.3.0
|
||||
|
|
4
go.sum
4
go.sum
|
@ -346,8 +346,8 @@ go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvx
|
|||
go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
|
||||
go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=
|
||||
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
|
||||
goauthentik.io/api/v3 v3.2023083.3 h1:nfHJ5/I/jZJ3o7BKnP5hZ8tYV4kkkWw/+5GkBCQ5UkE=
|
||||
goauthentik.io/api/v3 v3.2023083.3/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw=
|
||||
goauthentik.io/api/v3 v3.2023083.4 h1:WIi2+LFfBTvhxcbH/WqvhY/4EsX8bAN6mrPODq02B/w=
|
||||
goauthentik.io/api/v3 v3.2023083.4/go.mod h1:zz+mEZg8rY/7eEjkMGWJ2DnGqk+zqxuybGCGrR2O4Kw=
|
||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
|
||||
|
|
|
@ -65,7 +65,7 @@ def worker_exit(server: "Arbiter", worker: DjangoUvicornWorker):
|
|||
|
||||
|
||||
def on_starting(server: "Arbiter"):
|
||||
"""Attach a set of IDs that can be temporarily re-used.
|
||||
"""Attach a set of IDs that can be temporarily reused.
|
||||
Used on reloads when each worker exists twice."""
|
||||
server._worker_id_overload = set()
|
||||
|
||||
|
@ -79,7 +79,7 @@ def nworkers_changed(server: "Arbiter", new_value, old_value):
|
|||
|
||||
|
||||
def _next_worker_id(server: "Arbiter"):
|
||||
"""If there are IDs open for re-use, take one. Else look for a free one."""
|
||||
"""If there are IDs open for reuse, take one. Else look for a free one."""
|
||||
if server._worker_id_overload:
|
||||
return server._worker_id_overload.pop()
|
||||
|
||||
|
@ -90,7 +90,7 @@ def _next_worker_id(server: "Arbiter"):
|
|||
|
||||
|
||||
def on_reload(server: "Arbiter"):
|
||||
"""Add a full set of ids into overload so it can be re-used once."""
|
||||
"""Add a full set of ids into overload so it can be reused once."""
|
||||
server._worker_id_overload = set(range(1, server.cfg.workers + 1))
|
||||
|
||||
|
||||
|
|
|
@ -1857,7 +1857,7 @@ msgstr ""
|
|||
msgid ""
|
||||
"When enabled, the Phone number is only used during enrollment to verify the "
|
||||
"users authenticity. Only a hash of the phone number is saved to ensure it is "
|
||||
"not re-used in the future."
|
||||
"not reused in the future."
|
||||
msgstr ""
|
||||
|
||||
#: authentik/stages/authenticator_sms/models.py:68
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
# Titouan Petit, 2023
|
||||
# Kyllian Delaye-Maillot, 2023
|
||||
# Manuel Viens, 2023
|
||||
# Mordecai, 2023
|
||||
# Marc Schmitt, 2023
|
||||
#
|
||||
#, fuzzy
|
||||
|
@ -18,7 +19,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-09-15 09:51+0000\n"
|
||||
"POT-Creation-Date: 2023-10-02 12:46+0000\n"
|
||||
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
|
||||
"Last-Translator: Marc Schmitt, 2023\n"
|
||||
"Language-Team: French (https://app.transifex.com/authentik/teams/119923/fr/)\n"
|
||||
|
@ -422,35 +423,35 @@ msgstr "Distribué pour l'utilisateur"
|
|||
msgid "Event user"
|
||||
msgstr "Évènement utilisateur"
|
||||
|
||||
#: authentik/events/models.py:484
|
||||
#: authentik/events/models.py:491
|
||||
msgid "Notification Transport"
|
||||
msgstr "Transport de Notification"
|
||||
|
||||
#: authentik/events/models.py:485
|
||||
#: authentik/events/models.py:492
|
||||
msgid "Notification Transports"
|
||||
msgstr "Transports de notification"
|
||||
|
||||
#: authentik/events/models.py:491
|
||||
#: authentik/events/models.py:498
|
||||
msgid "Notice"
|
||||
msgstr "Note"
|
||||
|
||||
#: authentik/events/models.py:492
|
||||
#: authentik/events/models.py:499
|
||||
msgid "Warning"
|
||||
msgstr "Avertissement"
|
||||
|
||||
#: authentik/events/models.py:493
|
||||
#: authentik/events/models.py:500
|
||||
msgid "Alert"
|
||||
msgstr "Alerte"
|
||||
|
||||
#: authentik/events/models.py:518
|
||||
#: authentik/events/models.py:525
|
||||
msgid "Notification"
|
||||
msgstr "Notification"
|
||||
|
||||
#: authentik/events/models.py:519
|
||||
#: authentik/events/models.py:526
|
||||
msgid "Notifications"
|
||||
msgstr "Notifications"
|
||||
|
||||
#: authentik/events/models.py:529
|
||||
#: authentik/events/models.py:536
|
||||
msgid ""
|
||||
"Select which transports should be used to notify the user. If none are "
|
||||
"selected, the notification will only be shown in the authentik UI."
|
||||
|
@ -459,11 +460,11 @@ msgstr ""
|
|||
"défaut, la notification sera simplement affichée dans l'interface "
|
||||
"utilisateur authentik."
|
||||
|
||||
#: authentik/events/models.py:537
|
||||
#: authentik/events/models.py:544
|
||||
msgid "Controls which severity level the created notifications will have."
|
||||
msgstr "Contrôle quel niveau de sévérité les notifications créées auront."
|
||||
|
||||
#: authentik/events/models.py:542
|
||||
#: authentik/events/models.py:549
|
||||
msgid ""
|
||||
"Define which group of users this notification should be sent and shown to. "
|
||||
"If left empty, Notification won't ben sent."
|
||||
|
@ -471,19 +472,19 @@ msgstr ""
|
|||
"Définir à quel groupe d'utilisateur cette notification doit être envoyée et "
|
||||
"affichée. Si laissé vide, les notifications ne seront pas envoyées."
|
||||
|
||||
#: authentik/events/models.py:560
|
||||
#: authentik/events/models.py:567
|
||||
msgid "Notification Rule"
|
||||
msgstr "Règle de Notification"
|
||||
|
||||
#: authentik/events/models.py:561
|
||||
#: authentik/events/models.py:568
|
||||
msgid "Notification Rules"
|
||||
msgstr "Règles de notification"
|
||||
|
||||
#: authentik/events/models.py:581
|
||||
#: authentik/events/models.py:588
|
||||
msgid "Webhook Mapping"
|
||||
msgstr "Mappage de Webhook"
|
||||
|
||||
#: authentik/events/models.py:582
|
||||
#: authentik/events/models.py:589
|
||||
msgid "Webhook Mappings"
|
||||
msgstr "Mappages de Webhook"
|
||||
|
||||
|
@ -2074,7 +2075,7 @@ msgstr "Appareils Duo"
|
|||
msgid ""
|
||||
"When enabled, the Phone number is only used during enrollment to verify the "
|
||||
"users authenticity. Only a hash of the phone number is saved to ensure it is"
|
||||
" not re-used in the future."
|
||||
" not reused in the future."
|
||||
msgstr ""
|
||||
"Si activé, le numéro de téléphone n'est utilisé que durant l'inscription "
|
||||
"pour vérifier l'authenticité de l'utilisateur. Seul un hachage du numéro de "
|
||||
|
@ -2331,11 +2332,11 @@ msgstr "Pas d'utilisateurs en attente."
|
|||
msgid "Email sent."
|
||||
msgstr "Email envoyé."
|
||||
|
||||
#: authentik/stages/email/templates/email/account_confirmation.html:9
|
||||
#: authentik/stages/email/templates/email/account_confirmation.html:10
|
||||
msgid "Welcome!"
|
||||
msgstr "Bienvenue !"
|
||||
|
||||
#: authentik/stages/email/templates/email/account_confirmation.html:12
|
||||
#: authentik/stages/email/templates/email/account_confirmation.html:19
|
||||
msgid ""
|
||||
"We're excited to have you get started. First, you need to confirm your "
|
||||
"account. Just press the button below."
|
||||
|
@ -2343,11 +2344,11 @@ msgstr ""
|
|||
"Nous sommes ravis que vous puissiez commencer. Tout d'abord, vous devez "
|
||||
"confirmer votre compte. Il vous suffit d'appuyer sur le bouton ci-dessous."
|
||||
|
||||
#: authentik/stages/email/templates/email/account_confirmation.html:21
|
||||
#: authentik/stages/email/templates/email/account_confirmation.html:24
|
||||
msgid "Confirm Account"
|
||||
msgstr "Confirmer le Compte"
|
||||
|
||||
#: authentik/stages/email/templates/email/account_confirmation.html:30
|
||||
#: authentik/stages/email/templates/email/account_confirmation.html:36
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
|
@ -2358,52 +2359,52 @@ msgstr ""
|
|||
" Si cela ne fonctionne pas, copier et coller ce lien dans votre navigateur : %(url)s\n"
|
||||
" "
|
||||
|
||||
#: authentik/stages/email/templates/email/account_confirmation.html:35
|
||||
msgid ""
|
||||
"If you have any questions, just reply to this email—we're always happy to "
|
||||
"help out."
|
||||
msgstr ""
|
||||
"Si vous avez des questions, répondez simplement à cet e-email - nous sommes "
|
||||
"toujours heureux de vous aider."
|
||||
|
||||
#: authentik/stages/email/templates/email/generic.html:24
|
||||
msgid "Additional Information"
|
||||
msgstr "Informations Additionnelles"
|
||||
|
||||
#: authentik/stages/email/templates/email/password_reset.html:9
|
||||
#: authentik/stages/email/templates/email/event_notification.html:46
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" Hi %(username)s,\n"
|
||||
" "
|
||||
" This email was sent from the notification transport <code>%(name)s</code>.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Bonjour %(username)s,"
|
||||
" Cet email a été envoyé depuis le transport de notification <code>%(name)s</code>.\n"
|
||||
" "
|
||||
|
||||
#: authentik/stages/email/templates/email/password_reset.html:19
|
||||
#: authentik/stages/email/templates/email/password_reset.html:10
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" You recently requested to change your password for your authentik account. Use the button below to set a new password.\n"
|
||||
" "
|
||||
" Hi %(username)s,\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Vous avez récemment demandé à changer le mot de passe de votre compte authentik. Utilisez le bouton ci-dessous pour définir un nouveau mot de passe.\n"
|
||||
" "
|
||||
" Salut %(username)s,\n"
|
||||
" "
|
||||
|
||||
#: authentik/stages/email/templates/email/password_reset.html:33
|
||||
#: authentik/stages/email/templates/email/password_reset.html:21
|
||||
msgid ""
|
||||
"\n"
|
||||
" You recently requested to change your password for your authentik account. Use the button below to set a new password.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Vous avez récemment demandé à changer le mot de passe de votre compte authentik. Utilisez le bouton ci-dessous pour définir un nouveau mot de passe.\n"
|
||||
" "
|
||||
|
||||
#: authentik/stages/email/templates/email/password_reset.html:28
|
||||
msgid "Reset Password"
|
||||
msgstr "Réinitialiser le mot de passe"
|
||||
|
||||
#: authentik/stages/email/templates/email/password_reset.html:45
|
||||
#: authentik/stages/email/templates/email/password_reset.html:39
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" If you did not request a password change, please ignore this Email. The link above is valid for %(expires)s.\n"
|
||||
" "
|
||||
" If you did not request a password change, please ignore this Email. The link above is valid for %(expires)s.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Si vous n'avez pas requis de changement de mot de passe, veuillez ignorer cet e-mail. Le lien ci-dessus est valide pendant %(expires)s.\n"
|
||||
" "
|
||||
" Si vous n'avez pas requis de changement de mot de passe, veuillez ignorer cet e-mail. Le lien ci-dessus est valide pendant %(expires)s.\n"
|
||||
" "
|
||||
|
||||
#: authentik/stages/email/templates/email/setup.html:9
|
||||
msgid "authentik Test-Email"
|
||||
|
|
|
@ -2,14 +2,14 @@
|
|||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#
|
||||
# Translators:
|
||||
# Dany Sluijk, 2022
|
||||
# Alex Kruidenberg <alexkruidenberg@hotmail.com>, 2022
|
||||
# Melvin Snijders <mail@melvinsnijders.nl>, 2023
|
||||
# Michel Heusschen, 2023
|
||||
# ServusNL, 2023
|
||||
#
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
|
@ -2057,7 +2057,7 @@ msgstr "Duo-apparaten"
|
|||
msgid ""
|
||||
"When enabled, the Phone number is only used during enrollment to verify the "
|
||||
"users authenticity. Only a hash of the phone number is saved to ensure it is"
|
||||
" not re-used in the future."
|
||||
" not reused in the future."
|
||||
msgstr ""
|
||||
"Indien ingeschakeld, wordt het telefoonnummer alleen gebruikt tijdens "
|
||||
"inschrijving om de authenticiteit van de gebruiker te verifiëren. Alleen een"
|
||||
|
|
|
@ -1893,7 +1893,7 @@ msgstr "Duo 设备"
|
|||
msgid ""
|
||||
"When enabled, the Phone number is only used during enrollment to verify the "
|
||||
"users authenticity. Only a hash of the phone number is saved to ensure it is"
|
||||
" not re-used in the future."
|
||||
" not reused in the future."
|
||||
msgstr "启用时,电话号码仅在注册期间用于验证用户的真实性。仅保存电话号码的哈希,以确保将来不会重复使用。"
|
||||
|
||||
#: authentik/stages/authenticator_sms/models.py:68
|
||||
|
|
|
@ -1893,7 +1893,7 @@ msgstr "Duo 设备"
|
|||
msgid ""
|
||||
"When enabled, the Phone number is only used during enrollment to verify the "
|
||||
"users authenticity. Only a hash of the phone number is saved to ensure it is"
|
||||
" not re-used in the future."
|
||||
" not reused in the future."
|
||||
msgstr "启用时,电话号码仅在注册期间用于验证用户的真实性。仅保存电话号码的哈希,以确保将来不会重复使用。"
|
||||
|
||||
#: authentik/stages/authenticator_sms/models.py:68
|
||||
|
|
128
poetry.lock
generated
128
poetry.lock
generated
|
@ -882,17 +882,17 @@ testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"]
|
|||
|
||||
[[package]]
|
||||
name = "codespell"
|
||||
version = "2.2.5"
|
||||
version = "2.2.6"
|
||||
description = "Codespell"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "codespell-2.2.5-py3-none-any.whl", hash = "sha256:efa037f54b73c84f7bd14ce8e853d5f822cdd6386ef0ff32e957a3919435b9ec"},
|
||||
{file = "codespell-2.2.5.tar.gz", hash = "sha256:6d9faddf6eedb692bf80c9a94ec13ab4f5fb585aabae5f3750727148d7b5be56"},
|
||||
{file = "codespell-2.2.6-py3-none-any.whl", hash = "sha256:9ee9a3e5df0990604013ac2a9f22fa8e57669c827124a2e961fe8a1da4cacc07"},
|
||||
{file = "codespell-2.2.6.tar.gz", hash = "sha256:a8c65d8eb3faa03deabab6b3bbe798bea72e1799c7e9e955d57eca4096abcff9"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
dev = ["Pygments", "build", "chardet", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli"]
|
||||
dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"]
|
||||
hard-encoding-detection = ["chardet"]
|
||||
toml = ["tomli"]
|
||||
types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"]
|
||||
|
@ -921,63 +921,63 @@ files = [
|
|||
|
||||
[[package]]
|
||||
name = "coverage"
|
||||
version = "7.3.1"
|
||||
version = "7.3.2"
|
||||
description = "Code coverage measurement for Python"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "coverage-7.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3"},
|
||||
{file = "coverage-7.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276"},
|
||||
{file = "coverage-7.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e"},
|
||||
{file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f"},
|
||||
{file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392"},
|
||||
{file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887"},
|
||||
{file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d"},
|
||||
{file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136"},
|
||||
{file = "coverage-7.3.1-cp310-cp310-win32.whl", hash = "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f"},
|
||||
{file = "coverage-7.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520"},
|
||||
{file = "coverage-7.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3"},
|
||||
{file = "coverage-7.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375"},
|
||||
{file = "coverage-7.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9"},
|
||||
{file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593"},
|
||||
{file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8"},
|
||||
{file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0"},
|
||||
{file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce"},
|
||||
{file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3"},
|
||||
{file = "coverage-7.3.1-cp311-cp311-win32.whl", hash = "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a"},
|
||||
{file = "coverage-7.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c"},
|
||||
{file = "coverage-7.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc"},
|
||||
{file = "coverage-7.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832"},
|
||||
{file = "coverage-7.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969"},
|
||||
{file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26"},
|
||||
{file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204"},
|
||||
{file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037"},
|
||||
{file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760"},
|
||||
{file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f"},
|
||||
{file = "coverage-7.3.1-cp312-cp312-win32.whl", hash = "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a"},
|
||||
{file = "coverage-7.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92"},
|
||||
{file = "coverage-7.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f"},
|
||||
{file = "coverage-7.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981"},
|
||||
{file = "coverage-7.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465"},
|
||||
{file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344"},
|
||||
{file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7"},
|
||||
{file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40"},
|
||||
{file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086"},
|
||||
{file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff"},
|
||||
{file = "coverage-7.3.1-cp38-cp38-win32.whl", hash = "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3"},
|
||||
{file = "coverage-7.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e"},
|
||||
{file = "coverage-7.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1"},
|
||||
{file = "coverage-7.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6"},
|
||||
{file = "coverage-7.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4"},
|
||||
{file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745"},
|
||||
{file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7"},
|
||||
{file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0"},
|
||||
{file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0"},
|
||||
{file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8"},
|
||||
{file = "coverage-7.3.1-cp39-cp39-win32.whl", hash = "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140"},
|
||||
{file = "coverage-7.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981"},
|
||||
{file = "coverage-7.3.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194"},
|
||||
{file = "coverage-7.3.1.tar.gz", hash = "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952"},
|
||||
{file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"},
|
||||
{file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"},
|
||||
{file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"},
|
||||
{file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"},
|
||||
{file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"},
|
||||
{file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"},
|
||||
{file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"},
|
||||
{file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"},
|
||||
{file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"},
|
||||
{file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"},
|
||||
{file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"},
|
||||
{file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"},
|
||||
{file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"},
|
||||
{file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"},
|
||||
{file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"},
|
||||
{file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"},
|
||||
{file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"},
|
||||
{file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"},
|
||||
{file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"},
|
||||
{file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"},
|
||||
{file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"},
|
||||
{file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"},
|
||||
{file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"},
|
||||
{file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"},
|
||||
{file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"},
|
||||
{file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"},
|
||||
{file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"},
|
||||
{file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"},
|
||||
{file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"},
|
||||
{file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"},
|
||||
{file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"},
|
||||
{file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"},
|
||||
{file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"},
|
||||
{file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"},
|
||||
{file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"},
|
||||
{file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"},
|
||||
{file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"},
|
||||
{file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"},
|
||||
{file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"},
|
||||
{file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"},
|
||||
{file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"},
|
||||
{file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"},
|
||||
{file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"},
|
||||
{file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"},
|
||||
{file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"},
|
||||
{file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"},
|
||||
{file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"},
|
||||
{file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"},
|
||||
{file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"},
|
||||
{file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"},
|
||||
{file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"},
|
||||
{file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
|
@ -1125,13 +1125,13 @@ graph = ["objgraph (>=1.7.2)"]
|
|||
|
||||
[[package]]
|
||||
name = "django"
|
||||
version = "4.2.5"
|
||||
version = "4.2.6"
|
||||
description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "Django-4.2.5-py3-none-any.whl", hash = "sha256:b6b2b5cae821077f137dc4dade696a1c2aa292f892eca28fa8d7bfdf2608ddd4"},
|
||||
{file = "Django-4.2.5.tar.gz", hash = "sha256:5e5c1c9548ffb7796b4a8a4782e9a2e5a3df3615259fc1bfd3ebc73b646146c1"},
|
||||
{file = "Django-4.2.6-py3-none-any.whl", hash = "sha256:a64d2487cdb00ad7461434320ccc38e60af9c404773a2f95ab0093b4453a3215"},
|
||||
{file = "Django-4.2.6.tar.gz", hash = "sha256:08f41f468b63335aea0d904c5729e0250300f6a1907bf293a65499496cdbc68f"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
|
@ -1367,13 +1367,13 @@ files = [
|
|||
|
||||
[[package]]
|
||||
name = "duo-client"
|
||||
version = "5.0.1"
|
||||
version = "5.1.0"
|
||||
description = "Reference client for Duo Security APIs"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "duo_client-5.0.1-py2.py3-none-any.whl", hash = "sha256:8159b93a516979ae18e985bbca46ba3bf8ec27cd7ff6db464b37fa667d49c9b5"},
|
||||
{file = "duo_client-5.0.1.tar.gz", hash = "sha256:a13c47b0cb91e3a0d33b2f99271a0a6c2de17f92dd0ad4c649a366a0533db0c7"},
|
||||
{file = "duo_client-5.1.0-py2.py3-none-any.whl", hash = "sha256:5dd6e7a526ea79952c078e5a5be93a1d70d36e685fad9478188156587e85b571"},
|
||||
{file = "duo_client-5.1.0.tar.gz", hash = "sha256:0dd8b7223a105beca4fdbfa71d400e813d9f33250c3da5fd63e437fb571b55f2"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
|
|
|
@ -27436,7 +27436,7 @@ components:
|
|||
type: boolean
|
||||
description: When enabled, the Phone number is only used during enrollment
|
||||
to verify the users authenticity. Only a hash of the phone number is saved
|
||||
to ensure it is not re-used in the future.
|
||||
to ensure it is not reused in the future.
|
||||
mapping:
|
||||
type: string
|
||||
format: uuid
|
||||
|
@ -27493,7 +27493,7 @@ components:
|
|||
type: boolean
|
||||
description: When enabled, the Phone number is only used during enrollment
|
||||
to verify the users authenticity. Only a hash of the phone number is saved
|
||||
to ensure it is not re-used in the future.
|
||||
to ensure it is not reused in the future.
|
||||
mapping:
|
||||
type: string
|
||||
format: uuid
|
||||
|
@ -34530,7 +34530,7 @@ components:
|
|||
type: boolean
|
||||
description: When enabled, the Phone number is only used during enrollment
|
||||
to verify the users authenticity. Only a hash of the phone number is saved
|
||||
to ensure it is not re-used in the future.
|
||||
to ensure it is not reused in the future.
|
||||
mapping:
|
||||
type: string
|
||||
format: uuid
|
||||
|
|
636
tests/wdio/package-lock.json
generated
636
tests/wdio/package-lock.json
generated
|
@ -9,8 +9,8 @@
|
|||
"@trivago/prettier-plugin-sort-imports": "^4.2.0",
|
||||
"@typescript-eslint/eslint-plugin": "^6.7.4",
|
||||
"@typescript-eslint/parser": "^6.7.4",
|
||||
"@wdio/cli": "^8.16.18",
|
||||
"@wdio/local-runner": "^8.16.18",
|
||||
"@wdio/cli": "^8.16.19",
|
||||
"@wdio/local-runner": "^8.16.19",
|
||||
"@wdio/mocha-framework": "^8.16.17",
|
||||
"@wdio/spec-reporter": "^8.16.17",
|
||||
"eslint": "^8.49.0",
|
||||
|
@ -1067,14 +1067,14 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@wdio/cli": {
|
||||
"version": "8.16.18",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.16.18.tgz",
|
||||
"integrity": "sha512-BqVFyotsbm8fj2I3zGtCCdr1PozfDFO93uqYRO5EUMs3AFRuPbQXNmqybQhv/tPwolmajDYgFNA/ygyZqVlmzw==",
|
||||
"version": "8.16.19",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-8.16.19.tgz",
|
||||
"integrity": "sha512-MGpRrb56kp0n+r/Z0KMe0o4O1dFgBhhjt/O4HC5l0WcPuf5Ew19w1Nr8PoSZ5XqXklGJi0woFh68YZA1MziInA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/node": "^20.1.1",
|
||||
"@wdio/config": "8.16.17",
|
||||
"@wdio/globals": "8.16.18",
|
||||
"@wdio/globals": "8.16.19",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/protocols": "8.16.5",
|
||||
"@wdio/types": "8.16.12",
|
||||
|
@ -1093,7 +1093,7 @@
|
|||
"lodash.union": "^4.6.0",
|
||||
"read-pkg-up": "10.1.0",
|
||||
"recursive-readdir": "^2.2.3",
|
||||
"webdriverio": "8.16.18",
|
||||
"webdriverio": "8.16.19",
|
||||
"yargs": "^17.7.2",
|
||||
"yarn-install": "^1.0.0"
|
||||
},
|
||||
|
@ -1104,7 +1104,19 @@
|
|||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/cli/node_modules/@wdio/config": {
|
||||
"node_modules/@wdio/cli/node_modules/chalk": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
|
||||
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "^12.17.0 || ^14.13 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/config": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.17.tgz",
|
||||
"integrity": "sha512-9+AY73Dp6N/CHzUYe4KbYV8wcKh3mpzBsMKieNlwXi1bQ3AAirTjOXzQ2BoQn6fg/Yd1GxmT3F0YsVS+bF1PmQ==",
|
||||
|
@ -1123,241 +1135,29 @@
|
|||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/cli/node_modules/@wdio/globals": {
|
||||
"version": "8.16.18",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.16.18.tgz",
|
||||
"integrity": "sha512-sEeKIY5RDrQdp290/AjwM7xH1jxuzK6cydfvdZ428V1ud19i1liaSCBttbTs98FJQ3hSMiczidOyxEUAXtaluw==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"expect-webdriverio": "^4.2.5",
|
||||
"webdriverio": "8.16.18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/cli/node_modules/@wdio/logger": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.16.17.tgz",
|
||||
"integrity": "sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"chalk": "^5.1.2",
|
||||
"loglevel": "^1.6.0",
|
||||
"loglevel-plugin-prefix": "^0.8.4",
|
||||
"strip-ansi": "^7.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/cli/node_modules/@wdio/utils": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.17.tgz",
|
||||
"integrity": "sha512-jDyOrxbQRDJO0OPt9UBgnwpUIKqtRn4+R0gR5VSDrIG/in5ZZg28yer8urrIVY4yY9ut5r/22VaMHZI9LEXF5w==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@puppeteer/browsers": "^1.6.0",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/types": "8.16.12",
|
||||
"decamelize": "^6.0.0",
|
||||
"deepmerge-ts": "^5.1.0",
|
||||
"edgedriver": "^5.3.5",
|
||||
"geckodriver": "^4.2.0",
|
||||
"get-port": "^7.0.0",
|
||||
"got": "^13.0.0",
|
||||
"import-meta-resolve": "^3.0.0",
|
||||
"locate-app": "^2.1.0",
|
||||
"safaridriver": "^0.1.0",
|
||||
"split2": "^4.2.0",
|
||||
"wait-port": "^1.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/cli/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==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/cli/node_modules/chalk": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
|
||||
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "^12.17.0 || ^14.13 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/cli/node_modules/get-stream": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
|
||||
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/cli/node_modules/minimatch": {
|
||||
"version": "9.0.3",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
|
||||
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"brace-expansion": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16 || 14 >=14.17"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/cli/node_modules/webdriver": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.16.17.tgz",
|
||||
"integrity": "sha512-pG5aEqK6odI9Tr9pr0+1mN6iGqUu5uc5HTVbqbEM6CSX2g035JRVQ/tavFTegCF1HI6yIquHiwAqsfPgLciAnQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/node": "^20.1.0",
|
||||
"@types/ws": "^8.5.3",
|
||||
"@wdio/config": "8.16.17",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/protocols": "8.16.5",
|
||||
"@wdio/types": "8.16.12",
|
||||
"@wdio/utils": "8.16.17",
|
||||
"deepmerge-ts": "^5.1.0",
|
||||
"got": "^ 12.6.1",
|
||||
"ky": "^0.33.0",
|
||||
"ws": "^8.8.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/cli/node_modules/webdriver/node_modules/got": {
|
||||
"version": "12.6.1",
|
||||
"resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
|
||||
"integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@sindresorhus/is": "^5.2.0",
|
||||
"@szmarczak/http-timer": "^5.0.1",
|
||||
"cacheable-lookup": "^7.0.0",
|
||||
"cacheable-request": "^10.2.8",
|
||||
"decompress-response": "^6.0.0",
|
||||
"form-data-encoder": "^2.1.2",
|
||||
"get-stream": "^6.0.1",
|
||||
"http2-wrapper": "^2.1.10",
|
||||
"lowercase-keys": "^3.0.0",
|
||||
"p-cancelable": "^3.0.0",
|
||||
"responselike": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.16"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sindresorhus/got?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/cli/node_modules/webdriverio": {
|
||||
"version": "8.16.18",
|
||||
"resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.16.18.tgz",
|
||||
"integrity": "sha512-4HvywcNYJtEALbBQ7k5CE+XhiU2Ypr3hpd3P2wZkvN7+U2BSIS1cz9V1EtBDmR56e7pLz1La9kS1D3ShWm9NJA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/node": "^20.1.0",
|
||||
"@wdio/config": "8.16.17",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/protocols": "8.16.5",
|
||||
"@wdio/repl": "8.10.1",
|
||||
"@wdio/types": "8.16.12",
|
||||
"@wdio/utils": "8.16.17",
|
||||
"archiver": "^6.0.0",
|
||||
"aria-query": "^5.0.0",
|
||||
"css-shorthand-properties": "^1.1.1",
|
||||
"css-value": "^0.0.1",
|
||||
"devtools-protocol": "^0.0.1188743",
|
||||
"grapheme-splitter": "^1.0.2",
|
||||
"import-meta-resolve": "^3.0.0",
|
||||
"is-plain-obj": "^4.1.0",
|
||||
"lodash.clonedeep": "^4.5.0",
|
||||
"lodash.zip": "^4.2.0",
|
||||
"minimatch": "^9.0.0",
|
||||
"puppeteer-core": "^20.9.0",
|
||||
"query-selector-shadow-dom": "^1.0.0",
|
||||
"resq": "^1.9.1",
|
||||
"rgb2hex": "0.2.5",
|
||||
"serialize-error": "^11.0.1",
|
||||
"webdriver": "8.16.17"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"devtools": "^8.14.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"devtools": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/config": {
|
||||
"version": "8.16.12",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.12.tgz",
|
||||
"integrity": "sha512-trpIf4A3OyGKHwbOndkWogy4ph96LQxoNaF6wmypGwAj7mv523+HMICs7v6bheDNc/BHLksOnodNyZ7nb2y+vA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@wdio/logger": "8.11.0",
|
||||
"@wdio/types": "8.16.12",
|
||||
"@wdio/utils": "8.16.12",
|
||||
"decamelize": "^6.0.0",
|
||||
"deepmerge-ts": "^5.0.0",
|
||||
"glob": "^10.2.2",
|
||||
"import-meta-resolve": "^3.0.0",
|
||||
"read-pkg-up": "^10.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/globals": {
|
||||
"version": "8.16.12",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.16.12.tgz",
|
||||
"integrity": "sha512-n/FX3thfrygFH2aSrZAUDwT5hEQZ5GYg70vPiIgytmpW6OYNI3FMryO7/OJuB8HklHqIC+rGDly42rFD84BInQ==",
|
||||
"version": "8.16.19",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.16.19.tgz",
|
||||
"integrity": "sha512-KziZCYLcEvcsESJm2STkCEUKq2rhIbAP+1lyksULUdMsLoKhqW3yPrb8g6z3qj8G7yAYF8xWpKID0yQejl3UXA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"expect-webdriverio": "^4.2.5",
|
||||
"webdriverio": "8.16.12"
|
||||
"webdriverio": "8.16.19"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/local-runner": {
|
||||
"version": "8.16.18",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.16.18.tgz",
|
||||
"integrity": "sha512-mRYxIY4PWcL6+8deXSFeUkxA/dr8F+naCaxd6wENRLY6XQqaUJXDn/1RTaUx3ZVEwzyKfnXyX3melyzEKD5FLQ==",
|
||||
"version": "8.16.19",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.16.19.tgz",
|
||||
"integrity": "sha512-YUGF+7JCWoziFRW9/L+JSxuGKLgRiRXkRJ39iKaW97qS3MckBxLtuB4IY7gt3WJ80iDYo6IWLllRZfWtpvAT/A==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/node": "^20.1.0",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/repl": "8.10.1",
|
||||
"@wdio/runner": "8.16.18",
|
||||
"@wdio/runner": "8.16.19",
|
||||
"@wdio/types": "8.16.12",
|
||||
"async-exit-hook": "^2.0.1",
|
||||
"split2": "^4.1.0",
|
||||
|
@ -1367,7 +1167,7 @@
|
|||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/local-runner/node_modules/@wdio/logger": {
|
||||
"node_modules/@wdio/logger": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.16.17.tgz",
|
||||
"integrity": "sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==",
|
||||
|
@ -1382,33 +1182,6 @@
|
|||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/local-runner/node_modules/chalk": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
|
||||
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "^12.17.0 || ^14.13 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/logger": {
|
||||
"version": "8.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.11.0.tgz",
|
||||
"integrity": "sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"chalk": "^5.1.2",
|
||||
"loglevel": "^1.6.0",
|
||||
"loglevel-plugin-prefix": "^0.8.4",
|
||||
"strip-ansi": "^7.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/logger/node_modules/chalk": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
|
||||
|
@ -1438,58 +1211,6 @@
|
|||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/mocha-framework/node_modules/@wdio/logger": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.16.17.tgz",
|
||||
"integrity": "sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"chalk": "^5.1.2",
|
||||
"loglevel": "^1.6.0",
|
||||
"loglevel-plugin-prefix": "^0.8.4",
|
||||
"strip-ansi": "^7.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/mocha-framework/node_modules/@wdio/utils": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.17.tgz",
|
||||
"integrity": "sha512-jDyOrxbQRDJO0OPt9UBgnwpUIKqtRn4+R0gR5VSDrIG/in5ZZg28yer8urrIVY4yY9ut5r/22VaMHZI9LEXF5w==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@puppeteer/browsers": "^1.6.0",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/types": "8.16.12",
|
||||
"decamelize": "^6.0.0",
|
||||
"deepmerge-ts": "^5.1.0",
|
||||
"edgedriver": "^5.3.5",
|
||||
"geckodriver": "^4.2.0",
|
||||
"get-port": "^7.0.0",
|
||||
"got": "^13.0.0",
|
||||
"import-meta-resolve": "^3.0.0",
|
||||
"locate-app": "^2.1.0",
|
||||
"safaridriver": "^0.1.0",
|
||||
"split2": "^4.2.0",
|
||||
"wait-port": "^1.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/mocha-framework/node_modules/chalk": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
|
||||
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "^12.17.0 || ^14.13 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/protocols": {
|
||||
"version": "8.16.5",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.16.5.tgz",
|
||||
|
@ -1524,42 +1245,15 @@
|
|||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/reporter/node_modules/@wdio/logger": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.16.17.tgz",
|
||||
"integrity": "sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"chalk": "^5.1.2",
|
||||
"loglevel": "^1.6.0",
|
||||
"loglevel-plugin-prefix": "^0.8.4",
|
||||
"strip-ansi": "^7.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/reporter/node_modules/chalk": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
|
||||
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "^12.17.0 || ^14.13 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner": {
|
||||
"version": "8.16.18",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.16.18.tgz",
|
||||
"integrity": "sha512-c30CQQjb7xc7SwvZ9pvPRpt68y1evV9igo7prvrm8pUObibGDCJFwg1b8i19BmS8x4aMG2FOeQjHvjbgyAHixA==",
|
||||
"version": "8.16.19",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.16.19.tgz",
|
||||
"integrity": "sha512-CzLxlxcRfIVzTKGeo+TO5rUmmWHjUUdRaM6/6UGNFhFCcYW5rLvfHd1ojpU7ZKxBIc/bz2RGw2/cQ8KgQbFR3g==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/node": "^20.1.0",
|
||||
"@wdio/config": "8.16.17",
|
||||
"@wdio/globals": "8.16.18",
|
||||
"@wdio/globals": "8.16.19",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/types": "8.16.12",
|
||||
"@wdio/utils": "8.16.17",
|
||||
|
@ -1567,222 +1261,12 @@
|
|||
"expect-webdriverio": "^4.2.5",
|
||||
"gaze": "^1.1.2",
|
||||
"webdriver": "8.16.17",
|
||||
"webdriverio": "8.16.18"
|
||||
"webdriverio": "8.16.19"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner/node_modules/@wdio/config": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.17.tgz",
|
||||
"integrity": "sha512-9+AY73Dp6N/CHzUYe4KbYV8wcKh3mpzBsMKieNlwXi1bQ3AAirTjOXzQ2BoQn6fg/Yd1GxmT3F0YsVS+bF1PmQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/types": "8.16.12",
|
||||
"@wdio/utils": "8.16.17",
|
||||
"decamelize": "^6.0.0",
|
||||
"deepmerge-ts": "^5.0.0",
|
||||
"glob": "^10.2.2",
|
||||
"import-meta-resolve": "^3.0.0",
|
||||
"read-pkg-up": "^10.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner/node_modules/@wdio/globals": {
|
||||
"version": "8.16.18",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.16.18.tgz",
|
||||
"integrity": "sha512-sEeKIY5RDrQdp290/AjwM7xH1jxuzK6cydfvdZ428V1ud19i1liaSCBttbTs98FJQ3hSMiczidOyxEUAXtaluw==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"expect-webdriverio": "^4.2.5",
|
||||
"webdriverio": "8.16.18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner/node_modules/@wdio/logger": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.16.17.tgz",
|
||||
"integrity": "sha512-zeQ41z3T+b4IsrriZZipayXxLNDuGsm7TdExaviNGojPVrIsQUCSd/FvlLHM32b7ZrMyInHenu/zx1cjAZO71g==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"chalk": "^5.1.2",
|
||||
"loglevel": "^1.6.0",
|
||||
"loglevel-plugin-prefix": "^0.8.4",
|
||||
"strip-ansi": "^7.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner/node_modules/@wdio/utils": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.17.tgz",
|
||||
"integrity": "sha512-jDyOrxbQRDJO0OPt9UBgnwpUIKqtRn4+R0gR5VSDrIG/in5ZZg28yer8urrIVY4yY9ut5r/22VaMHZI9LEXF5w==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@puppeteer/browsers": "^1.6.0",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/types": "8.16.12",
|
||||
"decamelize": "^6.0.0",
|
||||
"deepmerge-ts": "^5.1.0",
|
||||
"edgedriver": "^5.3.5",
|
||||
"geckodriver": "^4.2.0",
|
||||
"get-port": "^7.0.0",
|
||||
"got": "^13.0.0",
|
||||
"import-meta-resolve": "^3.0.0",
|
||||
"locate-app": "^2.1.0",
|
||||
"safaridriver": "^0.1.0",
|
||||
"split2": "^4.2.0",
|
||||
"wait-port": "^1.0.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner/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==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner/node_modules/chalk": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
|
||||
"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "^12.17.0 || ^14.13 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/chalk?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner/node_modules/get-stream": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
|
||||
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner/node_modules/minimatch": {
|
||||
"version": "9.0.3",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
|
||||
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"brace-expansion": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=16 || 14 >=14.17"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner/node_modules/webdriver": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.16.17.tgz",
|
||||
"integrity": "sha512-pG5aEqK6odI9Tr9pr0+1mN6iGqUu5uc5HTVbqbEM6CSX2g035JRVQ/tavFTegCF1HI6yIquHiwAqsfPgLciAnQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/node": "^20.1.0",
|
||||
"@types/ws": "^8.5.3",
|
||||
"@wdio/config": "8.16.17",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/protocols": "8.16.5",
|
||||
"@wdio/types": "8.16.12",
|
||||
"@wdio/utils": "8.16.17",
|
||||
"deepmerge-ts": "^5.1.0",
|
||||
"got": "^ 12.6.1",
|
||||
"ky": "^0.33.0",
|
||||
"ws": "^8.8.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner/node_modules/webdriver/node_modules/got": {
|
||||
"version": "12.6.1",
|
||||
"resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
|
||||
"integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@sindresorhus/is": "^5.2.0",
|
||||
"@szmarczak/http-timer": "^5.0.1",
|
||||
"cacheable-lookup": "^7.0.0",
|
||||
"cacheable-request": "^10.2.8",
|
||||
"decompress-response": "^6.0.0",
|
||||
"form-data-encoder": "^2.1.2",
|
||||
"get-stream": "^6.0.1",
|
||||
"http2-wrapper": "^2.1.10",
|
||||
"lowercase-keys": "^3.0.0",
|
||||
"p-cancelable": "^3.0.0",
|
||||
"responselike": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.16"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sindresorhus/got?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/runner/node_modules/webdriverio": {
|
||||
"version": "8.16.18",
|
||||
"resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.16.18.tgz",
|
||||
"integrity": "sha512-4HvywcNYJtEALbBQ7k5CE+XhiU2Ypr3hpd3P2wZkvN7+U2BSIS1cz9V1EtBDmR56e7pLz1La9kS1D3ShWm9NJA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/node": "^20.1.0",
|
||||
"@wdio/config": "8.16.17",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/protocols": "8.16.5",
|
||||
"@wdio/repl": "8.10.1",
|
||||
"@wdio/types": "8.16.12",
|
||||
"@wdio/utils": "8.16.17",
|
||||
"archiver": "^6.0.0",
|
||||
"aria-query": "^5.0.0",
|
||||
"css-shorthand-properties": "^1.1.1",
|
||||
"css-value": "^0.0.1",
|
||||
"devtools-protocol": "^0.0.1188743",
|
||||
"grapheme-splitter": "^1.0.2",
|
||||
"import-meta-resolve": "^3.0.0",
|
||||
"is-plain-obj": "^4.1.0",
|
||||
"lodash.clonedeep": "^4.5.0",
|
||||
"lodash.zip": "^4.2.0",
|
||||
"minimatch": "^9.0.0",
|
||||
"puppeteer-core": "^20.9.0",
|
||||
"query-selector-shadow-dom": "^1.0.0",
|
||||
"resq": "^1.9.1",
|
||||
"rgb2hex": "0.2.5",
|
||||
"serialize-error": "^11.0.1",
|
||||
"webdriver": "8.16.17"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"devtools": "^8.14.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"devtools": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@wdio/spec-reporter": {
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/spec-reporter/-/spec-reporter-8.16.17.tgz",
|
||||
|
@ -1824,14 +1308,13 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@wdio/utils": {
|
||||
"version": "8.16.12",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.12.tgz",
|
||||
"integrity": "sha512-4hXgUF5iAscZKZ6uBcV12XkKi/eOXgvF76VkCTZ4qdeaiwFY27xcd8S3BSkAMKdbEgGygrpiTKoJzSt4K0AIHg==",
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.17.tgz",
|
||||
"integrity": "sha512-jDyOrxbQRDJO0OPt9UBgnwpUIKqtRn4+R0gR5VSDrIG/in5ZZg28yer8urrIVY4yY9ut5r/22VaMHZI9LEXF5w==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@puppeteer/browsers": "^1.6.0",
|
||||
"@wdio/logger": "8.11.0",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/types": "8.16.12",
|
||||
"decamelize": "^6.0.0",
|
||||
"deepmerge-ts": "^5.1.0",
|
||||
|
@ -3115,7 +2598,8 @@
|
|||
"version": "0.0.1188743",
|
||||
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1188743.tgz",
|
||||
"integrity": "sha512-FZDQC58vLiGR2mjSgsMzU8aEJieovMonIyxf38b775eYdIfAYgSzyAWnDf0Eq6ouF/L9qcbqR8jcQeIC34jp/w==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/diff": {
|
||||
"version": "5.1.0",
|
||||
|
@ -9210,19 +8694,18 @@
|
|||
}
|
||||
},
|
||||
"node_modules/webdriver": {
|
||||
"version": "8.16.12",
|
||||
"resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.16.12.tgz",
|
||||
"integrity": "sha512-v6I7S7y28QvtKEJL8ciVPJ7heh4GWTf+fS0/+dowBD2UrSFb3stC47U9idVqU18UNoQFQ2FbdWBaOLXSi9xlTg==",
|
||||
"version": "8.16.17",
|
||||
"resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.16.17.tgz",
|
||||
"integrity": "sha512-pG5aEqK6odI9Tr9pr0+1mN6iGqUu5uc5HTVbqbEM6CSX2g035JRVQ/tavFTegCF1HI6yIquHiwAqsfPgLciAnQ==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@types/node": "^20.1.0",
|
||||
"@types/ws": "^8.5.3",
|
||||
"@wdio/config": "8.16.12",
|
||||
"@wdio/logger": "8.11.0",
|
||||
"@wdio/config": "8.16.17",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/protocols": "8.16.5",
|
||||
"@wdio/types": "8.16.12",
|
||||
"@wdio/utils": "8.16.12",
|
||||
"@wdio/utils": "8.16.17",
|
||||
"deepmerge-ts": "^5.1.0",
|
||||
"got": "^ 12.6.1",
|
||||
"ky": "^0.33.0",
|
||||
|
@ -9237,7 +8720,6 @@
|
|||
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
|
||||
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
|
@ -9250,7 +8732,6 @@
|
|||
"resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
|
||||
"integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@sindresorhus/is": "^5.2.0",
|
||||
"@szmarczak/http-timer": "^5.0.1",
|
||||
|
@ -9272,24 +8753,23 @@
|
|||
}
|
||||
},
|
||||
"node_modules/webdriverio": {
|
||||
"version": "8.16.12",
|
||||
"resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.16.12.tgz",
|
||||
"integrity": "sha512-JglXAu7mhlWh3sexc4owKREQfuh8JFm9O+uPd8JXYaFmSLFX/PBhgPkhb9dLRRfX00oSeb3e8rVdQfcdqdQ2Iw==",
|
||||
"version": "8.16.19",
|
||||
"resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.16.19.tgz",
|
||||
"integrity": "sha512-b63vRWWuLq7OKYTLMdCn+uvTW48sMFepEyrv8MKFJproaSOCcokw7sqJ/EcQFmqIgrZxKL/mDch+QKjxlW0ORw==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"@types/node": "^20.1.0",
|
||||
"@wdio/config": "8.16.12",
|
||||
"@wdio/logger": "8.11.0",
|
||||
"@wdio/config": "8.16.17",
|
||||
"@wdio/logger": "8.16.17",
|
||||
"@wdio/protocols": "8.16.5",
|
||||
"@wdio/repl": "8.10.1",
|
||||
"@wdio/types": "8.16.12",
|
||||
"@wdio/utils": "8.16.12",
|
||||
"@wdio/utils": "8.16.17",
|
||||
"archiver": "^6.0.0",
|
||||
"aria-query": "^5.0.0",
|
||||
"css-shorthand-properties": "^1.1.1",
|
||||
"css-value": "^0.0.1",
|
||||
"devtools-protocol": "^0.0.1188743",
|
||||
"devtools-protocol": "^0.0.1203626",
|
||||
"grapheme-splitter": "^1.0.2",
|
||||
"import-meta-resolve": "^3.0.0",
|
||||
"is-plain-obj": "^4.1.0",
|
||||
|
@ -9301,7 +8781,7 @@
|
|||
"resq": "^1.9.1",
|
||||
"rgb2hex": "0.2.5",
|
||||
"serialize-error": "^11.0.1",
|
||||
"webdriver": "8.16.12"
|
||||
"webdriver": "8.16.17"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^16.13 || >=18"
|
||||
|
@ -9320,17 +8800,21 @@
|
|||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
||||
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/webdriverio/node_modules/devtools-protocol": {
|
||||
"version": "0.0.1203626",
|
||||
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1203626.tgz",
|
||||
"integrity": "sha512-nEzHZteIUZfGCZtTiS1fRpC8UZmsfD1SiyPvaUNvS13dvKf666OAm8YTi0+Ca3n1nLEyu49Cy4+dPWpaHFJk9g==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/webdriverio/node_modules/minimatch": {
|
||||
"version": "9.0.3",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
|
||||
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"brace-expansion": "^2.0.1"
|
||||
},
|
||||
|
|
|
@ -6,8 +6,8 @@
|
|||
"@trivago/prettier-plugin-sort-imports": "^4.2.0",
|
||||
"@typescript-eslint/eslint-plugin": "^6.7.4",
|
||||
"@typescript-eslint/parser": "^6.7.4",
|
||||
"@wdio/cli": "^8.16.18",
|
||||
"@wdio/local-runner": "^8.16.18",
|
||||
"@wdio/cli": "^8.16.19",
|
||||
"@wdio/local-runner": "^8.16.19",
|
||||
"@wdio/mocha-framework": "^8.16.17",
|
||||
"@wdio/spec-reporter": "^8.16.17",
|
||||
"eslint": "^8.49.0",
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
import AdminPage from "./admin.page.js";
|
||||
import { $ } from "@wdio/globals";
|
||||
|
||||
/**
|
||||
* sub page containing specific selectors and methods for a specific page
|
||||
*/
|
||||
class ApplicationsListPage extends AdminPage {
|
||||
/**
|
||||
* define selectors using getter methods
|
||||
*/
|
||||
|
||||
get startWizardButton() {
|
||||
return $('>>>ak-wizard-frame button[slot="trigger"]');
|
||||
}
|
||||
|
||||
async open() {
|
||||
return await super.open("if/admin/#/core/applications");
|
||||
}
|
||||
}
|
||||
|
||||
export default new ApplicationsListPage();
|
|
@ -1,4 +1,5 @@
|
|||
import Page from "../page.js";
|
||||
import { $ } from "@wdio/globals";
|
||||
|
||||
export class OauthForm extends Page {
|
||||
async setAuthorizationFlow(selector: string) {
|
||||
|
@ -8,6 +9,10 @@ export class OauthForm extends Page {
|
|||
`button*=${selector}`,
|
||||
);
|
||||
}
|
||||
|
||||
get providerName() {
|
||||
return $('>>>ak-form-element-horizontal[name="name"] input');
|
||||
}
|
||||
}
|
||||
|
||||
export default new OauthForm();
|
||||
|
|
|
@ -40,7 +40,7 @@ export default class Page {
|
|||
}
|
||||
|
||||
public async logout() {
|
||||
await browser.url('http://localhost:9000/flows/-/default/invalidation/');
|
||||
return await this.pause()
|
||||
await browser.url("http://localhost:9000/flows/-/default/invalidation/");
|
||||
return await this.pause();
|
||||
}
|
||||
}
|
||||
|
|
53
tests/wdio/test/pageobjects/provider-wizard.page.ts
Normal file
53
tests/wdio/test/pageobjects/provider-wizard.page.ts
Normal file
|
@ -0,0 +1,53 @@
|
|||
import AdminPage from "./admin.page.js";
|
||||
import OauthForm from "./forms/oauth.form.js";
|
||||
import { $ } from "@wdio/globals";
|
||||
|
||||
/**
|
||||
* sub page containing specific selectors and methods for a specific page
|
||||
*/
|
||||
|
||||
class ProviderWizardView extends AdminPage {
|
||||
/**
|
||||
* define selectors using getter methods
|
||||
*/
|
||||
|
||||
oauth = OauthForm;
|
||||
|
||||
get wizardTitle() {
|
||||
return $(">>>ak-wizard .pf-c-wizard__header h1.pf-c-title");
|
||||
}
|
||||
|
||||
get providerList() {
|
||||
return $(">>>ak-provider-wizard-initial");
|
||||
}
|
||||
|
||||
get nextButton() {
|
||||
return $(">>>ak-wizard footer button.pf-m-primary");
|
||||
}
|
||||
|
||||
async getProviderType(type: string) {
|
||||
return await this.providerList.$(`>>>input[value="${type}"]`);
|
||||
}
|
||||
|
||||
get successMessage() {
|
||||
return $('>>>[data-commit-state="success"]');
|
||||
}
|
||||
}
|
||||
|
||||
type Pair = [string, string];
|
||||
|
||||
// Define a getter for each provider type in the radio button collection.
|
||||
|
||||
const providerValues: Pair[] = [["oauth2", "oauth2Provider"]];
|
||||
|
||||
providerValues.forEach(([value, name]: Pair) => {
|
||||
Object.defineProperties(ProviderWizardView.prototype, {
|
||||
[name]: {
|
||||
get: function () {
|
||||
return this.providerList.$(`>>>input[id="ak-provider-${value}-form"]`);
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
export default new ProviderWizardView();
|
47
tests/wdio/test/pageobjects/providers-list.page.ts
Normal file
47
tests/wdio/test/pageobjects/providers-list.page.ts
Normal file
|
@ -0,0 +1,47 @@
|
|||
import AdminPage from "./admin.page.js";
|
||||
import { $, browser } from "@wdio/globals";
|
||||
import { Key } from "webdriverio";
|
||||
|
||||
/**
|
||||
* sub page containing specific selectors and methods for a specific page
|
||||
*/
|
||||
class ApplicationsListPage extends AdminPage {
|
||||
/**
|
||||
* define selectors using getter methods
|
||||
*/
|
||||
|
||||
get startWizardButton() {
|
||||
return $('>>>ak-wizard button[slot="trigger"]');
|
||||
}
|
||||
|
||||
get searchInput() {
|
||||
return $('>>>ak-table-search input[name="search"]');
|
||||
}
|
||||
|
||||
searchButton() {
|
||||
return $('>>>ak-table-search button[type="submit"]');
|
||||
}
|
||||
|
||||
// Sufficiently esoteric to justify having its own method
|
||||
async clickSearchButton() {
|
||||
await browser.execute(
|
||||
function (searchButton: unknown) {
|
||||
(searchButton as HTMLButtonElement).focus();
|
||||
},
|
||||
await $('>>>ak-table-search button[type="submit"]'),
|
||||
);
|
||||
|
||||
return await browser.action("key").down(Key.Enter).up(Key.Enter).perform();
|
||||
}
|
||||
|
||||
// Only use after a very precise search. :-)
|
||||
async findProviderRow() {
|
||||
return await $(">>>ak-provider-list td a");
|
||||
}
|
||||
|
||||
async open() {
|
||||
return await super.open("if/admin/#/core/providers");
|
||||
}
|
||||
}
|
||||
|
||||
export default new ApplicationsListPage();
|
46
tests/wdio/test/specs/oauth-provider.ts
Normal file
46
tests/wdio/test/specs/oauth-provider.ts
Normal file
|
@ -0,0 +1,46 @@
|
|||
import ProviderWizardView from "../pageobjects/provider-wizard.page.js";
|
||||
import ProvidersListPage from "../pageobjects/providers-list.page.js";
|
||||
import { randomId } from "../utils/index.js";
|
||||
import { login } from "../utils/login.js";
|
||||
import { expect } from "@wdio/globals";
|
||||
|
||||
async function reachTheProvider() {
|
||||
await ProvidersListPage.logout();
|
||||
await login();
|
||||
await ProvidersListPage.open();
|
||||
await expect(await ProvidersListPage.pageHeader).toHaveText("Providers");
|
||||
|
||||
await ProvidersListPage.startWizardButton.click();
|
||||
await ProviderWizardView.wizardTitle.waitForDisplayed();
|
||||
await expect(await ProviderWizardView.wizardTitle).toHaveText("New provider");
|
||||
}
|
||||
|
||||
describe("Configure Oauth2 Providers", () => {
|
||||
it("Should configure a simple LDAP Application", async () => {
|
||||
const newProviderName = `New OAuth2 Provider - ${randomId()}`;
|
||||
|
||||
await reachTheProvider();
|
||||
|
||||
await ProviderWizardView.providerList.waitForDisplayed();
|
||||
await ProviderWizardView.oauth2Provider.scrollIntoView();
|
||||
await ProviderWizardView.oauth2Provider.click();
|
||||
await ProviderWizardView.nextButton.click();
|
||||
await ProviderWizardView.pause();
|
||||
|
||||
await ProviderWizardView.oauth.providerName.setValue(newProviderName);
|
||||
await ProviderWizardView.oauth.setAuthorizationFlow(
|
||||
"default-provider-authorization-explicit-consent",
|
||||
);
|
||||
await ProviderWizardView.nextButton.click();
|
||||
await ProviderWizardView.pause();
|
||||
|
||||
await ProvidersListPage.searchInput.setValue(newProviderName);
|
||||
await ProvidersListPage.clickSearchButton();
|
||||
await ProvidersListPage.pause();
|
||||
|
||||
const newProvider = await ProvidersListPage.findProviderRow(newProviderName);
|
||||
await newProvider.waitForDisplayed();
|
||||
expect(newProvider).toExist();
|
||||
expect(await newProvider.getText()).toHaveText(newProviderName);
|
||||
});
|
||||
});
|
1915
web/package-lock.json
generated
1915
web/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -35,7 +35,7 @@
|
|||
"@codemirror/theme-one-dark": "^6.1.2",
|
||||
"@formatjs/intl-listformat": "^7.4.2",
|
||||
"@fortawesome/fontawesome-free": "^6.4.2",
|
||||
"@goauthentik/api": "^2023.8.3-1694987749",
|
||||
"@goauthentik/api": "^2023.8.3-1696335052",
|
||||
"@lit-labs/context": "^0.4.1",
|
||||
"@lit-labs/task": "^3.0.2",
|
||||
"@lit/localize": "^0.11.4",
|
||||
|
@ -79,11 +79,11 @@
|
|||
"@rollup/plugin-replace": "^5.0.2",
|
||||
"@rollup/plugin-terser": "^0.4.3",
|
||||
"@rollup/plugin-typescript": "^11.1.4",
|
||||
"@storybook/addon-essentials": "^7.4.5",
|
||||
"@storybook/addon-links": "^7.4.5",
|
||||
"@storybook/addon-essentials": "^7.4.6",
|
||||
"@storybook/addon-links": "^7.4.6",
|
||||
"@storybook/blocks": "^7.1.1",
|
||||
"@storybook/web-components": "^7.4.5",
|
||||
"@storybook/web-components-vite": "^7.4.5",
|
||||
"@storybook/web-components": "^7.4.6",
|
||||
"@storybook/web-components-vite": "^7.4.6",
|
||||
"@trivago/prettier-plugin-sort-imports": "^4.2.0",
|
||||
"@types/chart.js": "^2.9.38",
|
||||
"@types/codemirror": "5.60.10",
|
||||
|
@ -102,14 +102,14 @@
|
|||
"lit-analyzer": "^1.2.1",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"prettier": "^3.0.3",
|
||||
"pyright": "^1.1.329",
|
||||
"pyright": "^1.1.330",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"rollup": "^3.29.4",
|
||||
"rollup-plugin-copy": "^3.5.0",
|
||||
"rollup-plugin-cssimport": "^1.0.3",
|
||||
"rollup-plugin-postcss-lit": "^2.1.0",
|
||||
"storybook": "^7.4.5",
|
||||
"storybook": "^7.4.6",
|
||||
"storybook-addon-mock": "^4.3.0",
|
||||
"ts-lit-plugin": "^1.2.1",
|
||||
"tslib": "^2.6.2",
|
||||
|
|
|
@ -92,7 +92,7 @@ export class PolicyBindingForm extends ModelForm<PolicyBinding, string> {
|
|||
data.group = null;
|
||||
break;
|
||||
}
|
||||
console.log(data);
|
||||
|
||||
if (this.instance?.pk) {
|
||||
return new PoliciesApi(DEFAULT_CONFIG).policiesBindingsUpdate({
|
||||
policyBindingUuid: this.instance.pk,
|
||||
|
|
|
@ -190,7 +190,7 @@ export class ProxyProviderFormPage extends ModelForm<ProxyProvider, number> {
|
|||
case ProxyMode.ForwardSingle:
|
||||
return html`<p class="pf-u-mb-xl">
|
||||
${msg(
|
||||
"Use this provider with nginx's auth_request or traefik's forwardAuth. Each application/domain needs its own provider. Additionally, on each domain, /outpost.goauthentik.io must be routed to the outpost (when using a manged outpost, this is done for you).",
|
||||
"Use this provider with nginx's auth_request or traefik's forwardAuth. Each application/domain needs its own provider. Additionally, on each domain, /outpost.goauthentik.io must be routed to the outpost (when using a managed outpost, this is done for you).",
|
||||
)}
|
||||
</p>
|
||||
<ak-form-element-horizontal
|
||||
|
|
|
@ -79,7 +79,7 @@ html > form > input {
|
|||
.pf-c-login__footer {
|
||||
flex-grow: 2;
|
||||
display: flex;
|
||||
justify-content: start;
|
||||
justify-content: end;
|
||||
flex-direction: column;
|
||||
}
|
||||
.pf-c-login__footer ul.pf-c-list.pf-m-inline {
|
||||
|
|
|
@ -13,7 +13,7 @@ import { Application } from "@goauthentik/api";
|
|||
|
||||
@customElement("ak-app-icon")
|
||||
export class AppIcon extends AKElement {
|
||||
@property({ attribute: false })
|
||||
@property({ type: Object, attribute: false })
|
||||
app?: Application;
|
||||
|
||||
@property()
|
||||
|
|
|
@ -48,3 +48,5 @@ export class AkNumberInput extends AKElement {
|
|||
</ak-form-element-horizontal> `;
|
||||
}
|
||||
}
|
||||
|
||||
export default AkNumberInput;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import { AKElement } from "@goauthentik/elements/Base";
|
||||
import { RadioOption } from "@goauthentik/elements/forms/Radio";
|
||||
import "@goauthentik/elements/forms/Radio";
|
||||
|
||||
import { html, nothing } from "lit";
|
||||
import { customElement, property } from "lit/decorators.js";
|
||||
|
@ -35,13 +36,21 @@ export class AkRadioInput<T> extends AKElement {
|
|||
@property({ type: Array })
|
||||
options: RadioOption<T>[] = [];
|
||||
|
||||
handleInput(ev: CustomEvent) {
|
||||
this.value = ev.detail.value;
|
||||
}
|
||||
|
||||
render() {
|
||||
return html`<ak-form-element-horizontal
|
||||
label=${this.label}
|
||||
?required=${this.required}
|
||||
name=${this.name}
|
||||
>
|
||||
<ak-radio .options=${this.options} .value=${this.value}></ak-radio>
|
||||
<ak-radio
|
||||
.options=${this.options}
|
||||
.value=${this.value}
|
||||
@input=${this.handleInput}
|
||||
></ak-radio>
|
||||
${this.help.trim()
|
||||
? html`<p class="pf-c-form__helper-radio">${this.help}</p>`
|
||||
: nothing}
|
||||
|
|
|
@ -83,40 +83,46 @@ export class AkSlugInput extends AKElement {
|
|||
}
|
||||
|
||||
slugify(ev: Event) {
|
||||
if (!(ev && ev.target && ev.target instanceof HTMLInputElement)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Reset 'touched' status if the slug & target have been reset
|
||||
if (ev.target.value === "" && this.input.value === "") {
|
||||
this.touched = false;
|
||||
}
|
||||
|
||||
// Don't proceed if the user has hand-modified the slug
|
||||
if (this.touched) {
|
||||
return;
|
||||
}
|
||||
|
||||
// A very primitive heuristic: if the previous iteration of the slug and the current
|
||||
// iteration are *similar enough*, set the input value. "Similar enough" here is defined as
|
||||
// "any event which adds or removes a character but leaves the rest of the slug looking like
|
||||
// the previous iteration, set it to the current iteration."
|
||||
if (ev && ev.target && ev.target instanceof HTMLInputElement) {
|
||||
if (this.touched) {
|
||||
if (ev.target.value === "" && this.input.value === "") {
|
||||
this.touched = false;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
const newSlug = convertToSlug(ev.target.value);
|
||||
const oldSlug = this.input.value;
|
||||
const [shorter, longer] =
|
||||
newSlug.length < oldSlug.length ? [newSlug, oldSlug] : [oldSlug, newSlug];
|
||||
|
||||
const newSlug = convertToSlug(ev.target.value);
|
||||
const oldSlug = this.input.value;
|
||||
const [shorter, longer] =
|
||||
newSlug.length < oldSlug.length ? [newSlug, oldSlug] : [oldSlug, newSlug];
|
||||
if (longer.substring(0, shorter.length) === shorter) {
|
||||
this.input.value = newSlug;
|
||||
|
||||
// The browser, as a security measure, sets the originating HTML object to be the
|
||||
// target; developers cannot change it. In order to provide a meaningful value
|
||||
// to listeners, both the name and value of the host must match those of the target
|
||||
// input. The name is already handled since it's both required and automatically
|
||||
// forwarded to our templated input, but the value must also be set.
|
||||
this.value = this.input.value;
|
||||
this.dispatchEvent(
|
||||
new Event("input", {
|
||||
bubbles: true,
|
||||
cancelable: true,
|
||||
}),
|
||||
);
|
||||
}
|
||||
if (longer.substring(0, shorter.length) !== shorter) {
|
||||
return;
|
||||
}
|
||||
|
||||
// The browser, as a security measure, sets the originating HTML object to be the
|
||||
// target; developers cannot change it. In order to provide a meaningful value
|
||||
// to listeners, both the name and value of the host must match those of the target
|
||||
// input. The name is already handled since it's both required and automatically
|
||||
// forwarded to our templated input, but the value must also be set.
|
||||
|
||||
this.value = this.input.value = newSlug;
|
||||
this.dispatchEvent(
|
||||
new Event("input", {
|
||||
bubbles: true,
|
||||
cancelable: true,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
|
@ -160,3 +166,5 @@ export class AkSlugInput extends AKElement {
|
|||
</ak-form-element-horizontal> `;
|
||||
}
|
||||
}
|
||||
|
||||
export default AkSlugInput;
|
||||
|
|
|
@ -62,3 +62,5 @@ export class AkTextInput extends AKElement {
|
|||
</ak-form-element-horizontal> `;
|
||||
}
|
||||
}
|
||||
|
||||
export default AkTextInput;
|
||||
|
|
|
@ -54,3 +54,5 @@ ${this.value !== undefined ? this.value : ""}</textarea
|
|||
</ak-form-element-horizontal> `;
|
||||
}
|
||||
}
|
||||
|
||||
export default AkTextareaInput;
|
||||
|
|
38
web/src/components/stories/ak-app-icon.stories.ts
Normal file
38
web/src/components/stories/ak-app-icon.stories.ts
Normal file
|
@ -0,0 +1,38 @@
|
|||
import "@goauthentik/elements/messages/MessageContainer";
|
||||
import { Meta } from "@storybook/web-components";
|
||||
|
||||
import { TemplateResult, html } from "lit";
|
||||
|
||||
import "../ak-app-icon";
|
||||
import AkAppIcon from "../ak-app-icon";
|
||||
|
||||
const metadata: Meta<AkAppIcon> = {
|
||||
title: "Components / App Icon",
|
||||
component: "ak-app-icon",
|
||||
parameters: {
|
||||
docs: {
|
||||
description: {
|
||||
component: "A small card displaying an application icon",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default metadata;
|
||||
|
||||
const container = (testItem: TemplateResult) =>
|
||||
html` <div style="background: #000; padding: 2em">
|
||||
<style>
|
||||
li {
|
||||
display: block;
|
||||
}
|
||||
p {
|
||||
margin-top: 1em;
|
||||
}
|
||||
</style>
|
||||
${testItem}
|
||||
</div>`;
|
||||
|
||||
export const AppIcon = () => {
|
||||
return container(html`<ak-app-icon .app=${{ name: "Demo app" }} size="pf-m-md"></ak-app-icon>`);
|
||||
};
|
55
web/src/components/stories/ak-number-input.stories.ts
Normal file
55
web/src/components/stories/ak-number-input.stories.ts
Normal file
|
@ -0,0 +1,55 @@
|
|||
import "@goauthentik/elements/messages/MessageContainer";
|
||||
import { Meta } from "@storybook/web-components";
|
||||
|
||||
import { TemplateResult, html } from "lit";
|
||||
|
||||
import "../ak-number-input";
|
||||
import AkNumberInput from "../ak-number-input";
|
||||
|
||||
const metadata: Meta<AkNumberInput> = {
|
||||
title: "Components / Number Input",
|
||||
component: "ak-number-input",
|
||||
parameters: {
|
||||
docs: {
|
||||
description: {
|
||||
component: "A stylized value control for number input",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default metadata;
|
||||
|
||||
const container = (testItem: TemplateResult) =>
|
||||
html` <div style="background: #000; padding: 2em">
|
||||
<style>
|
||||
li {
|
||||
display: block;
|
||||
}
|
||||
p {
|
||||
margin-top: 1em;
|
||||
}
|
||||
</style>
|
||||
|
||||
${testItem}
|
||||
|
||||
<ul id="number-message-pad" style="color: #fff; margin-top: 1em"></ul>
|
||||
</div>`;
|
||||
|
||||
export const NumberInput = () => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const displayChange = (ev: any) => {
|
||||
document.getElementById(
|
||||
"number-message-pad",
|
||||
)!.innerText = `Value selected: ${JSON.stringify(ev.target.value, null, 2)}`;
|
||||
};
|
||||
|
||||
return container(
|
||||
html`<ak-number-input
|
||||
@input=${displayChange}
|
||||
label="Test Number Input"
|
||||
name="ak-test-number-input"
|
||||
help="This is where you would read the help messages"
|
||||
></ak-number-input>`,
|
||||
);
|
||||
};
|
|
@ -30,7 +30,9 @@ const container = (testItem: TemplateResult) =>
|
|||
margin-top: 1em;
|
||||
}
|
||||
</style>
|
||||
|
||||
${testItem}
|
||||
|
||||
<ul id="radio-message-pad" style="margin-top: 1em"></ul>
|
||||
</div>`;
|
||||
|
||||
|
@ -40,7 +42,7 @@ const testOptions = [
|
|||
{ label: "Option Three", description: html`This is option three.`, value: { weird: 3 } },
|
||||
];
|
||||
|
||||
export const ButtonWithSuccess = () => {
|
||||
export const RadioInput = () => {
|
||||
const result = "";
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
|
|
64
web/src/components/stories/ak-slug-input.stories.ts
Normal file
64
web/src/components/stories/ak-slug-input.stories.ts
Normal file
|
@ -0,0 +1,64 @@
|
|||
import "@goauthentik/elements/messages/MessageContainer";
|
||||
import { Meta } from "@storybook/web-components";
|
||||
|
||||
import { TemplateResult, html } from "lit";
|
||||
|
||||
import "../ak-slug-input";
|
||||
import AkSlugInput from "../ak-slug-input";
|
||||
import "../ak-text-input";
|
||||
|
||||
const metadata: Meta<AkSlugInput> = {
|
||||
title: "Components / Slug Input",
|
||||
component: "ak-slug-input",
|
||||
parameters: {
|
||||
docs: {
|
||||
description: {
|
||||
component: "A stylized value control for slug input",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default metadata;
|
||||
|
||||
const container = (testItem: TemplateResult) =>
|
||||
html` <div style="background: #000; padding: 2em">
|
||||
<style>
|
||||
li {
|
||||
display: block;
|
||||
}
|
||||
p {
|
||||
margin-top: 1em;
|
||||
}
|
||||
</style>
|
||||
|
||||
${testItem}
|
||||
|
||||
<ul id="text-message-pad" style="color: #fff; margin-top: 1em"></ul>
|
||||
</div>`;
|
||||
|
||||
export const SlugInput = () => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const displayChange = (ev: any) => {
|
||||
document.getElementById("text-message-pad")!.innerText = `Value selected: ${JSON.stringify(
|
||||
ev.target.value,
|
||||
null,
|
||||
2,
|
||||
)}`;
|
||||
};
|
||||
|
||||
return container(
|
||||
html`<ak-text-input
|
||||
label="Test Text Input"
|
||||
name="ak-test-text-input"
|
||||
help="Type your input here"
|
||||
></ak-text-input>
|
||||
<ak-slug-input
|
||||
@input=${displayChange}
|
||||
source="ak-text-input[name=ak-test-text-input]"
|
||||
label="Test Text Input"
|
||||
name="ak-test-text-input"
|
||||
help="Here should be the slugified version"
|
||||
></ak-slug-input> `,
|
||||
);
|
||||
};
|
63
web/src/components/stories/ak-switch-input.stories.ts
Normal file
63
web/src/components/stories/ak-switch-input.stories.ts
Normal file
|
@ -0,0 +1,63 @@
|
|||
import "@goauthentik/elements/messages/MessageContainer";
|
||||
import { Meta } from "@storybook/web-components";
|
||||
|
||||
import { TemplateResult, html } from "lit";
|
||||
|
||||
// Necessary because we're NOT supplying the CSS for the interiors
|
||||
// in our "light" dom.
|
||||
import PFSwitch from "@patternfly/patternfly/components/Switch/switch.css";
|
||||
|
||||
import "../ak-switch-input";
|
||||
import AkSwitchInput from "../ak-switch-input";
|
||||
|
||||
const metadata: Meta<AkSwitchInput> = {
|
||||
title: "Components / Switch Input",
|
||||
component: "ak-switch-input",
|
||||
parameters: {
|
||||
docs: {
|
||||
description: {
|
||||
component: "A stylized value control for a switch-like toggle",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default metadata;
|
||||
|
||||
const container = (testItem: TemplateResult) =>
|
||||
html` <div style="background: #fff; padding: 2em">
|
||||
<style>
|
||||
li {
|
||||
display: block;
|
||||
}
|
||||
p {
|
||||
margin-top: 1em;
|
||||
}
|
||||
${PFSwitch};
|
||||
</style>
|
||||
|
||||
${testItem}
|
||||
|
||||
<ul id="switch-message-pad" style="margin-top: 1em"></ul>
|
||||
</div>`;
|
||||
|
||||
export const SwitchInput = () => {
|
||||
const result = "";
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const displayChange = (ev: any) => {
|
||||
document.getElementById(
|
||||
"switch-message-pad",
|
||||
)!.innerText = `Value selected: ${JSON.stringify(ev.target.checked, null, 2)}`;
|
||||
};
|
||||
|
||||
return container(
|
||||
html`<ak-switch-input
|
||||
@input=${displayChange}
|
||||
name="ak-test-switch-input"
|
||||
label="Test Switch Toggle"
|
||||
help="This is where you would read the help messages"
|
||||
></ak-switch-input>
|
||||
<div>${result}</div>`,
|
||||
);
|
||||
};
|
57
web/src/components/stories/ak-text-input.stories.ts
Normal file
57
web/src/components/stories/ak-text-input.stories.ts
Normal file
|
@ -0,0 +1,57 @@
|
|||
import "@goauthentik/elements/messages/MessageContainer";
|
||||
import { Meta } from "@storybook/web-components";
|
||||
|
||||
import { TemplateResult, html } from "lit";
|
||||
|
||||
import "../ak-text-input";
|
||||
import AkTextInput from "../ak-text-input";
|
||||
|
||||
const metadata: Meta<AkTextInput> = {
|
||||
title: "Components / Text Input",
|
||||
component: "ak-text-input",
|
||||
parameters: {
|
||||
docs: {
|
||||
description: {
|
||||
component: "A stylized value control for text input",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default metadata;
|
||||
|
||||
const container = (testItem: TemplateResult) =>
|
||||
html` <div style="background: #000; padding: 2em">
|
||||
<style>
|
||||
li {
|
||||
display: block;
|
||||
}
|
||||
p {
|
||||
margin-top: 1em;
|
||||
}
|
||||
</style>
|
||||
|
||||
${testItem}
|
||||
|
||||
<ul id="text-message-pad" style="color: #fff; margin-top: 1em"></ul>
|
||||
</div>`;
|
||||
|
||||
export const TextInput = () => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const displayChange = (ev: any) => {
|
||||
document.getElementById("text-message-pad")!.innerText = `Value selected: ${JSON.stringify(
|
||||
ev.target.value,
|
||||
null,
|
||||
2,
|
||||
)}`;
|
||||
};
|
||||
|
||||
return container(
|
||||
html`<ak-text-input
|
||||
@input=${displayChange}
|
||||
label="Test Text Input"
|
||||
name="ak-test-text-input"
|
||||
help="This is where you would read the help messages"
|
||||
></ak-text-input>`,
|
||||
);
|
||||
};
|
55
web/src/components/stories/ak-textarea-input.stories.ts
Normal file
55
web/src/components/stories/ak-textarea-input.stories.ts
Normal file
|
@ -0,0 +1,55 @@
|
|||
import "@goauthentik/elements/messages/MessageContainer";
|
||||
import { Meta } from "@storybook/web-components";
|
||||
|
||||
import { TemplateResult, html } from "lit";
|
||||
|
||||
import "../ak-textarea-input";
|
||||
import AkTextareaInput from "../ak-textarea-input";
|
||||
|
||||
const metadata: Meta<AkTextareaInput> = {
|
||||
title: "Components / Textarea Input",
|
||||
component: "ak-textarea-input",
|
||||
parameters: {
|
||||
docs: {
|
||||
description: {
|
||||
component: "A stylized value control for textarea input",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default metadata;
|
||||
|
||||
const container = (testItem: TemplateResult) =>
|
||||
html` <div style="background: #000; padding: 2em">
|
||||
<style>
|
||||
li {
|
||||
display: block;
|
||||
}
|
||||
p {
|
||||
margin-top: 1em;
|
||||
}
|
||||
</style>
|
||||
|
||||
${testItem}
|
||||
|
||||
<ul id="textarea-message-pad" style="color: #fff; margin-top: 1em"></ul>
|
||||
</div>`;
|
||||
|
||||
export const TextareaInput = () => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const displayChange = (ev: any) => {
|
||||
document.getElementById(
|
||||
"textarea-message-pad",
|
||||
)!.innerText = `Value selected: ${JSON.stringify(ev.target.value, null, 2)}`;
|
||||
};
|
||||
|
||||
return container(
|
||||
html`<ak-textarea-input
|
||||
@input=${displayChange}
|
||||
label="Test Textarea Input"
|
||||
name="ak-test-textarea-input"
|
||||
help="This is where you would read the help messages"
|
||||
></ak-textarea-input>`,
|
||||
);
|
||||
};
|
|
@ -44,7 +44,6 @@ const container = (testItem: TemplateResult) =>
|
|||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const displayMessage = (result: any) => {
|
||||
console.log(result);
|
||||
const doc = new DOMParser().parseFromString(
|
||||
`<li><p><i>Event</i>: ${
|
||||
"result" in result.detail ? result.detail.result.key : result.detail.error
|
||||
|
|
|
@ -9,6 +9,8 @@ import PFForm from "@patternfly/patternfly/components/Form/form.css";
|
|||
import PFRadio from "@patternfly/patternfly/components/Radio/radio.css";
|
||||
import PFBase from "@patternfly/patternfly/patternfly-base.css";
|
||||
|
||||
import { randomId } from "../utils/randomId";
|
||||
|
||||
export interface RadioOption<T> {
|
||||
label: string;
|
||||
description?: TemplateResult;
|
||||
|
@ -27,6 +29,8 @@ export class Radio<T> extends CustomEmitterElement(AKElement) {
|
|||
@property({ attribute: false })
|
||||
value?: T;
|
||||
|
||||
internalId: string;
|
||||
|
||||
static get styles(): CSSResult[] {
|
||||
return [
|
||||
PFBase,
|
||||
|
@ -50,6 +54,7 @@ export class Radio<T> extends CustomEmitterElement(AKElement) {
|
|||
super();
|
||||
this.renderRadio = this.renderRadio.bind(this);
|
||||
this.buildChangeHandler = this.buildChangeHandler.bind(this);
|
||||
this.internalId = this.name || `radio-${randomId(8)}`;
|
||||
}
|
||||
|
||||
// Set the value if it's not set already. Property changes inside the `willUpdate()` method do
|
||||
|
@ -72,15 +77,14 @@ export class Radio<T> extends CustomEmitterElement(AKElement) {
|
|||
// This is a controlled input. Stop the native event from escaping or affecting the
|
||||
// value. We'll do that ourselves.
|
||||
ev.stopPropagation();
|
||||
ev.preventDefault();
|
||||
this.value = option.value;
|
||||
this.dispatchCustomEvent("change", option.value);
|
||||
this.dispatchCustomEvent("input", option.value);
|
||||
this.dispatchCustomEvent("change", { value: option.value });
|
||||
this.dispatchCustomEvent("input", { value: option.value });
|
||||
};
|
||||
}
|
||||
|
||||
renderRadio(option: RadioOption<T>) {
|
||||
const elId = `${this.name}-${option.value}`;
|
||||
renderRadio(option: RadioOption<T>, index: number) {
|
||||
const elId = `${this.internalId}-${index}`;
|
||||
const handler = this.buildChangeHandler(option);
|
||||
return html`<div class="pf-c-radio" @click=${handler}>
|
||||
<input
|
||||
|
|
8
web/src/elements/utils/randomId.ts
Normal file
8
web/src/elements/utils/randomId.ts
Normal file
|
@ -0,0 +1,8 @@
|
|||
export function randomId(length = 8) {
|
||||
let dt = new Date().getTime();
|
||||
return "x".repeat(length).replace(/x/g, (c) => {
|
||||
const r = (dt + Math.random() * 16) % 16 | 0;
|
||||
dt = Math.floor(dt / 16);
|
||||
return (c == "x" ? r : (r & 0x3) | 0x8).toString(16);
|
||||
});
|
||||
}
|
|
@ -11,6 +11,8 @@ import { WebsocketClient } from "@goauthentik/common/ws";
|
|||
import { Interface } from "@goauthentik/elements/Base";
|
||||
import "@goauthentik/elements/LoadingOverlay";
|
||||
import "@goauthentik/elements/ak-locale-context";
|
||||
import "@goauthentik/flow/sources/apple/AppleLoginInit";
|
||||
import "@goauthentik/flow/sources/plex/PlexLoginInit";
|
||||
import "@goauthentik/flow/stages/FlowErrorStage";
|
||||
import "@goauthentik/flow/stages/RedirectStage";
|
||||
import { StageHost } from "@goauthentik/flow/stages/base";
|
||||
|
@ -353,13 +355,11 @@ export class FlowExecutor extends Interface implements StageHost {
|
|||
></ak-stage-user-login>`;
|
||||
// Sources
|
||||
case "ak-source-plex":
|
||||
await import("@goauthentik/flow/sources/plex/PlexLoginInit");
|
||||
return html`<ak-flow-source-plex
|
||||
.host=${this as StageHost}
|
||||
.challenge=${this.challenge}
|
||||
></ak-flow-source-plex>`;
|
||||
case "ak-source-oauth-apple":
|
||||
await import("@goauthentik/flow/sources/apple/AppleLoginInit");
|
||||
return html`<ak-flow-source-oauth-apple
|
||||
.host=${this as StageHost}
|
||||
.challenge=${this.challenge}
|
||||
|
|
|
@ -155,7 +155,7 @@ According to the Microsoft team [contributing to Python](https://devblogs.micros
|
|||
|
||||
I know migration isn’t fun but when you’re making tradeoffs, it’s worth keeping it in mind as a future option. If the choice is to build now and migrate later instead of never building at all, I’m going to choose migration every time.
|
||||
|
||||
If we start running into truly significant performance issues – and I emphasize _if_ – we can always migrate critical parts of the application to a different language. This will of course be fully transparent to anyone running authentik, and I’d like to think of it as a last-resort, if we’ve already done all the opitmization possible.
|
||||
If we start running into truly significant performance issues – and I emphasize _if_ – we can always migrate critical parts of the application to a different language. This will of course be fully transparent to anyone running authentik, and I’d like to think of it as a last-resort, if we’ve already done all the optimization possible.
|
||||
|
||||
### Architect your application well
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
---
|
||||
title: Black box security software can’t keep up with open source
|
||||
description: "There will always be bugs and vulnerabilities in software. Accepting that, which distribution model gives you more confidence and flexibility?"
|
||||
slug: 2023-09-14-black-box-security-software-cant-keep-up-with-open-source
|
||||
authors:
|
||||
- name: Jens Langhammer
|
||||
|
|
|
@ -37,7 +37,7 @@ entries:
|
|||
# delete the object
|
||||
state: present
|
||||
# An optional list of boolean-like conditions. If all conditions match (or
|
||||
# no condiitons are provided) the entry will be evaluated and acted upon
|
||||
# no conditions are provided) the entry will be evaluated and acted upon
|
||||
# as normal. Otherwise, the entry is skipped as if not defined at all.
|
||||
# Each condition will be evaluated in Python to its boolean representation
|
||||
# bool(<condition>). Furthermore, complex conditions can be built using
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
title: "Templates"
|
||||
---
|
||||
|
||||
In technical docuemntation, there are document "types" (similar to how there are data types).
|
||||
In technical documentation, there are document "types" (similar to how there are data types).
|
||||
|
||||
The most common types are:
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ slug: "/releases/2021.8"
|
|||
- core: add new token intent and auth backend (#1284)
|
||||
- core: add token tests for invalid intent and token auth
|
||||
- core: fix token intent not defaulting correctly
|
||||
- core: handle error when ?for_user is not numberical
|
||||
- core: handle error when ?for_user is not numerical
|
||||
- lib: move id and key generators to lib (#1286)
|
||||
- lifecycle: rename to ak
|
||||
- outpost: handle non-existent permission
|
||||
|
|
|
@ -244,7 +244,7 @@ Changed response : **200 OK**
|
|||
- providers/oauth2: add x5c (#3556)
|
||||
- providers/proxy: fix routing based on signature in traefik and caddy
|
||||
- root: make redis persistent in docker-compose
|
||||
- root: re-use custom log helper from config and cleanup duplicate functions
|
||||
- root: reuse custom log helper from config and cleanup duplicate functions
|
||||
- root: shorten outpost docker healthcheck intervals
|
||||
- sources/ldap: start_tls before binding but without reading server info
|
||||
- sources/oauth: use GitHub's dedicated email API when no public email address is configured
|
||||
|
|
|
@ -48,6 +48,6 @@ On this page:
|
|||
|
||||
![Screenshot showing populated GitHub enterprise SAML settings](ghec_saml_settings.png)
|
||||
|
||||
Once these fields are populated, you can use the `Test SAML configuation` button to test the authentication flow. If the flow completes successfully, you will see a green tick next to the Test button.
|
||||
Once these fields are populated, you can use the `Test SAML configuration` button to test the authentication flow. If the flow completes successfully, you will see a green tick next to the Test button.
|
||||
|
||||
Scroll down to hit the `Save` button below.
|
||||
|
|
|
@ -42,7 +42,7 @@ On this page:
|
|||
- For `Public certificate`, paste the _full_ signing certificate into this field.
|
||||
- Verify that the `Signature method` and `Digest method` match your SAML provider settings in authentik.
|
||||
|
||||
Once these fields are populated, you can use the `Test SAML configuation` button to test the authentication flow. If the flow completes successfully, you will see a green tick next to the Test button.
|
||||
Once these fields are populated, you can use the `Test SAML configuration` button to test the authentication flow. If the flow completes successfully, you will see a green tick next to the Test button.
|
||||
|
||||
Scroll down to hit the `Save` button below.
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ The following placeholders will be used:
|
|||
- `organizr.company` is the FQDN of the Service install.
|
||||
- `authentik.company` is the FQDN of the authentik install.
|
||||
|
||||
Create a new user account _(or re-use an existing)_ for organizr to use for LDAP bind under _Directory_ -> _Users_ -> _Create_, in this example called `ldapservice`.
|
||||
Create a new user account _(or reuse an existing)_ for organizr to use for LDAP bind under _Directory_ -> _Users_ -> _Create_, in this example called `ldapservice`.
|
||||
|
||||
Note the DN of this user will be `cn=ldapservice,ou=users,dc=ldap,dc=goauthentik,dc=io`
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ The following placeholders will be used:
|
|||
|
||||
### Step 1 - Service account
|
||||
|
||||
Create a new user account _(or re-use an existing one)_ for ProFTPD to use for LDAP bind under _Directory_ -> _Users_ -> _Create_ and give the account a name, such as `ldapservice`.
|
||||
Create a new user account _(or reuse an existing one)_ for ProFTPD to use for LDAP bind under _Directory_ -> _Users_ -> _Create_ and give the account a name, such as `ldapservice`.
|
||||
|
||||
:::note
|
||||
On default provider settings, the DN of this user will be `cn=ldapservice,ou=users,dc=ldap,dc=goauthentik,dc=io`
|
||||
|
|
Reference in a new issue