diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dce39dfcb..07136bee5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,7 +37,7 @@ jobs: strategy: matrix: python-version: ["3.12"] - django-version: ["django42", "django52"] + django-version: ["django52"] steps: - uses: actions/checkout@v5 - uses: actions/setup-python@v6 @@ -47,7 +47,7 @@ jobs: - name: Setup Nodejs Env run: echo "NODE_VER=`cat .nvmrc`" >> $GITHUB_ENV - name: Setup Node - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: ${{ env.NODE_VER }} - name: Install Dependencies diff --git a/Makefile b/Makefile index c3ab5a1cd..7c404b64a 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,7 @@ export CUSTOM_COMPILE_COMMAND = make upgrade upgrade: piptools $(COMMON_CONSTRAINTS_TXT) ## update the requirements/*.txt files with the latest packages satisfying requirements/*.in sed '/^django-simple-history==/d' requirements/common_constraints.txt > requirements/common_constraints.tmp mv requirements/common_constraints.tmp requirements/common_constraints.txt - sed 's/Django<4.0//g' requirements/common_constraints.txt > requirements/common_constraints.tmp + sed 's/Django<5.0//g' requirements/common_constraints.txt > requirements/common_constraints.tmp mv requirements/common_constraints.tmp requirements/common_constraints.txt pip-compile --allow-unsafe --rebuild --upgrade -o requirements/pip.txt requirements/pip.in pip-compile --rebuild --upgrade -o requirements/pip_tools.txt requirements/pip_tools.in diff --git a/credentials/apps/credentials/admin.py b/credentials/apps/credentials/admin.py index bc7cf39bb..347d268ea 100644 --- a/credentials/apps/credentials/admin.py +++ b/credentials/apps/credentials/admin.py @@ -4,8 +4,10 @@ from credentials.apps.credentials.forms import ProgramCertificateAdminForm, SignatoryModelForm from credentials.apps.credentials.models import ( + CertificateAsset, CourseCertificate, ProgramCertificate, + ProgramCertificateTemplate, ProgramCompletionEmailConfiguration, RevokeCertificatesConfig, Signatory, @@ -117,6 +119,74 @@ class ProgramCompletionEmailConfigurationAdmin(TimeStampedModelAdminMixin, admin search_fields = ("identifier",) +@admin.register(ProgramCertificateTemplate) +class ProgramCertificateTemplateAdmin(TimeStampedModelAdminMixin, admin.ModelAdmin): + list_display = ("__str__", "organization", "is_active", "modified") + list_filter = ("is_active",) + list_select_related = ("program_certificate", "organization") + search_fields = ("organization__key", "program_certificate__program_uuid") + autocomplete_fields = ("program_certificate", "organization") + fieldsets = ( + ( + None, + { + "fields": ("is_active", "program_certificate", "organization"), + "description": ( + "Scope: set program_certificate for a specific program. " + "Optionally narrow to a specific organization. " + "Selection priority: exact cert+org > exact cert. " + "Requires waffle switch credentials.custom_program_certificate_templates to be active." + ), + }, + ), + ( + "Template HTML", + { + "fields": ("template",), + "description": ( + "Standalone Django template HTML rendered directly via from_string(). " + "All standard Django template tags and filters are available. " + "Use {% load certificate_assets %}{% certificate_asset_url 'slug' %} " + "to reference uploaded assets." + ), + }, + ), + ) + + +@admin.register(CertificateAsset) +class CertificateAssetAdmin(TimeStampedModelAdminMixin, admin.ModelAdmin): + list_display = ("slug", "description", "asset", "modified") + search_fields = ("slug", "description") + readonly_fields = TimeStampedModelAdminMixin.readonly_fields + ("asset_url_preview",) + fieldsets = ( + ( + None, + { + "fields": ("slug", "description", "asset"), + "description": ( + "Upload an asset and assign it a unique slug. " + "Reference it in a ProgramCertificateTemplate with: " + "{% load certificate_assets %}{% certificate_asset_url 'your-slug' %}" + ), + }, + ), + ( + "Preview", + {"fields": ("asset_url_preview",)}, + ), + ) + + def asset_url_preview(self, obj): + from django.utils.html import format_html + + if obj.pk and obj.asset: + return format_html('{url}', url=obj.asset.url) + return "—" + + asset_url_preview.short_description = "Asset URL" + + @admin.register(RevokeCertificatesConfig) class RevokeCertificatesConfigAdmin(ConfigurationModelAdmin): pass diff --git a/credentials/apps/credentials/migrations/0034_certificateasset_programcertificatetemplate.py b/credentials/apps/credentials/migrations/0034_certificateasset_programcertificatetemplate.py new file mode 100644 index 000000000..4f4ab171c --- /dev/null +++ b/credentials/apps/credentials/migrations/0034_certificateasset_programcertificatetemplate.py @@ -0,0 +1,51 @@ +# Generated by Django 5.2.7 on 2026-03-31 05:25 + +import credentials.apps.credentials.models +import django.db.models.deletion +import django_extensions.db.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('catalog', '0017_pathway_status_never_empty'), + ('credentials', '0033_remove_download_url'), + ] + + operations = [ + migrations.CreateModel( + name='CertificateAsset', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('description', models.CharField(help_text="Human-readable description of this asset (e.g. 'FBR Pakistan org logo – PNG 200×200').", max_length=255)), + ('asset', models.FileField(help_text='Upload an image (PNG/SVG/JPG), CSS file, or font file (TTF/WOFF/WOFF2).', upload_to=credentials.apps.credentials.models.certificate_asset_path)), + ('slug', models.SlugField(help_text="Unique identifier used to reference this asset in templates via {% certificate_asset_url 'your-slug' %}.", max_length=100, unique=True)), + ], + options={ + 'verbose_name': 'Certificate Asset', + 'verbose_name_plural': 'Certificate Assets', + 'ordering': ['slug'], + }, + ), + migrations.CreateModel( + name='ProgramCertificateTemplate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', django_extensions.db.fields.CreationDateTimeField(auto_now_add=True, verbose_name='created')), + ('modified', django_extensions.db.fields.ModificationDateTimeField(auto_now=True, verbose_name='modified')), + ('template', models.TextField(help_text="Standalone Django template HTML rendered directly via from_string(). Use {% load certificate_assets %}{% certificate_asset_url 'slug' %} to reference uploaded assets.")), + ('is_active', models.BooleanField(default=True)), + ('organization', models.ForeignKey(blank=True, help_text='If set, applies only to programs from this organization.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='certificate_templates', to='catalog.organization')), + ('program_certificate', models.ForeignKey(blank=True, help_text='If set, applies only to this specific program certificate.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='custom_templates', to='credentials.programcertificate')), + ], + options={ + 'verbose_name': 'Program Certificate Template', + 'verbose_name_plural': 'Program Certificate Templates', + 'ordering': ['-created'], + 'constraints': [models.UniqueConstraint(condition=models.Q(('is_active', True)), fields=('program_certificate', 'organization'), name='unique_active_template_per_program_org', violation_error_message='An active template for this program certificate and organization already exists.'), models.UniqueConstraint(condition=models.Q(('is_active', True), ('organization', None)), fields=('program_certificate',), name='unique_active_template_per_program_no_org', violation_error_message='An active template for this program certificate without an organization already exists.')], + }, + ), + ] diff --git a/credentials/apps/credentials/models.py b/credentials/apps/credentials/models.py index d482e1724..4e718120a 100644 --- a/credentials/apps/credentials/models.py +++ b/credentials/apps/credentials/models.py @@ -429,6 +429,149 @@ class UserCredentialDateOverride(TimeStampedModel): ) +class ProgramCertificateTemplate(TimeStampedModel): + """ + Stores custom Django template HTML for program certificates. + + Allows per-program and per-organization certificate template customization + via Django admin without touching files or rebuilding images. + Gated by the ``credentials.custom_program_certificate_templates`` waffle switch. + + Selection priority (most specific first): + 1. program_certificate + organization — exact program, specific org + 2. program_certificate only — exact program, any org + + The first active match wins. Falls back to file-based templates if no match. + + .. no_pii: + """ + + program_certificate = models.ForeignKey( + "ProgramCertificate", + null=True, + blank=True, + on_delete=models.CASCADE, + related_name="custom_templates", + help_text="If set, applies only to this specific program certificate.", + ) + organization = models.ForeignKey( + "catalog.Organization", + null=True, + blank=True, + on_delete=models.SET_NULL, + related_name="certificate_templates", + help_text="If set, applies only to programs from this organization.", + ) + template = models.TextField( + help_text=( + "Standalone Django template HTML rendered directly via from_string(). " + "Use {% load certificate_assets %}{% certificate_asset_url 'slug' %} " + "to reference uploaded assets." + ), + ) + is_active = models.BooleanField(default=True) + + class Meta: + ordering = ["-created"] + verbose_name = "Program Certificate Template" + verbose_name_plural = "Program Certificate Templates" + constraints = [ + # Prevents two active templates targeting the same program+org pair. + # Covers the case where organization is specified (NOT NULL). + models.UniqueConstraint( + fields=["program_certificate", "organization"], + condition=models.Q(is_active=True), + name="unique_active_template_per_program_org", + violation_error_message=( + "An active template for this program certificate and organization already exists." + ), + ), + # Prevents two active templates targeting the same program with no org scoping. + # Needed as a separate constraint because NULL != NULL in SQL unique indexes. + models.UniqueConstraint( + fields=["program_certificate"], + condition=models.Q(is_active=True, organization=None), + name="unique_active_template_per_program_no_org", + violation_error_message=( + "An active template for this program certificate without an organization already exists." + ), + ), + ] + + def __str__(self): + parts = [] + if self.program_certificate_id: + parts.append(f"program={self.program_certificate.program_uuid}") + if self.organization_id: + parts.append(f"org={self.organization.key}") + return f"ProgramCertificateTemplate({', '.join(parts) or 'default'})" + + +def get_custom_program_certificate_template(program_certificate, org_keys): + """ + Return the most specific active ProgramCertificateTemplate, or None. + + Selection priority: + 1. exact program_certificate + org match + 2. exact program_certificate, any org + """ + if not program_certificate: + return None + qs = ProgramCertificateTemplate.objects.filter(is_active=True) + org_qs = qs.filter(organization__key__in=org_keys) if org_keys else qs.none() + + candidates = [ + org_qs.filter(program_certificate=program_certificate).first(), + qs.filter(program_certificate=program_certificate, organization=None).first(), + ] + return next((c for c in candidates if c is not None), None) + + +def certificate_asset_path(instance, filename): + """Returns upload path for certificate assets: certificate_assets//.""" + return f"certificate_assets/{instance.slug}/{filename}" + + +class CertificateAsset(TimeStampedModel): + """ + Stores uploadable assets (images, CSS, fonts) for use in DB-backed program + certificate templates. + + Reference an asset inside a ``ProgramCertificateTemplate`` using the + ``certificate_asset_url`` template tag:: + + {% load certificate_assets %} + + + .. no_pii: + """ + + description = models.CharField( + max_length=255, + help_text="Human-readable description of this asset (e.g. 'FBR Pakistan org logo – PNG 200×200').", + ) + asset = models.FileField( + upload_to=certificate_asset_path, + help_text="Upload an image (PNG/SVG/JPG), CSS file, or font file (TTF/WOFF/WOFF2).", + ) + slug = models.SlugField( + max_length=100, + unique=True, + help_text=( + "Unique identifier used to reference this asset in templates via " + "{% certificate_asset_url 'your-slug' %}." + ), + ) + + class Meta: + ordering = ["slug"] + verbose_name = "Certificate Asset" + verbose_name_plural = "Certificate Assets" + + def __str__(self): + return f"CertificateAsset({self.slug})" + + class RevokeCertificatesConfig(ConfigurationModel): """ Manages configuration for a run of the revoke_certificates management command. diff --git a/credentials/apps/credentials/templatetags/certificate_assets.py b/credentials/apps/credentials/templatetags/certificate_assets.py new file mode 100644 index 000000000..982369020 --- /dev/null +++ b/credentials/apps/credentials/templatetags/certificate_assets.py @@ -0,0 +1,50 @@ +""" +Template tag for referencing uploaded CertificateAsset files inside +DB-backed ProgramCertificateTemplate HTML. + +Usage:: + + {% load certificate_assets %} + + {# Renders the asset URL, empty string if slug not found #} + FBR Logo + + {# CSS file #} + + + {# Font #} + +""" + +import logging + +from django import template + +log = logging.getLogger(__name__) + +register = template.Library() + + +@register.simple_tag +def certificate_asset_url(slug): + """ + Return the URL of the CertificateAsset with the given slug. + + Returns an empty string and logs a warning if the slug does not exist, + so a missing asset degrades gracefully rather than crashing the certificate page. + """ + # Import inside the function to avoid import-time issues when this tag + # is loaded by from_string() before the app registry is fully ready. + from credentials.apps.credentials.models import CertificateAsset # noqa: PLC0415 + + try: + asset = CertificateAsset.objects.get(slug=slug) + return asset.asset.url + except CertificateAsset.DoesNotExist: + log.warning("certificate_asset_url: no CertificateAsset found with slug=%r", slug) + return "" diff --git a/credentials/apps/credentials/toggles.py b/credentials/apps/credentials/toggles.py new file mode 100644 index 000000000..002f8f037 --- /dev/null +++ b/credentials/apps/credentials/toggles.py @@ -0,0 +1,20 @@ +""" +Waffle switches for the credentials app. +""" +from edx_toggles.toggles import WaffleSwitch + + +# .. toggle_name: credentials.custom_program_certificate_templates +# .. toggle_implementation: WaffleSwitch +# .. toggle_default: False +# .. toggle_description: When enabled, the credentials service checks the +# ProgramCertificateTemplate model for a custom HTML template before +# falling back to file-based certificate templates. Allows per-program +# and per-organization certificate customization via Django admin +# without touching files or rebuilding images. +# .. toggle_use_cases: open_edx +# .. toggle_creation_date: 2026-03-26 +CUSTOM_PROGRAM_CERTIFICATE_TEMPLATES = WaffleSwitch( + "credentials.custom_program_certificate_templates", + module_name=__name__, +) diff --git a/credentials/apps/credentials/views.py b/credentials/apps/credentials/views.py index fbb32661f..487619da1 100644 --- a/credentials/apps/credentials/views.py +++ b/credentials/apps/credentials/views.py @@ -7,6 +7,7 @@ from django.contrib.admin.views.decorators import staff_member_required from django.http import Http404 from django.shortcuts import get_object_or_404 +from django.template import engines from django.template.defaultfilters import slugify from django.utils import timezone from django.utils.decorators import method_decorator @@ -17,7 +18,12 @@ from credentials.apps.catalog.data import OrganizationDetails, ProgramDetails from credentials.apps.core.views import ThemeViewMixin from credentials.apps.credentials.exceptions import MissingCertificateLogoError -from credentials.apps.credentials.models import ProgramCertificate, UserCredential +from credentials.apps.credentials.models import ( + ProgramCertificate, + UserCredential, + get_custom_program_certificate_template, +) +from credentials.apps.credentials.toggles import CUSTOM_PROGRAM_CERTIFICATE_TEMPLATES from credentials.apps.credentials.utils import get_credential_visible_date, to_language @@ -200,18 +206,36 @@ def get_context_data(self, **kwargs): return context - def get_credential_template(self): - template_names = [] + @cached_property + def db_certificate_template(self): + """Return the active DB-backed ProgramCertificateTemplate for this credential, or None.""" + if not CUSTOM_PROGRAM_CERTIFICATE_TEMPLATES.is_enabled(): + return None credential_type = self.user_credential.credential + org_keys = [org.key for org in credential_type.program_details.organizations] + return get_custom_program_certificate_template( + program_certificate=credential_type, + org_keys=org_keys, + ) + + def get_credential_template(self): + if self.db_certificate_template: + return engines["django"].from_string(self.db_certificate_template.template) + # Fallback: file-based template lookup (existing behaviour). # NOTE: In the future we will need to account for other types of credentials besides programs. - template_names += [ + credential_type = self.user_credential.credential + template_names = [ f"credentials/programs/{credential_type.program_uuid}/certificate.html", "credentials/programs/{type}/certificate.html".format(type=slugify(credential_type.program_details.type)), ] - return self.select_theme_template(template_names) + def get_template_names(self): + if self.db_certificate_template: + return ["credentials/certificate_only.html"] + return super().get_template_names() + def get_child_templates(self): return { "credential": self.get_credential_template(), diff --git a/credentials/settings/base.py b/credentials/settings/base.py index d95f88cad..f2ecf8b50 100644 --- a/credentials/settings/base.py +++ b/credentials/settings/base.py @@ -456,7 +456,14 @@ FILE_STORAGE_BACKEND = {} EXTRA_APPS = [] SESSION_EXPIRE_AT_BROWSER_CLOSE = False -STATICFILES_STORAGE = "django.contrib.staticfiles.storage.ManifestStaticFilesStorage" +STORAGES = { + "default": { + "BACKEND": "django.core.files.storage.FileSystemStorage", + }, + "staticfiles": { + "BACKEND": "django.contrib.staticfiles.storage.ManifestStaticFilesStorage", + }, +} CACHES = { "default": { "BACKEND": "django.core.cache.backends.locmem.LocMemCache", @@ -474,7 +481,7 @@ } API_ROOT = None MEDIA_STORAGE_BACKEND = { - "DEFAULT_FILE_STORAGE": "django.core.files.storage.FileSystemStorage", + "STORAGES": STORAGES, "MEDIA_ROOT": MEDIA_ROOT, "MEDIA_URL": MEDIA_URL, } diff --git a/credentials/settings/devstack.py b/credentials/settings/devstack.py index a36b5939e..f9da5e589 100644 --- a/credentials/settings/devstack.py +++ b/credentials/settings/devstack.py @@ -43,10 +43,17 @@ EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend" EMAIL_FILE_PATH = "/tmp/credentials-emails" -DEFAULT_FILE_STORAGE = os.environ.get("DEFAULT_FILE_STORAGE", "django.core.files.storage.FileSystemStorage") -MEDIA_URL = os.environ.get("MEDIA_URL", "/media/") +defaultfile_storage = os.environ.get("DEFAULT_FILE_STORAGE") + +if defaultfile_storage: + STORAGES["default"]["BACKEND"] = defaultfile_storage + +staticfiles_storage = os.environ.get("STATICFILES_STORAGE") -STATICFILES_STORAGE = os.environ.get("STATICFILES_STORAGE", "django.contrib.staticfiles.storage.StaticFilesStorage") +if staticfiles_storage: + STORAGES["staticfiles"]["BACKEND"] = staticfiles_storage + +MEDIA_URL = os.environ.get("MEDIA_URL", "/media/") STATIC_URL = os.environ.get("STATIC_URL", "/static/") # OAuth2 variables specific to social-auth/SSO login use case. diff --git a/credentials/settings/production.py b/credentials/settings/production.py index 8b3ad8828..0cd258d99 100644 --- a/credentials/settings/production.py +++ b/credentials/settings/production.py @@ -44,9 +44,20 @@ vars().update(config_from_yaml) + FILE_STORAGE_BACKEND = config_from_yaml.get("FILE_STORAGE_BACKEND", {}) + default_backend = FILE_STORAGE_BACKEND.pop("DEFAULT_FILE_STORAGE", None) + static_backend = FILE_STORAGE_BACKEND.pop("STATICFILES_STORAGE", None) + # Load the files storage backend settings for django storages + # In django==4.2.24 following line sets the DEFAULT_FILE_STORAGE and other AWS variables as per YAML. vars().update(FILE_STORAGE_BACKEND) + if default_backend: + STORAGES["default"]["BACKEND"] = default_backend + + if static_backend: + STORAGES["staticfiles"]["BACKEND"] = static_backend + # make sure this happens after the configuration file overrides so format string can be overridden LOGGING = get_logger_config(format_string=LOGGING_FORMAT_STRING) diff --git a/credentials/settings/test.py b/credentials/settings/test.py index a522fc77b..153917228 100644 --- a/credentials/settings/test.py +++ b/credentials/settings/test.py @@ -35,7 +35,7 @@ # Local Directories TEST_ROOT = path("test_root") -DEFAULT_FILE_STORAGE = "django.core.files.storage.FileSystemStorage" + MEDIA_ROOT = str(TEST_ROOT / "uploads") MEDIA_URL = "/static/uploads/" @@ -49,7 +49,6 @@ "JWT_AUDIENCE": SOCIAL_AUTH_EDX_OAUTH2_KEY, } ) -STATICFILES_STORAGE = "django.contrib.staticfiles.storage.StaticFilesStorage" # Verifiable Credentials ENABLE_VERIFIABLE_CREDENTIALS = True diff --git a/credentials/templates/credentials/certificate_only.html b/credentials/templates/credentials/certificate_only.html new file mode 100644 index 000000000..ad4eef454 --- /dev/null +++ b/credentials/templates/credentials/certificate_only.html @@ -0,0 +1,35 @@ + +{% with render_language|default:"en" as page_language %} +{% load i18n %} + + + + + {{ page_title }} + + + +{% include child_templates.credential %} + + +{% endwith %} diff --git a/credentials/templates/credentials/programs/fbr-program/certificate.html b/credentials/templates/credentials/programs/fbr-program/certificate.html new file mode 100644 index 000000000..993cd018b --- /dev/null +++ b/credentials/templates/credentials/programs/fbr-program/certificate.html @@ -0,0 +1,276 @@ +{% load certificate_assets %} +{% load i18n %} + +{% certificate_asset_url 'irs-academy-logo-color' as left_logo_url %} +{% certificate_asset_url 'fbr-logo-color' as right_logo_url %} +{% certificate_asset_url 'irs-academy-logo-color' as watermark_url %} +{% certificate_asset_url 'font-algerian' as font_algerian_url %} +{% certificate_asset_url 'font-bookman-old-style' as font_bookman_url %} +{% certificate_asset_url 'font-monotype-corsiva' as font_corsiva_url %} +{% certificate_asset_url 'font-open-sans-400' as font_open_sans_400_url %} +{% certificate_asset_url 'font-open-sans-700' as font_open_sans_700_url %} + + + +
+ + + +
+ +
+ IRS Academy + FBR Pakistan +
+ +
+

