diff --git a/deployment/docker/supervisord/base.conf b/deployment/docker/supervisord/base.conf index 2ddfdc6dc2..c5f89de9c5 100644 --- a/deployment/docker/supervisord/base.conf +++ b/deployment/docker/supervisord/base.conf @@ -2,6 +2,7 @@ file=/tmp/supervisor.sock [supervisord] +environment = AUTOMIGRATE="skip" logfile=/dev/stdout logfile_maxbytes=0 loglevel=info diff --git a/doc/admin/installation/docker_smallscale.rst b/doc/admin/installation/docker_smallscale.rst index adbcb9d95b..6c5f2a85a5 100644 --- a/doc/admin/installation/docker_smallscale.rst +++ b/doc/admin/installation/docker_smallscale.rst @@ -240,6 +240,9 @@ The following snippet is an example on how to configure a nginx proxy for pretix listen 80 default_server; listen [::]:80 ipv6only=on default_server; server_name pretix.mydomain.com; + location / { + return 301 https://$host$request_uri; + } } server { listen 443 default_server; diff --git a/doc/admin/installation/manual_smallscale.rst b/doc/admin/installation/manual_smallscale.rst index 02e33e5bde..51870878ae 100644 --- a/doc/admin/installation/manual_smallscale.rst +++ b/doc/admin/installation/manual_smallscale.rst @@ -225,6 +225,9 @@ The following snippet is an example on how to configure a nginx proxy for pretix listen 80 default_server; listen [::]:80 ipv6only=on default_server; server_name pretix.mydomain.com; + location / { + return 301 https://$host$request_uri; + } } server { listen 443 default_server; diff --git a/doc/api/resources/customers.rst b/doc/api/resources/customers.rst index 17d5d9279b..d9fd2c14f0 100644 --- a/doc/api/resources/customers.rst +++ b/doc/api/resources/customers.rst @@ -26,10 +26,16 @@ date_joined datetime Date and time o locale string Preferred language of the customer last_modified datetime Date and time of modification of the record notes string Internal notes and comments (or ``null``) +password string Can only be set during creation of a new customer, will + not be included in any responses. ===================================== ========================== ======================================================= .. versionadded:: 4.0 +.. versionchanged:: 4.3 + + Passwords can now be set through the API during customer creation. + Endpoints --------- @@ -146,6 +152,7 @@ Endpoints { "email": "test@example.org", + "password": "verysecret", "send_email": true } diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index 429fdb58b0..fcfd2b98dd 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -428,7 +428,7 @@ List of all orders ``last_modified``, and ``status``. Default: ``datetime`` :query string code: Only return orders that match the given order code :query string status: Only return orders in the given order status (see above) - :query string search: Only return orders matching a given search query + :query string search: Only return orders matching a given search query (matching for names, email addresses, and company names) :query integer item: Only return orders with a position that contains this item ID. *Warning:* Result will also include orders if they contain mixed items, and it will even return orders where the item is only contained in a canceled position. :query integer variation: Only return orders with a position that contains this variation ID. *Warning:* Result will also include orders if they contain mixed items and variations, and it will even return orders where the variation is only contained in a canceled position. :query boolean testmode: Only return orders with ``testmode`` set to ``true`` or ``false`` @@ -853,7 +853,7 @@ Creating orders You can supply the following fields of the resource: - * ``code`` (optional) + * ``code`` (optional) – Only ``A-Z`` and ``0-9``, but without ``O`` and ``1``. * ``status`` (optional) – Defaults to pending for non-free orders and paid for free orders. You can only set this to ``"n"`` for pending or ``"p"`` for paid. We will create a payment object for this order either in state ``created`` or in state ``confirmed``, depending on this value. If you create a paid order, the ``order_paid`` signal will diff --git a/doc/api/resources/webhooks.rst b/doc/api/resources/webhooks.rst index 34980f40c5..051a2bd261 100644 --- a/doc/api/resources/webhooks.rst +++ b/doc/api/resources/webhooks.rst @@ -36,10 +36,16 @@ The following values for ``action_types`` are valid with pretix core: * ``pretix.event.order.canceled`` * ``pretix.event.order.reactivated`` * ``pretix.event.order.expired`` + * ``pretix.event.order.expirychanged`` * ``pretix.event.order.modified`` * ``pretix.event.order.contact.changed`` * ``pretix.event.order.changed.*`` + * ``pretix.event.order.refund.created`` * ``pretix.event.order.refund.created.externally`` + * ``pretix.event.order.refund.requested`` + * ``pretix.event.order.refund.done`` + * ``pretix.event.order.refund.canceled`` + * ``pretix.event.order.refund.failed`` * ``pretix.event.order.approved`` * ``pretix.event.order.denied`` * ``pretix.event.checkin`` @@ -50,6 +56,10 @@ The following values for ``action_types`` are valid with pretix core: * ``pretix.subevent.added`` * ``pretix.subevent.changed`` * ``pretix.subevent.deleted`` + * ``pretix.event.live.activated`` + * ``pretix.event.live.deactivated`` + * ``pretix.event.testmode.activated`` + * ``pretix.event.testmode.deactivated`` Installed plugins might register more valid values. diff --git a/src/pretix/__init__.py b/src/pretix/__init__.py index 09290226f0..d97a0dbd2d 100644 --- a/src/pretix/__init__.py +++ b/src/pretix/__init__.py @@ -19,4 +19,4 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # -__version__ = "4.12.0.dev1" +__version__ = "4.13.0.dev0" diff --git a/src/pretix/api/serializers/event.py b/src/pretix/api/serializers/event.py index e2f3b507d9..2e8ba1dc12 100644 --- a/src/pretix/api/serializers/event.py +++ b/src/pretix/api/serializers/event.py @@ -54,7 +54,10 @@ from pretix.base.models.items import SubEventItem, SubEventItemVariation from pretix.base.services.seating import ( SeatProtected, generate_seats, validate_plan_change, ) -from pretix.base.settings import LazyI18nStringList, validate_event_settings +from pretix.base.settings import ( + PERSON_NAME_SALUTATIONS, PERSON_NAME_SCHEMES, PERSON_NAME_TITLE_GROUPS, + LazyI18nStringList, validate_event_settings, +) from pretix.base.signals import api_event_settings_fields logger = logging.getLogger(__name__) @@ -777,6 +780,7 @@ class EventSettingsSerializer(SettingsSerializer): 'logo_image_large', 'logo_show_title', 'og_image', + 'name_scheme', ] def __init__(self, *args, **kwargs): @@ -842,4 +846,25 @@ class DeviceEventSettingsSerializer(EventSettingsSerializer): 'invoice_address_from_country', 'invoice_address_from_tax_id', 'invoice_address_from_vat_id', + 'name_scheme', ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['_name_scheme_fields'] = serializers.JSONField( + read_only=True, + default=[{"key": k, "label": str(v), "weight": w} for k, v, w, *__ in PERSON_NAME_SCHEMES.get(self.event.settings.name_scheme)['fields']] + ) + self.fields['_name_scheme_salutations'] = serializers.JSONField( + read_only=True, + default=[{"key": k, "label": str(v)} for k, v in PERSON_NAME_SALUTATIONS] + ) + self.fields['_name_scheme_titles'] = serializers.JSONField( + read_only=True, + default=( + [{"key": k, "label": k} + for k in PERSON_NAME_TITLE_GROUPS.get(self.event.settings.name_scheme_titles)[1]] + if self.event.settings.name_scheme_titles + else [] + ) + ) diff --git a/src/pretix/api/serializers/organizer.py b/src/pretix/api/serializers/organizer.py index a4e5c75936..f181b0f06f 100644 --- a/src/pretix/api/serializers/organizer.py +++ b/src/pretix/api/serializers/organizer.py @@ -77,10 +77,11 @@ class CustomerSerializer(I18nAwareModelSerializer): class CustomerCreateSerializer(CustomerSerializer): send_email = serializers.BooleanField(default=False, required=False, allow_null=True) + password = serializers.CharField(write_only=True, required=False, allow_null=True) class Meta: model = Customer - fields = CustomerSerializer.Meta.fields + ('send_email',) + fields = CustomerSerializer.Meta.fields + ('send_email', 'password') class MembershipTypeSerializer(I18nAwareModelSerializer): diff --git a/src/pretix/api/views/order.py b/src/pretix/api/views/order.py index 5135fb1e65..7c791e6dc3 100644 --- a/src/pretix/api/views/order.py +++ b/src/pretix/api/views/order.py @@ -1322,6 +1322,7 @@ class OrderPositionViewSet(viewsets.ModelViewSet): serializer.is_valid(raise_exception=True) serializer.save() new_data = serializer.data + instance.order.create_transactions() if old_data != new_data: log_data = self.request.data diff --git a/src/pretix/api/views/organizer.py b/src/pretix/api/views/organizer.py index 65b899e947..05b689826f 100644 --- a/src/pretix/api/views/organizer.py +++ b/src/pretix/api/views/organizer.py @@ -515,8 +515,8 @@ class CustomerViewSet(viewsets.ModelViewSet): raise MethodNotAllowed("Customers cannot be deleted.") @transaction.atomic() - def perform_create(self, serializer, send_email=False): - customer = serializer.save(organizer=self.request.organizer, password=make_password(None)) + def perform_create(self, serializer, send_email=False, password=None): + customer = serializer.save(organizer=self.request.organizer, password=make_password(password)) serializer.instance.log_action( 'pretix.customer.created', user=self.request.user, @@ -530,7 +530,7 @@ class CustomerViewSet(viewsets.ModelViewSet): def create(self, request, *args, **kwargs): serializer = CustomerCreateSerializer(data=request.data, context=self.get_serializer_context()) serializer.is_valid(raise_exception=True) - self.perform_create(serializer, send_email=serializer.validated_data.pop('send_email', False)) + self.perform_create(serializer, send_email=serializer.validated_data.pop('send_email', False), password=serializer.validated_data.pop('password', None)) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) diff --git a/src/pretix/api/webhooks.py b/src/pretix/api/webhooks.py index 49e058eacd..e8b42c972c 100644 --- a/src/pretix/api/webhooks.py +++ b/src/pretix/api/webhooks.py @@ -219,6 +219,10 @@ def register_default_webhook_events(sender, **kwargs): 'pretix.event.order.expired', _('Order expired'), ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.expirychanged', + _('Order expiry date changed'), + ), ParametrizedOrderWebhookEvent( 'pretix.event.order.modified', _('Order information changed'), @@ -231,10 +235,30 @@ def register_default_webhook_events(sender, **kwargs): 'pretix.event.order.changed.*', _('Order changed'), ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.refund.created', + _('Refund of payment created'), + ), ParametrizedOrderWebhookEvent( 'pretix.event.order.refund.created.externally', _('External refund of payment'), ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.refund.requested', + _('Refund of payment requested by customer'), + ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.refund.done', + _('Refund of payment completed'), + ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.refund.canceled', + _('Refund of payment canceled'), + ), + ParametrizedOrderWebhookEvent( + 'pretix.event.order.refund.failed', + _('Refund of payment failed'), + ), ParametrizedOrderWebhookEvent( 'pretix.event.order.approved', _('Order approved'), @@ -275,6 +299,22 @@ def register_default_webhook_events(sender, **kwargs): 'pretix.subevent.deleted', pgettext_lazy('subevent', 'Event series date deleted'), ), + ParametrizedEventWebhookEvent( + 'pretix.event.live.activated', + _('Shop taken live'), + ), + ParametrizedEventWebhookEvent( + 'pretix.event.live.deactivated', + _('Shop taken offline'), + ), + ParametrizedEventWebhookEvent( + 'pretix.event.testmode.activated', + _('Testmode of shop has been activated'), + ), + ParametrizedEventWebhookEvent( + 'pretix.event.testmode.deactivated', + _('Testmode of shop has been deactivated'), + ), ) diff --git a/src/pretix/base/email.py b/src/pretix/base/email.py index fbab7f5ed0..1bfbbd9216 100644 --- a/src/pretix/base/email.py +++ b/src/pretix/base/email.py @@ -43,6 +43,7 @@ from pretix.base.i18n import ( LazyCurrencyNumber, LazyDate, LazyExpiresDate, LazyNumber, ) from pretix.base.models import Event +from pretix.base.reldate import RelativeDateWrapper from pretix.base.settings import PERSON_NAME_SCHEMES from pretix.base.signals import ( register_html_mail_renderers, register_mail_placeholders, @@ -469,6 +470,19 @@ def base_placeholders(sender, **kwargs): } ), ), + SimpleFunctionalMailTextPlaceholder( + 'order_modification_deadline_date_and_time', ['order', 'event'], + lambda order, event: + date_format(order.modify_deadline.astimezone(event.timezone), 'SHORT_DATETIME_FORMAT') + if order.modify_deadline + else '', + lambda event: date_format( + event.settings.get( + 'last_order_modification_date', as_type=RelativeDateWrapper + ).datetime(event).astimezone(event.timezone), + 'SHORT_DATETIME_FORMAT' + ) if event.settings.get('last_order_modification_date') else '', + ), SimpleFunctionalMailTextPlaceholder( 'event_location', ['event_or_subevent'], lambda event_or_subevent: str(event_or_subevent.location or ''), lambda event: str(event.location or ''), diff --git a/src/pretix/base/exporters/orderlist.py b/src/pretix/base/exporters/orderlist.py index d03ebe2c54..81510f3264 100644 --- a/src/pretix/base/exporters/orderlist.py +++ b/src/pretix/base/exporters/orderlist.py @@ -610,7 +610,10 @@ class OrderListExporter(MultiSheetListExporter): for k, label, w in name_scheme['fields']: headers.append(_('Invoice address name') + ': ' + str(label)) headers += [ - _('Address'), _('ZIP code'), _('City'), _('Country'), pgettext('address', 'State'), _('VAT ID'), + _('Invoice address street'), _('Invoice address ZIP code'), _('Invoice address city'), + _('Invoice address country'), + pgettext('address', 'Invoice address state'), + _('VAT ID'), ] headers += [ _('Sales channel'), _('Order locale'), diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 3c94cb80ac..8ebb861a4c 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -746,6 +746,19 @@ class Order(LockModel, LoggedModel): length += 1 iteration = 0 + @property + def modify_deadline(self): + modify_deadline = self.event.settings.get('last_order_modification_date', as_type=RelativeDateWrapper) + if self.event.has_subevents and modify_deadline: + dates = [ + modify_deadline.datetime(se) + for se in self.event.subevents.filter(id__in=self.positions.values_list('subevent', flat=True)) + ] + return min(dates) if dates else None + elif modify_deadline: + return modify_deadline.datetime(self.event) + return None + @property def can_modify_answers(self) -> bool: """ @@ -758,16 +771,7 @@ class Order(LockModel, LoggedModel): if self.status not in (Order.STATUS_PENDING, Order.STATUS_PAID, Order.STATUS_EXPIRED): return False - modify_deadline = self.event.settings.get('last_order_modification_date', as_type=RelativeDateWrapper) - if self.event.has_subevents and modify_deadline: - dates = [ - modify_deadline.datetime(se) - for se in self.event.subevents.filter(id__in=self.positions.values_list('subevent', flat=True)) - ] - modify_deadline = min(dates) if dates else None - elif modify_deadline: - modify_deadline = modify_deadline.datetime(self.event) - + modify_deadline = self.modify_deadline if modify_deadline is not None and now() > modify_deadline: return False diff --git a/src/pretix/base/models/tax.py b/src/pretix/base/models/tax.py index 4eda56f5af..34bbd93d1a 100644 --- a/src/pretix/base/models/tax.py +++ b/src/pretix/base/models/tax.py @@ -114,7 +114,7 @@ EU_CURRENCIES = { 'RO': 'RON', 'SE': 'SEK' } -VAT_ID_COUNTRIES = EU_COUNTRIES | {'CH'} +VAT_ID_COUNTRIES = EU_COUNTRIES | {'CH', 'NO'} def is_eu_country(cc): diff --git a/src/pretix/base/orderimport.py b/src/pretix/base/orderimport.py index b83d5b5c9d..d4f850790f 100644 --- a/src/pretix/base/orderimport.py +++ b/src/pretix/base/orderimport.py @@ -392,7 +392,7 @@ class InvoiceAddressCountry(ImportColumn): return list(countries) def clean(self, value, previous_values): - if value and not Country(value).numeric: + if value and not (Country(value).numeric or value in settings.COUNTRIES_OVERRIDE): raise ValidationError(_("Please enter a valid country code.")) return value @@ -538,7 +538,7 @@ class AttendeeCountry(ImportColumn): return list(countries) def clean(self, value, previous_values): - if value and not Country(value).numeric: + if value and not (Country(value).numeric or value in settings.COUNTRIES_OVERRIDE): raise ValidationError(_("Please enter a valid country code.")) return value diff --git a/src/pretix/base/pdf.py b/src/pretix/base/pdf.py index cc584072cc..cbc529a70c 100644 --- a/src/pretix/base/pdf.py +++ b/src/pretix/base/pdf.py @@ -57,7 +57,7 @@ from django.utils.html import conditional_escape from django.utils.timezone import now from django.utils.translation import gettext_lazy as _, pgettext from i18nfield.strings import LazyI18nString -from PyPDF2 import PdfFileReader +from PyPDF2 import PdfReader from pytz import timezone from reportlab.graphics import renderPDF from reportlab.graphics.barcode.qr import QrCodeWidget @@ -646,7 +646,7 @@ class Renderer: self.event = event if self.background_file: self.bg_bytes = self.background_file.read() - self.bg_pdf = PdfFileReader(BytesIO(self.bg_bytes), strict=False) + self.bg_pdf = PdfReader(BytesIO(self.bg_bytes), strict=False) else: self.bg_bytes = None self.bg_pdf = None @@ -861,7 +861,7 @@ class Renderer: canvas.restoreState() def draw_page(self, canvas: Canvas, order: Order, op: OrderPosition, show_page=True, only_page=None): - page_count = self.bg_pdf.getNumPages() + page_count = len(self.bg_pdf.pages) if not only_page and not show_page: raise ValueError("only_page=None and show_page=False cannot be combined") @@ -881,7 +881,7 @@ class Renderer: elif o['type'] == "poweredby": self._draw_poweredby(canvas, op, o) if self.bg_pdf: - canvas.setPageSize((self.bg_pdf.getPage(page).mediaBox[2], self.bg_pdf.getPage(page).mediaBox[3])) + canvas.setPageSize((self.bg_pdf.pages[0].mediabox[2], self.bg_pdf.pages[0].mediabox[3])) if show_page: canvas.showPage() @@ -905,17 +905,17 @@ class Renderer: with open(os.path.join(d, 'out.pdf'), 'rb') as f: return BytesIO(f.read()) else: - from PyPDF2 import PdfFileReader, PdfFileWriter + from PyPDF2 import PdfReader, PdfWriter buffer.seek(0) - new_pdf = PdfFileReader(buffer) - output = PdfFileWriter() + new_pdf = PdfReader(buffer) + output = PdfWriter() for i, page in enumerate(new_pdf.pages): - bg_page = copy.copy(self.bg_pdf.getPage(i)) - bg_page.mergePage(page) - output.addPage(bg_page) + bg_page = copy.copy(self.bg_pdf.pages[i]) + bg_page.merge_page(page) + output.add_page(bg_page) - output.addMetadata({ + output.add_metadata({ '/Title': str(title), '/Creator': 'pretix', }) diff --git a/src/pretix/base/services/orderimport.py b/src/pretix/base/services/orderimport.py index ff6665df80..65773c9241 100644 --- a/src/pretix/base/services/orderimport.py +++ b/src/pretix/base/services/orderimport.py @@ -36,6 +36,7 @@ from pretix.base.models import ( from pretix.base.models.orders import Transaction from pretix.base.orderimport import get_all_columns from pretix.base.services.invoices import generate_invoice, invoice_qualified +from pretix.base.services.locking import NoLockManager from pretix.base.services.tasks import ProfiledEventTask from pretix.base.signals import order_paid, order_placed from pretix.celery_app import app @@ -85,9 +86,9 @@ def setif(record, obj, attr, setting): @app.task(base=ProfiledEventTask, throws=(DataImportError,)) def import_orders(event: Event, fileid: str, settings: dict, locale: str, user) -> None: - # TODO: quotacheck? cf = CachedFile.objects.get(id=fileid) user = User.objects.get(pk=user) + seats_used = False with language(locale, event.settings.region): cols = get_all_columns(event) parsed = parse_csv(cf.file) @@ -133,6 +134,8 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user) position = OrderPosition(positionid=len(order._positions) + 1) position.attendee_name_parts = {'_scheme': event.settings.name_scheme} position.meta_info = {} + if position.seat is not None: + seats_used = True order._positions.append(position) position.assign_pseudonymization_id() @@ -144,9 +147,12 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user) _('Invalid data in row {row}: {message}').format(row=i, message=str(e)) ) - # quota check? - with event.lock(): - with transaction.atomic(): + # We don't support vouchers, quotas, or memberships here, so we only need to lock if seats + # are in use + lockfn = event.lock if seats_used else NoLockManager + + try: + with lockfn(), transaction.atomic(): save_transactions = [] for o in orders: o.total = sum([c.price for c in o._positions]) # currently no support for fees @@ -204,4 +210,7 @@ def import_orders(event: Event, fileid: str, settings: dict, locale: str, user) ) and not o.invoices.last() if gen_invoice: generate_invoice(o, trigger_pdf=True) + except DataImportError: + raise ValidationError(_('We were not able to process your request completely as the server was too busy. ' + 'Please try again.')) cf.delete() diff --git a/src/pretix/base/services/tax.py b/src/pretix/base/services/tax.py index c2837d5650..5ae1b8810b 100644 --- a/src/pretix/base/services/tax.py +++ b/src/pretix/base/services/tax.py @@ -22,9 +22,9 @@ import logging import os import re -from urllib.error import HTTPError +from xml.etree import ElementTree -import vat_moss.errors +import requests import vat_moss.id from django.conf import settings from django.utils.translation import gettext_lazy as _ @@ -35,6 +35,16 @@ from zeep.exceptions import Fault from pretix.base.models.tax import cc_to_vat_prefix, is_eu_country logger = logging.getLogger(__name__) +error_messages = { + 'unavailable': _( + 'Your VAT ID could not be checked, as the VAT checking service of ' + 'your country is currently not available. We will therefore ' + 'need to charge VAT on your invoice. You can get the tax amount ' + 'back via the VAT reimbursement process.' + ), + 'invalid': _('This VAT ID is not valid. Please re-check your input.'), + 'country_mismatch': _('Your VAT ID does not match the selected country.'), +} class VATIDError(Exception): @@ -50,33 +60,104 @@ class VATIDTemporaryError(VATIDError): pass -def _validate_vat_id_EU(vat_id, country_code): - if vat_id[:2] != cc_to_vat_prefix(country_code): - raise VATIDFinalError(_('Your VAT ID does not match the selected country.')) +def _validate_vat_id_NO(vat_id, country_code): + # Inspired by vat_moss library + vat_id = vat_moss.id.normalize(vat_id) + + if not vat_id or len(vat_id) < 3 or not re.match('^\\d{9}MVA$', vat_id[2:]): + raise VATIDFinalError(error_messages['invalid']) + + organization_number = vat_id[2:].replace('MVA', '') + validation_url = 'https://data.brreg.no/enhetsregisteret/api/enheter/%s' % organization_number try: - result = vat_moss.id.validate(vat_id) - if result: - country_code, normalized_id, company_name = result - return normalized_id - except (vat_moss.errors.InvalidError, ValueError): - raise VATIDFinalError(_('This VAT ID is not valid. Please re-check your input.')) - except vat_moss.errors.WebServiceUnavailableError: + response = requests.get(validation_url, timeout=10) + if response.status_code in (404, 400): + raise VATIDFinalError(error_messages['invalid']) + + response.raise_for_status() + + info = response.json() + # This should never happen, but keeping it incase the API is changed + if 'organisasjonsnummer' not in info or info['organisasjonsnummer'] != organization_number: + logger.warning( + 'VAT ID checking failed for Norway due to missing or mismatching organisasjonsnummer in repsonse' + ) + raise VATIDFinalError(error_messages['invalid']) + except requests.RequestException: logger.exception('VAT ID checking failed for country {}'.format(country_code)) - raise VATIDTemporaryError(_( - 'Your VAT ID could not be checked, as the VAT checking service of ' - 'your country is currently not available. We will therefore ' - 'need to charge VAT on your invoice. You can get the tax amount ' - 'back via the VAT reimbursement process.' - )) - except (vat_moss.errors.WebServiceError, HTTPError): + raise VATIDTemporaryError(error_messages['unavailable']) + else: + return vat_id + + +def _validate_vat_id_EU(vat_id, country_code): + # Inspired by vat_moss library + try: + vat_id = vat_moss.id.normalize(vat_id) + except ValueError: + raise VATIDFinalError(error_messages['invalid']) + + if not vat_id or len(vat_id) < 3: + raise VATIDFinalError(error_messages['invalid']) + + number = vat_id[2:] + + if vat_id[:2] != cc_to_vat_prefix(country_code): + raise VATIDFinalError(error_messages['country_mismatch']) + + if not re.match(vat_moss.id.ID_PATTERNS[cc_to_vat_prefix(country_code)]['regex'], number): + raise VATIDFinalError(error_messages['invalid']) + + payload = """ + + + + + %s + %s + + + + """.strip() % (country_code, number) + + try: + response = requests.post( + 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService', + data=payload, + timeout=10, + ) + response.raise_for_status() + + return_xml = response.text + + try: + envelope = ElementTree.fromstring(return_xml) + except ElementTree.ParseError: + logger.error( + f'VAT ID checking failed for {country_code} due to XML parse error' + ) + raise VATIDTemporaryError(error_messages['unavailable']) + + namespaces = { + 'soap': 'http://schemas.xmlsoap.org/soap/envelope/', + 'vat': 'urn:ec.europa.eu:taxud:vies:services:checkVat:types' + } + valid_elements = envelope.findall('./soap:Body/vat:checkVatResponse/vat:valid', namespaces) + if not valid_elements: + logger.error( + f'VAT ID checking failed for {country_code} due to missing tag' + ) + raise VATIDTemporaryError(error_messages['unavailable']) + + if valid_elements[0].text.lower() != 'true': + raise VATIDFinalError(error_messages['invalid']) + + except requests.RequestException: logger.exception('VAT ID checking failed for country {}'.format(country_code)) - raise VATIDTemporaryError(_( - 'Your VAT ID could not be checked, as the VAT checking service of ' - 'your country returned an incorrect result. We will therefore ' - 'need to charge VAT on your invoice. Please contact support to ' - 'resolve this manually.' - )) + raise VATIDTemporaryError(error_messages['unavailable']) + else: + return vat_id def _validate_vat_id_CH(vat_id, country_code): @@ -85,10 +166,13 @@ def _validate_vat_id_CH(vat_id, country_code): vat_id = re.sub('[^A-Z0-9]', '', vat_id.replace('HR', '').replace('MWST', '')) try: - transport = Transport(cache=SqliteCache(os.path.join(settings.CACHE_DIR, "validate_vat_id_ch_zeep_cache.db"))) + transport = Transport( + cache=SqliteCache(os.path.join(settings.CACHE_DIR, "validate_vat_id_ch_zeep_cache.db")), + timeout=10 + ) client = Client( 'https://www.uid-wse.admin.ch/V5.0/PublicServices.svc?wsdl', - transport=transport + transport=transport, ) result = client.service.ValidateUID(uid=vat_id) except Fault as e: @@ -125,10 +209,14 @@ def _validate_vat_id_CH(vat_id, country_code): def validate_vat_id(vat_id, country_code): + if not vat_id: + return vat_id country_code = str(country_code) if is_eu_country(country_code): return _validate_vat_id_EU(vat_id, country_code) elif country_code == 'CH': return _validate_vat_id_CH(vat_id, country_code) + elif country_code == 'NO': + return _validate_vat_id_NO(vat_id, country_code) raise VATIDTemporaryError(f'VAT ID should not be entered for country {country_code}') diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 4c1dbbd08b..a0518ad21f 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -57,6 +57,7 @@ from django_countries.fields import Country from hierarkey.models import GlobalSettingsBase, Hierarkey from i18nfield.forms import I18nFormField, I18nTextarea, I18nTextInput from i18nfield.strings import LazyI18nString +from phonenumbers import PhoneNumber, parse from rest_framework import serializers from pretix.api.serializers.fields import ( @@ -2594,7 +2595,9 @@ Your {organizer} team""")) }, 'name_scheme': { 'default': 'full', # default for new events is 'given_family' - 'type': str + 'type': str, + 'serializer_class': serializers.ChoiceField, + 'serializer_kwargs': {}, }, 'giftcard_length': { 'default': settings.ENTROPY['giftcard_secret'], @@ -2989,6 +2992,9 @@ PERSON_NAME_SCHEMES = OrderedDict([ }, }), ]) + +DEFAULTS['name_scheme']['serializer_kwargs']['choices'] = ((k, k) for k in PERSON_NAME_SCHEMES) + COUNTRIES_WITH_STATE_IN_ADDRESS = { # Source: http://www.bitboost.com/ref/international-address-formats.html # This is not a list of countries that *have* states, this is a list of countries where states @@ -3025,6 +3031,7 @@ settings_hierarkey.add_type(LazyI18nStringList, settings_hierarkey.add_type(RelativeDateWrapper, serialize=lambda rdw: rdw.to_string(), unserialize=lambda s: RelativeDateWrapper.from_string(s)) +settings_hierarkey.add_type(PhoneNumber, lambda pn: pn.as_international, lambda s: parse(s)) @settings_hierarkey.set_global(cache_namespace='global') diff --git a/src/pretix/base/templates/400_hostname.html b/src/pretix/base/templates/400_hostname.html new file mode 100644 index 0000000000..881d0582c5 --- /dev/null +++ b/src/pretix/base/templates/400_hostname.html @@ -0,0 +1,52 @@ +{% extends "error.html" %} +{% load i18n %} +{% load static %} +{% block title %}{% trans "Unknown host" %}{% endblock %} +{% block content %} + +
+

{% trans "Unknown host" %}

+

+ {% blocktrans trimmed with host=header_host %} + Your browser told us that you want to access "{{ header_host }}". Unfortunately, we don't have + any content for this domain. + {% endblocktrans %} +

+ {% if is_fresh_install %} +

+ {% blocktrans trimmed %} + It looks like this is a fresh installation of pretix. This error message is probably caused due to + the fact that either your configuration includes the wrong site URL or your reverse proxy is sending + the wrong header. + {% endblocktrans %} +

+
+
{% trans "Expected host according to configuration" %}
+
{{ site_host }}
+
{% trans "Received headers" %}
+
+ Host: {{ request.headers.Host }} + {% if xfh %} +
+ X-Forwarded-For: {{ xfh }} + {% if not settings.USE_X_FORWARDED_HOST %}({% trans "ignored" %}){% endif %} + {% endif %} +
+
{% trans "Derived host from headers" %}
+
{{ header_host }}
+
+ {% else %} +

+ {% blocktrans trimmed %} + If you just configured this as a domain for your ticket shop, you now need to set this up as a "custom domain" + in your organizer account. + {% endblocktrans %} +

+ {% endif %} + + +
+{% endblock %} diff --git a/src/pretix/base/templates/pretixbase/email/base.html b/src/pretix/base/templates/pretixbase/email/base.html index b7e24cbe4e..b0e13c7681 100644 --- a/src/pretix/base/templates/pretixbase/email/base.html +++ b/src/pretix/base/templates/pretixbase/email/base.html @@ -199,7 +199,7 @@ + style="max-height: 60px;" alt=""> @@ -233,7 +233,7 @@
+ style="max-height: 60px;" alt=""> diff --git a/src/pretix/base/templates/pretixbase/email/separator.html b/src/pretix/base/templates/pretixbase/email/separator.html index 0d2e442889..f0ff2f7263 100644 --- a/src/pretix/base/templates/pretixbase/email/separator.html +++ b/src/pretix/base/templates/pretixbase/email/separator.html @@ -3,7 +3,7 @@
 
+ style="max-height: 4px;" alt="">
 
diff --git a/src/pretix/base/views/tasks.py b/src/pretix/base/views/tasks.py index 023ea779a1..9a82d228a9 100644 --- a/src/pretix/base/views/tasks.py +++ b/src/pretix/base/views/tasks.py @@ -216,7 +216,8 @@ class AsyncFormView(AsyncMixin, FormView): task_base = ProfiledEventTask def __init_subclass__(cls): - def async_execute(self, *, request_path, query_string, form_kwargs, locale, tz, organizer=None, event=None, user=None, session_key=None): + def async_execute(self, *, request_path, query_string, form_kwargs, locale, tz, url_kwargs=None, url_args=None, + organizer=None, event=None, user=None, session_key=None): view_instance = cls() form_kwargs['data'] = QueryDict(form_kwargs['data']) req = RequestFactory().post( @@ -225,6 +226,8 @@ class AsyncFormView(AsyncMixin, FormView): content_type='application/x-www-form-urlencoded' ) view_instance.request = req + view_instance.kwargs = url_kwargs + view_instance.args = url_args if event: view_instance.request.event = event view_instance.request.organizer = event.organizer @@ -284,6 +287,8 @@ class AsyncFormView(AsyncMixin, FormView): 'request_path': self.request.path, 'query_string': self.request.GET.urlencode(), 'form_kwargs': form_kwargs, + 'url_args': self.args, + 'url_kwargs': self.kwargs, 'locale': get_language(), 'tz': get_current_timezone().zone, } @@ -336,6 +341,8 @@ class AsyncPostView(AsyncMixin, View): content_type='application/x-www-form-urlencoded' ) view_instance.request = req + view_instance.kwargs = url_kwargs + view_instance.args = url_args if event: view_instance.request.event = event view_instance.request.organizer = event.organizer diff --git a/src/pretix/control/context.py b/src/pretix/control/context.py index 30d15f988d..736887413d 100644 --- a/src/pretix/control/context.py +++ b/src/pretix/control/context.py @@ -71,7 +71,7 @@ def _default_context(request): except Resolver404: return {} - if not request.path.startswith(get_script_prefix() + 'control'): + if not request.path.startswith(get_script_prefix() + 'control') or not hasattr(request, 'user'): return {} ctx = { 'url_name': url.url_name, diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 2f54c24ea4..b3c3521d64 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -39,7 +39,7 @@ from urllib.parse import urlencode, urlparse from django import forms from django.conf import settings from django.core.exceptions import ValidationError -from django.core.validators import validate_email +from django.core.validators import MaxValueValidator, validate_email from django.db.models import Prefetch, Q, prefetch_related_objects from django.forms import ( CheckboxSelectMultiple, formset_factory, inlineformset_factory, @@ -848,6 +848,7 @@ class InvoiceSettingsForm(SettingsForm): self.fields['invoice_generate_sales_channels'].choices = ( (c.identifier, c.verbose_name) for c in get_all_sales_channels().values() ) + self.fields['invoice_numbers_counter_length'].validators.append(MaxValueValidator(15)) def clean(self): data = super().clean() diff --git a/src/pretix/control/templates/pretixcontrol/event/settings.html b/src/pretix/control/templates/pretixcontrol/event/settings.html index 92029cf9bc..0a01f8be2f 100644 --- a/src/pretix/control/templates/pretixcontrol/event/settings.html +++ b/src/pretix/control/templates/pretixcontrol/event/settings.html @@ -207,14 +207,16 @@ {% bootstrap_field sform.logo_show_title layout="control" %} {% bootstrap_field sform.og_image layout="control" %} {% url "control:organizer.edit" organizer=request.organizer.slug as org_url %} - {% propagated request.event org_url "primary_color" "primary_font" "theme_color_success" "theme_color_danger" "theme_color_background" "theme_round_borders" %} - {% bootstrap_field sform.primary_color layout="control" %} - {% bootstrap_field sform.theme_color_success layout="control" %} - {% bootstrap_field sform.theme_color_danger layout="control" %} - {% bootstrap_field sform.theme_color_background layout="control" %} - {% bootstrap_field sform.theme_round_borders layout="control" %} - {% bootstrap_field sform.primary_font layout="control" %} - {% endpropagated %} + {% with org_url|add:"#tab-0-4-open" as org_url_tab %} + {% propagated request.event org_url_tab "primary_color" "primary_font" "theme_color_success" "theme_color_danger" "theme_color_background" "theme_round_borders" %} + {% bootstrap_field sform.primary_color layout="control" %} + {% bootstrap_field sform.theme_color_success layout="control" %} + {% bootstrap_field sform.theme_color_danger layout="control" %} + {% bootstrap_field sform.theme_color_background layout="control" %} + {% bootstrap_field sform.theme_round_borders layout="control" %} + {% bootstrap_field sform.primary_font layout="control" %} + {% endpropagated %} + {% endwith %}
{% trans "Timeline" %} diff --git a/src/pretix/control/templatetags/hierarkey_form.py b/src/pretix/control/templatetags/hierarkey_form.py index 954dcf9ec0..abf7371a6a 100644 --- a/src/pretix/control/templatetags/hierarkey_form.py +++ b/src/pretix/control/templatetags/hierarkey_form.py @@ -55,7 +55,7 @@ class PropagatedNode(Node):
{text_expl}
- + {text_orga}
diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index d677322b37..2cdec6efc6 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -1344,22 +1344,36 @@ class ItemUpdateGeneral(ItemDetailMixin, EventPermissionRequiredMixin, MetaDataE def form_valid(self, form): self.save_meta() messages.success(self.request, _('Your changes have been saved.')) - if form.has_changed() or any(f.has_changed() for f in self.plugin_forms): - data = { - k: form.cleaned_data.get(k) - for k in form.changed_data - } - for f in self.plugin_forms: - data.update({ - k: (f.cleaned_data.get(k).name - if isinstance(f.cleaned_data.get(k), File) - else f.cleaned_data.get(k)) - for k in f.changed_data - }) + + change_data = { + k: form.cleaned_data.get(k) + for k in form.changed_data + } + for f in self.plugin_forms: + change_data.update({ + k: (f.cleaned_data.get(k).name + if isinstance(f.cleaned_data.get(k), File) + else f.cleaned_data.get(k)) + for k in f.changed_data + }) + + meta_changed = {} + for f in self.meta_forms: + meta_changed.update({ + k: (f.cleaned_data.get(k).name + if isinstance(f.cleaned_data.get(k), File) + else f.cleaned_data.get(k)) + for k in f.changed_data + }) + if meta_changed: + change_data['meta_data'] = meta_changed + + if change_data: self.object.log_action( - 'pretix.event.item.changed', user=self.request.user, data=data + 'pretix.event.item.changed', user=self.request.user, data=change_data ) invalidate_cache.apply_async(kwargs={'event': self.request.event.pk, 'item': self.object.pk}) + for f in self.plugin_forms: f.save() diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index efb4eb8a5f..bb3cf4775c 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -1186,13 +1186,17 @@ class OrderTransition(OrderView): if ps == Decimal('0.00') and self.order.pending_sum <= Decimal('0.00'): p = self.order.payments.filter(state=OrderPayment.PAYMENT_STATE_CONFIRMED).last() if p: - p._mark_order_paid( - user=self.request.user, - send_mail=self.mark_paid_form.cleaned_data['send_email'], - force=self.mark_paid_form.cleaned_data.get('force', False), - payment_refund_sum=self.order.payment_refund_sum, - ) - messages.success(self.request, _('The order has been marked as paid.')) + try: + p._mark_order_paid( + user=self.request.user, + send_mail=self.mark_paid_form.cleaned_data['send_email'], + force=self.mark_paid_form.cleaned_data.get('force', False), + payment_refund_sum=self.order.payment_refund_sum, + ) + except Quota.QuotaExceededException as e: + messages.error(self.request, str(e)) + else: + messages.success(self.request, _('The order has been marked as paid.')) return redirect(self.get_order_url()) try: diff --git a/src/pretix/control/views/pdf.py b/src/pretix/control/views/pdf.py index 5fbb79bd31..38553a7b34 100644 --- a/src/pretix/control/views/pdf.py +++ b/src/pretix/control/views/pdf.py @@ -39,8 +39,8 @@ from django.utils.crypto import get_random_string from django.utils.timezone import now from django.utils.translation import gettext as _ from django.views.generic import TemplateView -from PyPDF2 import PdfFileReader, PdfFileWriter -from PyPDF2.utils import PdfReadError +from PyPDF2 import PdfReader, PdfWriter +from PyPDF2.errors import PdfReadError from reportlab.lib.units import mm from pretix.base.i18n import language @@ -153,9 +153,9 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView): def post(self, request, *args, **kwargs): if "emptybackground" in request.POST: - p = PdfFileWriter() + p = PdfWriter() try: - p.addBlankPage( + p.add_blank_page( width=float(request.POST.get('width')) * mm, height=float(request.POST.get('height')) * mm, ) @@ -203,7 +203,7 @@ class BaseEditorView(EventPermissionRequiredMixin, TemplateView): try: bg_bytes = c.file.read() - PdfFileReader(BytesIO(bg_bytes), strict=False) + PdfReader(BytesIO(bg_bytes), strict=False) except PdfReadError as e: return JsonResponse({ "status": "error", diff --git a/src/pretix/control/views/typeahead.py b/src/pretix/control/views/typeahead.py index 64977e69d9..0c89ae3372 100644 --- a/src/pretix/control/views/typeahead.py +++ b/src/pretix/control/views/typeahead.py @@ -228,9 +228,9 @@ def nav_context_list(request): if query: qs_orga = qs_orga.filter(Q(name__icontains=query) | Q(slug__icontains=query)) - if query: + if query and len(query) >= 3: qs_orders = Order.objects.filter( - code__icontains=query + code__istartswith=query ).select_related('event', 'event__organizer').only('event', 'code', 'pk').order_by() if not request.user.has_active_staff_session(request.session.session_key): qs_orders = qs_orders.filter( @@ -241,7 +241,7 @@ def nav_context_list(request): ) qs_vouchers = Voucher.objects.filter( - code__icontains=query + code__istartswith=query ).select_related('event', 'event__organizer').only('event', 'code', 'pk').order_by() if not request.user.has_active_staff_session(request.session.session_key): qs_vouchers = qs_vouchers.filter( diff --git a/src/pretix/multidomain/middlewares.py b/src/pretix/multidomain/middlewares.py index 566700bfed..004a36ed61 100644 --- a/src/pretix/multidomain/middlewares.py +++ b/src/pretix/multidomain/middlewares.py @@ -43,6 +43,7 @@ from django.core.cache import cache from django.core.exceptions import DisallowedHost from django.http.request import split_domain_port from django.middleware.csrf import CsrfViewMiddleware as BaseCsrfMiddleware +from django.shortcuts import render from django.urls import set_urlconf from django.utils.cache import patch_vary_headers from django.utils.deprecation import MiddlewareMixin @@ -112,7 +113,15 @@ class MultiDomainMiddleware(MiddlewareMixin): elif settings.DEBUG or domain in LOCAL_HOST_NAMES: request.urlconf = "pretix.multidomain.maindomain_urlconf" else: - raise DisallowedHost("Unknown host: %r" % host) + with scopes_disabled(): + is_fresh_install = not Event.objects.exists() + return render(request, '400_hostname.html', { + 'header_host': domain, + 'site_host': default_domain, + 'settings': settings, + 'xfh': request.headers.get('X-Forwarded-Host'), + 'is_fresh_install': is_fresh_install, + }, status=400) else: raise DisallowedHost("Invalid HTTP_HOST header: %r." % host) diff --git a/src/pretix/plugins/badges/exporters.py b/src/pretix/plugins/badges/exporters.py index c324cc10a3..fc1945886d 100644 --- a/src/pretix/plugins/badges/exporters.py +++ b/src/pretix/plugins/badges/exporters.py @@ -48,6 +48,7 @@ from django.db.models import Exists, OuterRef, Q from django.db.models.functions import Coalesce from django.utils.timezone import make_aware from django.utils.translation import gettext as _, gettext_lazy +from PyPDF2 import Transformation from reportlab.lib import pagesizes from reportlab.lib.units import mm from reportlab.pdfgen import canvas @@ -153,11 +154,19 @@ OPTIONS = OrderedDict([ 'offsets': [95 * mm, 55 * mm], 'pagesize': pagesizes.A4, }), + ('herma_40x40', { + 'name': 'HERMA 40 x 40 mm (9642)', + 'cols': 4, + 'rows': 6, + 'margins': [13.5 * mm, 15 * mm, 13.5 * mm, 15 * mm], + 'offsets': [46 * mm, 46 * mm], + 'pagesize': pagesizes.A4, + }), ]) def render_pdf(event, positions, opt): - from PyPDF2 import PdfFileReader, PdfFileWriter + from PyPDF2 import PdfReader, PdfWriter Renderer._register_fonts() renderermap = { @@ -168,7 +177,7 @@ def render_pdf(event, positions, opt): default_renderer = _renderer(event, event.badge_layouts.get(default=True)) except BadgeLayout.DoesNotExist: default_renderer = None - output_pdf_writer = PdfFileWriter() + output_pdf_writer = PdfWriter() any = False npp = opt['cols'] * opt['rows'] @@ -189,22 +198,19 @@ def render_pdf(event, positions, opt): p.showPage() p.save() buffer.seek(0) - canvas_pdf_reader = PdfFileReader(buffer) - empty_pdf_page = output_pdf_writer.addBlankPage( - width=opt['pagesize'][0] if opt['pagesize'] else positions[0][1].bg_pdf.getPage(0).mediaBox[2], - height=opt['pagesize'][1] if opt['pagesize'] else positions[0][1].bg_pdf.getPage(0).mediaBox[3], + canvas_pdf_reader = PdfReader(buffer) + empty_pdf_page = output_pdf_writer.add_blank_page( + width=opt['pagesize'][0] if opt['pagesize'] else positions[0][1].bg_pdf.pages[0].mediabox[2], + height=opt['pagesize'][1] if opt['pagesize'] else positions[0][1].bg_pdf.pages[0].mediabox[3], ) for i, (op, r) in enumerate(positions): - bg_page = copy.copy(r.bg_pdf.getPage(0)) - bg_page.trimBox = bg_page.mediaBox + bg_page = copy.copy(r.bg_pdf.pages[0]) + bg_page.trimbox = bg_page.mediabox offsetx = opt['margins'][3] + (i % opt['cols']) * opt['offsets'][0] offsety = opt['margins'][2] + (opt['rows'] - 1 - i // opt['cols']) * opt['offsets'][1] - empty_pdf_page.mergeTranslatedPage( - bg_page, - tx=offsetx, - ty=offsety - ) - empty_pdf_page.mergePage(canvas_pdf_reader.getPage(0)) + bg_page.add_transformation(Transformation().translate(offsetx, offsety)) + empty_pdf_page.merge_page(bg_page) + empty_pdf_page.merge_page(canvas_pdf_reader.pages[0]) pagebuffer = [] outbuffer = BytesIO() @@ -221,7 +227,7 @@ def render_pdf(event, positions, opt): if pagebuffer: render_page(pagebuffer) - output_pdf_writer.addMetadata({ + output_pdf_writer.add_metadata({ '/Title': 'Badges', '/Creator': 'pretix', }) diff --git a/src/pretix/plugins/paypal2/payment.py b/src/pretix/plugins/paypal2/payment.py index 505a671d02..bee42ad796 100644 --- a/src/pretix/plugins/paypal2/payment.py +++ b/src/pretix/plugins/paypal2/payment.py @@ -582,7 +582,7 @@ class PaypalMethod(BasePaymentProvider): on the 'confirm order' page. """ template = get_template('pretixplugins/paypal2/checkout_payment_confirm.html') - ctx = {'request': request, 'event': self.event, 'settings': self.settings} + ctx = {'request': request, 'event': self.event, 'settings': self.settings, 'method': self.method} return template.render(ctx) def execute_payment(self, request: HttpRequest, payment: OrderPayment): diff --git a/src/pretix/plugins/paypal2/signals.py b/src/pretix/plugins/paypal2/signals.py index a35c458db9..e37d50143d 100644 --- a/src/pretix/plugins/paypal2/signals.py +++ b/src/pretix/plugins/paypal2/signals.py @@ -107,6 +107,7 @@ def html_head_presale(sender, request=None, **kwargs): if provider.settings.get('_enabled', as_type=bool) and ( url.url_name == "event.order.pay.change" or + url.url_name == "event.order.pay" or (url.url_name == "event.checkout" and url.kwargs['step'] == "payment") or (url.namespace == "plugins:paypal2" and url.url_name == "pay") ): @@ -137,6 +138,7 @@ def signal_process_response(sender, request: HttpRequest, response: HttpResponse if provider.settings.get('_enabled', as_type=bool) and ( url.url_name == "event.order.pay.change" or + url.url_name == "event.order.pay" or (url.url_name == "event.checkout" and url.kwargs['step'] == "payment") or (url.namespace == "plugins:paypal2" and url.url_name == "pay") ): diff --git a/src/pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js b/src/pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js index adf3816caf..20acd921c2 100644 --- a/src/pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js +++ b/src/pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js @@ -141,11 +141,11 @@ var pretixpaypal = { pretixpaypal.restore(); }); - if ($("input[name=payment][value^='paypal']").is(':checked') || $(".payment-redo-form").length) { + if ($("input[name=payment][value^='paypal']").is(':checked')) { pretixpaypal.renderButton($("input[name=payment][value^='paypal']:checked").val()); - } - - if ($('#paypal-button-container').data('paypage')) { + } else if ($(".payment-redo-form").length) { + pretixpaypal.renderButton($("input[name=payment][value^='paypal']").val()); + } else if ($('#paypal-button-container').data('paypage')) { pretixpaypal.renderButton('paypal_apm'); } }, diff --git a/src/pretix/plugins/paypal2/views.py b/src/pretix/plugins/paypal2/views.py index 2f920c0053..b0b4203097 100644 --- a/src/pretix/plugins/paypal2/views.py +++ b/src/pretix/plugins/paypal2/views.py @@ -283,7 +283,7 @@ def success(request, *args, **kwargs): else: payment = None - if request.session.get('payment_paypal_id', None): + if request.session.get('payment_paypal_oid', None): if payment: prov = Paypal(request.event) try: @@ -296,7 +296,7 @@ def success(request, *args, **kwargs): return resp else: messages.error(request, _('Invalid response from PayPal received.')) - logger.error('Session did not contain payment_paypal_id') + logger.error('Session did not contain payment_paypal_oid') urlkwargs['step'] = 'payment' return redirect(eventreverse(request.event, 'presale:event.checkout', kwargs=urlkwargs)) diff --git a/src/pretix/plugins/sendmail/signals.py b/src/pretix/plugins/sendmail/signals.py index 6472a8c6d2..b5a572a07e 100644 --- a/src/pretix/plugins/sendmail/signals.py +++ b/src/pretix/plugins/sendmail/signals.py @@ -42,6 +42,7 @@ from django.db.models.signals import post_save from django.dispatch import receiver from django.urls import resolve, reverse from django.utils import timezone +from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from django_scopes import scope, scopes_disabled @@ -134,6 +135,7 @@ def sendmail_run_rules(sender, **kwargs): with scopes_disabled(): mails = ScheduledMail.objects.all() + unchanged = [] for m in mails.filter(Q(last_computed__isnull=True) | Q(subevent__last_modified__gt=F('last_computed')) | Q(event__last_modified__gt=F('last_computed'))): @@ -141,6 +143,17 @@ def sendmail_run_rules(sender, **kwargs): m.recompute() if m.computed_datetime != previous: m.save(update_fields=['last_computed', 'computed_datetime']) + else: + unchanged.append(m.pk) + + if unchanged: + # Theoretically, we don't need to write back the unchanged ones to the database… but that will cause us to + # recompute them on every run until eternity. So we want to set their last_computed date to something more + # recent... but not for all of them at once, in case it's millions, so we don't stress the database without + # cause + batch_size = max(connection.ops.bulk_batch_size(['id'], unchanged) - 2, 100) + for i in range(max(1, 5000 // batch_size)): + ScheduledMail.objects.filter(pk__in=unchanged[i * batch_size:batch_size]).update(last_computed=now()) mails.filter( state=ScheduledMail.STATE_SCHEDULED, diff --git a/src/pretix/plugins/stripe/payment.py b/src/pretix/plugins/stripe/payment.py index 7d50f244fd..604ed49682 100644 --- a/src/pretix/plugins/stripe/payment.py +++ b/src/pretix/plugins/stripe/payment.py @@ -166,6 +166,11 @@ class StripeSettingsHolder(BasePaymentProvider): label=_('Stripe account'), disabled=True )), + ('connect_user_id', + forms.CharField( + label=_('Stripe account'), + disabled=True + )), ('endpoint', forms.ChoiceField( label=_('Endpoint'), diff --git a/src/pretix/plugins/ticketoutputpdf/exporters.py b/src/pretix/plugins/ticketoutputpdf/exporters.py index f686f63000..cc1545b485 100644 --- a/src/pretix/plugins/ticketoutputpdf/exporters.py +++ b/src/pretix/plugins/ticketoutputpdf/exporters.py @@ -43,7 +43,7 @@ from django.db.models import Q from django.db.models.functions import Coalesce from django.utils.timezone import make_aware from django.utils.translation import gettext as _, gettext_lazy -from PyPDF2.merger import PdfFileMerger +from PyPDF2 import PdfMerger from pretix.base.exporter import BaseExporter from pretix.base.i18n import language @@ -105,7 +105,7 @@ class AllTicketsPDF(BaseExporter): return d def render(self, form_data): - merger = PdfFileMerger() + merger = PdfMerger() qs = OrderPosition.objects.filter( order__event__in=self.events ).prefetch_related( diff --git a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py index b05a8517ca..dd99310e73 100644 --- a/src/pretix/plugins/ticketoutputpdf/ticketoutput.py +++ b/src/pretix/plugins/ticketoutputpdf/ticketoutput.py @@ -44,7 +44,7 @@ from django.http import HttpRequest from django.template.loader import get_template from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ -from PyPDF2 import PdfFileMerger +from PyPDF2 import PdfMerger from pretix.base.i18n import language from pretix.base.models import Order, OrderPosition @@ -112,7 +112,7 @@ class PdfTicketOutput(BaseTicketOutput): return renderer.render_background(buffer, _('Ticket')) def generate_order(self, order: Order): - merger = PdfFileMerger() + merger = PdfMerger() with language(order.locale, self.event.settings.region): for op in order.positions_with_tickets: layout = override_layout.send_chained( diff --git a/src/pretix/presale/forms/checkout.py b/src/pretix/presale/forms/checkout.py index 3b67b59784..19b2d997b2 100644 --- a/src/pretix/presale/forms/checkout.py +++ b/src/pretix/presale/forms/checkout.py @@ -221,15 +221,13 @@ class MembershipForm(forms.Form): else: types = self.position.item.require_membership_types.all() - initial = None - memberships = [ m for m in self.memberships if m.is_valid(ev) and m.membership_type in types ] if len(memberships) == 1: - initial = str(memberships[0].pk) + self.initial['membership'] = str(memberships[0].pk) self.fields['membership'] = forms.ChoiceField( label=_('Membership'), @@ -237,7 +235,6 @@ class MembershipForm(forms.Form): (str(m.pk), self._label_from_instance(m)) for m in memberships ], - initial=initial, widget=forms.RadioSelect, ) self.is_empty = not memberships diff --git a/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html b/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html index f8c600b0b6..cc60c07eb1 100644 --- a/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html +++ b/src/pretix/presale/templates/pretixpresale/event/fragment_product_list.html @@ -58,9 +58,9 @@ {% endblocktrans %} - {% elif not item.min_price and not item.max_price %} + {% elif not item.min_price and not item.max_price and not item.mandatory_priced_addons %} {% trans "free" context "price" %} - {% else %} + {% elif not item.mandatory_priced_addons %} {{ item.min_price|money:event.currency }} {% endif %} @@ -144,7 +144,9 @@

{% elif not var.display_price.gross %} - {% trans "free" context "price" %} + {% if not item.mandatory_priced_addons %} + {% trans "free" context "price" %} + {% endif %} {% elif event.settings.display_net_prices %} {{ var.display_price.net|money:event.currency }} {% else %} @@ -276,7 +278,9 @@

{% elif not item.display_price.gross %} - {% trans "free" context "price" %} + {% if not item.mandatory_priced_addons %} + {% trans "free" context "price" %} + {% endif %} {% elif event.settings.display_net_prices %} {{ item.display_price.net|money:event.currency }} {% else %} diff --git a/src/pretix/presale/templates/pretixpresale/event/index.html b/src/pretix/presale/templates/pretixpresale/event/index.html index a1cf99ff7b..c8a8684156 100644 --- a/src/pretix/presale/templates/pretixpresale/event/index.html +++ b/src/pretix/presale/templates/pretixpresale/event/index.html @@ -27,7 +27,11 @@ {% block custom_header %} {{ block.super }} - + {% if request.event.has_subevents and not subevent %} + + {% else %} + + {% endif %} {% if subevent %} {% else %} diff --git a/src/pretix/presale/urls.py b/src/pretix/presale/urls.py index 7d03beae59..db39986e0b 100644 --- a/src/pretix/presale/urls.py +++ b/src/pretix/presale/urls.py @@ -93,6 +93,10 @@ event_patterns = [ name='event.payment.unlock'), re_path(r'resend/$', pretix.presale.views.user.ResendLinkView.as_view(), name='event.resend_link'), + re_path(r'^favicon.ico/?$', + pretix.presale.views.organizer.OrganizerFavicon.as_view(), + name='event.favicon'), + re_path(r'^order/(?P[^/]+)/(?P[A-Za-z0-9]+)/open/(?P[a-z0-9]+)/$', pretix.presale.views.order.OrderOpen.as_view(), name='event.order.open'), re_path(r'^order/(?P[^/]+)/(?P[A-Za-z0-9]+)/$', pretix.presale.views.order.OrderDetails.as_view(), @@ -164,6 +168,9 @@ event_patterns = [ organizer_patterns = [ re_path(r'^$', pretix.presale.views.organizer.OrganizerIndex.as_view(), name='organizer.index'), + re_path(r'^favicon.ico/?$', + pretix.presale.views.organizer.OrganizerFavicon.as_view(), + name='organizer.favicon'), re_path(r'^events/ical/$', pretix.presale.views.organizer.OrganizerIcalDownload.as_view(), name='organizer.ical'), diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index 08577ae653..18b0658cee 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -65,7 +65,7 @@ from pretix.base.models import ( ) from pretix.base.models.event import SubEvent from pretix.base.models.items import ( - ItemBundle, SubEventItem, SubEventItemVariation, + ItemAddOn, ItemBundle, SubEventItem, SubEventItemVariation, ) from pretix.base.services.quotas import QuotaAvailability from pretix.helpers.compat import date_fromisocalendar @@ -183,6 +183,13 @@ def get_grouped_items(event, subevent=None, voucher=None, channel='web', require subevent=subevent, ) ), + mandatory_priced_addons=Exists( + ItemAddOn.objects.filter( + base_item_id=OuterRef('pk'), + min_count__gte=1, + price_included=False + ) + ), requires_seat=requires_seat, ).filter( quotac__gt=0, subevent_disabled=False, diff --git a/src/pretix/presale/views/organizer.py b/src/pretix/presale/views/organizer.py index 1a5d96ee9a..f76d78eccb 100644 --- a/src/pretix/presale/views/organizer.py +++ b/src/pretix/presale/views/organizer.py @@ -48,6 +48,7 @@ from django.db.models import Exists, Max, Min, OuterRef, Prefetch, Q from django.db.models.functions import Coalesce, Greatest from django.http import Http404, HttpResponse from django.shortcuts import redirect +from django.templatetags.static import static from django.utils.decorators import method_decorator from django.utils.formats import date_format, get_format from django.utils.timezone import get_current_timezone, now @@ -66,6 +67,7 @@ from pretix.helpers.daterange import daterange from pretix.helpers.formats.en.formats import ( SHORT_MONTH_DAY_FORMAT, WEEK_FORMAT, ) +from pretix.helpers.thumb import get_thumbnail from pretix.multidomain.urlreverse import eventreverse from pretix.presale.ical import get_public_ical from pretix.presale.views import OrganizerViewMixin @@ -1170,3 +1172,11 @@ class OrganizerIcalDownload(OrganizerViewMixin, View): if request.organizer.settings.meta_noindex: resp['X-Robots-Tag'] = 'noindex' return resp + + +class OrganizerFavicon(View): + def get(self, *args, **kwargs): + if self.request.organizer.settings.favicon: + return redirect(get_thumbnail(self.request.organizer.settings.favicon, '32x32^').thumb.url) + else: + return redirect(static("pretixbase/img/favicon.ico")) diff --git a/src/pretix/settings.py b/src/pretix/settings.py index 1a68d21e99..f58bd0d532 100644 --- a/src/pretix/settings.py +++ b/src/pretix/settings.py @@ -170,7 +170,7 @@ PRETIX_SESSION_TIMEOUT_RELATIVE = 3600 * 3 PRETIX_SESSION_TIMEOUT_ABSOLUTE = 3600 * 12 PRETIX_PRIMARY_COLOR = '#8E44B3' -SITE_URL = config.get('pretix', 'url', fallback='http://localhost') +SITE_URL = config.get('pretix', 'url', fallback='http://localhost:8000') if SITE_URL.endswith('/'): SITE_URL = SITE_URL[:-1] diff --git a/src/pretix/static/npm_dir/package-lock.json b/src/pretix/static/npm_dir/package-lock.json index 671dbd69d3..87a57a1ac3 100644 --- a/src/pretix/static/npm_dir/package-lock.json +++ b/src/pretix/static/npm_dir/package-lock.json @@ -22,25 +22,25 @@ } }, "@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==" + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==" }, "@babel/core": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", - "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", + "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helpers": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.10", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.10", + "@babel/types": "^7.18.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -48,20 +48,121 @@ "semver": "^6.3.0" }, "dependencies": { + "@babel/generator": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", + "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", + "requires": { + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, "@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "@babel/parser": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", + "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==" + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", + "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "requires": { + "@babel/helper-string-parser": "^7.18.10", "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", @@ -134,9 +235,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -150,12 +251,12 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", - "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", "requires": { "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" }, "dependencies": { "@babel/helper-validator-identifier": { @@ -164,9 +265,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -208,30 +309,31 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", - "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", + "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6" }, "dependencies": { "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "requires": { - "@babel/types": "^7.18.6" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-validator-identifier": { @@ -240,9 +342,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -265,14 +367,12 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", - "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", + "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2", @@ -305,9 +405,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -383,10 +483,10 @@ } } }, - "@babel/helper-member-expression-to-functions": { + "@babel/helper-hoist-variables": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", - "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "requires": { "@babel/types": "^7.18.6" }, @@ -397,9 +497,38 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "requires": { + "@babel/types": "^7.18.9" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" + }, + "@babel/types": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -478,9 +607,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -494,25 +623,25 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", - "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-wrap-function": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" }, "dependencies": { "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, "@babel/helper-validator-identifier": { "version": "7.18.6", @@ -520,9 +649,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -536,36 +665,87 @@ } }, "@babel/helper-replace-supers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", - "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-member-expression-to-functions": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "dependencies": { + "@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "requires": { + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } }, "@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, + "@babel/parser": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==" + }, + "@babel/traverse": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -603,11 +783,11 @@ } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", - "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.18.9" }, "dependencies": { "@babel/helper-validator-identifier": { @@ -616,9 +796,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -660,28 +840,54 @@ } } }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" + }, "@babel/helper-validator-identifier": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" }, - "@babel/helper-wrap-function": { + "@babel/helper-validator-option": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", - "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + }, + "@babel/helper-wrap-function": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", + "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", "requires": { - "@babel/helper-function-name": "^7.18.6", + "@babel/helper-function-name": "^7.18.9", "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "requires": { - "@babel/highlight": "^7.18.6" + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-validator-identifier": { @@ -689,40 +895,47 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==" }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "@babel/traverse": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", + "debug": "^4.1.0", + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -731,29 +944,86 @@ } }, "@babel/helpers": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", - "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "requires": { "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "dependencies": { + "@babel/generator": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", + "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", + "requires": { + "@babel/types": "^7.18.10", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, "@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "@babel/parser": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", + "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==" + }, + "@babel/traverse": { + "version": "7.18.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", + "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.10", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.11", + "@babel/types": "^7.18.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", + "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", + "requires": { + "@babel/helper-string-parser": "^7.18.10", "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -792,13 +1062,13 @@ } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", - "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" } }, "@babel/plugin-proposal-async-generator-functions": { @@ -810,13 +1080,6 @@ "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-remap-async-to-generator": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "dependencies": { - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" - } } }, "@babel/plugin-proposal-class-properties": { @@ -848,11 +1111,11 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", - "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, @@ -866,11 +1129,11 @@ } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", - "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, @@ -893,21 +1156,32 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", - "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.6" + "@babel/plugin-transform-parameters": "^7.18.8" }, "dependencies": { - "@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==" + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -921,12 +1195,12 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", - "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, @@ -1111,9 +1385,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -1135,39 +1409,40 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", - "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-classes": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", - "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" }, "dependencies": { "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "requires": { - "@babel/types": "^7.18.6" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-validator-identifier": { @@ -1176,9 +1451,9 @@ "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -1192,19 +1467,19 @@ } }, "@babel/plugin-transform-computed-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", - "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-destructuring": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", - "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-dotall-regex": { @@ -1217,11 +1492,11 @@ } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", - "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { @@ -1234,29 +1509,75 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", - "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-function-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", - "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "requires": { - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-function-name": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "dependencies": { + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" + }, + "@babel/types": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + } } }, "@babel/plugin-transform-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", - "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { @@ -1275,104 +1596,6 @@ "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - } } }, "@babel/plugin-transform-modules-commonjs": { @@ -1384,137 +1607,42 @@ "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-simple-access": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - } } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", - "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-validator-identifier": "^7.18.6", "babel-plugin-dynamic-import-node": "^2.3.3" }, "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "requires": { - "@babel/highlight": "^7.18.6" + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" } }, "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "requires": { - "@babel/types": "^7.18.6" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-module-imports": { @@ -1526,34 +1654,18 @@ } }, "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "requires": { - "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", "@babel/helper-simple-access": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.18.6", "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-validator-identifier": { @@ -1561,40 +1673,47 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==" }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "@babel/traverse": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", + "debug": "^4.1.0", + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -1609,104 +1728,6 @@ "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz", - "integrity": "sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==" - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", - "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" - }, - "@babel/template": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", - "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.6", - "@babel/types": "^7.18.6" - } - }, - "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - } } }, "@babel/plugin-transform-named-capturing-groups-regex": { @@ -1736,9 +1757,9 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", - "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -1777,12 +1798,12 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", - "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" } }, "@babel/plugin-transform-sticky-regex": { @@ -1794,19 +1815,19 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", - "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", - "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-escapes": { @@ -1827,28 +1848,28 @@ } }, "@babel/preset-env": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", - "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz", + "integrity": "sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==", "requires": { - "@babel/compat-data": "^7.18.6", - "@babel/helper-compilation-targets": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", "@babel/plugin-proposal-async-generator-functions": "^7.18.6", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.18.6", "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", @@ -1870,37 +1891,37 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.6", - "@babel/plugin-transform-classes": "^7.18.6", - "@babel/plugin-transform-computed-properties": "^7.18.6", - "@babel/plugin-transform-destructuring": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.6", - "@babel/plugin-transform-function-name": "^7.18.6", - "@babel/plugin-transform-literals": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.18.6", "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.9", "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.6", - "@babel/plugin-transform-typeof-symbol": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.18.6", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.6", + "@babel/types": "^7.18.9", "babel-plugin-polyfill-corejs2": "^0.3.1", "babel-plugin-polyfill-corejs3": "^0.5.2", "babel-plugin-polyfill-regenerator": "^0.3.1", @@ -1908,25 +1929,26 @@ "semver": "^6.3.0" }, "dependencies": { - "@babel/compat-data": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==" + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } }, "@babel/helper-validator-identifier": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" - }, "@babel/types": { - "version": "7.18.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.7.tgz", - "integrity": "sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" @@ -1957,9 +1979,9 @@ } }, "@babel/runtime": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.6.tgz", - "integrity": "sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", "requires": { "regenerator-runtime": "^0.13.4" }, @@ -2207,20 +2229,15 @@ } }, "@vue/compiler-sfc": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.0.tgz", - "integrity": "sha512-hPOI15RsXO1G8aK6FNF93ld9C/D4e/uAJBE59K8NnL8giuKqeVksvamgu4jKhCJ9f9bbUpj5BuSV3sufIx2hmw==", + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.8.tgz", + "integrity": "sha512-2DK4YWKfgLnW9VDR9gnju1gcYRk3flKj8UNsms7fsRmFcg35slVTZEkqwBtX+wJBXaamFfn6NxSsZh3h12Ix/Q==", "requires": { "@babel/parser": "^7.18.4", "postcss": "^8.4.14", "source-map": "^0.6.1" }, "dependencies": { - "@babel/parser": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.6.tgz", - "integrity": "sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==" - }, "postcss": { "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", @@ -2356,12 +2373,12 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", - "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", + "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.2", "semver": "^6.1.1" }, "dependencies": { @@ -2373,11 +2390,11 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", - "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", + "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.1", + "@babel/helper-define-polyfill-provider": "^0.3.2", "core-js-compat": "^3.21.0" } }, @@ -2639,34 +2656,39 @@ "optional": true }, "core-js-compat": { - "version": "3.23.3", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz", - "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==", + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", + "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", "requires": { - "browserslist": "^4.21.0", + "browserslist": "^4.21.3", "semver": "7.0.0" }, "dependencies": { "browserslist": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.1.tgz", - "integrity": "sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "requires": { - "caniuse-lite": "^1.0.30001359", - "electron-to-chromium": "^1.4.172", - "node-releases": "^2.0.5", - "update-browserslist-db": "^1.0.4" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" } }, "caniuse-lite": { - "version": "1.0.30001361", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001361.tgz", - "integrity": "sha512-ybhCrjNtkFji1/Wto6SSJKkWk6kZgVQsDq5QI83SafsF6FXv2JB4df9eEdH6g8sdGgqTXrFLjAxqBGgYoU3azQ==" + "version": "1.0.30001373", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001373.tgz", + "integrity": "sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==" }, "electron-to-chromium": { - "version": "1.4.176", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.176.tgz", - "integrity": "sha512-92JdgyRlcNDwuy75MjuFSb3clt6DGJ2IXSpg0MCjKd3JV9eSmuUAIyWiGAp/EtT0z2D4rqbYqThQLV90maH3Zw==" + "version": "1.4.206", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.206.tgz", + "integrity": "sha512-h+Fadt1gIaQ06JaIiyqPsBjJ08fV5Q7md+V8bUvQW/9OvXfL2LRICTz2EcnnCP7QzrFTS6/27MRV6Bl9Yn97zA==" + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "semver": { "version": "7.0.0", @@ -3747,9 +3769,9 @@ } }, "rollup": { - "version": "2.75.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz", - "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==", + "version": "2.77.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.2.tgz", + "integrity": "sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==", "requires": { "fsevents": "~2.3.2" } @@ -3980,9 +4002,9 @@ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" }, "update-browserslist-db": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", - "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -4006,11 +4028,11 @@ "optional": true }, "vue": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.0.tgz", - "integrity": "sha512-su25f1hocH+QNkVEqk+Oj7B+mkDIWU70l0YY7nYSJFEs3Z64njXxo65RUXnWH46ooEhKmEWyLdW6HcYn8coNrg==", + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.8.tgz", + "integrity": "sha512-ncwlZx5qOcn754bCu5/tS/IWPhXHopfit79cx+uIlLMyt3vCMGcXai5yCG5y+I6cDmEj4ukRYyZail9FTQh7lQ==", "requires": { - "@vue/compiler-sfc": "2.7.0", + "@vue/compiler-sfc": "2.7.8", "csstype": "^3.1.0" } }, @@ -4020,9 +4042,9 @@ "integrity": "sha512-pZfGp+PW/IXEOyETE09xQHR1CKkR9HfHZdnMD/FVLUNI+HxYTa82evx5WrF6Kz4s82qtqHvMZ8MZpbk2zT2E1Q==" }, "vue-template-compiler": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.0.tgz", - "integrity": "sha512-b9kKOPNS6J2BVf9skXkKsUwQLP3Bjfb/gG6UoBt3fn4xUVEDko5TSWmkPGW6dSSeAOOvYEMALdouv9caKlTq0Q==", + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.8.tgz", + "integrity": "sha512-eQqdcUpJKJpBRPDdxCNsqUoT0edNvdt1jFjtVnVS/LPPmr0BU2jWzXlrf6BVMeODtdLewB3j8j3WjNiB+V+giw==", "requires": { "de-indent": "^1.0.2", "he": "^1.2.0" diff --git a/src/pretix/static/npm_dir/package.json b/src/pretix/static/npm_dir/package.json index f1eaad2ea7..0adf9cf6c9 100644 --- a/src/pretix/static/npm_dir/package.json +++ b/src/pretix/static/npm_dir/package.json @@ -4,13 +4,13 @@ "private": true, "scripts": {}, "dependencies": { - "@babel/core": "^7.18.6", - "@babel/preset-env": "^7.18.6", + "@babel/core": "^7.18.10", + "@babel/preset-env": "^7.18.9", "@rollup/plugin-babel": "^5.3.1", "@rollup/plugin-node-resolve": "^13.3.0", - "vue": "^2.7.0", - "rollup": "^2.75.7", + "vue": "^2.7.8", + "rollup": "^2.77.2", "rollup-plugin-vue": "^5.0.1", - "vue-template-compiler": "^2.7.0" + "vue-template-compiler": "^2.7.8" } } diff --git a/src/pretix/static/pretixcontrol/js/ui/editor.js b/src/pretix/static/pretixcontrol/js/ui/editor.js index 381e10eeac..f2b5a33f4f 100644 --- a/src/pretix/static/pretixcontrol/js/ui/editor.js +++ b/src/pretix/static/pretixcontrol/js/ui/editor.js @@ -300,7 +300,6 @@ var editor = { // Fetch the required page editor.pdf.getPage(page_number).then(function (page) { - console.log('Page loaded'); var canvas = document.getElementById('pdf-canvas'); var scale = editor.$cva.width() / page.getViewport(1.0).width; @@ -326,7 +325,6 @@ var editor = { editor.pdf_page_number = page_number editor._init_page_nav(); - console.log('Page rendered'); if (dump || !editor._fabric_loaded) { editor._init_fabric(dump); } else { @@ -349,7 +347,6 @@ var editor = { } $("#page_nav").append($li) $a.on("click", function (event) { - console.log("switch to page", $(this).attr("data-page")); editor.fabric.deactivateAll(); editor._load_page(parseInt($(this).attr("data-page"))); event.preventDefault(); @@ -369,7 +366,6 @@ var editor = { // Asynchronous download of PDF var loadingTask = PDFJS.getDocument(url); loadingTask.promise.then(function (pdf) { - console.log('PDF loaded'); editor.pdf = pdf; editor.pdf_page_count = pdf.numPages; @@ -422,7 +418,6 @@ var editor = { } editor._fabric_loaded = true; - console.log("Fabric loaded"); if (editor._window_loaded) { editor._ready(); } @@ -430,7 +425,6 @@ var editor = { _window_load_event: function () { editor._window_loaded = true; - console.log("Window loaded"); if (editor._fabric_loaded) { editor._ready(); } @@ -520,7 +514,7 @@ var editor = { } }, - _update_values_from_toolbox: function () { + _update_values_from_toolbox: function (e) { var o = editor.fabric.getActiveObject(); if (!o) { o = editor.fabric.getActiveGroup(); @@ -553,8 +547,16 @@ var editor = { $("#toolbox-content-other-help").toggle($("#toolbox-content").val() === "other" || $("#toolbox-content").val() === "other_i18n"); o.content = $("#toolbox-content").val(); if ($("#toolbox-content").val() === "other") { + if (e.target.id === "toolbox-content") { + // user used dropdown to switch content-type, update value with value from i18n textarea + $("#toolbox-content-other").val($("#toolbox-content-other-i18n textarea").val()); + } o.text = $("#toolbox-content-other").val(); } else if ($("#toolbox-content").val() === "other_i18n") { + if (e.target.id === "toolbox-content") { + // user used dropdown to switch content-type, update value with value from "other" textarea + $("#toolbox-content-other-i18n textarea").val($("#toolbox-content-other").val()); + } o.text_i18n = {} $("#toolbox-content-other-i18n textarea").each(function () { o.text_i18n[$(this).attr("lang")] = $(this).val(); @@ -608,8 +610,16 @@ var editor = { $("#toolbox-content-other-help").toggle($("#toolbox-content").val() === "other" || $("#toolbox-content").val() === "other_i18n"); o.content = $("#toolbox-content").val(); if ($("#toolbox-content").val() === "other") { + if (e.target.id === "toolbox-content") { + // user used dropdown to switch content-type, update value with value from i18n textarea + $("#toolbox-content-other").val($("#toolbox-content-other-i18n textarea").val()); + } o.setText($("#toolbox-content-other").val()); } else if ($("#toolbox-content").val() === "other_i18n") { + if (e.target.id === "toolbox-content") { + // user used dropdown to switch content-type, update value with value from "other" textarea + $("#toolbox-content-other-i18n textarea").val($("#toolbox-content-other").val()); + } o.text_i18n = {} $("#toolbox-content-other-i18n textarea").each(function () { o.text_i18n[$(this).attr("lang")] = $(this).val(); @@ -620,6 +630,14 @@ var editor = { } } + // empty text-inputs if not in use + if ($("#toolbox-content").val() !== "other") { + $("#toolbox-content-other").val(""); + } + if ($("#toolbox-content").val() !== "other_i18n") { + $("#toolbox-content-other-i18n textarea").val(""); + } + o.setCoords(); editor.fabric.renderAll(); }, @@ -1055,14 +1073,14 @@ var editor = { $("#toolbox label.btn").bind('click change', editor._update_values_from_toolbox); $("#toolbox select").bind('change', editor._update_values_from_toolbox); $("#toolbox select").bind('change', editor._create_savepoint); - $("#toolbox button.toggling").bind('click change', function () { + $("#toolbox button.toggling").bind('click change', function (e) { if ($(this).is(".option")) { $(this).addClass("active"); $(this).parent().siblings().find("button").removeClass("active"); } else { $(this).toggleClass("active"); } - editor._update_values_from_toolbox(); + editor._update_values_from_toolbox(e); editor._create_savepoint(); }); $("#toolbox .colorpickerfield").bind('changeColor', editor._update_values_from_toolbox); diff --git a/src/pretix/static/pretixcontrol/js/ui/main.js b/src/pretix/static/pretixcontrol/js/ui/main.js index 970b97fd76..79a44ec37d 100644 --- a/src/pretix/static/pretixcontrol/js/ui/main.js +++ b/src/pretix/static/pretixcontrol/js/ui/main.js @@ -665,33 +665,8 @@ var form_handlers = function (el) { questions_init_photos(el); }; -$(function () { - "use strict"; - - $("body").removeClass("nojs"); - lightbox.init(); - - $(document).on("click", ".variations .variations-select-all", function (e) { - $(this).parent().parent().find("input[type=checkbox]").prop("checked", true).change(); - e.stopPropagation(); - return false; - }); - $(document).on("click", ".variations .variations-select-none", function (e) { - $(this).parent().parent().find("input[type=checkbox]").prop("checked", false).change(); - e.stopPropagation(); - return false; - }); - if ($(".items-on-quota").length) { - $(".items-on-quota .panel").each(function () { - var $panel = $(this); - $panel.toggleClass("panel-success", $panel.find("input:checked").length > 0); - $(this).find("input").change(function () { - $panel.toggleClass("panel-success", $panel.find("input:checked").length > 0); - }); - }); - } - - $("#sumtoggle").find("button").click(function () { +function setup_basics(el) { + el.find("#sumtoggle").find("button").click(function () { $(".table-product-overview .sum-gross").toggle($(this).attr("data-target") === ".sum-gross"); $(".table-product-overview .sum-net").toggle($(this).attr("data-target") === ".sum-net"); $(".table-product-overview .count").toggle($(this).attr("data-target") === ".count"); @@ -700,18 +675,18 @@ $(function () { $(this).addClass("active"); }); - $('.collapsible').collapse(); - $("input[data-toggle=radiocollapse]").change(function () { + el.find('.collapsible').collapse(); + el.find("input[data-toggle=radiocollapse]").change(function () { $($(this).attr("data-parent")).find(".collapse.in").collapse('hide'); $($(this).attr("data-target")).collapse('show'); }); - $("div.collapsed").removeClass("collapsed").addClass("collapse"); - $(".has-error").each(function () { + el.find("div.collapsed").removeClass("collapsed").addClass("collapse"); + el.find(".has-error").each(function () { $(this).closest("div.panel-collapse").collapse("show"); }); - $('[data-toggle="tooltip"]').tooltip(); - $('[data-toggle="tooltip_html"]').tooltip({ + el.find('[data-toggle="tooltip"]').tooltip(); + el.find('[data-toggle="tooltip_html"]').tooltip({ 'html': true, 'whiteList': { // Global attributes allowed on any supplied element below. @@ -733,7 +708,7 @@ $(function () { if (url.match('#')) { $('.nav-tabs a[href="#' + url.split('#')[1] + '"]').tab('show'); } - $('a[data-toggle="tab"]').on('click', function (e) { + el.find('a[data-toggle="tab"]').on('click', function (e) { if (!$(this).closest(".tab-content").length) { // only append hash if not inside a .panel window.location.hash = this.hash; @@ -741,7 +716,7 @@ $(function () { }); // Event wizard - $("#event-slug-random-generate").click(function () { + el.find("#event-slug-random-generate").click(function () { var url = $(this).attr("data-rng-url"); $("#id_basics-slug").val("Generating..."); $.getJSON(url, function (data) { @@ -749,10 +724,7 @@ $(function () { }); }); - form_handlers($("body")); - $(document).trigger("pretix:bind-forms"); - - $(".qrcode-canvas").each(function () { + el.find(".qrcode-canvas").each(function () { $(this).qrcode( { text: $.trim($($(this).attr("data-qrdata")).html()) @@ -760,10 +732,10 @@ $(function () { ); }); - $(".propagated-settings-box").find("input, textarea, select").not("[readonly]") + el.find(".propagated-settings-box").find("input, textarea, select").not("[readonly]") .attr("data-propagated-locked", "true").prop("readonly", true); - $(".propagated-settings-box button[data-action=unlink]").click(function (ev) { + el.find(".propagated-settings-box button[data-action=unlink]").click(function (ev) { var $box = $(this).closest(".propagated-settings-box"); $box.find("input[name=decouple]").val($(this).val()); $box.find("[data-propagated-locked]").prop("readonly", false); @@ -773,7 +745,7 @@ $(function () { }); // Tables with bulk selection, e.g. subevent list - $("input[data-toggle-table]").each(function (ev) { + el.find("input[data-toggle-table]").each(function (ev) { var $toggle = $(this); var $actionButtons = $(".batch-select-actions button", this.form); var countLabels = $("").appendTo($actionButtons); @@ -852,7 +824,7 @@ $(function () { if (!nrOfChecked) countLabels.empty(); else countLabels.text(" ("+nrOfChecked+")"); - if (!allChecked) $selectAll.find("input").prop("checked", false); + if (!allChecked) $selectAll.find("input").prop("checked", false); $actionButtons.attr("disabled", !nrOfChecked); $toggle.prop("checked", allChecked).prop("indeterminate", nrOfChecked > 0 && !allChecked); @@ -875,7 +847,7 @@ $(function () { }); // Items and categories - $(".internal-name-wrapper").each(function () { + el.find(".internal-name-wrapper").each(function () { if ($(this).find("input").val() === "") { var $fg = $(this).find(".form-group"); $fg.hide(); @@ -896,7 +868,7 @@ $(function () { } }); - $("button[data-toggle=qrcode]").click(function (e) { + el.find("button[data-toggle=qrcode]").click(function (e) { e.preventDefault(); var $current = $(".qr-code-overlay[data-qrcode='" + $(this).attr("data-qrcode") + "']"); if ($current.length) { @@ -926,6 +898,37 @@ $(function () { }); return false; }); +} + +$(function () { + "use strict"; + + $("body").removeClass("nojs"); + lightbox.init(); + + $(document).on("click", ".variations .variations-select-all", function (e) { + $(this).parent().parent().find("input[type=checkbox]").prop("checked", true).change(); + e.stopPropagation(); + return false; + }); + $(document).on("click", ".variations .variations-select-none", function (e) { + $(this).parent().parent().find("input[type=checkbox]").prop("checked", false).change(); + e.stopPropagation(); + return false; + }); + if ($(".items-on-quota").length) { + $(".items-on-quota .panel").each(function () { + var $panel = $(this); + $panel.toggleClass("panel-success", $panel.find("input:checked").length > 0); + $(this).find("input").change(function () { + $panel.toggleClass("panel-success", $panel.find("input:checked").length > 0); + }); + }); + } + + setup_basics($("body")); + form_handlers($("body")); + $(document).trigger("pretix:bind-forms"); $("#ajaxerr").on("click", ".ajaxerr-close", ajaxErrDialog.hide); moment.locale($("body").attr("data-datetimelocale")); diff --git a/src/pretix/static/pretixcontrol/js/ui/typeahead.js b/src/pretix/static/pretixcontrol/js/ui/typeahead.js index 1e10f53ca5..b3067706f0 100644 --- a/src/pretix/static/pretixcontrol/js/ui/typeahead.js +++ b/src/pretix/static/pretixcontrol/js/ui/typeahead.js @@ -12,13 +12,8 @@ $(function () { var $query = $(this).find('[data-typeahead-query]').length ? $(this).find('[data-typeahead-query]') : $($(this).attr("data-typeahead-field")); $container.find("li:not(.query-holder)").remove(); var lastQuery = ""; - - $query.on("change", function () { - if ($container.attr("data-typeahead-field") && $query.val() === "") { - $container.removeClass('focused'); - $container.find("li:not(.query-holder)").remove(); - return; - } + var runQueryTimeout = null; + function runQuery() { lastQuery = $query.val(); var thisQuery = $query.val(); $.getJSON( @@ -119,6 +114,17 @@ $(function () { $container.toggleClass('focused', $query.is(":focus") && $container.children().length > 0); } ); + } + $query.on("change", function () { + if ($container.attr("data-typeahead-field") && $query.val() === "") { + $container.removeClass('focused'); + $container.find("li:not(.query-holder)").remove(); + return; + } + if (runQueryTimeout != null) { + window.clearTimeout(runQueryTimeout) + } + runQueryTimeout = window.setTimeout(runQuery, 250) }); $query.on("keydown", function (event) { var $selected = $container.find(".active"); diff --git a/src/pretix/static/pretixpresale/js/ui/main.js b/src/pretix/static/pretixpresale/js/ui/main.js index 34a85db5bf..b1fe04f218 100644 --- a/src/pretix/static/pretixpresale/js/ui/main.js +++ b/src/pretix/static/pretixpresale/js/ui/main.js @@ -191,6 +191,7 @@ function setup_basics(el) { else $(":input", this).get(0).focus(); }); el.find(".alert-danger").first().each(function() { + var container = this; var content = $("

    ").click(function(e) { var input = $(e.target.hash).get(0); if (input) input.focus(); @@ -199,13 +200,14 @@ function setup_basics(el) { }); $(".has-error").each(function() { var target = target = $(":input", this); - if (!target || !target.attr("aria-describedby")) return; - var desc = $("#" + target.attr("aria-describedby").split(' ', 1)[0]); + var desc = target && target.attr("aria-describedby") ? document.getElementById(target.attr("aria-describedby").split(' ', 1)[0]) : null; + if (!target || !desc || desc == container) return; + // multi-input fields have a role=group with aria-labelledby var label = this.hasAttribute("aria-labelledby") ? $("#" + this.getAttribute("aria-labelledby")) : $("[for="+target.attr("id")+"]"); var $li = $("
  • "); - $li.text(": " + desc.text()) + $li.text(": " + desc.textContent) $li.prepend($("").attr("href", "#" + target.attr("id")).text(label.get(0).childNodes[0].nodeValue)) content.append($li); }); diff --git a/src/setup.py b/src/setup.py index 8dabe00617..8f95b91dc0 100644 --- a/src/setup.py +++ b/src/setup.py @@ -199,7 +199,7 @@ setup( 'markdown==3.3.4', # 3.3.5 requires importlib-metadata>=4.4, but django-bootstrap3 requires importlib-metadata<3. # We can upgrade markdown again once django-bootstrap3 upgrades or once we drop Python 3.6 and 3.7 'mt-940==4.23.*', - 'oauthlib==3.1.*', + 'oauthlib==3.2.*', 'openpyxl==3.0.*', 'packaging', 'paypalrestsdk==1.13.*', @@ -211,7 +211,7 @@ setup( 'psycopg2-binary', 'pycountry', 'pycparser==2.21', - 'PyPDF2==1.27.9', + 'PyPDF2==2.9.*', 'python-bidi==0.4.*', # Support for Arabic in reportlab 'python-dateutil==2.8.*', 'python-u2flib-server==4.*', @@ -248,11 +248,11 @@ setup( 'pytest-cache', 'pytest-cov', 'pytest-django==4.*', - 'pytest-mock>=2.0,<3.7', - 'pytest-rerunfailures>=9,<11', + 'pytest-mock==3.8.*', + 'pytest-rerunfailures==10.2', 'pytest-sugar', - 'pytest-xdist==1.31.*', - 'pytest==6.*', + 'pytest-xdist==2.5.*', + 'pytest==7.*', 'responses', ], 'memcached': ['pylibmc'], diff --git a/src/tests/api/test_customers.py b/src/tests/api/test_customers.py index 233b6eebff..54a18cac55 100644 --- a/src/tests/api/test_customers.py +++ b/src/tests/api/test_customers.py @@ -82,6 +82,7 @@ def test_customer_create(token_client, organizer): data={ 'identifier': 'IGNORED', 'email': 'bar@example.com', + 'password': 'foobar', 'name_parts': { "_scheme": "given_family", 'given_name': 'John', @@ -99,6 +100,7 @@ def test_customer_create(token_client, organizer): assert customer.is_active assert customer.name == 'John Doe' assert customer.is_verified + assert customer.check_password('foobar') assert len(djmail.outbox) == 0 diff --git a/src/tests/base/test_orderimport.py b/src/tests/base/test_orderimport.py index cd6c82455d..e2cbf9bf4e 100644 --- a/src/tests/base/test_orderimport.py +++ b/src/tests/base/test_orderimport.py @@ -93,7 +93,7 @@ def inputfile_factory(): 'D': 'Test', 'E': 'Baz', 'F': '0.00', - 'G': 'AU', + 'G': 'XK', 'H': '', 'I': 'Foo,Bar', 'J': '2021-06-28 11:00:00', diff --git a/src/tests/base/test_vat_id_validation.py b/src/tests/base/test_vat_id_validation.py new file mode 100644 index 0000000000..e51935c1d2 --- /dev/null +++ b/src/tests/base/test_vat_id_validation.py @@ -0,0 +1,198 @@ +# +# This file is part of pretix (Community Edition). +# +# Copyright (C) 2014-2020 Raphael Michel and contributors +# Copyright (C) 2020-2021 rami.io GmbH and contributors +# +# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General +# Public License as published by the Free Software Foundation in version 3 of the License. +# +# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are +# applicable granting you additional permissions and placing additional restrictions on your usage of this software. +# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive +# this file, see . +# +# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +# details. +# +# You should have received a copy of the GNU Affero General Public License along with this program. If not, see +# . +# +import pytest +import responses +from requests import Timeout + +from pretix.base.services.tax import ( + VATIDFinalError, VATIDTemporaryError, validate_vat_id, +) + + +def test_unknown_country(): + with pytest.raises(VATIDTemporaryError): + validate_vat_id('TR12345', 'TR') + + +@responses.activate +def test_eu_invalid_format(): + with pytest.raises(VATIDFinalError): + validate_vat_id('AT12345', 'AT') + + +@responses.activate +def test_eu_no_prefix(): + with pytest.raises(VATIDFinalError): + validate_vat_id('12345', 'AT') + + +@responses.activate +def test_eu_country_mismatch(): + with pytest.raises(VATIDFinalError): + validate_vat_id('AT12345', 'DE') + + +@responses.activate +def test_eu_server_down(): + def _callback(request): + raise Timeout + + responses.add_callback( + responses.POST, + 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService', + callback=_callback + ) + + with pytest.raises(VATIDTemporaryError): + validate_vat_id('ATU36801500', 'AT') + + +@responses.activate +def test_eu_server_error(): + responses.add( + responses.POST, + 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService', + body='error', + status=500 + ) + + with pytest.raises(VATIDTemporaryError): + validate_vat_id('ATU36801500', 'AT') + + +@responses.activate +def test_eu_id_invalid(): + responses.add( + responses.POST, + 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService', + body=""" + + + AT + U36801500 + 2014-12-17+01:00 + false + STADT WIEN +
    UNKNOWN
    +
    +
    +
    """, + status=200 + ) + + with pytest.raises(VATIDFinalError): + validate_vat_id('ATU36801500', 'AT') + + +@responses.activate +def test_eu_id_valid(): + responses.add( + responses.POST, + 'https://ec.europa.eu/taxation_customs/vies/services/checkVatService', + body=""" + + + AT + U36801500 + 2014-12-17+01:00 + true + STADT WIEN +
    UNKNOWN
    +
    +
    +
    """, + status=200 + ) + + assert validate_vat_id('ATU36801500', 'AT') == 'ATU36801500' + + +@responses.activate +def test_NO_invalid_format(): + with pytest.raises(VATIDFinalError): + validate_vat_id('NO12345', 'NO') + + +@responses.activate +def test_NO_server_down(): + def _callback(request): + raise Timeout + + responses.add_callback( + responses.GET, + 'https://data.brreg.no/enhetsregisteret/api/enheter/974760673', + callback=_callback + ) + + with pytest.raises(VATIDTemporaryError): + validate_vat_id('NO974760673 MVA', 'NO') + + +@responses.activate +def test_NO_server_error(): + responses.add( + responses.GET, + 'https://data.brreg.no/enhetsregisteret/api/enheter/974760673', + body='error', + status=500 + ) + + with pytest.raises(VATIDTemporaryError): + validate_vat_id('NO974760673 MVA', 'NO') + + +@responses.activate +def test_NO_id_invalid(): + responses.add( + responses.GET, + 'https://data.brreg.no/enhetsregisteret/api/enheter/974760673', + body="", + status=404 + ) + + with pytest.raises(VATIDFinalError): + validate_vat_id('NO974760673 MVA', 'NO') + + +@responses.activate +def test_NO_id_valid(): + responses.add( + responses.GET, + 'https://data.brreg.no/enhetsregisteret/api/enheter/974760673', + body='{"organisasjonsnummer":"974760673","navn":"REGISTERENHETEN I BRØNNØYSUND","organisasjonsform":{"kode":' + '"ORGL","beskrivelse":"Organisasjonsledd","_links":{"self":{"href":"https://data.brreg.no/enhetsregisteret/api/' + 'organisasjonsformer/ORGL"}}},"hjemmeside":"www.brreg.no","postadresse":{"land":"Norge","landkode":"NO","postn' + 'ummer":"8910","poststed":"BRØNNØYSUND","adresse":["Postboks 900"],"kommune":"BRØNNØY","kommunenummer":"1813"}' + ',"registreringsdatoEnhetsregisteret":"1995-08-09","registrertIMvaregisteret":false,"naeringskode1":{"beskrivels' + 'e":"Generell offentlig administrasjon","kode":"84.110"},"antallAnsatte":455,"overordnetEnhet":"912660680","for' + 'retningsadresse":{"land":"Norge","landkode":"NO","postnummer":"8900","poststed":"BRØNNØYSUND","adresse":["Havn' + 'egata 48"],"kommune":"BRØNNØY","kommunenummer":"1813"},"institusjonellSektorkode":{"kode":"6100","beskrivelse' + '":"Statsforvaltningen"},"registrertIForetaksregisteret":false,"registrertIStiftelsesregisteret":false,"registr' + 'ertIFrivillighetsregisteret":false,"konkurs":false,"underAvvikling":false,"underTvangsavviklingEllerTvangsopp' + 'losning":false,"maalform":"Bokmål","_links":{"self":{"href":"https://data.brreg.no/enhetsregisteret/api/enheter' + '/974760673"},"overordnetEnhet":{"href":"https://data.brreg.no/enhetsregisteret/api/enheter/912660680"}}}', + status=200 + ) + + assert validate_vat_id('NO974760673 MVA', 'NO') == 'NO974760673MVA' + +# No tests for CH currently since it's harder to mock Zeep diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index 2a88e481b6..92292dc124 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -54,6 +54,7 @@ from pretix.base.payment import PaymentException from pretix.base.services.invoices import ( generate_cancellation, generate_invoice, ) +from pretix.base.services.tax import VATIDFinalError, VATIDTemporaryError @pytest.fixture @@ -1563,8 +1564,8 @@ def test_check_vatid(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) assert 'alert-success' in response.content.decode() ia.refresh_from_db() @@ -1576,8 +1577,8 @@ def test_check_vatid_no_entered(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, country=Country('AT')) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) assert 'alert-danger' in response.content.decode() ia.refresh_from_db() @@ -1589,12 +1590,10 @@ def test_check_vatid_invalid_country(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('FR')) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') - response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) - assert 'alert-danger' in response.content.decode() - ia.refresh_from_db() - assert not ia.vat_id_validated + response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) + assert 'alert-danger' in response.content.decode() + ia.refresh_from_db() + assert not ia.vat_id_validated @pytest.mark.django_db @@ -1602,8 +1601,8 @@ def test_check_vatid_noneu_country(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='CHU1234567', country=Country('CH')) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) assert 'alert-danger' in response.content.decode() ia.refresh_from_db() @@ -1615,8 +1614,8 @@ def test_check_vatid_no_country(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567') - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) assert 'alert-danger' in response.content.decode() ia.refresh_from_db() @@ -1626,8 +1625,8 @@ def test_check_vatid_no_country(client, env): @pytest.mark.django_db def test_check_vatid_no_invoiceaddress(client, env): client.login(email='dummy@dummy.dummy', password='dummy') - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) assert 'alert-danger' in response.content.decode() @@ -1637,10 +1636,9 @@ def test_check_vatid_invalid(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: def raiser(*args, **kwargs): - import vat_moss.errors - raise vat_moss.errors.InvalidError('Fail') + raise VATIDFinalError('Fail') mock_validate.side_effect = raiser response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) @@ -1654,10 +1652,9 @@ def test_check_vatid_unavailable(client, env): client.login(email='dummy@dummy.dummy', password='dummy') with scopes_disabled(): ia = InvoiceAddress.objects.create(order=env[2], is_business=True, vat_id='ATU1234567', country=Country('AT')) - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: def raiser(*args, **kwargs): - import vat_moss.errors - raise vat_moss.errors.WebServiceUnavailableError('Fail') + raise VATIDTemporaryError('Fail') mock_validate.side_effect = raiser response = client.post('/control/event/dummy/dummy/orders/FOO/checkvatid', {}, follow=True) diff --git a/src/tests/plugins/badges/test_pdf.py b/src/tests/plugins/badges/test_pdf.py index 6a1f354b7f..82cd64a3ca 100644 --- a/src/tests/plugins/badges/test_pdf.py +++ b/src/tests/plugins/badges/test_pdf.py @@ -39,7 +39,7 @@ from io import BytesIO import pytest from django.utils.timezone import now from django_scopes import scope -from PyPDF2 import PdfFileReader +from PyPDF2 import PdfReader from pretix.base.models import ( Event, Item, ItemVariation, Order, OrderPosition, Organizer, @@ -100,8 +100,8 @@ def test_generate_pdf(env): 'include_pending': True }) assert ftype == 'application/pdf' - pdf = PdfFileReader(BytesIO(buf)) - assert pdf.numPages == 2 + pdf = PdfReader(BytesIO(buf)) + assert len(pdf.pages) == 2 @pytest.mark.django_db @@ -115,5 +115,5 @@ def test_generate_pdf_multi(env): 'include_pending': True }) assert ftype == 'application/pdf' - pdf = PdfFileReader(BytesIO(buf)) - assert pdf.numPages == 1 + pdf = PdfReader(BytesIO(buf)) + assert len(pdf.pages) == 1 diff --git a/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py b/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py index c20186b237..c98bdddb76 100644 --- a/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py +++ b/src/tests/plugins/ticketoutputpdf/test_ticketoutputpdf.py @@ -26,7 +26,7 @@ from io import BytesIO import pytest from django.utils.timezone import now from django_scopes import scope -from PyPDF2 import PdfFileReader +from PyPDF2 import PdfReader from pretix.base.models import ( Event, Item, ItemVariation, Order, OrderPosition, Organizer, @@ -70,5 +70,5 @@ def test_generate_pdf(env0): o = PdfTicketOutput(event) fname, ftype, buf = o.generate(order.positions.first()) assert ftype == 'application/pdf' - pdf = PdfFileReader(BytesIO(buf)) - assert pdf.numPages == 1 + pdf = PdfReader(BytesIO(buf)) + assert len(pdf.pages) == 1 diff --git a/src/tests/presale/test_checkout.py b/src/tests/presale/test_checkout.py index 2e53ba8284..326b1f1db5 100644 --- a/src/tests/presale/test_checkout.py +++ b/src/tests/presale/test_checkout.py @@ -47,6 +47,7 @@ from pretix.base.models.items import ( ItemAddOn, ItemBundle, ItemVariation, SubEventItem, SubEventItemVariation, ) from pretix.base.services.orders import OrderError, _perform_order +from pretix.base.services.tax import VATIDFinalError, VATIDTemporaryError from pretix.testutils.scope import classscope from pretix.testutils.sessions import get_cart_session_key @@ -139,8 +140,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -163,8 +164,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): def test_reverse_charge_enable_then_disable(self): self.test_reverse_charge() - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'individual', 'name': 'Bar', @@ -195,10 +196,9 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: def raiser(*args, **kwargs): - import vat_moss.errors - raise vat_moss.errors.InvalidError() + raise VATIDFinalError('final') mock_validate.side_effect = raiser resp = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { @@ -229,7 +229,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: mock_validate.return_value = ('AU', 'AU123456', 'Foo') self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', @@ -263,8 +263,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -296,20 +296,18 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') - resp = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { - 'is_business': 'business', - 'company': 'Foo', - 'name': 'Bar', - 'street': 'Baz', - 'zipcode': '12345', - 'city': 'Here', - 'country': 'FR', - 'vat_id': 'AT123456', - 'email': 'admin@localhost' - }, follow=True) - assert 'alert-danger' in resp.content.decode() + resp = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { + 'is_business': 'business', + 'company': 'Foo', + 'name': 'Bar', + 'street': 'Baz', + 'zipcode': '12345', + 'city': 'Here', + 'country': 'FR', + 'vat_id': 'AT123456', + 'email': 'admin@localhost' + }, follow=True) + assert 'alert-danger' in resp.content.decode() cr1.refresh_from_db() assert cr1.price == Decimal('23.00') @@ -326,10 +324,9 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: def raiser(*args, **kwargs): - import vat_moss.errors - raise vat_moss.errors.WebServiceUnavailableError('Fail') + raise VATIDTemporaryError('temp') mock_validate.side_effect = raiser self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { @@ -364,8 +361,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -401,8 +398,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -418,7 +415,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): cr1.refresh_from_db() assert cr1.price == Decimal('19.33') - with mock.patch('vat_moss.id.validate') as mock_validate: + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: mock_validate.return_value = ('DE', 'DE123456', 'Foo') self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', @@ -465,8 +462,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): cr1.refresh_from_db() assert cr1.price == Decimal('23.00') - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' r = self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -525,8 +522,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): price=23, expires=now() + timedelta(minutes=10) ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'individual', 'name': 'Bar', @@ -577,8 +574,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): voucher=self.event.vouchers.create() ) - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'individual', 'name': 'Bar', @@ -605,8 +602,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): def test_country_taxing_switch(self): self._test_country_taxing() - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'individual', 'name': 'Bar', @@ -657,8 +654,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): assert cr1.price == Decimal('28.56') assert cr1.tax_rate == Decimal('19.00') - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo', @@ -721,8 +718,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): assert cr1.price == Decimal('47.60') assert cr1.tax_rate == Decimal('19.00') - with mock.patch('vat_moss.id.validate') as mock_validate: - mock_validate.return_value = ('AT', 'AT123456', 'Foo') + with mock.patch('pretix.base.services.tax._validate_vat_id_EU') as mock_validate: + mock_validate.return_value = 'AT123456' self.client.post('/%s/%s/checkout/questions/' % (self.orga.slug, self.event.slug), { 'is_business': 'business', 'company': 'Foo',