{{ program_name }}

+
(21st April 2025 – {{ issue_date|date:"jS F Y" }})
+
+ +
{% trans "Certificate presented to" %}
+
+
+

{{ credential_name }}

+
+
+ +
+ {% trans "On successful completion of" %} {{ program_name }} {% trans "of" %} + {% trans "Inland Revenue Service (IRS) at Inland Revenue Service Academy," %} + {% trans "Lahore" %} +
+ +
+ {% for signatory in user_credential.credential.signatories.all %} +
+
+ {% if signatory.image %} + + {% endif %} +
+
+

{{ signatory.name }}

+

{{ signatory.title }}

+
+ {% endfor %} +
+ +
+
\ No newline at end of file diff --git a/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/Algerian Regular.ttf b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/Algerian Regular.ttf new file mode 100644 index 000000000..ebb574dcc Binary files /dev/null and b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/Algerian Regular.ttf differ diff --git a/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/Bookman Old Style Std Regular.otf b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/Bookman Old Style Std Regular.otf new file mode 100644 index 000000000..42b1eb2d7 Binary files /dev/null and b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/Bookman Old Style Std Regular.otf differ diff --git a/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/Monotype-Corsiva-Regular.ttf b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/Monotype-Corsiva-Regular.ttf new file mode 100644 index 000000000..c5c96668c Binary files /dev/null and b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/Monotype-Corsiva-Regular.ttf differ diff --git a/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/fbr-logo-color.png b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/fbr-logo-color.png new file mode 100644 index 000000000..4b8147c14 Binary files /dev/null and b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/fbr-logo-color.png differ diff --git a/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/irs-academy-logo-color.png b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/irs-academy-logo-color.png new file mode 100644 index 000000000..435ae2e66 Binary files /dev/null and b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/irs-academy-logo-color.png differ diff --git a/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/open-sans-latin-400-normal.ttf b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/open-sans-latin-400-normal.ttf new file mode 100644 index 000000000..903aa0d8d Binary files /dev/null and b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/open-sans-latin-400-normal.ttf differ diff --git a/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/open-sans-latin-700-normal.ttf b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/open-sans-latin-700-normal.ttf new file mode 100644 index 000000000..ae5454ece Binary files /dev/null and b/credentials/templates/credentials/programs/fbr-program/program-certificate-assets/open-sans-latin-700-normal.ttf differ diff --git a/credentials/templates/credentials/programs/fbr-program/program-certificate.png b/credentials/templates/credentials/programs/fbr-program/program-certificate.png new file mode 100644 index 000000000..549b7ef39 Binary files /dev/null and b/credentials/templates/credentials/programs/fbr-program/program-certificate.png differ diff --git a/package-lock.json b/package-lock.json index 08f3eb03e..8732767ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,25 +16,25 @@ "css-minimizer-webpack-plugin": "7.0.2", "file-loader": "6.2.0", "mini-css-extract-plugin": "2.9.4", - "sass": "1.92.1", - "sass-loader": "16.0.5", + "sass": "1.93.2", + "sass-loader": "16.0.6", "url-loader": "4.1.1", - "webpack": "5.101.3", + "webpack": "5.102.1", "webpack-bundle-tracker": "3.2.1" }, "devDependencies": { - "@babel/core": "7.28.4", - "@babel/eslint-parser": "7.28.4", + "@babel/core": "7.28.5", + "@babel/eslint-parser": "7.28.5", "@babel/plugin-proposal-object-rest-spread": "7.20.7", "@babel/plugin-transform-modules-commonjs": "7.27.1", "@babel/plugin-transform-object-assign": "7.27.1", - "@babel/preset-env": "7.28.3", + "@babel/preset-env": "7.28.5", "@edx/eslint-config": "4.4.0", "babel-loader": "10.0.0", "eslint": "8.57.1", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", - "jasmine-core": "5.10.0", + "jasmine-core": "5.12.0", "jasmine-jquery": "2.1.1", "karma": "6.4.4", "karma-coverage": "2.2.1", @@ -71,9 +71,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -81,21 +81,22 @@ } }, "node_modules/@babel/core": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -112,9 +113,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz", - "integrity": "sha512-Aa+yDiH87980jR6zvRfFuCR1+dLb00vBydhTL+zI992Rz/wQhSvuxjmOOuJOgO3XmakO6RykRGD2S1mq1AtgHA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.5.tgz", + "integrity": "sha512-fcdRcWahONYo+JRnJg1/AekOacGvKx12Gu0qXJXFi2WBqQA1i7+O5PaxRB7kxE/Op94dExnCiiar6T09pvdHpA==", "dev": true, "license": "MIT", "dependencies": { @@ -131,14 +132,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -399,9 +400,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -448,13 +449,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -464,14 +465,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -707,9 +708,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "dev": true, "license": "MIT", "dependencies": { @@ -757,9 +758,9 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", - "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "dev": true, "license": "MIT", "dependencies": { @@ -768,7 +769,7 @@ "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -795,14 +796,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -895,9 +896,9 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "dev": true, "license": "MIT", "dependencies": { @@ -994,9 +995,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "dev": true, "license": "MIT", "dependencies": { @@ -1060,16 +1061,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1177,9 +1178,9 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -1187,7 +1188,7 @@ "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1230,9 +1231,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1314,9 +1315,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", - "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "dev": true, "license": "MIT", "dependencies": { @@ -1511,17 +1512,17 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", - "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.0", + "@babel/compat-data": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", @@ -1534,42 +1535,42 @@ "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-block-scoping": "^7.28.5", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.28.3", - "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regenerator": "^7.28.4", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -1648,18 +1649,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -1667,14 +1668,14 @@ } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -1908,6 +1909,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" }, @@ -1930,6 +1932,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": "^14 || ^16 || >=18" } @@ -2073,7 +2076,6 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.0.tgz", "integrity": "sha512-6ueQTeJZtwKjmh23bdkq/DMqH4l4bmfvtQH98blOSbiXv/OUiyijSW6jU22IT8BNM1ujCaEvJfTtyCYVH38EMQ==", - "peer": true, "dependencies": { "@formatjs/intl-localematcher": "0.4.0", "tslib": "^2.4.0" @@ -2083,7 +2085,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -2092,7 +2093,6 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.0.tgz", "integrity": "sha512-yT6at0qc0DANw9qM/TU8RZaCtfDXtj4pZM/IC2WnVU80yAcliS3KVDiuUt4jSQAeFL9JS5bc2hARnFmjPdA6qw==", - "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "1.17.0", "@formatjs/icu-skeleton-parser": "1.6.0", @@ -2103,7 +2103,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.0.tgz", "integrity": "sha512-eMmxNpoX/J1IPUjPGSZwo0Wh+7CEvdEMddP2Jxg1gQJXfGfht/FdW2D5XDFj3VMbOTUQlDIdZJY7uC6O6gjPoA==", - "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "1.17.0", "tslib": "^2.4.0" @@ -2113,7 +2112,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.9.0.tgz", "integrity": "sha512-Ym0trUoC/VO6wQu4YHa0H1VR2tEixFRmwZgADkDLm7nD+vv1Ob+/88mUAoT0pwvirFqYKgUKEwp1tFepqyqvVA==", - "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "1.17.0", "@formatjs/fast-memoize": "2.2.0", @@ -2136,7 +2134,6 @@ "version": "6.5.0", "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.5.0.tgz", "integrity": "sha512-sg/nR8ILEdUl+2sWu6jc1nQ5s04yucGlH1RVfatW8TSJ5uG3Yy3vgigi8NNC/BuhcncUNPWqSpTCSI1hA+rhiw==", - "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "1.17.0", "@formatjs/intl-localematcher": "0.4.0", @@ -2147,7 +2144,6 @@ "version": "7.4.0", "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.4.0.tgz", "integrity": "sha512-ifupb+balZUAF/Oh3QyGRqPRWGSKwWoMPR0cYZEG7r61SimD+m38oFQqVx/3Fp7LfQFF11m7IS+MlxOo2sKINA==", - "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "1.17.0", "@formatjs/intl-localematcher": "0.4.0", @@ -2158,7 +2154,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.0.tgz", "integrity": "sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==", - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -2521,9 +2516,9 @@ } }, "node_modules/@openedx/paragon": { - "version": "23.14.2", - "resolved": "https://registry.npmjs.org/@openedx/paragon/-/paragon-23.14.2.tgz", - "integrity": "sha512-mBsoH9nwt4VGkoE9y33BrSJsjTzWlKjooWGXeJng4LdFNnBy7bhtEvRENQ9/0L0/trWhEMZffAMP7h9HBfg5EQ==", + "version": "23.15.2", + "resolved": "https://registry.npmjs.org/@openedx/paragon/-/paragon-23.15.2.tgz", + "integrity": "sha512-qHiEwcBBmvlXQ13j+bE3VaL9UEpb37ZLpR3+iryiWb+GZPva9VhZkvTMHORklD3jcFCoNt2TkKWZ906sxPJ0zw==", "license": "Apache-2.0", "workspaces": [ "example", @@ -2535,7 +2530,7 @@ "dependencies": { "@popperjs/core": "^2.11.4", "@tokens-studio/sd-transforms": "^1.2.4", - "axios": "^0.27.2", + "axios": "^0.30.2", "bootstrap": "^4.6.2", "chalk": "^4.1.2", "child_process": "^1.0.2", @@ -2544,7 +2539,7 @@ "cli-progress": "^3.12.0", "commander": "^9.4.1", "email-prop-type": "^3.0.0", - "file-selector": "^0.6.0", + "file-selector": "^0.10.0", "glob": "^8.0.3", "inquirer": "^8.2.5", "js-toml": "^1.0.0", @@ -2569,11 +2564,11 @@ "react-loading-skeleton": "^3.1.0", "react-popper": "^2.2.5", "react-proptype-conditional-require": "^1.0.4", - "react-responsive": "^8.2.0", + "react-responsive": "^10.0.0", "react-table": "^7.7.0", "react-transition-group": "^4.4.2", "sass": "^1.58.3", - "style-dictionary": "^4.3.2", + "style-dictionary": "^4.4.0", "tabbable": "^5.3.3", "uncontrollable": "^7.2.1", "uuid": "^9.0.0" @@ -2596,6 +2591,18 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/@openedx/paragon/node_modules/file-selector": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.10.0.tgz", + "integrity": "sha512-iXLQxZTDe9qtBDkpaU4msOWNbh/4JxYSux7BsVxgt+0HBCpj9qPUFjD3SDBPLCJDoU3MsJh1i+CseQ/9488F/A==", + "license": "MIT", + "dependencies": { + "tslib": "^2.7.0" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/@parcel/watcher": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", @@ -2884,6 +2891,7 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -3006,7 +3014,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "peer": true, "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -3088,8 +3095,7 @@ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/warning": { "version": "3.0.0", @@ -3115,7 +3121,6 @@ "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -3151,7 +3156,6 @@ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -3194,7 +3198,6 @@ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" @@ -3213,7 +3216,6 @@ "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", "@typescript-eslint/utils": "5.62.0", @@ -3242,7 +3244,6 @@ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3257,7 +3258,6 @@ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", @@ -3286,7 +3286,6 @@ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -3300,7 +3299,6 @@ "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -3328,7 +3326,6 @@ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -3342,7 +3339,6 @@ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" @@ -3361,7 +3357,6 @@ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3615,6 +3610,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3647,6 +3643,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3836,7 +3833,6 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -3906,7 +3902,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -4029,13 +4024,14 @@ } }, "node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.30.2.tgz", + "integrity": "sha512-0pE4RQ4UQi1jKY6p7u6i1Tkzqmu+d+/tHS7Q7rKunWLB9WyilBTpHHpXzPNMDj5hTbK0B0PTLSz07yqMBiF6xg==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "follow-redirects": "^1.15.4", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" } }, "node_modules/axobject-query": { @@ -4140,6 +4136,15 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.13.tgz", + "integrity": "sha512-7s16KR8io8nIBWQyCYhmFhd+ebIzb9VKTzki+wOJXHTxTnV6+mFGH3+Jwn1zoKaY9/H9T/0BcKCZnzXljPnpSQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/bi-app-sass": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/bi-app-sass/-/bi-app-sass-1.1.0.tgz", @@ -4271,9 +4276,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "funding": [ { "type": "opencollective", @@ -4289,10 +4294,12 @@ } ], "license": "MIT", + "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { @@ -4409,9 +4416,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001726", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", - "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", + "version": "1.0.30001748", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz", + "integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==", "funding": [ { "type": "opencollective", @@ -4716,8 +4723,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true, - "peer": true + "dev": true }, "node_modules/connect": { "version": "3.7.0", @@ -4885,7 +4891,8 @@ "node_modules/css-mediaquery": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", - "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==" + "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==", + "license": "BSD" }, "node_modules/css-minimizer-webpack-plugin": { "version": "7.0.2", @@ -5322,7 +5329,6 @@ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-type": "^4.0.0" }, @@ -5445,9 +5451,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.179", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz", - "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==", + "version": "1.5.233", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.233.tgz", + "integrity": "sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg==", "license": "ISC" }, "node_modules/email-prop-type": { @@ -5655,7 +5661,6 @@ "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5697,7 +5702,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5769,6 +5773,7 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -5846,7 +5851,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "dev": true, - "peer": true, "dependencies": { "confusing-browser-globals": "^1.0.10", "object.assign": "^4.1.2", @@ -5931,6 +5935,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -5988,6 +5993,7 @@ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", @@ -6061,7 +6067,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -6074,7 +6079,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", "dev": true, - "peer": true, "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -6318,7 +6322,6 @@ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6336,7 +6339,6 @@ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -6577,15 +6579,16 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -6639,13 +6642,15 @@ } }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -6881,7 +6886,6 @@ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -7009,7 +7013,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "peer": true, "dependencies": { "react-is": "^16.7.0" } @@ -7328,7 +7331,6 @@ "version": "10.5.0", "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.0.tgz", "integrity": "sha512-AvojYuOaRb6r2veOKfTVpxH9TrmjSdc5iR9R5RgBwrDZYSmAAFVT+QLbW3C4V7Qsg0OguMp67Q/EoUkxZzXRGw==", - "peer": true, "dependencies": { "@formatjs/ecma402-abstract": "1.17.0", "@formatjs/fast-memoize": "2.2.0", @@ -7962,7 +7964,6 @@ "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", @@ -7990,9 +7991,9 @@ } }, "node_modules/jasmine-core": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.10.0.tgz", - "integrity": "sha512-MrChbWV5LBo+EaeKwTM1eZ6oYSz1brvFExnRafraEkJkbJ9evbUxABhnIgGQimhpMxhg+BD6QmOvb/e3NXsNdg==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.12.0.tgz", + "integrity": "sha512-QqO4pX33GEML5JoGQU6BM5NHKPgEsg+TXp3jCIDek9MbfEp2JUYEFBo9EF1+hegWy/bCHS1m5nP0BOp18G6rVA==", "dev": true, "license": "MIT" }, @@ -8183,6 +8184,7 @@ "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@colors/colors": "1.5.0", "body-parser": "^1.19.0", @@ -8686,9 +8688,10 @@ "dev": true }, "node_modules/matchmediaquery": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", - "integrity": "sha512-Hlk20WQHRIm9EE9luN1kjRjYXAQToHOIAHPJn9buxBwuhfTHoKUcX+lXBbxc85DVQfXYbEQ4HcwQdd128E3qHQ==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.4.2.tgz", + "integrity": "sha512-wrZpoT50ehYOudhDjt/YvUJc6eUzcdFPdmbizfgvswCKNHD1/OBOHYJpHie+HXpu6bSkEGieFMYk6VuutaiRfA==", + "license": "MIT", "dependencies": { "css-mediaquery": "^0.1.2" } @@ -8747,7 +8750,6 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 8" } @@ -8904,8 +8906,7 @@ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", @@ -8929,9 +8930,9 @@ "optional": true }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", "license": "MIT" }, "node_modules/normalize-path": { @@ -9029,7 +9030,6 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -9078,7 +9078,6 @@ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, - "peer": true, "dependencies": { "define-properties": "^1.1.4", "es-abstract": "^1.20.4" @@ -9488,7 +9487,6 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9579,6 +9577,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -10290,6 +10289,12 @@ "react": ">=0.14.0" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -10679,17 +10684,18 @@ } }, "node_modules/react-responsive": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-8.2.0.tgz", - "integrity": "sha512-iagCqVrw4QSjhxKp3I/YK6+ODkWY6G+YPElvdYKiUUbywwh9Ds0M7r26Fj2/7dWFFbOpcGnJE6uE7aMck8j5Qg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-10.0.1.tgz", + "integrity": "sha512-OM5/cRvbtUWEX8le8RCT8scA8y2OPtb0Q/IViEyCEM5FBN8lRrkUOZnu87I88A6njxDldvxG+rLBxWiA7/UM9g==", + "license": "MIT", "dependencies": { "hyphenate-style-name": "^1.0.0", - "matchmediaquery": "^0.3.0", + "matchmediaquery": "^0.4.2", "prop-types": "^15.6.1", - "shallow-equal": "^1.1.0" + "shallow-equal": "^3.1.0" }, "engines": { - "node": ">= 0.10" + "node": ">=14" }, "peerDependencies": { "react": ">=16.8.0" @@ -11162,9 +11168,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.92.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", - "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", + "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -11182,9 +11188,9 @@ } }, "node_modules/sass-loader": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", - "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "version": "16.0.6", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.6.tgz", + "integrity": "sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA==", "license": "MIT", "dependencies": { "neo-async": "^2.6.2" @@ -11253,16 +11259,15 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -11282,6 +11287,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -11393,9 +11399,10 @@ } }, "node_modules/shallow-equal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-3.1.0.tgz", + "integrity": "sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg==", + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -11499,7 +11506,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -11724,7 +11730,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, - "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -11844,11 +11849,12 @@ } }, "node_modules/style-dictionary": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/style-dictionary/-/style-dictionary-4.3.2.tgz", - "integrity": "sha512-kBDUWWWpaubHsMsA0pRegKA1+ocYFTACj+Y5o/FeMGGhTPBXigH/hVr3ZVwKVx2ITiuNGJY3SrbrW1cOJIsutA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/style-dictionary/-/style-dictionary-4.4.0.tgz", + "integrity": "sha512-+xU0IA1StzqAqFs/QtXkK+XJa7wpS4X5H+JQccRKsRCElgeLGocFU1U/UMvMUylKFw6vwGV+Y/a2wb2pm5rFFQ==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@bundled-es-modules/deepmerge": "^4.3.1", "@bundled-es-modules/glob": "^10.4.2", @@ -11962,11 +11968,16 @@ "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { @@ -12157,9 +12168,11 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "peer": true }, "node_modules/tsutils": { "version": "3.21.0", @@ -12167,7 +12180,6 @@ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tslib": "^1.8.1" }, @@ -12183,8 +12195,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -12648,9 +12659,10 @@ } }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12668,10 +12680,11 @@ } }, "node_modules/webpack": { - "version": "5.101.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", - "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", + "version": "5.102.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", + "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -12681,7 +12694,7 @@ "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.0", + "browserslist": "^4.26.3", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", @@ -12693,10 +12706,10 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", + "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { @@ -12727,6 +12740,7 @@ "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.6.1", "@webpack-cli/configtest": "^3.0.1", diff --git a/package.json b/package.json index 26a001022..00d1b183e 100644 --- a/package.json +++ b/package.json @@ -18,25 +18,25 @@ "css-minimizer-webpack-plugin": "7.0.2", "file-loader": "6.2.0", "mini-css-extract-plugin": "2.9.4", - "sass": "1.92.1", - "sass-loader": "16.0.5", + "sass": "1.93.2", + "sass-loader": "16.0.6", "url-loader": "4.1.1", - "webpack": "5.101.3", + "webpack": "5.102.1", "webpack-bundle-tracker": "3.2.1" }, "devDependencies": { - "@babel/core": "7.28.4", - "@babel/eslint-parser": "7.28.4", + "@babel/core": "7.28.5", + "@babel/eslint-parser": "7.28.5", "@babel/plugin-proposal-object-rest-spread": "7.20.7", "@babel/plugin-transform-modules-commonjs": "7.27.1", "@babel/plugin-transform-object-assign": "7.27.1", - "@babel/preset-env": "7.28.3", + "@babel/preset-env": "7.28.5", "@edx/eslint-config": "4.4.0", "babel-loader": "10.0.0", "eslint": "8.57.1", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", - "jasmine-core": "5.10.0", + "jasmine-core": "5.12.0", "jasmine-jquery": "2.1.1", "karma": "6.4.4", "karma-coverage": "2.2.1", diff --git a/requirements/all.txt b/requirements/all.txt index 0295e585d..2dd5cc4d1 100644 --- a/requirements/all.txt +++ b/requirements/all.txt @@ -4,12 +4,12 @@ # # make upgrade # -anyio==4.10.0 +anyio==4.11.0 # via # -r requirements/dev.txt # -r requirements/production.txt # httpx -asgiref==3.9.1 +asgiref==3.10.0 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -20,7 +20,7 @@ astroid==3.3.11 # -r requirements/dev.txt # pylint # pylint-celery -attrs==25.3.0 +attrs==25.4.0 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -31,17 +31,17 @@ backoff==2.2.1 # -r requirements/dev.txt # -r requirements/production.txt # segment-analytics-python -black==25.1.0 +black==25.9.0 # via -r requirements/dev.txt bleach==6.2.0 # via # -r requirements/dev.txt # -r requirements/production.txt -boto3==1.40.28 +boto3==1.40.55 # via # -r requirements/production.txt # django-ses -botocore==1.40.28 +botocore==1.40.55 # via # -r requirements/production.txt # boto3 @@ -51,13 +51,13 @@ cachecontrol==0.14.3 # -r requirements/dev.txt # -r requirements/production.txt # firebase-admin -cachetools==5.5.2 +cachetools==6.2.1 # via # -r requirements/dev.txt # -r requirements/production.txt # google-auth # tox -certifi==2025.8.3 +certifi==2025.10.5 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -74,12 +74,12 @@ chardet==5.2.0 # via # -r requirements/dev.txt # tox -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via # -r requirements/dev.txt # -r requirements/production.txt # requests -click==8.2.1 +click==8.3.0 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -113,14 +113,13 @@ coreschema==0.0.4 # -r requirements/dev.txt # -r requirements/production.txt # coreapi -coverage==7.10.6 +coverage==7.11.0 # via -r requirements/dev.txt -cryptography==45.0.7 +cryptography==46.0.3 # via # -r requirements/dev.txt # -r requirements/production.txt # pyjwt - # social-auth-core ddt==1.7.2 # via -r requirements/dev.txt defusedxml==0.7.1 @@ -141,9 +140,8 @@ distlib==0.4.0 # via # -r requirements/dev.txt # virtualenv -django==4.2.24 +django==5.2.7 # via - # -c requirements/common_constraints.txt # -r requirements/dev.txt # -r requirements/production.txt # django-appconf @@ -188,7 +186,7 @@ django-config-models==2.9.0 # via # -r requirements/dev.txt # -r requirements/production.txt -django-cors-headers==4.8.0 +django-cors-headers==4.9.0 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -204,7 +202,7 @@ django-extensions==4.1 # via # -r requirements/dev.txt # -r requirements/production.txt -django-filter==25.1 +django-filter==25.2 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -243,9 +241,9 @@ django-storages==1.14.6 # via # -r requirements/dev.txt # -r requirements/production.txt -django-stubs==5.2.2 +django-stubs==5.2.7 # via -r requirements/dev.txt -django-stubs-ext==5.2.2 +django-stubs-ext==5.2.7 # via # -r requirements/dev.txt # django-stubs @@ -279,7 +277,7 @@ drf-jwt==1.19.2 # -r requirements/dev.txt # -r requirements/production.txt # edx-drf-extensions -drf-yasg==1.21.10 +drf-yasg==1.21.11 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -287,7 +285,7 @@ edx-ace==1.15.0 # via # -r requirements/dev.txt # -r requirements/production.txt -edx-auth-backends==4.6.0 +edx-auth-backends==4.6.1 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -308,7 +306,7 @@ edx-django-sites-extensions==5.1.0 # via # -r requirements/dev.txt # -r requirements/production.txt -edx-django-utils==8.0.0 +edx-django-utils==8.0.1 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -360,16 +358,16 @@ edx-toggles==5.4.1 # edx-event-bus-redis factory-boy==3.3.3 # via -r requirements/dev.txt -faker==37.6.0 +faker==37.11.0 # via # -r requirements/dev.txt # factory-boy -fastavro==1.12.0 +fastavro==1.12.1 # via # -r requirements/dev.txt # -r requirements/production.txt # openedx-events -filelock==3.19.1 +filelock==3.20.0 # via # -r requirements/dev.txt # tox @@ -379,9 +377,9 @@ firebase-admin==7.1.0 # -r requirements/dev.txt # -r requirements/production.txt # edx-ace -gevent==25.8.2 +gevent==25.9.1 # via -r requirements/production.txt -google-api-core[grpc]==2.25.1 +google-api-core[grpc]==2.26.0 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -389,7 +387,7 @@ google-api-core[grpc]==2.25.1 # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-auth==2.40.3 +google-auth==2.41.1 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -408,7 +406,7 @@ google-cloud-firestore==2.21.0 # -r requirements/dev.txt # -r requirements/production.txt # firebase-admin -google-cloud-storage==3.3.1 +google-cloud-storage==3.4.1 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -424,7 +422,7 @@ google-resumable-media==2.7.2 # -r requirements/dev.txt # -r requirements/production.txt # google-cloud-storage -googleapis-common-protos==1.70.0 +googleapis-common-protos==1.71.0 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -434,13 +432,13 @@ greenlet==3.2.4 # via # -r requirements/production.txt # gevent -grpcio==1.74.0 +grpcio==1.75.1 # via # -r requirements/dev.txt # -r requirements/production.txt # google-api-core # grpcio-status -grpcio-status==1.74.0 +grpcio-status==1.75.1 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -479,7 +477,7 @@ hyperframe==6.1.0 # -r requirements/dev.txt # -r requirements/production.txt # h2 -idna==3.10 +idna==3.11 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -491,11 +489,11 @@ inflection==0.5.1 # -r requirements/dev.txt # -r requirements/production.txt # drf-yasg -iniconfig==2.1.0 +iniconfig==2.3.0 # via # -r requirements/dev.txt # pytest -isort==6.0.1 +isort==6.1.0 # via # -r requirements/dev.txt # pylint @@ -515,14 +513,14 @@ jmespath==1.0.1 # -r requirements/production.txt # boto3 # botocore -lxml[html-clean]==6.0.1 +lxml[html-clean]==6.0.2 # via # -r requirements/dev.txt # -r requirements/production.txt # edx-credentials-themes # edx-i18n-tools # lxml-html-clean -lxml-html-clean==0.4.2 +lxml-html-clean==0.4.3 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -531,7 +529,7 @@ markdown==3.9 # via # -r requirements/dev.txt # -r requirements/production.txt -markupsafe==3.0.2 +markupsafe==3.0.3 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -540,12 +538,12 @@ mccabe==0.7.0 # via # -r requirements/dev.txt # pylint -msgpack==1.1.1 +msgpack==1.1.2 # via # -r requirements/dev.txt # -r requirements/production.txt # cachecontrol -mypy==1.17.1 +mypy==1.18.2 # via -r requirements/dev.txt mypy-extensions==1.1.0 # via @@ -599,11 +597,11 @@ pathspec==0.12.1 # -r requirements/dev.txt # black # mypy -pillow==11.3.0 +pillow==12.0.0 # via # -r requirements/dev.txt # -r requirements/production.txt -platformdirs==4.4.0 +platformdirs==4.5.0 # via # -r requirements/dev.txt # black @@ -626,7 +624,7 @@ proto-plus==1.26.1 # -r requirements/production.txt # google-api-core # google-cloud-firestore -protobuf==6.32.0 +protobuf==6.33.0 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -635,7 +633,7 @@ protobuf==6.32.0 # googleapis-common-protos # grpcio-status # proto-plus -psutil==7.0.0 +psutil==7.1.1 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -672,7 +670,7 @@ pyjwt[crypto]==2.10.1 # firebase-admin # segment-analytics-python # social-auth-core -pylint==3.3.8 +pylint==3.3.9 # via # -r requirements/dev.txt # edx-lint @@ -696,17 +694,17 @@ pymemcache==4.0.0 # via # -r requirements/dev.txt # -r requirements/production.txt -pymongo==4.15.0 +pymongo==4.15.3 # via # -r requirements/dev.txt # -r requirements/production.txt # edx-opaque-keys -pynacl==1.5.0 +pynacl==1.6.0 # via # -r requirements/dev.txt # -r requirements/production.txt # edx-django-utils -pyproject-api==1.9.1 +pyproject-api==1.10.0 # via # -r requirements/dev.txt # tox @@ -737,6 +735,10 @@ python3-openid==3.2.0 # -r requirements/dev.txt # -r requirements/production.txt # social-auth-core +pytokens==0.2.0 + # via + # -r requirements/dev.txt + # black pytz==2025.2 # via # -r requirements/dev.txt @@ -744,7 +746,7 @@ pytz==2025.2 # drf-yasg pywatchman==3.0.0 ; "linux" in sys_platform # via -r requirements/dev.txt -pyyaml==6.0.2 +pyyaml==6.0.3 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -807,7 +809,7 @@ semantic-version==2.10.0 # -r requirements/dev.txt # -r requirements/production.txt # edx-drf-extensions -simplejson==3.20.1 +simplejson==3.20.2 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -830,10 +832,11 @@ sniffio==1.3.1 # anyio social-auth-app-django==5.4.3 # via + # -c requirements/constraints.txt # -r requirements/dev.txt # -r requirements/production.txt # edx-auth-backends -social-auth-core==4.7.0 +social-auth-core==4.8.1 # via # -r requirements/dev.txt # -r requirements/production.txt @@ -853,7 +856,7 @@ stevedore==5.5.0 # edx-ace # edx-django-utils # edx-opaque-keys -testfixtures==9.1.0 +testfixtures==9.2.0 # via -r requirements/dev.txt text-unidecode==1.3 # via @@ -864,9 +867,9 @@ tomlkit==0.13.3 # via # -r requirements/dev.txt # pylint -tox==4.27.0 +tox==4.31.0 # via -r requirements/dev.txt -types-pyyaml==6.0.12.20250822 +types-pyyaml==6.0.12.20250915 # via # -r requirements/dev.txt # django-stubs @@ -878,6 +881,7 @@ typing-extensions==4.15.0 # django-stubs # django-stubs-ext # edx-opaque-keys + # grpcio # mypy tzdata==2025.2 # via @@ -896,7 +900,7 @@ urllib3==2.5.0 # botocore # requests # responses -virtualenv==20.34.0 +virtualenv==20.35.3 # via # -r requirements/dev.txt # tox @@ -914,11 +918,11 @@ xss-utils==0.8.0 # via # -r requirements/dev.txt # -r requirements/production.txt -zope-event==5.1.1 +zope-event==6.0 # via # -r requirements/production.txt # gevent -zope-interface==7.2 +zope-interface==8.0.1 # via # -r requirements/production.txt # gevent diff --git a/requirements/base.txt b/requirements/base.txt index 3f61cf52d..348bd5264 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -4,13 +4,13 @@ # # make upgrade # -anyio==4.10.0 +anyio==4.11.0 # via httpx -asgiref==3.9.1 +asgiref==3.10.0 # via # django # django-cors-headers -attrs==25.3.0 +attrs==25.4.0 # via # edx-ace # openedx-events @@ -20,9 +20,9 @@ bleach==6.2.0 # via -r requirements/base.in cachecontrol==0.14.3 # via firebase-admin -cachetools==5.5.2 +cachetools==6.2.1 # via google-auth -certifi==2025.8.3 +certifi==2025.10.5 # via # httpcore # httpx @@ -31,9 +31,9 @@ cffi==2.0.0 # via # cryptography # pynacl -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests -click==8.2.1 +click==8.3.0 # via # code-annotations # edx-django-utils @@ -46,19 +46,16 @@ coreapi==2.3.3 # openapi-codec coreschema==0.0.4 # via coreapi -cryptography==45.0.7 - # via - # pyjwt - # social-auth-core +cryptography==46.0.3 + # via pyjwt defusedxml==0.7.1 # via # python3-openid # social-auth-core didkit==0.3.3 # via -r requirements/base.in -django==4.2.24 +django==5.2.7 # via - # -c requirements/common_constraints.txt # -r requirements/base.in # django-appconf # django-config-models @@ -93,7 +90,7 @@ django-appconf==1.1.0 # via django-statici18n django-config-models==2.9.0 # via -r requirements/base.in -django-cors-headers==4.8.0 +django-cors-headers==4.9.0 # via -r requirements/base.in django-crum==0.7.9 # via @@ -101,7 +98,7 @@ django-crum==0.7.9 # edx-toggles django-extensions==4.1 # via -r requirements/base.in -django-filter==25.1 +django-filter==25.2 # via -r requirements/base.in django-model-utils==5.0.0 # via -r requirements/base.in @@ -139,11 +136,11 @@ dnspython==2.8.0 # via pymongo drf-jwt==1.19.2 # via edx-drf-extensions -drf-yasg==1.21.10 +drf-yasg==1.21.11 # via -r requirements/base.in edx-ace==1.15.0 # via -r requirements/base.in -edx-auth-backends==4.6.0 +edx-auth-backends==4.6.1 # via -r requirements/base.in edx-ccx-keys==2.0.2 # via openedx-events @@ -153,7 +150,7 @@ edx-django-release-util==1.5.0 # via -r requirements/base.in edx-django-sites-extensions==5.1.0 # via -r requirements/base.in -edx-django-utils==8.0.0 +edx-django-utils==8.0.1 # via # -r requirements/base.in # django-config-models @@ -187,17 +184,17 @@ edx-toggles==5.4.1 # edx-auth-backends # edx-event-bus-kafka # edx-event-bus-redis -fastavro==1.12.0 +fastavro==1.12.1 # via openedx-events firebase-admin==7.1.0 # via edx-ace -google-api-core[grpc]==2.25.1 +google-api-core[grpc]==2.26.0 # via # firebase-admin # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-auth==2.40.3 +google-auth==2.41.1 # via # google-api-core # google-cloud-core @@ -209,7 +206,7 @@ google-cloud-core==2.4.3 # google-cloud-storage google-cloud-firestore==2.21.0 # via firebase-admin -google-cloud-storage==3.3.1 +google-cloud-storage==3.4.1 # via firebase-admin google-crc32c==1.7.1 # via @@ -217,15 +214,15 @@ google-crc32c==1.7.1 # google-resumable-media google-resumable-media==2.7.2 # via google-cloud-storage -googleapis-common-protos==1.70.0 +googleapis-common-protos==1.71.0 # via # google-api-core # grpcio-status -grpcio==1.74.0 +grpcio==1.75.1 # via # google-api-core # grpcio-status -grpcio-status==1.74.0 +grpcio-status==1.75.1 # via google-api-core h11==0.16.0 # via httpcore @@ -239,7 +236,7 @@ httpx[http2]==0.28.1 # via firebase-admin hyperframe==6.1.0 # via h2 -idna==3.10 +idna==3.11 # via # anyio # httpx @@ -252,18 +249,18 @@ jinja2==3.1.6 # via # code-annotations # coreschema -lxml[html-clean]==6.0.1 +lxml[html-clean]==6.0.2 # via # edx-credentials-themes # edx-i18n-tools # lxml-html-clean -lxml-html-clean==0.4.2 +lxml-html-clean==0.4.3 # via lxml markdown==3.9 # via -r requirements/base.in -markupsafe==3.0.2 +markupsafe==3.0.3 # via jinja2 -msgpack==1.1.1 +msgpack==1.1.2 # via cachecontrol mysqlclient==2.2.7 # via -r requirements/base.in @@ -284,7 +281,7 @@ packaging==25.0 # via drf-yasg path==16.16.0 # via edx-i18n-tools -pillow==11.3.0 +pillow==12.0.0 # via -r requirements/base.in polib==1.2.0 # via edx-i18n-tools @@ -292,14 +289,14 @@ proto-plus==1.26.1 # via # google-api-core # google-cloud-firestore -protobuf==6.32.0 +protobuf==6.33.0 # via # google-api-core # google-cloud-firestore # googleapis-common-protos # grpcio-status # proto-plus -psutil==7.0.0 +psutil==7.1.1 # via edx-django-utils pyasn1==0.6.1 # via @@ -322,9 +319,9 @@ pyjwt[crypto]==2.10.1 # social-auth-core pymemcache==4.0.0 # via -r requirements/base.in -pymongo==4.15.0 +pymongo==4.15.3 # via edx-opaque-keys -pynacl==1.5.0 +pynacl==1.6.0 # via edx-django-utils python-dateutil==2.9.0.post0 # via @@ -340,7 +337,7 @@ pytz==2025.2 # via # -r requirements/base.in # drf-yasg -pyyaml==6.0.2 +pyyaml==6.0.3 # via # code-annotations # drf-yasg @@ -373,7 +370,7 @@ segment-analytics-python==2.3.4 # via -r requirements/base.in semantic-version==2.10.0 # via edx-drf-extensions -simplejson==3.20.1 +simplejson==3.20.2 # via # django-rest-swagger # sailthru-client @@ -388,9 +385,10 @@ sniffio==1.3.1 # via anyio social-auth-app-django==5.4.3 # via + # -c requirements/constraints.txt # -r requirements/base.in # edx-auth-backends -social-auth-core==4.7.0 +social-auth-core==4.8.1 # via # edx-auth-backends # social-auth-app-django @@ -408,6 +406,7 @@ typing-extensions==4.15.0 # via # anyio # edx-opaque-keys + # grpcio uritemplate==4.2.0 # via # coreapi diff --git a/requirements/common_constraints.txt b/requirements/common_constraints.txt index b0a74ba95..a920d65fb 100644 --- a/requirements/common_constraints.txt +++ b/requirements/common_constraints.txt @@ -17,13 +17,9 @@ # this file from Github directly. It does not require packaging in edx-lint. # using LTS django version -Django<5.0 + # elasticsearch>=7.14.0 includes breaking changes in it which caused issues in discovery upgrade process. # elastic search changelog: https://www.elastic.co/guide/en/enterprise-search/master/release-notes-7.14.0.html # See https://github.com/openedx/edx-platform/issues/35126 for more info elasticsearch<7.14.0 - -# Cause: https://github.com/openedx/edx-lint/issues/458 -# This can be unpinned once https://github.com/openedx/edx-lint/issues/459 has been resolved. -pip<24.3 diff --git a/requirements/constraints.txt b/requirements/constraints.txt index ab0e09256..a9b6ba6c7 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -10,3 +10,8 @@ # Common constraints for edx repos -c common_constraints.txt + + +# greater versions are breaking 2 tests which need further investigation. +# https://github.com/openedx/credentials/issues/2873 +social-auth-app-django<=5.4.3 diff --git a/requirements/dev.txt b/requirements/dev.txt index 244b2afee..1cb6059a6 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -4,11 +4,11 @@ # # make upgrade # -anyio==4.10.0 +anyio==4.11.0 # via # -r requirements/test.txt # httpx -asgiref==3.9.1 +asgiref==3.10.0 # via # -r requirements/test.txt # django @@ -18,7 +18,7 @@ astroid==3.3.11 # -r requirements/test.txt # pylint # pylint-celery -attrs==25.3.0 +attrs==25.4.0 # via # -r requirements/test.txt # edx-ace @@ -27,7 +27,7 @@ backoff==2.2.1 # via # -r requirements/test.txt # segment-analytics-python -black==25.1.0 +black==25.9.0 # via -r requirements/test.txt bleach==6.2.0 # via -r requirements/test.txt @@ -35,12 +35,12 @@ cachecontrol==0.14.3 # via # -r requirements/test.txt # firebase-admin -cachetools==5.5.2 +cachetools==6.2.1 # via # -r requirements/test.txt # google-auth # tox -certifi==2025.8.3 +certifi==2025.10.5 # via # -r requirements/test.txt # httpcore @@ -55,11 +55,11 @@ chardet==5.2.0 # via # -r requirements/test.txt # tox -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via # -r requirements/test.txt # requests -click==8.2.1 +click==8.3.0 # via # -r requirements/test.txt # black @@ -89,13 +89,12 @@ coreschema==0.0.4 # via # -r requirements/test.txt # coreapi -coverage==7.10.6 +coverage==7.11.0 # via -r requirements/test.txt -cryptography==45.0.7 +cryptography==46.0.3 # via # -r requirements/test.txt # pyjwt - # social-auth-core ddt==1.7.2 # via -r requirements/test.txt defusedxml==0.7.1 @@ -113,9 +112,8 @@ distlib==0.4.0 # via # -r requirements/test.txt # virtualenv -django==4.2.24 +django==5.2.7 # via - # -c requirements/common_constraints.txt # -r requirements/test.txt # django-appconf # django-config-models @@ -155,7 +153,7 @@ django-appconf==1.1.0 # django-statici18n django-config-models==2.9.0 # via -r requirements/test.txt -django-cors-headers==4.8.0 +django-cors-headers==4.9.0 # via -r requirements/test.txt django-crum==0.7.9 # via @@ -166,7 +164,7 @@ django-debug-toolbar==6.0.0 # via -r requirements/dev.in django-extensions==4.1 # via -r requirements/test.txt -django-filter==25.1 +django-filter==25.2 # via -r requirements/test.txt django-model-utils==5.0.0 # via -r requirements/test.txt @@ -186,9 +184,9 @@ django-statici18n==2.6.0 # via -r requirements/test.txt django-storages==1.14.6 # via -r requirements/test.txt -django-stubs==5.2.2 +django-stubs==5.2.7 # via -r requirements/dev.in -django-stubs-ext==5.2.2 +django-stubs-ext==5.2.7 # via django-stubs django-waffle==5.0.0 # via @@ -214,11 +212,11 @@ drf-jwt==1.19.2 # via # -r requirements/test.txt # edx-drf-extensions -drf-yasg==1.21.10 +drf-yasg==1.21.11 # via -r requirements/test.txt edx-ace==1.15.0 # via -r requirements/test.txt -edx-auth-backends==4.6.0 +edx-auth-backends==4.6.1 # via -r requirements/test.txt edx-ccx-keys==2.0.2 # via @@ -230,7 +228,7 @@ edx-django-release-util==1.5.0 # via -r requirements/test.txt edx-django-sites-extensions==5.1.0 # via -r requirements/test.txt -edx-django-utils==8.0.0 +edx-django-utils==8.0.1 # via # -r requirements/test.txt # django-config-models @@ -271,15 +269,15 @@ edx-toggles==5.4.1 # edx-event-bus-redis factory-boy==3.3.3 # via -r requirements/test.txt -faker==37.6.0 +faker==37.11.0 # via # -r requirements/test.txt # factory-boy -fastavro==1.12.0 +fastavro==1.12.1 # via # -r requirements/test.txt # openedx-events -filelock==3.19.1 +filelock==3.20.0 # via # -r requirements/test.txt # tox @@ -288,14 +286,14 @@ firebase-admin==7.1.0 # via # -r requirements/test.txt # edx-ace -google-api-core[grpc]==2.25.1 +google-api-core[grpc]==2.26.0 # via # -r requirements/test.txt # firebase-admin # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-auth==2.40.3 +google-auth==2.41.1 # via # -r requirements/test.txt # google-api-core @@ -311,7 +309,7 @@ google-cloud-firestore==2.21.0 # via # -r requirements/test.txt # firebase-admin -google-cloud-storage==3.3.1 +google-cloud-storage==3.4.1 # via # -r requirements/test.txt # firebase-admin @@ -324,17 +322,17 @@ google-resumable-media==2.7.2 # via # -r requirements/test.txt # google-cloud-storage -googleapis-common-protos==1.70.0 +googleapis-common-protos==1.71.0 # via # -r requirements/test.txt # google-api-core # grpcio-status -grpcio==1.74.0 +grpcio==1.75.1 # via # -r requirements/test.txt # google-api-core # grpcio-status -grpcio-status==1.74.0 +grpcio-status==1.75.1 # via # -r requirements/test.txt # google-api-core @@ -364,7 +362,7 @@ hyperframe==6.1.0 # via # -r requirements/test.txt # h2 -idna==3.10 +idna==3.11 # via # -r requirements/test.txt # anyio @@ -374,11 +372,11 @@ inflection==0.5.1 # via # -r requirements/test.txt # drf-yasg -iniconfig==2.1.0 +iniconfig==2.3.0 # via # -r requirements/test.txt # pytest -isort==6.0.1 +isort==6.1.0 # via # -r requirements/test.txt # pylint @@ -391,19 +389,19 @@ jinja2==3.1.6 # -r requirements/test.txt # code-annotations # coreschema -lxml[html-clean]==6.0.1 +lxml[html-clean]==6.0.2 # via # -r requirements/test.txt # edx-credentials-themes # edx-i18n-tools # lxml-html-clean -lxml-html-clean==0.4.2 +lxml-html-clean==0.4.3 # via # -r requirements/test.txt # lxml markdown==3.9 # via -r requirements/test.txt -markupsafe==3.0.2 +markupsafe==3.0.3 # via # -r requirements/test.txt # jinja2 @@ -411,11 +409,11 @@ mccabe==0.7.0 # via # -r requirements/test.txt # pylint -msgpack==1.1.1 +msgpack==1.1.2 # via # -r requirements/test.txt # cachecontrol -mypy==1.17.1 +mypy==1.18.2 # via -r requirements/dev.in mypy-extensions==1.1.0 # via @@ -457,9 +455,9 @@ pathspec==0.12.1 # -r requirements/test.txt # black # mypy -pillow==11.3.0 +pillow==12.0.0 # via -r requirements/test.txt -platformdirs==4.4.0 +platformdirs==4.5.0 # via # -r requirements/test.txt # black @@ -480,7 +478,7 @@ proto-plus==1.26.1 # -r requirements/test.txt # google-api-core # google-cloud-firestore -protobuf==6.32.0 +protobuf==6.33.0 # via # -r requirements/test.txt # google-api-core @@ -488,7 +486,7 @@ protobuf==6.32.0 # googleapis-common-protos # grpcio-status # proto-plus -psutil==7.0.0 +psutil==7.1.1 # via # -r requirements/test.txt # edx-django-utils @@ -519,7 +517,7 @@ pyjwt[crypto]==2.10.1 # firebase-admin # segment-analytics-python # social-auth-core -pylint==3.3.8 +pylint==3.3.9 # via # -r requirements/test.txt # edx-lint @@ -541,15 +539,15 @@ pylint-plugin-utils==0.9.0 # pylint-django pymemcache==4.0.0 # via -r requirements/test.txt -pymongo==4.15.0 +pymongo==4.15.3 # via # -r requirements/test.txt # edx-opaque-keys -pynacl==1.5.0 +pynacl==1.6.0 # via # -r requirements/test.txt # edx-django-utils -pyproject-api==1.9.1 +pyproject-api==1.10.0 # via # -r requirements/test.txt # tox @@ -574,13 +572,17 @@ python3-openid==3.2.0 # via # -r requirements/test.txt # social-auth-core +pytokens==0.2.0 + # via + # -r requirements/test.txt + # black pytz==2025.2 # via # -r requirements/test.txt # drf-yasg pywatchman==3.0.0 ; "linux" in sys_platform # via -r requirements/dev.in -pyyaml==6.0.2 +pyyaml==6.0.3 # via # -r requirements/test.txt # code-annotations @@ -628,7 +630,7 @@ semantic-version==2.10.0 # via # -r requirements/test.txt # edx-drf-extensions -simplejson==3.20.1 +simplejson==3.20.2 # via # -r requirements/test.txt # django-rest-swagger @@ -648,9 +650,10 @@ sniffio==1.3.1 # anyio social-auth-app-django==5.4.3 # via + # -c requirements/constraints.txt # -r requirements/test.txt # edx-auth-backends -social-auth-core==4.7.0 +social-auth-core==4.8.1 # via # -r requirements/test.txt # edx-auth-backends @@ -667,7 +670,7 @@ stevedore==5.5.0 # edx-ace # edx-django-utils # edx-opaque-keys -testfixtures==9.1.0 +testfixtures==9.2.0 # via -r requirements/test.txt text-unidecode==1.3 # via @@ -677,9 +680,9 @@ tomlkit==0.13.3 # via # -r requirements/test.txt # pylint -tox==4.27.0 +tox==4.31.0 # via -r requirements/test.txt -types-pyyaml==6.0.12.20250822 +types-pyyaml==6.0.12.20250915 # via django-stubs typing-extensions==4.15.0 # via @@ -688,6 +691,7 @@ typing-extensions==4.15.0 # django-stubs # django-stubs-ext # edx-opaque-keys + # grpcio # mypy tzdata==2025.2 # via @@ -703,7 +707,7 @@ urllib3==2.5.0 # -r requirements/test.txt # requests # responses -virtualenv==20.34.0 +virtualenv==20.35.3 # via # -r requirements/test.txt # tox diff --git a/requirements/django.txt b/requirements/django.txt index e864a899a..9109eb206 100644 --- a/requirements/django.txt +++ b/requirements/django.txt @@ -1 +1 @@ -django==4.2.24 +django==5.2.7 diff --git a/requirements/docs.txt b/requirements/docs.txt index 94f325d16..341dad0ad 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -12,17 +12,17 @@ babel==2.17.0 # via # pydata-sphinx-theme # sphinx -beautifulsoup4==4.13.5 +beautifulsoup4==4.14.2 # via pydata-sphinx-theme -certifi==2025.8.3 +certifi==2025.10.5 # via requests -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via requests docutils==0.21.2 # via # pydata-sphinx-theme # sphinx -idna==3.10 +idna==3.11 # via requests imagesize==1.4.1 # via sphinx @@ -30,7 +30,7 @@ jinja2==3.1.6 # via sphinx jsx-lexer==2.0.1 # via -r requirements/docs.in -markupsafe==3.0.2 +markupsafe==3.0.3 # via jinja2 packaging==25.0 # via diff --git a/requirements/pip.txt b/requirements/pip.txt index 476adfba8..42c703428 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -8,9 +8,7 @@ wheel==0.45.1 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: -pip==24.2 - # via - # -c requirements/common_constraints.txt - # -r requirements/pip.in +pip==25.2 + # via -r requirements/pip.in setuptools==80.9.0 # via -r requirements/pip.in diff --git a/requirements/pip_tools.txt b/requirements/pip_tools.txt index a8620ab4d..0dc0bf329 100644 --- a/requirements/pip_tools.txt +++ b/requirements/pip_tools.txt @@ -6,11 +6,11 @@ # build==1.3.0 # via pip-tools -click==8.2.1 +click==8.3.0 # via pip-tools packaging==25.0 # via build -pip-tools==7.5.0 +pip-tools==7.5.1 # via -r requirements/pip_tools.in pyproject-hooks==1.2.0 # via diff --git a/requirements/production.txt b/requirements/production.txt index c73121d73..f87ae7728 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -4,16 +4,16 @@ # # make upgrade # -anyio==4.10.0 +anyio==4.11.0 # via # -r requirements/base.txt # httpx -asgiref==3.9.1 +asgiref==3.10.0 # via # -r requirements/base.txt # django # django-cors-headers -attrs==25.3.0 +attrs==25.4.0 # via # -r requirements/base.txt # edx-ace @@ -24,9 +24,9 @@ backoff==2.2.1 # segment-analytics-python bleach==6.2.0 # via -r requirements/base.txt -boto3==1.40.28 +boto3==1.40.55 # via django-ses -botocore==1.40.28 +botocore==1.40.55 # via # boto3 # s3transfer @@ -34,11 +34,11 @@ cachecontrol==0.14.3 # via # -r requirements/base.txt # firebase-admin -cachetools==5.5.2 +cachetools==6.2.1 # via # -r requirements/base.txt # google-auth -certifi==2025.8.3 +certifi==2025.10.5 # via # -r requirements/base.txt # httpcore @@ -49,11 +49,11 @@ cffi==2.0.0 # -r requirements/base.txt # cryptography # pynacl -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via # -r requirements/base.txt # requests -click==8.2.1 +click==8.3.0 # via # -r requirements/base.txt # code-annotations @@ -71,11 +71,10 @@ coreschema==0.0.4 # via # -r requirements/base.txt # coreapi -cryptography==45.0.7 +cryptography==46.0.3 # via # -r requirements/base.txt # pyjwt - # social-auth-core defusedxml==0.7.1 # via # -r requirements/base.txt @@ -83,9 +82,8 @@ defusedxml==0.7.1 # social-auth-core didkit==0.3.3 # via -r requirements/base.txt -django==4.2.24 +django==5.2.7 # via - # -c requirements/common_constraints.txt # -r requirements/base.txt # django-appconf # django-config-models @@ -123,7 +121,7 @@ django-appconf==1.1.0 # django-statici18n django-config-models==2.9.0 # via -r requirements/base.txt -django-cors-headers==4.8.0 +django-cors-headers==4.9.0 # via -r requirements/base.txt django-crum==0.7.9 # via @@ -132,7 +130,7 @@ django-crum==0.7.9 # edx-toggles django-extensions==4.1 # via -r requirements/base.txt -django-filter==25.1 +django-filter==25.2 # via -r requirements/base.txt django-model-utils==5.0.0 # via -r requirements/base.txt @@ -178,11 +176,11 @@ drf-jwt==1.19.2 # via # -r requirements/base.txt # edx-drf-extensions -drf-yasg==1.21.10 +drf-yasg==1.21.11 # via -r requirements/base.txt edx-ace==1.15.0 # via -r requirements/base.txt -edx-auth-backends==4.6.0 +edx-auth-backends==4.6.1 # via -r requirements/base.txt edx-ccx-keys==2.0.2 # via @@ -194,7 +192,7 @@ edx-django-release-util==1.5.0 # via -r requirements/base.txt edx-django-sites-extensions==5.1.0 # via -r requirements/base.txt -edx-django-utils==8.0.0 +edx-django-utils==8.0.1 # via # -r requirements/base.txt # django-config-models @@ -230,7 +228,7 @@ edx-toggles==5.4.1 # edx-auth-backends # edx-event-bus-kafka # edx-event-bus-redis -fastavro==1.12.0 +fastavro==1.12.1 # via # -r requirements/base.txt # openedx-events @@ -238,16 +236,16 @@ firebase-admin==7.1.0 # via # -r requirements/base.txt # edx-ace -gevent==25.8.2 +gevent==25.9.1 # via -r requirements/production.in -google-api-core[grpc]==2.25.1 +google-api-core[grpc]==2.26.0 # via # -r requirements/base.txt # firebase-admin # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-auth==2.40.3 +google-auth==2.41.1 # via # -r requirements/base.txt # google-api-core @@ -263,7 +261,7 @@ google-cloud-firestore==2.21.0 # via # -r requirements/base.txt # firebase-admin -google-cloud-storage==3.3.1 +google-cloud-storage==3.4.1 # via # -r requirements/base.txt # firebase-admin @@ -276,19 +274,19 @@ google-resumable-media==2.7.2 # via # -r requirements/base.txt # google-cloud-storage -googleapis-common-protos==1.70.0 +googleapis-common-protos==1.71.0 # via # -r requirements/base.txt # google-api-core # grpcio-status greenlet==3.2.4 # via gevent -grpcio==1.74.0 +grpcio==1.75.1 # via # -r requirements/base.txt # google-api-core # grpcio-status -grpcio-status==1.74.0 +grpcio-status==1.75.1 # via # -r requirements/base.txt # google-api-core @@ -318,7 +316,7 @@ hyperframe==6.1.0 # via # -r requirements/base.txt # h2 -idna==3.10 +idna==3.11 # via # -r requirements/base.txt # anyio @@ -341,23 +339,23 @@ jmespath==1.0.1 # via # boto3 # botocore -lxml[html-clean]==6.0.1 +lxml[html-clean]==6.0.2 # via # -r requirements/base.txt # edx-credentials-themes # edx-i18n-tools # lxml-html-clean -lxml-html-clean==0.4.2 +lxml-html-clean==0.4.3 # via # -r requirements/base.txt # lxml markdown==3.9 # via -r requirements/base.txt -markupsafe==3.0.2 +markupsafe==3.0.3 # via # -r requirements/base.txt # jinja2 -msgpack==1.1.1 +msgpack==1.1.2 # via # -r requirements/base.txt # cachecontrol @@ -390,7 +388,7 @@ path==16.16.0 # via # -r requirements/base.txt # edx-i18n-tools -pillow==11.3.0 +pillow==12.0.0 # via -r requirements/base.txt polib==1.2.0 # via @@ -401,7 +399,7 @@ proto-plus==1.26.1 # -r requirements/base.txt # google-api-core # google-cloud-firestore -protobuf==6.32.0 +protobuf==6.33.0 # via # -r requirements/base.txt # google-api-core @@ -409,7 +407,7 @@ protobuf==6.32.0 # googleapis-common-protos # grpcio-status # proto-plus -psutil==7.0.0 +psutil==7.1.1 # via # -r requirements/base.txt # edx-django-utils @@ -440,11 +438,11 @@ pyjwt[crypto]==2.10.1 # social-auth-core pymemcache==4.0.0 # via -r requirements/base.txt -pymongo==4.15.0 +pymongo==4.15.3 # via # -r requirements/base.txt # edx-opaque-keys -pynacl==1.5.0 +pynacl==1.6.0 # via # -r requirements/base.txt # edx-django-utils @@ -468,7 +466,7 @@ pytz==2025.2 # via # -r requirements/base.txt # drf-yasg -pyyaml==6.0.2 +pyyaml==6.0.3 # via # -r requirements/base.txt # -r requirements/production.in @@ -515,7 +513,7 @@ semantic-version==2.10.0 # via # -r requirements/base.txt # edx-drf-extensions -simplejson==3.20.1 +simplejson==3.20.2 # via # -r requirements/base.txt # django-rest-swagger @@ -534,9 +532,10 @@ sniffio==1.3.1 # anyio social-auth-app-django==5.4.3 # via + # -c requirements/constraints.txt # -r requirements/base.txt # edx-auth-backends -social-auth-core==4.7.0 +social-auth-core==4.8.1 # via # -r requirements/base.txt # edx-auth-backends @@ -561,6 +560,7 @@ typing-extensions==4.15.0 # -r requirements/base.txt # anyio # edx-opaque-keys + # grpcio uritemplate==4.2.0 # via # -r requirements/base.txt @@ -581,9 +581,9 @@ webencodings==0.5.1 # bleach xss-utils==0.8.0 # via -r requirements/base.txt -zope-event==5.1.1 +zope-event==6.0 # via gevent -zope-interface==7.2 +zope-interface==8.0.1 # via gevent # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/test.txt b/requirements/test.txt index 73d203b10..507325554 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -4,11 +4,11 @@ # # make upgrade # -anyio==4.10.0 +anyio==4.11.0 # via # -r requirements/base.txt # httpx -asgiref==3.9.1 +asgiref==3.10.0 # via # -r requirements/base.txt # django @@ -17,7 +17,7 @@ astroid==3.3.11 # via # pylint # pylint-celery -attrs==25.3.0 +attrs==25.4.0 # via # -r requirements/base.txt # edx-ace @@ -26,7 +26,7 @@ backoff==2.2.1 # via # -r requirements/base.txt # segment-analytics-python -black==25.1.0 +black==25.9.0 # via -r requirements/test.in bleach==6.2.0 # via -r requirements/base.txt @@ -34,12 +34,12 @@ cachecontrol==0.14.3 # via # -r requirements/base.txt # firebase-admin -cachetools==5.5.2 +cachetools==6.2.1 # via # -r requirements/base.txt # google-auth # tox -certifi==2025.8.3 +certifi==2025.10.5 # via # -r requirements/base.txt # httpcore @@ -52,11 +52,11 @@ cffi==2.0.0 # pynacl chardet==5.2.0 # via tox -charset-normalizer==3.4.3 +charset-normalizer==3.4.4 # via # -r requirements/base.txt # requests -click==8.2.1 +click==8.3.0 # via # -r requirements/base.txt # black @@ -83,13 +83,12 @@ coreschema==0.0.4 # via # -r requirements/base.txt # coreapi -coverage==7.10.6 +coverage==7.11.0 # via -r requirements/test.in -cryptography==45.0.7 +cryptography==46.0.3 # via # -r requirements/base.txt # pyjwt - # social-auth-core ddt==1.7.2 # via -r requirements/test.in defusedxml==0.7.1 @@ -104,7 +103,6 @@ dill==0.4.0 distlib==0.4.0 # via virtualenv # via - # -c requirements/common_constraints.txt # -r requirements/base.txt # django-appconf # django-config-models @@ -141,7 +139,7 @@ django-appconf==1.1.0 # django-statici18n django-config-models==2.9.0 # via -r requirements/base.txt -django-cors-headers==4.8.0 +django-cors-headers==4.9.0 # via -r requirements/base.txt django-crum==0.7.9 # via @@ -150,7 +148,7 @@ django-crum==0.7.9 # edx-toggles django-extensions==4.1 # via -r requirements/base.txt -django-filter==25.1 +django-filter==25.2 # via -r requirements/base.txt django-model-utils==5.0.0 # via -r requirements/base.txt @@ -194,11 +192,11 @@ drf-jwt==1.19.2 # via # -r requirements/base.txt # edx-drf-extensions -drf-yasg==1.21.10 +drf-yasg==1.21.11 # via -r requirements/base.txt edx-ace==1.15.0 # via -r requirements/base.txt -edx-auth-backends==4.6.0 +edx-auth-backends==4.6.1 # via -r requirements/base.txt edx-ccx-keys==2.0.2 # via @@ -210,7 +208,7 @@ edx-django-release-util==1.5.0 # via -r requirements/base.txt edx-django-sites-extensions==5.1.0 # via -r requirements/base.txt -edx-django-utils==8.0.0 +edx-django-utils==8.0.1 # via # -r requirements/base.txt # django-config-models @@ -250,13 +248,13 @@ edx-toggles==5.4.1 # edx-event-bus-redis factory-boy==3.3.3 # via -r requirements/test.in -faker==37.6.0 +faker==37.11.0 # via factory-boy -fastavro==1.12.0 +fastavro==1.12.1 # via # -r requirements/base.txt # openedx-events -filelock==3.19.1 +filelock==3.20.0 # via # tox # virtualenv @@ -264,14 +262,14 @@ firebase-admin==7.1.0 # via # -r requirements/base.txt # edx-ace -google-api-core[grpc]==2.25.1 +google-api-core[grpc]==2.26.0 # via # -r requirements/base.txt # firebase-admin # google-cloud-core # google-cloud-firestore # google-cloud-storage -google-auth==2.40.3 +google-auth==2.41.1 # via # -r requirements/base.txt # google-api-core @@ -287,7 +285,7 @@ google-cloud-firestore==2.21.0 # via # -r requirements/base.txt # firebase-admin -google-cloud-storage==3.3.1 +google-cloud-storage==3.4.1 # via # -r requirements/base.txt # firebase-admin @@ -300,17 +298,17 @@ google-resumable-media==2.7.2 # via # -r requirements/base.txt # google-cloud-storage -googleapis-common-protos==1.70.0 +googleapis-common-protos==1.71.0 # via # -r requirements/base.txt # google-api-core # grpcio-status -grpcio==1.74.0 +grpcio==1.75.1 # via # -r requirements/base.txt # google-api-core # grpcio-status -grpcio-status==1.74.0 +grpcio-status==1.75.1 # via # -r requirements/base.txt # google-api-core @@ -340,7 +338,7 @@ hyperframe==6.1.0 # via # -r requirements/base.txt # h2 -idna==3.10 +idna==3.11 # via # -r requirements/base.txt # anyio @@ -350,9 +348,9 @@ inflection==0.5.1 # via # -r requirements/base.txt # drf-yasg -iniconfig==2.1.0 +iniconfig==2.3.0 # via pytest -isort==6.0.1 +isort==6.1.0 # via # -r requirements/test.in # pylint @@ -365,25 +363,25 @@ jinja2==3.1.6 # -r requirements/base.txt # code-annotations # coreschema -lxml[html-clean]==6.0.1 +lxml[html-clean]==6.0.2 # via # -r requirements/base.txt # edx-credentials-themes # edx-i18n-tools # lxml-html-clean -lxml-html-clean==0.4.2 +lxml-html-clean==0.4.3 # via # -r requirements/base.txt # lxml markdown==3.9 # via -r requirements/base.txt -markupsafe==3.0.2 +markupsafe==3.0.3 # via # -r requirements/base.txt # jinja2 mccabe==0.7.0 # via pylint -msgpack==1.1.1 +msgpack==1.1.2 # via # -r requirements/base.txt # cachecontrol @@ -421,9 +419,9 @@ path==16.16.0 # edx-i18n-tools pathspec==0.12.1 # via black -pillow==11.3.0 +pillow==12.0.0 # via -r requirements/base.txt -platformdirs==4.4.0 +platformdirs==4.5.0 # via # black # pylint @@ -442,7 +440,7 @@ proto-plus==1.26.1 # -r requirements/base.txt # google-api-core # google-cloud-firestore -protobuf==6.32.0 +protobuf==6.33.0 # via # -r requirements/base.txt # google-api-core @@ -450,7 +448,7 @@ protobuf==6.32.0 # googleapis-common-protos # grpcio-status # proto-plus -psutil==7.0.0 +psutil==7.1.1 # via # -r requirements/base.txt # edx-django-utils @@ -481,7 +479,7 @@ pyjwt[crypto]==2.10.1 # firebase-admin # segment-analytics-python # social-auth-core -pylint==3.3.8 +pylint==3.3.9 # via # edx-lint # pylint-celery @@ -497,15 +495,15 @@ pylint-plugin-utils==0.9.0 # pylint-django pymemcache==4.0.0 # via -r requirements/base.txt -pymongo==4.15.0 +pymongo==4.15.3 # via # -r requirements/base.txt # edx-opaque-keys -pynacl==1.5.0 +pynacl==1.6.0 # via # -r requirements/base.txt # edx-django-utils -pyproject-api==1.9.1 +pyproject-api==1.10.0 # via tox pytest==8.4.2 # via @@ -528,11 +526,13 @@ python3-openid==3.2.0 # via # -r requirements/base.txt # social-auth-core +pytokens==0.2.0 + # via black pytz==2025.2 # via # -r requirements/base.txt # drf-yasg -pyyaml==6.0.2 +pyyaml==6.0.3 # via # -r requirements/base.txt # code-annotations @@ -580,7 +580,7 @@ semantic-version==2.10.0 # via # -r requirements/base.txt # edx-drf-extensions -simplejson==3.20.1 +simplejson==3.20.2 # via # -r requirements/base.txt # django-rest-swagger @@ -600,9 +600,10 @@ sniffio==1.3.1 # anyio social-auth-app-django==5.4.3 # via + # -c requirements/constraints.txt # -r requirements/base.txt # edx-auth-backends -social-auth-core==4.7.0 +social-auth-core==4.8.1 # via # -r requirements/base.txt # edx-auth-backends @@ -618,7 +619,7 @@ stevedore==5.5.0 # edx-ace # edx-django-utils # edx-opaque-keys -testfixtures==9.1.0 +testfixtures==9.2.0 # via -r requirements/test.in text-unidecode==1.3 # via @@ -626,13 +627,14 @@ text-unidecode==1.3 # python-slugify tomlkit==0.13.3 # via pylint -tox==4.27.0 +tox==4.31.0 # via -r requirements/test.in typing-extensions==4.15.0 # via # -r requirements/base.txt # anyio # edx-opaque-keys + # grpcio tzdata==2025.2 # via faker uritemplate==4.2.0 @@ -645,7 +647,7 @@ urllib3==2.5.0 # -r requirements/base.txt # requests # responses -virtualenv==20.34.0 +virtualenv==20.35.3 # via tox walrus==0.9.5 # via diff --git a/requirements/translations.txt b/requirements/translations.txt index a4e7b02c6..9d57833dc 100644 --- a/requirements/translations.txt +++ b/requirements/translations.txt @@ -4,25 +4,23 @@ # # make upgrade # -asgiref==3.9.1 +asgiref==3.10.0 # via django -django==4.2.24 - # via - # -c requirements/common_constraints.txt - # edx-i18n-tools +django==5.2.7 + # via edx-i18n-tools edx-i18n-tools==1.9.0 # via -r requirements/translations.in -lxml[html-clean]==6.0.1 +lxml[html-clean]==6.0.2 # via # edx-i18n-tools # lxml-html-clean -lxml-html-clean==0.4.2 +lxml-html-clean==0.4.3 # via lxml path==16.16.0 # via edx-i18n-tools polib==1.2.0 # via edx-i18n-tools -pyyaml==6.0.2 +pyyaml==6.0.3 # via edx-i18n-tools sqlparse==0.5.3 # via django diff --git a/tox.ini b/tox.ini index 4fbf9e18e..b41b5163a 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{3.12}-django{42,52} +envlist = py{3.12}-django{52} skipsdist = true [pytest] @@ -8,8 +8,7 @@ testpaths = credentials/apps [testenv] deps = - django42: -r requirements/django.txt - django52: Django>=5.2,<5.3 + django52: -r requirements/django.txt -r {toxinidir}/requirements/test.txt allowlist_externals: make